Populars: Dades actualitzades el 27 d’octubre del 2026

Categories

Internet1.356
Comunicació321
Àudio i vídeo898
Gràfics i disseny539
Ofimàtica i productivitat1.124
Eines per a desenvolupadors3.134
Eines d’IA529
Seguretat i privadesa385
Eines del sistema3.114
Jocs523
Educació i ciència239
Xarxa i TI284

Biome: baixar versions anteriors

Biome is a toolchain for web projects, aimed at providing functionalities to maintain them. It offers a formatter and linter, usable via CLI and LSP.

BiomeJS Utilitats per a desenvolupadors #9 Utilitats per a desenvolupadors

Aquí hi ha 60 versions de Biome, des de 29 de juliol del 2025 fins a l’actual, 2.6.3. Cadascuna enllaça amb els instal·ladors del mateix desenvolupador.

2025: 20 20 25 2026: 40 40 26

60 versions en 1 any · unes 48 per any

VersióDataMidaFitxers
2.6.3Darrera versió 24 d’octubre del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.6.3

Patch Changes
- #12275 807e616 Thanks @dyc3! - Added the new nursery rule noArraySortForMinMax, which reports sorting an array only to read its smallest or largest value. Use Math.min() or Math.max() instead.
const minimum = array.toSorted((a, b) => a - b)[0];
- #12432 cf61682 Thanks @dyc3! - Added the nursery rule noBooleanSortComparator, which reports sort comparators that return a boolean instead of a number. For example, array.sort((a, b) => a > b) never puts the first item before the second, so the array isn't sorted correctly.
for (const name of users.map((user) => user.name)) {
console.log(name);
}
- #12121 66c3791 Thanks @dyc3! - Added the nursery rule noNewRequire, which disallows calling require with new, such as new require("app-header").
- #12316 34b520d Thanks @dyc3! - Added the new nursery rule noObsoleteAttributes, which disallows obsolete attributes on HTML elements and suggests what to use instead.
<table bgcolor="#ffffff" cellpadding="5"></table>
- #12258 cce2385 Thanks @dyc3! - Added the nursery rule noPathConcat, which disallows building file paths and URLs by joining strings to __dirname, __filename, import.meta.dirname, import.meta.filename, or import.meta.url.
const fullPath = __dirname + "/foo.js"; // reported
- #12287 e12ad78 Thanks @dyc3! - Added the new nursery rule noPlaywrightNthMethods, which disallows selecting Playwright elements by position with first(), last(), and nth(). A test that relies on the position of an element can act on a different element when the page changes.
await page.locator("button").first().click();
- #12343 62ad123 Thanks @vibbix! - Added the nursery rule noSelfNestedLayer, which disallows nesting a cascade layer inside a layer with the same name. Layer names inside an @layer block are relative to it, so the inner layer below creates the sublayer components.components instead of adding to components.
@layer components {
@layer components {
.button {
color: red;
}
}
}
- #12289 bbbd95d Thanks @dyc3! - Added the nursery rule noShortTimeValues, which reports CSS animation and transition times that are shorter than the configured minimum number of milliseconds. The rule does nothing until minimum is set.
For example, the following code is invalid when minimum is 100:
a {
transition-duration: 80ms;
}
- #12431 f748ec0 Thanks @dyc3! - Added the nursery rule noSvelteInternal, which disallows importing from svelte/internal and its submodules. These modules are private to Svelte and can change or disappear in any release.
import { get_current_component } from "svelte/internal";
- #12270 8ae35c4 Thanks @dyc3! - Added the nursery rule noTanstackQueryRestDestructuring, which disallows rest destructuring and object spread on TanStack Query results. Both read every property of the result, so the component updates on every change to the query.
import { useQuery } from "@tanstack/react-query";
const { data, ...rest } = useQuery({ queryKey: ["todos"], queryFn: fetchTodos });
The rule belongs to the new tanstackQuery domain.
for (const item of getItems(createArgument(seed))) {} // reported
- #12422 0be8d10 Thanks @dyc3! - Added the new nursery rule noUnsafeReturn, which disallows returning a value typed as any from a function.
function parse(text: string) {
return JSON.parse(text); // reported
}
- #12311 8434c92 Thanks @dyc3! - Added the nursery rule noUselessSplice, which reports splice() calls that have a simpler alternative. For example, array.splice(0, 1) can be written as array.shift().
- #12293 eaa4a2b Thanks @dyc3! - Added the nursery rule noVueUnusedEmitDeclarations, which reports events that a Vue component declares but never emits.
For example, the following component never emits close:
<script setup>
const emit = defineEmits(["change", "close"]);
emit("change");
</script>
- #12386 f01ebb0 Thanks @dyc3! - Added the nursery rule noVueVTextVHtmlOnComponent, which disallows v-text and v-html on Vue components. These directives replace everything inside the component's root elemen
2.6.2 21 d’octubre del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.6.2

Minor Changes
- #11479 5c60ba8 Thanks @nhedger! - Added a --git flag to biome init. The flag enables Git VCS integration and sets vcs.useIgnoreFile to true in the generated configuration, even when the command runs outside a Git repository.
- #11742 3a1356d Thanks @Netail! - Added the biome migrate stylelint command. It imports a Stylelint configuration and its ignore settings into your Biome configuration, mapping Stylelint rules to their Biome equivalents. Pass --write to apply the changes, and --include-inspired or --include-nursery to migrate additional rules.
- #12318 774b5b5 Thanks @Netail! - Added the new assist action useGraphqlSortedDefinitions, which sorts the named definitions of a GraphQL document, such as types, type extensions, directives, fragments, and operations.
Invalid:
type User {
id: ID!
}
enum Role {
ADMIN
USER
}
directive @auth on FIELD_DEFINITION
- #6886 3479d15 Thanks @christymcgrory! - biome rage now shows the resolved files.includes and files.ignoreUnknown configuration.
- #11102 0874b7f Thanks @gameroman! - Added support for useTailwindSortedClasses rule in HTML-ish files.
- #10711 40de5a0 Thanks @soconnor-seeq! - Adds a new resolutionKind option for object-syntax plugin entries.
This allows shared Biome configs in monorepos to load local Grit plugins from the package that declares them instead of resolving plugin paths from the consuming project.
{
"plugins": [
{ "path": "./grit/no-debugger.grit", "resolutionKind": "config" },
{ "path": "local-plugin.grit", "resolutionKind": "project" },
{ "path": "local-plugin.grit" }
]
}
Use resolutionKind: "config" to resolve the plugin from the configuration file that declares it. Use resolutionKind: "project" to resolve the plugin from the consuming project. When omitted, resolutionKind defaults to project. This only affects plugin resolution; includes still apply to end-user project files as usual.
- #11432 4befd08 Thanks @ematipico! - Added biome inspect config to show resolved configuration values and their origins as human-readable diagnostics, including matching overrides.
Configuration files can also extend other configurations up to ten levels deep. Repeated references to the same resolved file are ignored with an information diagnostic, while resolving multiple versions of one extended package produces an error.
- #11477 ab05554 Thanks @nhedger! - Added automatic Git VCS integration when running biome init inside a Git repository, including from nested directories and Git worktrees. The generated configuration sets vcs.enabled and vcs.useIgnoreFile to true, with vcs.clientKind set to "git".
- #11451 1ac4b09 Thanks @ematipico! - #### YAML is now supported
Added support for formatting YAML files, both .yaml and .yml extensions
- #11432 4befd08 Thanks @ematipico! - Configuration files can now recursively extend local files and npm package configurations up to ten levels. Every repeated reference participates in the merge, while resolving multiple versions of one extended package produces an error.
- #11713 ac6a640 Thanks @dyc3! - Added support for Grit range() patterns, addressing #8454. Plugins can filter syntax nodes by optional start_line, start_column, end_line, and end_column bounds.
For example, this pattern matches function calls contained entirely on line 2.
range(start_line=2, end_line=2) as $call where {
$call <: call_expression()
}
- #11244 0628b53 Thanks @ematipico! - Added the new CLI option --profile-type-inference to the commands lint and check.
The profiler is designed to track the execution time of internal queries and operations, group them by file, and sort them from the most expensive to the least expensive.
biome lint --profile-type-inference
profiler ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
i Type inference profile (Biome <version>)
src/index.ts
Requests (top 5 of 12 groups; 28 source records; 46 executions)
1. Promise classification <- nursery/noFloatingPromises
...
Queries (top 8 of 25 groups; 
2.5.15 30 de setembre del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.5.15

Patch Changes
- #10634 b436ba0 Thanks @subaru-hello! - Added the new nursery rule noReactObjectTypeAsDefaultProp, which disallows array, object, and function values as default props in React components.
For example, the following snippet triggers the rule.
function Component({ items = [] }) {
return items;
}
- #11956 faa8b37 Thanks @dyc3! - Added the nursery rule noSvelteExportLet, which disallows declaring Svelte component props with the legacy export let syntax. Use the $props() rune instead.
<script>
export let name;
</script>
- #10816 1b9479e Thanks @Th3S4mur41! - Added a new nursery rule useLogicalProperties that enforces the use of logical properties in CSS, promoting better internationalization and accessibility practices. The rule supports a direction option with "ltr" as the default and "rtl" as the alternative.
This is a first rule covering parts of #9034
{
"linter": {
"rules": {
"nursery": {
"useLogicalProperties": {
"level": "warn",
"options": {
"direction": "rtl"
}
}
}
}
}
}
- #11960 1fdb5c2 Thanks @dyc3! - Added the nursery rule useSvelteKitRuneImports, which reports imports from the deprecated $app/stores module and suggests $app/state instead.
import { page } from "$app/stores";
- #11723 3b429d1 Thanks @m1handr! - Fixed #11656: noAstroSetHtmlDirective now correctly reports set:html directives inside Astro template expressions.
- #12023 874d5ae Thanks @codspeed! - Improved the performance of the HTML formatter up to 4x.
- #11761 a3462fe Thanks @saberoueslati! - Fixed #11351: useSimplifiedLogicExpression no longer reports boolean literals on the right side of || and && outside boolean contexts, because removing them can change the result of the expression. For example, y = x || false is no longer reported, while if (x || false) still is.
- #11732 ff4c4dd Thanks @dyc3! - Added the nursery rule noMeaninglessVoidOperator, which reports unnecessary uses of void, such as void log() when log returns void. The rule allows discarded call results, thenables, void 0, and calls returning never.
- #11975 40dd3fb Thanks @ematipico! - Fixed the indentation of multiline Astro expressions, in templates and attribute values, when running biome check --write. Biome now formats Astro expressions with biome format too, and places them at the column of the surrounding markup.
<div>
{items.map((item) => (
- <span>{item}</span>
-))}
+ <span>{item}</span>
+ ))}
</div>
- #12016 09d4000 Thanks @codspeed! - Improved the performance of indexing and analysis of big files up to 2x. The improvements are mostly visible in projects that make use of project and types lint rules.
- #11750 089bde0 Thanks @dyc3! - Added the nursery rule useStrictBooleanExpressions, which reports ambiguous truthiness checks such as if (value) when value has type number | undefined. Non-nullable strings and numbers and nullable objects are allowed; the rule has no options.
- #11494 ad5b362 Thanks @jp-knj! - Added the nursery rule noAstroConflictingSetDirectives, which reports Astro elements with multiple content sources, such as set:html, set:text, and child content.
For example, <div set:html={html}>content</div> triggers the rule.
- #11878 84d1b3b Thanks @dyc3! - Fixed #11748: useExhaustiveSwitchCases now reports missing cases for values created with the mapping overload of Array.from, including arrays imported from another module.
- #11802 7d1f37e Thanks @dyc3! - Tailwind classes will now be detected in Svelte, Vue, and Astro class attribute expressions that don't use a class merging function.
- #11910 9e50ea2 Thanks @ematipico! - Fixed #11504, a regression where Biome would silently ignore errors in the configuration file. Now errors are correctly retained and checked before executing any command.
- #11921 d568632 Thanks @hirehamir! - Fixed #10846: when plugins fail to load, Biome now prints each failing plugin's path on its own line, instead of concatenating bare messages like Cannot read file.Cannot read file..
- #11930 82ea5a6 Thanks @dyc3! - Fixed #119
2.5.14 16 de setembre del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.5.14

Patch Changes
- #9022 0d49e24 Thanks @dyc3! - Added the nursery rule noReturnInFinally. This rule disallows return statements in Promise.prototype.finally() callbacks, including inside nested blocks and conditional branches. Returns in nested functions are ignored by the rule.
// Invalid: return in finally callback
Promise.resolve(1).finally(() => { return 2 })
// Valid: no return in finally callback
Promise.resolve(1).finally(() => { console.log(2) })
Returning a value from a Promise.prototype.finally() callback does not replace the original promise's fulfillment value, which can be confusing. Returned promises and thenables are awaited, and their rejection rejects the resulting promise.
- #11754 71eaa0d Thanks @griff-rees! - Added the nursery rule noSvelteAtDebugTags, which disallows Svelte's {@debug} tag.
<!-- Invalid: leftover debugging tag -->
{@debug user}
The {@debug} tag is a debugging aid and should be removed once you no longer need it, as it should not remain in production code. The rule provides a safe fix that removes the tag.
- #11725 5eb5f09 Thanks @m1handr! - Added the nursery rule useValidTestTitle, which enforces valid titles for unit test cases and suites.
- #11735 9bd70c7 Thanks @ematipico! - Fixed #8471: source.fixAll.biome ignored formatter.formatWithErrors. It now applies safe fixes without formatting files that have parse errors when the option is disabled.
- #11715 f05a3c3 Thanks @ematipico! - Fixed #7771: Grit plugins that use sequential no longer panic when Biome processes files.
- #11766 c2542c6 Thanks @dyc3! - Fixed validation of readonly and accessor modifiers: combining them in either order now reports that they cannot be used together.
- #11461 22e9966 Thanks @FoundDream! - Fixed #11423: Multiline template interpolations now preserve the indentation of their closing brace when the source indentation is not a multiple of tabWidth.
const value = `
${
condition
? "yes"
: "no"
-}
+ }
`;
- #11766 c2542c6 Thanks @dyc3! - Fixed #11763: TypeScript class members using override accessor, such as override accessor value = 1, now parse correctly. The reversed order, accessor override, now reports that override must precede accessor.
- #11790 17d0ff0 Thanks @ematipico! - Fixed #10248: noUselessFragments now allows fragments with props in Astro files, such as <Fragment slot="name">{text}</Fragment> inside template expressions.
- #11777 7ee3a6c Thanks @ematipico! - Fixed #7573: added the requireExplicitCase option to useExhaustiveSwitchCases. When set to true, the rule reports missing cases even when the switch has a default clause, so you can keep a runtime fallback while checking that every value in the union has its own case. The option defaults to false.
- #11751 d37f24b Thanks @ematipico! - Fixed #8347: the fix from useConsistentArrowReturn now parenthesizes returned expressions that begin with object literals before removing the arrow function body braces, preventing invalid output for expressions such as object property access.
- #11784 46e8912 Thanks @dyc3! - Fixed #11782: noUndeclaredCustomProperties could hang while checking stylesheets imported by JavaScript modules with many shared dependencies.
- #11731 1534885 Thanks @ematipico! - Fixed #7984: The fix from useSimplifiedLogicExpression now preserves line breaks in multiline conditions with line comments, preventing the right-hand side condition from being commented out.
- #11735 9bd70c7 Thanks @ematipico! - Fixed #7304: the HTML formatter now preserves authored segment breaks between CJK characters, and next to CJK punctuation, instead of replacing them with spaces.
<div lang="zh-Hant-TW">
- 這個段落是那麼長, 在一行寫不行。
+ 這個段落是那麼長,
+ 在一行寫不行。
</div>
- #11749 ff992a1 Thanks @ematipico! - Fixed #11747: formatting and checking large parenthesized object expressions no longer exhibit quadratic slowdowns.
- #11736 1dd1fc4 Thanks @dyc3! - Fixed #8177: code actions no longer modify the wrong part of Vue, Svelte, or Astro files when experimental full HTML sup
2.5.13 10 de setembre del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.5.13

Patch Changes
- #11379 07a0073 Thanks @Netail! - Added the nursery rule useLayeredStyles, which enforces that style rules are defined within a cascade layer and import rules to import its styles into a cascade layer.
/* Invalid */
@import 'foo.css';
.my-style {
color: red;
}
/* Valid */
@import 'foo.css' layer(base);
@layer base {
.my-style {
color: red;
}
}
- #11667 e997900 Thanks @devtechedge! - Added the nursery rule useBetterDomTraversing, which prefers .firstChild, .firstElementChild, .closest(), and merged .querySelector() calls over positional DOM traversal.
element.childNodes[0];
element.children[0];
element.parentElement.parentElement;
element.querySelector("a").querySelector("b");
- #11620 20e513a Thanks @jakeleventhal! - Fixed #11610, #11611, #11612, #11615, and #11616: Biome no longer fully infers an imported generic declaration just to apply its type arguments, restoring type-aware lint performance for large libraries such as Zod. This improves useRegexpExec, noFloatingPromises, noMisusedPromises, useNullishCoalescing, and noUnsafePlusOperands.
- #11657 e322040 Thanks @ematipico! - Fixed #7495: noUselessConstructor now ignores TypeScript constructors that forward at least one argument to super, preserving constructors that narrow the subclass's accepted parameter types. The exemption also applies when the parent and child signatures are identical; JavaScript and zero-argument forwarding behavior are unchanged.
- #11670 4969ee1 Thanks @ematipico! - Fixed #7076: useAriaPropsForRole and useFocusableInteractive no longer report non-focusable elements with role="separator". A separator with an explicit tabIndex or tabindex still requires aria-valuenow.
- #11627 23aad6d Thanks @ematipico! - Fixed #6571 so Grit plugins can capture and inspect multiple named import specifiers.
- #11631 00dbd3a Thanks @ematipico! - Reduced unnecessary type inference when type-aware lint rules inspect members of namespace imports from libraries such as Zod. Fixed type inference so blanket re-exports do not expose default exports.
- #11628 a2f8ff7 Thanks @dyc3! - Added the nursery rule noXorAsExponentiation, which reports the bitwise XOR operator ^ between two decimal integer literals, where the exponentiation operator ** was likely intended.
const kibibyte = 2 ^ 10; // 8, not 1024
- #11670 4969ee1 Thanks @ematipico! - Fixed #7192: noUnusedPrivateClassMembers now considers compound assignments such as ??= to read and use private class members.
- #11676 840a52a Thanks @dyc3! - Fixed #11672 and #11671 by disabling the experimental capitalized-call and effect-dependency checks in useReactCompiler, matching their exclusion from upstream's recommended lint preset. Valid calls such as Intl.NumberFormat() and captures of variables declared inside effects no longer produce these diagnostics.
- #11660 49485ed Thanks @ematipico! - Fixed #11653: Astro template suppression comments ({/* biome-ignore lint: reason */}) now suppress matching HTML lint diagnostics on the following line when full HTML support is enabled.
- #11664 9a73b9c Thanks @dyc3! - Improved the performance of useRegexpExec.
- #11661 5341b3f Thanks @ematipico! - Fixed #7479. noUnusedVariables now treats Unicode escapes in identifiers as the same binding as their decoded spelling.
- #11630 62e1fc5 Thanks @dyc3! - Fixed the HTML formatter inserting whitespace between adjacent Svelte expressions when their combined length exceeds the line width.
<span>
- {head.median - base.median >= 0 ? "+" : "−"}
- {formatMs(Math.abs(head.median - base.median))}
+ {head.median - base.median >= 0 ? "+" : "−"}{formatMs(Math.abs(head.median - base.median))}
</span>
- #11658 ed4bfa4 Thanks @fredrikblau! - Fixed #11644: useHeadingContent no longer reports headings that render their text with a directive: set:html and set:text in Astro files, v-html and v-text in Vue files.
<h1 set:html={heading} />
<h2 set:text={heading}></h2>
<template>
<h1 v-html="heading"></h1>
<h2 v-text="heading"></h2>
</template>
2.5.12 3 de setembre del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.5.12

Patch Changes
- #11440 b88f1ea Thanks @Princesseuh! - Fixed Astro attribute expressions rejecting TypeScript and JSX syntax that is accepted in text expressions.
<Component icon={<Icon />} count={total as number} onSelect={(e: Event) => e} />
- #11440 b88f1ea Thanks @Princesseuh! - Fixed Astro attribute names being split on : and . inside an expression, such as {x && <button x-on:keyup.enter={go} client:load.foo />}.
- #11440 b88f1ea Thanks @Princesseuh! - Fixed a bare > in the children of an Astro expression being treated as markup, such as {x && <div>a > b</div>}.
- #11440 b88f1ea Thanks @Princesseuh! - Fixed HTML comments inside an Astro expression failing to parse. They are now read as trivia, wherever they appear among the children.
{x && <div><!-- first -->text<!-- last --></div>}
{cond && <a></a><!-- c --><b></b>}
- #11440 b88f1ea Thanks @Princesseuh! - Fixed is:raw children inside an Astro expression being read as JSX, such as {x && <div is:raw>{not js} < & text</div>}.
- #11440 b88f1ea Thanks @Princesseuh! - Fixed an apostrophe or quote in the text of a JSX element inside an Astro expression ending the expression early, such as {items.map((i) => <li>it's {i}</li>)}.
- #11440 b88f1ea Thanks @Princesseuh! - Fixed the children of a <script> or <style> inside an Astro expression being read as JSX. Their contents are text, so braces and comparisons no longer have to be escaped.
{cond && <style>a { color: red }</style>}
{cond && <script>let x = {a: 1};</script>}
- #11440 b88f1ea Thanks @Princesseuh! - Added support for template literal attribute values inside an Astro expression, such as {x && <C data-x=`t${x}` />}.
- #11440 b88f1ea Thanks @Princesseuh! - Fixed unquoted attribute values being rejected inside an Astro expression, such as {x && <a class=foo maxlength=255 href=/about>go</a>}.
- #11440 b88f1ea Thanks @Princesseuh! - Fixed a template literal nested inside ${} breaking the rest of an Astro file, such as const href = `/blog${page === 0 ? '' : `/${page + 1}`}`;.
- #11440 b88f1ea Thanks @Princesseuh! - Fixed a quote inside a regex character class breaking the rest of an Astro file, such as const unsafe = /[/"]/;.
- #11508 54f3a2e Thanks @dyc3! - Added the nursery rule useFlatMathMinMax. Because Math.min() and Math.max() accept any number of arguments, the rule reports unnecessary nested calls to the same method:
Math.max(Math.max(a, b), c);
The fix flattens this expression to Math.max(a, b, c).
- #11585 c5c8315 Thanks @Netail! - Fixed #11475: noUnresolvedImports no longer reports Bun runtime built-in modules (bun, bun:bundle, bun:ffi, bun:jsc, bun:sqlite, bun:test).
- #11368 52a57b3 Thanks @Austin1serb! - Fixed #6830: Biome now reports a diagnostic for excessively deep syntax instead of overflowing the native stack while releasing the parsed tree.
- #11596 1fc42ed Thanks @dyc3! - Added the nursery rule noThisOutsideOfClass. The rule reports this outside class members and TypeScript functions with an explicit this parameter.
function Person(name) {
this.name = name;
}
- #11555 2516335 Thanks @dyc3! - Fixed #11529, where noFloatingPromises missed unhandled Promise chains when the imported function's module belonged to an import cycle. Cyclic modules now preserve types for exports that do not participate in recursive type dependencies.
- #11518 0fee70c Thanks @HarperZ9! - Fixed #11500: the formatter now prints the declare modifier before accessibility modifiers on class properties. private declare readonly name: string is now formatted as declare private readonly name: string, matching Prettier and TypeScript's canonical modifier order.
- #11580 1277af2 Thanks @ematipico! - Fixed #5091: Biome no longer moves comments next to the < of a generic, which causes invalid TypeScript syntax:
- Generic<// a comment
+ Generic<
+ // a comment
- #11577 42995d2 Thanks @ematipico! - Fixed #4592. Biome no longer crashes while parsing malformed delete expressions.
- #11590 67963b4 Thanks @ematipico! - Fixed #6427 so Grit plugi
2.5.11 27 d’agost del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.5.11

