feat(css_formatter): scss and css comments inside declarations - #11113
Conversation
🦋 Changeset detectedLatest commit: 80792a4 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 |
✅ Organic activityNo automation signals detected in the analyzed events. This is an automated analysis by AgentScan |
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughUpdates the CSS formatter to recognise component-value boundary comments, identify their owning comma-separated groups, and format affected groups independently. It adds SCSS declaration-list detection, boundary-aware separators and layouts, source-break preservation for SCSS lists, and CSS/SCSS fixtures documenting the corrected formatting. Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
🧹 Nitpick comments (3)
.changeset/fix-css-value-boundary-comments.md (1)
5-5: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueMention SCSS too.
The change also affects SCSS declaration values (source group breaks, comma groups), but the description reads CSS-only. A couple of words would set the right expectation for readers of the changelog.
Proposed wording
-Fixed CSS formatting of long block comments between comma-separated property values: +Fixed CSS and SCSS formatting of long block comments between comma-separated property values:🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.changeset/fix-css-value-boundary-comments.md at line 5, Update the changelog entry text to explicitly mention SCSS alongside CSS, while preserving the existing description of formatting long block comments between comma-separated property values.crates/biome_css_formatter/src/comments.rs (1)
529-532: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueDuplicated boundary-comment predicate.
This kind/suppression check mirrors
is_value_boundary_commentincrates/biome_css_formatter/src/utils/component_value_list.rs(lines 77-80). Only the wrapper type differs (DecoratedCommentvsSourceComment), so a small shared helper taking(CommentKind, &str)would keep the two definitions from drifting.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@crates/biome_css_formatter/src/comments.rs` around lines 529 - 532, Extract the duplicated inline-block/suppression predicate from the current comment-placement logic and is_value_boundary_comment into a shared helper accepting CommentKind and comment text. Update both callers to use the helper while preserving their existing wrapper-specific argument extraction and behavior.crates/biome_css_formatter/src/utils/scss_declaration_list.rs (1)
20-25: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueTrim and tighten the SCSS declaration-group lookup.
ancestors()already includes the current node, so the intermediatecast_ref(node)adds no coverage, and the current call sites pass list/comment nodes directly anyway. This could be clearer as a simple ancestor search with an optional explicit current-node cast only where needed. The unbounded walk can reach enclosing declarations, butis_declaration_list_group()filters those outside a generic property; if this later passes list nodes from nested SCSS functions, add a more precise stop condition to avoid hunting around the tree.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@crates/biome_css_formatter/src/utils/scss_declaration_list.rs` around lines 20 - 25, Update the SCSS declaration-group lookup around is_declaration_list_group to use a clear ancestor search, removing the redundant initial cast_ref(node) path while preserving explicit current-node handling only if required by the callers. Keep the existing filtering behavior, and do not add traversal stop conditions unless nested SCSS function list nodes require them.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In @.changeset/fix-css-value-boundary-comments.md:
- Line 5: Update the changelog entry text to explicitly mention SCSS alongside
CSS, while preserving the existing description of formatting long block comments
between comma-separated property values.
In `@crates/biome_css_formatter/src/comments.rs`:
- Around line 529-532: Extract the duplicated inline-block/suppression predicate
from the current comment-placement logic and is_value_boundary_comment into a
shared helper accepting CommentKind and comment text. Update both callers to use
the helper while preserving their existing wrapper-specific argument extraction
and behavior.
In `@crates/biome_css_formatter/src/utils/scss_declaration_list.rs`:
- Around line 20-25: Update the SCSS declaration-group lookup around
is_declaration_list_group to use a clear ancestor search, removing the redundant
initial cast_ref(node) path while preserving explicit current-node handling only
if required by the callers. Keep the existing filtering behavior, and do not add
traversal stop conditions unless nested SCSS function list nodes require them.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 18b28edc-8790-477f-9a18-5abc445b2015
⛔ Files ignored due to path filters (4)
crates/biome_css_formatter/tests/specs/css/comments/component-value-boundary-comments.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/css/comments/17479.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/prettier/css/comments/declaration.css.snapis excluded by!**/*.snapand included by**crates/biome_css_formatter/tests/specs/scss/comments/component-value-boundary-comments.scss.snapis excluded by!**/*.snapand included by**
📒 Files selected for processing (10)
.changeset/fix-css-value-boundary-comments.mdcrates/biome_css_formatter/src/comments.rscrates/biome_css_formatter/src/scss/lists/list_expression_element_list.rscrates/biome_css_formatter/src/utils/component_value_list.rscrates/biome_css_formatter/src/utils/component_value_list/comma_groups.rscrates/biome_css_formatter/src/utils/mod.rscrates/biome_css_formatter/src/utils/scss_declaration_list.rscrates/biome_css_formatter/src/utils/scss_list_layout.rscrates/biome_css_formatter/tests/specs/css/comments/component-value-boundary-comments.csscrates/biome_css_formatter/tests/specs/scss/comments/component-value-boundary-comments.scss
Merging this PR will not alter performance
Comparing Footnotes
|
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@crates/biome_css_formatter/src/utils/scss_list_layout.rs`:
- Around line 92-95: Update the source-break branch in the list formatting
method to wrap the grouped output with the same indent(...) structure used by
the normal formatting path, preserving nested indentation for multiline SCSS
values. Add a regression test covering source-break formatting inside a nested
declaration and verify continuation items retain the expected indentation.
🪄 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 Plus
Run ID: c78c5db3-9925-45e3-8d11-aaaf6dcc8737
📒 Files selected for processing (3)
crates/biome_css_formatter/src/utils/component_value_list/comma_groups.rscrates/biome_css_formatter/src/utils/scss_declaration_list.rscrates/biome_css_formatter/src/utils/scss_list_layout.rs
💤 Files with no reviewable changes (1)
- crates/biome_css_formatter/src/utils/scss_declaration_list.rs
🚧 Files skipped from review as they are similar to previous changes (1)
- crates/biome_css_formatter/src/utils/component_value_list/comma_groups.rs
| if should_preserve_source_group_breaks(self.node, f) { | ||
| let elements = format_elements_with_source_breaks(&elements); | ||
| return write!(f, [group(&format_args![soft_line_break(), elements])]); | ||
| } |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Preserve the nested indentation for source-break formatting.
This branch emits hard breaks but omits the indent(...) used by the normal path at Lines 97–103. Multiline SCSS values can therefore render continuation items at the enclosing declaration’s indentation.
Proposed fix
- return write!(f, [group(&format_args![soft_line_break(), elements])]);
+ return write!(
+ f,
+ [group(&indent(&format_args![soft_line_break(), elements]))]
+ );As per coding guidelines, bug fixes must include a regression test.
📝 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.
| if should_preserve_source_group_breaks(self.node, f) { | |
| let elements = format_elements_with_source_breaks(&elements); | |
| return write!(f, [group(&format_args![soft_line_break(), elements])]); | |
| } | |
| if should_preserve_source_group_breaks(self.node, f) { | |
| let elements = format_elements_with_source_breaks(&elements); | |
| return write!( | |
| f, | |
| [group(&indent(&format_args![soft_line_break(), elements]))] | |
| ); | |
| } |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@crates/biome_css_formatter/src/utils/scss_list_layout.rs` around lines 92 -
95, Update the source-break branch in the list formatting method to wrap the
grouped output with the same indent(...) structure used by the normal formatting
path, preserving nested indentation for multiline SCSS values. Add a regression
test covering source-break formatting inside a nested declaration and verify
continuation items retain the expected indentation.
Source: Coding guidelines
This PR contains the following updates: | Package | Type | Update | Change | Pending | |---|---|---|---|---| | [@biomejs/biome](https://biomejs.dev) ([source](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome)) | imports | patch | [`2.5.6` -> `2.5.7`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/2.5.6/2.5.7) | `2.5.8` | --- ### Release Notes <details> <summary>biomejs/biome (@​biomejs/biome)</summary> ### [`v2.5.7`](https://github.com/biomejs/biome/blob/HEAD/packages/@​biomejs/biome/CHANGELOG.md#257) [Compare Source](https://github.com/biomejs/biome/compare/@biomejs/biome@2.5.6...@biomejs/biome@2.5.7) ##### Patch Changes - [#​10822](biomejs/biome#10822) [`c171b3b`](biomejs/biome@c171b3b) Thanks [@​pkallos](https://github.com/pkallos)! - Added the option `ignoreIfStatements` to [useNullishCoalescing](https://biomejs.dev/linter/rules/use-nullish-coalescing/). Biome now flags `if` statements that only assign to a nullish variable (such as `if (!a) { a = b }`) and can rewrite them to `??=`. When enabled, Biome ignores those `if` statements. - [#​11136](biomejs/biome#11136) [`e63354c`](biomejs/biome@e63354c) Thanks [@​AkashNaickar](https://github.com/AkashNaickar)! - Added a new nursery rule [`noExtendNative`](https://biomejs.dev/linter/rules/no-extend-native/), which reports extending the prototype of a built-in object. - [#​10094](biomejs/biome#10094) [`e007143`](biomejs/biome@e007143) Thanks [@​THEjacob1000](https://github.com/THEjacob1000)! - Added the nursery rule [`noTailwindArbitraryValue`](https://biomejs.dev/linter/rules/no-tailwind-arbitrary-value/). Biome now reports Tailwind CSS arbitrary values such as `w-[400px]`, including in HTML/JSX class attributes, configured utility functions, and tagged templates. - [#​11184](biomejs/biome#11184) [`135f476`](biomejs/biome@135f476) Thanks [@​subotac](https://github.com/subotac)! - Fixed [#​11176](biomejs/biome#11176): `noUnknownPseudoClass` now recognizes Vue's `:deep()` pseudo-class inside `.vue` style blocks. - [#​8239](biomejs/biome#8239) [`a519f9d`](biomejs/biome@a519f9d) Thanks [@​cormacrelf](https://github.com/cormacrelf)! - Fixed [#​8233](biomejs/biome#8233), where Biome CLI in stdin mode didn't work correctly when handling files in projects with nested configurations. For example, with the following structure, `--stdin-file-path=subdirectory/...` would not use the nested configuration in `subdirectory/biome.json`: ``` ├── biome.json └── subdirectory ├── biome.json └── lib.js ``` ```shell biome format --write --stdin-file-path=subdirectory/lib.js < subdirectory/lib.js ``` Now, the nested configuration is correctly picked up and applied. In addition, Biome now shows a warning if `--stdin-file-path` is provided but that path is ignored and therefore not formatted or fixed. - [#​11138](biomejs/biome#11138) [`8c2c6bd`](biomejs/biome@8c2c6bd) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed [`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/): Biome now chooses the same function overload as TypeScript when an argument is a callback, so conditions that were previously missed are reported. The following code is now invalid, because a parameter typed `() => void` accepts an `async` callback and `schedule` therefore returns `string`: ```ts declare function schedule(handler: () => void): string; declare function schedule(handler: () => Promise<void>): string | undefined; schedule(async () => {}) ?? "fallback"; ``` The following code is also now invalid, because `map(() => 42)` returns `42`: ```ts type Mapper<T> = () => T; declare function map<T>(mapper: Mapper<T>): T; map(() => 42) || flag; ``` - [#​11138](biomejs/biome#11138) [`8c2c6bd`](biomejs/biome@8c2c6bd) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed [#​11087](biomejs/biome#11087): [`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/) no longer reports optional chains and nullish coalescing whose receiver can be nullish. For example, the optional chain and fallback in the following code are no longer reported: ```ts declare const usage: { range: { startDate: string } } | null; const startDate = usage?.range.startDate ?? "N/A"; ``` - [#​11118](biomejs/biome#11118) [`9c16840`](biomejs/biome@9c16840) Thanks [@​subotac](https://github.com/subotac)! - Fixed [#​11098](biomejs/biome#11098): The HTML formatter now preserves the configured trailing newline when a file ends with a comment. ```diff -<!-- trailing comment --> \ No newline at end of file +<!-- trailing comment --> ``` - [#​11201](biomejs/biome#11201) [`0e80610`](biomejs/biome@0e80610) Thanks [@​Bishwas-py](https://github.com/Bishwas-py)! - Fixed [#​11182](biomejs/biome#11182): suppression comments for [`noPositiveTabindex`](https://biomejs.dev/linter/rules/no-positive-tabindex/) now suppress the rule in HTML files when the attributes of the element span multiple lines. - [#​11079](biomejs/biome#11079) [`607afd2`](biomejs/biome@607afd2) Thanks [@​dyc3](https://github.com/dyc3)! - The HTML formatter now lays out the `srcset` attribute of `<img>` and `<source>` as the list of candidates it is. Runs of whitespace between candidates collapse, and once the list no longer fits on one line each candidate goes on its own line with the descriptors aligned: ```diff - <img srcset="/visual@0.5.png 400w, /visual.png 805w, /visual@2x.png 1610w, /visual@3x.png 2415w" /> + <img + srcset=" + /visual@0.5.png 400w, + /visual.png 805w, + /visual@2x.png 1610w, + /visual@3x.png 2415w + " + /> ``` - [#​11156](biomejs/biome#11156) [`fed72c7`](biomejs/biome@fed72c7) Thanks [@​saberoueslati](https://github.com/saberoueslati)! - Fixed [#​11129](biomejs/biome#11129): [`noUnusedVariables`](https://biomejs.dev/linter/rules/no-unused-variables/) no longer reports Vue bindings as unused when they are assigned through automatically unwrapped template refs. - [#​11124](biomejs/biome#11124) [`d890b39`](biomejs/biome@d890b39) Thanks [@​denbezrukov](https://github.com/denbezrukov)! - Fixed CSS formatting of line comments between a declaration colon and value to preserve their source indentation. ```diff .test { background: - /////// foo - // bar + /////// foo + // bar radial-gradient(circle, #​000, transparent); } ``` - [#​11113](biomejs/biome#11113) [`3d8ab73`](biomejs/biome@3d8ab73) Thanks [@​denbezrukov](https://github.com/denbezrukov)! - Fixed CSS formatting of long block comments between comma-separated property values: ```diff .foo { box-shadow: - 1000px /* long long long long long long long long long long long long comment */ 1000px /* long long long long long long long long long comment */ 2px color(srgb 0.555555555 0.555555555 0.555555555), + 1000px + /* long long long long long long long long long long long long comment */ + 1000px /* long long long long long long long long long comment */ 2px + color(srgb 0.555555555 0.555555555 0.555555555), 1px 1px black; } ``` - [#​11127](biomejs/biome#11127) [`da5c1a5`](biomejs/biome@da5c1a5) Thanks [@​dyc3](https://github.com/dyc3)! - The HTML formatter now picks the quote character for an attribute by counting the quotes in the value rather than looking only for a double quote. `'` and `"` count as the characters they stand for, and only the character that ends up as the delimiter stays escaped: ```diff - <div title='123 '" 456'></div> + <div title="123 '" 456"></div> ``` Entities that are not quotes, such as `&` or `&[#​39](https://github.com/biomejs/biome/issues/39);`, are left exactly as written. - [#​11193](biomejs/biome#11193) [`77035bb`](biomejs/biome@77035bb) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed the HTML formatter collapsing the blank line between an element and the text that follows it. A blank line before text is now kept, the way one before another element already was: ```diff <div>foo</div> - text ``` - [#​11106](biomejs/biome#11106) [`ad80f57`](biomejs/biome@ad80f57) Thanks [@​dyc3](https://github.com/dyc3)! - The HTML formatter now writes the HTML5 doctype in lowercase, matching Prettier: ```diff - <!DOCTYPE html> + <!doctype html> ``` This only applies to a plain `.html` file whose doctype stands alone. A doctype that names a DTD keeps the case it was written with, since the rest of the declaration is not lowercased either: ```html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> ``` A `.vue`, `.svelte`, or `.astro` file keeps whatever the author wrote. - [#​11188](biomejs/biome#11188) [`60679db`](biomejs/biome@60679db) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed the HTML formatter printing a comment twice when it ended the line of the last element in a document: ```diff - text<!-- a --><!-- a --> + text<!-- a --> ``` - [#​11077](biomejs/biome#11077) [`4dcd0d9`](biomejs/biome@4dcd0d9) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed a bug where the HTML formatter collapsed the whitespace inside `<textarea>`, `<xmp>` and `<plaintext>`, changing what the page renders. ```diff - <textarea> - line one - line two </textarea> + <textarea>line one line two</textarea> ``` Biome now prints the content of these elements exactly as it appears in the source, matching the existing behavior for `<pre>`. - [#​11194](biomejs/biome#11194) [`abfbb11`](biomejs/biome@abfbb11) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed the HTML formatter refusing to format a Svelte file containing an array pattern that skips a position: ```svelte {#each animals as [, value]} <p>{value}</p> {/each} ``` - [#​10094](biomejs/biome#10094) [`e007143`](biomejs/biome@e007143) Thanks [@​THEjacob1000](https://github.com/THEjacob1000)! - Fixed [`useSortedClasses`](https://biomejs.dev/linter/rules/use-sorted-classes/) to correctly detect unsorted classes in static member expression tagged templates (e.g. `tw.div\`...\`\`). Previously, these were silently skipped due to surrounding whitespace trivia not being stripped from the tag name. - [#​11078](biomejs/biome#11078) [`10da30e`](biomejs/biome@10da30e) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed Vue single-file components failing to parse when they contain a custom block such as `<i18n>` or `<docs>`, or a `<template>` written in another language. Their content is no longer read as HTML, so a block may hold whatever its own tooling expects: ```vue <docs> This block is prose, and it may mention a `<my-component>` without closing it. </docs> <template lang="pug"> .test #foo </template> ``` Previously both blocks produced a parse error and the whole file was left unformatted. Biome now prints their content unchanged while still formatting the opening tag. - [#​11231](biomejs/biome#11231) [`4afd901`](biomejs/biome@4afd901) Thanks [@​ematipico](https://github.com/ematipico)! - Improved the performance of the following lint rules: - [`noArguments`](https://biomejs.dev/linter/rules/no-arguments/). - [`noGlobalAssign`](https://biomejs.dev/linter/rules/no-global-assign/). - [`noUndeclaredVariables`](https://biomejs.dev/linter/rules/no-undeclared-variables/). - [`noRestrictedGlobals`](https://biomejs.dev/linter/rules/no-restricted-globals/). - [`noInvalidUseBeforeDeclaration`](https://biomejs.dev/linter/rules/no-invalid-use-before-declaration/). - [`noShadow`](https://biomejs.dev/linter/rules/no-shadow/). - [`noRedeclare`](https://biomejs.dev/linter/rules/no-redeclare/). - [#​11134](biomejs/biome#11134) [`2fa0a62`](biomejs/biome@2fa0a62) Thanks [@​yanthomasdev](https://github.com/yanthomasdev)! - Clarified the warning emitted when using the experimental `json` and `json-pretty` reporters. - [#​11198](biomejs/biome#11198) [`ed88b13`](biomejs/biome@ed88b13) Thanks [@​saberoueslati](https://github.com/saberoueslati)! - Fixed [#​11171](biomejs/biome#11171): variables referenced only inside a Svelte attachment (`{@Attach ...}`) are no longer reported as unused by [`noUnusedVariables`](https://biomejs.dev/linter/rules/no-unused-variables/) and [`noUnusedImports`](https://biomejs.dev/linter/rules/no-unused-imports/). - [#​11155](biomejs/biome#11155) [`6ee17ea`](biomejs/biome@6ee17ea) Thanks [@​dyc3](https://github.com/dyc3)! - Improved performance when printing diagnostics to the console. - [#​11160](biomejs/biome#11160) [`217f8ad`](biomejs/biome@217f8ad) Thanks [@​dyc3](https://github.com/dyc3)! - Improved the performance of [`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/) by skipping type inference for assignment statements, which are always considered handled. - [#​11159](biomejs/biome#11159) [`26c23d9`](biomejs/biome@26c23d9) Thanks [@​saberoueslati](https://github.com/saberoueslati)! - Fixed [#​11144](biomejs/biome#11144): [`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/) no longer reports already-awaited optional Promise values. - [#​11138](biomejs/biome#11138) [`8c2c6bd`](biomejs/biome@8c2c6bd) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed [#​11121](biomejs/biome#11121): [`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/) no longer reports conditions based on an inapplicable function overload. For example, the condition in the following code is no longer reported because `query({})` selects the overload that returns `boolean`: ```ts declare function query(options: { initial: string }): { isPending: false }; declare function query(options: { initial?: string }): { isPending: boolean }; const { isPending } = query({}); isPending || fallback; ``` - [#​11152](biomejs/biome#11152) [`c4fc6a9`](biomejs/biome@c4fc6a9) Thanks [@​dyc3](https://github.com/dyc3)! - Improved the performance of collecting rule timings with `--profile-rules` in heavily multithreaded environments. - [#​11128](biomejs/biome#11128) [`4d3ff76`](biomejs/biome@4d3ff76) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed [#​7635](biomejs/biome#7635): [`noDeprecatedImports`](https://biomejs.dev/linter/rules/no-deprecated-imports/) now detects deprecated ambient declarations that are exported separately. - [#​11117](biomejs/biome#11117) [`01f7ef5`](biomejs/biome@01f7ef5) Thanks [@​subotac](https://github.com/subotac)! - Fixed [#​11014](biomejs/biome#11014): [`noDelete`](https://biomejs.dev/linter/rules/no-delete/) no longer reports `process.env["FOO"]` style property deletions. - [#​11168](biomejs/biome#11168) [`9847e68`](biomejs/biome@9847e68) Thanks [@​saberoueslati](https://github.com/saberoueslati)! - Added the nursery rule [`noNonScalableViewport`](https://biomejs.dev/linter/rules/no-non-scalable-viewport), which reports viewport metadata that disables user scaling with `user-scalable=no`. For example: ```html <meta name="viewport" content="width=device-width, user-scalable=no" /> ``` - [#​11154](biomejs/biome#11154) [`a1d6b1f`](biomejs/biome@a1d6b1f) Thanks [@​dyc3](https://github.com/dyc3)! - Improved the performance of [`noImportCycles`](https://biomejs.dev/linter/rules/no-import-cycles/) by skipping graph traversals for imports that cannot be part of a cycle. - [#​11175](biomejs/biome#11175) [`d96d6dd`](biomejs/biome@d96d6dd) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed CSS parsing of registered custom properties: Biome now correctly validates the `syntax` descriptor of `@property` rules. </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC44LjAiLCJ1cGRhdGVkSW5WZXIiOiI0NC44LjAiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbXX0=--> Reviewed-on: https://git.oirnoir.dev/OIRNOIR/YouTube-Helper-Client/pulls/16
This PR contains the following updates: | Package | Type | Update | Change | Pending | |---|---|---|---|---| | [@biomejs/biome](https://biomejs.dev) ([source](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome)) | imports | patch | [`2.5.6` -> `2.5.7`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/2.5.6/2.5.7) | `2.5.8` | --- ### Release Notes <details> <summary>biomejs/biome (@​biomejs/biome)</summary> ### [`v2.5.7`](https://github.com/biomejs/biome/blob/HEAD/packages/@​biomejs/biome/CHANGELOG.md#257) [Compare Source](https://github.com/biomejs/biome/compare/@biomejs/biome@2.5.6...@biomejs/biome@2.5.7) ##### Patch Changes - [#​10822](biomejs/biome#10822) [`c171b3b`](biomejs/biome@c171b3b) Thanks [@​pkallos](https://github.com/pkallos)! - Added the option `ignoreIfStatements` to [useNullishCoalescing](https://biomejs.dev/linter/rules/use-nullish-coalescing/). Biome now flags `if` statements that only assign to a nullish variable (such as `if (!a) { a = b }`) and can rewrite them to `??=`. When enabled, Biome ignores those `if` statements. - [#​11136](biomejs/biome#11136) [`e63354c`](biomejs/biome@e63354c) Thanks [@​AkashNaickar](https://github.com/AkashNaickar)! - Added a new nursery rule [`noExtendNative`](https://biomejs.dev/linter/rules/no-extend-native/), which reports extending the prototype of a built-in object. - [#​10094](biomejs/biome#10094) [`e007143`](biomejs/biome@e007143) Thanks [@​THEjacob1000](https://github.com/THEjacob1000)! - Added the nursery rule [`noTailwindArbitraryValue`](https://biomejs.dev/linter/rules/no-tailwind-arbitrary-value/). Biome now reports Tailwind CSS arbitrary values such as `w-[400px]`, including in HTML/JSX class attributes, configured utility functions, and tagged templates. - [#​11184](biomejs/biome#11184) [`135f476`](biomejs/biome@135f476) Thanks [@​subotac](https://github.com/subotac)! - Fixed [#​11176](biomejs/biome#11176): `noUnknownPseudoClass` now recognizes Vue's `:deep()` pseudo-class inside `.vue` style blocks. - [#​8239](biomejs/biome#8239) [`a519f9d`](biomejs/biome@a519f9d) Thanks [@​cormacrelf](https://github.com/cormacrelf)! - Fixed [#​8233](biomejs/biome#8233), where Biome CLI in stdin mode didn't work correctly when handling files in projects with nested configurations. For example, with the following structure, `--stdin-file-path=subdirectory/...` would not use the nested configuration in `subdirectory/biome.json`: ``` ├── biome.json └── subdirectory ├── biome.json └── lib.js ``` ```shell biome format --write --stdin-file-path=subdirectory/lib.js < subdirectory/lib.js ``` Now, the nested configuration is correctly picked up and applied. In addition, Biome now shows a warning if `--stdin-file-path` is provided but that path is ignored and therefore not formatted or fixed. - [#​11138](biomejs/biome#11138) [`8c2c6bd`](biomejs/biome@8c2c6bd) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed [`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/): Biome now chooses the same function overload as TypeScript when an argument is a callback, so conditions that were previously missed are reported. The following code is now invalid, because a parameter typed `() => void` accepts an `async` callback and `schedule` therefore returns `string`: ```ts declare function schedule(handler: () => void): string; declare function schedule(handler: () => Promise<void>): string | undefined; schedule(async () => {}) ?? "fallback"; ``` The following code is also now invalid, because `map(() => 42)` returns `42`: ```ts type Mapper<T> = () => T; declare function map<T>(mapper: Mapper<T>): T; map(() => 42) || flag; ``` - [#​11138](biomejs/biome#11138) [`8c2c6bd`](biomejs/biome@8c2c6bd) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed [#​11087](biomejs/biome#11087): [`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/) no longer reports optional chains and nullish coalescing whose receiver can be nullish. For example, the optional chain and fallback in the following code are no longer reported: ```ts declare const usage: { range: { startDate: string } } | null; const startDate = usage?.range.startDate ?? "N/A"; ``` - [#​11118](biomejs/biome#11118) [`9c16840`](biomejs/biome@9c16840) Thanks [@​subotac](https://github.com/subotac)! - Fixed [#​11098](biomejs/biome#11098): The HTML formatter now preserves the configured trailing newline when a file ends with a comment. ```diff -<!-- trailing comment --> \ No newline at end of file +<!-- trailing comment --> ``` - [#​11201](biomejs/biome#11201) [`0e80610`](biomejs/biome@0e80610) Thanks [@​Bishwas-py](https://github.com/Bishwas-py)! - Fixed [#​11182](biomejs/biome#11182): suppression comments for [`noPositiveTabindex`](https://biomejs.dev/linter/rules/no-positive-tabindex/) now suppress the rule in HTML files when the attributes of the element span multiple lines. - [#​11079](biomejs/biome#11079) [`607afd2`](biomejs/biome@607afd2) Thanks [@​dyc3](https://github.com/dyc3)! - The HTML formatter now lays out the `srcset` attribute of `<img>` and `<source>` as the list of candidates it is. Runs of whitespace between candidates collapse, and once the list no longer fits on one line each candidate goes on its own line with the descriptors aligned: ```diff - <img srcset="/visual@0.5.png 400w, /visual.png 805w, /visual@2x.png 1610w, /visual@3x.png 2415w" /> + <img + srcset=" + /visual@0.5.png 400w, + /visual.png 805w, + /visual@2x.png 1610w, + /visual@3x.png 2415w + " + /> ``` - [#​11156](biomejs/biome#11156) [`fed72c7`](biomejs/biome@fed72c7) Thanks [@​saberoueslati](https://github.com/saberoueslati)! - Fixed [#​11129](biomejs/biome#11129): [`noUnusedVariables`](https://biomejs.dev/linter/rules/no-unused-variables/) no longer reports Vue bindings as unused when they are assigned through automatically unwrapped template refs. - [#​11124](biomejs/biome#11124) [`d890b39`](biomejs/biome@d890b39) Thanks [@​denbezrukov](https://github.com/denbezrukov)! - Fixed CSS formatting of line comments between a declaration colon and value to preserve their source indentation. ```diff .test { background: - /////// foo - // bar + /////// foo + // bar radial-gradient(circle, #​000, transparent); } ``` - [#​11113](biomejs/biome#11113) [`3d8ab73`](biomejs/biome@3d8ab73) Thanks [@​denbezrukov](https://github.com/denbezrukov)! - Fixed CSS formatting of long block comments between comma-separated property values: ```diff .foo { box-shadow: - 1000px /* long long long long long long long long long long long long comment */ 1000px /* long long long long long long long long long comment */ 2px color(srgb 0.555555555 0.555555555 0.555555555), + 1000px + /* long long long long long long long long long long long long comment */ + 1000px /* long long long long long long long long long comment */ 2px + color(srgb 0.555555555 0.555555555 0.555555555), 1px 1px black; } ``` - [#​11127](biomejs/biome#11127) [`da5c1a5`](biomejs/biome@da5c1a5) Thanks [@​dyc3](https://github.com/dyc3)! - The HTML formatter now picks the quote character for an attribute by counting the quotes in the value rather than looking only for a double quote. `'` and `"` count as the characters they stand for, and only the character that ends up as the delimiter stays escaped: ```diff - <div title='123 '" 456'></div> + <div title="123 '" 456"></div> ``` Entities that are not quotes, such as `&` or `&[#​39](https://github.com/biomejs/biome/issues/39);`, are left exactly as written. - [#​11193](biomejs/biome#11193) [`77035bb`](biomejs/biome@77035bb) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed the HTML formatter collapsing the blank line between an element and the text that follows it. A blank line before text is now kept, the way one before another element already was: ```diff <div>foo</div> - text ``` - [#​11106](biomejs/biome#11106) [`ad80f57`](biomejs/biome@ad80f57) Thanks [@​dyc3](https://github.com/dyc3)! - The HTML formatter now writes the HTML5 doctype in lowercase, matching Prettier: ```diff - <!DOCTYPE html> + <!doctype html> ``` This only applies to a plain `.html` file whose doctype stands alone. A doctype that names a DTD keeps the case it was written with, since the rest of the declaration is not lowercased either: ```html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> ``` A `.vue`, `.svelte`, or `.astro` file keeps whatever the author wrote. - [#​11188](biomejs/biome#11188) [`60679db`](biomejs/biome@60679db) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed the HTML formatter printing a comment twice when it ended the line of the last element in a document: ```diff - text<!-- a --><!-- a --> + text<!-- a --> ``` - [#​11077](biomejs/biome#11077) [`4dcd0d9`](biomejs/biome@4dcd0d9) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed a bug where the HTML formatter collapsed the whitespace inside `<textarea>`, `<xmp>` and `<plaintext>`, changing what the page renders. ```diff - <textarea> - line one - line two </textarea> + <textarea>line one line two</textarea> ``` Biome now prints the content of these elements exactly as it appears in the source, matching the existing behavior for `<pre>`. - [#​11194](biomejs/biome#11194) [`abfbb11`](biomejs/biome@abfbb11) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed the HTML formatter refusing to format a Svelte file containing an array pattern that skips a position: ```svelte {#each animals as [, value]} <p>{value}</p> {/each} ``` - [#​10094](biomejs/biome#10094) [`e007143`](biomejs/biome@e007143) Thanks [@​THEjacob1000](https://github.com/THEjacob1000)! - Fixed [`useSortedClasses`](https://biomejs.dev/linter/rules/use-sorted-classes/) to correctly detect unsorted classes in static member expression tagged templates (e.g. `tw.div\`...\`\`). Previously, these were silently skipped due to surrounding whitespace trivia not being stripped from the tag name. - [#​11078](biomejs/biome#11078) [`10da30e`](biomejs/biome@10da30e) Thanks [@​dyc3](https://github.com/dyc3)! - Fixed Vue single-file components failing to parse when they contain a custom block such as `<i18n>` or `<docs>`, or a `<template>` written in another language. Their content is no longer read as HTML, so a block may hold whatever its own tooling expects: ```vue <docs> This block is prose, and it may mention a `<my-component>` without closing it. </docs> <template lang="pug"> .test #foo </template> ``` Previously both blocks produced a parse error and the whole file was left unformatted. Biome now prints their content unchanged while still formatting the opening tag. - [#​11231](biomejs/biome#11231) [`4afd901`](biomejs/biome@4afd901) Thanks [@​ematipico](https://github.com/ematipico)! - Improved the performance of the following lint rules: - [`noArguments`](https://biomejs.dev/linter/rules/no-arguments/). - [`noGlobalAssign`](https://biomejs.dev/linter/rules/no-global-assign/). - [`noUndeclaredVariables`](https://biomejs.dev/linter/rules/no-undeclared-variables/). - [`noRestrictedGlobals`](https://biomejs.dev/linter/rules/no-restricted-globals/). - [`noInvalidUseBeforeDeclaration`](https://biomejs.dev/linter/rules/no-invalid-use-before-declaration/). - [`noShadow`](https://biomejs.dev/linter/rules/no-shadow/). - [`noRedeclare`](https://biomejs.dev/linter/rules/no-redeclare/). - [#​11134](biomejs/biome#11134) [`2fa0a62`](biomejs/biome@2fa0a62) Thanks [@​yanthomasdev](https://github.com/yanthomasdev)! - Clarified the warning emitted when using the experimental `json` and `json-pretty` reporters. - [#​11198](biomejs/biome#11198) [`ed88b13`](biomejs/biome@ed88b13) Thanks [@​saberoueslati](https://github.com/saberoueslati)! - Fixed [#​11171](biomejs/biome#11171): variables referenced only inside a Svelte attachment (`{@Attach ...}`) are no longer reported as unused by [`noUnusedVariables`](https://biomejs.dev/linter/rules/no-unused-variables/) and [`noUnusedImports`](https://biomejs.dev/linter/rules/no-unused-imports/). - [#​11155](biomejs/biome#11155) [`6ee17ea`](biomejs/biome@6ee17ea) Thanks [@​dyc3](https://github.com/dyc3)! - Improved performance when printing diagnostics to the console. - [#​11160](biomejs/biome#11160) [`217f8ad`](biomejs/biome@217f8ad) Thanks [@​dyc3](https://github.com/dyc3)! - Improved the performance of [`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/) by skipping type inference for assignment statements, which are always considered handled. - [#​11159](biomejs/biome#11159) [`26c23d9`](biomejs/biome@26c23d9) Thanks [@​saberoueslati](https://github.com/saberoueslati)! - Fixed [#​11144](biomejs/biome#11144): [`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/) no longer reports already-awaited optional Promise values. - [#​11138](biomejs/biome#11138) [`8c2c6bd`](biomejs/biome@8c2c6bd) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed [#​11121](biomejs/biome#11121): [`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/) no longer reports conditions based on an inapplicable function overload. For example, the condition in the following code is no longer reported because `query({})` selects the overload that returns `boolean`: ```ts declare function query(options: { initial: string }): { isPending: false }; declare function query(options: { initial?: string }): { isPending: boolean }; const { isPending } = query({}); isPending || fallback; ``` - [#​11152](biomejs/biome#11152) [`c4fc6a9`](biomejs/biome@c4fc6a9) Thanks [@​dyc3](https://github.com/dyc3)! - Improved the performance of collecting rule timings with `--profile-rules` in heavily multithreaded environments. - [#​11128](biomejs/biome#11128) [`4d3ff76`](biomejs/biome@4d3ff76) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed [#​7635](biomejs/biome#7635): [`noDeprecatedImports`](https://biomejs.dev/linter/rules/no-deprecated-imports/) now detects deprecated ambient declarations that are exported separately. - [#​11117](biomejs/biome#11117) [`01f7ef5`](biomejs/biome@01f7ef5) Thanks [@​subotac](https://github.com/subotac)! - Fixed [#​11014](biomejs/biome#11014): [`noDelete`](https://biomejs.dev/linter/rules/no-delete/) no longer reports `process.env["FOO"]` style property deletions. - [#​11168](biomejs/biome#11168) [`9847e68`](biomejs/biome@9847e68) Thanks [@​saberoueslati](https://github.com/saberoueslati)! - Added the nursery rule [`noNonScalableViewport`](https://biomejs.dev/linter/rules/no-non-scalable-viewport), which reports viewport metadata that disables user scaling with `user-scalable=no`. For example: ```html <meta name="viewport" content="width=device-width, user-scalable=no" /> ``` - [#​11154](biomejs/biome#11154) [`a1d6b1f`](biomejs/biome@a1d6b1f) Thanks [@​dyc3](https://github.com/dyc3)! - Improved the performance of [`noImportCycles`](https://biomejs.dev/linter/rules/no-import-cycles/) by skipping graph traversals for imports that cannot be part of a cycle. - [#​11175](biomejs/biome#11175) [`d96d6dd`](biomejs/biome@d96d6dd) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed CSS parsing of registered custom properties: Biome now correctly validates the `syntax` descriptor of `@property` rules. </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC44LjAiLCJ1cGRhdGVkSW5WZXIiOiI0NC44LjAiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbXX0=--> Reviewed-on: https://git.oirnoir.dev/OIRNOIR/YouTube-Helper-Server/pulls/34
Summary
Formats block comments between comma-separated CSS and SCSS declaration values as value boundaries. Long groups can expand independently while short groups remain compact, and SCSS source group breaks are preserved.
Input:
Formatted output:
Test Plan
cargo test -p biome_css_formatter