Impact Score: 5/10
Biome CLI v2.2.5
Source available โ automated, not human-reviewed
Component: @biomejs/biome ยท Channel: stable. Automated analysis, not a compatibility certification. How this works.
Analysis updated: 2026-11-01.
โก Executive Summary (TL;DR)
Biome @biomejs/[email protected]. Source highlight: Fixed #6432: `useImportExtensions` now works correctly with aliased paths.
Who Does This Impact? (Role-Based Analysis)
๐ป Software Engineers & Devs
Check the source notes against the package and APIs you use before upgrading.
๐ Product & Engineering Leads
Use the documented changes to assess relevance to your product; release frequency alone is not a quality measure.
โ๏ธ DevOps & Security
Verify the target version, runtime requirements and rollback procedure in the official documentation.
โจ New Features & Capabilities (6)
- Added `style` and `requireForObjectLiteral` options to the lint rule `useConsistentArrowReturn`.
- Added extra references to external rules to improve migration for the following rules: `noUselessFragments` & `noNestedComponentDefinitions`
- Added the rule `noVueDuplicateKeys`, which prevents duplicate keys in Vue component definitions.
- Added nursery rule `noUnusedExpressions` to flag expressions used as a statement that is neither an assignment nor a function call.
- chore: add spanish readme translation
- feat(yaml_parser): parse block scalars
โก Performance & Enhancements (2)
- docs: improve noDuplicateDependencies
- perf: don't allocate when pushing or retrieving globals
๐ง Bug Fixes & Patches (6)
- Fixed #6432: `useImportExtensions` now works correctly with aliased paths.
- Fixed #6648, where Biome's `noUselessFragments` contained inconsistencies with ESLint for fragments only containing text.
- Fixed #6893: The `useExhaustiveDependencies` rule now correctly adds a dependency that is captured in a shorthand object member. For example:
- Added a new lint rule `noReactForwardRef`, which detects usages of `forwardRef` that is no longer needed and deprecated in React 19.
- Added new nursery rule `noDeprecatedImports` to flag imports of deprecated symbols.
- Fixed 7574. The diagnostic message for the rule `useSolidForComponent` now correctly emphasizes `
๐ View Raw Release Notes (Original Developer Log)
## 2.2.5
### Patch Changes
- [#7597](https://github.com/biomejs/biome/pull/7597) [`5c3d542`](https://github.com/biomejs/biome/commit/5c3d542e65fee652dc4e52f3ec2de0441c3f3aec) Thanks [@arendjr](https://github.com/arendjr)! - Fixed [#6432](https://github.com/biomejs/biome/issues/6432): [`useImportExtensions`](https://biomejs.dev/linter/rules/use-import-extensions/) now works correctly with aliased paths.
- [#7269](https://github.com/biomejs/biome/pull/7269) [`f18dac1`](https://github.com/biomejs/biome/commit/f18dac1d662c426d036894a59755eb26f5668aaf) Thanks [@CDGardner](https://github.com/CDGardner)! - Fixed [#6648](https://github.com/biomejs/biome/issues/6648), where Biome's `noUselessFragments` contained inconsistencies with ESLint for fragments only containing text.
Previously, Biome would report that fragments with only text were unnecessary under the `noUselessFragments` rule. Further analysis of ESLint's behavior towards these cases revealed that text-only fragments (`<>A</a>`, `<React.Fragment>B</React.Fragment>`, `<RenamedFragment>B</RenamedFragment>`) would not have `noUselessFragments` emitted for them.
On the Biome side, instances such as these would emit `noUselessFragments`, and applying the suggested fix would turn the text content into a proper JS string.
```js
// Ended up as: - const t = "Text"
const t = <>Text</>
// Ended up as: - const e = t ? "Option A" : "Option B"
const e = t ? <>Option A</> : <>Option B</>
/* Ended up as:
function someFunc() {
return "Content desired to be a multi-line block of text."
}
*/
function someFunc() {
return <>
Content desired to be a multi-line
block of text.
<>
}
```
The proposed update was to align Biome's reaction to this rule with ESLint's; the aforementioned examples will now be supported from Biome's perspective, thus valid use of fragments.
```js
// These instances are now valid and won't be called out by noUselessFragments.
const t = <>Text</>
const e = t ? <>Option A</> : <>Option B</>
function someFunc() {
return <>
Content desired to be a multi-line
block of text.
<>
}
```
- [#7498](https://github.com/biomejs/biome/pull/7498) [`002cded`](https://github.com/biomejs/biome/commit/002cded543e6aa5f5cf55f48312f40c83975a22f) Thanks [@siketyan](https://github.com/siketyan)! - Fixed [#6893](https://github.com/biomejs/biome/issues/6893): The [`useExhaustiveDependencies`](https://biomejs.dev/linter/rules/use-exhaustive-dependencies/) rule now correctly adds a dependency that is captured in a shorthand object member. For example:
```jsx
useEffect(() => {
console.log({ firstId, secondId });
}, []);
```
is now correctly fixed to:
```jsx
useEffect(() => {
console.log({ firstId, secondId });
}, [firstId, secondId]);
```
- [#7509](https://github.com/biomejs/biome/pull/7509) [`1b61631`](https://github.com/biomejs/biome/commit/1b61631c63f161fa8163365571825c99aed3eaae) Thanks [@siketyan](https://github.com/siketyan)! - Added a new lint rule [`noReactForwardRef`](https://biomejs.dev/linter/rules/no-react-forward-ref/), which detects usages of `forwardRef` that is no longer needed and deprecated in React 19.
For example:
```jsx
export const Component = forwardRef(function Component(props, ref) {
return <div ref={ref} />;
});
```
will be fixed to:
```jsx
export const Component = function Component({ ref, ...props }) {
return <div ref={ref} />;
};
```
Note that the rule provides an unsafe fix, which may break the code. Don't forget to review the code after applying the fix.
- [#7520](https://github.com/biomejs/biome/pull/7520) [`3f06e19`](https://github.com/biomejs/biome/commit/3f06e19c6eb8476ad9de4e3dac00c50a2d6f0aed) Thanks [@arendjr](https://github.com/arendjr)! - Added new nursery rule [`noDeprecatedImports`](https://biomejs.dev/linter/rules/no-deprecated-imports/) to flag imports of deprecated symbols.
#### Invalid example
```js
// foo.js
import { oldUtility } from "./utils.js";
```
```js
// utils.js
/**
* @deprecated
*/
export function oldUtility() {}
```
#### Valid examples
```js
// foo.js
import { newUtility, oldUtility } from "./utils.js";
```
```js
// utils.js
export function newUtility() {}
// @deprecated (this is not a JSDoc comment)
export function oldUtility() {}
```
- [#7457](https://github.com/biomejs/biome/pull/7457) [`9637f93`](https://github.com/biomejs/biome/commit/9637f9308fe39f7e94d42419cd430cc2a55d5473) Thanks [@kedevked](https://github.com/kedevked)! - Added `style` and `requireForObjectLiteral` options to the lint rule [`useConsistentArrowReturn`](https://biomejs.dev/linter/rules/use-consistent-arrow-return/).
This rule enforces a consistent return style for arrow functions. It can be configured with the following options:
- `style`: (default: `asNeeded`)
- `always`: enforces that arrow functions always have a block body.
- `never`: enforces that arrow functions never have a block body, when possible.
- `asNeeded`: enforces that arrow functions have a block body only when necessary (e.g. for object literals).
#### `style: "always"`
Invalid:
```js
const f = () => 1;
```
Valid:
```js
const f = () => {
return 1;
};
```
#### `style: "never"`
Invalid:
```js
const f = () => {
return 1;
};
```
Valid:
```js
const f = () => 1;
```
#### `style: "asNeeded"`
Invalid:
```js
const f = () => {
return 1;
};
```
Valid:
```js
const f = () => 1;
```
#### `style: "asNeeded"` and `requireForObjectLiteral: true`
Valid:
```js
const f = () => {
return { a: 1 };
};
```
- [#7510](https://github.com/biomejs/biome/pull/7510) [`527cec2`](https://github.com/biomejs/biome/commit/527cec2ca10df23754e9958d17baefca6a559154) Thanks [@rriski](https://github.com/rriski)! - Implements [#7339](https://github.com/biomejs/biome/discussions/7339). GritQL patterns can now use native Biome AST nodes using their `PascalCase` names, in addition to the existing TreeSitter-compatible `snake_case` names.
```grit
engine biome(1.0)
language js(typescript,jsx)
or {
// TreeSitter-compatible pattern
if_statement(),
// Native Biome AST node pattern
JsIfStatement()
} as $stmt where {
register_diagnostic(
span=$stmt,
message="Found an if statement"
)
}
```
- [#7574](https://github.com/biomejs/biome/pull/7574) [`47907e7`](https://github.com/biomejs/biome/commit/47907e7d9badbe0c41c6a23bdd962676de216db0) Thanks [@kedevked](https://github.com/kedevked)! - Fixed [7574](https://github.com/biomejs/biome/pull/7574). The diagnostic message for the rule `useSolidForComponent` now correctly emphasizes `<For />` and provides a working hyperlink to the Solid documentation.
- [#7497](https://github.com/biomejs/biome/pull/7497) [`bd70f40`](https://github.com/biomejs/biome/commit/bd70f40cb933c1df0c171a9048b62da432093308) Thanks [@siketyan](https://github.com/siketyan)! - Fixed [#7320](https://github.com/biomejs/biome/issues/7320): The [`useConsistentCurlyBraces`](https://biomejs.dev/linter/rules/use-consistent-curly-braces/) rule now correctly detects a string literal including `"` inside a JSX attribute value.
- [#7522](https://github.com/biomejs/biome/pull/7522) [`1af9931`](https://github.com/biomejs/biome/commit/1af993134ba2d9158f6824c2f002c90133c0e3f4) Thanks [@Netail](https://github.com/Netail)! - Added extra references to external rules to improve migration for the following rules: `noUselessFragments` & `noNestedComponentDefinitions`
- [#7597](https://github.com/biomejs/biome/pull/7597) [`5c3d542`](https://github.com/biomejs/biome/commit/5c3d542e65fee652dc4e52f3ec2de0441c3f3aec) Thanks [@arendjr](https://github.com/arendjr)! - Fixed an issue where `package.json` manifests would not be correctly discovered
when evaluating files in the same directory.
- [#7565](https://github.com/biomejs/biome/pull/7565) [`38d2098`](https://github.com/biomejs/biome/commit/38d2098bb3a81adaf73a19807c1e62d352405764) Thanks [@siketyan](https://github.com/siketyan)! - The resolver can now correctly resolve `.ts`, `.tsx`, `.d.ts`, `.js` files by `.js` extension if exists, based on [the file extension substitution in TypeScript](https://www.typescriptlang.org/docs/handbook/modules/reference.html#file-extension-substitution).
For example, the linter can now detect the floating promise in the following situation, if you have enabled the `noFloatingPromises` rule.
**`foo.ts`**
```ts
export async function doSomething(): Promise<void> {}
```
**`bar.ts`**
```ts
import { doSomething } from "./foo.js"; // doesn't exist actually, but it is resolved to `foo.ts`
doSomething(); // floating promise!
```
- [#7542](https://github.com/biomejs/biome/pull/7542) [`cadad2c`](https://github.com/biomejs/biome/commit/cadad2cadbd3852873cbd3f721c26ae7ceb3f39a) Thanks [@mdevils](https://github.com/mdevils)! - Added the rule [`noVueDuplicateKeys`](https://biomejs.dev/linter/rules/no-vue-duplicate-keys/), which prevents duplicate keys in Vue component definitions.
This rule prevents the use of duplicate keys across different Vue component options such as `props`, `data`, `computed`, `methods`, and `setup`. Even if keys don't conflict in the script tag, they may cause issues in the template since Vue allows direct access to these keys.
##### Invalid examples
```vue
<script>
export default {
props: ["foo"],
data() {
return {
foo: "bar",
};
},
};
</script>
```
```vue
<script>
export default {
data() {
return {
message: "hello",
};
},
methods: {
message() {
console.log("duplicate key");
},
},
};
</script>
```
```vue
<script>
export default {
computed: {
count() {
return this.value * 2;
},
},
methods: {
count() {
this.value++;
},
},
};
</script>
```
##### Valid examples
```vue
<script>
export default {
props: ["foo"],
data() {
return {
bar: "baz",
};
},
methods: {
handleClick() {
console.log("unique key");
},
},
};
</script>
```
```vue
<script>
export default {
computed: {
displayMessage() {
return this.message.toUpperCase();
},
},
methods: {
clearMessage() {
this.message = "";
},
},
};
</script>
```
- [#7546](https://github.com/biomejs/biome/pull/7546) [`a683acc`](https://github.com/biomejs/biome/commit/a683acc30bf85d1337760aa1500eb892ebc8e0ac) Thanks [@siketyan](https://github.com/siketyan)! - Internal data for Unicode strings have been updated to Unicode 17.0.
- [#7497](https://github.com/biomejs/biome/pull/7497) [`bd70f40`](https://github.com/biomejs/biome/commit/bd70f40cb933c1df0c171a9048b62da432093308) Thanks [@siketyan](https://github.com/siketyan)! - Fixed [#7256](https://github.com/biomejs/biome/issues/7256): The [`useConsistentCurlyBraces`](https://biomejs.dev/linter/rules/use-consistent-curly-braces/) rule now correctly ignores a string literal with braces that contains only whitespaces. Previously, literals that contains single whitespace were only allowed.
- [#7565](https://github.com/biomejs/biome/pull/7565) [`38d2098`](https://github.com/biomejs/biome/commit/38d2098bb3a81adaf73a19807c1e62d352405764) Thanks [@siketyan](https://github.com/siketyan)! - The [`useImportExtensions`](https://biomejs.dev/linter/rules/use-import-extensions/) rule now correctly detects imports with an invalid extension. For example, importing `.ts` file with `.js` extension is flagged by default. If you are using TypeScript with neither the `allowImportingTsExtensions` option nor the `rewriteRelativeImportExtensions` option, it's recommended to turn on the `forceJsExtensions` option of the rule.
- [#7581](https://github.com/biomejs/biome/pull/7581) [`8653921`](https://github.com/biomejs/biome/commit/86539215dde0c29eae0a6975b442637048a8673b) Thanks [@lucasweng](https://github.com/lucasweng)! - Fixed [#7470](https://github.com/biomejs/biome/issues/7470): solved a false positive for [`noDuplicateProperties`](https://biomejs.dev/linter/rules/no-duplicate-properties/). Previously, declarations in `@container` and `@starting-style` at-rules were incorrectly flagged as duplicates of identical declarations at the root selector.
For example, the linter no longer flags the `display` declaration in `@container` or the `opacity` declaration in `@starting-style`.
```css
a {
display: block;
@container (min-width: 600px) {
display: none;
}
}
[popover]:popover-open {
opacity: 1;
@starting-style {
opacity: 0;
}
}
```
- [#7529](https://github.com/biomejs/biome/pull/7529) [`fea905f`](https://github.com/biomejs/biome/commit/fea905f0af9fc992a17fe1dcdbc3e0e63fae9d65) Thanks [@qraqras](https://github.com/qraqras)! - Fixed [#7517](https://github.com/biomejs/biome/issues/7517): the [`useOptionalChain`](https://biomejs.dev/linter/rules/use-optional-chain/) rule no longer suggests changes for typeof checks on global objects.
```ts
// ok
typeof window !== "undefined" && window.location;
```
- [#7476](https://github.com/biomejs/biome/pull/7476) [`c015765`](https://github.com/biomejs/biome/commit/c015765af2defb042285d96588fcb5f531eb8b6f) Thanks [@ematipico](https://github.com/ematipico)! - Fixed a bug where the suppression action for `noPositiveTabindex` didn't place the suppression comment in the correct position.
- [#7511](https://github.com/biomejs/biome/pull/7511) [`a0039fd`](https://github.com/biomejs/biome/commit/a0039fd5457d0df18242feed5d21ff868ceb0693) Thanks [@arendjr](https://github.com/arendjr)! - Added nursery rule [`noUnusedExpressions`](https://biomejs.dev/linter/rules/no-unused-expressions/) to flag expressions used as a statement that is neither an assignment nor a function call.
#### Invalid examples
```js
f; // intended to call `f()` instead
```
```js
function foo() {
0; // intended to `return 0` instead
}
```
#### Valid examples
```js
f();
```
```js
function foo() {
return 0;
}
```
- [#7564](https://github.com/biomejs/biome/pull/7564) [`40e515f`](https://github.com/biomejs/biome/commit/40e515f73275ad0023ec03e95551a3bbb79b84a1) Thanks [@turbocrime](https://github.com/turbocrime)! - Fixed [#6617](https://github.com/biomejs/biome/issues/6617): improved [`useIterableCallbackReturn`](https://biomejs.dev/linter/rules/use-iterable-callback-return/) to correctly handle arrow functions with a single-expression `void` body.
Now the following code doesn't trigger the rule anymore:
```js
[].forEach(() => void null);
```
## What's Changed
* chore: add spanish readme translation by @Terraciano in https://github.com/biomejs/biome/pull/7465
* feat(yaml_parser): parse block scalars by @l0ngvh in https://github.com/biomejs/biome/pull/7417
* docs: improve noDuplicateDependencies by @Netail in https://github.com/biomejs/biome/pull/7471
* chore: repair changelog by @ematipico in https://github.com/biomejs/biome/pull/7477
* fix(noPositiveTabindex): suppression action by @ematipico in https://github.com/biomejs/biome/pull/7476
* fix(lint/useConsistentCurlyBraces): adjust condition to allow removing the braces by @siketyan in https://github.com/biomejs/biome/pull/7497
* fix(lint/useExhaustiveDependencies): correctly fix the dependency list from a shorthand object member by @siketyan in https://github.com/biomejs/biome/pull/7498
* chore(deps): update rust:1.89.0-bullseye docker digest to 8f72d97 by @renovate[bot] in https://github.com/biomejs/biome/pull/7506
* chore(deps): update rust:1.89.0-bookworm docker digest to 948f9b0 by @renovate[bot] in https://github.com/biomejs/biome/pull/7505
* chore(deps): update github-actions by @renovate[bot] in https://github.com/biomejs/biome/pull/7503
* chore(deps): update docker/dockerfile:1 docker digest to dabfc09 by @renovate[bot] in https://github.com/biomejs/biome/pull/7502
* chore(deps): update dependency @changesets/cli to v2.29.7 by @renovate[bot] in https://github.com/biomejs/biome/pull/7507
* chore(deps): update dependency dprint to v0.50.2 by @renovate[bot] in https://github.com/biomejs/biome/pull/7508
* feat(biome-js-analyze): class member references service by @vladimir-ivanov in https://github.com/biomejs/biome/pull/7428
* feat(grit): allow matching native Biome AST nodes by @rriski in https://github.com/biomejs/biome/pull/7510
* feat(linter): implement `noUnusedExpressions` by @arendjr in https://github.com/biomejs/biome/pull/7511
* feat(linter): implement `noDeprecatedImports` by @arendjr in https://github.com/biomejs/biome/pull/7520
* chore: expose preferred indentation by @arendjr in https://github.com/biomejs/biome/pull/7540
* chore: update Unicode table for Unicode 17 by @siketyan in https://github.com/biomejs/biome/pull/7546
* ci: don't run the autofix workflow on an autofix commit by @siketyan in https://github.com/biomejs/biome/pull/7550
* test: fix failing watcher tests on macOS by @siketyan in https://github.com/biomejs/biome/pull/7549
* chore(deps): update github-actions by @renovate[bot] in https://github.com/biomejs/biome/pull/7554
* chore(deps): update rust crate anyhow to 1.0.100 by @renovate[bot] in https://github.com/biomejs/biome/pull/7555
* chore(deps): update rust crate serde_json to 1.0.145 by @renovate[bot] in https://github.com/biomejs/biome/pull/7558
* chore(deps): update rust crate tracing-subscriber to 0.3.20 by @renovate[bot] in https://github.com/biomejs/biome/pull/7560
* chore(deps): update rust crate url to 2.5.7 by @renovate[bot] in https://github.com/biomejs/biome/pull/7561
* chore(deps): update rust crate serde to 1.0.226 by @renovate[bot] in https://github.com/biomejs/biome/pull/7557
* chore(deps): update dependency @types/node to v22.18.6 by @renovate[bot] in https://github.com/biomejs/biome/pull/7563
* chore: add convex to bronze sponsors by @ematipico in https://github.com/biomejs/biome/pull/7566
* feat(resolver): resolve extension alias by @siketyan in https://github.com/biomejs/biome/pull/7565
* feat(lint): add `noReactForwardRef` rule by @siketyan in https://github.com/biomejs/biome/pull/7509
* perf: don't allocate when pushing or retrieving globals by @arendjr in https://github.com/biomejs/biome/pull/7569
* feat: add useConsistentArrowReturn options by @kedevked in https://github.com/biomejs/biome/pull/7457
* fix: set correct string for diagnostic by @kedevked in https://github.com/biomejs/biome/pull/7574
* feat(lint): implement `noVueDuplicateKeys` rule by @mdevils in https://github.com/biomejs/biome/pull/7542
* chore: add edition 2024 to rustfmt.toml by @turbocrime in https://github.com/biomejs/biome/pull/7591
* fix(lint/suspicious/useIterableCallbackReturn): single-expression void arrow function by @turbocrime in https://github.com/biomejs/biome/pull/7564
* fix(noDuplicateProperties): false positives in `@container` and `@starting-style` at-rules by @lucasweng in https://github.com/biomejs/biome/pull/7581
* fix(lint/complexity/noUselessFragments): address inconsistencies against ESLint behavior with fragments only containing text. by @CDGardner in https://github.com/biomejs/biome/pull/7269
* fix(linter): fix aliased paths in `useImportExtensions` by @arendjr in https://github.com/biomejs/biome/pull/7597
* feat(biome-js-analyze): add is_meaningful_read to semantic class reads by @vladimir-ivanov in https://github.com/biomejs/biome/pull/7543
* fix(lint/useOptionalChain): fix incorrect suggestions for `typeof` checks on global objects by @qraqras in https://github.com/biomejs/biome/pull/7529
* chore(deps): update github-actions by @renovate[bot] in https://github.com/biomejs/biome/pull/7611
* docs: extra rule sources by @Netail in https://github.com/biomejs/biome/pull/7522
* chore(deps): update rust crate libc to 0.2.176 by @renovate[bot] in https://github.com/biomejs/biome/pull/7612
* docs: fix correct graphql references by @Netail in https://github.com/biomejs/biome/pull/7623
* ci: release by @github-actions[bot] in https://github.com/biomejs/biome/pull/7478
## New Contributors
* @Terraciano made their first contribution in https://github.com/biomejs/biome/pull/7465
* @turbocrime made their first contribution in https://github.com/biomejs/biome/pull/7591
* @CDGardner made their first contribution in https://github.com/biomejs/biome/pull/7269
**Full Changelog**: https://github.com/biomejs/biome/compare/@biomejs/[email protected]...@biomejs/[email protected]