@biomejs/biome@2.4.14
biomejs/biome@biomejs/biome@2.4.14May 1, 2026by github-actions[bot]
AI Summary
This patch release adds new nursery rules for React and testing, fixes crashes in the Svelte parser for missing expressions, and expands SCSS parsing capabilities with interpolation support.
Key Highlights
- Added `noReactStringRefs` rule to disallow legacy React string refs.
- Added `useTestHooksOnTop` rule to enforce hook ordering before test cases.
- Fixed parser crash when parsing Svelte templates with missing expressions.
- Added support for SCSS interpolated selectors and properties.
- Improved `noMisleadingReturnType` to detect widening from concrete types.
New Features
- Added `noReactStringRefs` rule.
- Added `useTestHooksOnTop` rule.
- Added support for SCSS interpolation in attribute selectors.
- Added support for SCSS interpolated nth arguments.
Full Release Notes
## 2.4.14
### Patch Changes
- [#9393](https://github.com/biomejs/biome/pull/9393) [`491b171`](https://github.com/biomejs/biome/commit/491b171e245aa1ad1063662d4408692b4fc11eae) Thanks [@dyc3](https://github.com/dyc3)! - Added the nursery rule [`useTestHooksOnTop`](https://biomejs.dev/linter/rules/use-test-hooks-on-top) in the `test` domain. The rule flags lifecycle hooks (`beforeEach`, `beforeAll`, `afterEach`, `afterAll`) that appear after test cases in the same block, enforcing that hooks are defined before any test case.
- [#10157](https://github.com/biomejs/biome/pull/10157) [`eefc5ab`](https://github.com/biomejs/biome/commit/eefc5ab81709e78068774b0f5bc56af448a733d1) Thanks [@dyc3](https://github.com/dyc3)! - Fixed [#7882](https://github.com/biomejs/biome/issues/7882): The HTML parser will now emit better diagnostics when it encounters a void element with a closing tag, such as `<br></br>`. Previously, the parser would emit multiple diagnostics with conflicting advice. Now it emits a single diagnostic that clearly states that void elements should not have closing tags.
- [#10054](https://github.com/biomejs/biome/pull/10054) [`0e9f569`](https://github.com/biomejs/biome/commit/0e9f5696b1f2dec6e0d1f81b39192bdb07ab0c1a) Thanks [@minseong0324](https://github.com/minseong0324)! - [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) no longer misses widening from concrete object types, class instances, object literals, tuples, functions, and regular expressions to `: object`.
A function annotated `: object` returning an object literal:
```ts
function f(): object {
return { retry: true };
}
```
- [#10116](https://github.com/biomejs/biome/pull/10116) [`53269eb`](https://github.com/biomejs/biome/commit/53269ebe0a2f718213483444696b88c7e8d0e7c4) Thanks [@jiwon79](https://github.com/jiwon79)! - Fixed [#6201](https://github.com/biomejs/biome/issues/6201): [`noUselessEscapeInRegex`](https://biomejs.dev/linter/rules/no-useless-escape-in-regex/) no longer flags an escaped backslash followed by `-` as a useless escape. Patterns like `/[\\-]/` are now considered valid because the second `\` is the escaped backslash, not an unnecessary escape of the trailing dash.
- [#10092](https://github.com/biomejs/biome/pull/10092) [`33d8543`](https://github.com/biomejs/biome/commit/33d8543da451e272000b84a8e29114d72923cdc1) Thanks [@Conaclos](https://github.com/Conaclos)! - Fixed [#9097](https://github.com/biomejs/biome/issues/9097): [`organizeImports`](https://biomejs.dev/assist/actions/organize-imports/) no longer adds a blank line between a never-matched group and a matched group.
Given the following `organizeImports` options:
```json
{
"groups": [":NODE:", ":BLANK_LINE:", ":PACKAGE:", ":BLANK_LINE:", ":PATH:"]
}
```
The following code...
```js
// Comment
import "package";
import "./file.js";
```
...was organized as:
```diff
+
// Comment
import "package";
+
import "./file.js";
```
A blank line was added even though the group ':NODE:' doesn't match any imports here.
`:BLANK_LINE:` between never-matched groups and matched groups are now ignored.
The code is now organized as:
```diff
// Comment
import "package";
+
import "./file.js";
```
- [#10138](https://github.com/biomejs/biome/pull/10138) [`a10b6c1`](https://github.com/biomejs/biome/commit/a10b6c119d1f3862da918ce7617ee365bb534c6e) Thanks [@dyc3](https://github.com/dyc3)! - Fixed Vue `v-for` handling for [`noUndeclaredVariables`](https://biomejs.dev/linter/rules/no-undeclared-variables/) and [`noUnusedVariables`](https://biomejs.dev/linter/rules/no-unused-variables/). Biome now recognizes variables declared by `v-for` directives and references to iterated values in Vue templates.
- [#10115](https://github.com/biomejs/biome/pull/10115) [`d428d76`](https://github.com/biomejs/biome/commit/d428d76ba8be7131090c199cefa36613a332e75b) Thanks [@minseong0324](https://github.com/minseong0324)! - [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) no longer reports false positives when a union return type's `boolean` variant is covered by both `true` and `false` returns.
- [#9922](https://github.com/biomejs/biome/pull/9922) [`7acf1e0`](https://github.com/biomejs/biome/commit/7acf1e0890d1e52b1cfa940554f6ebbd1bae20b3) Thanks [@dyc3](https://github.com/dyc3)! - Added the new nursery rule [`noReactStringRefs`](https://biomejs.dev/linter/rules/no-react-string-refs/), which disallows legacy React string refs such as `ref="hello"` and `this.refs.hello`.
Biome also reports template-literal refs such as ``ref={`hello`}``, so React code can consistently migrate to callback refs, `createRef()`, or `useRef()`.
- [#10010](https://github.com/biomejs/biome/pull/10010) [`f3e76ab`](https://github.com/biomejs/biome/commit/f3e76ab7befecca7cdc7a04edac1350de31029de) Thanks [@dyc3](https://github.com/dyc3)! - Fixed a bug in the LSP file watcher registration so Biome now watches `.biome.json` and `.biome.jsonc` configuration files and reloads workspace settings when they change.
- [#10176](https://github.com/biomejs/biome/pull/10176) [`8a40ef8`](https://github.com/biomejs/biome/commit/8a40ef835db83277a15b4f0455b5b9b69c719ad3) Thanks [@dyc3](https://github.com/dyc3)! - Fixed [#10011](https://github.com/biomejs/biome/issues/10011): The [`noThisInStatic`](https://biomejs.dev/linter/rules/no-this-in-static/) rule no longer reports `this` when it is used as the constructor target in `new this(...)`, which is required for inherited static factory methods.
- [#10163](https://github.com/biomejs/biome/pull/10163) [`6867e96`](https://github.com/biomejs/biome/commit/6867e96dacf0b96dfbefd51f95a29136d90b7bb4) Thanks [@jiwon79](https://github.com/jiwon79)! - Fixed [#9884](https://github.com/biomejs/biome/issues/9884): The [`useSortedAttributes`](https://biomejs.dev/assist/actions/use-sorted-attributes/) auto-fix no longer corrupts source code when both an outer JSX element and a nested JSX-valued attribute have unsorted attributes in the same pass. Multiple unsorted groups separated by spread or shorthand attributes within the same JSX element are now reported as a single diagnostic.
- [#10079](https://github.com/biomejs/biome/pull/10079) [`d29dd19`](https://github.com/biomejs/biome/commit/d29dd1916bdfa4a13dba95cad57f61c65cb5739c) Thanks [@Damix48](https://github.com/Damix48)! - Fixed false positive in `noAssignInExpressions` for Svelte `{@const}` blocks. Assignments in `{@const name = value}` are now correctly recognized as declarations rather than accidental assignments in expressions.
- [#10080](https://github.com/biomejs/biome/pull/10080) [`5d8fdac`](https://github.com/biomejs/biome/commit/5d8fdac6d26987904130c2ef0db797c295922f08) Thanks [@Damix48](https://github.com/Damix48)! - Fixed parsing of closing parentheses in Svelte `{#each}` block key expressions. Biome now correctly parses method calls and other parenthesised expressions used as keys.
For example, the following snippets are now parsed correctly:
```svelte
{#each numbers as number, index (number.toString())}
<p>{number}</p>
{/each}
{#each numbers as number (key(number))}
<p>{number}</p>
{/each}
```
- [#10140](https://github.com/biomejs/biome/pull/10140) [`e7024b9`](https://github.com/biomejs/biome/commit/e7024b92638090a9b8ccd064e0662f7994164621) Thanks [@solithcy](https://github.com/solithcy)! - Fixed [#10135](https://github.com/biomejs/biome/issues/10135): Biome no longer crashes on missing Svelte template expressions.
The following code snippet longer panics:
```svelte
{#if }
<p>^ this would previously crash</p>
{/if}
{@const }
<p> ^ this would also crash</p>
```
- [#10111](https://github.com/biomejs/biome/pull/10111) [`7818009`](https://github.com/biomejs/biome/commit/7818009e23e12758d00665be6faf8471ca0b0027) Thanks [@jiwon79](https://github.com/jiwon79)! - Fixed [#9997](https://github.com/biomejs/biome/issues/9997): [`noDuplicateSelectors`](https://biomejs.dev/linter/rules/no-duplicate-selectors/) no longer reports false positives for selectors inside `@scope` queries. Biome now treats `@scope` as a separate at-rule context, like `@media`, `@supports`, `@container`, and `@starting-style`.
The following snippet is no longer flagged as a duplicate:
```css
.Example {
padding: 0;
}
@scope (.theme-dark) {
.Example {
color: white;
}
}
```
- [#9926](https://github.com/biomejs/biome/pull/9926) [`d62b331`](https://github.com/biomejs/biome/commit/d62b331726c1b730ca2d1c38325ce6196beee7a4) Thanks [@dyc3](https://github.com/dyc3)! - Added the nursery lint rule [`useMathMinMax`](https://biomejs.dev/linter/rules/use-math-min-max/), which prefers `Math.min()` and `Math.max()` over equivalent ternary comparisons.
For example, this code:
```js
const min = a < b ? a : b;
```
is much more readable when rewritten as:
```js
const min = Math.min(a, b);
```
- [#10115](https://github.com/biomejs/biome/pull/10115) [`d428d76`](https://github.com/biomejs/biome/commit/d428d76ba8be7131090c199cefa36613a332e75b) Thanks [@minseong0324](https://github.com/minseong0324)! - [`useExhaustiveSwitchCases`](https://biomejs.dev/linter/rules/use-exhaustive-switch-cases/) now flags missing `true`/`false` cases for `boolean` discriminants, including when `boolean` is a union variant.
- [#10125](https://github.com/biomejs/biome/pull/10125) [`a55a0b6`](https://github.com/biomejs/biome/commit/a55a0b6fe03f772316b76937b1292096cdc8a661) Thanks [@bmish](https://github.com/bmish)! - Fixed a resolver bug where packages that define a typed entry point through `package.json`'s `main` field but omit `types` were ignored during type-aware resolution. Type-aware rules such as [`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/) can now inspect imports from those packages.
- [#10117](https://github.com/biomejs/biome/pull/10117) [`895e809`](https://github.com/biomejs/biome/commit/895e809dc799cd6aa70032fbb56dfe0f9c0f6f39) Thanks [@denizdogan](https://github.com/denizdogan)! - Added support for the `corner-shape` family of CSS properties and the `superellipse()`/`squircle()` value functions, so [`noUnknownProperty`](https://biomejs.dev/linter/rules/no-unknown-property/) and [`noUnknownFunction`](https://biomejs.dev/linter/rules/no-unknown-function/) no longer flag them as unknown.
New known properties: `corner-shape`, `corner-block-end-shape`, `corner-block-start-shape`, `corner-bottom-left-shape`, `corner-bottom-right-shape`, `corner-bottom-shape`, `corner-end-end-shape`, `corner-end-start-shape`, `corner-inline-end-shape`, `corner-inline-start-shape`, `corner-left-shape`, `corner-right-shape`, `corner-start-end-shape`, `corner-start-start-shape`, `corner-top-left-shape`, `corner-top-right-shape`, `corner-top-shape`.
New known value functions: `superellipse()`, `squircle()`.
- [#8620](https://github.com/biomejs/biome/pull/8620) [`8df8f73`](https://github.com/biomejs/biome/commit/8df8f73ca1c18a688f64f304f0b9089797258a1e) Thanks [@dyc3](https://github.com/dyc3)! - Fixed [#8062](https://github.com/biomejs/biome/issues/8062): Added support for parsing Vue `v-for` directives more accurately.
- [#10191](https://github.com/biomejs/biome/pull/10191) [`aa055cd`](https://github.com/biomejs/biome/commit/aa055cd74f82fac691dfa2f65dbfd255213cb884) Thanks [@guney](https://github.com/guney)! - Now the rule [`noStaticElementInteractions`](https://biomejs.dev/linter/rules/no-static-element-interactions/) doesn't trigger custom elements.
- [#9757](https://github.com/biomejs/biome/pull/9757) [`2c62594`](https://github.com/biomejs/biome/commit/2c62594b84ae62fd5fa130adff917a1bcd8dfddd) Thanks [@dyc3](https://github.com/dyc3)! - Fixed [#9099](https://github.com/biomejs/biome/issues/9099): the HTML formatter collapsing non-text children (inline elements, Svelte expressions, comments) onto a single line when the source had them on separate lines. Biome now preserves the user's intended line breaks for exclusively non-text children.
For example, the following Svelte snippet is now preserved instead of being collapsed to `<div>{name}<!-- comment --></div>`:
```svelte
<div>
{name}<!-- comment -->
</div>
```
Similarly, HTML elements like `<span>` inside a `<div>` are now preserved when written on their own line:
```html
<div>
<span>text</span>
</div>
```
- [#10105](https://github.com/biomejs/biome/pull/10105) [`e7c1a6d`](https://github.com/biomejs/biome/commit/e7c1a6d5319908cf613f7fa80667e6981435508d) Thanks [@jiwon79](https://github.com/jiwon79)! - Fixed [#10039](https://github.com/biomejs/biome/issues/10039): [`useReadonlyClassProperties`](https://biomejs.dev/linter/rules/use-readonly-class-properties/) now detects unreassigned private members in class expressions and export default classes, not only in class declarations.
The following patterns are now correctly flagged:
```ts
const AnonClass = class {
#prop = 123;
constructor() {
console.log(this.#prop);
}
};
export default class {
#prop = 123;
constructor() {
console.log(this.#prop);
}
}
```
- [#10141](https://github.com/biomejs/biome/pull/10141) [`46a77d0`](https://github.com/biomejs/biome/commit/46a77d0a35e8dbbcefeca264e8630af83b21f1d9) Thanks [@minseong0324](https://github.com/minseong0324)! - Improved [`noUnnecessaryConditions`](https://biomejs.dev/linter/rules/no-unnecessary-conditions/) to detect conditions that are always truthy because they check built-in global class instances such as `Date`, `Map`, `Set`, `WeakMap`, and `Error`.
- [#10178](https://github.com/biomejs/biome/pull/10178) [`7b05a89`](https://github.com/biomejs/biome/commit/7b05a893df8c9c950871b83ff1b3ae28113e8b15) Thanks [@dyc3](https://github.com/dyc3)! - Fixed [#10177](https://github.com/biomejs/biome/issues/10177): The HTML parser no longer reports lowercase `html` or `doctype` text as invalid after void elements such as `<br>`.
- [#10155](https://github.com/biomejs/biome/pull/10155) [`0d4595d`](https://github.com/biomejs/biome/commit/0d4595dae68b034bd6de3bdfd15437a34fa53cb2) Thanks [@jiwon79](https://github.com/jiwon79)! - Fixed [#10045](https://github.com/biomejs/biome/issues/10045): the CSS formatter no longer compounds indentation inside nested functional pseudo-classes such as `:not(:where(...))`, `:is(:where(...))`, and similar combinations. The same fix also removes one level of unnecessary indentation that was added inside any pseudo-class function whose argument list wrapped onto multiple lines, including `:nth-child(... of ...)`, `::part(...)`, and `:active-view-transition-type(...)`.
The following snippet is now correctly formatted, matching Prettier.
```css
input:not(
:where(
[type="submit"],
[type="checkbox"],
[type="radio"],
[type="button"],
[type="reset"]
)
) {
inline-size: 100%;
}
```
- [#10112](https://github.com/biomejs/biome/pull/10112) [`6f0251e`](https://github.com/biomejs/biome/commit/6f0251ea12cddb6edcbf512e5608a7b502762423) Thanks [@dyc3](https://github.com/dyc3)! - Fixed [#10110](https://github.com/biomejs/biome/issues/10110): Biome's parser now accepts surrogate code points in JavaScript string `\u{...}` escapes.
- [#10141](https://github.com/biomejs/biome/pull/10141) [`46a77d0`](https://github.com/biomejs/biome/commit/46a77d0a35e8dbbcefeca264e8630af83b21f1d9) Thanks [@minseong0324](https://github.com/minseong0324)! - Improved [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) to detect `object` return annotations that hide built-in global class instances such as `Date`, `Map`, `Set`, `WeakMap`, and `Error`.
- [#10083](https://github.com/biomejs/biome/pull/10083) [`4a664c1`](https://github.com/biomejs/biome/commit/4a664c1c9ebee339ee4a8b971b0a345aa4dbbe70) Thanks [@ematipico](https://github.com/ematipico)! - Added two new options to [`noShadow`](https://biomejs.dev/linter/rules/no-shadow/), both defaulting to `true` to match typescript-eslint's behavior.
Fixed [#9482](https://github.com/biomejs/biome/issues/9482): Added `ignoreFunctionTypeParameterNameValueShadow` option. When enabled, parameter names inside function type annotations (e.g. `(options: unknown) => void`) are not flagged as shadowing outer variables.
Fixed [#7812](https://github.com/biomejs/biome/issues/7812): Added `ignoreTypeValueShadow` option. When enabled, a value binding that shares its name with a type-only declaration (type alias or interface) is not flagged, since types and values occupy separate namespaces in TypeScript.
- [#9286](https://github.com/biomejs/biome/pull/9286) [`52695cf`](https://github.com/biomejs/biome/commit/52695cf52b3ff42ddfcaef040cfaa00e9a93a4b7) Thanks [@Hugo-Polloli](https://github.com/Hugo-Polloli)! - Fixed [#6316](https://github.com/biomejs/biome/issues/6316): Biome now resolves Svelte `$store` references to the underlying `store` binding in semantic analysis, preventing false `noUndeclaredVariables` diagnostics when the store is declared.
- [#10188](https://github.com/biomejs/biome/pull/10188) [`ae659dd`](https://github.com/biomejs/biome/commit/ae659ddbd317753c4feb5e4d223b9159d272d01b) Thanks [@dyc3](https://github.com/dyc3)! - Added a new nursery rule [`noExcessiveNestedCallbacks`](https://biomejs.dev/linter/rules/no-excessive-nested-callbacks/), which disallows callbacks nested deeper than the configured maximum.
- [#9757](https://github.com/biomejs/biome/pull/9757) [`2c62594`](https://github.com/biomejs/biome/commit/2c62594b84ae62fd5fa130adff917a1bcd8dfddd) Thanks [@dyc3](https://github.com/dyc3)! - Fixed [#9450](https://github.com/biomejs/biome/issues/9450): the HTML formatter now correctly preserves multiline formatting for nested `<template>` elements (e.g. `<template #body>`) when the source has children on separate lines. Previously, the children were collapsed onto a single line.
```diff
<template>
<UModal>
- <template #body> <p>content</p> </template>
+ <template #body>
+ <p>content</p>
+ </template>
</UModal>
</template>
```
- [#10118](https://github.com/biomejs/biome/pull/10118) [`c6edcb4`](https://github.com/biomejs/biome/commit/c6edcb493d42f05179167a8ff3be4549908e9d0b) Thanks [@Netail](https://github.com/Netail)! - Fixed [#10024](https://github.com/biomejs/biome/issues/10024): `biome migrate eslint` correctly migrates `eslint` rules that belong to multiple Biome rules.
## What's Changed
* chore(docs): minor updates for contributing and skills by @dyc3 in https://github.com/biomejs/biome/pull/10098
* fix(semantic): resolve Svelte $store references in semantic model by @Hugo-Polloli in https://github.com/biomejs/biome/pull/9286
* fix(format/html): preserve block indentation if already present in some cases by @dyc3 in https://github.com/biomejs/biome/pull/9757
* fix(md/formatter): nested italic by @tidefield in https://github.com/biomejs/biome/pull/10078
* fix(deps): update @biomejs packages by @renovate[bot] in https://github.com/biomejs/biome/pull/10061
* fix(analyzer): useReadonlyClassProperties detects non-declaration class forms by @jiwon79 in https://github.com/biomejs/biome/pull/10105
* fix(noShadow): make sure it doesn't shadow types by @ematipico in https://github.com/biomejs/biome/pull/10083
* chore: prepare goverance for contractors by @ematipico in https://github.com/biomejs/biome/pull/10087
* feat(analyze/html): add some utilities to speed up lookups of multiple attributes by @dyc3 in https://github.com/biomejs/biome/pull/10109
* fix(lint): resolve false positive in noAssignInExpressions for Svelte {@const} blocks by @Damix48 in https://github.com/biomejs/biome/pull/10079
* fix(analyzer): noDuplicateSelectors false positives with scope at-rule by @jiwon79 in https://github.com/biomejs/biome/pull/10111
* fix(parser): correctly consume closing parenthesis in Svelte each key expression by @Damix48 in https://github.com/biomejs/biome/pull/10080
* feat(lint/js): add `useTestHooksOnTop` by @dyc3 in https://github.com/biomejs/biome/pull/9393
* fix(deps): update dependency prettier to v3.8.3 by @renovate[bot] in https://github.com/biomejs/biome/pull/10062
* fix(parse/js): lex surrogate codepoints in string literal escapes by @dyc3 in https://github.com/biomejs/biome/pull/10112
* fix(analyzer): noUselessEscapeInRegex no longer flags `\\-` as useless by @jiwon79 in https://github.com/biomejs/biome/pull/10116
* feat(css): support corner-shape, superellipse, and squircle by @denizdogan in https://github.com/biomejs/biome/pull/10117
* fix(lsp): inform clients that .biome.json(c) should also be watched by @dyc3 in https://github.com/biomejs/biome/pull/10010
* chore(deps): update rust crate jiff to 0.2.24 by @renovate[bot] in https://github.com/biomejs/biome/pull/10128
* chore(deps): update dependency tombi to v0.9.22 by @renovate[bot] in https://github.com/biomejs/biome/pull/10127
* fix(resolver): resolve typed package main entries by @bmish in https://github.com/biomejs/biome/pull/10125
* chore(deps): update dependency @changesets/cli to v2.31.0 by @renovate[bot] in https://github.com/biomejs/biome/pull/10132
* chore(deps): update dependency dprint to v0.54.0 by @renovate[bot] in https://github.com/biomejs/biome/pull/10133
* fix(deps): update @biomejs packages by @renovate[bot] in https://github.com/biomejs/biome/pull/10130
* chore(deps): update rust crate libc to 0.2.186 by @renovate[bot] in https://github.com/biomejs/biome/pull/10129
* chore(deps): update rust crate mimalloc to 0.1.50 by @renovate[bot] in https://github.com/biomejs/biome/pull/10060
* feat(parse/html/vue): parse v-for better by @dyc3 in https://github.com/biomejs/biome/pull/8620
* feat(parse/html/vue): nested destructuring in v-for by @dyc3 in https://github.com/biomejs/biome/pull/10136
* fix(noCommaOperator): remove vue v-for hack by @dyc3 in https://github.com/biomejs/biome/pull/10137
* fix(10024): eslint generation by @Netail in https://github.com/biomejs/biome/pull/10118
* feat(markdown_formatter): enable formatter ir debugger by @tidefield in https://github.com/biomejs/biome/pull/10144
* fix(lint): detect misleading object returns for built-in class instances by @minseong0324 in https://github.com/biomejs/biome/pull/10141
* fix: svelte missing expression crash by @solithcy in https://github.com/biomejs/biome/pull/10140
* fix(md/fmt/parser): bom, quotes, trimming by @ematipico in https://github.com/biomejs/biome/pull/10040
* fix(vue): recognize embedded bindings in v-for directives by @dyc3 in https://github.com/biomejs/biome/pull/10138
* feat(css_formatter): improve SCSS include argument formatting by @denbezrukov in https://github.com/biomejs/biome/pull/10147
* feat(css_formatter): align SCSS map closing comments by @denbezrukov in https://github.com/biomejs/biome/pull/10149
* fix(organizeImports): doesn't add a blank line between a never-matched group and a matched group by @Conaclos in https://github.com/biomejs/biome/pull/10092
* fix(parser/md): handle vertical tab by @ematipico in https://github.com/biomejs/biome/pull/10146
* fix(lint): noMisleadingReturnType false positive on union with exhausted boolean by @minseong0324 in https://github.com/biomejs/biome/pull/10115
* feat(css_formatter): include SCSS comments by @denbezrukov in https://github.com/biomejs/biome/pull/10150
* refactor(css_formatter): clarify SCSS include closing comments by @denbezrukov in https://github.com/biomejs/biome/pull/10153
* fix(format/css): align selector list indentation with Prettier by @jiwon79 in https://github.com/biomejs/biome/pull/10155
* fix(lint): noMisleadingReturnType false negative on object keyword by @minseong0324 in https://github.com/biomejs/biome/pull/10054
* feat(css_formatter): improve handling of SCSS trailing separator comm… by @denbezrukov in https://github.com/biomejs/biome/pull/10154
* feat(css_formatter): improve handling of SCSS list trailing separator comments by @denbezrukov in https://github.com/biomejs/biome/pull/10156
* feat(css_formatter): improve handling of SCSS expression item line comments by @denbezrukov in https://github.com/biomejs/biome/pull/10158
* feat(css_formatter): improve handling of SCSS `@at-root` selector comments and formatting by @denbezrukov in https://github.com/biomejs/biome/pull/10160
* feat(lint/js): add `noReactStringRefs` by @dyc3 in https://github.com/biomejs/biome/pull/9922
* feat(lint/js): add `useMathMinMax` by @dyc3 in https://github.com/biomejs/biome/pull/9926
* feat(css_formatter): improve handling of SCSS `@if-else` comments and formatting by @denbezrukov in https://github.com/biomejs/biome/pull/10162
* feat(css_formatter): improve handling of SCSS `@while` rule formatting by @denbezrukov in https://github.com/biomejs/biome/pull/10164
* feat(css_formatter): improve handling of SCSS `@for` rule formatting by @denbezrukov in https://github.com/biomejs/biome/pull/10165
* feat(css_formatter): improve handling of SCSS parenthesized binary expressions formatting by @denbezrukov in https://github.com/biomejs/biome/pull/10167
* fix(assist): useSortedAttributes no longer corrupts nested JSX attributes by @jiwon79 in https://github.com/biomejs/biome/pull/10163
* feat(css_formatter): improve handling of SCSS `@each` rule formatting by @denbezrukov in https://github.com/biomejs/biome/pull/10169
* fix(markdown_parser): blockquote list splitting and tightness by @jfmcdowell in https://github.com/biomejs/biome/pull/9990
* chore(markdown_parser): remove unused lexer contexts by @jfmcdowell in https://github.com/biomejs/biome/pull/10173
* fix(parse/html): relex keywords as text in text contexts by @dyc3 in https://github.com/biomejs/biome/pull/10178
* feat(css_formatter): improve handling of SCSS list with trailing separator by @denbezrukov in https://github.com/biomejs/biome/pull/10172
* fix(noThisInStatic): don't report `new this()` by @dyc3 in https://github.com/biomejs/biome/pull/10176
* feat(css): support SCSS interpolated values by @denbezrukov in https://github.com/biomejs/biome/pull/10171
* feat(css_formatter): improve handling of SCSS `@use` and `@forward` rule formatting by @denbezrukov in https://github.com/biomejs/biome/pull/10180
* fix(markdown_parser): stop nested lazy lists from swallowing fences by @jfmcdowell in https://github.com/biomejs/biome/pull/10170
* feat(css): add support for SCSS media query interpolation by @denbezrukov in https://github.com/biomejs/biome/pull/10181
* feat(css_formatter): improve handling of spacing for SCSS unary expressions and functions by @denbezrukov in https://github.com/biomejs/biome/pull/10182
* feat(lint/js): add `noExcessiveNestedCallbacks` by @dyc3 in https://github.com/biomejs/biome/pull/10188
* fix(markdown_parser): keep lazy link references as text by @jfmcdowell in https://github.com/biomejs/biome/pull/10189
* fix(lint/a11y/noStaticElementInteractions): exclude custom elements by @guney in https://github.com/biomejs/biome/pull/10191
* fix(parse/html): improve the diagnostics when void elements have a closing tag by @dyc3 in https://github.com/biomejs/biome/pull/10157
* ci: release by @github-actions[bot] in https://github.com/biomejs/biome/pull/10100
## New Contributors
* @Hugo-Polloli made their first contribution in https://github.com/biomejs/biome/pull/9286
* @Damix48 made their first contribution in https://github.com/biomejs/biome/pull/10079
* @denizdogan made their first contribution in https://github.com/biomejs/biome/pull/10117
* @solithcy made their first contribution in https://github.com/biomejs/biome/pull/10140
* @guney made their first contribution in https://github.com/biomejs/biome/pull/10191
**Full Changelog**: https://github.com/biomejs/biome/compare/@biomejs/biome@2.4.13...@biomejs/biome@2.4.14