Impact Score: 5/10
Biome CLI v2.4.13
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: Added the nursery rule `noUnnecessaryTemplateExpression`, which disallows template literals that only contain string literal expressions. These can be replaced with a simpler string literal.
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.
๐ง Bug Fixes & Patches (6)
- Added the nursery rule `noUnnecessaryTemplateExpression`, which disallows template literals that only contain string literal expressions. These can be replaced with a simpler string literal.
- Fixed #9810: `noMisleadingReturnType` no longer reports false positives on a getter with a matching setter in the same namespace.
- Fixed #10034: `noUselessEscapeInRegex` no longer flags escapes of `ClassSetReservedPunctuator` characters (`&`, `!`, `#`, `%`, `,`, `:`, `;`, `<`, `=`, `>`, `@`, `` ` ``, `~`) inside `v`-flag character classes as useless. These characters are reserved as individual code points in `v`-mode, so the escape is required.
- Added extra rule sources from ESLint CSS. `biome migrate eslint` should do a bit better detecting rules in your eslint configurations.
- Fixed #10032: useIframeSandbox now flags if there's no initializer value.
- Added the new nursery rule `useDomNodeTextContent`, which prefers `textContent` over `innerText` for DOM node text access and destructuring.
๐ View Raw Release Notes (Original Developer Log)
## 2.4.13
### Patch Changes
- [#9969](https://github.com/biomejs/biome/pull/9969) [`c5eb92b`](https://github.com/biomejs/biome/commit/c5eb92ba288ba13698b37e43617eed5339ad7007) Thanks [@officialasishkumar](https://github.com/officialasishkumar)! - Added the nursery rule [`noUnnecessaryTemplateExpression`](https://biomejs.dev/linter/rules/no-unnecessary-template-expression/), which disallows template literals that only contain string literal expressions. These can be replaced with a simpler string literal.
For example, the following code triggers the rule:
```js
const a = `${"hello"}`; // can be 'hello'
const b = `${"prefix"}_suffix`; // can be 'prefix_suffix'
const c = `${"a"}${"b"}`; // can be 'ab'
```
- [#10037](https://github.com/biomejs/biome/pull/10037) [`f785e8c`](https://github.com/biomejs/biome/commit/f785e8c604879dd3dd17b53aae0e2feef4026c82) Thanks [@minseong0324](https://github.com/minseong0324)! - Fixed [#9810](https://github.com/biomejs/biome/issues/9810): [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) no longer reports false positives on a getter with a matching setter in the same namespace.
```ts
class Store {
get status(): string {
if (Math.random() > 0.5) return "loading";
return "idle";
}
set status(v: string) {}
}
```
- [#10084](https://github.com/biomejs/biome/pull/10084) [`5e2f90c`](https://github.com/biomejs/biome/commit/5e2f90c045b4bd7006c96a9df123303d6c24e1d8) Thanks [@jiwon79](https://github.com/jiwon79)! - Fixed [#10034](https://github.com/biomejs/biome/issues/10034): [`noUselessEscapeInRegex`](https://biomejs.dev/linter/rules/no-useless-escape-in-regex/) no longer flags escapes of `ClassSetReservedPunctuator` characters (`&`, `!`, `#`, `%`, `,`, `:`, `;`, `<`, `=`, `>`, `@`, `` ` ``, `~`) inside `v`-flag character classes as useless. These characters are reserved as individual code points in `v`-mode, so the escape is required.
The following pattern is now considered valid:
```js
/[a-z\&]/v;
```
- [#10063](https://github.com/biomejs/biome/pull/10063) [`c9ffa16`](https://github.com/biomejs/biome/commit/c9ffa16491c9f8c003eb945796911564fc981b71) Thanks [@Netail](https://github.com/Netail)! - Added extra rule sources from ESLint CSS. `biome migrate eslint` should do a bit better detecting rules in your eslint configurations.
- [#10035](https://github.com/biomejs/biome/pull/10035) [`946b50e`](https://github.com/biomejs/biome/commit/946b50e173e8c89a2d2b303cb159a05cbd068767) Thanks [@Netail](https://github.com/Netail)! - Fixed [#10032](https://github.com/biomejs/biome/issues/10032): [useIframeSandbox](https://biomejs.dev/linter/rules/use-iframe-sandbox/) now flags if there's no initializer value.
- [#9865](https://github.com/biomejs/biome/pull/9865) [`68fb8d4`](https://github.com/biomejs/biome/commit/68fb8d468c01732c4283a336eca42223983df09b) Thanks [@dyc3](https://github.com/dyc3)! - Added the new nursery rule [`useDomNodeTextContent`](https://biomejs.dev/linter/rules/use-dom-node-text-content/), which prefers `textContent` over `innerText` for DOM node text access and destructuring.
For example, the following snippet triggers the rule:
```js
const foo = node.innerText;
```
- [#10023](https://github.com/biomejs/biome/pull/10023) [`bd1e74f`](https://github.com/biomejs/biome/commit/bd1e74fd80b0cadafd091513950275e0ff75d80f) Thanks [@ematipico](https://github.com/ematipico)! - Added a new nursery rule [`noReactNativeDeepImports`](https://biomejs.dev/linter/rules/no-react-native-deep-imports/) that disallows deep imports from the `react-native` package. Internal paths like `react-native/Libraries/...` are not part of the public API and may change between versions.
For example, the following code triggers the rule:
```js
import View from "react-native/Libraries/Components/View/View";
```
- [#9885](https://github.com/biomejs/biome/pull/9885) [`3dce737`](https://github.com/biomejs/biome/commit/3dce737e5050cfda7d2b9be8f809aee417f01196) Thanks [@dyc3](https://github.com/dyc3)! - Added a new nursery rule [`useDomQuerySelector`](https://biomejs.dev/linter/rules/use-dom-query-selector/) that prefers `querySelector()` and `querySelectorAll()` over older DOM query methods such as `getElementById()` and `getElementsByClassName()`.
- [#9995](https://github.com/biomejs/biome/pull/9995) [`4da9caf`](https://github.com/biomejs/biome/commit/4da9caf8281473177fac3332610c710b31e89546) Thanks [@siketyan](https://github.com/siketyan)! - Fixed [#9994](https://github.com/biomejs/biome/issues/9994): Biome now parses nested CSS rules correctly when declarations follow them inside embedded snippets.
- [#10009](https://github.com/biomejs/biome/pull/10009) [`b41cc5a`](https://github.com/biomejs/biome/commit/b41cc5a58c74fd6b237352c1772e64e74fcc7546) Thanks [@Jayllyz](https://github.com/Jayllyz)! - Fixed [#10004](https://github.com/biomejs/biome/issues/10004): [`noComponentHookFactories`](https://biomejs.dev/linter/rules/no-component-hook-factories/) no longer reports false positives for object methods and class methods.
- [#9988](https://github.com/biomejs/biome/pull/9988) [`eabf54a`](https://github.com/biomejs/biome/commit/eabf54ad03c6c1d63753a641c8ad1ef385e42d2b) Thanks [@Netail](https://github.com/Netail)! - Tweaked the diagnostics range for [useAltText](https://biomejs.dev/linter/rules/use-alt-text), [useButtonType](https://biomejs.dev/linter/rules/use-button-type), [useHtmlLang](https://biomejs.dev/linter/rules/use-html-lang), [useIframeTitle](https://biomejs.dev/linter/rules/use-iframe-title), [useValidAriaRole](https://biomejs.dev/linter/rules/use-valid-aria-role) & [useIfameSandbox](https://biomejs.dev/linter/rules/use-iframe-sandbox) to report on the opening tag instead of the full tag.
- [#10043](https://github.com/biomejs/biome/pull/10043) [`fc65902`](https://github.com/biomejs/biome/commit/fc65902f17cd548ae38ff916462291b51a32e356) Thanks [@mujpao](https://github.com/mujpao)! - Fixed [#10003](https://github.com/biomejs/biome/issues/10003): Biome no longer panics when parsing Svelte files containing `{#}`.
- [#9815](https://github.com/biomejs/biome/pull/9815) [`5cc83b1`](https://github.com/biomejs/biome/commit/5cc83b177830bc21dc4d6e18343f58eca4ee0de6) Thanks [@dyc3](https://github.com/dyc3)! - Added the new nursery rule [`noLoopFunc`](https://biomejs.dev/linter/rules/no-loop-func/). When enabled, it warns when a function declared inside a loop captures outer variables that can change across iterations.
- [#9702](https://github.com/biomejs/biome/pull/9702) [`ef470ba`](https://github.com/biomejs/biome/commit/ef470ba2db119aa52c24f918bcef451cf2770ccb) Thanks [@ryan-m-walker](https://github.com/ryan-m-walker)! - Added the nursery rule [`useRegexpTest`](https://biomejs.dev/linter/rules/use-regexp-test/) that enforces `RegExp.prototype.test()` over `String.prototype.match()` and `RegExp.prototype.exec()` in boolean contexts. `test()` returns a boolean directly, avoiding unnecessary computation of match results.
**Invalid**
```js
if ("hello world".match(/hello/)) {
}
```
**Valid**
```js
if (/hello/.test("hello world")) {
}
```
- [#9743](https://github.com/biomejs/biome/pull/9743) [`245307d`](https://github.com/biomejs/biome/commit/245307dc4ee7af87f62873162107b608084d40f3) Thanks [@leetdavid](https://github.com/leetdavid)! - Fixed [#2245](https://github.com/biomejs/biome/issues/2245): Svelte `<script>` tag language detection when the `generics` attribute contains `>` characters (e.g., `<script lang="ts" generics="T extends Record<string, unknown>">`). Biome now correctly recognizes TypeScript in such script blocks.
- [#10046](https://github.com/biomejs/biome/pull/10046) [`0707de7`](https://github.com/biomejs/biome/commit/0707de7d72f0c5e14f4d5c91524ad2a9d1f50b34) Thanks [@Conaclos](https://github.com/Conaclos)! - Fixed [#10038](https://github.com/biomejs/biome/issues/10038): [`organizeImports`](https://biomejs.dev/assist/actions/organize-imports/) now sorts imports in TypeScript modules and declaration files.
```diff
declare module "mymodule" {
- import type { B } from "b";
import type { A } from "a";
+ import type { B } from "b";
}
```
- [#10012](https://github.com/biomejs/biome/pull/10012) [`94ccca9`](https://github.com/biomejs/biome/commit/94ccca96800e73732b3f26d7eb21a5e3e025e51e) Thanks [@ematipico](https://github.com/ematipico)! - Added the nursery rule [`noReactNativeLiteralColors`](https://biomejs.dev/linter/rules/no-react-native-literal-colors/), which disallows color literals inside React Native styles.
The rule belongs to the `reactNative` domain. It reports properties whose name contains `color` and whose value is a string literal when they appear inside a `StyleSheet.create(...)` call or inside a JSX attribute whose name contains `style`.
```jsx
// Invalid
const Hello = () => <Text style={{ backgroundColor: "#FFFFFF" }}>hi</Text>;
const styles = StyleSheet.create({
text: { color: "red" },
});
```
```jsx
// Valid
const red = "#f00";
const styles = StyleSheet.create({
text: { color: red },
});
```
- [#10005](https://github.com/biomejs/biome/pull/10005) [`131019e`](https://github.com/biomejs/biome/commit/131019e161b69fd755742ba509b1c51fcb2af183) Thanks [@ematipico](https://github.com/ematipico)! - Added the nursery rule [`noReactNativeRawText`](https://biomejs.dev/linter/rules/no-react-native-raw-text/), which disallows raw text outside of `<Text>` components in React Native.
The rule belongs to the new `reactNative` domain.
```jsx
// Invalid
<View>some text</View>
<View>{'some text'}</View>
```
```jsx
// Valid
<View>
<Text>some text</Text>
</View>
```
Additional components can be allowlisted through the `skip` option:
```json
{
"options": {
"skip": ["Title"]
}
}
```
- [#9911](https://github.com/biomejs/biome/pull/9911) [`1603f78`](https://github.com/biomejs/biome/commit/1603f7893c9e249439fc3c22c02ec1a363cc54b9) Thanks [@Netail](https://github.com/Netail)! - Added the nursery rule [`noJsxLeakedDollar`](https://biomejs.dev/linter/rules/no-jsx-leaked-dollar), which flags text nodes with a trailing `$` if the next sibling node is a JSX expression. This could be an unintentional mistake, resulting in a '$' being rendered as text in the output.
**Invalid**:
```jsx
function MyComponent({ user }) {
return <div>Hello ${user.name}</div>;
}
```
- [#9999](https://github.com/biomejs/biome/pull/9999) [`f42405f`](https://github.com/biomejs/biome/commit/f42405fca77302bbbca573474c59ae49f027f75d) Thanks [@minseong0324](https://github.com/minseong0324)! - Fixed `noMisleadingReturnType` incorrectly flagging functions with reassigned `let` variables.
- [#10075](https://github.com/biomejs/biome/pull/10075) [`295f97f`](https://github.com/biomejs/biome/commit/295f97fd538779eb9cc35b5bf54d37a90e0b5e9b) Thanks [@ematipico](https://github.com/ematipico)! - Fixed [`#9983`](https://github.com/biomejs/biome/issues/9983): Biome now parses functions declared inside Svelte `#snippet` blocks without throwing errors.
- [#10006](https://github.com/biomejs/biome/pull/10006) [`cf4c1c9`](https://github.com/biomejs/biome/commit/cf4c1c943a53612648d052d843aaf977652c79d6) Thanks [@minseong0324](https://github.com/minseong0324)! - Fixed [#9810](https://github.com/biomejs/biome/issues/9810): `noMisleadingReturnType` incorrectly flagging nested object literals with widened properties.
- [#10033](https://github.com/biomejs/biome/pull/10033) [`11ddc05`](https://github.com/biomejs/biome/commit/11ddc05713a1cb85b6748c865ee9dda91235a5d1) Thanks [@ematipico](https://github.com/ematipico)! - Added the nursery rule [`useReactNativePlatformComponents`](https://biomejs.dev/linter/rules/use-react-native-platform-components/) that ensures platform-specific React Native components (e.g. `ProgressBarAndroid`, `ActivityIndicatorIOS`) are only imported in files with a matching platform suffix. It also reports when Android and iOS components are mixed in the same file.
The following code triggers the rule when the file does not have an `.android.js` suffix:
```js
// file.js
import { ProgressBarAndroid } from "react-native";
```
## What's Changed
* docs(orgnizeImports): revamp user-facing docs by @Conaclos in https://github.com/biomejs/biome/pull/9987
* fix(md): code info string, and fmt advancement by @ematipico in https://github.com/biomejs/biome/pull/9979
* fix(service): detect script language in Svelte files with generics attribute by @leetdavid in https://github.com/biomejs/biome/pull/9743
* chore: abstract html tag matcher by @Netail in https://github.com/biomejs/biome/pull/9988
* chore(deps): update rustls-webpki to 0.103.12 by @siketyan in https://github.com/biomejs/biome/pull/9996
* fix(parser/css): handle nested rules in embedded snippets by @siketyan in https://github.com/biomejs/biome/pull/9995
* chore: fix some node vulnerabilities by @Netail in https://github.com/biomejs/biome/pull/10001
* chore: fix more node vulnerabilities by @Netail in https://github.com/biomejs/biome/pull/10002
* feat(lint): implement use useRegexpTest nursery rule by @ryan-m-walker in https://github.com/biomejs/biome/pull/9702
* feat(css): implement shared CSS scanner for parsing SCSS interpolations and URL bodies by @denbezrukov in https://github.com/biomejs/biome/pull/9948
* feat(fmt/md): ordered lists and space normalization by @ematipico in https://github.com/biomejs/biome/pull/9998
* chore: update rand & thin-vec by @Netail in https://github.com/biomejs/biome/pull/10008
* fix(lint/js): false positives in `noComponentHookFactories` by @Jayllyz in https://github.com/biomejs/biome/pull/10009
* feat(lint): add `noReactNativeRawText` by @ematipico in https://github.com/biomejs/biome/pull/10005
* refactor(css): rename scss declaration and module access syntax by @denbezrukov in https://github.com/biomejs/biome/pull/10014
* fix(markdown_parser): handle tab-separated container markers by @jfmcdowell in https://github.com/biomejs/biome/pull/9965
* chore: cleanup tests by @Netail in https://github.com/biomejs/biome/pull/10016
* feat(lint/js): add `useDomQuerySelector` by @dyc3 in https://github.com/biomejs/biome/pull/9885
* test(formatter): retain formatter failures in prettier snapshots by @denbezrukov in https://github.com/biomejs/biome/pull/10018
* feat(css): support unquoted concatenation in SCSS interpolation expressions by @denbezrukov in https://github.com/biomejs/biome/pull/10020
* test(css_formatter): import prettier scss mirror by @denbezrukov in https://github.com/biomejs/biome/pull/10025
* refactor(tests): reorganize SCSS test specs into standalone `scss` module by @denbezrukov in https://github.com/biomejs/biome/pull/10030
* test(prettier-compare): add scss compare support by @denbezrukov in https://github.com/biomejs/biome/pull/10031
* fix(lint): fix false positive in noMisleadingReturnType for mutable bindings by @minseong0324 in https://github.com/biomejs/biome/pull/9999
* feat(lint): add `noReactNativeLiteralColors` by @ematipico in https://github.com/biomejs/biome/pull/10012
* fix(lint): fix false positive in noMisleadingReturnType for nested object widening by @minseong0324 in https://github.com/biomejs/biome/pull/10006
* feat(lint/js): add `useDomNodeTextContent` by @dyc3 in https://github.com/biomejs/biome/pull/9865
* feat(lint): add react native deep import rule by @ematipico in https://github.com/biomejs/biome/pull/10023
* feat(lint/js): add `noLoopFunc` by @dyc3 in https://github.com/biomejs/biome/pull/9815
* fix(organizeImports): sorts imports in ts modules and declaration files by @Conaclos in https://github.com/biomejs/biome/pull/10046
* feat(linter): add nursery rule noUnnecessaryTemplateExpression by @officialasishkumar in https://github.com/biomejs/biome/pull/9969
* chore: delete old unused options files by @Netail in https://github.com/biomejs/biome/pull/10047
* fix(js_analyze): flag useIframeSandbox non initializer value by @Netail in https://github.com/biomejs/biome/pull/10035
* feat(js_analyze): implement noJsxLeakedDollar by @Netail in https://github.com/biomejs/biome/pull/9911
* fix(markdown_parser): trim trailing newline in tight lists inside blockquotes by @jfmcdowell in https://github.com/biomejs/biome/pull/9976
* chore: some improvements by @Netail in https://github.com/biomejs/biome/pull/10050
* chore(deps): update rust:1.94.1-trixie docker digest to 652612f by @renovate[bot] in https://github.com/biomejs/biome/pull/10055
* chore(deps): update dependency tombi to v0.9.18 by @renovate[bot] in https://github.com/biomejs/biome/pull/10056
* chore(deps): update github-actions by @renovate[bot] in https://github.com/biomejs/biome/pull/10057
* chore(deps): update rust crate bpaf to 0.9.25 by @renovate[bot] in https://github.com/biomejs/biome/pull/10058
* chore(deps): update rust crate libc to 0.2.185 by @renovate[bot] in https://github.com/biomejs/biome/pull/10059
* fix(parser): fix crash when parsing Svelte templates by @mujpao in https://github.com/biomejs/biome/pull/10043
* chore: extra @eslint/css rule sources by @Netail in https://github.com/biomejs/biome/pull/10063
* fix(lint): fix false positive in noMisleadingReturnType for getter with matching setter by @minseong0324 in https://github.com/biomejs/biome/pull/10037
* fix(core): parsing of svelte snippets by @ematipico in https://github.com/biomejs/biome/pull/10075
* test(fmt): improve ignored files by @ematipico in https://github.com/biomejs/biome/pull/10068
* feat(lint): add useReactNativePlatformComponents rule and options by @ematipico in https://github.com/biomejs/biome/pull/10033
* feat(css_formatter): improve SCSS map formatting parity by @denbezrukov in https://github.com/biomejs/biome/pull/10076
* chore: resolve rustls-webpki advisory by @dyc3 in https://github.com/biomejs/biome/pull/10085
* fix(codegen): escape doc comments by @dyc3 in https://github.com/biomejs/biome/pull/10086
* fix(analyzer): noUselessEscapeInRegex preserves required v-flag escapes by @jiwon79 in https://github.com/biomejs/biome/pull/10084
* perf(lint): avoid string allocations in some lint rules by @dyc3 in https://github.com/biomejs/biome/pull/10088
* perf(lint): reduce string allocations, part 2 by @dyc3 in https://github.com/biomejs/biome/pull/10093
* ci: release by @github-actions[bot] in https://github.com/biomejs/biome/pull/9991
## New Contributors
* @leetdavid made their first contribution in https://github.com/biomejs/biome/pull/9743
* @officialasishkumar made their first contribution in https://github.com/biomejs/biome/pull/9969
* @jiwon79 made their first contribution in https://github.com/biomejs/biome/pull/10084
**Full Changelog**: https://github.com/biomejs/biome/compare/@biomejs/[email protected]...@biomejs/[email protected]