Skip to content

fix(html): preserve trailing newline after comments - #11118

Merged
dyc3 merged 1 commit into
biomejs:mainfrom
subotac:fix/html-comment-trailing-newline
Jul 28, 2026
Merged

fix(html): preserve trailing newline after comments#11118
dyc3 merged 1 commit into
biomejs:mainfrom
subotac:fix/html-comment-trailing-newline

Conversation

@subotac

@subotac subotac commented Jul 28, 2026

Copy link
Copy Markdown

Summary

Fixes #11098

Preserves the trailing newline after comments in HTML formatting. Updated relevant snapshots and added a patch changeset.

This PR was created with AI assistance. Codex helped with issue analysis, implementation, snapshot updates, and local verification.

Test Plan

Added a regression test from the issue and updated the affected formatter snapshots.

Docs

N/A

@changeset-bot

changeset-bot Bot commented Jul 28, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 1379299

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

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

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

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

@github-actions

Copy link
Copy Markdown
Contributor

✅ Organic activity

No automation signals detected in the analyzed events.

View full analysis →

This is an automated analysis by AgentScan

@github-actions github-actions Bot added A-Formatter Area: formatter L-HTML Language: HTML and super languages labels Jul 28, 2026
@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

The HTML formatter now formats trailing comments before removing the EOF token and emits the configured trailing newline afterwards. A regression fixture covers WordPress-style HTML comments surrounding a div. A patch changeset documents the fix and includes an illustrative diff.

Suggested labels: A-Formatter, L-HTML

Suggested reviewers: ematipico

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly matches the main fix: preserving the trailing newline after HTML comments.
Description check ✅ Passed The description is on-topic and accurately describes the formatter fix, test, and changeset.
Linked Issues check ✅ Passed The changes address #11098 by preserving the final newline when HTML files end with a comment.
Out of Scope Changes check ✅ Passed The changeset, formatter fix, and regression test all align with the stated issue; nothing looks stray.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

❤️ Share

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
.changeset/cruel-forks-know.md (1)

7-10: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Make the illustrative diff show the newline change.

Both sides currently contain identical text, so the example does not communicate what changed. Either remove the fenced diff or represent the added final newline explicitly.

🤖 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/cruel-forks-know.md around lines 7 - 10, Update the illustrative
diff in cruel-forks-know.md so it visibly represents the added final newline:
either remove the fenced diff entirely or adjust the diff markers/content to
show a newline change instead of identical lines.
🤖 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/cruel-forks-know.md:
- Around line 7-10: Update the illustrative diff in cruel-forks-know.md so it
visibly represents the added final newline: either remove the fenced diff
entirely or adjust the diff markers/content to show a newline change instead of
identical lines.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: ac7e0bf0-cf81-43f2-8ebe-5c8889548341

📥 Commits

Reviewing files that changed from the base of the PR and between 1139f1c and 1379299.

