Biome @biomejs/[email protected]stable Released Apr 23, 2026
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.

Compatibility not verified โ€” check source notes
$ npm install --save-dev --save-exact @biomejs/[email protected]
๐Ÿ“„ .MD
โšก 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]