Patch Changes
- #11499 9743d0c Thanks @scs0209! - Fixed #11496: useValidAnchor now treats Astro JSX shorthand attributes like <a {href}> as a valid href.
- #11437 88f805e Thanks @Princesseuh! - Fixed #9944: adjacent elements inside an Astro expression now parse as an implicit fragment instead of raising an error.
{options.map(() =>
<div />
<div />
)}
- #11437 88f805e Thanks @Princesseuh! - Fixed Astro templates rejecting unclosed HTML void elements, such as {cond && <br>}.
- #11507 e2fc036 Thanks @dyc3! - Fixed #11157: noUnusedVariables no longer reports Vue <script setup> bindings used by CSS v-bind() as unused.
- #11398 afc4615 Thanks @dyc3! - Fixed #11389: Files passed through --stdin-file-path now use full HTML support for Astro, Svelte, and Vue when it is enabled.
- #11526 372cd68 Thanks @dyc3! - Fixed noVueRefAsOperand to track Vue refs through declaration aliases and toRefs() properties, and to recognize useTemplateRef() results. The rule no longer reports false positives such as plain ref transfers, plain toRefs() property access, defineModel() modifiers, or the supported .effect member as operands.
The refactor enabling these fixes also improves the performance of the rule.
- #11458 a7cd286 Thanks @dyc3! - Fixed #11436: GritQL snippets such as export { $specifiers } from $source now match named re-exports with aliases, inline type modifiers, and multiple specifiers.
- #11515 382b15d Thanks @dyc3! - Fixed #11390, where noFloatingPromises performed expensive full type inference for calls to non-Promise methods declared on third-party TypeScript classes. The rule now classifies those calls using targeted type information.
- #11516 6f40e82 Thanks @levrik! - Fixed noVueRefAsOperand so it no longer reports a callback parameter (e.g. from .find(), .map()) as an unwrapped ref value just because it's nested inside a ref(), computed(), or similar call.
const result = computed(() => list.find((item) => item.label === "a"));
Previously, item here was incorrectly treated as a ref value because the rule attributed it to the outer computed() call.
- #11495 496268d Thanks @Netail! - Fixed useGraphqlNamingConvention so it no longer reports GraphQL enum value definitions with comments & descriptions and now displays a more accurate diagnostic range.
- #11407 6ef52b0 Thanks @1678092075! - Fixed #11214: noUnusedVariables no longer reports type parameters declared by non-default function overload signatures that have an implementation.
- #11322 5c353e6 Thanks @jp-knj! - Added a new nursery rule noAstroSetHtmlDirective, which disallows Astro's set:html directive because untrusted content can introduce cross-site scripting vulnerabilities.
For example, the following snippet triggers the rule:
<div set:html={content} />
- #11462 18883b7 Thanks @dyc3! - Fixed #10776: useVueHyphenatedAttributes no longer reports lowercase attribute names containing punctuation, such as pt:header:data-test-id and some_attr.
- #11476 3270ca4 Thanks @dyc3! - Fixed #10330: Vue interpolation delimiters now stay attached to whitespace-sensitive element boundaries and adjacent inline siblings, wrapping their expression when needed to fit the configured line width. Interpolations followed by text now also converge after one formatting pass.
-<v-btn v-if="store.state.user" variant="text" to="/my-rooms"
- >{{ $t("nav.my-rooms") }}</v-btn
->
+<v-btn v-if="store.state.user" variant="text" to="/my-rooms">{{
+ $t("nav.my-rooms")
+}}</v-btn>
- #11191 3e5367f Thanks @ematipico! - Added the nursery rule noUndeclaredCustomProperties, which reports references to custom properties that are not defined in available CSS, static HTML-like style attributes, or JSX string style attributes.
For example, the following snippet triggers the rule:
a { color: var(--undefined-color); }
- #11435 7754894 Thanks @levrik! - Fixed: Variables and imports used as custom Vue directives are no longer reported as unused.
For example:
<script setup>
const vHighlight = {
mounted: (element) => {
2.5.10 21 d’agost del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.5.10

Patch Changes
- #11403 8f7786f Thanks @Princesseuh! - Fixed Astro rejecting JavaScript comments between attributes.
<div /* block comment */ class="something"></div>
<Component /* c */ client:load />
- #11403 8f7786f Thanks @Princesseuh! - Fixed a bare < in Astro text being treated as the start of a tag, such as <p>5 < 6 and 7 > 6</p>. As in HTML, a < that cannot open a tag is text and needs no escaping.
- #11438 3133ffa Thanks @Princesseuh! - Fixed #8294: an Astro expression holding only a comment is no longer reported as a parse error, which also stopped the whole file from being formatted.
<div>{/* a note */}</div>
<div class={/* a note */}>x</div>
- #11403 8f7786f Thanks @Princesseuh! - Fixed #9165: an empty Astro expression such as <div>{}</div> no longer fails to parse. Astro renders {} as nothing.
- #11403 8f7786f Thanks @Princesseuh! - Fixed Astro expressions containing a comment failing to parse.
<div>{/* block comment */ x}</div>
<div>{/* only a comment */}</div>
- #11403 8f7786f Thanks @Princesseuh! - Added support for Astro's fragment shorthand.
<>
<p>a</p>
</>
- #11403 8f7786f Thanks @Princesseuh! - Fixed an Astro frontmatter block being cut short by a closing tag inside a string or comment.
---
const a = "</script>";
// </script> in a comment
---
- #11403 8f7786f Thanks @Princesseuh! - Fixed --- being read as an Astro frontmatter fence when markup precedes it. Astro only recognizes frontmatter at the very start of a file, so a file opening with a comment now has no frontmatter, and its --- lines are content.
<!-- c -->
---
this is text, not frontmatter
---
- #11403 8f7786f Thanks @Princesseuh! - Fixed an Astro frontmatter block ending early on a line that merely starts with a dash.
---
--count;
---
- #11403 8f7786f Thanks @Princesseuh! - Fixed the children of an Astro element carrying is:raw being parsed as markup instead of raw text. This now also covers <script> and <style>, whose contents Astro emits verbatim rather than processing, so they are no longer linted as JavaScript or CSS.
<article is:raw><% awesome %></article>
<script is:raw>{{ mustache }}</script>
- #11403 8f7786f Thanks @Princesseuh! - Fixed Astro rejecting attribute names that start with a colon, such as :href.
- #11403 8f7786f Thanks @Princesseuh! - Fixed the Astro parser failing to recover from a malformed closing tag such as <div></{<//, so that a later mistake is reported where it happens rather than cascading.
- #11403 8f7786f Thanks @Princesseuh! - Fixed { inside an Astro <math> element opening an expression. MathML is foreign content where Astro parses no expressions, so LaTeX such as R^{2x} now survives as text. <svg> is unaffected.
- #11403 8f7786f Thanks @Princesseuh! - Fixed {{ at the start of an Astro expression being read as an interpolation. Astro has no {{ }} syntax, so {{ a: 1 }} and <Comp a={{ b: 1 }} /> are object literals.
- #11403 8f7786f Thanks @Princesseuh! - Fixed expressions inside an Astro <pre> or <textarea> being read as raw text. Astro parses both as ordinary elements, so their markup and interpolations are now parsed, and a variable used only inside one is no longer reported as unused.
<pre>{value}</pre>
<textarea><div>{value}</div></textarea>
- #11403 8f7786f Thanks @Princesseuh! - Added support for template literal attribute values in Astro, such as <div class=`a ${b} c`>.
- #11403 8f7786f Thanks @Princesseuh! - Fixed Astro rejecting HTML5 unquoted attribute values that contain `, =, ' or ", such as <a href=a=b> and <a href=a'b>.
- #11393 dec5a8f Thanks @1678092075! - Fixed #11207: useStrictMode no longer reports Vue event handlers such as @click="count++".
- #11431 c065f99 Thanks @levrik! - Fixed #11429: Variables and imports used by Vue same-name bindings such as :disabled or v-bind:disabled are no longer reported as unused.
- #11409 405dedb Thanks @ematipico! - Fixed a memory leak in the LSP server where memory usage kept growing over long editor sessions.
- #11422 a51eff7 Thanks @dyc3! - Fixed #11416: B
2.5.9 17 d’agost del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.5.9

Patch Changes
- #11321 41386f3 Thanks @dyc3! - Fixed #11315: The CSS parser now recovers at declaration boundaries after bogus declarations, allowing subsequent valid declarations to be parsed.
- #11248 57b197e Thanks @yanthomasdev! - Expanded the environment variable metadata used by biome rage to include BIOME_BINARY, BIOME_LOG_FILE, and RUST_BACKTRACE as well as reworded explanations for better readability.
- #11377 a8798ea Thanks @Netail! - Added a new nursery rule useNamedLayer which disallows anonymous cascade layers.
@layer {
a {
color: red;
}
}
- #11327 6771cf5 Thanks @dyc3! - The HTML formatter now preserves meaningful blank lines in HTML, including spacing after elements with trailing spaces and blank lines between comment groups.
<div>
<!-- first group -->
+
<!-- second group -->
</div>
- #10312 ba8aa18 Thanks @dyc3! - Added the nursery rule useTailwindShorthandClasses, which suggests shorter Tailwind utility classes. For example, the rule suggests replacing w-4 h-4 with size-4.
- #11333 715e0cd Thanks @kkkhs! - Fixed #11328: lint/nursery/useExpect now recognizes Vitest Browser Mode expect.element() calls as assertions.
- #11343 9b98211 Thanks @johncarmack1984! - Fixed #11311: the CSS parser now accepts Tailwind container-query variant names in @variant, such as @xl and @max-xl. These previously produced a parse error and a noUnknownAtRules diagnostic.
@variant @xl {
div {
background: red;
}
}
- #11220 3e8c488 Thanks @santichausis! - Fixed #9541: noUndeclaredVariables, noUnusedImports, and noUnusedVariables now correctly recognise exported variables and functions declared in one embedded <script> block as usable from a sibling <script> block, in Svelte's <script module>/<script> pair and Vue's non-setup <script> blocks.
For example, Biome no longer reports greet as undeclared in the following Svelte component:
<script module>
export function greet() {
console.log("Hello!");
}
</script>
<script>
greet();
</script>
- #11300 36430eb Thanks @dyc3! - Fixed the HTML formatter's whitespace handling for marquee, noscript, video, audio, and object elements.
- <marquee behavior="alternate"> This text will bounce </marquee>
+ <marquee behavior="alternate">This text will bounce</marquee>
- #11299 6559e6c Thanks @jp-knj! - Added the nursery rule useAstroClientOnlyDirectiveValue, which reports Astro client:only directives without an initializer.
For example, <Component client:only /> triggers the rule.
- #11365 7529811 Thanks @MHJahanbakhsh! - Fixed #11229: The useGenericFontNames rule now treats math as a valid generic font family.
- #11346 674f5f4 Thanks @Jayllyz! - Fixed #11335: noComponentHookFactories now reports a use-prefixed variable only when a function is assigned to it directly.
function factory() {
const useColors = true; // no longer reported
const useStore = createStore({ count: 0 }); // no longer reported
const useData = () => useState(null); // still reported
return useColors;
}
- #11334 c87c46a Thanks @zkasuran! - Fixed #11317: noSvgWithoutTitle no longer reports an svg that uses the boolean shorthand aria-hidden (equivalent to aria-hidden={true} in React).
- #11364 13853b1 Thanks @ematipico! - Fixed a bug where useJsxKeyInIterable incorrectly flagged Astro files.
- #11321 41386f3 Thanks @dyc3! - Fixed #11315: Invalid CSS declarations in HTML style attributes now produce parser diagnostics instead of causing a panic.
- #11325 67c3bf0 Thanks @dyc3! - Fixed HTML text wrapping to account for the width of an adjacent closing tag, avoiding lines that exceed the configured width when the final word and tag must move together.
<a-long-long-long-element
- >foo bar foo bar foo bar foo bar foo bar foo bar foo bar</a-long-long-long-element
+ >foo bar foo bar foo bar foo bar foo bar foo
+ bar</a-long-long-long-element
>
- #11367 fe5b5d4 Thanks @ematipico! - Fixed TypeScript compilerOptions.paths resolution when mapping targets omit ./. Biome now resolves these targets relative to their configured path base.
- #11316 1
2.5.8 11 d’agost del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.5.8

Patch Changes
- #10710 0a0fbc1 Thanks @dyc3! - Added a new nursery rule useReactCompiler, which reports diagnostics from React Compiler lint mode.
- #11251 ea9dd8a Thanks @dyc3! - Improved performance of noImportCycles.
- #11247 52b44d6 Thanks @dyc3! - Added the nursery rule noSvelteLegacyConst, which disallows legacy Svelte {@const} tags and recommends declaration tags with $derived().
Invalid:
{#each boxes as box}
{@const area = box.width * box.height}
<p>{area}</p>
{/each}
Valid:
{#each boxes as box}
{const area = $derived(box.width * box.height)}
<p>{area}</p>
{/each}
- #11252 d5f5704 Thanks @Turtle-Hwan! - Fixed #11250: useAwait no longer reports async functions that contain an await using declaration.
- #11143 6be7be1 Thanks @vznh! - Fixed #11017: noUselessUndefined no longer reports return undefined when the enclosing function has a return type annotation other than undefined or void.
- #11234 caefe39 Thanks @subotac! - Fixed #11228: CSS block comments between a declaration colon and value now preserve their source indentation.
:root {
--font-stack:
-/* comment */
+ /* comment */
system-ui;
}
- #11285 bca1f73 Thanks @denbezrukov! - Fixed #11280: CSS formatting keeps comments inside functional pseudo-classes and pseudo-elements instead of moving them before the function name.
-:/* comment */ where(div) {}
+:where(/* comment */ div) {}
- #11080 af16a0b Thanks @dyc3! - HTML style attribute values are now parsed as CSS. All Biome CSS lint rules are applied to the style attributes.
- #11195 6a85588 Thanks @dyc3! - Fixed Svelte files failing to parse when an expression begins with an object literal.
Now the following snippet is correctly parsed:
<p>{{ a: true }}</p>
<div class={{ active: isActive }}></div>
- #11173 481d008 Thanks @Austin1serb! - Fixed #10242: JavaScript GritQL patterns with multiple metavariables now match snippets consistently in WebAssembly.
- #11187 23c0369 Thanks @ematipico! - Added the nursery rule noInvalidPropertyInitValue, which reports an @property whose initial-value does not match its syntax descriptor. For example, the following declaration triggers the rule because red is not a <length>:
@property --size {
syntax: "<length>";
inherits: false;
initial-value: red;
}
- #11272 73896e6 Thanks @ematipico! - Improved the diagnostic emitted by noRootType.
- #11240 bd0b68d Thanks @ematipico! - Fixed #11223: Improved the
performance of noMisusedPromises
when analyzing async class methods that call other methods through this.
- #11172 4a0bc5c Thanks @saberoueslati! - Fixed #10806: noUselessFragments no longer causes Biome to panic when its unsafe fix removes a fragment used as a JSX attribute value.
- #11227 4d603b0 Thanks @saberoueslati! - Fixed #11178: noUndeclaredVariables no longer reports Vue's built-in instance properties, such as $slots and $attrs, in template expressions or $event in inline event-handler expressions. The instance properties are still reported inside <script setup>, where they are not defined.
- #11187 23c0369 Thanks @ematipico! - Fixed CSS parsing of registered custom properties: Biome now correctly validates the syntax descriptor of @property rules.

What's Changed
- feat(service): treat html style attributes as CSS by @dyc3 in #11080
- feat: code review skill by @ematipico in #11235
- refactor(inference): prepare legacy type removal by @ematipico in #11010
- fix(lint/noUselessFragments): panic when fixing a fragment used as a JSX attribute value by @saberoueslati in #11172
- ci: update codspeed crates by @ematipico in #11239
- feat(lint/js): add useReactCompiler by @dyc3 in #10710
- ci: fix windows builds by @dyc3 in #11245
- ci: enable longpaths in main.yml by @dyc3 in #11246
- fix(inference): query local types before global by @ematipico in #11240
- feat(lint/html): add noSvelteLegacyConst by @dyc3 in #11247
- fix(useAwait): treat await using as an async operation by @Turtle-Hwan in #11252
- feat(css): support SCSS nesting combinator by @denbezrukov in #11243
- feat: mark
2.5.7 4 d’agost del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.5.7

Patch Changes
- #10822 c171b3b Thanks @pkallos! - Added the option ignoreIfStatements to useNullishCoalescing. Biome now flags if statements that only assign to a nullish variable (such as if (!a) { a = b }) and can rewrite them to ??=. When enabled, Biome ignores those if statements.
- #11136 e63354c Thanks @AkashNaickar! - Added a new nursery rule noExtendNative, which reports extending the prototype of a built-in object.
- #10094 e007143 Thanks @THEjacob1000! - Added the nursery rule noTailwindArbitraryValue. Biome now reports Tailwind CSS arbitrary values such as w-[400px], including in HTML/JSX class attributes, configured utility functions, and tagged templates.
- #11184 135f476 Thanks @subotac! - Fixed #11176: noUnknownPseudoClass now recognizes Vue's :deep() pseudo-class inside .vue style blocks.
- #8239 a519f9d Thanks @cormacrelf! - Fixed #8233, where Biome CLI in
stdin mode didn't work correctly when handling files in projects with nested
configurations. For example, with the following structure,
--stdin-file-path=subdirectory/... would not use the nested configuration in
subdirectory/biome.json:
├── biome.json
└── subdirectory
├── biome.json
└── lib.js
biome format --write --stdin-file-path=subdirectory/lib.js < subdirectory/lib.js
Now, the nested configuration is correctly picked up and applied.
In addition, Biome now shows a warning if --stdin-file-path is provided but
that path is ignored and therefore not formatted or fixed.
- #11138 8c2c6bd Thanks @ematipico! - Fixed noUnnecessaryConditions: Biome now chooses the same function overload as TypeScript when an argument is a callback, so conditions that were previously missed are reported.
The following code is now invalid, because a parameter typed () => void accepts an async callback and schedule therefore returns string:
declare function schedule(handler: () => void): string;
declare function schedule(handler: () => Promise<void>): string | undefined;
schedule(async () => {}) ?? "fallback";
The following code is also now invalid, because map(() => 42) returns 42:
type Mapper<T> = () => T;
declare function map<T>(mapper: Mapper<T>): T;
map(() => 42) || flag;
- #11138 8c2c6bd Thanks @ematipico! - Fixed #11087: noUnnecessaryConditions no longer reports optional chains and nullish coalescing whose receiver can be nullish.
For example, the optional chain and fallback in the following code are no longer reported:
declare const usage: { range: { startDate: string } } | null;
const startDate = usage?.range.startDate ?? "N/A";
- #11118 9c16840 Thanks @subotac! - Fixed #11098: The HTML formatter now preserves the configured trailing newline when a file ends with a comment.
-<!-- trailing comment -->
\ No newline at end of file
+<!-- trailing comment -->
- #11201 0e80610 Thanks @Bishwas-py! - Fixed #11182: suppression comments for noPositiveTabindex now suppress the rule in HTML files when the attributes of the element span multiple lines.
- #11079 607afd2 Thanks @dyc3! - The HTML formatter now lays out the srcset attribute of <img> and <source> as the list of candidates it is. Runs of whitespace between candidates collapse, and once the list no longer fits on one line each candidate goes on its own line with the descriptors aligned:
- <img srcset="/visual@0.5.png 400w, /visual.png 805w, /visual@2x.png 1610w, /visual@3x.png 2415w" />
+ <img
+ srcset="
+ /visual@0.5.png 400w,
+ /visual.png 805w,
+ /visual@2x.png 1610w,
+ /visual@3x.png 2415w
+ "
+ />
- #11156 fed72c7 Thanks @saberoueslati! - Fixed #11129: noUnusedVariables no longer reports Vue bindings as unused when they are assigned through automatically unwrapped template refs.
- #11124 d890b39 Thanks @denbezrukov! - Fixed CSS formatting of line comments between a declaration colon and value to preserve their source indentation.
.test {
background:
- /////// foo
- // bar
+ /////// foo
+ // bar
radial-gradient(circle, #000, transparent);
}
- #11113 3d8ab73 Thanks @denbezrukov! - Fixed CSS formatting of long block 
2.5.6 28 de juliol del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.5.6

Patch Changes
- #11035 0e4b03b Thanks @ematipico! - Fixed a performance regression in noMisusedPromises that caused type inference to run repeatedly while linting a file.
- #11043 22ec076 Thanks @denbezrukov! - Fixed CSS formatting for multiline function arguments preceded by comments:
.example {
value: outer(
1,
/* comment */
nested(
- first,
- second
- )
+ first,
+ second
+ )
);
}
- #11007 c9acb25 Thanks @BTF-Kabir-2020! - Fixed #9195: useHookAtTopLevel no longer reports hooks in named forwardRef components that receive a ref parameter.
- #10152 50a9bd8 Thanks @Zelys-DFKH! - Fixed #10131: Biome now correctly parses curried arrow functions in ternary consequents when the inner arrow's parameters use a destructuring pattern, e.g. cond ? (x) => ({ a, b }) => body : alt.
- #11105 8ffe2b9 Thanks @dadavidtseng! - Fixed #11092: The noUselessTernary quick fix now preserves operator spacing when simplifying or inverting boolean ternary expressions.
- #10533 5809875 Thanks @Mokto! - Fixed #10515: biome check --write was not idempotent on Svelte files — multi-line template literals in <script> blocks and block comments in <style> blocks gained an extra indent level on every run.
- #11040 0abb620 Thanks @Mokto! - Fixed an issue where the HTML formatter would duplicate a comment placed directly before a Svelte {@const ...} or {@debug ...} block. The duplication compounded on every subsequent --write, causing the file to grow exponentially.
- #10858 6d18204 Thanks @ruidosujeira! - Fixed #10839: Svelte {#each} array destructuring no longer includes spaces inside square brackets, and multiline bind function expressions now indent their getter, setter, and function body correctly.
- #11009 2c36626 Thanks @ematipico! - Improved the accuracy of type-aware lint rules by resolving more inferred types. For example, noFloatingPromises now detects floating Promises returned by aliased callbacks and arrays of Promises created by async mapping callbacks.
The following statements are now reported:
type AsyncCallback = () => Promise<void>;
declare const callback: AsyncCallback;
callback();
[1, 2, 3].map(async (value) => value);
- #10973 9cb044c Thanks @ematipico! - Fixed false positives in noMisleadingReturnType when generic-constraint, normalization, substitution, or structural return-type comparison cannot complete. The rule now suppresses diagnostics rather than suggesting a return type derived from partial information. For example, this unresolved return type is no longer reported:
function unresolvedReturnType(): MissingType {
return "value" as const;
}
- #11071 15047a2 Thanks @dyc3! - The HTML parser now accepts mixed-case doctype declarations.
- #11030 cc90e65 Thanks @marschattha! - The rdjson reporter now populates the severity field of each diagnostic (ERROR, WARNING, or INFO), so tools consuming Reviewdog Diagnostic Format output no longer need to assume a default severity.
- #11009 2c36626 Thanks @ematipico! - Fixed a performance regression in type-aware JavaScript lint rules by inferring only requested types and memoizing export resolution.
- #11056 903b177 Thanks @dyc3! - Added support for Svelte declaration tags using let and const. Biome can now parse, format, and lint bindings declared in these tags.
- #11045 89c27c6 Thanks @ematipico! - Improved the performance of Biome formatter up to ~7% across the board.
- #9806 781d68d Thanks @dyc3! - Added the nursery rule noJsRestrictedProperties, which ports ESLint's no-restricted-properties rule. Biome now flags restricted member access and object destructuring, and biome migrate eslint preserves the rule's options.

What's Changed
- refactor(lint): extract return type relation by @ematipico in #10973
- refactor(inference): separate raw type collection by @ematipico in #11003
- fix(linter): recognize forwardRef named components with ref params by @BTF-Kabir-2020 in #11007
- fix(html_formatter): match prettier for svelte each as destructuring … by @ruidosujeira in #10858
- fix(cli): popul
2.5.5 21 de juliol del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.5.5

Patch Changes
- #10972 ab8c21b Thanks @ematipico! - Fixed useExhaustiveSwitchCases for unions of bigint literals. The rule now reports missing bigint cases and compares bigint literals by value, including binary, octal, hexadecimal, and separator-containing spellings. For example, this switch now reports the missing 2n case:
declare const value: 1n | 2n;
switch (value) {
case 1n:
break;
}
- #10972 ab8c21b Thanks @ematipico! - Fixed false positives in noBaseToString and useNullishCoalescing when member, stringification, or nullish inference cannot complete. These rules now suppress diagnostics instead of reporting from partial type information. For example, neither expression is reported when a recursive type cannot be fully resolved:
type Recursive = Recursive;
declare const value: Recursive;
String(value);
value || "fallback";
- #10977 0bf7486 Thanks @ematipico! - Fixed #10922: the action useSortedAttributes no longer triggers for HTML instructions.
- #10957 cf263c4 Thanks @dyc3! - Fixed noThenProperty failing to detect Object.fromEntries, Object.defineProperty, and Reflect.defineProperty calls with comments between their tokens.
- #10983 edc0ed7 Thanks @ayaangazali! - Fixed #10980: useAriaPropsSupportedByRole no longer reports false positives when the attribute that determines an element's implicit ARIA role is written as a shorthand attribute, such as <a {href} aria-label="..."> in Astro and Svelte files.
Shorthand attributes are now taken into account when computing the implicit role, so the anchor above correctly resolves to the link role instead of generic.
- #10889 89526e3 Thanks @denbezrukov! - Fixed CSS formatter casing for syntax-owned names while preserving author-defined names, including scoped keyframes and container scroll-state queries.
- A:HOVER { COLOR: INITIAL; }
+ A:hover { color: initial; }
- @KEYFRAMES :GLOBAL KeepFrames { FROM { COLOR: RED; } }
+ @keyframes :GLOBAL KeepFrames { from { color: RED; } }
- @CONTAINER scroll-state((SCROLLED: TOP) AND (STUCK)) { A:HOVER { COLOR: RED; } }
+ @container scroll-state((SCROLLED: TOP) AND (STUCK)) { A:hover { color: RED; } }
- #10964 794ccd0 Thanks @denbezrukov! - Fixed CSS formatting for comments between declaration values and !important.
-a { color: /* before */ /* after */ red !important; }
+a { color: /* before */ red /* after */ !important; }
- #10993 b7a9694 Thanks @denbezrukov! - Fixed the CSS formatter to preserve comments on the correct side of selector combinators and before declaration blocks.
-.before > /* comment */ .after {}
+.before /* comment */ > .after {}
It now also keeps selectors with escaped newlines in attribute values inline when they fit.
-div
- span[foo="bar\
+div span[foo="bar\
value"] {}
- #10978 8ebafe1 Thanks @ematipico! - Fixed #10870: noUnresolvedImports no longer reports false positives such as import type { NextRequest } from "next/server".
- #10901 68c10e6 Thanks @Socialpranker! - Fixed #10622: the HTML/Vue parser no longer panics on the argument-less v-bind shorthand (:="props").
This syntax is valid Vue and equivalent to v-bind="props", so the parser now accepts it (along with the longhand v-bind:="props") instead of crashing while building a diagnostic for a missing argument.
- #10936 7df46f5 Thanks @ematipico! - Improved generic tuple inference for useIncludes. The rule now recognizes specialised tuple element types returned through generic aliases.
- #10941 f787725 Thanks @siketyan! - Fixed #10855: Biome now supports parsing and formatting CSS custom media queries declared with @custom-media.
- #10969 72d309b Thanks @ematipico! - Fixed an issue where Biome logs became too verbose, dumping information not relevant to user's operations.
- e62f6b6 Thanks @ematipico! - Fixed #10963: Biome no longer panics when a type-aware rule such as noFloatingPromises checks a call to a function with multiple call signatures imported from another module.
- #10931 899c60d Thanks @ematipico! - Fixed check --write command. Now the command re
2.5.4 15 de juliol del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.5.4

Patch Changes
- #10665 55ff995 Thanks @dyc3! - Improved the performance of the HTML parser slightly in our synthetic benchmarks.
- #10894 f4fb10e Thanks @ematipico! - Fixed #6392: On-type formatting no longer moves comments before an if statement into its body.
- #10939 f2799db Thanks @Netail! - Fixed #10930: noLabelWithoutControl now correctly detects text interpolation in Astro, Svelte & Vue as valid accessible content.
- #10945 ae15d98 Thanks @Netail! - Fixed #10942: Svelte directives don't throw an accidental debug log anymore.
- #10842 5e1abfe Thanks @JamBalaya56562! - Fixed #9196: biome check --write --unsafe no longer hangs forever when applying the noCommentText code fix.
The rule's fix now wraps the comment in a real JSX expression container ({/* comment */}) instead of re-inserting the braces as plain JSX text, so the fixed code is no longer reported again by the same rule.
- #10891 ecca79e Thanks @ematipico! - Fixed #10885: prevented a module-inference regression introduced by a housekeeping change.
- #10886 60c8043 Thanks @dyc3! - Fixed #10727: Biome now breaks the arguments of curried test.each, it.each, describe.each, and test.for calls when they exceed the configured line width.
- test.each([[1, 2]])("a description that is long enough to push the hugged opening line beyond the print width", (a, b) => {
- expect(a).toBe(b);
- });
+ test.each([[1, 2]])(
+ "a description that is long enough to push the hugged opening line beyond the print width",
+ (a, b) => {
+ expect(a).toBe(b);
+ },
+ );
- #10895 01a85f0 Thanks @ematipico! - Biome will now remove stale Unix daemon sockets from older Biome versions when starting a newer daemon.

What's Changed
- feat(yml/fmt): basic block properties by @ematipico in #10873
- feat(useSortedClasses): sort important-suffix classes in sort_v4 by @johncarmack1984 in #10880
- fix(format/js): wrap curried test each calls by @dyc3 in #10886
- fix(markdown): parse whitespace after list markers by @tidefield in #10869
- fix(inference): use correct function when cloning data by @ematipico in #10891
- docs(noDuplicateProperties): note that @Keyframes declarations are ignored by @dfedoryshchev in #10893
- fix(lint): prevent noCommentText fix from looping forever by @JamBalaya56562 in #10842
- fix(core): cleanup old sockets in Unix by @ematipico in #10895
- feat(inference): inference engine via salsa by @ematipico in #10888
- chore(deps): update dependency @types/node to v24.13.3 by @renovate[bot] in #10920
- chore(deps): update github-actions by @renovate[bot] in #10921
- chore(deps): update pnpm to v11.11.0 by @renovate[bot] in #10925
- chore(deps): update rust crate jiff to 0.2.32 by @renovate[bot] in #10923
- chore(deps): update rust crate regex to 1.13.0 by @renovate[bot] in #10926
- fix(fmt): don't move comments inside if statement by @ematipico in #10894
- fix(html_analyze): noLabelWithoutControl interpolation by @Netail in #10939
- refactor(parse/html): keywords for all html/svg tags by @dyc3 in #10665
- perf(lint/html): avoid string comparisons for tag names by @dyc3 in #10692
- fix: accidental debug log by @Netail in #10945
- ci: release by @github-actions[bot] in #10887
Full Changelog: https://github.com/biomejs/biome/compare/@biomejs/biome@2.5.3...@biomejs/biome@2.5.4
2.5.3 8 de juliol del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.5.3

Patch Changes
- #10815 86613d5 Thanks @WaterWhisperer! - Fixed a parser panic reported in #10708: Biome now recovers when unsupported CSS Modules @value rules or scoped @keyframes names end at EOF.
- #10534 da9b403 Thanks @Mokto! - Fixed noUnusedVariables false positives in Svelte files: Svelte store subscriptions ($store references in templates now keep the underlying store binding from being flagged), and $bindable() props that are only written to in the script block (write-only is intentional for bindable props) are no longer reported as unused.
- #10827 098ba41 Thanks @Aqu1bp! - Fixed #10698: The noUnsafeOptionalChaining rule now reports unsafe optional chains wrapped in TypeScript as, satisfies, type assertion, and instantiation expressions, such as new (value?.constructor as Constructor)().
- #10773 3c6513d Thanks @otkrickey! - Fixed #10772: useVueValidVOn no longer reports a missing handler for v-on directives using a verb modifier (.stop / .prevent) without an expression, e.g. <div @click.stop></div>. The rule also accepts the arg-less object syntax <div v-on="$listeners"></div> instead of reporting a missing event name.
- #10721 d83c66b Thanks @minseong0324! - Improved type-aware lint rule inference for built-in globals and indexed function calls. Biome now resolves Error(...), new Error(...), optional Error#stack, and calls through indexed function values such as handlers[0]() more accurately.
- #10865 6450276 Thanks @ematipico! - Fixed #10845. Biome Language Server no longer goes in deadlock when the scanner is enabled.
- #10853 93d8e53 Thanks @Netail! - Fixed #10840: Astro shorthand attribute syntax is now correctly being parsed from embedded nodes.
- #10820 bba3092 Thanks @JamBalaya56562! - Fixed #10619: noProcessEnv now also reports computed (bracket) member access. Previously only dot access was checked, so process["env"] and env["NODE_ENV"] (where env is imported from node:process) were missed. Both static and computed accesses are now reported.
- #10835 3447b2f Thanks @dyc3! - Fixed #10824: useDomQuerySelector now supports an ignore option for receiver identifiers that should not be reported.
- #10875 b12e486 Thanks @dyc3! - Fixed #10795: --profile-rules now reports timings for each plugin separately as plugin/<pluginName>, matching the naming used by plugin suppressions, instead of aggregating all plugins under a single plugin/plugin entry.
- #10877 d6bc447 Thanks @ematipico! - Fixed biome-zed#164: Biome no longer inserts stray whitespace when format-on-type runs after closing delimiters such as ), ], and }.
- #10867 a21463e Thanks @dyc3! - Fixed #10864: Biome no longer crashes when checking or linting HTML files with unquoted attribute values such as <textarea rows=4></textarea>.

What's Changed
- fix(useVueValidVOn): allow verb-modifier-only handlers and object syntax by @otkrickey in #10773
- fix(css_parser): recover CSS Modules syntax at EOF by @WaterWhisperer in #10815
- feat(fmt/yaml): sequence mapping by @ematipico in #10814
- fix(lint): handle TypeScript wrappers in unsafe optional chains by @Aqu1bp in #10827
- fix(lint): report computed member access in noProcessEnv by @JamBalaya56562 in #10820
- ci: ignore quick-xml RustSec advisories by @JamBalaya56562 in #10831
- perf(core): embedded ranges plumbing by @ematipico in #10836
- feat(md/fmt): more compatibility gains by @ematipico in #10833
- chore(xtask): migrate Error global type by @minseong0324 in #10721
- fix(lint): suppress false positives in noUnusedVariables for Svelte store subscriptions and $bindable() props by @Mokto in #10534
- refactor(md/parse): reduce emitted nodes by @ematipico in #10847
- feat(md/fmt): quotes, thematic breaks and link definition by @ematipico in #10844
- refactor(md/parse): parse HTML into one single node by @ematipico in #10848
- docs(noMissingVarFunction): list container-name in ignored properties by @dfedoryshchev in #10852
- refactor(md/parse): fold code content lines and indentation runs by @ematipico in #
2.5.2 1 de juliol del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.5.2

Patch Changes
- #10595 f458028 Thanks @pkallos! - Added the option ignoreBooleanCoercion to useNullishCoalescing. When enabled, Biome ignores || and ||= used inside a Boolean() call, where coalescing on falsy values is intentional.
- #10798 4a32b63 Thanks @pkallos! - Added the option ignorePrimitives to useNullishCoalescing. When enabled, Biome ignores ||, ||=, and ternary expressions whose non-nullish operands are all primitives the option opts out of. Use true to ignore all primitives, or an object selecting string, number, boolean, or bigint.
- #10545 f3d4c00 Thanks @Mokto! - Added the new nursery rule noSvelteUnnecessaryStateWrap, which reports unnecessary $state() wrapping of classes from svelte/reactivity that are already reactive.
<script>
import { SvelteMap } from "svelte/reactivity";
const map = $state(new SvelteMap()); // redundant
</script>
- #10752 f62fb8b Thanks @ematipico! - Fixed #10739. Now the rule useValidAutocomplete correctly flags the autoComplete attribute.
- #10796 f1b3ab2 Thanks @ematipico! - Fixed #10768. Improved the performance of the Biome Language Server by cancelling certain in-flight operations when there are fast updates.
- #10719 aa649b5 Thanks @minseong0324! - Fixed noMisleadingReturnType false positive on returns that use a widening type assertion: "a" as string is no longer reported as misleading. The rule now also reports a literal-pinning assertion such as false as false, matching the existing as const behavior.
// No longer flagged (returns are `string`):
function getValue(b: boolean): string {
if (b) return "a" as string;
return "b" as string;
}
// Now also reported, like `as const` (returns `false`):
function isReady(): boolean {
return false as false;
}
- #10678 8f073a7 Thanks @PranavAchar01! - Fixed #7718: Biome now correctly parses CSS nesting selectors when & appears as a trailing sub-selector after a type selector, e.g. h1& { color: red; }.
- #10756 5ec965a Thanks @denbezrukov! - Fixed CSS formatter output for selector lists with allowWrongLineComments and // comments after a selector comma. Biome now keeps the selector before the line comment inline instead of breaking it across descendant combinators.
-.powerPathNavigator
- .helm
- button.pressedButton, // pressed
+.powerPathNavigator .helm button.pressedButton, // pressed
.powerPathNavigator .helm button:active:not(.disabledButton) {
}
- #10757 6232fcd Thanks @PranavAchar01! - Fixed #8269: the CSS parser now accepts Tailwind @variant and @utility names that start with a digit, such as the 2xl breakpoint.
@utility container {
@variant 2xl {
max-width: 1400px;
}
}
- #10777 575ced6 Thanks @WaterWhisperer! - Fixed an issue reported in #10708: the GitLab reporter now handles --verbose diagnostics filtering correctly.
- #10281 0efe244 Thanks @Zelys-DFKH! - Fixed a bug where GritQL patterns rejected positional (unkeyed) arguments.
- #10758 e36fd8a Thanks @henrybrewer00-dotcom! - Fixed #10697: The formatter no longer removes the parentheses around an await or yield expression used as the target of a TypeScript instantiation expression. For example, (await makeFactory)<Value> is no longer reformatted to await makeFactory<Value>, which would change the meaning of the code.
- #10586 3617094 Thanks @IxxyDev! - Fixed #9568: noFloatingPromises no longer reports a false positive when calling an overloaded function and the selected overload does not return a promise.
function bestEffort(cb: () => Promise<number>): Promise<number>;
function bestEffort(cb: () => number): number;
function bestEffort(
cb: () => number | Promise<number>,
): Promise<number> | number {
return cb() as Promise<number> | number;
}
// This resolves to the second overload, which returns `number`, so it is no
// longer flagged as a floating promise.
bestEffort(() => 42);
- #10766 7aff4c1 Thanks @JamBalaya56562! - Fixed #2862: noInteractiveElementToNoninteractiveRole no longer reports custom elements (a tag name containing a dash, e.g. <my-button role="img" />). Per t
2.5.1 23 de juny del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.5.1

Patch Changes
- #10722 f8a303d Thanks @denbezrukov! - Fixed CSS formatter output for comments between import media queries.
-@import url("print.css") print,
-/* comment */
-screen;
+@import url("print.css") print, /* comment */ screen;
- #10738 9fdc560 Thanks @JamBalaya56562! - Fixed #9899: the json and json-pretty reporters now escape backslashes in a diagnostic's location.path. Previously, paths containing backslashes (such as Windows-style paths) were emitted unescaped, producing invalid JSON.
- "path": "src\account\setup-passkey.tsx",
+ "path": "src\\account\\setup-passkey.tsx",
- #10626 5f837df Thanks @tom-groves! - Fixed #10625: biome migrate no longer emits an invalid trailing comma when a renamed rule (such as noConsoleLog → noConsole) is the last member of its rule group. Previously this produced malformed output that aborted the migration of a strict-JSON biome.json with a parsing error.
- #10535 c245f9d Thanks @Mokto! - Fixed a false positive in noUnusedVariables for Svelte files where variables referenced inside {@html expr} blocks were incorrectly reported as unused.
- #10668 a0f197e Thanks @Netail! - The biome init command has been updated to include a more up-to-date URL to the first-party extensions page.
- #10667 d8c3e87 Thanks @Netail! - Fixed #10664: useErrorCause now correctly detects a shorthand property.
- #10696 ef2373f Thanks @ematipico! - Fixed #9566. Improved how the Biome Language Server loads multiple configuration files inside a workspace.
- #10705 4ccb410 Thanks @ematipico! - Fixed #10652. Biome plugins are now properly filtered when using --only and --skip flags.
- #10669 aa0a6eb Thanks @Netail! - Fixed #10651: useInlineScriptId now correctly trims trivia to detect if an id attribute has been set.
- #10689 844b1be Thanks @ematipico! - Fixed #10658. The issue was caused by the "Go-to definition" editor feature, which was enabled by default. The feature is now disabled by default. To work, the feature triggers the scanner to build the module graph. This caused memory leak issues in cases where Biome starts in the home directory to modify files.
If you relied on this new feature, you must now turn on using the [editor settings] of the extension e.g. Zed and VSCode.
- #10695 043fbb5 Thanks @ematipico! - Fixed #10674. Biome now throws an error when the field level is missing from a rule option.
- #10712 5941df2 Thanks @Conaclos! - Improved the diagnostic and the documentation of useFlatMap.
- #10615 23814f1 Thanks @qwertycxz! - Improved the DX the JSON schema when it's used by certain code editors like VSCode.
- #10688 ec69489 Thanks @ematipico! - Fixed a bug where the Biome Daemon did not correctly shut down when the editor was closed during an in-progress operation, especially while scanning.
- #10701 6c2e0d7 Thanks @ematipico! - Fixed #10694. The Biome Language Server no longer prints an error when the user hovers a variable imported from node_modules.
- #10681 888515b Thanks @Conaclos! - Fixed useExportType that reported useless details in some diagnostics.
- #10220 3694a13 Thanks @theBGuy! - Fixed useAnchorContent false positive for <a> elements used as render prop values (e.g. render={<a href="..." />}), a pattern where the receiving component renders its children inside the anchor element.
- #10702 98823fb Thanks @ematipico! - Fixed #10612. The Biome parser now correctly parses processing instructions. The following SVG doesn't throw errors anymore:
<?xml version="1.0" encoding="UTF-8" ?>
<svg></svg>

What's Changed
- ci: use tombi from installed from toolchain by @ematipico in #10613
- docs: fix duplicate "being" in symlink test comments by @dfedoryshchev in #10611
- refactor(core): add biome_languages crate by @ematipico in #10590
- fix(migrate): avoid trailing comma when a renamed rule is last in its group by @tom-groves in #10626
- chore(deps): update rust:1.96.0-bullseye docker digest to e12c121 by @renovate[bot] in #10641
- chore(deps): update dependency @types/node to v24.13.2 by 
2.5.0 12 de juny del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.5.0

Minor Changes
- #9539 f0615fd Thanks @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 2056b23 Thanks @aviraldua93! - Added the useKeyWithClickEvents 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".
<!-- 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 9ec8500 Thanks @ematipico! - Added new nursery lint rule noUndeclaredClasses 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.
<!-- .typo is used but never defined -->
<html>
<head>
<style>
.button {
color: blue;
}
</style>
</head>
<body>
<div class="button typo"></div>
</body>
</html>
- #9152 9ec8500 Thanks @ematipico! - Added new nursery lint rule noUnusedClasses 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.
/* styles.css — .ghost is never used in any importing file */
.button {
color: blue;
}
.ghost {
color: red;
}
/* App.jsx */
import "./styles.css";
export default () => <div className="button" />;
- #9546 6567efa Thanks @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 701767a Thanks @faizkhairi! - Added the HTML version of the useHeadingContent rule. The rule now enforces that heading elements (h1-h6) have content accessible to screen readers in HTML, Vue, Svelte, and Astro files.
<!-- 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 f437ef8 Thanks @rahuld109! - Added the HTML version of the useKeyWithMouseEvents rule. The rule now enforces that onmouseover is accompanied by onfocus and onmouseout is accompanied by onblur in HTML, Vue, Svelte, and Astro files.
<!-- Invalid: onmouseover without onfocus -->
<div onmouseover="handleMouseOver()"></div>
<!-- Valid: onmouseover paired with onfocus -->
<div onmouseover="handleMouseOver()" onfocus="handleFocus()"></div>
- #9275 1fdbcee Thanks @ff1451! - Added the new assist action useSortedTypeFields, 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 78075b7 Thanks @Conaclos! - Added a new style option to useExportType,
which enforces a style for exporting types.
This is the same option as the one provid
2.4.16 27 de maig del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.4.16

Patch Changes
- #10329 ef764d5 Thanks @Conaclos! - Fixed an issue where diagnostics showed an incorrect location in Astro files.
- #10363 50aa415 Thanks @dyc3! - Fixed HTML formatting for a case where comments could cause the formatter to split up a closing tag, which would cause the resulting HTML to be syntactically invalid.
Input:
<span
><!-- 1
--><span>a</span
><!-- 2
--><span>b</span
><!-- 3
--></span>
Output:
<span
><!-- 1
- --> <span>a</span<!-- 2
- --> ><span>b</span><!-- 3
+ --><span>a</span><!-- 2
+ --><span>b</span><!-- 3
--></span
>
- #10465 0c718da Thanks @dfedoryshchev! - Fixed diagnostics emitted by the noUntrustedLicenses rule.
- #10358 05c2617 Thanks @dyc3! - Fixed #10356: biome rage --linter now displays rules enabled through linter domains in the enabled rules list.
- #10300 950247c Thanks @dyc3! - Fixed #10265: Svelte function bindings such as bind:value={get, set} are now parsed more precisely, so noCommaOperator won't emit false positives for that syntax anymore.
- #9786 e71f584 Thanks @MeGaNeKoS! - Fixed #8480: useDestructuring now provides variableDeclarator and assignmentExpression options to control which contexts enforce destructuring, matching ESLint's prefer-destructuring configuration. Both default to {array: true, object: true}. The diagnostic for object destructuring in assignment expressions now instructs users to wrap the assignment in parentheses.
- #10425 1948b72 Thanks @sjh9714! - Fixed #10244: The useOptionalChain rule now detects negated guard inequality chains like !foo || foo.bar !== "x".
- #10442 001f94f Thanks @ematipico! - Fixed #10411: noMisusedPromises no longer causes a stack overflow when a nested function returns an object with shorthand properties that shadow destructured variables from an outer scope.
- #10318 9b1577f Thanks @dyc3! - Added support for formatter.trailingCommas in overrides. This option was previously available in the top-level formatter configuration but missing from formatter overrides.
- #10319 2e37709 Thanks @dyc3! - Fixed Vue and Svelte formatting for standalone interpolations in inline elements. Biome now preserves existing newlines in cases like:
- <span> {{ value }} </span>
+ <span>
+ {{ value }}
+ </span>
- #10365 0a58eb0 Thanks @Netail! - Fixed #10361: noUnusedFunctionParameters now mentions the parameter name in the diagnostic.
- #10439 df6b867 Thanks @denbezrukov! - Fixed CSS and SCSS formatting for comments around declaration colons so comments between property names, colons, and values stay at the same boundary as Prettier.
.selector {
- color: /* red, */
- blue;
+ color: /* red, */ blue;
}
- #10344 b30208c Thanks @siketyan! - Fixed #10123: Corrected the noReactNativeDeepImports source rule to point to the proper upstream rule, so users can migrate from the original rule correctly.
- #10328 b59133f Thanks @dyc3! - Fixed #10309: Biome no longer adds newlines to Astro frontmatter when linter or assist --write mode is enabled.

What's Changed
- fix(format/html/vue): preserve newlines around standalone interpolations by @dyc3 in #10319
- refactor(css_parser): remove allow_css_ratio from SCSS expression parsing functions by @denbezrukov in #10325
- fix(astro): display diagnostic advices with the correct location by @Conaclos in #10329
- fix: trim astro frontmatter content before processing it by @dyc3 in #10328
- fix(config): support trailingCommas in overrides by @dyc3 in #10318
- chore(deps): update rust:1.95.0-bullseye docker digest to b26cecc by @renovate[bot] in #10334
- chore(deps): update rust:1.95.0-trixie docker digest to 5b1e348 by @renovate[bot] in #10335
- chore(deps): update dependency @types/node to v24.12.3 by @renovate[bot] in #10336
- chore(deps): update dependency tombi to v0.10.6 by @renovate[bot] in #10337
- feat(css_parser): support for SCSS @include ... using clauses by @denbezrukov in #10327
- chore(deps): update github-actions by @renovate[bot] in #10338
- chore(deps): update pnpm to v10.33.4 by @renovate[bot] in #10339
-
2.4.15 9 de maig del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.4.15

Patch Changes
- #9394 ba3480e Thanks @dyc3! - Added the nursery rule useTestHooksInOrder in the test domain. The rule enforces that Jest/Vitest lifecycle hooks (beforeAll, beforeEach, afterEach, afterAll) are declared in the order they execute, making test setup and teardown easier to reason about.
- #10254 e0a54cc Thanks @dyc3! - Added a new nursery rule useVueNextTickPromise, which enforces Promise syntax when using Vue nextTick.
For example, the following snippet triggers the rule:
import { nextTick } from "vue";
nextTick(() => {
updateDom();
});
- #10219 64aee45 Thanks @dyc3! - Added a new nursery rule noVueVOnNumberValues, that disallows deprecated number modifiers on Vue v-on directives.
For example, the following snippet triggers the rule:
<input @keyup.13="submit" />
- #10195 7b8d4e1 Thanks @dyc3! - Added the new nursery rule useVueValidVFor, which validates Vue v-for directives and reports invalid aliases, missing component keys, and keys that do not use iteration variables.
- #10238 1110256 Thanks @dyc3! - Added the recommended nursery rule noVueImportCompilerMacros, which disallows importing Vue compiler macros such as defineProps from vue because they are automatically available.
- #10201 1a08f89 Thanks @realknove! - Fixed #10193: style/useReadonlyClassProperties no longer reports class properties as readonly-able when they are assigned inside arrow callbacks nested in class property initializers.
- #9574 3bd2b6a Thanks @Conaclos! - Fixed #9530. The diagnostics of organizeImports are now more detailed and more precise. They are also better at localizing where the issue is.
- #10205 a704a6c Thanks @Conaclos! - Fixed #10185. `organizeImports now errors when it encounters an unknown predefined group.
The following configuration is now reported as invalid because :INEXISTENT: is an unknown predefined group.
{
"assist": {
"actions": {
"source": {
"organizeImports": { "options": { "groups": [":INEXISTENT:"] } }
}
}
}
}
- #10052 b565bed Thanks @minseong0324! - Improved noMisleadingReturnType: it now flags union annotations whose extra variants are never returned, and suggests the narrower type (e.g. string | null → string).
These functions are now reported because null and number are included in the return annotations but never returned:
function getUser(): string | null {
return "hello";
} // null is never returned
function getCode(): string | number {
return "hello";
} // number is never returned
- #10213 ac30057 Thanks @dyc3! - Fixed #9450: HTML and Vue element formatting now preserves child line breaks when an element contains another element child on its own line, instead of collapsing the child element onto the same line.
- #10275 9ee6c03 Thanks @solithcy! - Fixed #10274: Svelte templates with missing expressions no longer parsed as HtmlBogusElement
- #10143 56798a7 Thanks @minseong0324! - noMisleadingReturnType now detects misleading return type annotations when object literal properties are initialized with as const.
This function is now reported because the return annotation widens a property initialized with as const:
function f(): { value: string } {
return { value: "text" as const };
}
- #10143 56798a7 Thanks @minseong0324! - noUselessTypeConversion now detects redundant conversions on object literal properties initialized with as const.
This conversion is now reported because message.value is inferred as a string literal:
const message = { value: "text" as const };
String(message.value);
- #9807 0ae5840 Thanks @dyc3! - Added the new nursery rule useThisInClassMethods, based on ESLint's class-methods-use-this.
The rule now reports instance methods, getters, setters, and function-valued instance fields that do not use this, and biome migrate eslint preserves the supported ignoreMethods, ignoreOverrideMethods, and ignoreClassesWithImplements options.
Invalid:
class Foo {
bar() {
// does not use `this`, invalid
console.log("Hello Biome");
}
}
- #10258 e7b18f7 Thanks @ematipico! - Improved linter performan
2.4.14 1 de maig del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.4.14

Patch Changes
- #9393 491b171 Thanks @dyc3! - Added the nursery rule useTestHooksOnTop 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 eefc5ab Thanks @dyc3! - Fixed #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 0e9f569 Thanks @minseong0324! - noMisleadingReturnType 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:
function f(): object {
return { retry: true };
}
- #10116 53269eb Thanks @jiwon79! - Fixed #6201: noUselessEscapeInRegex 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 33d8543 Thanks @Conaclos! - Fixed #9097: organizeImports no longer adds a blank line between a never-matched group and a matched group.
Given the following organizeImports options:
{
"groups": [":NODE:", ":BLANK_LINE:", ":PACKAGE:", ":BLANK_LINE:", ":PATH:"]
}
The following code...
// Comment
import "package";
import "./file.js";
...was organized as:
+
// 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:
// Comment
import "package";
+
import "./file.js";
- #10138 a10b6c1 Thanks @dyc3! - Fixed Vue v-for handling for noUndeclaredVariables and noUnusedVariables. Biome now recognizes variables declared by v-for directives and references to iterated values in Vue templates.
- #10115 d428d76 Thanks @minseong0324! - noMisleadingReturnType no longer reports false positives when a union return type's boolean variant is covered by both true and false returns.
- #9922 7acf1e0 Thanks @dyc3! - Added the new nursery rule noReactStringRefs, 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 f3e76ab Thanks @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 8a40ef8 Thanks @dyc3! - Fixed #10011: The noThisInStatic 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 6867e96 Thanks @jiwon79! - Fixed #9884: The useSortedAttributes 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 d29dd19 Thanks @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 5d8fdac Thanks @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:
{#each numbers as number, index (number.toString())}
<p>{number}</p>
{/each}
{#each numbers as number (ke
2.4.13 23 d’abril del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.4.13

Patch Changes
- #9969 c5eb92b Thanks @officialasishkumar! - Added the nursery rule noUnnecessaryTemplateExpression, 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:
const a = `${"hello"}`; // can be 'hello'
const b = `${"prefix"}_suffix`; // can be 'prefix_suffix'
const c = `${"a"}${"b"}`; // can be 'ab'
- #10037 f785e8c Thanks @minseong0324! - Fixed #9810: noMisleadingReturnType no longer reports false positives on a getter with a matching setter in the same namespace.
class Store {
get status(): string {
if (Math.random() > 0.5) return "loading";
return "idle";
}
set status(v: string) {}
}
- #10084 5e2f90c Thanks @jiwon79! - 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.
The following pattern is now considered valid:
/[a-z\&]/v;
- #10063 c9ffa16 Thanks @Netail! - Added extra rule sources from ESLint CSS. biome migrate eslint should do a bit better detecting rules in your eslint configurations.
- #10035 946b50e Thanks @Netail! - Fixed #10032: useIframeSandbox now flags if there's no initializer value.
- #9865 68fb8d4 Thanks @dyc3! - Added the new nursery rule useDomNodeTextContent, which prefers textContent over innerText for DOM node text access and destructuring.
For example, the following snippet triggers the rule:
const foo = node.innerText;
- #10023 bd1e74f Thanks @ematipico! - Added a new nursery rule noReactNativeDeepImports 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:
import View from "react-native/Libraries/Components/View/View";
- #9885 3dce737 Thanks @dyc3! - Added a new nursery rule useDomQuerySelector that prefers querySelector() and querySelectorAll() over older DOM query methods such as getElementById() and getElementsByClassName().
- #9995 4da9caf Thanks @siketyan! - Fixed #9994: Biome now parses nested CSS rules correctly when declarations follow them inside embedded snippets.
- #10009 b41cc5a Thanks @Jayllyz! - Fixed #10004: noComponentHookFactories no longer reports false positives for object methods and class methods.
- #9988 eabf54a Thanks @Netail! - Tweaked the diagnostics range for useAltText, useButtonType, useHtmlLang, useIframeTitle, useValidAriaRole & useIfameSandbox to report on the opening tag instead of the full tag.
- #10043 fc65902 Thanks @mujpao! - Fixed #10003: Biome no longer panics when parsing Svelte files containing {#}.
- #9815 5cc83b1 Thanks @dyc3! - Added the new nursery rule noLoopFunc. When enabled, it warns when a function declared inside a loop captures outer variables that can change across iterations.
- #9702 ef470ba Thanks @ryan-m-walker! - Added the nursery rule useRegexpTest 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
if ("hello world".match(/hello/)) {
}
Valid
if (/hello/.test("hello world")) {
}
- #9743 245307d Thanks @leetdavid! - Fixed #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 0707de7 Thanks @Conaclos! - Fixed #10038: organizeImports now sorts imports in TypeScript modules and declaration files.
declare module "mymodule" {
- import type { B } from "b";
import type { A } from "a";
+ import type { B } from "b";
}
- #10012 94ccca9 Thanks @ematipico! - Added the nursery rule
2.4.12 14 d’abril del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.4.12

Patch Changes
- #9376 9701a33 Thanks @dyc3! - Added the nursery/noIdenticalTestTitle lint rule. This rule disallows using the same title for two describe blocks or two test cases at the same nesting level.
describe("foo", () => {});
describe("foo", () => {
// invalid: same title as previous describe block
test("baz", () => {});
test("baz", () => {}); // invalid: same title as previous test case
});
- #9889 7ae83f2 Thanks @dyc3! - Improved the diagnostics for useForOf to better explain the problem, why it matters, and how to fix it.
- #9916 27dd7b1 Thanks @Jayllyz! - Added a new nursery rule noComponentHookFactories, that disallows defining React components or custom hooks inside other functions.
For example, the following snippets trigger the rule:
function createComponent(label) {
function MyComponent() {
return <div>{label}</div>;
}
return MyComponent;
}
function Parent() {
function Child() {
return <div />;
}
return <Child />;
}
- #9980 098f1ff Thanks @ematipico! - Fixed #9941: Biome now emits a warning diagnostic when a file exceed the files.maxSize limit.
- #9942 9956f1d Thanks @dyc3! - Fixed #9918: useConsistentTestIt no longer panics when applying fixes to chained calls such as test.for([])("x", () => {});.
- #9891 4d9ac51 Thanks @dyc3! - Improved the noGlobalObjectCalls diagnostic to better explain why calling global objects like Math or JSON is invalid and how to fix it.
- #9902 3f4d103 Thanks @ematipico! - Fixed #9901: the command lint --write is now idempotent when it's run against HTML-ish files that contains scripts and styles.
- #9891 4d9ac51 Thanks @dyc3! - Improved the noMultiStr diagnostic to explain why escaped multiline strings are discouraged and what to use instead.
- #9966 322675e Thanks @siketyan! - Fixed #9113: Biome now parses and formats @media and other conditional blocks correctly inside embedded CSS snippets.
- #9835 f8d49d9 Thanks @bmish! - The noFloatingPromises rule now detects floating promises through cross-module generic wrapper functions. Previously, patterns like export const fn = trace(asyncFn) — where trace preserves the function signature via a generic <F>(fn: F): F — were invisible to the rule when the wrapper was defined in a different file.
- #9981 02bd8dd Thanks @siketyan! - Fixed #9975: Biome now parses nested CSS selectors correctly inside embedded snippets without requiring an explicit &.
- #9949 e0ba71d Thanks @Netail! - Added the nursery rule useIframeSandbox, which enforces the sandbox attribute for iframe tags.
Invalid:
<iframe></iframe>
- #9913 d417803 Thanks @Netail! - Added the nursery rule noJsxNamespace, which disallows JSX namespace syntax.
Invalid:
<ns:testcomponent />
- #9892 e75d70e Thanks @dyc3! - Improved the noSelfCompare diagnostic to better explain why comparing a value to itself is suspicious and what to use for NaN checks.
- #9861 2cff700 Thanks @dyc3! - Added the new nursery rule useVarsOnTop, which requires var declarations to appear at the top of their containing scope.
For example, the following code now triggers the rule:
function f() {
doSomething();
var value = 1;
}
- #9892 e75d70e Thanks @dyc3! - Improved the noThenProperty diagnostic to better explain why exposing then can create thenable behavior and how to avoid it.
- #9892 e75d70e Thanks @dyc3! - Improved the noShorthandPropertyOverrides diagnostic to explain why later shorthand declarations can unintentionally overwrite earlier longhand properties.
- #9978 4847715 Thanks @mdevils! - Fixed #9744: useExhaustiveDependencies no longer reports false positives for variables obtained via object destructuring with computed keys, e.g. const { [KEY]: key1 } = props.
- #9892 e75d70e Thanks @dyc3! - Improved the noRootType diagnostic to better explain that the reported root type is disallowed by project configuration and how to proceed.
- #9927 7974ab7 Thanks @dyc3! - Added eslint-plugin-unicorn's no-nested-ternary as a rule source for noNestedTernary
- #9873 19ff706 Thanks @minseong0324! - noMisleadin
2.4.11 9 d’abril del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.4.11

Patch Changes
- #9350 4af4a3a Thanks @dyc3! - Added the new nursery rule useConsistentTestIt in the test domain. The rule enforces consistent use of either it or test for test functions in Jest/Vitest suites, with separate control for top-level tests and tests inside describe blocks.
Invalid:
test("should fly", () => {}); // Top-level test using 'test' flagged, convert to 'it'
describe("pig", () => {
test("should fly", () => {}); // Test inside 'describe' using 'test' flagged, convert to 'it'
});
- #9429 a2f3f7e Thanks @ematipico! - Added the new nursery lint rule useExplicitReturnType. It reports TypeScript functions and methods that omit an explicit return type.
function toString(x: any) {
// rule triggered, it doesn't declare a return type
return x.toString();
}
- #9828 9e40844 Thanks @ematipico! - Fixed #9484: the formatter no longer panics when formatting files that contain graphql tagged template literals combined with parenthesized expressions.
- #9886 e7c681e Thanks @ematipico! - Fixed an issue where, occasionally, some bindings and references were not properly tracked, causing false positives from noUnusedVariables and noUndeclaredVariables in Svelte, Vue, and Astro files.
- #9760 5b16d18 Thanks @myx0m0p! - Fixed #4093: the noDelete rule no longer triggers for delete process.env.FOO, since delete is the documented way to remove environment variables in Node.js.
- #9799 2af8efd Thanks @minseong0324! - Added the rule noMisleadingReturnType. The rule detects when a function's return type annotation is wider than what the implementation actually returns.
// Flagged: `: string` is wider than `"loading" | "idle"`
function getStatus(b: boolean): string {
if (b) return "loading";
return "idle";
}
- #9880 7f67749 Thanks @dyc3! - Improved the diagnostics for useFind to better explain the problem, why it matters, and how to fix it.
- #9755 bff7bdb Thanks @ematipico! - Improved performance of fix-all operations (--write). Biome is now smarter when it runs lint rules and assist actions. First, it runs only rules that have code fixes, and then runs the rest of the rules.
- #8651 aafca2d Thanks @siketyan! - Add a new lint rule useDisposables for JavaScript, which detects disposable objects assigned to variables without using or await using syntax. Disposable objects that implement the Disposable or AsyncDisposable interface are intended to be disposed of after use. Not disposing them can lead to resource or memory leaks, depending on the implementation.
Invalid:
function createDisposable(): Disposable {
return {
[Symbol.dispose]() {
// do something
},
};
}
const disposable = createDisposable();
Valid:
function createDisposable(): Disposable {
return {
[Symbol.dispose]() {
// do something
},
};
}
using disposable = createDisposable();
- #9788 53b8e57 Thanks @MeGaNeKoS! - Fixed #7760: Added support for CSS scroll-driven animation timeline-range-name keyframe selectors (cover, contain, entry, exit, entry-crossing, exit-crossing). Biome no longer reports parse errors on keyframes like entry 0% { ... } or exit 100% { ... }.
- #9728 5085424 Thanks @mkosei! - Fixed #9696: Astro frontmatter now correctly parses regular expression literals like /\d{4}/.
- #9261 16b6c49 Thanks @ematipico! - Fixed #8409: CSS formatter now correctly places comments after the colon in property declarations.
Previously, comments that appeared after the colon in CSS property values were incorrectly moved before the property name:
[lang]:lang(ja) {
- /* system-ui,*/ font-family:
+ font-family: /* system-ui,*/
Hiragino Sans,
sans-serif;
}
- #9441 957ea4c Thanks @soconnor-seeq! - Fixed #1630: LSP project selection now prefers the most specific project root in nested workspaces.
- #9878 de6210f Thanks @ematipico! - Fixed #9118: noUnusedImports no longer reports false positives for default imports used inside Svelte, Vue and Astro components.
- #9879 ce7e2b7 Thanks @dyc3! - Fixed a parser diagnostic's message when vue syntax is disabled so that it no longer ref
2.4.10 30 de març del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.4.10

Patch Changes
- #8838 f3a6a6b Thanks @baeseokjae! - Added new lint nursery rule noImpliedEval.
The rule detects implied eval() usage through functions like setTimeout, setInterval, and setImmediate when called with string arguments.
// Invalid
setTimeout("alert('Hello');", 100);
// Valid
setTimeout(() => alert("Hello"), 100);
- #9320 93c3b6c Thanks @taberoajorge! - Fixed #7664: noUnusedVariables no longer reports false positives for TypeScript namespace declarations that participate in declaration merging with an exported or used value declaration (const, function, or class) of the same name. The reverse direction is also handled: a value declaration merged with an exported namespace is no longer flagged.
- #9630 1dd4a56 Thanks @raashish1601! - Fixed #9629: noNegationElse now keeps ternary branch comments attached to the correct branch when applying its fixer.
- #9216 04243b0 Thanks @FrederickStempfle! - Fixed #9061: noProcessEnv now also detects process.env when process is imported from the "process" or "node:process" modules.
Previously, only the global process object was flagged:
import process from "node:process";
// This was not flagged, but now it is:
console.log(process.env.NODE_ENV);
- #9692 61b7ec5 Thanks @mkosei! - Fixed Svelte #each destructuring parsing and formatting for nested patterns such as [key, { a, b }].
- #9627 06a0f35 Thanks @ematipico! - Fixed #191: Improved the performance of how the Biome Language Server pulls code actions and diagnostics.
Before, code actions were pulled and computed all at once in one request. This approach couldn't work in big files, and caused Biome to stale and have CPU usage spikes up to 100%.
Now, code actions are pulled and computed lazily, and Biome won't choke anymore in big files.
- #9643 5bfee36 Thanks @dyc3! - Fixed #9347: useVueValidVBind no longer reports valid object bindings like v-bind="props".
- #9627 06a0f35 Thanks @ematipico! - Fixed assist diagnostics being invisible when using --diagnostic-level=error. Enforced assist violations (e.g. useSortedKeys) were filtered out before being promoted to errors, causing biome check to incorrectly return success.
- #9695 9856a87 Thanks @dyc3! - Added the new nursery rule noUnsafePlusOperands, which reports + and += operations that use object-like, symbol, unknown, or never operands, or that mix number with bigint.
- #9627 06a0f35 Thanks @ematipico! - Fixed duplicate parse errors in check and ci output. When a file had syntax errors, the same parse error was printed twice and the error count was inflated.
- #9627 06a0f35 Thanks @ematipico! - Improved the performance of the commands lint and check when they are called with --write.
- #9627 06a0f35 Thanks @ematipico! - Fixed --diagnostic-level not fully filtering diagnostics. Setting --diagnostic-level=error now correctly excludes warnings and infos from both the output and the summary counts.
- #9623 13b3261 Thanks @ematipico! - Fixed #9258: --skip no longer causes suppressions/unused warnings for suppression comments targeting skipped rules or domains.
- #9631 599dd04 Thanks @raashish1601! - Fixed #9625: experimentalEmbeddedSnippetsEnabled no longer crashes when a file mixes formatable CSS-in-JS templates with tagged templates that the embedded formatter can't currently delegate, such as a styled-components interpolation returning `css```.

What's Changed
- feat(linter): add noImpliedEval rule by @baeseokjae in #8838
- fix(linter): detect process.env when process is imported from module by @FrederickStempfle in #9216
- fix(cli): skip with domains should not report by @ematipico in #9623
- fix: avoid unresolved embedded CSS tag ranges by @raashish1601 in #9631
- chore(deps): update dependency happy-dom to v20.8.8 [security] by @renovate[bot] in #9628
- fix(cli): improve code actions filtering by @ematipico in #9627
- fix(lint): preserve ternary branch comments in noNegationElse by @raashish1601 in #9630
- fix(markdown-parser): incorrect inline link R_PAREN token range by
2.4.9 25 de març del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.4.9

Patch Changes
- #9315 085d324 Thanks @ematipico! - Added a new nursery CSS rule noDuplicateSelectors, that disallows duplicate selector lists within the same at-rule context.
For example, the following snippet triggers the rule because the second selector and the first selector are the same:
/* First selector */
.x .y .z {
}
/* Second selector */
.x {
.y {
.z {
}
}
}
- #9567 b7ab931 Thanks @ematipico! - Fixed #7211: useOptionalChain now detects negated logical OR chains. The following code is now considered invalid:
!foo || !foo.bar;
- #8670 607ebf9 Thanks @tt-a1i! - Fixed #8345: useAdjacentOverloadSignatures no longer reports false positives for static and instance methods with the same name. Static methods and instance methods are now treated as separate overload groups.
class Kek {
static kek(): number {
return 0;
}
another(): string {
return "";
}
kek(): number {
return 1;
} // no longer reported as non-adjacent
}
- #9476 97b80a8 Thanks @masterkain! - Fixed #9475: Fixed a panic when Biome analyzed ambient TypeScript modules containing class constructor, getter, or setter signatures that reference local type aliases. Biome now handles these declarations without crashing during semantic analysis.
- #9553 0cd5298 Thanks @dyc3! - Fixed a bug where enabling the rules of a whole group, would enable rules that belonged to a domain under the same group.
For example, linter.rules.correctness = "error" no longer enables React- or Qwik-specific correctness rules unless linter.domains.react, linter.domains.qwik, or an explicit rule config also enables them, or their relative dependencies are installed.
- #9586 4cafb71 Thanks @dyc3! - Fixed #8828: Grit patterns using export { $foo } from $source now match named re-exports in JavaScript and TypeScript files.
- #9550 d4e3d6e Thanks @dyc3! - Fixed #9548: Biome now parses conditional expressions whose consequent is an arrow function returning a parenthesized object expression.
- #8696 a7c19cc Thanks @Faizanq! - Fixed #8685 where noUselessLoneBlockStatements would remove empty blocks containing comments. The rule now preserves these blocks since comments may contain important information like TODOs or commented-out code.
- #9557 6671ac5 Thanks @datalek! - Fixed #9557: Biome's LSP server no longer crashes on startup when used with editors that don't send workspaceFolders during initialization. This affected any LSP client that only sends rootUri, which is valid per the LSP specification.
- #9455 1710cf1 Thanks @omar-y-abdi! - Fixed #9174: useExpect now correctly rejects asymmetric matchers in Vitest or Jest like expect.stringContaining(), expect.objectContaining(), and utilities like expect.extend() that are not valid assertions. Previously these constructs caused false negatives, allowing tests without real assertions to pass the lint rule.
- #9584 956e367 Thanks @ematipico! - Fixed a bug where Vue directive attribute values like v-bind:class="{'dynamic': true}" were incorrectly parsed as JavaScript statements instead of expressions. Object literals inside directive values like :class, v-if, and v-html are now correctly parsed as expressions, preventing spurious parse errors.
- #9474 e168494 Thanks @ematipico! - Added the new nursery rule noUntrustedLicenses. This rule disallows dependencies that ship with invalid licenses or licenses that don't meet the criteria of your project/organisation.
The rule has the following options:
- allow: a list of licenses that can be allowed. Useful to bypass possible invalid licenses from downstream dependencies.
- deny: a list of licenses that should trigger the rule. Useful to deny licenses that don't fit your project/organisation.
When both deny and allow are provided, deny takes precedence.
- requireOsiApproved: whether the licenses need to be approved by the Open Source Initiative.
- requireFsfLibre: whether the licenses need to be approved by the Free Software Foundation.
- #9544 723798b Thanks @ViniciusDev26! - Added an unsafe fix to useConsi
2.4.8 18 de març del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.4.8
Patch Changes
- #9488 bc709f6 Thanks @mvanhorn! - Fixed #9463: the "Biome found a configuration file outside of the current working directory" diagnostic now includes the configuration file path and the working directory, giving users actionable information to debug the issue.
- #9527 2f8bf80 Thanks @mdm317! - Fixed #8959: Fixed TypeScript arrow function formatting when a comment appears after =>.
- #9525 e7b3b10 Thanks @ViniciusDev26! - Added the rule noDrizzleUpdateWithoutWhere to prevent accidental full-table updates when using Drizzle ORM without a .where() clause.
- #9531 1302740 Thanks @ematipico! - Fixed #9187: Astro frontmatter containing regex literals with quotes (/'/, /"/) or dashes (/---/) no longer causes parse errors.
- #9535 b630d93 Thanks @leno23! - Fixed #9524: remove extra space before > when bracketSameLine is true and the self-closing slash is absent in HTML formatter.
- #9537 81e6306 Thanks @ematipico! - Fixed #9238: The HTML parser no longer incorrectly reports --- inside element content (e.g. <td>---</td>) as an "Unexpected value or character" error.
- #9532 4b64145 Thanks @ematipico! - Fixed #9117: biome check --write no longer falsely reports Svelte and Vue files as changed when html.formatter.indentScriptAndStyle is enabled and the files are already correctly formatted.
- #9528 61451ef Thanks @ematipico! - Fixed #9341: Fixed an LSP crash that could corrupt file content when saving with format-on-save enabled.
- #9538 794f79c Thanks @ematipico! - Fixed #9279: The rule noSubstr now detects .substr() and .substring() calls in all expression contexts, including variable declarations, function arguments, return statements, and arrow function bodies.
- #9462 c23272c Thanks @ematipico! - Fixed #9370: The resolver now correctly prioritizes more specific exports patterns over less specific ones. Previously, a pattern like "./*" could match before "./features/*", causing resolution failures for packages with overlapping subpath patterns.
- #9515 f85c069 Thanks @shivamtiwari3! - Fixed #9506 and #9479: Biome no longer reports false parse errors on <script type="speculationrules"> and <script type="application/ld+json"> tags. These script types contain non-JavaScript content and are now correctly skipped by the embedded language detector.
- #9514 7fe43c8 Thanks @ematipico! - Fixed #6964: Biome now correctly resolves the .gitignore file relative to vcs.root when configured. Previously, the vcs.root setting was ignored and Biome always looked for the ignore file in the workspace directory.
- #9521 af39936 Thanks @ematipico! - Fixed #9483. Now the rule noRedeclare doesn't panic when it encounters constructor overloads.
- #9490 60cf024 Thanks @willfarrell! - Added support for modern CSS properties, pseudo-classes, and pseudo-elements.
New known properties: dynamic-range-limit, overlay, reading-flow, reading-order, scroll-marker-group, scroll-target-group.
New pseudo-elements: ::checkmark, ::column, ::picker, ::picker-icon, ::scroll-button, ::scroll-marker, ::scroll-marker-group.
New pseudo-classes: :active-view-transition-type, :has-slotted, :target-after, :target-before, :target-current.
- #9526 4d42823 Thanks @ematipico! - Fixed #9358 and #9375. Now attributes that have text expressions such as class={buttonClass()} are correctly tracked in Svelte files.
- #9520 61f53ee Thanks @ematipico! - Fixed #9519. Now noUnusedVariables doesn't flag variables that are used as typeof type.
- #9487 331dc0d Thanks @mvanhorn! - Fixed #9477: source.fixAll.biome no longer sorts imports when source.organizeImports.biome is disabled in editor settings. The organize imports action is now excluded from the fix-all pass unless explicitly requested.
- #9525 e7b3b10 Thanks @ViniciusDev26! - Added the rule noDrizzleDeleteWithoutWhere to prevent accidental full-table deletes when using Drizzle ORM without a .where() clause.
What's Changed
- fix(formatter/md): fix formatting for MdHardLine by @tidefield in #9480
- chore(deps): update rus
2.4.7 13 de març del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.4.7
Patch Changes
- #9318 3ac98eb Thanks @ematipico! - Added new nursery lint rule useBaseline for CSS. The rule reports when CSS properties, property values, at-rules, media conditions, functions, or pseudo-selectors are not part of the configured Baseline tier.
For example, at the time of writing, the rule will trigger for the use of accent-color because it has limited availability:
a {
accent-color: bar;
}
- #9272 2de8362 Thanks @terror! - Added the nursery rule useImportsFirst that enforces all import statements appear before any non-import statements in a module. Inspired by the eslint-plugin-import import/first rule.
// Invalid
import { foo } from "foo";
const bar = 1;
import { baz } from "baz"; // ← flagged
// Valid
import { foo } from "foo";
import { baz } from "baz";
const bar = 1;
- #9285 93ea495 Thanks @dyc3! - Fixed noUndeclaredVariables from erroneously flagging props only used in the template section in Vue SFCs
- #9435 6c5a8f2 Thanks @siketyan! - Fixed #9432: Values referenced as a JSX element in Astro/Vue/Svelte templates are now correctly detected; noUnusedImports and useImportType rules no longer reports these values as false positives.
- #9362 fc9ca4c Thanks @Netail! - Extra rule source references. biome migrate eslint should do a bit better detecting rules in your eslint configurations.
- #9392 b881fea Thanks @g-ortuno! - Fixed biomejs/biome-vscode#959: LSP now correctly resolves project directory when configurationPath points to a configuration file outside the workspace.
- #9420 a1c46af Thanks @ematipico! - Fixed #9385: noUselessEscapeInString no longer incorrectly flags valid CSS hex escapes (e.g. \e7bb) as useless. The rule now recognizes all hex digits (0-9, a-f, A-F) as valid escape characters in CSS strings.
- #9416 f2581b8 Thanks @ematipico! - Fixed #9131, #9112, #9166: the formatter no longer crashes or produces corrupt output when a JS file with experimentalEmbeddedSnippetsEnabled contains non-embedded template literals alongside embedded ones (e.g. console.log(\test`)next tographql(`...`)`).
- #9344 cb4d7d7 Thanks @ematipico! - Fixed #6921: noShadow no longer incorrectly flags destructured variable bindings in sibling scopes as shadowing. Object destructuring, array destructuring, nested patterns, and rest elements are now properly recognized as declarations.
- #9360 bc5dd99 Thanks @ematipico! - Fixed #7125: The rule noShadow no longer incorrectly flags parameters in TypeScript constructor and method overload signatures.
- #9371 29cac17 Thanks @ematipico! - Fixed #5279: Tabs in diagnostic diff output are now rendered at a consistent width across context and changed lines, fixing visual misalignment when source files use tab indentation.
- #9043 61e2a02 Thanks @dyc3! - Fixed #8897: Biome now parses @utility names containing / when Tailwind directives are enabled.
- #9354 930c858 Thanks @denbezrukov! - Improved CSS parser recovery for invalid unicode-range values that mix wildcard ranges with range intervals. For example, Biome now reports clearer diagnostics for invalid syntax like:
unicode-range: U+11???-2??;
unicode-range: U+11???-;
with diagnostics such as:
× Wildcard ranges cannot be combined with a range interval.
> unicode-range: U+11???-2??;
^
× Expected a codepoint but instead found ';'.
> unicode-range: U+11???-;
^
- #9355 78e74a2 Thanks @SchahinRohani! - Fixed #9349: Biome now correctly handles Vue dynamic :alt and v-bind:alt bindings in useAltText, preventing false positives in .vue files.
- #9369 b309dde Thanks @costajohnt! - Fixed #9210: useAnchorContent no longer reports an accessibility error for Astro Image components inside links when they provide non-empty alt text.
- #9345 70c2d4e Thanks @ematipico! - Fixed #7214: useOptionalChain now detects optional chain patterns that don't start at the beginning of a logical AND expression. For example, bar && foo && foo.length is now correctly flagged and fixed to bar && foo?.length.
- #9311 78c4e9b Thanks @ruidosujeira! - Fixed #9245: th
2.4.6 5 de març del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.4.6
Patch Changes
- #9305 40869b5 Thanks @ematipico! - Fixed #4946: noUnreachable no longer reports code inside finally blocks as unreachable when there is a break, continue, or return in the corresponding try body.
- #9303 464910c Thanks @ematipico! - Fixed #2786: The formatter no longer produces different output on subsequent runs when a case clause has a trailing line comment followed by a single block statement.
- #9324 6294aa2 Thanks @arendjr! - Fixed #7730: useAnchorContent now recognises SolidJS's innerHTML the same way as React's dangerouslySetInnerHTML.
- #9298 1003229 Thanks @Netail! - Fixed #9296, so comments are moved along with the attributes in the useSortedAttributes assist rule code fix.
- #9329 855b451 Thanks @dyc3! - Improved performance of noEmptyBlockStatements. The rule is now smarter about short-circuiting its logic.
- #9326 85dfe9b Thanks @dyc3! - Improved performance for noImportCycles by explicitly excluding node_modules from the cycle detection. The performance improvement is directly proportional to how big your dependency tree is.
- #9323 d5ee469 Thanks @ematipico! - Fixed #9217 and biomejs/biome-vscode#959, where the Biome language server didn't correctly resolve the editor setting configurationPath when the provided value is a relative path.
- #9302 86fbc70 Thanks @sepagian! - Fixed #9300: Lowercase component member expressions like <form.Field> in Svelte and Astro files are now correctly formatted.
-<form .Field></form.Field>
+<form.Field></form.Field>
What's Changed
- fix(js_analyze): move comments with useSortedAttributes action by @Netail in #9298
- fix(formatter): switch case comments by @ematipico in #9303
- refactor(markdown-parser): promote list structural tokens from skipped trivia to explicit CST nodes by @jfmcdowell in #9274
- fix(noUnreachable): handle dead implicit jumps in finally by @ematipico in #9305
- refactor(markdown-parser): align newline/prescan paragraph-break checks by @jfmcdowell in #9197
- refactor(markdown-parser): promote blank lines between list items to MdNewline nodes by @jfmcdowell in #9313
- fix(linter): support SolidJS's innerHTML in useAnchorContent by @arendjr in #9324
- fix(lsp): correctly resolve configurationPath by @ematipico in #9323
- perf(noImportCycles): exclude node_modules from cycle detection by @dyc3 in #9326
- refactor(css_parser): split function parser into modules by @denbezrukov in #9325
- refactor(markdown-parser): promote fenced code block skipped trivia to explicit CST nodes by @jfmcdowell in #9321
- refactor(css): rename operator_token field to operator by @denbezrukov in #9327
- perf: add .skip(1) to .ancestors() calls in a bunch of places by @dyc3 in #9330
- perf(noEmptyBlockStatements): short circuit to avoid traversing descendants for comments by @dyc3 in #9329
- fix: lowercase component member expressions in Astro/Svelte by @sepagian in #9302
- chore: align parser options struct name by @Netail in #9332
- feat(css): use ScssExpression in ScssNestingDeclaration and CssGenericProperty by @denbezrukov in #9328
- refactor(css): align scss expression node variants by @denbezrukov in #9340
- feat(css): use expression in page by @denbezrukov in #9342
- ci: release by @github-actions[bot] in #9301
New Contributors
- @sepagian made their first contribution in #9302
Full Changelog: https://github.com/biomejs/biome/compare/@biomejs/biome@2.4.5...@biomejs/biome@2.4.6
2.4.5 2 de març del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.4.5
Patch Changes
- #9185 e43e730 Thanks @dyc3! - Added the nursery rule useVueScopedStyles for Vue SFCs. This rule enforces that <style> blocks have the scoped attribute (or module for CSS Modules), preventing style leakage and conflicts between components.
- #9184 49c8fde Thanks @chocky335! - Improved plugin performance by batching all plugins into a single syntax visitor with a kind-to-plugin lookup map, reducing per-node dispatch overhead from O(N) to O(1) where N is the number of plugins.
- #9283 071c700 Thanks @dyc3! - Fixed noUndeclaredVariables erroneously flagging functions and variables defined in the <script setup> section of Vue SFCs.
- #9221 4612133 Thanks @ematipico! - Fixed an issue where the JSON reporter didn't contain the duration of the command.
- #9294 1805c8f Thanks @Netail! - Extra rule source reference. biome migrate eslint should do a bit better detecting rules in your eslint configurations.
- #9178 101b3bb Thanks @Bertie690! - Fixed #9172 and #9168:
Biome now considers more constructs as valid test assertions.
Previously, assert, expectTypeOf and assertType
were not recognized as valid assertions by Biome's linting rules, producing false positives in lint/nursery/useExpect and other similar rules.
Now, these rules will no longer produce errors in test cases that used these constructs instead of expect:
import { expectTypeOf, assert, assertType } from "vitest";
const myStr = "Hello from vitest!";
it("should be a string", () => {
expectTypeOf(myStr).toBeString();
});
test("should still be a string", () => {
assertType<string>(myStr);
});
it.todo("should still still be a string", () => {
assert(typeof myStr === "string");
});
- #9173 32dad2d Thanks @dyc3! - Added parsing support for Svelte's new comments-in-tags feature.
The HTML parser will now accept JS style comments in tags in Svelte files.
<button
// single-line comment
onclick={doTheThing}
>click me</button>
<div
/* block comment */
class="foo"
>text</div>
- #8952 1d2ca15 Thanks @pkallos! - Added the nursery rule useNullishCoalescing. This rule suggests using the nullish coalescing operator (??) instead of logical OR (||) when the left operand may be nullish. This prevents bugs where falsy values like 0, '', or false are incorrectly treated as missing. Addresses #8043
// Invalid
declare const x: string | null;
const value = x || "default";
// Valid
const value = x ?? "default";
- #9243 1992a85 Thanks @Netail! - Fixed #7813: improved the diagnostic of the rule useExhaustiveDependencies. The diagnostic now shows the name of the variable to add to the dependency array.
- #9063 3d0648f Thanks @taga3s! - Added the nursery rule noVueRefAsOperand. This rule disallows cases where a ref is used as an operand.
The following code is now flagged:
import { ref } from "vue";
const count = ref(0);
count++; // Should be: count.value++
import { ref } from "vue";
const ok = ref(false);
if (ok) {
// Should be: if (ok.value)
//
}
- #9273 f239e20 Thanks @denbezrukov! - Fixed #9253: parsing of @container scroll-state(...) queries.
@container scroll-state(scrolled: bottom) {
}
@container scroll-state(stuck) {
}
@container scroll-state(not (stuck)) {
}
@container scroll-state((stuck) and (scrolled: bottom)) {
}
@container scroll-state((stuck) or (snapped: x)) {
}
@container main-layout scroll-state(not ((stuck) and (scrolled: bottom))) {
}
- #9259 96939c0 Thanks @ematipico! - Fixed CSS formatter incorrectly collapsing selectors when a BOM (Byte Order Mark) character is present at the start of the file. The formatter now correctly preserves line breaks between comments and selectors in BOM-prefixed CSS files, matching Prettier's behavior.
- #9251 59e33fb Thanks @ematipico! - Fixed #9249: The CSS formatter no longer incorrectly breaks ratio values (like 1 / -1) across lines when followed by comments.
- #9284 ec3a17f Thanks @denbezrukov! - Fixed #9253: removed false-positive diagnostics for valid @container/@supports general-enclosed queries.
@container scroll-state(scrolle
2.4.4 20 de febrer del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.4.4
Patch Changes
- #9150 6946835 Thanks @dyc3! - Fixed #9138: Astro files containing --- in HTML content (e.g., <h1>---Hi</h1>) are now parsed correctly, both when a frontmatter block is present and when there is no frontmatter at all.
- #9150 aa6f837 Thanks @dyc3! - Fixed #9138: The HTML parser incorrectly failing to parse bracket characters ([ and ]) in text content (e.g. <div>[Foo]</div>).
- #9151 c0d4b0c Thanks @dyc3! - Fixed parsing of Svelte directive keywords (use, style) when used as plain text content in HTML/Svelte files. Previously, <p>use JavaScript</p> or <p>style it</p> would incorrectly produce a bogus element instead of proper text content.
- #9162 7f1e060 Thanks @dyc3! - Fixed #9161: The Vue parser now correctly handles colon attributes like xlink:href and xmlns:xlink by parsing them as single attributes instead of splitting them into separate tokens.
- #9164 458211b Thanks @dyc3! - Fixed #9161: The noAssignInExpressions rule no longer flags assignments in Vue v-on directives (e.g., @click="counter += 1"). Assignments in event handlers are idiomatic Vue patterns and are now skipped by the rule.
What's Changed
- chore(scss): cherry-picks by @denbezrukov in #9149
- fix(parse/html): don't lex square brackets as special tokens in contexts where they don't mean anything by @dyc3 in #9150
- refactor(parse/html): use token_set! instead of matches! for svelte keywords and directives helpers by @dyc3 in #9148
- fix(parse/html): don't lex "use" as USE_KW when in html text content by @dyc3 in #9151
- feat(css): enhance SCSS qualified name detection by @denbezrukov in #9159
- chore(html): more html benchmarks by @dyc3 in #8153
- fix(parse/html/vue): don't treat : as special token outside of vue directives by @dyc3 in #9162
- feat(lint/vue): automatically ignore noAssignInExpressions for vue v-on directives by @dyc3 in #9164
- ci: release by @github-actions[bot] in #9160
Full Changelog: https://github.com/biomejs/biome/compare/@biomejs/biome@2.4.3...@biomejs/biome@2.4.4
2.4.3 19 de febrer del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.4.3
Patch Changes
- #9120 aa40fc2 Thanks @ematipico! - Fixed #9109, where the GitHub reporter wasn't correctly enabled when biome ci runs on GitHub Actions.
- #9128 8ca3f7f Thanks @dyc3! - Fixed #9107: The HTML parser can now correctly parse Astro directives (client/set/class/is/server), which fixes the formatting for Astro directives.
- #9124 f5b0e8d Thanks @ematipico! - Fixed #8882 and #9108: The Astro frontmatter lexer now correctly identifies the closing --- fence when the frontmatter contains multi-line block comments with quote characters, strings that mix quote types (e.g. "it's"), or escaped quote characters (e.g. "\").
- #9142 3ca066b Thanks @THernandez03! - Fixed #9141: The noUnknownAttribute rule no longer reports closedby as an unknown attribute on <dialog> elements.
- #9126 792013e Thanks @ematipico! - Added missing Mocha globals to the Test domain: context, run, setup, specify, suite, suiteSetup, suiteTeardown, teardown, xcontext, xdescribe, xit, and xspecify. These are injected by Mocha's BDD and TDD interfaces and were previously flagged as undeclared variables in projects using Mocha.
- #8855 6918c9e Thanks @ruidosujeira! - Fixed #8840. Now the Biome CSS parser correctly parses not + scroll-state inside @container queries.
- #9111 4fb55cf Thanks @Jayllyz! - Slightly improved performance of noIrregularWhitespace by adding early return optimization and simplifying character detection logic.
- #8975 086a0c5 Thanks @FrankFMY! - Fixed #8478: useDestructuring no longer suggests destructuring when the variable has a type annotation, like const foo: string = object.foo.
What's Changed
- perf(lint): optimize noIrregularWhitespace rule by @Jayllyz in #9111
- fix(cli): use github reporter in github actions env by @ematipico in #9120
- fix: add more globals for mocha by @ematipico in #9126
- fix(parse/html): astro fence by @ematipico in #9124
- fix(linter): skip useDestructuring for variables with type annotations by @FrankFMY in #8975
- fix(parser): accept scroll-state(...) in @container not queries by @ruidosujeira in #8855
- fix(noUnknownAttribute): add closedby as a valid attribute for <dialog> by @THernandez03 in #9142
- feat(parse/html): parse astro directives by @dyc3 in #9128
- ci: release by @github-actions[bot] in #9116
New Contributors
- @THernandez03 made their first contribution in #9142
Full Changelog: https://github.com/biomejs/biome/compare/@biomejs/biome@2.4.2...@biomejs/biome@2.4.3
2.4.2 16 de febrer del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.4.2
Patch Changes
- #9103 fc9850c Thanks @dyc3! - Fixed #9098: useImportType no longer incorrectly flags imports used in Svelte control flow blocks ({#if}, {#each}, {#await}, {#key}) as type-only imports.
- #9106 f4b7296 Thanks @dyc3! - Updated rule source metadata for rules from html-eslint.
- #8960 4a5ff40 Thanks @abossenbroek! - Added the nursery rule noConditionalExpect. This rule disallows conditional expect() calls inside tests, which can lead to tests that silently pass when assertions never run.
// Invalid - conditional expect may not run
test("conditional", async ({ page }) => {
if (someCondition) {
await expect(page).toHaveTitle("Title");
}
});
// Valid - unconditional expect
test("unconditional", async ({ page }) => {
await expect(page).toHaveTitle("Title");
});
- #8960 4a5ff40 Thanks @abossenbroek! - Added the nursery rule noPlaywrightElementHandle. Prefers locators to element handles.
const el = await page.$(".btn");
- #8960 4a5ff40 Thanks @abossenbroek! - Added the nursery rule noPlaywrightEval. Disallows page.$eval() and page.$$eval() methods.
await page.$eval(".btn", (el) => el.textContent);
- #8960 4a5ff40 Thanks @abossenbroek! - Added the nursery rule noPlaywrightForceOption. Disallows the force option on user interactions.
await locator.click({ force: true });
- #8960 4a5ff40 Thanks @abossenbroek! - Added the nursery rule noPlaywrightMissingAwait. Enforces awaiting async Playwright APIs.
const el = page.locator(".btn");
el.click(); // Missing await
- #8960 4a5ff40 Thanks @abossenbroek! - Added the nursery rule noPlaywrightNetworkidle. Disallows deprecated networkidle wait option.
await page.goto(url, { waitUntil: "networkidle" });
- #8960 4a5ff40 Thanks @abossenbroek! - Added the nursery rule noPlaywrightPagePause. Disallows page.pause() debugging calls in committed code.
await page.pause();
- #8960 4a5ff40 Thanks @abossenbroek! - Added the nursery rule noPlaywrightUselessAwait. Disallows unnecessary await on synchronous Playwright methods.
// Incorrect - locator() is synchronous
const loc = await page.locator(".btn");
- #8960 4a5ff40 Thanks @abossenbroek! - Added the nursery rule noPlaywrightWaitForNavigation. Prefers modern navigation APIs over deprecated waitForNavigation().
await page.waitForNavigation();
- #8960 4a5ff40 Thanks @abossenbroek! - Added the nursery rule noPlaywrightWaitForSelector. Prefers locators over deprecated waitForSelector().
await page.waitForSelector(".btn");
- #8960 4a5ff40 Thanks @abossenbroek! - Added the nursery rule noPlaywrightWaitForTimeout. Disallows hard-coded timeouts with waitForTimeout().
await page.waitForTimeout(5000);
- #8960 4a5ff40 Thanks @abossenbroek! - Enhanced noSkippedTests to detect Playwright patterns (.fixme, test.describe, test.step, bracket notation, bare calls). Consolidated noPlaywrightSkippedTest into this rule.
- #9101 0c0fb6f Thanks @siketyan! - Fixed #9080: The noUnusedVariables rule no longer reports a top-level Props interface or type alias as unused in Astro files.
- #8960 4a5ff40 Thanks @abossenbroek! - Added the nursery rule useExpect. This rule ensures that test functions contain at least one expect() assertion.
// Invalid - test without assertion
test("no assertion", async ({ page }) => {
await page.goto("/");
});
// Valid - test with assertion
test("has assertion", async ({ page }) => {
await expect(page).toHaveTitle("Title");
});
- #8960 4a5ff40 Thanks @abossenbroek! - Added the nursery rule usePlaywrightValidDescribeCallback. Validates that describe callback signatures are not async.
test.describe("suite", async () => {});
What's Changed
- fix(lint): don't report Props interface as unused in Astro files by @siketyan in #9101
- fix(service): parse text expressions in svelte control flow blocks by @dyc3 in #9103
- feat(migrate): more metadata for rules from html-eslint by @dyc3 in #9106
- feat(lint): add Playwright ESLint rules by @abossenbroek in #8960
- ci: release by @github-actions[bot] in #9104
New Contributors
- @abossenbroek made th
2.4.1 16 de febrer del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.4.1
Patch Changes
- #9092 6edd600 Thanks @ematipico! - Fixed #9052. This PR reverts changes introduced by #8519, which caused unwanted changes on how paths are resolved.
- #9091 3bf674d Thanks @ematipico! - Fixed #9090, where SCSS files were incorrectly processed by Biome. This was a regressions caused by the latest developments for supporting SCSS out of the box.
- #9100 66931a8 Thanks @siketyan! - Fixed #9081: The noUnknownPseudoElement rule no longer reports false positives for any known pseudo elements in CSS modules. This was a regression introduced in v2.4.0.
- #9102 d01b903 Thanks @ematipico! - Fixed #9095, where Biome didn't print anything in stdin mode. This was a regression caused by a recent, internal refactor.
What's Changed
- chore: docs that break website by @ematipico in #9077
- chore(deps): update dependency @types/node to v24.10.13 by @renovate[bot] in #9083
- chore(deps): update dependency rust to v1.93.1 by @renovate[bot] in #9084
- chore(deps): update github-actions by @renovate[bot] in #9086
- chore(deps): update dependency tombi to v0.7.28 by @renovate[bot] in #9085
- feat(markdown): port snapshots from prettier by @tidefield in #9067
- fix(core): scss handling by @ematipico in #9091
- revert(core): includes resolution by @ematipico in #9092
- chore(deps): update rust crate jiff to 0.2.20 by @renovate[bot] in #9088
- chore(deps): update rust crate libc to 0.2.182 by @renovate[bot] in #9089
- fix(cli): stdin regression by @ematipico in #9102
- fix(lint): regression of the noUnknownPseudoElement rule by @siketyan in #9100
- ci: release by @github-actions[bot] in #9094
Full Changelog: https://github.com/biomejs/biome/compare/@biomejs/biome@2.4.0...@biomejs/biome@2.4.1
2.4.0 15 de febrer del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.4.0
Minor Changes
- #8964 0353fa0 Thanks @dyc3! - Added ignore option to the useHookAtTopLevel rule.
You can now specify function names that should not be treated as hooks, even if they follow the use* naming convention.
Example configuration:
{
"linter": {
"rules": {
"correctness": {
"useHookAtTopLevel": {
"options": {
"ignore": ["useDebounce", "useCustomUtility"]
}
}
}
}
}
}
- #8769 d0358b0 Thanks @rahuld109! - Added the rule useAnchorContent for HTML to enforce that anchor elements have accessible content for screen readers. The rule flags empty anchors, anchors with only whitespace, and anchors where all content is hidden with aria-hidden. Anchors with aria-label or title attributes providing a non-empty accessible name are considered valid.
- #8742 6340ce6 Thanks @rahuld109! - Added the rule useMediaCaption to the HTML language. Enforces that audio and video elements have a track element with kind="captions" for accessibility. Muted videos are allowed without captions.
- #8621 d11130b Thanks @Netail! - Added support for multiple reporters, and the ability to save reporters on arbitrary files.
Combine two reporters in CI
If you run Biome on GitHub, take advantage of the reporter and still see the errors in console, you can now use both reporters:
biome ci --reporter=default --reporter=github
Save reporter output to a file
With the new --reporter-file CLI option, it's now possible to save the output of all reporters to a file. The file is a path,
so you can pass a relative or an absolute path:
biome ci --reporter=rdjson --reporter-file=/etc/tmp/report.json
biome ci --reporter=summary --reporter-file=./reports/file.txt
You can combine these two features. For example, have the default reporter written on terminal, and the rdjson reporter written on file:
biome ci --reporter=default --reporter=rdjson --reporter-file=/etc/tmp/report.json
The --reporter and --reporter-file flags must appear next to each other, otherwise an error is thrown.
- #8399 ab88099 Thanks @ematipico! - The Biome CSS parser is now able to parse Vue SFC syntax such as :slotted and :deep. These pseudo functions are only correctly parsed when the CSS is defined inside .vue components. Otherwise, Biome will a emit a parse error.
This capability is only available when experimentalFullHtmlSupportedEnabled is set to true.
- #8663 3dfea16 Thanks @ematipico! - Added support for Cursor files. When Biome sees a Cursor JSON file, it will parse it with comments enabled and trailing commas enabled:
- $PROJECT/.cursor/
- %APPDATA%\Cursor\User\ on Windows
- ~/Library/Application Support/Cursor/User/ on macOS
- ~/.config/Cursor/User/ on Linux
- #8723 fe2c642 Thanks @cbstns! - Added JSON as a target language for GritQL pattern matching. You can now write Grit plugins for JSON files.
This enables users to write GritQL patterns that match against JSON files, useful for:
- Searching and transforming JSON configuration files
- Enforcing patterns in package.json and other JSON configs
- Writing custom lint rules for JSON using GritQL
Example patterns:
Match all key-value pairs:
language json
pair(key = $k, value = $v)
Match objects with specific structure:
language json
JsonObjectValue()
Supports both native Biome AST names (JsonMember, JsonObjectValue) and TreeSitter-compatible names (pair, object, array) for compatibility with existing Grit patterns.
For more details, see the GritQL documentation.
- #8814 4d9c676 Thanks @Netail! - Added ignore option to noUnknownProperty. If an unknown property name matches any of the items provided in ignore, a diagnostic won't be emitted.
- #8631 4d8f19d Thanks @Netail! - Add a new reporter --reporter=sarif, that emits diagnostics using the SARIF format.
- #8270 4f7909d Thanks @lucasweng! - Added the useIframeTitle lint rule for HTML. The rule enforces the usage of the title attribute for the iframe element.
Invalid:
<iframe></iframe> <iframe title=""></iframe>
Valid:
<iframe title="title"></iframe>
- #8164 1d25856 Thanks @ematipico! - Add
2.3.15 12 de febrer del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.3.15
Patch Changes
- #9019 043b67c Thanks @dyc3! - Added the lint rule noNestedPromises. This rule detects nested .then() or .catch() calls that could be refactored into flat promise chains.
// Invalid: nested promise that can be flattened
doThing().then(function () {
return doOtherThing().then(console.log);
});
// Valid: flat promise chain
doThing()
.then(() => doOtherThing())
.then(console.log);
The rule intelligently allows nesting when the inner callback references variables from the outer scope, as these cases cannot be safely flattened.
- #9029 6ebf6c6 Thanks @ff1451! - Added the nursery rule noUselessReturn. The rule reports redundant return; statements that don't affect the function's control flow.
// Invalid: return at end of function is redundant
function foo() {
doSomething();
return;
}
- #9017 8bac2da Thanks @mdevils! - Reverted a behavior change in useExhaustiveDependencies that was accidentally included as part of the #8802 fix. The change made method calls on objects (e.g., props.data.forEach(...)) report only the object (props.data) as a missing dependency instead of the full member expression. This behavior change will be reconsidered separately.
- #9005 c8dbbbe Thanks @corvid-agent! - Fixed #8790: The noAssignInExpressions rule no longer reports a false positive when an assignment is used as the expression body of an arrow function (e.g., const f = b => a += b).
- #8519 ccdc602 Thanks @ruidosujeira! - Fixed #8518, where globally excluded files in a monorepo were still being processed when using "extends": "//".
When a package-level configuration extends the root configuration with "extends": "//", glob patterns (such as those in files.includes) are now correctly resolved relative to the project root directory, instead of the current workspace directory.
- #9033 0628e0a Thanks @mdevils! - Fixed #8967. useExhaustiveDependencies no longer reports false positives for variables destructured from a rest pattern.
- #9023 8ef9d1d Thanks @siketyan! - Fixed #9020: When javascript.jsxRuntime is set to reactClassic, noUnusedImports and useImportType rules now allow importing the React identifier from a package other than react. This aligns the behavior with tsc (--jsx=react), which also allows importing React from any package.
- #8646 16fd71d Thanks @siketyan! - Fixed #8605: Text expressions in some template languages ({{ expr }} or { expr }) at the top level of an HTML document no longer causes panicking.
- #8930 51c158e Thanks @ANKANJAGTAP! - Fixed #8917
useExhaustiveDependencies now correctly detects JSX component identifiers as hook dependencies.
- #9009 7d229c7 Thanks @Netail! - Fixed typo in noPositiveTabindex's quick fix text.
- #8758 8c789f1 Thanks @Pranav2612000! - Updated the useJsxKeyInIterable rule to not run inside Map constructors
- #8977 bbe0e0c Thanks @FrankFMY! - Fixed #4888.
noUnusedImports now adds export {} when removing the last import in a TypeScript file to prevent it from becoming an ambient module. This does not apply to embedded scripts in Vue, Svelte, or Astro files, which are already in a module context.
- #9016 9d4cfa3 Thanks @dyc3! - Added eslint migration metadata for the rules @typescript/no-var-requires, @typescript/keyword-spacing, @typescript/func-call-spacing, vue/keyword-spacing, vue/func-call-spacing, and unicorn/empty-brace-spaces,
- #8848 2cba2b3 Thanks @LouisLau-art! - Fixed #8845. Now useGenericFontNames doesn't trigger when font is declared inside the @supports at-rule.
- #8997 a5f3212 Thanks @mldangelo! - Fixed #8476.
useAwaitThenable no longer reports false positives for await on call expressions whose return type cannot be resolved (e.g., cross-module function calls to Node.js builtins or npm packages).
- #8978 cc7a478 Thanks @FrankFMY! - Fixed #8645.
useAwait no longer reports async generator functions that use yield*, since yield* in an async generator delegates to an AsyncIterable and requires the async modifier.
What's Changed
- docs: fix website sync by @dyc3 in #8957
2.3.14 3 de febrer del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.3.14
Patch Changes
- #8921 29e2435 Thanks @siketyan! - Fixed #8759: The useConsistentTypeDefinitions rule no longer converts empty object type declarations into interfaces, as it will conflict with the noEmptyInterface rule and can cause an infinite loop when both rules are enabled.
- #8928 ccaeac4 Thanks @taga3s! - Added the nursery rule useGlobalThis. This rule enforces using globalThis over window, self and global.
- #8602 9a18daa Thanks @dyc3! - Added the new nursery rule noVueArrowFuncInWatch. This rule forbids using arrow functions in watchers in Vue components, because arrow functions do not give access to the component instance (via this), while regular functions do.
- #8905 9b1eea8 Thanks @ryan-m-walker! - Fixed #8428: Improved parsing recovery when encountering qualified rules inside CSS @page at-rule blocks.
- #8900 f788cff Thanks @mdevils! - Fixed #8802: useExhaustiveDependencies now correctly suggests dependencies without including callback-scoped variables or method names.
When accessing object properties with a callback-scoped variable, only the object path is suggested:
// Now correctly suggests `props.value` instead of `props.value[day]`
useMemo(() => {
return WeekdayValues.filter((day) => props.value[day]);
}, [props.value]);
When calling methods on objects, only the object is suggested as a dependency:
// Now correctly suggests `props.data` instead of `props.data.forEach`
useMemo(() => {
props.data.forEach((item) => console.log(item));
}, [props.data]);
- #8913 e1e20ea Thanks @dyc3! - Fixed #8363: HTML parser no longer crashes when encountering a < character followed by a digit in text content (e.g., <12 months). The parser now correctly emits an "Unescaped < bracket character" error instead of treating <12 as a tag name and crashing.
- #8910 2fb63a4 Thanks @dyc3! - Fixed #8774: Type aliases with generic parameters that have extends constraints now properly indent comments after the equals sign.
Previously, comments after the = in type aliases with extends constraints were not indented:
-type A<B, C extends D> = // Some comment
-undefined;
+type A<B, C extends D> =
+ // Some comment
+ undefined;
- #8916 ea4bd04 Thanks @ryan-m-walker! - Fixed #4013, where comments in member chains caused unnecessary line breaks.
// Before
aFunction.b().c.d();
// After
aFunction.b().c.d();
- #8945 fa66fe3 Thanks @fireairforce! - Fixed #8354: Don't remove quotes when type memeber is new.
// Input:
type X = {
"new"(): string;
"foo"(): string;
};
// Format Output:
type X = {
"new()": string;
foo(): string;
};
- #8927 0ef3da5 Thanks @littleKitchen! - Fixed #8907: useExhaustiveDependencies now correctly recognizes stable hook results (like useState setters and useRef values) when declared with let.
- #8931 4561751 Thanks @koshin01! - Added the new nursery rule noRedundantDefaultExport, which flags redundant default exports where the default export references the same identifier as a named export.
- #8900 f788cff Thanks @mdevils! - Fixed #8883: useExhaustiveDependencies no longer produces false positives when props are destructured in the function body of arrow function components without parentheses around the parameter.
type Props = { msg: string };
// Arrow function without parentheses around `props`
const Component: React.FC<Props> = (props) => {
const { msg } = props;
// Previously, this incorrectly reported `msg` as unnecessary
useEffect(() => console.log(msg), [msg]);
};
- #8861 3531687 Thanks @dyc3! - Added the noDeprecatedMediaType CSS rule to flag deprecated media types like tv and handheld.
- #8775 7ea71cd Thanks @igas! - Fixed the noUnnecessararyConditions rule to prevent trigger for optional fallback patterns.
- #8860 95f1eea Thanks @dyc3! - Added the nursery rule noHexColors, which flags the use of hexadecimal color codes in CSS and suggests using named colors or RGB/RGBA/HSL/HSLA formats instead.
- #8786 d876a38 Thanks @Bertie690! - Added the nursery rule useConsistentMethodSignatures.
Inspired by the similarly name
2.3.13 26 de gener del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.3.13
Patch Changes
- #8815 f924f23 Thanks @dyc3! - Improved useVueValidVOn to be more closely aligned with the source rule. It will now properly allow modifiers for all possible keyboard events. It should have better performance when there are no violations of the rule as well.
Now treated valid:
<div @keydown.arrow-down="handler"></div>
<div @keydown.a="handler"></div>
<div @keydown.b="handler"></div>
<div @keydown.27="foo"></div>
- #8856 85f81f9 Thanks @dyc3! - Fixed #8710: Biome now parses Vue dynamic slot shorthand arguments that use template literals in [].
- #8850 2a190e0 Thanks @dyc3! - Fixed #8708: Tailwind @utility directives now parse functional utility names like px-* when Tailwind directives are enabled.
- #8863 79386e0 Thanks @dyc3! - Fixed an issue with biome migrate eslint where it couldn't detect rules for CSS, GraphQL, and HTML.
- #8771 6f56b6e Thanks @lghuahua! - Fix the --reporter=summary output incorrectly merging and displaying wrong issue counts for different rules. Fixes #8730
- #8714 ac3a71f Thanks @Netail! - Added new nursery rule use-consistent-enum-value-type. This rule disallows enums from having both number and string members.
What's Changed
- fix(dx/codegen): don't insert module into biome_rule_options/src/lib.rs if it already exists by @dyc3 in #8847
- feat(js_analyze): implement useConsistentEnumValueType by @Netail in #8714
- fix(parse/html/vue): parse dynamic slot directives that contain quotes by @dyc3 in #8856
- fix(parse/css): improve parsing of @utility names by @dyc3 in #8850
- fix(cli): improve RuleName ordering and update summary snapshots close #8730 by @lghuahua in #8771
- fix(useVueValidVOn): align more with source rule, also use phf hash sets for perf by @dyc3 in #8815
- fix(migrate): fix migrate command not picking up rules for css, graphql, html by @dyc3 in #8863
- chore(deps): update dependency tombi to v0.7.23 by @renovate[bot] in #8865
- chore(deps): update pnpm to v10.28.1 by @renovate[bot] in #8866
- chore(deps): update rust crate proc-macro2 to 1.0.106 by @renovate[bot] in #8867
- chore(deps): update rust crate quote to 1.0.44 by @renovate[bot] in #8868
- fix(deps): update @biomejs packages by @renovate[bot] in #8869
- chore(deps): update rust crate schemars to 1.2.0 by @renovate[bot] in #8875
- chore(deps): update @biomejs packages by @renovate[bot] in #8872
- chore(deps): update github-actions by @renovate[bot] in #8873
- chore(deps): update typescript-eslint monorepo to v8.53.1 by @renovate[bot] in #8877
- fix(deps): update dependency prettier to v3.8.1 by @renovate[bot] in #8878
- chore(deps): update rust crate tokio to 1.49.0 by @renovate[bot] in #8876
- ci: release by @github-actions[bot] in #8853
New Contributors
- @lghuahua made their first contribution in #8771
Full Changelog: https://github.com/biomejs/biome/compare/@biomejs/biome@2.3.12...@biomejs/biome@2.3.13
2.3.12 23 de gener del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.3.12
Patch Changes
- #8653 047576d Thanks @dyc3! - Added new nursery rule noDuplicateAttributes to forbid duplicate attributes in HTML elements.
- #8648 96d09f4 Thanks @BaeSeokJae! - Added a new nursery rule noVueOptionsApi.
Biome now reports Vue Options API usage, which is incompatible with Vue 3.6's Vapor Mode.
This rule detects Options API patterns in <script> blocks, defineComponent(), and createApp() calls,
helping prepare codebases for Vapor Mode adoption.
For example, the following now triggers this rule:
<script>
export default {
data() {
return { count: 0 };
},
};
</script>
- #8832 b08270b Thanks @Exudev! - Fixed #8809, #7985, and #8136: the noSecrets rule no longer reports false positives on common CamelCase identifiers like paddingBottom, backgroundColor, unhandledRejection, uncaughtException, and IngestGatewayLogGroup.
The entropy calculation algorithm now uses "average run length" to distinguish between legitimate CamelCase patterns (which have longer runs of same-case letters) and suspicious alternating case patterns (which have short runs).
- #8793 c19fb0e Thanks @TheBaconWizard! - Properly handle parameters metavariables for arrow_function GritQL queries. The following biome search command no longer throws an error:
biome search 'arrow_function(parameters=$parameters, body=$body)'
- #8561 981affb Thanks @wataryooou! - Fixed noUnusedVariables to ignore type parameters declared in ambient contexts such as declare module blocks.
- #8817 652cfbb Thanks @dyc3! - Fixed #8765: The HTML parser can now parse directive modifiers with a single colon, e.g. @keydown.:.
- #8704 a1914d4 Thanks @Netail! - Added the nursery rule noRootType.
Disallow the usage of specified root types. (e.g. mutation and/or subscription)
Invalid:
{
"options": {
"disallow": ["mutation"]
}
}
type Mutation {
SetMessage(message: String): String
}
- #8712 251b47b Thanks @Netail! - Renamed the following GraphQL nursery rules to match the Biome standard:
- useUniqueArgumentNames -> noDuplicateArgumentNames
- useUniqueFieldDefinitionNames -> noDuplicateFieldDefinitionNames
- useUniqueGraphqlOperationName -> noDuplicateGraphqlOperationName
- useUniqueInputFieldNames -> noDuplicateInputFieldNames
- useUniqueVariableNames -> noDuplicateVariableNames
Run the biome migrate --write command to automatically update the configuration file.
- #7602 957cd8e Thanks @kedevked! - Added the nursery lint rule useErrorCause.
This rule enforces that errors caught in a catch clause are not rethrown without wrapping them in a new Error object and specifying the original error as the cause. This helps preserve the error’s stack trace and context for better debugging.
It can be configured with the following option:
- requireCatchParameter: (default: true)
- When true, the rule requires that catch clauses have a parameter. If a throw statement appears inside a catch clause without a parameter, it will be flagged.
Invalid examples:
try {
foo();
} catch {
throw new Error("fail");
}
try {
foo();
} catch (err) {
throw new Error(err.message);
}
Valid examples:
try {
foo();
} catch (err) {
throw new Error("fail", { cause: err });
}
try {
foo();
} catch (error) {
throw new Error("Something went wrong", { cause: error });
}
Valid example when requireCatchParameter is false:
Valid:
try {
foo();
} catch {
throw new Error("fail");
}
- #8725 95aba98 Thanks @dyc3! - Fixed #8715: The CSS parser will now recover slightly better if a semicolon is missing from Tailwind's @apply at-rule.
- #8616 4ee3bda Thanks @Netail! - Added the nursery rule useLoneAnonymousOperation. Disallow anonymous operations when more than one operation specified in document.
Invalid:
query {
fieldA
}
query B {
fieldB
}
- #8624 291c9f2 Thanks @taga3s! - Added the nursery rule useInlineScriptId to the Next.js domain.
This rule enforces id attribute on next/script components with inline content or dangerouslySetInnerHTML.
The following code is invalid:
import Script from "next/script";
export default function Page() {
r
2.3.11 3 de gener del 2026 — 64 bits PortableARM64 Portable
Notes de la versió
2.3.11
Patch Changes
- #8583 83be210 Thanks @dyc3! - Added the new nursery rule useVueValidTemplateRoot.
This rule validates only root-level <template> elements in Vue single-file components. If the <template> has a src attribute, it must be empty. Otherwise, it must contain content.
Invalid examples:
<template src="./foo.html">content</template>
<template></template>
Valid examples:
<template>content</template>
<template src="./foo.html"></template>
- #8586 df8fe06 Thanks @dyc3! - Added a new nursery rule useVueConsistentVBindStyle. Enforces consistent v-bind style (:prop shorthand vs v-bind:prop longhand). Default prefers shorthand; configurable via rule options.
- #8587 9a8c98d Thanks @dyc3! - Added the rule useVueVForKey, which enforces that any element using v-for also specifies a key.
Invalid
<li v-for="item in items">{{ item }}</li>
Valid
<li v-for="item in items" :key="item.id">{{ item }}</li>
- #8586 df8fe06 Thanks @dyc3! - Added a new nursery rule useVueConsistentVOnStyle. Enforces consistent v-on style (@event shorthand vs v-on:event longhand). Default prefers shorthand; configurable via rule options.
- #8583 83be210 Thanks @dyc3! - Added the new nursery rule useVueValidVOnce. Enforces that usages of the v-once directive in Vue.js SFC are valid.
<!-- Valid -->
<div v-once />
<!-- Invalid -->
<div v-once:aaa />
<div v-once.bbb />
<div v-once="ccc" />
- #8498 d80fa41 Thanks @tt-a1i! - Fixed #8494. Extended noUndeclaredEnvVars to support bracket notation (process.env["VAR"], import.meta.env["VAR"]), Bun runtime (Bun.env.VAR, Bun.env["VAR"]), and Deno runtime (Deno.env.get("VAR")).
- #8509 574a909 Thanks @ematipico! - Added support for parsing and formatting the Svelte {#await} syntax, when html.experimentalFullSupportEnabled is set to true.
-{#await promise then name }
+{#await promise then name}
-{:catch name}
+{:catch name}
{/await}
- #8316 d64e92d Thanks @washbin! - Added the new nursery rule noMultiAssign. This rule helps to prevent multiple chained assignments.
For example, the following code triggers because there are two assignment expressions in the same statement.
const a = (b = 0);
- #8592 a5f59cd Thanks @Netail! - Added the nursery rule useUniqueInputFieldNames. Require fields within an input object to be unique.
Invalid:
query A($x: Int, $x: Int) {
field
}
- #8524 17a6156 Thanks @JacquesLeupin! - Fixed #8488: Relative plugin paths are now resolved from the configuration file directory, including when configurations are merged (e.g. extends: "//").
- #8655 3260ec9 Thanks @JacquesLeupin! - Fixed #8636: Biome's CSS formatter now breaks comma-separated declaration values at top-level commas when wrapping.
- #8537 cc3e851 Thanks @dibashthapa! - Fixed #8491: Resolved false positive errors for safe boolean expressions. There are still pending fixes. Head to #8491 (comment) for more details
This new change will check for safe boolean expressions in variable declarations.
For example,
Valid:
let isOne = 1;
let isPositiveNumber = number > 0;
return (
<div>
{" "}
{isOne && "One"} {isPositiveNumber && "Is positive"}
</div>
);
Invalid:
let emptyStr = "";
let isZero = 0;
return (
<div>
{emptyStr && "Empty String"} {isZero && "Number is zero"}{" "}
</div>
);
- #8511 16a9036 Thanks @ematipico! - Improved the diagnostics of the rules useSortedClasses and noUnnecessaryConditions. The diagnostics now state that these rules are a work in progress and link to the relevant GitHub issue.
- #8521 a704be9 Thanks @ToBinio! - Added the nursery rule useVueConsistentDefinePropsDeclaration, which enforces consistent defineProps declaration style.
Invalid
<script setup lang="ts">
const props = defineProps({
kind: { type: String },
});
</script>
Valid
<script setup lang="ts">
const props = defineProps<{
kind: string;
}>();
</script>
- #8595 7c85bf0 Thanks @dyc3! - Fixed #8584: The HTML formatter will preserve whitespace after some elements and embedded expressions, which more closely aligns with Prettier's behavior.
- <h1>Hello, {framewor
2.3.10 17 de desembre del 2025 — 64 bits PortableARM64 Portable
Notes de la versió
2.3.10
Patch Changes
- #8417 c3a2557 Thanks @taga3s! - Fixed #7809: noRedeclare no longer reports redeclarations for infer type in conditional types.
- #8477 90e8684 Thanks @dyc3! - Fixed #8475: fixed a regression in how noExtraNonNullAssertion flags extra non-null assertions
- #8479 250b519 Thanks @dyc3! - Fixed #8473: The semantic model now indexes typescript constructor method definitions, and no longer panics if you use one (a regression in 2.3.9).
- #8448 2af85c1 Thanks @mdevils! - Improved handling of defineProps() macro in Vue components. The noVueReservedKeys rule now avoids false positives in non-setup scripts.
- #8420 42033b0 Thanks @vsn4ik! - Fixed the nursery rule noLeakedRender.
The biome migrate eslint command now correctly detects the rule react/jsx-no-leaked-render in your eslint configurations.
- #8426 285d932 Thanks @anthonyshew! - Added a Turborepo domain and a new "noUndeclaredEnvVars" rule in it for warning users of unsafe environment variable usage in Turborepos.
- #8410 a21db74 Thanks @ematipico! - Fixed #2988 where Biome couldn't handle properly characters that contain multiple code points when running in stdin mode.
- #8372 b352ee4 Thanks @Netail! - Added the nursery rule noAmbiguousAnchorText, which disallows ambiguous anchor descriptions.
Invalid
<a>learn more</a>
What's Changed
- feat: new Turborepo domain and noUndeclaredEnvVars rule by @anthonyshew in #8426
- fix(noExtraNonNullAssertion): fix regression by @dyc3 in #8477
- fix(analyze/js): index ts constructor methods in semantic model (regression) by @dyc3 in #8479
- fix(lint): lint/suspicous/noRedeclare should not report redeclarations for infer type in conditional types by @taga3s in #8417
- fix(noLeakedRender): eslint rule name fix by @vsn4ik in #8420
- chore: add kraken as bronze sponsor by @dyc3 in #8486
- fix(linter): improve Vue defineProps handling in noVueReservedKeys by @mdevils in #8448
- fix(cli): colors with multi-codepoints characters by @ematipico in #8410
- feat(lint): implement noAmbiguousAnchorText by @Netail in #8372
- ci: release by @github-actions[bot] in #8474
- docs: fix typos for assist/actions/organize-imports by @sergioness in #8490
New Contributors
- @taga3s made their first contribution in #8417
- @vsn4ik made their first contribution in #8420
- @sergioness made their first contribution in #8490
Full Changelog: https://github.com/biomejs/biome/compare/@biomejs/biome@2.3.9...@biomejs/biome@2.3.10
2.3.9 15 de desembre del 2025 — 64 bits PortableARM64 Portable
Notes de la versió
2.3.9
Patch Changes
- #8232 84c9e08 Thanks @ruidosujeira! - Added the nursery rule noScriptUrl.
This rule disallows the use of javascript: URLs, which are considered a form of eval and can pose security risks such as XSS vulnerabilities.
<a href="javascript:alert('XSS')">Click me</a>
- #8341 343dc4d Thanks @arendjr! - Added the nursery rule useAwaitThenable, which enforces that await is only used on Promise values.
Invalid
await "value";
const createValue = () => "value";
await createValue();
Caution
This is a first iteration of the rule, and does not yet detect generic "thenable" values.
- #8034 e7e0f6c Thanks @Netail! - Added the nursery rule useRegexpExec. Enforce RegExp#exec over String#match if no global flag is provided.
- #8137 d407efb Thanks @denbezrukov! - Reduced the internal memory used by the Biome formatter.
- #8281 30b046f Thanks @tylersayshi! - Added the rule useRequiredScripts, which enforces presence of configurable entries in the scripts section of package.json files.
- #8290 d74c8bd Thanks @dyc3! - The HTML formatter has been updated to match Prettier 3.7's behavior for handling <iframe>'s allow attribute.
- <iframe allow="layout-animations 'none'; unoptimized-images 'none'; oversized-images 'none'; sync-script 'none'; sync-xhr 'none'; unsized-media 'none';"></iframe>
+ <iframe
+ allow="
+ layout-animations 'none';
+ unoptimized-images 'none';
+ oversized-images 'none';
+ sync-script 'none';
+ sync-xhr 'none';
+ unsized-media 'none';
+ "
+ ></iframe>
- #8302 d1d5014 Thanks @mlafeldt! - Fixed #8109: return statements in Astro frontmatter no longer trigger "Illegal return statement" errors when using experimentalFullSupportEnabled.
- #8346 f3aee1a Thanks @arendjr! - Fixed #8292: Implement tracking
of types of TypeScript constructor parameter properties.
This resolves certain false negatives in noFloatingPromises and other typed
rules.
Example
class AsyncClass {
async returnsPromise() {
return "value";
}
}
class ShouldBeReported {
constructor(public field: AsyncClass) {}
// ^^^^^^^^^^^^----------------- Parameter property declaration
async shouldBeReported() {
// `noFloatingPromises` will now report the following usage:
this.field.returnsPromise();
}
}
- #8326 153e3c6 Thanks @ematipico! - Improved the rule noBiomeFirstException. The rule can now inspect if extended configurations already contain the catch-all ** inside files.includes and, if so, the rule suggests removing ** from the user configuration.
- #8433 397547a Thanks @dyc3! - Fixed #7920: The CSS parser, with Tailwind directives enabled, will no longer error when you use things like prefix(tw) in @import at rules.
- #8378 cc2a62e Thanks @Bertie690! - Clarify diagnostic message for lint/style/useUnifiedTypeSignatures
The rule's diagnostic message now clearly states that multiple similar overload signatures are hard to read & maintain, as opposed to overload signatures in general.
- #8296 9d3ef10 Thanks @dyc3! - biome rage now shows if you have experimental HTML full support enabled.
- #8414 09acf2a Thanks @Bertie690! - Updated the documentation & diagnostic message for lint/nursery/noProto, mentioning the reasons for its longstanding deprecation and why more modern alternatives are preferred.
Notably, the rule clearly states that using __proto__ inside object literal definitions is still allowed, being a standard way to set the prototype of a newly created object.
- #8445 c3df0e0 Thanks @tt-a1i! - Fix --changed and --staged flags throwing "No such file or directory" error when a file has been deleted or renamed in the working directory. The CLI now filters out files that no longer exist before processing.
- #8459 b17d12b Thanks @ruidosujeira! - Fix #8435: resolved false positive in noUnusedVariables for generic type parameters in construct signature type members (new <T>(): T).
- #8439 a78774b Thanks @tt-a1i! - Fixed #8011: useConsistentCurlyBraces no longer suggests removing curly braces from JSX expression children containing characters that would cau
2.3.8 27 de novembre del 2025 — 64 bits PortableARM64 Portable
Notes de la versió
2.3.8
Patch Changes
- #8188 4ca088c Thanks @ematipico! - Fixed #7390, where Biome couldn't apply the correct configuration passed via --config-path.
If you have multiple root configuration files, running any command with --config-path will now apply the chosen configuration file.
- #8171 79adaea Thanks @dibashthapa! - Added the new rule noLeakedRender. This rule helps prevent potential leaks when rendering components that use binary expressions or ternaries.
For example, the following code triggers the rule because the component would render 0:
const Component = () => {
const count = 0;
return <div>{count && <span>Count: {count}</span>}</div>;
};
- #8116 b537918 Thanks @Netail! - Added the nursery rule noDuplicatedSpreadProps. Disallow JSX prop spreading the same identifier multiple times.
Invalid:
<div {...props} something="else" {...props} />
- #8256 f1e4696 Thanks @cormacrelf! - Fixed a bug where logs were discarded (the kind from --log-level=info etc.). This is a regression introduced after an internal refactor that wasn't adequately tested.
- #8226 3f19b52 Thanks @dyc3! - Fixed #8222: The HTML parser, with Vue directives enabled, can now parse v-slot shorthand syntax, e.g. <template #foo>.
- #8007 182ecdc Thanks @brandonmcconnell! - Added support for dollar-sign-prefixed filenames in the useFilenamingConvention rule.
Biome now allows filenames starting with the dollar-sign (e.g. $postId.tsx) by default to support naming conventions used by frameworks such as TanStack Start for file-based-routing.
- #8218 91484d1 Thanks @hirokiokada77! - Added the noMultiStr rule, which disallows creating multiline strings by escaping newlines.
Invalid:
const foo =
"Line 1\n\
Line 2";
Valid:
const foo = "Line 1\nLine 2";
const bar = `Line 1
Line 2`;
- #8225 98ca2ae Thanks @ongyuxing! - Fixed #7806: Prefer breaking after the assignment operator for conditional types with generic parameters to match Prettier.
-type True = unknown extends Type<
- "many",
- "generic",
- "parameters",
- "one",
- "two",
- "three"
->
- ? true
- : false;
+type True =
+ unknown extends Type<"many", "generic", "parameters", "one", "two", "three">
+ ? true
+ : false;
- #6765 23f7855 Thanks @emilyinure! - Fixed #6569: Allow files to export from themselves with noImportCycles.
This means the following is now allowed:
// example.js
export function example() {
return 1;
}
// Re-exports all named exports from the current module under a single namespace
// and then imports the namespace from the current module.
// Allows for encapsulating functions/variables into a namespace instead
// of using a static class.
export * as Example from "./example.js";
import { Example } from "./example.js";
- #8214 68c052e Thanks @hirokiokada77! - Added the noEqualsToNull rule, which enforces the use of === and !== for comparison with null instead of == or !=.
Invalid:
foo == null;
foo != null;
Valid:
foo === null;
foo !== null;
- #8219 793bb9a Thanks @dyc3! - Fixed #8190: The HTML parser will now parse Vue event handlers that contain : correctly, e.g. @update:modelValue="onUpdate".
- #8259 4a9139b Thanks @hirokiokada77! - Fixed #8254: The noParameterAssign rule with propertyAssignment: "deny" was incorrectly reporting an error when a function parameter was used on the right-hand side of an assignment to a local variable's property.
The rule should only flag assignments that modify the parameter binding or its properties (L-value), not the use of its value.
Valid:
(input) => {
const local = { property: 0 };
local.property = input;
};
- #8201 cd2edd7 Thanks @Netail! - Added the nursery rule noTernary. Disallow ternary operators.
Invalid:
const foo = isBar ? baz : qux;
- #8172 de98933 Thanks @JeremyMoeglich! - Fixed #8145: handling of large hex literals, which previously caused both false positives and false negatives.
This affects noPrecisionLoss and noConstantMathMinMaxClamp.
- #8210 7b44e9e Thanks @Netail! - Corrected rule source reference. biome migrate eslint should do a bit better detec
2.3.7 21 de novembre del 2025 — 64 bits PortableARM64 Portable
Notes de la versió
2.3.7
Patch Changes
- #8169 7fdcec8 Thanks @arendjr! - Fixed #7999: Correctly place await after leading comment in auto-fix action from noFloatingPromises rule.
- #8157 12d5b42 Thanks @Conaclos! - Fixed #8148. noInvalidUseBeforeDeclaration no longer reports some valid use before declarations.
The following code is no longer reported as invalid:
class classA {
C = C;
}
const C = 0;
- #8178 6ba4157 Thanks @dyc3! - Fixed #8174, where the HTML parser would parse 2 directives as a single directive because it would not reject whitespace in Vue directives. This would cause the formatter to erroneously merge the 2 directives into one, resulting in broken code.
- <Component v-else:property="123" />
+ <Component v-else :property="123" />
- #8088 0eb08e8 Thanks @db295! - Fixed #7876: The noUnusedImports rule now ignores imports that are used by @linkcode and @linkplain (previously supported @link and @see).
The following code will no longer be a false positive:
import type { a } from "a"
/**
* {@linkcode a}
*/
function func() {}
- #8119 8d64655 Thanks @ematipico! - Improved the detection of the rule noUnnecessaryConditions. Now the rule isn't triggered for variables that are mutated inside a module.
This logic deviates from the original rule, hence noUnnecessaryConditions is now marked as "inspired".
In the following example, hey starts as false, but then it's assigned to a string. The rule isn't triggered inside the if check.
let hey = false;
function test() {
hey = "string";
}
if (hey) {
}
- #8149 e0a02bf Thanks @Netail! - Fixed #8144: Improve noSyncScripts, ignore script tags with type="module" as these are always non-blocking.
- #8182 e9f068e Thanks @hirokiokada77! - Fixed #7877: Range suppressions now handle suppressed categories properly.
Valid:
// biome-ignore-start lint: explanation
const foo = 1;
// biome-ignore-end lint: explanation
- #8111 bf1a836 Thanks @ryan-m-walker! - Added support for parsing and formatting the CSS if function.
Example
.basic-style {
color: if(style(--scheme: dark): #eeeeee; else: #000000;);
}
- #8173 7fc07c1 Thanks @ematipico! - Fixed #8138 by reverting an internal refactor that caused a regression to the rule noUnusedPrivateClassMembers.
- #8119 8d64655 Thanks @ematipico! - Improved the type inference engine, by resolving types for variables that are assigned to multiple values.
- #8158 fb1458b Thanks @dyc3! - Added the useVueValidVText lint rule to enforce valid v-text directives. The rule reports when v-text has an argument, has modifiers, or is missing a value.
Invalid:
<div v-text />
<!-- missing value -->
<div v-text:aaa="foo" />
<!-- has argument -->
<div v-text.bbb="foo" />
<!-- has modifier -->
- #8158 fb1458b Thanks @dyc3! - Fixed useVueValidVHtml so that it will now flag empty strings, e.g. v-html=""
- #7078 bb7a15c Thanks @emilyinure! - Fixed #6675: Now only flags
noAccumulatingSpread on Object.assign when a new object is being allocated on
each iteration. Before, all cases using Object.assign with reduce parameters
were warned despite not making new allocations.
The following code will no longer be a false positive:
foo.reduce((acc, bar) => Object.assign(acc, bar), {});
The following cases which do make new allocations will continue to warn:
foo.reduce((acc, bar) => Object.assign({}, acc, bar), {});
- #8175 0c8349e Thanks @ryan-m-walker! - Fixed CSS formatting of dimension units to use correct casing for Q, Hz and kHz.
Before:
.cssUnits {
a: 1Q;
b: 1Hz;
c: 1kHz;
}
After:
.cssUnits {
a: 1Q;
b: 1Hz;
c: 1kHz;
}
What's Changed
- chore: remove gold sponsor by @ematipico in #8135
- fix: next namespace by @Netail in #8142
- fix(schema): domains and feature kind by @ematipico in #8147
- docs(lint/html): fix some html rule docs that mess up markdown rendering on the website by @dyc3 in #8154
- fix(noInvalidUseBeforeDeclaration): ignore valid use before declarations by @Conaclos in #8157
- fix: noSyncScripts type="module" by @Netail in #8149
- feat(css): add support for parsing and formatting the CSS 
2.3.6 17 de novembre del 2025 — 64 bits PortableARM64 Portable
Notes de la versió
2.3.6
Patch Changes
- #8100 82b9a8e Thanks @Netail! - Added the nursery rule useFind. Enforce the use of Array.prototype.find() over Array.prototype.filter() followed by [0] when looking for a single result.
Invalid:
[1, 2, 3].filter((x) => x > 1)[0];
[1, 2, 3].filter((x) => x > 1).at(0);
- #8118 dbc7021 Thanks @hirokiokada77! - Fixed #8117: useValidLang now accepts valid BCP 47 language tags with script subtags.
Valid:
<html lang="zh-Hans-CN"></html>
- #7672 f1d5725 Thanks @Netail! - Added the nursery rule useConsistentGraphqlDescriptions, requiring all descriptions to follow the same style (either block or inline) inside GraphQL files.
Invalid:
enum EnumValue {
"this is a description"
DEFAULT
}
Valid:
enum EnumValue {
"""
this is a description
"""
DEFAULT
}
- #8026 f102661 Thanks @matanshavit! - Fixed #8004: noParametersOnlyUsedInRecursion now correctly detects recursion by comparing function bindings instead of just names.
Previously, the rule incorrectly flagged parameters when a method had the same name as an outer function but called the outer function (not itself):
function notRecursive(arg) {
return arg;
}
const obj = {
notRecursive(arg) {
return notRecursive(arg); // This calls the outer function, not the method itself
},
};
Biome now properly distinguishes between these cases and will not report false positives.
- #8097 5fc5416 Thanks @dyc3! - Added the nursery rule noVueVIfWithVFor. This rule disallows v-for and v-if on the same element.
<!-- Invalid -->
<div v-for="item in items" v-if="item.isActive">
{{ item.name }}
</div>
- #8085 7983940 Thanks @Netail! - Added the nursery rule noForIn. Disallow iterating using a for-in loop.
Invalid:
for (const i in array) {
console.log(i, array[i]);
}
- #8086 2b41e82 Thanks @matanshavit! - Fixed #8045: The noNestedTernary rule now correctly detects nested ternary expressions even when they are wrapped in parentheses (e.g. foo ? (bar ? 1 : 2) : 3).
Previously, the rule would not flag nested ternaries like foo ? (bar ? 1 : 2) : 3 because the parentheses prevented detection. The rule now looks through parentheses to identify nested conditionals.
Previously not detected (now flagged):
const result = foo ? (bar ? 1 : 2) : 3;
Still valid (non-nested with parentheses):
const result = foo ? bar : baz;
- #8075 e403868 Thanks @YTomm! - Fixed #7948: The useReadonlyClassProperties code fix when checkAllProperties is enabled will no longer insert a newline after readonly and the class property.
- #8102 47d940e Thanks @lucasweng! - Fixed #8027. useReactFunctionComponents no longer reports class components that implement componentDidCatch using class expressions.
The rule now correctly recognizes error boundaries defined as class expressions:
const ErrorBoundary = class extends Component {
componentDidCatch(error, info) {}
render() {
return this.props.children;
}
};
- #8097 5fc5416 Thanks @dyc3! - Added the nursery rule useVueHyphenatedAttributes, which encourages using kebab case for attribute names, per the Vue style guide's recommendations.
<!-- Invalid -->
<MyComponent myProp="value" />
<!-- Valid -->
<MyComponent my-prop="value" />
- #8108 0f0a658 Thanks @Netail! - Added the nursery rule noSyncScripts. Prevent the usage of synchronous scripts.
Invalid:
<script src="https://third-party-script.js" />
Valid:
<script src="https://third-party-script.js" async />
<script src="https://third-party-script.js" defer />
- #8098 1fdcaf0 Thanks @Jayllyz! - Added documentation URLs to rule descriptions in the JSON schema.
- #8097 5fc5416 Thanks @dyc3! - Fixed an issue with the HTML parser where it would treat Vue directives with dynamic arguments as static arguments instead.
- #7684 f4433b3 Thanks @vladimir-ivanov! - Changed noUnusedPrivateClassMembers to align more fully with meaningful reads.
This rule now distinguishes more carefully between writes and reads of private class members.
- A meaningful read is any access that affects program behavior.
- For example, this.#x += 1 both reads and writes #
2.3.5 11 de novembre del 2025 — 64 bits PortableARM64 Portable
Notes de la versió
2.3.5
Patch Changes
- #8023 96f3e77 Thanks @ematipico! - Added support Svelte syntax {@html}. Biome now is able to parse and format the Svelte syntax {@html}:
-{@html 'div'}
+{@html 'div'}
The contents of the expressions inside the {@html <expression>} aren't formatted yet.
- #8058 5f68bcc Thanks @ematipico! - Fixed a bug where the Biome Language Server would enable its project file watcher even when no project rules were enabled.
Now the watching of nested configuration files and nested ignore files is delegated to the editor, if their LSP spec supports it.
- #8023 96f3e77 Thanks @ematipico! - Added support Svelte syntax {@render}. Biome now is able to parse and format the Svelte syntax {@render}:
-{@render sum(1, 2) }
+{@render sum(1, 2)}
The contents of the expressions inside the {@render <expression>} aren't formatted yet.
- #8006 f0612a5 Thanks @Bertie690! - Updated documentation and diagnostic for lint/complexity/noBannedTypes. The rule should have a more detailed description and diagnostic error message.
- #8039 da70d8b Thanks @PFiS1737! - Biome now keeps a blank line after the frontmatter section in Astro files.
- #8042 b7efa6f Thanks @dyc3! - The CSS Parser, with tailwindDirectives enabled, will now accept at rules like @media and @supports in @custom-variant shorthand syntax.
- #8064 3ff9d45 Thanks @dibashthapa! - Fixed #7967: Fixed the issue with support for advanced SVG props
- #8023 96f3e77 Thanks @ematipico! - Added support Svelte syntax {@attach}. Biome now is able to parse and format the Svelte syntax {@attach}:
-<div {@attach myAttachment }>...</div>
+<div {@attach myAttachment}>...</div>
The contents of the expressions inside the {@attach <expression>} aren't formatted yet.
- #8001 6e8a50e Thanks @ematipico! - Added support Svelte syntax {#key}. Biome now is able to parse and format the Svelte syntax {#key}:
-{#key expression} <div></div> {/key}
+{#key expression}
+ <div></div>
+{/key}
The contents of the expressions inside the {#key <expression>} aren't formatted yet.
- #8023 96f3e77 Thanks @ematipico! - Added support Svelte syntax {@const}. Biome now is able to parse and format the Svelte syntax {@const}:
-{@const name = value}
+{@const name = value}
The contents of the expressions inside the {@const <expression>} aren't formatted yet.
- #8044 8f77d4a Thanks @Netail! - Corrected rule source references. biome migrate eslint should do a bit better detecting rules in your eslint configurations.
- #8065 1a2d1af Thanks @Netail! - Added the nursery rule useArraySortCompare. Require Array#sort and Array#toSorted calls to always provide a compareFunction.
Invalid:
const array = [];
array.sort();
Valid:
const array = [];
array.sort((a, b) => a - b);
- #7673 a3a713d Thanks @dyc3! - The HTML parser is now able to parse vue directives. This enables us to write/port Vue lint rules that require inspecting the <template> section. However, this more complex parsing may result in parsing errors where there was none before. For those of you that have opted in to the experimental support (aka experimentalFullSupportEnabled), we greatly appreciate your help testing this out, and your bug reports.
- #8031 fa6798a Thanks @ematipico! - Added support for the Svelte syntax {#if}{/if}. The Biome HTML parser is now able to parse and format the {#if}{/if} blocks:
<!-- if / else-if / else -->
{#if porridge.temperature > 100}
-<p>too hot!</p>
+ <p>too hot!</p>
{:else if 80 > porridge.temperature}
-<p>too cold!</p>
+ <p>too cold!</p>
{:else if 100 > porridge.temperature}
-<p>too too cold!</p>
+ <p>too too cold!</p>
{:else}
-<p>just right!</p>
+ <p>just right!</p>
{/if}
- #8041 beeb7bb Thanks @dyc3! - The CSS parser, with tailwindDirectives enabled, will now accept lists of selectors in @custom-variant shorthand syntax.
@custom-variant cell (th:has(&), td:has(&));
- #8028 c09e45c Thanks @fmajestic! - The GitLab reporter now outputs format errors.
- #8037 78011b1 Thanks @PFiS1737! - indentScriptAndStyle no longer indents the frontmatter in
2.3.4 5 de novembre del 2025 — 64 bits PortableARM64 Portable
Notes de la versió
2.3.4
Patch Changes
- #7989 4855c4a Thanks @alissonlauffer! - Fixed a regression in Astro frontmatter parsing where comments inside quoted strings were incorrectly detected as actual comments. This caused the parser to prematurely terminate frontmatter parsing when encountering strings like const test = "//";.
For example, the following Astro frontmatter now parses correctly:
---
const test = "// not a real comment";
---
- #7968 0b28f5f Thanks @denbezrukov! - Refactored formatter to use strict Token element for better performance. The new Token variant is optimized for static, ASCII-only text (keywords, operators, punctuation) with the following constraints:
- ASCII only (no Unicode characters)
- No newlines (\n, \r)
- No tab characters (\t)
This enables faster printing and fitting logic by using bulk string operations (push_str, len()) instead of character-by-character iteration with Unicode width calculations.
- #7941 19b8280 Thanks @Conaclos! - Fixed #7943. Rules' options are now properly merged with the inherited options from a shared configuration.
This means that you can now override a specific option from a rule without resetting the other options to their default.
Given the following shared configuration:
{
"linter": {
"rules": {
"style": {
"useNamingConvention": {
"level": "on",
"options": {
"strictCase": false,
"conventions": [
{
"selector": { "kind": "variable", "scope": "global" },
"formats": ["CONSTANT_CASE"]
}
]
}
}
}
}
}
}
And the user configuration that extends this shared configuration:
{
"extends": ["shared.json"],
"linter": {
"rules": {
"style": {
"useNamingConvention": {
"level": "on",
"options": { "strictCase": true }
}
}
}
}
}
The obtained merged configuration is now as follows:
{
"extends": ["shared.json"],
"linter": {
"rules": {
"style": {
"useNamingConvention": {
"level": "on",
"options": {
"strictCase": true,
"conventions": [
{
"selector": { "kind": "variable", "scope": "global" },
"formats": ["CONSTANT_CASE"]
}
]
}
}
}
}
}
}
- #7969 425963d Thanks @ematipico! - Added support for the Svelte syntax {@debug}. The Biome HTML parser is now able to parse and format the blocks:
-{@debug foo,bar, something}
+{@debug foo, bar, something}
- #7986 3256f82 Thanks @lisiur! - Fixed #7981. Now Biome correctly detects and parses lang='tsx' and lang='jsx' languages when used inside in .vue files, when .experimentalFullSupportEnabled is enabled.
- #7921 547c2da Thanks @dyc3! - Fixed #7854: The CSS parser, with tailwindDirectives enabled, will now parse @source inline("underline");.
- #7856 c9e20c3 Thanks @Netail! - Added the nursery rule noContinue. Disallowing the usage of the continue statement, structured control flow statements such as if should be used instead.
Invalid:
let sum = 0,
i;
for (i = 0; i < 10; i++) {
if (i >= 5) {
continue;
}
sum += i;
}
Valid:
let sum = 0,
i;
for (i = 0; i < 10; i++) {
if (i < 5) {
sum += i;
}
}
What's Changed
- fix(parse/css): parse tailwind @source inline(...) by @dyc3 in #7921
- feat(html): implement {@debug} parsing by @ematipico in #7969
- fix(parse/tailwind): fix lexing variants that start with numbers by @dyc3 in #7966
- feat(lint): implement noContinue by @Netail in #7856
- fix(config): implement Merge for rules' options by @Conaclos in #7941
- chore: add graphite as bronze sponsor by @dyc3 in #7974
- chore: graphql tests options by @Netail in #7979
- refactor(formatter): introduce Token element by @denbezrukov in #7968
- fix(ROME_CHANGELOG.md): grammar and typo error by @WuMingDao in #7992
- chore(parser): increase size of SyntaxKindSet bitfield by @ryan-m-walker in #7994
- fix(RELEASES.md): grammar and typo error by @WuMingDao in #7993
- fix(html): fix comment detection in Astro frontmatter by @alissonlauffer in #7989
- feat: support html.experimentalFullSupportEnabled for vue with jsx/tsx script by @lisiur in #7986
- ci: release by @github-actions[bot] in #7965
New Contributors
- @WuMingDao made their first contribution in #7992
- @lisiur made their first contribution in #
2.3.3 3 de novembre del 2025 — 64 bits PortableARM64 Portable
Notes de la versió
2.3.3
Patch Changes
- #7907 57bd662 Thanks @ematipico! - Fixed #7839. Now the Biome parser correctly parses the Astro frontmatter even when a triple fence is inside quotes.
- #7934 a35c496 Thanks @alissonlauffer! - Fixed #7919: The HTML parser now correctly handles Unicode BOM (Byte Order Mark) characters at the beginning of HTML files, ensuring proper parsing and tokenization.
- #7869 c80361d Thanks @matanshavit! - Fixed #7864: Biome now preserves component tag name casing in Svelte, Astro, and Vue files.
- #7926 69cecec Thanks @matanshavit! - Added the rule noParametersOnlyUsedInRecursion.
This rule detects function parameters that are exclusively used in recursive calls and can be removed to simplify the function signature since they are effectively unused.
function factorial(n, acc) {
if (n === 0) return 1;
return factorial(n - 1, acc); // acc is only used here
}
Fixes #6484.
- #7774 2509b91 Thanks @dibashthapa! - Fixed #7657: Added the new rule no-unknown-property from ESLint
- #7918 7165d06 Thanks @dyc3! - Fixed #7913: The CSS parser, with tailwindDirectives enabled, will now correctly handle @slot.
- #7959 ffae203 Thanks @siketyan! - Fixed the Biome Language Server so it no longer returns an internal error when the formatter is disabled in the configuration.
What's Changed
- fix(html): parse frontmatter inside quotes by @ematipico in #7907
- fix(parse/css): add @slot tailwind at rule by @dyc3 in #7918
- fix(formatter): preserve component tag casing in Svelte/Astro/Vue files by @matanshavit in #7869
- feat(lint): new rule: no parameters only used in recursion by @matanshavit in #7926
- fix(html): correctly handle BOM in HTML-ish languages by @alissonlauffer in #7934
- feat(yaml_parser): parse document end token by @l0ngvh in #7936
- feat(parse/tailwind): parse negative candidates, other misc cleanup/refactors by @dyc3 in #7937
- feat(lint): implement no-unknown-property from eslint react by @dibashthapa in #7774
- chore: update Rust to v1.91.0 by @Gumichocopengin8 in #7947
- chore(deps): update github-actions by @renovate[bot] in #7952
- chore(deps): update dependency @types/node to v22.19.0 by @renovate[bot] in #7953
- chore(deps): update rust crate ignore to 0.4.25 by @renovate[bot] in #7954
- chore(deps): update dependency eslint to v9.39.0 - autoclosed by @renovate[bot] in #7955
- fix(console): escape backquotes in MDX context by @siketyan in #7956
- fix(lsp): do not return error if the formatter is disabled by @siketyan in #7959
- ci: release by @github-actions[bot] in #7916
New Contributors
- @matanshavit made their first contribution in #7869
- @alissonlauffer made their first contribution in #7934
- @dibashthapa made their first contribution in #7774
Full Changelog: https://github.com/biomejs/biome/compare/@biomejs/biome@2.3.2...@biomejs/biome@2.3.3
2.3.2 28 d’octubre del 2025 — 64 bits PortableARM64 Portable
Notes de la versió
2.3.2
Patch Changes
- #7859 c600618 Thanks @Netail! - Added the nursery rule noIncrementDecrement, disallows the usage of the unary operators ++ and --.
- #7901 0d17b05 Thanks @ematipico! - Fixed #7837, where Biome couldn't properly parse text expressions that contained nested curly brackets. This was breaking parsing in Astro and Svelte files.
- #7874 e617d36 Thanks @Bertie690! - Fixed #7230: noUselessStringConcat no longer emits false positives for multi-line strings with leading + operators.
Previously, the rule did not check for leading newlines on the + operator, emitting false positives if one occurred at the start of a line.
Notably, formatting with operatorLinebreak="before" would move the + operators to the start of lines automatically, resulting in spurious errors whenever a multi-line string was used.
Now, the rule correctly detects and ignores multi-line concatenations with leading operators as well, working regardless of the setting of operatorLinebreak.
Example
// The following code used to error if the `+` operators were at the start of lines (as opposed to the end).
// Now, the rule correctly recognizes this as a stylistic concatenation and ignores it.
const reallyLongStringThatShouldNotError =
"Lorem ipsum dolor sit amet consectetur adipiscing elit." +
"Quisque faucibus ex sapien vitae pellentesque sem placerat." +
"In id cursus mi pretium tellus duis convallis." +
"Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla";
- #7786 33ffcd5 Thanks @daivinhtran! - Fixed #7601: Properly match Grit plugin's code snippet with only one child.
- #7901 0d17b05 Thanks @ematipico! - Fixed #7837, where Biome Language Server panicked when opening HTML-ish files when the experimental full support is enabled.
What's Changed
- fix(lint): noUselessStringConcat now correctly detects leading concatenation operators from operatorLinebreak=before by @Bertie690 in #7874
- chore(deps): update rust crate globset to 0.4.18 by @renovate[bot] in #7883
- chore(deps): update rust crate ignore to 0.4.24 by @renovate[bot] in #7884
- chore(deps): update rust crate proc-macro2 to 1.0.103 by @renovate[bot] in #7885
- chore(deps): update rust crate tikv-jemallocator to 0.6.1 by @renovate[bot] in #7886
- fix(lint): extend matcher for GritCodeSnippet to cover edge case by @daivinhtran in #7786
- feat(js): update Boa to v0.21.0 by @Gumichocopengin8 in #7888
- chore(deps): update dependency eslint to v9.38.0 by @renovate[bot] in #7890
- chore(deps): update rust crate indexmap to 2.12.0 by @renovate[bot] in #7891
- chore(deps): update github-actions - autoclosed by @renovate[bot] in #7892
- chore(deps): update rust crate rayon to 1.11.0 by @renovate[bot] in #7894
- chore(deps): update rust crate regex to 1.12.2 by @renovate[bot] in #7895
- chore(deps): update rust crate tokio to 1.48.0 by @renovate[bot] in #7896
- fix(core): text expression parsing and LSP file opening by @ematipico in #7901
- feat(lint): implement noIncrementDecrement by @Netail in #7859
- ci: release by @github-actions[bot] in #7887
Full Changelog: https://github.com/biomejs/biome/compare/@biomejs/biome@2.3.1...@biomejs/biome@2.3.2
2.3.1 26 d’octubre del 2025 — 64 bits PortableARM64 Portable
Notes de la versió
2.3.1
Patch Changes
- #7840 72afdfa Thanks @ematipico! - Fixed #7838, which caused the new --css-parse-* arguments not being recognised by the ci command.
- #7789 d5b416e Thanks @fronterior! - Fixed the LSP method workspace/didChangeWorkspaceFolders to perform incremental updates instead of replacing the entire folder list.
- #7852 bd254c7 Thanks @dyc3! - Fixed #7843: The CSS parser, when tailwindDirectives is enabled, correctly parses --*: initial;.
- #7872 0fe13fe Thanks @dyc3! - Fixed #7861: The HTML parser will now accept Svelte attribute shorthand syntax in .svelte files.
- #7866 7b2600b Thanks @dyc3! - Fixed #7860: The css parser, with tailwindDirectives enabled, will now accept @plugin options.
- #7853 fe90c78 Thanks @dyc3! - Fixed #7848: The css parser with tailwindDirectives enabled will now correctly parse tailwind's source exclude syntax: @source not "foo.css";
- #7878 c9f7fe5 Thanks @ematipico! - Fixed #7857: Biome now parses <script> tags as TypeScript when analysing .astro files.
- #7867 b42b718 Thanks @smorimoto! - Fixed incorrect option name in HTML parser error message.
The error message for disabled text expressions incorrectly referred
to the html.parser.textExpression option, which does not exist.
Updated it to reference the correct html.parser.interpolation option.
What's Changed
- fix(cli): css parsing arguments for ci command by @ematipico in #7840
- chore: document rule-group severity relation and update rules_check by @Conaclos in #7827
- fix(lsp): make update_workspace_folders perform incremental updates per LSP spec by @fronterior in #7789
- ci(rules-check): add noSecrets exception by @Conaclos in #7862
- ci: fix clippy failure by @Conaclos in #7863
- fix(parse/css): fix parsing --*: initial; with tailwindDirectives enabled by @dyc3 in #7852
- fix(parse/css): fix parsing tailwind source exclude syntax by @dyc3 in #7853
- fix(core): parse astro script as TS by @ematipico in #7878
- fix(biome_html_parser): fix incorrect option name in HTML parser error message by @smorimoto in #7867
- chore: ai docs revamp by @ematipico in #7879
- fix(parse/css): allow @plugin to accept options by @dyc3 in #7866
- feat(parse/html): parse svelte shorthand props and spread props by @dyc3 in #7872
- ci: release by @github-actions[bot] in #7842
New Contributors
- @fronterior made their first contribution in #7789
- @smorimoto made their first contribution in #7867
Full Changelog: https://github.com/biomejs/biome/compare/@biomejs/biome@2.3.0...@biomejs/biome@2.3.1
2.3.0 24 d’octubre del 2025 — 64 bits PortableARM64 Portable
Notes de la versió
2.3.0
Minor Changes
- #7263 a3e3369 Thanks @arendjr! - Biome's resolver now supports baseUrl if specified in tsconfig.json.
Example
Given the following file structure:
tsconfig.json
{
"compilerOptions": {
"baseUrl": "./src"
}
}
src/foo.ts
export function foo() {}
In this scenario, import { foo } from "foo"; should work regardless of the
location of the file containing the import statement.
Fixes #6432.
- #7745 6fcbc07 Thanks @dyc3! - Added ignore option to noUnknownAtRules. If an unknown at-rule matches any of the items provided in ignore, a diagnostic won't be emitted.
- #7753 63cb7ff Thanks @ematipico! - Enhanced the init command. The init command now checks if the existing project contains known ignore files and known generated folders.
If Biome finds .gitignore or .ignore files, it will add the following configuration to biome.json:
{
+ "vcs": {
+ "enabled": true,
+ "clientKind": "git",
+ "useIgnoreFile": true
+ }
}
If Biome finds a dist/ folder, it will exclude it automatically using the double-exclude syntax:
{
+ "files": {
+ "includes": ["**", "!!**/dist"]
+ }
}
- #7548 85d3a3a Thanks @siketyan! - The rules in a domain are no longer enabled automatically by the installed dependencies unless the rule is recommended.
- #7723 d3aac63 Thanks @ematipico! - Added --css-parse-css-modules CLI flag to control whether CSS Modules syntax is enabled.
You can now enable or disable CSS Modules parsing directly from the command line:
biome check --css-parse-css-modules=true file.module.css
biome format --css-parse-css-modules=true file.module.css
biome lint --css-parse-css-modules=true file.module.css
biome ci --css-parse-css-modules=true file.module.css
- #7723 d3aac63 Thanks @ematipico! - Added --css-parse-tailwind-directives CLI flag to control whether Tailwind CSS 4.0 directives and functions are enabled.
You can now enable or disable Tailwind CSS 4.0 directive parsing directly from the command line:
biome check --css-parse-tailwind-directives=true file.css
biome format --css-parse-tailwind-directives=true file.css
biome lint --css-parse-tailwind-directives=true file.css
biome ci --css-parse-tailwind-directives=true file.css
- #7330 272632f Thanks @ematipico! - Updated the formatting of .svelte and .vue files. Now the indentation of the JavaScript blocks matches Prettier's:
<script>
- import Component from "./Component"
+ import Component from "./Component"
</script>
- #7333 de0d2d6 Thanks @dyc3! - Implemented the indentScriptAndStyle option for vue and svelte files, with the default set to false to match Prettier's vueIndentScriptAndStyle option. When enabled, this option indents the content within <script> and <style> tags to align with the surrounding HTML structure.
It can be enabled with this configuration:
{
"html": {
"formatter": {
"indentScriptAndStyle": true
}
}
}
Which will format this code to:
<script>
import Component from "./Component.vue";
</script>
- #7359 ebbddc4 Thanks @arendjr! - Deprecated the option files.experimentalScannerIgnores in favour of force-ignore syntax in files.includes.
files.includes supports ignoring files by prefixing globs with an exclamation mark (!). With this change, it also supports force-ignoring globs by prefixing them with a double exclamation mark (!!).
The effect of force-ignoring is that the scanner will not index files matching the glob, even in project mode, even if those files are imported by other files, and even if they are files that receive special treatment by Biome, such as nested biome.json files.
Example
Let's take the following configuration:
{
"files": {
"includes": [
"**",
"!**/generated",
"!!**/dist",
"fixtures/example/dist/*.js"
]
},
"linter": {
"domains": {
"project": "all"
}
}
}
This configuration achieves the following:
- Because the project domain is enabled, all supported files in the project are indexed and processed by the linter, except:
- Files inside a generated folder are not processed by the linter, but they will get indexed if a file outside a generated fo
2.2.7 22 d’octubre del 2025 — 64 bits PortableARM64 Portable
Notes de la versió
2.2.7
Patch Changes
- #7715 b622425 Thanks @Netail! - Added the nursery rule noEmptySource, disallowing meaningless js, css, json & graphql files to prevent codebase clutter.
- #7714 c7e5a14 Thanks @MeGaNeKoS! - Increased the maximum line limit for noExcessiveLinesPerFunction from 255 to 65,535 to better support large JSX/front-end components.
- #5868 2db73ae Thanks @bushuai! - Fixed #5856, noRedundantUseStrict now keeps leading trivia
- #7756 d665c97 Thanks @ematipico! - Improved the diagnostic message of the rule noDuplicateTestHooks.
What's Changed
- fix(deps): update dependency happy-dom to v20 [security] by @renovate[bot] in #7729
- chore(deps): update docker/dockerfile:1 docker digest to b6afd42 by @renovate[bot] in #7735
- perf: use the PathsMut API to watch/unwatch folders by @siketyan in #7750
- feat(lint): implement noEmptySource by @Netail in #7715
- docs: slight useEmptySource improvement by @Netail in #7757
- fix(noRedundantUseStrict): keeps leading trivia by @bushuai in #5868
- chore: add some Web Platform Tests testcases by @drwpow in #7135
- chore: accept snapshots that were failing CI by @dyc3 in #7767
- fix: detect inifinite loops caused by conflicting rule fixes by @dyc3 in #7732
- chore(deps): update dependency happy-dom to v20.0.2 [security] by @renovate[bot] in #7768
- fix(noDuplicateTestHooks): diagnostic message by @ematipico in #7756
- fix(no_excessive_lines_per_function): expand max_lines Range in NoExcessiveLinesPerFunctionOptions by @MeGaNeKoS in #7714
- ci: add CI workflow for trusted publishers for crates by @ematipico in #7769
- chore: improve rule templates by @Netail in #7781
- fix(workspace): unload plugin cache when project closes by @dyc3 in #7790
- chore(deps): update rust crate cfg-if to 1.0.4 by @renovate[bot] in #7793
- chore(deps): update rust crate globset to 0.4.17 by @renovate[bot] in #7794
- ci: use classic tokens for crate publishing by @ematipico in #7801
- chore(deps): update github-actions by @renovate[bot] in #7791
- chore(deps): update dependency vite to v7.1.11 [security] by @renovate[bot] in #7807
- Revert "fix(lint/useExhaustiveDependencies): correct fix for method calls" by @siketyan in #7810
- chore(deps): update pnpm to v10.19.0 by @renovate[bot] in #7739
- chore(deps): update dependency @types/node to v22.18.12 by @renovate[bot] in #7792
- ci: release by @github-actions[bot] in #7755
- chore: fix formatting and code of script by @ematipico in #7821
- test: ignore tests on macos by @ematipico in #7820
New Contributors
- @MeGaNeKoS made their first contribution in #7714
Full Changelog: https://github.com/biomejs/biome/compare/@biomejs/biome@2.2.6...@biomejs/biome@2.2.7
2.2.6 13 d’octubre del 2025 — 64 bits PortableARM64 Portable
Notes de la versió
2.2.6
Patch Changes
- #7071 a8e7301 Thanks @ptkagori! - Added the useQwikMethodUsage lint rule for the Qwik domain.
This rule validates Qwik hook usage. Identifiers matching useXxx must be called only within serialisable reactive contexts (for example, inside component$, route loaders/actions, or within other Qwik hooks), preventing common Qwik antipatterns.
Invalid:
// Top-level hook call is invalid.
const state = useStore({ count: 0 });
function helper() {
// Calling a hook in a non-reactive function is invalid.
const loc = useLocation();
}
Valid:
component$(() => {
const state = useStore({ count: 0 }); // OK inside component$.
return <div>{state.count}</div>;
});
const handler = $(() => {
const loc = useLocation(); // OK inside a $-wrapped closure.
console.log(loc.params);
});
- #7685 52071f5 Thanks @denbezrukov! - Fixed #6981: The NoUnknownPseudoClass rule no longer reports local pseudo-classes when CSS Modules are used.
- #7640 899f7b2 Thanks @arendjr! - Fixed #7638: useImportExtensions no longer emits diagnostics on valid import paths that end with a query or hash.
Example
// This no longer warns if `index.css` exists:
import style from "../theme/index.css?inline";
- #7071 a8e7301 Thanks @ptkagori! - Added the useQwikValidLexicalScope rule to the Qwik domain.
This rule helps you avoid common bugs in Qwik components by checking that your variables and functions are declared in the correct place.
Invalid:
// Invalid: state defined outside the component's lexical scope.
let state = useStore({ count: 0 });
const Component = component$(() => {
return (
<button onClick$={() => state.count++}>Invalid: {state.count}</button>
);
});
Valid:
// Valid: state initialised within the component's lexical scope and captured by the event.
const Component = component$(() => {
const state = useStore({ count: 0 });
return <button onClick$={() => state.count++}>Valid: {state.count}</button>;
});
- #7620 5beb1ee Thanks @Netail! - Added the rule useDeprecatedDate, which makes a deprecation date required for the graphql @deprecated directive.
Invalid
query {
member @deprecated(reason: "Use `members` instead") {
id
}
}
Valid
query {
member
@deprecated(reason: "Use `members` instead", deletionDate: "2099-12-25") {
id
}
}
- #7709 d6da4d5 Thanks @siketyan! - Fixed #7704: The useExhaustiveDependencies rule now correctly adds an object dependency when its method is called within the closure.
For example:
function Component(props) {
useEffect(() => {
props.foo();
}, []);
}
will now be fixed to:
function Component(props) {
useEffect(() => {
props.foo();
}, [props]);
}
- #7624 309ae41 Thanks @lucasweng! - Fixed #7595: noUselessEscapeInString no longer reports $\{ escape in template literals.
- #7665 29e4229 Thanks @ryan-m-walker! - Fixed #7619: Added support for parsing the CSS :state() pseudo-class.
custom-selector:state(checked) {
}
- #7608 41df59b Thanks @ritoban23! - Fixed #7604: the useMaxParams rule now highlights parameter lists instead of entire function bodies. This provides more precise error highlighting. Previously, the entire function was highlighted; now only the parameter list is highlighted, such as (a, b, c, d, e, f, g, h).
- #7643 459a6ac Thanks @daivinhtran! - Fixed #7580: Include plugin in summary report
What's Changed
- chore: add .zed to gitignore by @daivinhtran in #7634
- fix(lint/noUselessEscapeInString): avoid false positive for ${ escape in template literals by @lucasweng in #7624
- fix(lint): only highlight function names in useMaxParams rule by @ritoban23 in #7608
- docs: add Polish translation of Biome README by @SzymCode in #7630
- fix(linter): useImportExtensions handles queries and hashes by @arendjr in #7640
- ci: breakdown benchmarks by @ematipico in #7641
- chore: upgrade to rust 1.90.0 by @ematipico in #7642
- fix(css_parser): add support for parsing :state() (#7619) by @ryan-m-walker in #7665
- fix(cli): include plugin rule in summary report by @daivinhtran in #7643
- feat(qwik): add useQwikMethodUsage & useQwikValid
2.2.5 2 d’octubre del 2025 — 64 bits PortableARM64 Portable
Notes de la versió
2.2.5
Patch Changes
- #7597 5c3d542 Thanks @arendjr! - Fixed #6432: useImportExtensions now works correctly with aliased paths.
- #7269 f18dac1 Thanks @CDGardner! - Fixed #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.
// 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.
// 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 002cded Thanks @siketyan! - Fixed #6893: The useExhaustiveDependencies rule now correctly adds a dependency that is captured in a shorthand object member. For example:
useEffect(() => {
console.log({ firstId, secondId });
}, []);
is now correctly fixed to:
useEffect(() => {
console.log({ firstId, secondId });
}, [firstId, secondId]);
- #7509 1b61631 Thanks @siketyan! - Added a new lint rule noReactForwardRef, which detects usages of forwardRef that is no longer needed and deprecated in React 19.
For example:
export const Component = forwardRef(function Component(props, ref) {
return <div ref={ref} />;
});
will be fixed to:
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 3f06e19 Thanks @arendjr! - Added new nursery rule noDeprecatedImports to flag imports of deprecated symbols.
Invalid example
// foo.js
import { oldUtility } from "./utils.js";
// utils.js
/**
* @deprecated
*/
export function oldUtility() {}
Valid examples
// foo.js
import { newUtility, oldUtility } from "./utils.js";
// utils.js
export function newUtility() {}
// @deprecated (this is not a JSDoc comment)
export function oldUtility() {}
- #7457 9637f93 Thanks @kedevked! - Added style and requireForObjectLiteral options to the lint rule useConsistentArrowReturn.
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:
const f = () => 1;
Valid:
const f = () => {
return 1;
};
style: "never"
Invalid:
const f = () => {
return 1;
};
Valid:
const f = () => 1;
style: "asNeeded"
Invalid:
const f = () => {
return 1;
};
Valid:
const f = () => 1;
style: "asNeeded" and requireForObjectLiteral: true
Valid:
const f = () => {
return { a: 1 };
};
- #7510 527cec2 Thanks @rriski! - Implements #7339. GritQL patterns can now use native Biome AST nodes using their PascalCase names, in addition to the existing TreeSitter-compatible snake_case names.
engine biome(1.0)
language js(typescript,jsx)
or {
// TreeSitter-compatible pattern
2.2.4 10 de setembre del 2025 — 64 bits PortableARM64 Portable
Notes de la versió
2.2.4
Patch Changes
- #7453 aa8cea3 Thanks @arendjr! - Fixed #7242: Aliases specified in package.json's imports section now support having multiple targets as part of an array.
- #7454 ac17183 Thanks @arendjr! - Greatly improved performance of noImportCycles by eliminating allocations.
In one repository, the total runtime of Biome with only noImportCycles enabled went from ~23s down to ~4s.
- #7447 7139aad Thanks @rriski! - Fixes #7446. The GritQL $... spread metavariable now correctly matches members in object literals, aligning its behavior with arrays and function calls.
- #6710 98cf9af Thanks @arendjr! - Fixed #4723: Type inference now recognises index signatures and their accesses when they are being indexed as a string.
Example
type BagOfPromises = {
// This is an index signature definition. It declares that instances of type
// `BagOfPromises` can be indexed using arbitrary strings.
[property: string]: Promise<void>;
};
let bag: BagOfPromises = {};
// Because `bag.iAmAPromise` is equivalent to `bag["iAmAPromise"]`, this is
// considered an access to the string index, and a Promise is expected.
bag.iAmAPromise;
- 351bccd Thanks @ematipico! - Fixed #7212, now the useOptionalChain rule recognizes optional chaining using typeof (e.g., typeof foo !== 'undefined' && foo.bar).
- 351bccd Thanks @ematipico! - Fixed #7323. noUnusedPrivateClassMembers no longer reports as unused TypeScript private members if the rule encounters a computed access on this.
In the following example, member as previously reported as unused.
It is no longer reported.
class TsBioo {
private member: number;
set_with_name(name: string, value: number) {
this[name] = value;
}
}
- 351bccd Thanks @ematipico! - Added the new nursery lint rule noJsxLiterals, which disallows the use of string literals inside JSX.
The rule catches these cases:
<>
<div>test</div> {/* test is invalid */}
<>test</>
<div>
{/* this string is invalid */}
asdjfl test foo
</div>
</>
- 351bccd Thanks @ematipico! - Fixed an issue (#6393) where the useHookAtTopLevel rule reported excessive diagnostics for nested hook calls.
The rule now reports only the offending top-level call site, not sub-hooks of composite hooks.
// Before: reported twice (useFoo and useBar).
function useFoo() {
return useBar();
}
function Component() {
if (cond) useFoo();
}
// After: reported once at the call to useFoo().
- #7461 ea585a9 Thanks @arendjr! - Improved performance of noPrivateImports by eliminating allocations.
In one repository, the total runtime of Biome with only noPrivateImports enabled went from ~3.2s down to ~1.4s.
- 351bccd Thanks @ematipico! - Fixed #7411. The Biome Language Server had a regression where opening an editor with a file already open wouldn't load the project settings correctly.
- 351bccd Thanks @ematipico! - Added the new nursery rule noDuplicateDependencies, which verifies that no dependencies are duplicated between the bundledDependencies, bundleDependencies, dependencies, devDependencies, overrides, optionalDependencies, and peerDependencies sections.
For example, the following snippets will trigger the rule:
{
"dependencies": {
"foo": ""
},
"devDependencies": {
"foo": ""
}
}
{
"dependencies": {
"foo": ""
},
"optionalDependencies": {
"foo": ""
}
}
{
"dependencies": {
"foo": ""
},
"peerDependencies": {
"foo": ""
}
}
- 351bccd Thanks @ematipico! - Fixed #3824. Now the option CLI --color is correctly applied to logging too.
2.2.4
Patch Changes
- #7415 d042f18 Thanks @qraqras! - Fixed #7212, now the useOptionalChain rule recognizes optional chaining using typeof (e.g., typeof foo !== 'undefined' && foo.bar).
- #7419 576baf4 Thanks @Conaclos! - Fixed #7323. noUnusedPrivateClassMembers no longer reports as unused TypeScript private members if the rule encounters a computed access on this.
In the following example, member as previously reported as unused.
It is no longer reported.
class TsBioo {
private member: number;
set_with_name(name: string, value: number) {
this[name] = value;
}
}
-
2.2.3 5 de setembre del 2025 — 64 bits PortableARM64 Portable
Notes de la versió
2.2.3
Patch Changes
- #7353 4d2b719 Thanks @JeetuSuthar! - Fixed #7340: The linter now allows the navigation property for view-transition in CSS.
Previously, the linter incorrectly flagged navigation: auto as an unknown property. This fix adds navigation to the list of known CSS properties, following the CSS View Transitions spec.
- #7275 560de1b Thanks @arendjr! - Fixed #7268: Files that are explicitly passed as CLI arguments are now correctly ignored if they reside in an ignored folder.
- #7358 963a246 Thanks @ematipico! - Fixed #7085, now the rule noDescendingSpecificity correctly calculates the specificity of selectors when they are included inside a media query.
- #7387 923674d Thanks @qraqras! - Fixed #7381, now the useOptionalChain rule recognizes optional chaining using Yoda expressions (e.g., undefined !== foo && foo.bar).
- #7316 f9636d5 Thanks @Conaclos! - Fixed #7289. The rule useImportType now inlines import type into import { type } when the style option is set to inlineType.
Example:
import type { T } from "mod";
// becomes
import { type T } from "mod";
- #7350 bb4d407 Thanks @siketyan! - Fixed #7261: two characters ・ (KATAKANA MIDDLE DOT, U+30FB) and ・ (HALFWIDTH KATAKANA MIDDLE DOT, U+FF65) are no longer considered as valid characters in identifiers. Property keys containing these character(s) are now preserved as string literals.
- #7377 811f47b Thanks @ematipico! - Fixed a bug where the Biome Language Server didn't correctly compute the diagnostics of a monorepo setting, caused by an incorrect handling of the project status.
- #7245 fad34b9 Thanks @kedevked! - Added the new lint rule useConsistentArrowReturn.
This rule enforces a consistent return style for arrow functions.
Invalid
const f = () => {
return 1;
};
This rule is a port of ESLint's arrow-body-style rule.
- #7370 e8032dd Thanks @fireairforce! - Support dynamic import defer and import source. The syntax looks like:
import.source("foo");
import.source("x", { with: { attr: "val" } });
import.defer("foo");
import.defer("x", { with: { attr: "val" } });
- #7369 b1f8cbd Thanks @siketyan! - Range suppressions are now supported for Grit plugins.
For JavaScript, you can suppress a plugin as follows:
// biome-ignore-start lint/plugin/preferObjectSpread: reason
Object.assign({ foo: "bar" }, baz);
// biome-ignore-end lint/plugin/preferObjectSpread: reason
For CSS, you can suppress a plugin as follows:
body {
/* biome-ignore-start lint/plugin/useLowercaseColors: reason */
color: #fff;
/* biome-ignore-end lint/plugin/useLowercaseColors: reason */
}
- #7384 099507e Thanks @ematipico! - Reduced the severity of certain diagnostics emitted when Biome deserializes the configuration files.
Now these diagnostics are emitted as Information severity, which means that they won't interfere when running commands with --error-on-warnings
- #7302 2af2380 Thanks @unvalley! - Fixed #7301: useReadonlyClassProperties now correctly skips JavaScript files.
- #7288 94d85f8 Thanks @ThiefMaster! - Fixed #7286. Files are now formatted with JSX behavior when javascript.parser.jsxEverywhere is explicitly set.
Previously, this flag was only used for parsing, but not for formatting, which resulted in incorrect formatting of conditional expressions when JSX syntax is used in .js files.
- #7311 62154b9 Thanks @qraqras! - Added the new nursery rule noUselessCatchBinding. This rule disallows unnecessary catch bindings.
try {
// Do something
- } catch (unused) {}
+ } catch {}
- #7349 45c1dfe Thanks @ematipico! - Fixed #4298. Biome now correctly formats CSS declarations when it contains one single value:
.bar {
- --123456789012345678901234567890: var(--1234567890123456789012345678901234567);
+ --123456789012345678901234567890: var(
+ --1234567890123456789012345678901234567
+ );
}
- #7295 7638e84 Thanks @ematipico! - Fixed #7130. Removed the emission of a false-positive diagnostic. Biome no longer emits the following diagnostic:
lib/main.ts:1:5 suppressions/unused ━━━━━━━━━━━━━━━━━━━━━━━━━
⚠ Supp
2.2.2 23 d’agost del 2025 — 64 bits PortableARM64 Portable
Notes de la versió
2.2.2
Patch Changes
- #7266 b270bb5 Thanks @ematipico! - Fixed an issue where Biome got stuck when analyzing some files. This is usually caused by a bug in the inference engine. Now Biome has some guards in place in case the number of types grows too much, and if that happens, a diagnostic is emitted and the inference is halted.
- #7281 6436180 Thanks @ematipico! - Fixed an issue where the function scanProject wouldn't work as expected.
- #7285 1511d0c Thanks @rriski! - Partially fixed #6782: JSX node kinds are now supported in GritQL AST nodes.
- #7249 dff85c0 Thanks @ematipico! - Fixed #748, where Biome Language Server didn't show the unsafe fixes when requesting the quick fixes. Now all LSP editors will show also opt-in, unsafe fixes.
- #7266 b270bb5 Thanks @ematipico! - Fixed #7020: Resolved an issue with analysing types of static member expressions involving unions. If the object type was a union that referenced nested unions, it would trigger an infinite loop as it tried to keep expanding nested unions, and the set of types would grow indefinitely.
- #7209 679b70e Thanks @patrickshipe! - Resolved an overcorrection in useImportExtensions when importing explicit index files.
Imports that explicitly reference an index file are now preserved and no longer rewritten to nested index paths.
Example
// Before
- import "./sub/index";
+ import "./sub/index/index.js";
// After
- import "./sub/index";
+ import "./sub/index.js";
- #7270 953f9c6 Thanks @arendjr! - Fixed #6172: Resolved an issue with inferring types for rest parameters. This issue caused rest-parameter types to be incorrect, and in some cases caused extreme performance regressions in files that contained many methods with rest-parameter definitions.
- #7234 b7aa111 Thanks @JeetuSuthar! - Fixed #7233: The useIndexOf rule now correctly suggests using indexOf() instead of findIndex().
The diagnostic message was incorrectly recommending Array#findIndex() over Array#indexOf(), when it should recommend the opposite for simple equality checks.
- #7283 0b07f45 Thanks @ematipico! - Fixed #7236. Now Biome correctly migrates JSONC configuration files when they are passed using --config-path.
- #7239 1d643d8 Thanks @minht11! - Fixed an issue where Svelte globals ($state and so on) were not properly recognized inside .svelte.test.ts/js and .svelte.spec.ts/js files.
- #7264 62fdbc8 Thanks @ematipico! - Fixed a regression where when using --log-kind-pretty wasn't working anymore as expected.
- #7244 660031b Thanks @JeetuSuthar! - Fixed #7225: The noExtraBooleanCast rule now preserves parentheses when removing Boolean calls inside negations.
// Before
!Boolean(b0 && b1);
// After
!(b0 && b1); // instead of !b0 && b1
- #7298 46a8e93 Thanks @unvalley! - Fixed #6695: useNamingConvention now correctly reports TypeScript parameter properties with modifiers.
Previously, constructor parameter properties with modifiers like private or readonly were not checked against naming conventions. These properties are now treated consistently with regular class properties.
What's Changed
- perf: determine folders more efficiently by @arendjr in #7220
- chore: use divan for module graph benchmarks by @arendjr in #7231
- chore: add repository dispatch to kick off docker image build on release by @stathis-alexander in #7235
- fix: correct error message in useIndexOf rule by @JeetuSuthar in #7234
- fix(changelog): correct dead links in 2.2 by @Jayllyz in #7243
- chore: fix image sponsor by @ematipico in #7250
- docs: fix CHANGELOG to reflect operatorLinebreak by @blfpd in #7253
- chore(deps): update github-actions by @renovate[bot] in #7251
- chore(deps): update rust:1.89.0-bookworm docker digest to e090f7b by @renovate[bot] in #7252
- chore(deps): update rust:1.89.0-bullseye docker digest to 5b0defc - autoclosed by @renovate[bot] in #7254
- chore(deps): update dependency @changesets/cli to v2.29.6 by @renovate[bot] in #7255
- fix(lsp): unsafe fixes when pulling code actions by @ematipico in #7249
- feat(l
2.2.0 14 d’agost del 2025 — 64 bits PortableARM64 Portable
Notes de la versió
2.2.0
Minor Changes
- #5506 1f8755b Thanks @sakai-ast! - The noRestrictedImports rule has been enhanced with a new patterns option. This option allows for more flexible and powerful import restrictions using gitignore-style patterns.
You can now define patterns to restrict entire groups of modules. For example, you can disallow imports from any path under import-foo/ except for import-foo/baz.
{
"options": {
"patterns": [
{
"group": ["import-foo/*", "!import-foo/baz"],
"message": "import-foo is deprecated, except for modules in import-foo/baz."
}
]
}
}
Invalid examples
import foo from "import-foo/foo";
import bar from "import-foo/bar";
Valid examples
import baz from "import-foo/baz";
Additionally, the patterns option introduces importNamePattern to restrict specific import names using regular expressions.
The following example restricts the import names that match x , y or z letters from modules under import-foo/.
{
"options": {
"patterns": [
{
"group": ["import-foo/*"],
"importNamePattern": "[xyz]"
}
]
}
}
Invalid examples
import { x } from "import-foo/foo";
Valid examples
import { foo } from "import-foo/foo";
Furthermore, you can use the invertImportNamePattern boolean option to reverse this logic. When set to true, only the import names that match the importNamePattern will be allowed. The following configuration only allows the import names that match x , y or z letters from modules under import-foo/.
{
"options": {
"patterns": [
{
"group": ["import-foo/*"],
"importNamePattern": "[xyz]",
"invertImportNamePattern": true
}
]
}
}
Invalid examples
import { foo } from "import-foo/foo";
Valid examples
import { x } from "import-foo/foo";
- #6506 90c5d6b Thanks @nazarhussain! - Allow customization of the sort order for different sorting actions. These actions now support a sort option:
- assist/source/useSortedKeys now has a sortOrder option
- assist/source/useSortedAttributes now has a sortOrder option
- assist/source/organizeImports now has an identifierOrder option
For each of these options, the supported values are the same:
1. natural. Compares two strings using a natural ASCII order. Uppercase letters come first (e.g. A < a < B < b) and number are compared in a human way (e.g. 9 < 10). This is the default value.
2. lexicographic. Strings are ordered lexicographically by their byte values. This orders Unicode code points based on their positions in the code charts. This is not necessarily the same as “alphabetical” order, which varies by language and locale.
- #7159 df3afdf Thanks @ematipico! - Added the new rule useBiomeIgnoreFolder. Since v2.2, Biome correctly prevents the indexing and crawling of folders.
However, the correct pattern has changed. This rule attempts to detect incorrect usage, and promote the new pattern:
// biome.json
{
"files": {
"includes": [
- "!dist/**",
- "!**/fixtures/**",
+ "!dist",
+ "!**/fixtures",
]
}
}
- #6989 85b1128 Thanks @arendjr! - Fixed minor inconsistencies in how files.includes was being handled.
Previously, Biome sometimes failed to properly ignore the contents of a folder if you didn't specify the /** at the end of a glob pattern. This was unfortunate, because it meant we still had to traverse the folder and then apply the glob to every entry inside it.
This is no longer an issue and we now recommend to ignore folders without using the /** suffix.
- #7118 a78e878 Thanks @avshalomt2! - Added support for .graphqls files. Biome can now format and lint GraphQL files that have the extension .graphqls
- #6159 f02a296 Thanks @bavalpey! - Added a new option to Biome's JavaScript formatter, javascript.formatter.operatorLinebreak, to configure whether long lines should be broken before or after binary operators.
For example, the following configuration:
{
formatter: {
javascript: {
operatorLinebreak: "before", // defaults to "after"
},
},
}
Will cause this JavaScript file:
const VERY_LONG_CONDITION_1234123412341234123412341234 = false;
if (
VERY_LONG_CONDITION_1234123412341234123412341234 &&
VERY
2.1.4 7 d’agost del 2025 — 64 bits PortableARM64 Portable
Notes de la versió
2.1.4
Patch Changes
- #7121 b9642ab Thanks @arendjr! - Fixed #7111: Imported symbols using aliases are now correctly recognised.
- #7103 80515ec Thanks @omasakun! - Fixed #6933 and #6994.
When the values of private member assignment expressions, increment expressions, etc. are used, those private members are no longer marked as unused.
- #6887 0cc38f5 Thanks @ptkagori! - Added the noQwikUseVisibleTask rule to Qwik.
This rule is intended for use in Qwik applications to warn about the use of useVisibleTask$() functions which require careful consideration before use.
Invalid:
useVisibleTask$(() => {
console.log("Component is visible");
});
Valid:
useTask$(() => {
console.log("Task executed");
});
- #7084 50ca155 Thanks @ematipico! - Added the new nursery rule noUnnecessararyConditions, which detects whenever some conditions don't
change during the life cycle of the program, and truthy or false, hence deemed redundant.
For example, the following snippets will trigger the rule:
// Always truthy literal conditions
if (true) {
console.log("always runs");
}
// Unnecessary condition on constrained string type
function foo(arg: "bar" | "baz") {
if (arg) {
// This check is unnecessary
}
}
- #6887 0cc38f5 Thanks @ptkagori! - Added the useImageSize rule to Biome.
The useImageSize rule enforces the use of width and height attributes on <img> elements for performance reasons. This rule is intended to prevent layout shifts and improve Core Web Vitals by ensuring images have explicit dimensions.
Invalid:
<img src="/image.png" />
<img src="https://example.com/image.png" />
<img src="/image.png" width="200" />
<img src="/image.png" height="200" />
Valid:
<img width="200" height="600" src="/static/images/portrait-01.webp" />
<img width="100" height="100" src="https://example.com/image.png" />
- #6887 0cc38f5 Thanks @ptkagori! - Added the useAnchorHref rule to Biome.
The useAnchorHref rule enforces the presence of an href attribute on <a> elements in JSX. This rule is intended to ensure that anchor elements are always valid and accessible.
Invalid:
<a>Link</a>
<a target="_blank">External</a>
Valid:
<a href="/home">Home</a>
<a href="https://example.com" target="_blank">
External
</a>
- #7100 29fcb05 Thanks @Jayllyz! - Added the rule noNonNullAssertedOptionalChain.
This rule prevents the use of non-null assertions (!) immediately after optional chaining expressions (?.). Optional chaining is designed to safely handle nullable values by returning undefined when the chain encounters null or undefined. Using a non-null assertion defeats this purpose and can lead to runtime errors.
// Invalid - non-null assertion after optional chaining
obj?.prop!;
obj?.method()!;
obj?.[key]!;
obj?.prop!;
// Valid - proper optional chaining usage
obj?.prop;
obj?.method();
obj?.prop ?? defaultValue;
obj!.prop?.method();
- #7129 9f4538a Thanks @drwpow! - Removed option, combobox, listbox roles from useSemanticElements suggestions
- #7106 236deaa Thanks @arendjr! - Fixed #6985: Inference of return types no longer mistakenly picks up return types of nested functions.
- #7102 d3118c6 Thanks @omasakun! - Fixed #7101: noUnusedPrivateClassMembers now handles members declared as part of constructor arguments:
1. If a class member defined in a constructor argument is only used within the constructor, it removes the private modifier and makes it a plain method argument.
2. If it is not used at all, it will prefix it with an underscore, similar to noUnusedFunctionParameter.
- #7104 5395297 Thanks @harxki! - Reverting to prevent regressions around ref handling
- #7143 1a6933a Thanks @siketyan! - Fixed #6799: The noImportCycles rule now ignores type-only imports if the new ignoreTypes option is enabled (enabled by default).
> [!WARNING]
> Breaking Change: The noImportCycles rule no longer detects import cycles that include one or more type-only imports by default.
> To keep the old behaviour, you can turn off the ignoreTypes option explicitly:
>
> {
> "linter": {
> "rules": {
> "nurs
2.1.3 29 de juliol del 2025 — 64 bits PortableARM64 Portable

El més popular a Utilitats per a desenvolupadors

Mostra-ho tot
  1. WinMergeUtilitats per a desenvolupadors · Thingamahoochie Software
  2. jqUtilitats per a desenvolupadors · jqlang
  3. x64dbgUtilitats per a desenvolupadors · x64dbg
  4. BiomeUtilitats per a desenvolupadors · BiomeJS
  5. deltaUtilitats per a desenvolupadors · Dan Davison
  6. ValeUtilitats per a desenvolupadors · errata.ai
  7. jadxUtilitats per a desenvolupadors · Skylot
  8. dnSpyUtilitats per a desenvolupadors · dnSpyEx
  9. Detect It EasyUtilitats per a desenvolupadors · horsicq
  10. DifftasticUtilitats per a desenvolupadors · Wilfred Hughes

Etiquetes

Comparteix