⛔ Files ignored due to path filters (14)
  • crates/biome_html_formatter/tests/specs/html/comments/after-text.html.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/comments/issue_11098.html.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/svelte/comments/each_one_liner.svelte.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/svelte/comments/html.svelte.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/svelte/comments/if.svelte.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/svelte/comments/if_else_if_else.svelte.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/svelte/comments/key.svelte.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/svelte/comments/render.svelte.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/svelte/comments/single-expression.svelte.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/html/svelte/comments/snippet_basic.svelte.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/prettier/html/basics/comment.html.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/prettier/html/comments/surrounding-empty-line.html.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/prettier/html/tags/object-prototype-properties/object-prototype-properties.html.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_formatter/tests/specs/prettier/html/text/tag-should-in-fill.html.snap is excluded by !**/*.snap and included by **
📒 Files selected for processing (3)
  • .changeset/cruel-forks-know.md
  • crates/biome_html_formatter/src/html/auxiliary/root.rs
  • crates/biome_html_formatter/tests/specs/html/comments/issue_11098.html

@codspeed-hq

codspeed-hq Bot commented Jul 28, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 67 untouched benchmarks
⏩ 219 skipped benchmarks1


Comparing subotac:fix/html-comment-trailing-newline (1379299) with main (1139f1c)

Open in CodSpeed

Footnotes

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

@dyc3
dyc3 merged commit 9c16840 into biomejs:main Jul 28, 2026
32 checks passed
@github-actions github-actions Bot mentioned this pull request Jul 28, 2026
OIRNOIR pushed a commit to OIRNOIR/YouTube-Helper-Client that referenced this pull request Aug 11, 2026
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 (@&#8203;biomejs/biome)</summary>

### [`v2.5.7`](https://github.com/biomejs/biome/blob/HEAD/packages/@&#8203;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

- [#&#8203;10822](biomejs/biome#10822) [`c171b3b`](biomejs/biome@c171b3b) Thanks [@&#8203;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.

- [#&#8203;11136](biomejs/biome#11136) [`e63354c`](biomejs/biome@e63354c) Thanks [@&#8203;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.

- [#&#8203;10094](biomejs/biome#10094) [`e007143`](biomejs/biome@e007143) Thanks [@&#8203;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.

- [#&#8203;11184](biomejs/biome#11184) [`135f476`](biomejs/biome@135f476) Thanks [@&#8203;subotac](https://github.com/subotac)! - Fixed [#&#8203;11176](biomejs/biome#11176): `noUnknownPseudoClass` now recognizes Vue's `:deep()` pseudo-class inside `.vue` style blocks.

- [#&#8203;8239](biomejs/biome#8239) [`a519f9d`](biomejs/biome@a519f9d) Thanks [@&#8203;cormacrelf](https://github.com/cormacrelf)! - Fixed [#&#8203;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.

- [#&#8203;11138](biomejs/biome#11138) [`8c2c6bd`](biomejs/biome@8c2c6bd) Thanks [@&#8203;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;
  ```

- [#&#8203;11138](biomejs/biome#11138) [`8c2c6bd`](biomejs/biome@8c2c6bd) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Fixed [#&#8203;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";
  ```

- [#&#8203;11118](biomejs/biome#11118) [`9c16840`](biomejs/biome@9c16840) Thanks [@&#8203;subotac](https://github.com/subotac)! - Fixed [#&#8203;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 -->
  ```

- [#&#8203;11201](biomejs/biome#11201) [`0e80610`](biomejs/biome@0e80610) Thanks [@&#8203;Bishwas-py](https://github.com/Bishwas-py)! - Fixed [#&#8203;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.

- [#&#8203;11079](biomejs/biome#11079) [`607afd2`](biomejs/biome@607afd2) Thanks [@&#8203;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
  +   "
  + />
  ```

- [#&#8203;11156](biomejs/biome#11156) [`fed72c7`](biomejs/biome@fed72c7) Thanks [@&#8203;saberoueslati](https://github.com/saberoueslati)! - Fixed [#&#8203;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.

- [#&#8203;11124](biomejs/biome#11124) [`d890b39`](biomejs/biome@d890b39) Thanks [@&#8203;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, #&#8203;000, transparent);
   }
  ```

- [#&#8203;11113](biomejs/biome#11113) [`3d8ab73`](biomejs/biome@3d8ab73) Thanks [@&#8203;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;
   }
  ```

- [#&#8203;11127](biomejs/biome#11127) [`da5c1a5`](biomejs/biome@da5c1a5) Thanks [@&#8203;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. `&apos;` and `&quot;` count as the characters they stand for, and only the character that ends up as the delimiter stays escaped:

  ```diff
  - <div title='123 &apos;&quot; 456'></div>
  + <div title="123 '&quot; 456"></div>
  ```

  Entities that are not quotes, such as `&amp;` or `&[#&#8203;39](https://github.com/biomejs/biome/issues/39);`, are left exactly as written.

- [#&#8203;11193](biomejs/biome#11193) [`77035bb`](biomejs/biome@77035bb) Thanks [@&#8203;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
  ```

- [#&#8203;11106](biomejs/biome#11106) [`ad80f57`](biomejs/biome@ad80f57) Thanks [@&#8203;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.

- [#&#8203;11188](biomejs/biome#11188) [`60679db`](biomejs/biome@60679db) Thanks [@&#8203;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 -->
  ```

- [#&#8203;11077](biomejs/biome#11077) [`4dcd0d9`](biomejs/biome@4dcd0d9) Thanks [@&#8203;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>`.

- [#&#8203;11194](biomejs/biome#11194) [`abfbb11`](biomejs/biome@abfbb11) Thanks [@&#8203;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}
  ```

- [#&#8203;10094](biomejs/biome#10094) [`e007143`](biomejs/biome@e007143) Thanks [@&#8203;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.

- [#&#8203;11078](biomejs/biome#11078) [`10da30e`](biomejs/biome@10da30e) Thanks [@&#8203;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.

- [#&#8203;11231](biomejs/biome#11231) [`4afd901`](biomejs/biome@4afd901) Thanks [@&#8203;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/).

- [#&#8203;11134](biomejs/biome#11134) [`2fa0a62`](biomejs/biome@2fa0a62) Thanks [@&#8203;yanthomasdev](https://github.com/yanthomasdev)! - Clarified the warning emitted when using the experimental `json` and `json-pretty` reporters.

- [#&#8203;11198](biomejs/biome#11198) [`ed88b13`](biomejs/biome@ed88b13) Thanks [@&#8203;saberoueslati](https://github.com/saberoueslati)! - Fixed [#&#8203;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/).

- [#&#8203;11155](biomejs/biome#11155) [`6ee17ea`](biomejs/biome@6ee17ea) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Improved performance when printing diagnostics to the console.

- [#&#8203;11160](biomejs/biome#11160) [`217f8ad`](biomejs/biome@217f8ad) Thanks [@&#8203;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.

- [#&#8203;11159](biomejs/biome#11159) [`26c23d9`](biomejs/biome@26c23d9) Thanks [@&#8203;saberoueslati](https://github.com/saberoueslati)! - Fixed [#&#8203;11144](biomejs/biome#11144): [`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/) no longer reports already-awaited optional Promise values.

- [#&#8203;11138](biomejs/biome#11138) [`8c2c6bd`](biomejs/biome@8c2c6bd) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Fixed [#&#8203;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;
  ```

- [#&#8203;11152](biomejs/biome#11152) [`c4fc6a9`](biomejs/biome@c4fc6a9) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Improved the performance of collecting rule timings with `--profile-rules` in heavily multithreaded environments.

- [#&#8203;11128](biomejs/biome#11128) [`4d3ff76`](biomejs/biome@4d3ff76) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Fixed [#&#8203;7635](biomejs/biome#7635): [`noDeprecatedImports`](https://biomejs.dev/linter/rules/no-deprecated-imports/) now detects deprecated ambient declarations that are exported separately.

- [#&#8203;11117](biomejs/biome#11117) [`01f7ef5`](biomejs/biome@01f7ef5) Thanks [@&#8203;subotac](https://github.com/subotac)! - Fixed [#&#8203;11014](biomejs/biome#11014): [`noDelete`](https://biomejs.dev/linter/rules/no-delete/) no longer reports `process.env["FOO"]` style property deletions.

- [#&#8203;11168](biomejs/biome#11168) [`9847e68`](biomejs/biome@9847e68) Thanks [@&#8203;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" />
  ```

- [#&#8203;11154](biomejs/biome#11154) [`a1d6b1f`](biomejs/biome@a1d6b1f) Thanks [@&#8203;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.

- [#&#8203;11175](biomejs/biome#11175) [`d96d6dd`](biomejs/biome@d96d6dd) Thanks [@&#8203;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
OIRNOIR pushed a commit to OIRNOIR/YouTube-Helper-Server that referenced this pull request Aug 11, 2026
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 (@&#8203;biomejs/biome)</summary>

### [`v2.5.7`](https://github.com/biomejs/biome/blob/HEAD/packages/@&#8203;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

- [#&#8203;10822](biomejs/biome#10822) [`c171b3b`](biomejs/biome@c171b3b) Thanks [@&#8203;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.

- [#&#8203;11136](biomejs/biome#11136) [`e63354c`](biomejs/biome@e63354c) Thanks [@&#8203;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.

- [#&#8203;10094](biomejs/biome#10094) [`e007143`](biomejs/biome@e007143) Thanks [@&#8203;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.

- [#&#8203;11184](biomejs/biome#11184) [`135f476`](biomejs/biome@135f476) Thanks [@&#8203;subotac](https://github.com/subotac)! - Fixed [#&#8203;11176](biomejs/biome#11176): `noUnknownPseudoClass` now recognizes Vue's `:deep()` pseudo-class inside `.vue` style blocks.

- [#&#8203;8239](biomejs/biome#8239) [`a519f9d`](biomejs/biome@a519f9d) Thanks [@&#8203;cormacrelf](https://github.com/cormacrelf)! - Fixed [#&#8203;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.

- [#&#8203;11138](biomejs/biome#11138) [`8c2c6bd`](biomejs/biome@8c2c6bd) Thanks [@&#8203;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;
  ```

- [#&#8203;11138](biomejs/biome#11138) [`8c2c6bd`](biomejs/biome@8c2c6bd) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Fixed [#&#8203;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";
  ```

- [#&#8203;11118](biomejs/biome#11118) [`9c16840`](biomejs/biome@9c16840) Thanks [@&#8203;subotac](https://github.com/subotac)! - Fixed [#&#8203;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 -->
  ```

- [#&#8203;11201](biomejs/biome#11201) [`0e80610`](biomejs/biome@0e80610) Thanks [@&#8203;Bishwas-py](https://github.com/Bishwas-py)! - Fixed [#&#8203;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.

- [#&#8203;11079](biomejs/biome#11079) [`607afd2`](biomejs/biome@607afd2) Thanks [@&#8203;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
  +   "
  + />
  ```

- [#&#8203;11156](biomejs/biome#11156) [`fed72c7`](biomejs/biome@fed72c7) Thanks [@&#8203;saberoueslati](https://github.com/saberoueslati)! - Fixed [#&#8203;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.

- [#&#8203;11124](biomejs/biome#11124) [`d890b39`](biomejs/biome@d890b39) Thanks [@&#8203;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, #&#8203;000, transparent);
   }
  ```

- [#&#8203;11113](biomejs/biome#11113) [`3d8ab73`](biomejs/biome@3d8ab73) Thanks [@&#8203;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;
   }
  ```

- [#&#8203;11127](biomejs/biome#11127) [`da5c1a5`](biomejs/biome@da5c1a5) Thanks [@&#8203;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. `&apos;` and `&quot;` count as the characters they stand for, and only the character that ends up as the delimiter stays escaped:

  ```diff
  - <div title='123 &apos;&quot; 456'></div>
  + <div title="123 '&quot; 456"></div>
  ```

  Entities that are not quotes, such as `&amp;` or `&[#&#8203;39](https://github.com/biomejs/biome/issues/39);`, are left exactly as written.

- [#&#8203;11193](biomejs/biome#11193) [`77035bb`](biomejs/biome@77035bb) Thanks [@&#8203;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
  ```

- [#&#8203;11106](biomejs/biome#11106) [`ad80f57`](biomejs/biome@ad80f57) Thanks [@&#8203;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.

- [#&#8203;11188](biomejs/biome#11188) [`60679db`](biomejs/biome@60679db) Thanks [@&#8203;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 -->
  ```

- [#&#8203;11077](biomejs/biome#11077) [`4dcd0d9`](biomejs/biome@4dcd0d9) Thanks [@&#8203;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>`.

- [#&#8203;11194](biomejs/biome#11194) [`abfbb11`](biomejs/biome@abfbb11) Thanks [@&#8203;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}
  ```

- [#&#8203;10094](biomejs/biome#10094) [`e007143`](biomejs/biome@e007143) Thanks [@&#8203;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.

- [#&#8203;11078](biomejs/biome#11078) [`10da30e`](biomejs/biome@10da30e) Thanks [@&#8203;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.

- [#&#8203;11231](biomejs/biome#11231) [`4afd901`](biomejs/biome@4afd901) Thanks [@&#8203;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/).

- [#&#8203;11134](biomejs/biome#11134) [`2fa0a62`](biomejs/biome@2fa0a62) Thanks [@&#8203;yanthomasdev](https://github.com/yanthomasdev)! - Clarified the warning emitted when using the experimental `json` and `json-pretty` reporters.

- [#&#8203;11198](biomejs/biome#11198) [`ed88b13`](biomejs/biome@ed88b13) Thanks [@&#8203;saberoueslati](https://github.com/saberoueslati)! - Fixed [#&#8203;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/).

- [#&#8203;11155](biomejs/biome#11155) [`6ee17ea`](biomejs/biome@6ee17ea) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Improved performance when printing diagnostics to the console.

- [#&#8203;11160](biomejs/biome#11160) [`217f8ad`](biomejs/biome@217f8ad) Thanks [@&#8203;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.

- [#&#8203;11159](biomejs/biome#11159) [`26c23d9`](biomejs/biome@26c23d9) Thanks [@&#8203;saberoueslati](https://github.com/saberoueslati)! - Fixed [#&#8203;11144](biomejs/biome#11144): [`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/) no longer reports already-awaited optional Promise values.

- [#&#8203;11138](biomejs/biome#11138) [`8c2c6bd`](biomejs/biome@8c2c6bd) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Fixed [#&#8203;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;
  ```

- [#&#8203;11152](biomejs/biome#11152) [`c4fc6a9`](biomejs/biome@c4fc6a9) Thanks [@&#8203;dyc3](https://github.com/dyc3)! - Improved the performance of collecting rule timings with `--profile-rules` in heavily multithreaded environments.

- [#&#8203;11128](biomejs/biome#11128) [`4d3ff76`](biomejs/biome@4d3ff76) Thanks [@&#8203;ematipico](https://github.com/ematipico)! - Fixed [#&#8203;7635](biomejs/biome#7635): [`noDeprecatedImports`](https://biomejs.dev/linter/rules/no-deprecated-imports/) now detects deprecated ambient declarations that are exported separately.

- [#&#8203;11117](biomejs/biome#11117) [`01f7ef5`](biomejs/biome@01f7ef5) Thanks [@&#8203;subotac](https://github.com/subotac)! - Fixed [#&#8203;11014](biomejs/biome#11014): [`noDelete`](https://biomejs.dev/linter/rules/no-delete/) no longer reports `process.env["FOO"]` style property deletions.

- [#&#8203;11168](biomejs/biome#11168) [`9847e68`](biomejs/biome@9847e68) Thanks [@&#8203;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" />
  ```

- [#&#8203;11154](biomejs/biome#11154) [`a1d6b1f`](biomejs/biome@a1d6b1f) Thanks [@&#8203;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.

- [#&#8203;11175](biomejs/biome#11175) [`d96d6dd`](biomejs/biome@d96d6dd) Thanks [@&#8203;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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-Formatter Area: formatter L-HTML Language: HTML and super languages

Projects

None yet

Development

Successfully merging this pull request may close these issues.

📝 HTML formatter removes the final newline when a file ends with a comment

2 participants