note: la synthèse et les notes de version sont en anglais
note: pas de synthèse pour cette release plus ancienne
Nous synthétisons les releases récentes. Les notes de version originales de cette version sont ci-dessous.
release-notesgithub.com/biomejs/biome · 981 lignes
- ## 2.5.0
- ### Minor Changes
- - [#9539](https://github.com/biomejs/biome/pull/9539) [`f0615fd`](https://github.com/biomejs/biome/commit/f0615fdae80fa7257fc1d0448d2027cb1acff46e) Thanks [@ematipico](https://github.com/ematipico)! - Added a new reporter called `concise`. When `--reporter=concise` is passed the commands `format`, `lint`, `check` and `ci`, the diagnostics are printed in a compact manner:
- ```
- ! index.ts:2:10: lint/correctness/noUnusedImports: Several of these imports are unused.
- ! main.ts:9:7: lint/correctness/noUnusedVariables: This variable f is unused.
- × index.ts:8:5: lint/suspicious/noImplicitAnyLet: This variable implicitly has the any type.
- × main.ts:2:10: lint/suspicious/noRedeclare: Shouldn't redeclare 'z'. Consider to delete it or rename it.
- ```
- - [#9495](https://github.com/biomejs/biome/pull/9495) [`2056b23`](https://github.com/biomejs/biome/commit/2056b23812a17f9c9a9015e5b725faecb04647b5) Thanks [@aviraldua93](https://github.com/aviraldua93)! - Added the [`useKeyWithClickEvents`](https://biomejs.dev/linter/rules/use-key-with-click-events/) a11y lint rule for HTML files (`.html`, `.vue`, `.svelte`, `.astro`). This is a port of the existing JSX rule. The rule enforces that elements with an `onclick` handler also have at least one keyboard event handler (`onkeydown`, `onkeyup`, or `onkeypress`) to ensure keyboard accessibility.
- Inherently keyboard-accessible elements (`<a>`, `<button>`, `<input>`, `<select>`, `<textarea>`, `<option>`) are excluded, as are elements hidden from assistive technologies (`aria-hidden`) or with `role="presentation"` / `role="none"`.
- ```html
- <!-- Invalid: no keyboard handler -->
- <div onclick="handleClick()">Click me</div>
- <!-- Valid: has keyboard handler -->
- <div onclick="handleClick()" onkeydown="handleKeyDown()">Click me</div>
- <!-- Valid: inherently keyboard-accessible -->
- <button onclick="handleClick()">Submit</button>
- ```
- - [#9152](https://github.com/biomejs/biome/pull/9152) [`9ec8500`](https://github.com/biomejs/biome/commit/9ec8500dabc7305cbe04ecf27a84a1450f012c0b) Thanks [@ematipico](https://github.com/ematipico)! - Added new nursery lint rule [`noUndeclaredClasses`](https://biomejs.dev/linter/rules/no-undeclared-classes/) for HTML, JSX, and SFC files (Vue, Astro, Svelte). The rule detects CSS class names used in `class="..."` (or `className`) attributes that are not defined in any `<style>` block or linked stylesheet reachable from the file.
- ```html
- <!-- .typo is used but never defined -->
- <html>
- <head>
- <style>
- .button {
- color: blue;
- }
- </style>
- </head>
- <body>
- <div class="button typo"></div>
- </body>
- </html>
- ```
- - [#9152](https://github.com/biomejs/biome/pull/9152) [`9ec8500`](https://github.com/biomejs/biome/commit/9ec8500dabc7305cbe04ecf27a84a1450f012c0b) Thanks [@ematipico](https://github.com/ematipico)! - Added new nursery lint rule [`noUnusedClasses`](https://biomejs.dev/linter/rules/no-unused-classes/) for CSS. The rule detects CSS class selectors that are never referenced in any HTML or JSX file that imports the stylesheet. This is a project-domain rule that requires the module graph.
- ```css
- /* styles.css — .ghost is never used in any importing file */
- .button {
- color: blue;
- }
- .ghost {
- color: red;
- }
- ```
- ```jsx
- /* App.jsx */
- import "./styles.css";
- export default () => <div className="button" />;
- ```
- - [#9546](https://github.com/biomejs/biome/pull/9546) [`6567efa`](https://github.com/biomejs/biome/commit/6567efa51ba074436b017e49b1d2d369e7252e74) Thanks [@nhedger](https://github.com/nhedger)! - Added a `biome upgrade` command for standalone installations. It upgrades Homebrew installs with `brew upgrade biome`, updates manually installed binaries from the latest GitHub release, and tells npm users to upgrade with their package manager instead.
- - [#9716](https://github.com/biomejs/biome/pull/9716) [`701767a`](https://github.com/biomejs/biome/commit/701767a3c4de8bce032933588ef2b6e5e252919f) Thanks [@faizkhairi](https://github.com/faizkhairi)! - Added the HTML version of the [`useHeadingContent`](https://biomejs.dev/linter/rules/use-heading-content/) rule. The rule now enforces that heading elements (`h1`-`h6`) have content accessible to screen readers in HTML, Vue, Svelte, and Astro files.
- ```html
- <!-- Invalid: empty heading -->
- <h1></h1>
- <!-- Invalid: heading hidden from screen readers -->
- <h1 aria-hidden="true">invisible content</h1>
- <!-- Valid: heading with text content -->
- <h1>heading</h1>
- <!-- Valid: heading with accessible name -->
- <h1 aria-label="Screen reader content"></h1>
- ```
- - [#9582](https://github.com/biomejs/biome/pull/9582) [`f437ef8`](https://github.com/biomejs/biome/commit/f437ef8b6b0eb8f909d523950cf2c543042083d5) Thanks [@rahuld109](https://github.com/rahuld109)! - Added the HTML version of the [`useKeyWithMouseEvents`](https://biomejs.dev/linter/rules/use-key-with-mouse-events/) rule. The rule now enforces that `onmouseover` is accompanied by `onfocus` and `onmouseout` is accompanied by `onblur` in HTML, Vue, Svelte, and Astro files.
- ```html
- <!-- Invalid: onmouseover without onfocus -->
- <div onmouseover="handleMouseOver()"></div>
- <!-- Valid: onmouseover paired with onfocus -->
- <div onmouseover="handleMouseOver()" onfocus="handleFocus()"></div>
- ```
- - [#9275](https://github.com/biomejs/biome/pull/9275) [`1fdbcee`](https://github.com/biomejs/biome/commit/1fdbceea62d373f24da9c1e5cc0cdd169b573e84) Thanks [@ff1451](https://github.com/ff1451)! - Added the new assist action [`useSortedTypeFields`](https://biomejs.dev/assist/actions/use-sorted-type-fields/), which sorts the fields of GraphQL object types, interface types and input object types alphabetically, e.g. `name, age, id` becomes `age, id, name`.
- - [#10561](https://github.com/biomejs/biome/pull/10561) [`78075b7`](https://github.com/biomejs/biome/commit/78075b7c7cb7490c730a96f4ee9776c9e77826e7) Thanks [@Conaclos](https://github.com/Conaclos)! - Added a new `style` option to [useExportType](https://biomejs.dev/linter/rules/use-export-type/),
- which enforces a style for exporting types.
- This is the same option as the one provided by `useImportType`.
- - [#8987](https://github.com/biomejs/biome/pull/8987) [`d16e32b`](https://github.com/biomejs/biome/commit/d16e32b5b971a4ed9cd3bf5098782c8b752af69a) Thanks [@DerTimonius](https://github.com/DerTimonius)! - Ported the [`useValidAnchor`](https://biomejs.dev/linter/rules/use-valid-anchor/) rule to HTML. This rule enforces that all anchors are valid and that they are navigable elements.
- - [#9533](https://github.com/biomejs/biome/pull/9533) [`4d251d4`](https://github.com/biomejs/biome/commit/4d251d489cfd33a83e42d425476f8d6c66b72d9b) Thanks [@ematipico](https://github.com/ematipico)! - The `init` command now prints the Biome logo.
- - [#10069](https://github.com/biomejs/biome/pull/10069) [`0eb9310`](https://github.com/biomejs/biome/commit/0eb93109e1f9bfbb20744961681b4f0b9b781ad5) Thanks [@Netail](https://github.com/Netail)! - Added the HTML lint rule [`noStaticElementInteractions`](https://biomejs.dev/linter/rules/no-static-element-interactions/), which enforces that static, visible elements (such as `<div>`) that have click handlers use the valid role attribute.
- **Invalid**:
- ```html
- <div onclick="myFunction()"></div>
- ```
- - [#9134](https://github.com/biomejs/biome/pull/9134) [`2a43488`](https://github.com/biomejs/biome/commit/2a434882746d31e1bd3c8e0d711372a539ce88f8) Thanks [@ematipico](https://github.com/ematipico)! - Added the assist action [`useSortedPackageJson`](https://biomejs.dev/assist/actions/use-sorted-package-json).
- This action organizes package.json fields according to the same conventions as the popular [sort-package-json](https://github.com/keithamus/sort-package-json) tool.
- - [#9309](https://github.com/biomejs/biome/pull/9309) [`7daa18b`](https://github.com/biomejs/biome/commit/7daa18b07f7ab348942f4cb83b475e6a4b3d1125) Thanks [@Bertie690](https://github.com/Bertie690)! - The `allowDoubleNegation` option has been added to [`noImplicitCoercions`](https://biomejs.dev/linter/rules/no-implicit-coercions) to allow ignoring double negations inside code.
- With the option enabled, the following example is considered valid and is ignored by the rule:
- ```js
- const truthy = !!value;
- ```
- - [#9700](https://github.com/biomejs/biome/pull/9700) [`894f3fb`](https://github.com/biomejs/biome/commit/894f3fb4c664b12ff9abd1527b535621fe4e22f6) Thanks [@ematipico](https://github.com/ematipico)! - The Biome Language server now supports the "go-to definition" feature.
- When the cursor of the mouse is hovering an entity (variable, CSS class, type, etc.), and the command <kbd>CTRL</kbd> + click is triggered, the editor jumps to where this entity is defined, if the language server can find it.
- Here's what Biome is able to resolve:
- - Variables and types used in JavaScript modules, defined in the same file or imported from another module.
- - JSX Components used in JavaScript modules, defined in the same file or imported from another module.
- - CSS classes used in JSX and HTML-ish files (Vue, Svelte and Astro), and defined in CSS files.
- - Components used in HTML-ish files and defined in other HTML-ish.
- - Variables used in HTML-ish files and defined in the same file or imported from another module (JavaScript or HTML-ish).
- - [#10070](https://github.com/biomejs/biome/pull/10070) [`bae0710`](https://github.com/biomejs/biome/commit/bae071050f5a9c335b4483ee384f21ac1e6f0b4d) Thanks [@Conaclos](https://github.com/Conaclos)! - Added the `:STYLE:` group matcher for [`organizeImports`](https://biomejs.dev/assist/actions/organize-imports/) that matches style imports.
- For example, the following configuration...
- ```json
- {
- "assist": {
- "actions": {
- "source": {
- "organizeImports": {
- "level": "on",
- "options": {
- "groups": ["**", "!:STYLE:"],
- "sortBareImports": true
- }
- }
- }
- }
- }
- }
- ```
- ...places style imports last:
- ```diff
- - import "./style.css"
- import A from "./a.js"
- + import "./style.css"
- ```
- - [#9170](https://github.com/biomejs/biome/pull/9170) [`e3107de`](https://github.com/biomejs/biome/commit/e3107deedcff0f02b61702c6645d89e8d8635b49) Thanks [@mdrobny](https://github.com/mdrobny)! - Added `bundleDependencies` option to [NoUndeclaredDependencies](https://biomejs.dev/linter/rules/no-undeclared-dependencies) rule.
- This rule now supports imports of packages that are defined only in `bundleDependencies` and `bundledDependencies` arrays.
- - [#9547](https://github.com/biomejs/biome/pull/9547) [`01f8473`](https://github.com/biomejs/biome/commit/01f847317820f805698e1b8ba9eaa8fa6c26205c) Thanks [@mujpao](https://github.com/mujpao)! - Added new assist rule [`useSortedAttributes`](https://biomejs.dev/assist/actions/use-sorted-attributes/) for HTML, porting the existing JSX rule. This rule enforces sorted HTML attributes.
- **Invalid**
- ```html
- <input type="text" id="name" name="name" />
- ```
- - [#9366](https://github.com/biomejs/biome/pull/9366) [`2ca1117`](https://github.com/biomejs/biome/commit/2ca1117f1e63f6cd99c0ce8d4b82475625838e2e) Thanks [@dyc3](https://github.com/dyc3)! - Added the `html.parser.vue` configuration option. When enabled, it adds support for the parsing of Vue in `.html` files. Most Vue users don't need to enable this option since Vue files typically use the `.vue` extension, but it can be useful for projects that embed Vue syntax in regular HTML files.
- - [#9073](https://github.com/biomejs/biome/pull/9073) [`74b20ee`](https://github.com/biomejs/biome/commit/74b20eee556c9acc72ad5ea335b1bf0983d2eb2e) Thanks [@chocky335](https://github.com/chocky335)! - Added support for applying GritQL plugin rewrites as code actions. GritQL plugins that use the rewrite operator (`=>`) now produce fixable diagnostics for JavaScript, CSS, and JSON files. By default, plugin rewrites are treated as unsafe fixes and require `--write --unsafe` to apply. Plugin authors can pass `fix_kind = "safe"` to `register_diagnostic()` to mark a fix as safe, allowing it to be applied with just `--write`.
- **Example plugin** (`useConsoleInfo.grit`):
- ```grit
- language js
- `console.log($msg)` as $call where {
- register_diagnostic(span = $call, message = "Use console.info instead of console.log.", severity = "warn", fix_kind = "safe"),
- $call => `console.info($msg)`
- }
- ```
- Running `biome check --write` applies safe rewrites. Unsafe rewrites (the default, or `fix_kind = "unsafe"`) still require `--write --unsafe`.
- - [#9384](https://github.com/biomejs/biome/pull/9384) [`f4c9edc`](https://github.com/biomejs/biome/commit/f4c9edca8f8772a1e65d9e6701fdc3f604a9f3fe) Thanks [@Conaclos](https://github.com/Conaclos)! - Added the `sortBareImports` option to [`organizeImports`](https://biomejs.dev/assist/actions/organize-imports/),
- which allows bare imports to be sorted within other imports when set to `false`.
- ```json
- {
- "assist": {
- "actions": {
- "source": {
- "organizeImports": {
- "level": "on",
- "options": { "sortBareImports": true }
- }
- }
- }
- }
- }
- ```
- ```diff
- - import "b";
- import "a";
- + import "b";
- import { A } from "a";
- + import "./file";
- import { Local } from "./file";
- - import "./file";
- ```
- - [#8731](https://github.com/biomejs/biome/pull/8731) [`e7872bf`](https://github.com/biomejs/biome/commit/e7872bffba88f60d6c3cb6d0c2dd7a25452a0205) Thanks [@siketyan](https://github.com/siketyan)! - Added the watch mode (`--watch`) to the CLI for `check`/`format`/`lint` commands. By enabling this option, Biome will re-run the check automatically when any file in the workspace has changed after the first run.
- - [#10106](https://github.com/biomejs/biome/pull/10106) [`9b35f78`](https://github.com/biomejs/biome/commit/9b35f78e183edf44a3d8b7077ebb0c548a7e92f5) Thanks [@ematipico](https://github.com/ematipico)! - Biome can now format and lint `.svg` files.
- - [#9967](https://github.com/biomejs/biome/pull/9967) [`e9b6c17`](https://github.com/biomejs/biome/commit/e9b6c17cd6f7e870aea68da3b6c6474aa1a9b4f6) Thanks [@dyc3](https://github.com/dyc3)! - Added HTML support for [`noExcessiveLinesPerFile`](https://biomejs.dev/linter/rules/no-excessive-lines-per-file/). Biome now reports HTML files that exceed the configured line limit, including when `skipBlankLines` is enabled.
- - [#9491](https://github.com/biomejs/biome/pull/9491) [`b3eb63c`](https://github.com/biomejs/biome/commit/b3eb63c7e19e6ebd41e463289de098bb003686e1) Thanks [@IxxyDev](https://github.com/IxxyDev)! - Added the HTML lint rule [`noAriaUnsupportedElements`](https://biomejs.dev/linter/rules/no-aria-unsupported-elements/). This rule enforces that elements that do not support ARIA roles, states, and properties (`meta`, `html`, `script`, `style`) do not have `role` or `aria-*` attributes.
- ```html
- <!-- Invalid: meta does not support aria attributes -->
- <meta charset="UTF-8" role="meta" />
- ```
- - [#9306](https://github.com/biomejs/biome/pull/9306) [`afd57a6`](https://github.com/biomejs/biome/commit/afd57a634bdb6b0b161dc8a2522ac460503569b1) Thanks [@viraxslot](https://github.com/viraxslot)! - Added the [`noNoninteractiveTabindex`](https://biomejs.dev/linter/rules/no-noninteractive-tabindex/) lint rule for HTML. This rule enforces that `tabindex` is not used on non-interactive elements, as it can cause usability issues for keyboard users.
- ```html
- <div tabindex="0">Invalid: non-interactive element</div>
- `
- ```
- - [#9276](https://github.com/biomejs/biome/pull/9276) [`6d041d9`](https://github.com/biomejs/biome/commit/6d041d919e06595553093e084e6aad0d39fb8109) Thanks [@IxxyDev](https://github.com/IxxyDev)! - Added the HTML lint rule [`noRedundantRoles`](https://biomejs.dev/linter/rules/no-redundant-roles/). This rule enforces that explicit `role` attributes are not the same as the implicit/default role of an HTML element. It supports HTML, Vue, Svelte, and Astro files.
- ```html
- <!-- Invalid: role="button" is redundant on <button> -->
- <button role="button"></button>
- ```
- - [#9813](https://github.com/biomejs/biome/pull/9813) [`69aadc2`](https://github.com/biomejs/biome/commit/69aadc27741bb8a74c926e14a2a9777064cb1e03) Thanks [@ematipico](https://github.com/ematipico)! - Added a new linter configuration called `preset`. With the new option, users can enable different kinds of rules at once.
- The following presets are available:
- - `"recommended"`: it enables all Biome-recommended rules, or recommended rules of a group;
- - `"all"`: it enables all Biome rules, or enables all rules of a group;
- - `"none"`: it disables all Biome rules, or disable all rules of a group.
- You can enable recommended rules:
- ```json
- {
- "linter": {
- "rules": {
- "preset": "recommended"
- }
- }
- }
- ```
- You can enable **all rules** at once:
- ```json5
- {
- linter: {
- rules: {
- preset: "all", // enables all rules
- },
- },
- }
- ```
- Or enable all rules for a group:
- ```json5
- {
- linter: {
- rules: {
- style: {
- preset: "all", // enables all rules in the style group
- },
- },
- },
- }
- ```
- This new option, however, doesn't affect how nursery rules work. Nursery rules must be enabled singularly, due to their nature.
- This new option is meant to replace `recommended`, so make sure to run the `migrate` command.
- - [#10022](https://github.com/biomejs/biome/pull/10022) [`3422d71`](https://github.com/biomejs/biome/commit/3422d71bc5e9d7f07fd4e7509566427e1591d760) Thanks [@Netail](https://github.com/Netail)! - Added the HTML lint rule [`noNoninteractiveElementToInteractiveRole`](https://biomejs.dev/linter/rules/no-noninteractive-element-to-interactive-role/), which enforces that interactive ARIA roles are not assigned to non-interactive HTML elements.
- **Invalid**:
- ```html
- <h1 role="checkbox"></h1>
- ```
- - [#8396](https://github.com/biomejs/biome/pull/8396) [`13785fc`](https://github.com/biomejs/biome/commit/13785fc8f4be068eccff84a8ad90ac8530d5c992) Thanks [@apple-yagi](https://github.com/apple-yagi)! - Biome now supports pnpm catalogs (default and named) when resolving dependencies for linting. This behavior is opt-in and requires setting `javascript.resolver.experimentalPnpmCatalogs` to `true`.
- - [#10028](https://github.com/biomejs/biome/pull/10028) [`1009414`](https://github.com/biomejs/biome/commit/100941409f3ec5e6653e92b2cfbb4100df1becb0) Thanks [@Netail](https://github.com/Netail)! - Added the HTML lint rule [`noInteractiveElementToNoninteractiveRole`](https://biomejs.dev/linter/rules/no-interactive-element-to-noninteractive-role/), which enforces that non-interactive ARIA roles are not assigned to interactive HTML elements.
- **Invalid**:
- ```html
- <input role="img" />
- ```
- - [#9853](https://github.com/biomejs/biome/pull/9853) [`816302f`](https://github.com/biomejs/biome/commit/816302f8c8c9862585c283fce22ffd1817dedf9f) Thanks [@Netail](https://github.com/Netail)! - Added the new assist action [`useSortedSelectionSet`](https://biomejs.dev/assist/actions/use-sorted-selection-set/), which sorts GraphQL selection sets alphabetically, e.g. `name, age, id` becomes `age, id, name`.
- **Invalid**:
- ```graphql
- query {
- name
- age
- id
- }
- ```
- - [#10074](https://github.com/biomejs/biome/pull/10074) [`9c7c6eb`](https://github.com/biomejs/biome/commit/9c7c6eb99f6880aa87ae0e7aff357e978361c4a3) Thanks [@georgephillips](https://github.com/georgephillips)! - Added a `kind` field to the `ImportMatcher` used by the [`organizeImports`](https://biomejs.dev/assist/actions/organize-imports/) assist action. The new field selects imports by their syntactic kind and currently supports `bare` (matching side-effect imports such as `import "polyfill"`) with optional `!` negation (`!bare`). The matcher composes with the existing `type` and `source` fields, so users can express patterns such as "only bare imports that import a CSS file" (`{ "kind": "bare", "source": "**/*.css" }`).
- For example, with the following configuration:
- ```json
- {
- "assist": {
- "actions": {
- "source": {
- "organizeImports": {
- "level": "on",
- "options": {
- "sortBareImports": true,
- "groups": [
- { "kind": "!bare" },
- ":BLANK_LINE:",
- { "kind": "bare" }
- ]
- }
- }
- }
- }
- }
- }
- ```
- ...the following code:
- ```ts
- import "./register-my-component";
- import { render } from "react-dom";
- import "./polyfill";
- import { Button } from "@/components/Button";
- ```
- ...is organized as:
- ```ts
- import { render } from "react-dom";
- import { Button } from "@/components/Button";
- import "./polyfill";
- import "./register-my-component";
- ```
- - [#9171](https://github.com/biomejs/biome/pull/9171) [`ce65710`](https://github.com/biomejs/biome/commit/ce65710f591eb2676df6833e9cd00e310981692b) Thanks [@chocky335](https://github.com/chocky335)! - Added `includes` option for plugin file scoping. Plugins can now be configured with glob patterns to restrict which files they run on. Use negated globs for exclusions.
- ```json
- {
- "plugins": [
- "global-plugin.grit",
- {
- "path": "scoped-plugin.grit",
- "includes": ["src/**/*.ts", "!**/*.test.ts"]
- }
- ]
- }
- ```
- - [#9617](https://github.com/biomejs/biome/pull/9617) [`dcb99ef`](https://github.com/biomejs/biome/commit/dcb99ef0305d8431af40b526c449316bb8a70efa) Thanks [@faizkhairi](https://github.com/faizkhairi)! - Ported [`useAriaActivedescendantWithTabindex`](https://biomejs.dev/linter/rules/use-aria-activedescendant-with-tabindex/) a11y rule to HTML.
- - [#9496](https://github.com/biomejs/biome/pull/9496) [`1dfb829`](https://github.com/biomejs/biome/commit/1dfb8291a0a2340e7c9220f9126317a7490ec466) Thanks [@aviraldua93](https://github.com/aviraldua93)! - Added HTML support for the [`noAriaHiddenOnFocusable`](https://biomejs.dev/linter/rules/no-aria-hidden-on-focusable/) accessibility lint rule, which enforces that `aria-hidden="true"` is not set on focusable elements. Focusable elements include native interactive elements (`<button>`, `<input>`, `<select>`, `<textarea>`), elements with `href` (`<a>`, `<area>`), elements with `tabindex >= 0`, and editing hosts (`contenteditable`). Includes an unsafe fix to remove the `aria-hidden` attribute.
- ```html
- <!-- Invalid: aria-hidden on a focusable element -->
- <button aria-hidden="true">Submit</button>
- <!-- Valid: aria-hidden on a non-focusable element -->
- <div aria-hidden="true">decorative content</div>
- ```
- - [#9792](https://github.com/biomejs/biome/pull/9792) [`f516854`](https://github.com/biomejs/biome/commit/f51685404f015a5c6f0fc87b9070ac5d9f0a7b6b) Thanks [@Maximiliano-Zeballos](https://github.com/Maximiliano-Zeballos)! - Added the [`useSemanticElements`](https://biomejs.dev/linter/rules/use-semantic-elements/) lint rule for HTML. The rule now detects the use of `role` attributes in HTML elements and suggests using semantic elements instead.
- For example, the following code is now flagged:
- ```html
- <div role="navigation"></div>
- ```
- The rule suggests using `<nav>` instead.
- - [#9761](https://github.com/biomejs/biome/pull/9761) [`cbbb7d5`](https://github.com/biomejs/biome/commit/cbbb7d5bf21d8fb6db275da7adcc03c034538635) Thanks [@Maximiliano-Zeballos](https://github.com/Maximiliano-Zeballos)! - Ported the [`useValidAriaProps`](https://biomejs.dev/linter/rules/use-valid-aria-props/) lint rule to HTML. This rule checks that all `aria-*` attributes used in HTML elements are valid ARIA attributes as defined by the WAI-ARIA specification.
- - [#9928](https://github.com/biomejs/biome/pull/9928) [`aa82576`](https://github.com/biomejs/biome/commit/aa82576ff66e03924e07729051ac9bfc59cd5aa1) Thanks [@aviraldua93](https://github.com/aviraldua93)! - Ported [`useValidAriaValues`](https://biomejs.dev/linter/rules/use-valid-aria-values/) to HTML. Biome now validates static `aria-*` attribute values in HTML elements against WAI-ARIA types, catching invalid values such as `aria-hidden="yes"`.
- - [#10562](https://github.com/biomejs/biome/pull/10562) [`6642895`](https://github.com/biomejs/biome/commit/66428957e6ca393a802f365b8e643438f19a3039) Thanks [@ematipico](https://github.com/ematipico)! - Promoted 73 nursery rules to stable groups.
- Four rules were renamed as part of the promotion:
- - `noFloatingClasses` is now [`noUnusedInstantiation`](https://biomejs.dev/linter/rules/no-unused-instantiation/), because the rule checks any discarded `new` expression, not only classes.
- - `noMultiStr` is now [`noMultilineString`](https://biomejs.dev/linter/rules/no-multiline-string/).
- - `useFind` is now [`useArrayFind`](https://biomejs.dev/linter/rules/use-array-find/).
- - `useSpread` is now [`useSpreadOverApply`](https://biomejs.dev/linter/rules/use-spread-over-apply/), because the rule enforces spread call arguments over `Function.apply()`, not array or object spread.
- #### Correctness
- Promoted the following rules to the `correctness` group:
- - [`noBeforeInteractiveScriptOutsideDocument`](https://biomejs.dev/linter/rules/no-before-interactive-script-outside-document/)
- - [`noUnusedInstantiation`](https://biomejs.dev/linter/rules/no-unused-instantiation/)
- - [`useInlineScriptId`](https://biomejs.dev/linter/rules/use-inline-script-id/) (recommended, Next.js domain)
- - [`noVueVIfWithVFor`](https://biomejs.dev/linter/rules/no-vue-v-if-with-v-for/) (recommended, Vue domain)
- - [`useVueValidVBind`](https://biomejs.dev/linter/rules/use-vue-valid-v-bind/) (recommended, Vue domain)
- - [`useVueValidVElse`](https://biomejs.dev/linter/rules/use-vue-valid-v-else/) (recommended, Vue domain)
- - [`useVueValidVElseIf`](https://biomejs.dev/linter/rules/use-vue-valid-v-else-if/) (recommended, Vue domain)
- - [`useVueValidVHtml`](https://biomejs.dev/linter/rules/use-vue-valid-v-html/) (recommended, Vue domain)
- - [`useVueValidVIf`](https://biomejs.dev/linter/rules/use-vue-valid-v-if/) (recommended, Vue domain)
- - [`useVueValidVOn`](https://biomejs.dev/linter/rules/use-vue-valid-v-on/) (recommended, Vue domain)
- - [`useVueValidVText`](https://biomejs.dev/linter/rules/use-vue-valid-v-text/) (recommended, Vue domain)
- - [`useVueValidTemplateRoot`](https://biomejs.dev/linter/rules/use-vue-valid-template-root/) (recommended, Vue domain)
- - [`useVueValidVCloak`](https://biomejs.dev/linter/rules/use-vue-valid-v-cloak/) (recommended, Vue domain)
- - [`useVueValidVOnce`](https://biomejs.dev/linter/rules/use-vue-valid-v-once/) (recommended, Vue domain)
- - [`useVueValidVPre`](https://biomejs.dev/linter/rules/use-vue-valid-v-pre/) (recommended, Vue domain)
- - [`useVueVForKey`](https://biomejs.dev/linter/rules/use-vue-v-for-key/) (recommended, Vue domain)
- - [`noDuplicateAttributes`](https://biomejs.dev/linter/rules/no-duplicate-attributes/) (recommended)
- - [`noDuplicateArgumentNames`](https://biomejs.dev/linter/rules/no-duplicate-argument-names/) (recommended)
- - [`noDuplicateInputFieldNames`](https://biomejs.dev/linter/rules/no-duplicate-input-field-names/) (recommended)
- - [`noDuplicateVariableNames`](https://biomejs.dev/linter/rules/no-duplicate-variable-names/) (recommended)
- - [`noDuplicateEnumValueNames`](https://biomejs.dev/linter/rules/no-duplicate-enum-value-names/) (recommended)
- - [`useLoneAnonymousOperation`](https://biomejs.dev/linter/rules/use-lone-anonymous-operation/) (recommended)
- #### Suspicious
- Promoted the following rules to the `suspicious` group:
- - [`noShadow`](https://biomejs.dev/linter/rules/no-shadow/)
- - [`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/)
- - [`noParametersOnlyUsedInRecursion`](https://biomejs.dev/linter/rules/no-parameters-only-used-in-recursion/)
- - [`noUnknownAttribute`](https://biomejs.dev/linter/rules/no-unknown-attribute/)
- - [`useArraySortCompare`](https://biomejs.dev/linter/rules/use-array-sort-compare/)
- - [`noForIn`](https://biomejs.dev/linter/rules/no-for-in/)
- - [`noDuplicatedSpreadProps`](https://biomejs.dev/linter/rules/no-duplicated-spread-props/)
- - [`noEqualsToNull`](https://biomejs.dev/linter/rules/no-equals-to-null/)
- - [`noProto`](https://biomejs.dev/linter/rules/no-proto/) (recommended)
- - [`noUndeclaredEnvVars`](https://biomejs.dev/linter/rules/no-undeclared-env-vars/) (recommended, Turborepo domain)
- - [`noReturnAssign`](https://biomejs.dev/linter/rules/no-return-assign/) (default severity: `error`)
- - [`noDuplicateEnumValues`](https://biomejs.dev/linter/rules/no-duplicate-enum-values/) (recommended)
- - [`noVueArrowFuncInWatch`](https://biomejs.dev/linter/rules/no-vue-arrow-func-in-watch/) (recommended, Vue domain)
- - [`noNestedPromises`](https://biomejs.dev/linter/rules/no-nested-promises/)
- - [`noLeakedRender`](https://biomejs.dev/linter/rules/no-leaked-render/)
- - [`noDeprecatedMediaType`](https://biomejs.dev/linter/rules/no-deprecated-media-type/) (recommended)
- - [`noDuplicateGraphqlOperationName`](https://biomejs.dev/linter/rules/no-duplicate-graphql-operation-name/)
- - [`useRequiredScripts`](https://biomejs.dev/linter/rules/use-required-scripts/)
- #### Style
- Promoted the following rules to the `style` group:
- - [`useVueMultiWordComponentNames`](https://biomejs.dev/linter/rules/use-vue-multi-word-component-names/) (recommended, Vue domain)
- - [`useVueDefineMacrosOrder`](https://biomejs.dev/linter/rules/use-vue-define-macros-order/)
- - [`noIncrementDecrement`](https://biomejs.dev/linter/rules/no-increment-decrement/)
- - [`noContinue`](https://biomejs.dev/linter/rules/no-continue/)
- - [`useSpreadOverApply`](https://biomejs.dev/linter/rules/use-spread-over-apply/)
- - [`noTernary`](https://biomejs.dev/linter/rules/no-ternary/)
- - [`noMultilineString`](https://biomejs.dev/linter/rules/no-multiline-string/)
- - [`noMultiAssign`](https://biomejs.dev/linter/rules/no-multi-assign/)
- - [`noExcessiveClassesPerFile`](https://biomejs.dev/linter/rules/no-excessive-classes-per-file/)
- - [`noExcessiveLinesPerFile`](https://biomejs.dev/linter/rules/no-excessive-lines-per-file/)
- - [`noVueOptionsApi`](https://biomejs.dev/linter/rules/no-vue-options-api/)
- - [`useErrorCause`](https://biomejs.dev/linter/rules/use-error-cause/)
- - [`useConsistentEnumValueType`](https://biomejs.dev/linter/rules/use-consistent-enum-value-type/)
- - [`useConsistentMethodSignatures`](https://biomejs.dev/linter/rules/use-consistent-method-signatures/)
- - [`useGlobalThis`](https://biomejs.dev/linter/rules/use-global-this/) (default severity: `warn`)
- - [`useDestructuring`](https://biomejs.dev/linter/rules/use-destructuring/)
- - [`useVueHyphenatedAttributes`](https://biomejs.dev/linter/rules/use-vue-hyphenated-attributes/) (recommended, Vue domain)
- - [`useVueConsistentVBindStyle`](https://biomejs.dev/linter/rules/use-vue-consistent-v-bind-style/) (recommended, Vue domain)
- - [`useVueConsistentVOnStyle`](https://biomejs.dev/linter/rules/use-vue-consistent-v-on-style/) (recommended, Vue domain)
- - [`noHexColors`](https://biomejs.dev/linter/rules/no-hex-colors/)
- - [`useConsistentGraphqlDescriptions`](https://biomejs.dev/linter/rules/use-consistent-graphql-descriptions/)
- - [`noRootType`](https://biomejs.dev/linter/rules/no-root-type/)
- - [`useLoneExecutableDefinition`](https://biomejs.dev/linter/rules/use-lone-executable-definition/)
- - [`useInputName`](https://biomejs.dev/linter/rules/use-input-name/)
- #### Complexity
- Promoted the following rules to the `complexity` group:
- - [`useArrayFind`](https://biomejs.dev/linter/rules/use-array-find/)
- - [`noRedundantDefaultExport`](https://biomejs.dev/linter/rules/no-redundant-default-export/) (default severity: `warn`)
- - [`noUselessReturn`](https://biomejs.dev/linter/rules/no-useless-return/)
- - [`noDivRegex`](https://biomejs.dev/linter/rules/no-div-regex/)
- #### Performance
- Promoted the following rules to the `performance` group:
- - [`noSyncScripts`](https://biomejs.dev/linter/rules/no-sync-scripts/)
- - [`noJsxPropsBind`](https://biomejs.dev/linter/rules/no-jsx-props-bind/)
- - [`useVueVapor`](https://biomejs.dev/linter/rules/use-vue-vapor/)
- #### Security
- Promoted the following rules to the `security` group:
- - [`noScriptUrl`](https://biomejs.dev/linter/rules/no-script-url/) (recommended)
- #### A11y
- Promoted the following rules to the `a11y` group:
- - [`noAmbiguousAnchorText`](https://biomejs.dev/linter/rules/no-ambiguous-anchor-text/) (recommended)
- - [#10121](https://github.com/biomejs/biome/pull/10121) [`450f8e1`](https://github.com/biomejs/biome/commit/450f8e1c0a46e8c867a63a0842deaa50dee95176) Thanks [@jongwan56](https://github.com/jongwan56)! - Biome now applies Git's local exclude file when VCS ignore files are enabled. Files listed in `.git/info/exclude` are skipped the same way as files listed in `.gitignore`, including in linked worktrees.
- - [#9397](https://github.com/biomejs/biome/pull/9397) [`d5913c9`](https://github.com/biomejs/biome/commit/d5913c9d57b771b0b1c0097f8014017878cc14c2) Thanks [@mvarendorff](https://github.com/mvarendorff)! - Added `ignore` option to the [noUnusedVariables](https://biomejs.dev/linter/rules/no-unused-variables/) rule. The option allows excluding identifiers by providing a list of ignored names. It also allows excluding kinds of identifiers from this rule entirely, which may be useful when loading classes dynamically.
- For example, unused classes as well as all unused variables, functions, etc. called "unused" may be ignored entirely with the following configuration:
- ```json
- {
- "ignore": {
- "*": ["unused"],
- "class": ["*"]
- }
- }
- ```
- - [#10089](https://github.com/biomejs/biome/pull/10089) [`71a21f0`](https://github.com/biomejs/biome/commit/71a21f0ab4fd32739331d3b3068c6c1ae6392290) Thanks [@Netail](https://github.com/Netail)! - Added the lint rule [`noLabelWithoutControl`](https://biomejs.dev/linter/rules/no-label-without-control/) to HTML, which enforces that a label element or component has a text label and an associated input.
- ```html
- <label></label>
- ```
- - [#10015](https://github.com/biomejs/biome/pull/10015) [`1828261`](https://github.com/biomejs/biome/commit/182826178de9c1b23bad2e997c3567a9d5176ba2) Thanks [@Netail](https://github.com/Netail)! - Added the HTML lint rule [`useAriaPropsSupportedByRole`](https://biomejs.dev/linter/rules/use-aria-props-supported-by-role/), which enforces that ARIA properties are valid for the roles that are supported by the element.
- ```html
- <a href="#" aria-checked></a>
- ```
- - [#10234](https://github.com/biomejs/biome/pull/10234) [`1a51569`](https://github.com/biomejs/biome/commit/1a51569229936b9ad1191d081ed6742e8342badd) Thanks [@ematipico](https://github.com/ematipico)! - Added the `delimiterSpacing` formatter option. This option inserts spaces inside delimiters (after the opening delimiter and before the closing delimiter) when the content fits on a single line. Empty delimiters are not affected, and no space is added before the opening delimiter. The specific delimiters affected depend on the language. It can be configured globally via `formatter.delimiterSpacing` or per-language via `javascript.formatter.delimiterSpacing`, `json.formatter.delimiterSpacing`, and `css.formatter.delimiterSpacing`. Defaults to `false`.
- ```diff
- - callFn(foo)
- + callFn( foo )
- ```
- ```diff
- - const arr = [1, 2, 3];
- + const arr = [ 1, 2, 3 ];
- ```
- ##### JavaScript
- When enabled, Biome inserts spaces inside parentheses (e.g., `foo( a, b )`), square brackets (e.g., `[ a, b ]`), template literal interpolations (e.g., `${ expr }`), and the logical NOT operator (e.g., `! x`, but in chains only after the last one: `!! x`). Only applies when the content fits on a single line. Empty delimiters and the space before the opening delimiter are not affected.
- ```diff
- - if (condition) {}
- + if ( condition ) {}
- ```
- ```diff
- - `Hello ${name}!`
- + `Hello ${ name }!`
- ```
- ##### JSX
- When enabled, Biome inserts spaces inside JSX expression braces (e.g., `attr={ value }`) and spread attributes (e.g., `{ ...props }`). Only applies when the content fits on a single line. Empty delimiters are not affected.
- ```diff
- - <Foo bar={value} />
- + <Foo bar={ value } />
- ```
- ##### TypeScript
- When enabled, Biome inserts spaces inside TypeScript angle brackets (e.g., `foo< T >()`), indexed access types (e.g., `T[ K ]`), mapped types, tuple types, type parameters, and index signatures. Only applies when the content fits on a single line. Empty delimiters are not affected.
- ```diff
- - type Result = Map<string, number>;
- + type Result = Map< string, number >;
- ```
- ##### JSON
- When enabled, Biome inserts spaces inside square brackets when the content fits on a single line. Empty brackets are not affected.
- ```diff
- - [1, 2, 3]
- + [ 1, 2, 3 ]
- ```
- ##### CSS
- When enabled, Biome inserts spaces inside parentheses and square brackets when the content fits on a single line. Empty delimiters are not affected.
- ```diff
- - rgba(0, 0, 0, 1)
- + rgba( 0, 0, 0, 1 )
- ```
- ```diff
- - [data-attr]
- + [ data-attr ]
- ```
- - [#10461](https://github.com/biomejs/biome/pull/10461) [`6bac1c3`](https://github.com/biomejs/biome/commit/6bac1c3457d396215e4daed5fc59eaf23b42f4eb) Thanks [@TXWSLYF](https://github.com/TXWSLYF)! - Implements [#9445](https://github.com/biomejs/biome/issues/9445). Added the `allowImplicit` option to [`useIterableCallbackReturn`](https://biomejs.dev/linter/rules/use-iterable-callback-return/). When enabled, callbacks can use `return;` to implicitly return `undefined`, matching ESLint's `array-callback-return` rule.
- - [#9571](https://github.com/biomejs/biome/pull/9571) [`5a8eb75`](https://github.com/biomejs/biome/commit/5a8eb755fe07b38760d2b72ec46e24cd108f6619) Thanks [@dyc3](https://github.com/dyc3)! - Added configurable options to the [`useNumericSeparators`](https://biomejs.dev/linter/rules/use-numeric-separators/) rule. Users can now customize the minimum number of digits required before adding separators and the group length for each type of numeric literal (`binary`, `octal`, `decimal`, `hexadecimal`).
- ```json
- {
- "linter": {
- "rules": {
- "style": {
- "useNumericSeparators": {
- "level": "error",
- "options": {
- "decimal": {
- "minimumDigits": 7,
- "groupLength": 3
- },
- "hexadecimal": {
- "minimumDigits": 4,
- "groupLength": 2
- }
- }
- }
- }
- }
- }
- }
- ```
- - [#10067](https://github.com/biomejs/biome/pull/10067) [`6064312`](https://github.com/biomejs/biome/commit/60643120b5593104b311e184cf9581b9c7c2254d) Thanks [@Netail](https://github.com/Netail)! - Added the lint rule [`useFocusableInteractive`](https://biomejs.dev/linter/rules/use-focusable-interactive/) to HTML, which enforces elements with an interactive role and interaction handler to be focusable.
- **Invalid**:
- ```html
- <div role="button"></div>
- ```
- - [#10026](https://github.com/biomejs/biome/pull/10026) [`fb42ac4`](https://github.com/biomejs/biome/commit/fb42ac42079ec7b8e699a507bce332f4446ac7f2) Thanks [@Netail](https://github.com/Netail)! - Added the HTML lint rule [`noNoninteractiveElementInteractions`](https://biomejs.dev/linter/rules/no-noninteractive-element-interactions/), which disallows use event handlers on non-interactive elements.
- **Invalid**:
- ```html
- <div onclick="myFunction()">button</div>
- ```
- - [#10000](https://github.com/biomejs/biome/pull/10000) [`2093e3e`](https://github.com/biomejs/biome/commit/2093e3ee2a615abecae159d35a5a17fe0df5f506) Thanks [@Netail](https://github.com/Netail)! - Added the new assist action [`useSortedEnumMembers`](https://biomejs.dev/assist/actions/use-sorted-enum-members/), which sorts TypeScript & GraphQL enum members.
- **Invalid**:
- ```graphql
- enum Role {
- SUPER_ADMIN
- ADMIN
- USER
- GOD
- }
- ```
- - [#10013](https://github.com/biomejs/biome/pull/10013) [`ad01d3d`](https://github.com/biomejs/biome/commit/ad01d3d882276b070433822f01cdf6afed63ca4e) Thanks [@Netail](https://github.com/Netail)! - Added the HTML lint rule [`useValidAutocomplete`](https://biomejs.dev/linter/rules/use-valid-autocomplete/), which enforces using valid values for the `autocomplete` attribute on `input` elements.
- ```html
- <input autocomplete="incorrect" />
- ```
- ### Patch Changes
- - [#10498](https://github.com/biomejs/biome/pull/10498) [`995c1ff`](https://github.com/biomejs/biome/commit/995c1ffeca039787c93370fed8b970a057e9c073) Thanks [@citadelgrad](https://github.com/citadelgrad)! - Added the nursery rule [`useReactFunctionComponentDefinition`](https://biomejs.dev/linter/rules/use-react-function-component-definition), which enforces a consistent function type for named React function components.
- For example, the following snippet triggers the rule by default.
- ```jsx
- const MyComponent = (props) => {
- return <div>{props.name}</div>;
- };
- ```
- - [#9974](https://github.com/biomejs/biome/pull/9974) [`ff635a9`](https://github.com/biomejs/biome/commit/ff635a90da3567a9006ae947b6c5983d87dfbb9f) Thanks [@pkallos](https://github.com/pkallos)! - Added `ignoreMixedLogicalExpressions` to [useNullishCoalescing](https://biomejs.dev/linter/rules/use-nullish-coalescing/), partially addressing [#9232](https://github.com/biomejs/biome/issues/9232). When enabled, Biome ignores `||` and `||=` mixed with `&&` in the same expression tree.
- - [#10503](https://github.com/biomejs/biome/pull/10503) [`c656679`](https://github.com/biomejs/biome/commit/c656679d1f9e725a42e5d60fb3b9e76bb03d7f88) Thanks [@Mokto](https://github.com/Mokto)! - Added the new nursery rule `useSvelteRequireEachKey`, a Svelte lint rule that reports `{#each}` blocks with item bindings that are missing a key.
- - [#10516](https://github.com/biomejs/biome/pull/10516) [`0f29b83`](https://github.com/biomejs/biome/commit/0f29b8361ba3cd11bdbfb91f8ff722184cfadf08) Thanks [@Dotify71](https://github.com/Dotify71)! - Added [`useIncludes`](https://biomejs.dev/linter/rules/use-includes/) to the nursery group. This rule flags comparisons of `String.prototype.indexOf()` or `Array.prototype.indexOf()` against `-1` and suggests replacing them with the clearer `includes()` / `!includes()` form.
- - [#10487](https://github.com/biomejs/biome/pull/10487) [`0c03ee3`](https://github.com/biomejs/biome/commit/0c03ee3deee068220175c3599e6bc3c4ed8ad247) Thanks [@Mokto](https://github.com/Mokto)! - Fixed a Svelte parser error that incorrectly required a binding variable after `{:then}` and `{:catch}`. Biome now correctly accepts `{:then}` and `{:catch}` without a binding, as well as the `{#await expr then}` and `{#await expr catch}` shorthand forms.
- - [#10566](https://github.com/biomejs/biome/pull/10566) [`a4a294c`](https://github.com/biomejs/biome/commit/a4a294c3c1128fc5b38634262d499d3d2601bf3b) Thanks [@dyc3](https://github.com/dyc3)! - Fixed [`useVueHyphenatedAttributes`](https://biomejs.dev/linter/rules/use-vue-hyphenated-attributes/): The rule now only reports diagnostics in Vue files and ignores SVG elements.
- - [#10565](https://github.com/biomejs/biome/pull/10565) [`72ccf3b`](https://github.com/biomejs/biome/commit/72ccf3b042c4258f9871ff5b99d87f879cecccde) Thanks [@dyc3](https://github.com/dyc3)! - Fixed [`useVueConsistentVBindStyle`](https://biomejs.dev/linter/rules/use-vue-consistent-v-bind-style/): The rule no longer reports argument-less `v-bind` directives because they cannot be converted to shorthand syntax.
- - [#10591](https://github.com/biomejs/biome/pull/10591) [`6e8557b`](https://github.com/biomejs/biome/commit/6e8557b1b8e49ce2383f6089a46624eb030178ad) Thanks [@xsourabhsharma](https://github.com/xsourabhsharma)! - Fixed [#10563](https://github.com/biomejs/biome/issues/10563): Biome now parses comma-separated CSS Modules `composes` values, such as `composes: classA from "./a.css", classB from "./b.css";`.
- - [#10603](https://github.com/biomejs/biome/pull/10603) [`174b21b`](https://github.com/biomejs/biome/commit/174b21b52993fc3e0237ceefe97c0d71c9b5264e) Thanks [@denbezrukov](https://github.com/denbezrukov)! - Fixed CSS formatting for `grid-template-areas` declarations with comments before multiline values. Biome now keeps grid area rows aligned instead of adding an extra declaration-boundary indent.
- ```diff
- .grid {
- grid-template-areas:
- /* row */
- - "header header"
- - "footer footer";
- + "header header"
- + "footer footer";
- }
- ```
- - [#10542](https://github.com/biomejs/biome/pull/10542) [`c3f07f7`](https://github.com/biomejs/biome/commit/c3f07f773edeb7f098c778392c5e2d6bb92b78fb) Thanks [@dyc3](https://github.com/dyc3)! - Fixed [#10513](https://github.com/biomejs/biome/issues/10513): Biome no longer rejects literal `\u` sequences in quoted HTML attribute values.
- - [#10108](https://github.com/biomejs/biome/pull/10108) [`24e51d6`](https://github.com/biomejs/biome/commit/24e51d6edebaee0ffb938bc20633d9c3403110c9) Thanks [@IxxyDev](https://github.com/IxxyDev)! - Fixed [#6611](https://github.com/biomejs/biome/issues/6611): [`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/) now uses type information to detect more redundant conditions, including `?.`, `??`, `||`, `&&`, comparisons against `null`/`undefined` on non-nullish operands, and `case` clauses that can never match the `switch` value.
- - [#10568](https://github.com/biomejs/biome/pull/10568) [`eb1ed0e`](https://github.com/biomejs/biome/commit/eb1ed0e90395a07e64ee763fe15ae00fb77682e0) Thanks [@harsha-cpp](https://github.com/harsha-cpp)! - Fixed [#10564](https://github.com/biomejs/biome/issues/10564): `useAriaPropsForRole` no longer reports false positives for Vue v-bind shorthand bindings (`:aria-checked`, `:aria-level`, etc.).
- - [#10570](https://github.com/biomejs/biome/pull/10570) [`2ceb4fe`](https://github.com/biomejs/biome/commit/2ceb4fe437b77b08a60ad48efde2a6c311b7d2e3) Thanks [@Conaclos](https://github.com/Conaclos)! - Improved [`noTsIgnore`](https://biomejs.dev/linter/rules/no-ts-ignore/).
- The rule now reports more precisely the range of the `@ts-ignore` comment.
- - [#10520](https://github.com/biomejs/biome/pull/10520) [`b55d10f`](https://github.com/biomejs/biome/commit/b55d10f5e8f3099b3f246911ca19cc79758d55e0) Thanks [@dyc3](https://github.com/dyc3)! - Fixed [#10519](https://github.com/biomejs/biome/issues/10519): Vue `v-on` event handlers with multiple inline statements are now parsed consistently with Vue.
- - [#10204](https://github.com/biomejs/biome/pull/10204) [`ebbf0bd`](https://github.com/biomejs/biome/commit/ebbf0bd382059936ac00de29fc58931728f854d9) Thanks [@ematipico](https://github.com/ematipico)! - Improved the performance of the Biome linter. The improvements are more visible in bigger projects that have more than ~1k files. Early tests showed that in a code base with ~2k files, Biome took less than 26% of time to finish the command.
- - [#10546](https://github.com/biomejs/biome/pull/10546) [`e39bb2c`](https://github.com/biomejs/biome/commit/e39bb2c23063ad0384a12e01d666909fd6b26735) Thanks [@tim-we](https://github.com/tim-we)! - Fixed [`#10536`](https://github.com/biomejs/biome/issues/10536): [noUnknownFunction](https://biomejs.dev/linter/rules/no-unknown-function/) no longer flagged CSS `contrast-color()` as unknown. `contrast-color()` is Baseline 2026.
- - [#8012](https://github.com/biomejs/biome/pull/8012) [`2be0264`](https://github.com/biomejs/biome/commit/2be02648a090153a93cf71fb63ef68feefd495c2) Thanks [@denbezrukov](https://github.com/denbezrukov)! - Improved the performance of the formatter in some cases. The formatter is now up to ~20% faster at formatting files.
- - [#10467](https://github.com/biomejs/biome/pull/10467) [`9a5855e`](https://github.com/biomejs/biome/commit/9a5855e4191c98149f8278289569b2272b992684) Thanks [@Netail](https://github.com/Netail)! - Added a new nursery rule [`noRestrictedDependencies`](https://biomejs.dev/linter/rules/no-restricted-dependencies/), which flags imports and `package.json` dependency entries that have better alternatives in e18e's module replacement data.
- For example, the package `globby` is reported because there's a better alternative:
- ```js
- import glob from "globby";
- ```
- ```json
- {
- "dependencies": {
- "globby": "x.x.x"
- }
- }
- ```
- - [#10470](https://github.com/biomejs/biome/pull/10470) [`84b43c5`](https://github.com/biomejs/biome/commit/84b43c5969569cb3eea3d51ea6c602276723306b) Thanks [@ShaharAviram1](https://github.com/ShaharAviram1)! - Fixed [#10447](https://github.com/biomejs/biome/issues/10447): now the rule [`noProcessEnv`](https://biomejs.dev/linter/rules/no-process-env) detects the use of `env` when it's imported from `process` and `node:process`.
- - [#10556](https://github.com/biomejs/biome/pull/10556) [`7ff6b16`](https://github.com/biomejs/biome/commit/7ff6b165f2f62a0836446dee889d9868f12fb06e) Thanks [@ematipico](https://github.com/ematipico)! - Fixed [#10492](https://github.com/biomejs/biome/issues/10492): Biome no longer crashes with a stack overflow on certain code when a type-aware rule such as [`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/), [`noMisusedPromises`](https://biomejs.dev/linter/rules/no-misused-promises/), or [`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/) is enabled. For example, the following code used to crash Biome:
- ```js
- function f(visitor) {
- let ctrl = visitor();
- for (const x of [0]) ctrl = ctrl();
- }
- ```
- - [#10532](https://github.com/biomejs/biome/pull/10532) [`1da3c75`](https://github.com/biomejs/biome/commit/1da3c7573cdb1d097fc1773fee686140d95f3f35) Thanks [@denbezrukov](https://github.com/denbezrukov)! - CSS declarations with comments before `:` or after `!important` now preserve spaces before `:` and `;`.
- ```diff
- .selector {
- - padding/* name */: 1px;
- - color: red !important /* note */;
- + padding/* name */ : 1px;
- + color: red !important /* note */ ;
- }
- ```
- - [#10491](https://github.com/biomejs/biome/pull/10491) [`a1b5834`](https://github.com/biomejs/biome/commit/a1b5834d4968fd518cc4adfa0e8b4b65b2232637) Thanks [@Mokto](https://github.com/Mokto)! - Fixed the Svelte parser rejecting `{#each}` blocks where the binding uses object destructuring with property renaming, e.g. `{#each items as { id, component: Filter }}`. Biome now correctly parses and formats these rename bindings.
- - [#10490](https://github.com/biomejs/biome/pull/10490) [`99bc7df`](https://github.com/biomejs/biome/commit/99bc7df1d1cbb599e9713da56c29763cd04bb53c) Thanks [@Mokto](https://github.com/Mokto)! - Fixed the CSS parser rejecting comma-separated selector lists inside `:global()` and `:local()` pseudo-class functions. Biome now correctly parses `:global(.foo, .bar)`.
- - [#10543](https://github.com/biomejs/biome/pull/10543) [`c394fae`](https://github.com/biomejs/biome/commit/c394faeaa27f9f7db8ba075afc6657c0245d8276) Thanks [@mangod12](https://github.com/mangod12)! - Fixed [#10477](https://github.com/biomejs/biome/issues/10477): The RDJSON reporter now emits code replacement text for fix suggestions instead of the human-readable fix description.
- - [#10530](https://github.com/biomejs/biome/pull/10530) [`e8e1e6a`](https://github.com/biomejs/biome/commit/e8e1e6aa1b39d1e19d33c12d4b56d6d3fd01a7ce) Thanks [@Conaclos](https://github.com/Conaclos)! - Fixed [#10493](https://github.com/biomejs/biome/issues/10493): [`useImportType`](https://biomejs.dev/linter/rules/use-import-type/) now correctly separates types from a default named import when all imports are types and the `style` option is set to `separatedType`.
- - [#10555](https://github.com/biomejs/biome/pull/10555) [`263c7cc`](https://github.com/biomejs/biome/commit/263c7ccd12cd8c0d4527fdf4797c652a223df012) Thanks [@Mokto](https://github.com/Mokto)! - Improved Svelte lint rule accuracy for quoted attribute values containing `{expression}` interpolations.
- - [`noRedundantAlt`](https://biomejs.dev/linter/rules/no-redundant-alt/) no longer emits false positives when the alt text contains an interpolation, e.g. `alt="image of {person}"`.
- - [`useButtonType`](https://biomejs.dev/linter/rules/use-button-type/) no longer emits false positives for dynamic button types written as `type="{dynamicType}"`.
- - [`noScriptUrl`](https://biomejs.dev/linter/rules/no-script-url/) no longer emits false positives for dynamic hrefs such as `href="{url}"`.
- - [#10489](https://github.com/biomejs/biome/pull/10489) [`96ef9a4`](https://github.com/biomejs/biome/commit/96ef9a4c2647a71d917485f6791e151cf8b88c96) Thanks [@Mokto](https://github.com/Mokto)! - Fixed Svelte `{#each}` parser incorrectly rejecting TypeScript `as const` type assertions in the iterable expression. Biome now correctly parses `{#each arr as const as item}`.
- - [#10539](https://github.com/biomejs/biome/pull/10539) [`935c59a`](https://github.com/biomejs/biome/commit/935c59a6657022c37c9b9933c66cc29c236e5aff) Thanks [@dyc3](https://github.com/dyc3)! - Improved how diagnostics print long lines of code, for example minified files where the entire source code is printed in one line.
- ## What's Changed
- * feat(css): support SCSS qualified names in values and function calls by @denbezrukov in https://github.com/biomejs/biome/pull/9096
- * feat(css): add unary expression parsing by @denbezrukov in https://github.com/biomejs/biome/pull/9093
- * feat(css): support scss nesting declarations in declaration lists by @denbezrukov in https://github.com/biomejs/biome/pull/9135
- * feat(css): allow scss declarations in @page blocks by @denbezrukov in https://github.com/biomejs/biome/pull/9139
- * feat(css): allow delimiters in bracketed value lists by @denbezrukov in https://github.com/biomejs/biome/pull/9145
- * feat(analyze/json): useSortedPackageJson by @ematipico in https://github.com/biomejs/biome/pull/9134
- * feat: two new cross language rules by @ematipico in https://github.com/biomejs/biome/pull/9152
- * feat(js-api): add spanInBytesToSpanInCodeUnits helper function by @ash1day in https://github.com/biomejs/biome/pull/8944
- * feat: collect local and global styles for `noUndeclearedClasses` by @ematipico in https://github.com/biomejs/biome/pull/9297
- * feat(organizeImports): add `sortBareImports` option by @Conaclos in https://github.com/biomejs/biome/pull/9384
- * chore: merge main to next by @ematipico in https://github.com/biomejs/biome/pull/9443
- * feat(linter): add includes option for plugin file scoping by @chocky335 in https://github.com/biomejs/biome/pull/9171
- * feat(cli): add ANSI art Biome logo by @ematipico in https://github.com/biomejs/biome/pull/9533
- * feat(biome_service): support applying GritQL plugin rewrites via --write by @chocky335 in https://github.com/biomejs/biome/pull/9073
- * feat(lint): add ignore option to no-unused-variables by @mvarendorff in https://github.com/biomejs/biome/pull/9397
- * feat(biome_html_analyze): port noRedundantRoles a11y rule to HTML in https://github.com/biomejs/biome/pull/9564
- * revert: feat(biome_html_analyze): port noRedundantRoles a11y rule to HTML by @dyc3 in https://github.com/biomejs/biome/pull/9587
- * feat(html/a11y): add noRedundantRoles rule for HTML by @IxxyDev in https://github.com/biomejs/biome/pull/9276
- * feat(cli): concise reporter by @ematipico in https://github.com/biomejs/biome/pull/9539
- * feat(biome_html_analyze): port useKeyWithMouseEvents a11y rule to HTML by @rahuld109 in https://github.com/biomejs/biome/pull/9582
- * chore: fix `next` failures by @dyc3 in https://github.com/biomejs/biome/pull/9633
- * feat(biome_html_analyze): port useAriaActivedescendantWithTabindex to HTML by @faizkhairi in https://github.com/biomejs/biome/pull/9617
- * feat(lint): port useValidAnchor to html by @DerTimonius in https://github.com/biomejs/biome/pull/8987
- * feat: improve noUndeclaredClasses by @ematipico in https://github.com/biomejs/biome/pull/9503
- * feat(biome_html_analyze): port useHeadingContent a11y rule to HTML by @faizkhairi in https://github.com/biomejs/biome/pull/9716
- * feat(formatter): add delimiterSpacing option by @luisherranz in https://github.com/biomejs/biome/pull/9718
- * feat(assist): implement useSortedAttributes for HTML by @mujpao in https://github.com/biomejs/biome/pull/9547
- * feat(html/a11y): port noAriaUnsupportedElements to HTML by @IxxyDev in https://github.com/biomejs/biome/pull/9491
- * feat(assist): use sorted type fields 9137 by @ff1451 in https://github.com/biomejs/biome/pull/9275
- * feat(html_analyze): port useValidAriaProps rule to HTML by @Maximiliano-Zeballos in https://github.com/biomejs/biome/pull/9761
- * feat(html): port noAriaHiddenOnFocusable a11y rule to HTML by @aviraldua93 in https://github.com/biomejs/biome/pull/9496
- * docs: remove duplicate sentence by @Netail in https://github.com/biomejs/biome/pull/9832
- * fix: assist generator by @Netail in https://github.com/biomejs/biome/pull/9831
- * feat(cli): add watch mode (--watch) to the CLI for check/format/lint commands by @siketyan in https://github.com/biomejs/biome/pull/8731
- * refactor: improve watch mode by @ematipico in https://github.com/biomejs/biome/pull/9859
- * feat(cli): add `upgrade` command by @nhedger in https://github.com/biomejs/biome/pull/9546
- * chore: extra rule sources by @Netail in https://github.com/biomejs/biome/pull/9872
- * feat(graphql_analyze): implement useSortedSelectionSet by @Netail in https://github.com/biomejs/biome/pull/9853
- * feat(html): port useValidAriaValues a11y rule to HTML by @aviraldua93 in https://github.com/biomejs/biome/pull/9928
- * chore: merge `main` into `next` by @dyc3 in https://github.com/biomejs/biome/pull/9945
- * feat(lint/html): port noExcessiveLinesPerFile to html by @dyc3 in https://github.com/biomejs/biome/pull/9967
- * docs(organizeImports): revamp user-facing docs by @Conaclos in https://github.com/biomejs/biome/pull/9887
- * ci: update snapshots by @Conaclos in https://github.com/biomejs/biome/pull/9986
- * chore: abstract html tag matcher (main into next) by @Netail in https://github.com/biomejs/biome/pull/9993
- * feat(linter): add noNonInteractiveTabIndex for HTML by @viraxslot in https://github.com/biomejs/biome/pull/9306
- * feat(html_analyze): implement noNoninteractiveElementToInteractiveRole by @Netail in https://github.com/biomejs/biome/pull/10022
- * feat(html_analyze): implement noInteractiveElementToNoninteractiveRole by @Netail in https://github.com/biomejs/biome/pull/10028
- * feat(html_analyze): implement useValidAutocomplete by @Netail in https://github.com/biomejs/biome/pull/10013
- * feat(html_analyze): implement noNoninteractiveElementInteractions by @Netail in https://github.com/biomejs/biome/pull/10026
- * feat(js-formatter): implement delimiterSpacing for JavaScript by @luisherranz in https://github.com/biomejs/biome/pull/9719
- * fix: next branch ci (+ main into next) by @Netail in https://github.com/biomejs/biome/pull/10051
- * feat(html_analyze): implement useAriaPropsSupportedByRole by @Netail in https://github.com/biomejs/biome/pull/10015
- * feat(linter): preset by @ematipico in https://github.com/biomejs/biome/pull/9813
- * feat(organizeImports): add :STYLE: group matcher by @Conaclos in https://github.com/biomejs/biome/pull/10070
- * feat(lint): support pnpm catalogs by @apple-yagi in https://github.com/biomejs/biome/pull/8396
- * feat(html_analyze): implement useFocusableInteractive by @Netail in https://github.com/biomejs/biome/pull/10067
- * feat(html): port useKeyWithClickEvents a11y rule to HTML by @aviraldua93 in https://github.com/biomejs/biome/pull/9495
- * feat(html_analyze): port useSemanticElements a11y rule to HTML by @Maximiliano-Zeballos in https://github.com/biomejs/biome/pull/9792
- * feat(js-formatter): implement delimiterSpacing for JSX by @luisherranz in https://github.com/biomejs/biome/pull/9720
- * feat(js-formatter): implement delimiterSpacing for TypeScript by @luisherranz in https://github.com/biomejs/biome/pull/9721
- * feat(json-formatter): implement delimiterSpacing for JSON by @luisherranz in https://github.com/biomejs/biome/pull/9723
- * feat(html_analyze): port noLabelWithoutControl by @Netail in https://github.com/biomejs/biome/pull/10089
- * chore: merge main into next by @Netail in https://github.com/biomejs/biome/pull/10104
- * feat(migrate): map ESLint spacing rules to delimiterSpacing by @luisherranz in https://github.com/biomejs/biome/pull/9724
- * feat(css-formatter): implement delimiterSpacing for CSS by @luisherranz in https://github.com/biomejs/biome/pull/9722
- * feat(biome_js_analyze): add `bundleDependencies` option to `NoUndeclaredDependencies` rule by @mdrobny in https://github.com/biomejs/biome/pull/9170
- * fix: workspace generation by @Netail in https://github.com/biomejs/biome/pull/10107
- * feat(html_analyze): implement noStaticElementInteractions by @Netail in https://github.com/biomejs/biome/pull/10069
- * feat: implement useSortedEnumMembers by @Netail in https://github.com/biomejs/biome/pull/10000
- * feat(organizeImports): add `kind` field to import matcher by @georgephillips in https://github.com/biomejs/biome/pull/10074
- * chore: main into next by @Netail in https://github.com/biomejs/biome/pull/10142
- * chore: changeset corrections by @Netail in https://github.com/biomejs/biome/pull/10145
- * fix: align HTML & JS a11y sources by @Netail in https://github.com/biomejs/biome/pull/10120
- * feat(lint): add rule options for `noImplicitCoercions` to ignore double negations by @Bertie690 in https://github.com/biomejs/biome/pull/9309
- * docs: incorrect markdown by @ematipico in https://github.com/biomejs/biome/pull/10186
- * feat(core): handle svg files by @ematipico in https://github.com/biomejs/biome/pull/10106
- * feat(config): expose `html.parser.vue` by @dyc3 in https://github.com/biomejs/biome/pull/9366
- * chore: refactor delimiterSpacing changesets by @ematipico in https://github.com/biomejs/biome/pull/10234
- * perf(core): cache analyzer visitor by @ematipico in https://github.com/biomejs/biome/pull/10204
- * feat: go-to definition (#9619) by @ematipico in https://github.com/biomejs/biome/pull/9700
- * chore: merge main into next by @ematipico in https://github.com/biomejs/biome/pull/10316
- * feat(core): respect git info exclude files by @jongwan56 in https://github.com/biomejs/biome/pull/10121
- * feat(useNumericSeparators): add options for minimum digits and group length by @dyc3 in https://github.com/biomejs/biome/pull/9571
- * chore: merge into next by @ematipico in https://github.com/biomejs/biome/pull/10435
- * refactor: use salsa by @ematipico in https://github.com/biomejs/biome/pull/10315
- * chore: merge main into next by @ematipico in https://github.com/biomejs/biome/pull/10453
- * chore: enable unstable features on preview builds for playground by @siketyan in https://github.com/biomejs/biome/pull/10485
- * ci: enable automation jobs by @ematipico in https://github.com/biomejs/biome/pull/10443
- * feat(lint): add ignoreMixedLogicalExpressions option to useNullishCoa… by @pkallos in https://github.com/biomejs/biome/pull/9974
- * fix(parser/yaml): correctly lex anchor/tag properties followed by a sequence by @siketyan in https://github.com/biomejs/biome/pull/10481
- * fix(markdown_parser): keep loose list across empty item before blank line by @jfmcdowell in https://github.com/biomejs/biome/pull/10483
- * fix(lint/noUnnecessaryConditions): extend detection coverage by @IxxyDev in https://github.com/biomejs/biome/pull/10108
- * chore: merge main into next by @ematipico in https://github.com/biomejs/biome/pull/10500
- * fix(html-parser): allow omitting binding in Svelte {:then} and {:catch} blocks by @Mokto in https://github.com/biomejs/biome/pull/10487
- * ci: correct token for removing label by @ematipico in https://github.com/biomejs/biome/pull/10511
- * fix(css_parser): parse semicolonless scss rules by @denbezrukov in https://github.com/biomejs/biome/pull/10509
- * chore(deps): update rust crate jiff to 0.2.28 by @renovate[bot] in https://github.com/biomejs/biome/pull/10521
- * chore(deps): update rust crate serde_json to 1.0.150 by @renovate[bot] in https://github.com/biomejs/biome/pull/10522
- * chore(deps): update github-actions by @renovate[bot] in https://github.com/biomejs/biome/pull/10524
- * chore(deps): update pnpm to v11.4.0 by @renovate[bot] in https://github.com/biomejs/biome/pull/10525
- * ci: remove cli benchmark by @ematipico in https://github.com/biomejs/biome/pull/10526
- * fix(css_parser): support interpolated dashed identifiers in function at-rules by @denbezrukov in https://github.com/biomejs/biome/pull/10518
- * fix(parser/yaml): lex DIRECTIVE_END in stream by @siketyan in https://github.com/biomejs/biome/pull/10480
- * fix(parser/yaml): lex directives by @siketyan in https://github.com/biomejs/biome/pull/10484
- * fix(parse/js/vue): allow v-on directives with multiple inline statements by @dyc3 in https://github.com/biomejs/biome/pull/10520
- * feat(core): implement YAML file handler by @siketyan in https://github.com/biomejs/biome/pull/10527
- * fix(useImportType): always separate types from default named imports by @Conaclos in https://github.com/biomejs/biome/pull/10530
- * fix(css_formatter): preserve declaration comment boundaries by @denbezrukov in https://github.com/biomejs/biome/pull/10532
- * feat(formatter/yaml): initial implementation for simple block mappings by @siketyan in https://github.com/biomejs/biome/pull/10528
- * feat(formatter/yaml): initial implementation for block sequences by @siketyan in https://github.com/biomejs/biome/pull/10529
- * feat(tailwind_parser): parse Tailwind variant expressions by @jiwon79 in https://github.com/biomejs/biome/pull/10448
- * chore(deps): update github-actions (major) by @renovate[bot] in https://github.com/biomejs/biome/pull/10538
- * fix(svelte_parser): support destructuring rename bindings in {#each} blocks by @Mokto in https://github.com/biomejs/biome/pull/10491
- * perf: reduce allocations in noExcessiveLinesPerFile rules by @ematipico in https://github.com/biomejs/biome/pull/10506
- * feat(html/nursery): add useSvelteRequireEachKey rule by @Mokto in https://github.com/biomejs/biome/pull/10503
- * fix(diagnostics): truncate diagnostics that are super long to keep output readable by @dyc3 in https://github.com/biomejs/biome/pull/10539
- * feat(lint/useIterableCallbackReturn): add allowImplicit option #9445 by @TXWSLYF in https://github.com/biomejs/biome/pull/10461
- * fix(css-parser): allow comma-separated selector lists inside :global() and :local() by @Mokto in https://github.com/biomejs/biome/pull/10490
- * fix(linter): recognize contrast-color() as a known CSS function by @tim-we in https://github.com/biomejs/biome/pull/10546
- * fix(parse/html): don't bother tracking unicode escape sequences by @dyc3 in https://github.com/biomejs/biome/pull/10542
- * fix(cli): emit rdjson code suggestion replacements by @mangod12 in https://github.com/biomejs/biome/pull/10543
- * refactor(organizeImports): require `sortBareImports` for bare matchers by @Conaclos in https://github.com/biomejs/biome/pull/10517
- * feat(linter): implement useIncludes rule by @Dotify71 in https://github.com/biomejs/biome/pull/10516
- * fix(html-parser): allow TypeScript as const in Svelte {#each} expressions by @Mokto in https://github.com/biomejs/biome/pull/10489
- * chore: add SCSS in unstable wasm build by @denbezrukov in https://github.com/biomejs/biome/pull/10551
- * test(css_formatter): sync Prettier CSS and SCSS fixtures by @denbezrukov in https://github.com/biomejs/biome/pull/10554
- * chore: merge main into next by @ematipico in https://github.com/biomejs/biome/pull/10553
- * chore: biome v2.5 by @ematipico in https://github.com/biomejs/biome/pull/9277
- * fix: avoid infinite recursion by passing depth to resolve_callee_to_function by @ematipico in https://github.com/biomejs/biome/pull/10556
- * fix(css_formatter): add spacing SCSS binary expressions by @denbezrukov in https://github.com/biomejs/biome/pull/10537
- * feat: noRestrictedDependencies by @Netail in https://github.com/biomejs/biome/pull/10467
- * feat: rule promotion for v2.5 by @ematipico in https://github.com/biomejs/biome/pull/10562
- * fix(useVueConsistentVBindStyle): don't flag v-bind directives that don't have arguments by @dyc3 in https://github.com/biomejs/biome/pull/10565
- * fix(useVueHyphenatedAttributes): only run in vue files, exclude svgs and their children by @dyc3 in https://github.com/biomejs/biome/pull/10566
- * docs: replace "allows to" with "allows you to" in formatter comments by @dfedoryshchev in https://github.com/biomejs/biome/pull/10507
- * feat(useExportType): add style option by @Conaclos in https://github.com/biomejs/biome/pull/10561
- * refactor(useExportType): improve docs and code by @Conaclos in https://github.com/biomejs/biome/pull/10569
- * refactor(noTsIgnore): avoid one alloc, improve range reporting by @Conaclos in https://github.com/biomejs/biome/pull/10570
- * fix(css_parser): parse SCSS bracketed expression lists by @denbezrukov in https://github.com/biomejs/biome/pull/10567
- * fix(a11y): useAriaPropsForRole no longer false-positives on Vue v-bind shorthand 🤖🤖🤖 by @harsha-cpp in https://github.com/biomejs/biome/pull/10568
- * fix(css_formatter): indent broken SCSS string concatenation by @denbezrukov in https://github.com/biomejs/biome/pull/10571
- * fix(css_formatter): preserve SCSS grid template rows by @denbezrukov in https://github.com/biomejs/biome/pull/10572
- * feat(css_parser): parse interpolated scss media conditions by @denbezrukov in https://github.com/biomejs/biome/pull/10573
- * feat(css_formatter): expand compound SCSS variable lists by @denbezrukov in https://github.com/biomejs/biome/pull/10577
- * fix: docs and readme by @ematipico in https://github.com/biomejs/biome/pull/10584
- * feat(css): parse dynamic SCSS keyframes names by @denbezrukov in https://github.com/biomejs/biome/pull/10587
- * fix(markdown): remove unused hard_line slot from MdParagraph by @jfmcdowell in https://github.com/biomejs/biome/pull/10593
- * feat(css_parser): parse SCSS variables in keyframes by @denbezrukov in https://github.com/biomejs/biome/pull/10598
- * feat(css_formatter): improve SCSS variable declaration formatting by @denbezrukov in https://github.com/biomejs/biome/pull/10597
- * chore(deps): update dependency @types/node to v24.13.1 by @renovate[bot] in https://github.com/biomejs/biome/pull/10579
- * chore(deps): update github-actions by @renovate[bot] in https://github.com/biomejs/biome/pull/10580
- * chore(deps): update rust to v1.96.0 by @renovate[bot] in https://github.com/biomejs/biome/pull/10582
- * chore(deps): update pnpm to v11.5.2 by @renovate[bot] in https://github.com/biomejs/biome/pull/10581
- * test(md): cover loose list + mixed space-tab sublist in fuzz corpus by @jfmcdowell in https://github.com/biomejs/biome/pull/10594
- * feat(css_formatter): keep SCSS scalar parentheses inline by @denbezrukov in https://github.com/biomejs/biome/pull/10599
- * fix(markdown): remove dead syntax kinds and fix bogus node handling by @jfmcdowell in https://github.com/biomejs/biome/pull/10600
- * fix(markdown): reset link-definition continuation when a block quote opens by @jfmcdowell in https://github.com/biomejs/biome/pull/10601
- * fix(css_parser): parse comma-separated composes values by @xsourabhsharma in https://github.com/biomejs/biome/pull/10591
- * fix(biome_configuration): avoid Markdown links in JSON schema descriptions by @mvanhorn in https://github.com/biomejs/biome/pull/10589
- * fix(lint): detect imported process env usage by @ShaharAviram1 in https://github.com/biomejs/biome/pull/10470
- * feat(fmt/md): improve formatting of list against prettier by @ematipico in https://github.com/biomejs/biome/pull/10383
- * feat(html_parser): parse Svelte interpolations in quoted attribute values by @Mokto in https://github.com/biomejs/biome/pull/10555
- * refactor: removes mutex from salsa db by @ematipico in https://github.com/biomejs/biome/pull/10608
- * feat(css_parser): parse interpolated SCSS supports conditions by @denbezrukov in https://github.com/biomejs/biome/pull/10602
- * fix(css_formatter): align grid-template-areas rows after comments by @denbezrukov in https://github.com/biomejs/biome/pull/10603
- * refactor(formatter): introduce the SourcePosition element and remove source position from Text and LocatedTokenText variant by @denbezrukov in https://github.com/biomejs/biome/pull/8012
- * feat(lint): add useFunctionComponentDefinition rule by @citadelgrad in https://github.com/biomejs/biome/pull/10498
- * ci: release by @github-actions[bot] in https://github.com/biomejs/biome/pull/10499
- ## New Contributors
- * @ash1day made their first contribution in https://github.com/biomejs/biome/pull/8944
- * @mvarendorff made their first contribution in https://github.com/biomejs/biome/pull/9397
- * @IxxyDev made their first contribution in https://github.com/biomejs/biome/pull/9276
- * @faizkhairi made their first contribution in https://github.com/biomejs/biome/pull/9617
- * @luisherranz made their first contribution in https://github.com/biomejs/biome/pull/9718
- * @Maximiliano-Zeballos made their first contribution in https://github.com/biomejs/biome/pull/9761
- * @aviraldua93 made their first contribution in https://github.com/biomejs/biome/pull/9496
- * @apple-yagi made their first contribution in https://github.com/biomejs/biome/pull/8396
- * @mdrobny made their first contribution in https://github.com/biomejs/biome/pull/9170
- * @georgephillips made their first contribution in https://github.com/biomejs/biome/pull/10074
- * @jongwan56 made their first contribution in https://github.com/biomejs/biome/pull/10121
- * @Mokto made their first contribution in https://github.com/biomejs/biome/pull/10487
- * @TXWSLYF made their first contribution in https://github.com/biomejs/biome/pull/10461
- * @mangod12 made their first contribution in https://github.com/biomejs/biome/pull/10543
- * @harsha-cpp made their first contribution in https://github.com/biomejs/biome/pull/10568
- * @xsourabhsharma made their first contribution in https://github.com/biomejs/biome/pull/10591
- * @ShaharAviram1 made their first contribution in https://github.com/biomejs/biome/pull/10470
- * @citadelgrad made their first contribution in https://github.com/biomejs/biome/pull/10498
- **Full Changelog**: https://github.com/biomejs/biome/compare/@biomejs/biome@2.4.16...@biomejs/biome@2.5.0