Version History
2.5.0 Latest
Minor Changes
-
#9539
f0615fdThanks @ematipico! - Added a new reporter calledconcise. When--reporter=conciseis passed the commandsformat,lint,checkandci, 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
2056b23Thanks @aviraldua93! - Added theuseKeyWithClickEventsa11y lint rule for HTML files (.html,.vue,.svelte,.astro). This is a port of the existing JSX rule. The rule enforces that elements with anonclickhandler also have at least one keyboard event handler (onkeydown,onkeyup, oronkeypress) 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 withrole="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
9ec8500Thanks @ematipico! - Added new nursery lint rulenoUndeclaredClassesfor HTML, JSX, and SFC files (Vue, Astro, Svelte). The rule detects CSS class names used inclass="..."(orclassName) 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
9ec8500Thanks @ematipico! - Added new nursery lint rulenoUnusedClassesfor 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
6567efaThanks @nhedger! - Added abiome upgradecommand for standalone installations. It upgrades Homebrew installs withbrew upgrade biome, updates manually installed binaries from the latest GitHub release, and tells npm users to upgrade with their package manager instead. -
#9716
701767aThanks @faizkhairi! - Added the HTML version of theuseHeadingContentrule. 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
f437ef8Thanks @rahuld109! - Added the HTML version of theuseKeyWithMouseEventsrule. The rule now enforces thatonmouseoveris accompanied byonfocusandonmouseoutis accompanied byonblurin 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
1fdbceeThanks @ff1451! - Added the new assist actionuseSortedTypeFields, which sorts the fields of GraphQL object types, interface types and input object types alphabetically, e.g.name, age, idbecomesage, id, name. -
#10561
78075b7Thanks @Conaclos! - Added a newstyleoption to useExportType, which enforces a style for exporting types. This is the same option as the one provided byuseImportType. -
#8987
d16e32bThanks @DerTimonius! - Ported theuseValidAnchorrule to HTML. This rule enforces that all anchors are valid and that they are navigable elements. -
#9533
4d251d4Thanks @ematipico! - Theinitcommand now prints the Biome logo. -
#10069
0eb9310Thanks @Netail! - Added the HTML lint rulenoStaticElementInteractions, which enforces that static, visible elements (such as<div>) that have click handlers use the valid role attribute.Invalid:
<div onclick="myFunction()"></div> -
#9134
2a43488Thanks @ematipico! - Added the assist actionuseSortedPackageJson.This action organizes package.json fields according to the same conventions as the popular sort-package-json tool.
-
#9309
7daa18bThanks @Bertie690! - TheallowDoubleNegationoption has been added tonoImplicitCoercionsto allow ignoring double negations inside code.With the option enabled, the following example is considered valid and is ignored by the rule:
const truthy = !!value; -
#9700
894f3fbThanks @ematipico! - The Biome Language server now supports the “go-to definition” feature.When the cursor of the mouse is hovering an entity (variable, CSS class, type, etc.), and the command CTRL + click is triggered, the editor jumps to where this entity is defined, if the language server can find it.
Here’s what Biome is able to resolve:
- Variables and types used in JavaScript modules, defined in the same file or imported from another module.
- JSX Components used in JavaScript modules, defined in the same file or imported from another module.
- CSS classes used in JSX and HTML-ish files (Vue, Svelte and Astro), and defined in CSS files.
- Components used in HTML-ish files and defined in other HTML-ish.
- Variables used in HTML-ish files and defined in the same file or imported from another module (JavaScript or HTML-ish).
-
#10070
bae0710Thanks @Conaclos! - Added the:STYLE:group matcher fororganizeImportsthat matches style imports.For example, the following configuration…
{"assist": {"actions": {"source": {"organizeImports": {"level": "on","options": {"groups": ["**", "!:STYLE:"],"sortBareImports": true}}}}}}…places style imports last:
import "./style.css"import A from "./a.js"import "./style.css" -
#9170
e3107deThanks @mdrobny! - AddedbundleDependenciesoption to NoUndeclaredDependencies rule.This rule now supports imports of packages that are defined only in
bundleDependenciesandbundledDependenciesarrays. -
#9547
01f8473Thanks @mujpao! - Added new assist ruleuseSortedAttributesfor HTML, porting the existing JSX rule. This rule enforces sorted HTML attributes.Invalid
<input type="text" id="name" name="name" /> -
#9366
2ca1117Thanks @dyc3! - Added thehtml.parser.vueconfiguration option. When enabled, it adds support for the parsing of Vue in.htmlfiles. Most Vue users don’t need to enable this option since Vue files typically use the.vueextension, but it can be useful for projects that embed Vue syntax in regular HTML files. -
#9073
74b20eeThanks @chocky335! - Added support for applying GritQL plugin rewrites as code actions. GritQL plugins that use the rewrite operator (=>) now produce fixable diagnostics for JavaScript, CSS, and JSON files. By default, plugin rewrites are treated as unsafe fixes and require--write --unsafeto apply. Plugin authors can passfix_kind = "safe"toregister_diagnostic()to mark a fix as safe, allowing it to be applied with just--write.Example plugin (
useConsoleInfo.grit):language js`console.log($msg)` as $call where {register_diagnostic(span = $call, message = "Use console.info instead of console.log.", severity = "warn", fix_kind = "safe"),$call => `console.info($msg)`}Running
biome check --writeapplies safe rewrites. Unsafe rewrites (the default, orfix_kind = "unsafe") still require--write --unsafe. -
#9384
f4c9edcThanks @Conaclos! - Added thesortBareImportsoption toorganizeImports, which allows bare imports to be sorted within other imports when set tofalse.{"assist": {"actions": {"source": {"organizeImports": {"level": "on","options": { "sortBareImports": true }}}}}}import "b";import "a";import "b";import { A } from "a";import "./file";import { Local } from "./file";import "./file"; -
#8731
e7872bfThanks @siketyan! - Added the watch mode (--watch) to the CLI forcheck/format/lintcommands. By enabling this option, Biome will re-run the check automatically when any file in the workspace has changed after the first run. -
#10106
9b35f78Thanks @ematipico! - Biome can now format and lint.svgfiles. -
#9967
e9b6c17Thanks @dyc3! - Added HTML support fornoExcessiveLinesPerFile. Biome now reports HTML files that exceed the configured line limit, including whenskipBlankLinesis enabled. -
#9491
b3eb63cThanks @IxxyDev! - Added the HTML lint rulenoAriaUnsupportedElements. This rule enforces that elements that do not support ARIA roles, states, and properties (meta,html,script,style) do not haveroleoraria-*attributes.<!-- Invalid: meta does not support aria attributes --><meta charset="UTF-8" role="meta" /> -
#9306
afd57a6Thanks @viraxslot! - Added thenoNoninteractiveTabindexlint rule for HTML. This rule enforces thattabindexis not used on non-interactive elements, as it can cause usability issues for keyboard users.<div tabindex="0">Invalid: non-interactive element</div>` -
#9276
6d041d9Thanks @IxxyDev! - Added the HTML lint rulenoRedundantRoles. This rule enforces that explicitroleattributes are not the same as the implicit/default role of an HTML element. It supports HTML, Vue, Svelte, and Astro files.<!-- Invalid: role="button" is redundant on <button> --><button role="button"></button> -
#9813
69aadc2Thanks @ematipico! - Added a new linter configuration calledpreset. With the new option, users can enable different kinds of rules at once.The following presets are available:
"recommended": it enables all Biome-recommended rules, or recommended rules of a group;"all": it enables all Biome rules, or enables all rules of a group;"none": it disables all Biome rules, or disable all rules of a group.
You can enable recommended rules:
{"linter": {"rules": {"preset": "recommended"}}}You can enable all rules at once:
{linter: {rules: {preset: "all", // enables all rules},},}Or enable all rules for a group:
{linter: {rules: {style: {preset: "all", // enables all rules in the style group},},},}This new option, however, doesn’t affect how nursery rules work. Nursery rules must be enabled singularly, due to their nature.
This new option is meant to replace
recommended, so make sure to run themigratecommand. -
#10022
3422d71Thanks @Netail! - Added the HTML lint rulenoNoninteractiveElementToInteractiveRole, which enforces that interactive ARIA roles are not assigned to non-interactive HTML elements.Invalid:
<h1 role="checkbox"></h1> -
#8396
13785fcThanks @apple-yagi! - Biome now supports pnpm catalogs (default and named) when resolving dependencies for linting. This behavior is opt-in and requires settingjavascript.resolver.experimentalPnpmCatalogstotrue. -
#10028
1009414Thanks @Netail! - Added the HTML lint rulenoInteractiveElementToNoninteractiveRole, which enforces that non-interactive ARIA roles are not assigned to interactive HTML elements.Invalid:
<input role="img" /> -
#9853
816302fThanks @Netail! - Added the new assist actionuseSortedSelectionSet, which sorts GraphQL selection sets alphabetically, e.g.name, age, idbecomesage, id, name.Invalid:
query {nameageid} -
#10074
9c7c6ebThanks @georgephillips! - Added akindfield to theImportMatcherused by theorganizeImportsassist action. The new field selects imports by their syntactic kind and currently supportsbare(matching side-effect imports such asimport "polyfill") with optional!negation (!bare). The matcher composes with the existingtypeandsourcefields, so users can express patterns such as “only bare imports that import a CSS file” ({ "kind": "bare", "source": "**/*.css" }).For example, with the following configuration:
{"assist": {"actions": {"source": {"organizeImports": {"level": "on","options": {"sortBareImports": true,"groups": [{ "kind": "!bare" },":BLANK_LINE:",{ "kind": "bare" }]}}}}}}…the following code:
import "./register-my-component";import { render } from "react-dom";import "./polyfill";import { Button } from "@/components/Button";…is organized as:
import { render } from "react-dom";import { Button } from "@/components/Button";import "./polyfill";import "./register-my-component"; -
#9171
ce65710Thanks @chocky335! - Addedincludesoption for plugin file scoping. Plugins can now be configured with glob patterns to restrict which files they run on. Use negated globs for exclusions.{"plugins": ["global-plugin.grit",{"path": "scoped-plugin.grit","includes": ["src/**/*.ts", "!**/*.test.ts"]}]} -
#9617
dcb99efThanks @faizkhairi! - PorteduseAriaActivedescendantWithTabindexa11y rule to HTML. -
#9496
1dfb829Thanks @aviraldua93! - Added HTML support for thenoAriaHiddenOnFocusableaccessibility lint rule, which enforces thataria-hidden="true"is not set on focusable elements. Focusable elements include native interactive elements (<button>,<input>,<select>,<textarea>), elements withhref(<a>,<area>), elements withtabindex >= 0, and editing hosts (contenteditable). Includes an unsafe fix to remove thearia-hiddenattribute.<!-- Invalid: aria-hidden on a focusable element --><button aria-hidden="true">Submit</button><!-- Valid: aria-hidden on a non-focusable element --><div aria-hidden="true">decorative content</div> -
#9792
f516854Thanks @Maximiliano-Zeballos! - Added theuseSemanticElementslint rule for HTML. The rule now detects the use ofroleattributes in HTML elements and suggests using semantic elements instead.For example, the following code is now flagged:
<div role="navigation"></div>The rule suggests using
<nav>instead. -
#9761
cbbb7d5Thanks @Maximiliano-Zeballos! - Ported theuseValidAriaPropslint rule to HTML. This rule checks that allaria-*attributes used in HTML elements are valid ARIA attributes as defined by the WAI-ARIA specification. -
#9928
aa82576Thanks @aviraldua93! - PorteduseValidAriaValuesto HTML. Biome now validates staticaria-*attribute values in HTML elements against WAI-ARIA types, catching invalid values such asaria-hidden="yes". -
#10562
6642895Thanks @ematipico! - Promoted 73 nursery rules to stable groups.Four rules were renamed as part of the promotion:
noFloatingClassesis nownoUnusedInstantiation, because the rule checks any discardednewexpression, not only classes.noMultiStris nownoMultilineString.useFindis nowuseArrayFind.useSpreadis nowuseSpreadOverApply, because the rule enforces spread call arguments overFunction.apply(), not array or object spread.
Correctness
Promoted the following rules to the
correctnessgroup:noBeforeInteractiveScriptOutsideDocumentnoUnusedInstantiationuseInlineScriptId(recommended, Next.js domain)noVueVIfWithVFor(recommended, Vue domain)useVueValidVBind(recommended, Vue domain)useVueValidVElse(recommended, Vue domain)useVueValidVElseIf(recommended, Vue domain)useVueValidVHtml(recommended, Vue domain)useVueValidVIf(recommended, Vue domain)useVueValidVOn(recommended, Vue domain)useVueValidVText(recommended, Vue domain)useVueValidTemplateRoot(recommended, Vue domain)useVueValidVCloak(recommended, Vue domain)useVueValidVOnce(recommended, Vue domain)useVueValidVPre(recommended, Vue domain)useVueVForKey(recommended, Vue domain)noDuplicateAttributes(recommended)noDuplicateArgumentNames(recommended)noDuplicateInputFieldNames(recommended)noDuplicateVariableNames(recommended)noDuplicateEnumValueNames(recommended)useLoneAnonymousOperation(recommended)
Suspicious
Promoted the following rules to the
suspiciousgroup:noShadownoUnnecessaryConditionsnoParametersOnlyUsedInRecursionnoUnknownAttributeuseArraySortComparenoForInnoDuplicatedSpreadPropsnoEqualsToNullnoProto(recommended)noUndeclaredEnvVars(recommended, Turborepo domain)noReturnAssign(default severity:error)noDuplicateEnumValues(recommended)noVueArrowFuncInWatch(recommended, Vue domain)noNestedPromisesnoLeakedRendernoDeprecatedMediaType(recommended)noDuplicateGraphqlOperationNameuseRequiredScripts
Style
Promoted the following rules to the
stylegroup:useVueMultiWordComponentNames(recommended, Vue domain)useVueDefineMacrosOrdernoIncrementDecrementnoContinueuseSpreadOverApplynoTernarynoMultilineStringnoMultiAssignnoExcessiveClassesPerFilenoExcessiveLinesPerFilenoVueOptionsApiuseErrorCauseuseConsistentEnumValueTypeuseConsistentMethodSignaturesuseGlobalThis(default severity:warn)useDestructuringuseVueHyphenatedAttributes(recommended, Vue domain)useVueConsistentVBindStyle(recommended, Vue domain)useVueConsistentVOnStyle(recommended, Vue domain)noHexColorsuseConsistentGraphqlDescriptionsnoRootTypeuseLoneExecutableDefinitionuseInputName
Complexity
Promoted the following rules to the
complexitygroup:useArrayFindnoRedundantDefaultExport(default severity:warn)noUselessReturnnoDivRegex
Performance
Promoted the following rules to the
performancegroup:Security
Promoted the following rules to the
securitygroup:noScriptUrl(recommended)
A11y
Promoted the following rules to the
a11ygroup:noAmbiguousAnchorText(recommended)
-
#10121
450f8e1Thanks @jongwan56! - Biome now applies Git’s local exclude file when VCS ignore files are enabled. Files listed in.git/info/excludeare skipped the same way as files listed in.gitignore, including in linked worktrees. -
#9397
d5913c9Thanks @mvarendorff! - Addedignoreoption to the noUnusedVariables rule. The option allows excluding identifiers by providing a list of ignored names. It also allows excluding kinds of identifiers from this rule entirely, which may be useful when loading classes dynamically.For example, unused classes as well as all unused variables, functions, etc. called “unused” may be ignored entirely with the following configuration:
{"ignore": {"*": ["unused"],"class": ["*"]}} -
#10089
71a21f0Thanks @Netail! - Added the lint rulenoLabelWithoutControlto HTML, which enforces that a label element or component has a text label and an associated input.<label></label> -
#10015
1828261Thanks @Netail! - Added the HTML lint ruleuseAriaPropsSupportedByRole, which enforces that ARIA properties are valid for the roles that are supported by the element.<a href="#" aria-checked></a> -
#10234
1a51569Thanks @ematipico! - Added thedelimiterSpacingformatter option. This option inserts spaces inside delimiters (after the opening delimiter and before the closing delimiter) when the content fits on a single line. Empty delimiters are not affected, and no space is added before the opening delimiter. The specific delimiters affected depend on the language. It can be configured globally viaformatter.delimiterSpacingor per-language viajavascript.formatter.delimiterSpacing,json.formatter.delimiterSpacing, andcss.formatter.delimiterSpacing. Defaults tofalse.callFn(foo)callFn( foo )const arr = [1, 2, 3];const arr = [ 1, 2, 3 ];JavaScript
When enabled, Biome inserts spaces inside parentheses (e.g.,
foo( a, b )), square brackets (e.g.,[ a, b ]), template literal interpolations (e.g.,${ expr }), and the logical NOT operator (e.g.,! x, but in chains only after the last one:!! x). Only applies when the content fits on a single line. Empty delimiters and the space before the opening delimiter are not affected.if (condition) {}if ( condition ) {}`Hello ${name}!``Hello ${ name }!`JSX
When enabled, Biome inserts spaces inside JSX expression braces (e.g.,
attr={ value }) and spread attributes (e.g.,{ ...props }). Only applies when the content fits on a single line. Empty delimiters are not affected.<Foo bar={value} /><Foo bar={ value } />TypeScript
When enabled, Biome inserts spaces inside TypeScript angle brackets (e.g.,
foo< T >()), indexed access types (e.g.,T[ K ]), mapped types, tuple types, type parameters, and index signatures. Only applies when the content fits on a single line. Empty delimiters are not affected.type Result = Map<string, number>;type Result = Map< string, number >;JSON
When enabled, Biome inserts spaces inside square brackets when the content fits on a single line. Empty brackets are not affected.
[1, 2, 3][ 1, 2, 3 ]CSS
When enabled, Biome inserts spaces inside parentheses and square brackets when the content fits on a single line. Empty delimiters are not affected.
rgba(0, 0, 0, 1)rgba( 0, 0, 0, 1 )[data-attr][ data-attr ] -
#10461
6bac1c3Thanks @TXWSLYF! - Implements #9445. Added theallowImplicitoption touseIterableCallbackReturn. When enabled, callbacks can usereturn;to implicitly returnundefined, matching ESLint’sarray-callback-returnrule. -
#9571
5a8eb75Thanks @dyc3! - Added configurable options to theuseNumericSeparatorsrule. Users can now customize the minimum number of digits required before adding separators and the group length for each type of numeric literal (binary,octal,decimal,hexadecimal).{"linter": {"rules": {"style": {"useNumericSeparators": {"level": "error","options": {"decimal": {"minimumDigits": 7,"groupLength": 3},"hexadecimal": {"minimumDigits": 4,"groupLength": 2}}}}}}} -
#10067
6064312Thanks @Netail! - Added the lint ruleuseFocusableInteractiveto HTML, which enforces elements with an interactive role and interaction handler to be focusable.Invalid:
<div role="button"></div> -
#10026
fb42ac4Thanks @Netail! - Added the HTML lint rulenoNoninteractiveElementInteractions, which disallows use event handlers on non-interactive elements.Invalid:
<div onclick="myFunction()">button</div> -
#10000
2093e3eThanks @Netail! - Added the new assist actionuseSortedEnumMembers, which sorts TypeScript & GraphQL enum members.Invalid:
enum Role {SUPER_ADMINADMINUSERGOD} -
#10013
ad01d3dThanks @Netail! - Added the HTML lint ruleuseValidAutocomplete, which enforces using valid values for theautocompleteattribute oninputelements.<input autocomplete="incorrect" />
Patch Changes
-
#10498
995c1ffThanks @citadelgrad! - Added the nursery ruleuseReactFunctionComponentDefinition, which enforces a consistent function type for named React function components.For example, the following snippet triggers the rule by default.
const MyComponent = (props) => {return <div>{props.name}</div>;}; -
#9974
ff635a9Thanks @pkallos! - AddedignoreMixedLogicalExpressionsto useNullishCoalescing, partially addressing #9232. When enabled, Biome ignores||and||=mixed with&&in the same expression tree. -
#10503
c656679Thanks @Mokto! - Added the new nursery ruleuseSvelteRequireEachKey, a Svelte lint rule that reports{#each}blocks with item bindings that are missing a key. -
#10516
0f29b83Thanks @Dotify71! - AddeduseIncludesto the nursery group. This rule flags comparisons ofString.prototype.indexOf()orArray.prototype.indexOf()against-1and suggests replacing them with the clearerincludes()/!includes()form. -
#10487
0c03ee3Thanks @Mokto! - Fixed a Svelte parser error that incorrectly required a binding variable after{:then}and{:catch}. Biome now correctly accepts{:then}and{:catch}without a binding, as well as the{#await expr then}and{#await expr catch}shorthand forms. -
#10566
a4a294cThanks @dyc3! - FixeduseVueHyphenatedAttributes: The rule now only reports diagnostics in Vue files and ignores SVG elements. -
#10565
72ccf3bThanks @dyc3! - FixeduseVueConsistentVBindStyle: The rule no longer reports argument-lessv-binddirectives because they cannot be converted to shorthand syntax. -
#10591
6e8557bThanks @xsourabhsharma! - Fixed #10563: Biome now parses comma-separated CSS Modulescomposesvalues, such ascomposes: classA from "./a.css", classB from "./b.css";. -
#10603
174b21bThanks @denbezrukov! - Fixed CSS formatting forgrid-template-areasdeclarations with comments before multiline values. Biome now keeps grid area rows aligned instead of adding an extra declaration-boundary indent..grid {grid-template-areas:/* row */"header header""footer footer";"header header""footer footer";} -
#10542
c3f07f7Thanks @dyc3! - Fixed #10513: Biome no longer rejects literal\usequences in quoted HTML attribute values. -
#10108
24e51d6Thanks @IxxyDev! - Fixed #6611:noUnnecessaryConditionsnow uses type information to detect more redundant conditions, including?.,??,||,&&, comparisons againstnull/undefinedon non-nullish operands, andcaseclauses that can never match theswitchvalue. -
#10568
eb1ed0eThanks @harsha-cpp! - Fixed #10564:useAriaPropsForRoleno longer reports false positives for Vue v-bind shorthand bindings (:aria-checked,:aria-level, etc.). -
#10570
2ceb4feThanks @Conaclos! - ImprovednoTsIgnore. The rule now reports more precisely the range of the@ts-ignorecomment. -
#10520
b55d10fThanks @dyc3! - Fixed #10519: Vuev-onevent handlers with multiple inline statements are now parsed consistently with Vue. -
#10204
ebbf0bdThanks @ematipico! - Improved the performance of the Biome linter. The improvements are more visible in bigger projects that have more than ~1k files. Early tests showed that in a code base with ~2k files, Biome took less than 26% of time to finish the command. -
#10546
e39bb2cThanks @tim-we! - Fixed#10536: noUnknownFunction no longer flagged CSScontrast-color()as unknown.contrast-color()is Baseline 2026. -
#8012
2be0264Thanks @denbezrukov! - Improved the performance of the formatter in some cases. The formatter is now up to ~20% faster at formatting files. -
#10467
9a5855eThanks @Netail! - Added a new nursery rulenoRestrictedDependencies, which flags imports andpackage.jsondependency entries that have better alternatives in e18e’s module replacement data.For example, the package
globbyis reported because there’s a better alternative:import glob from "globby";{"dependencies": {"globby": "x.x.x"}} -
#10470
84b43c5Thanks @ShaharAviram1! - Fixed #10447: now the rulenoProcessEnvdetects the use ofenvwhen it’s imported fromprocessandnode:process. -
#10556
7ff6b16Thanks @ematipico! - Fixed #10492: Biome no longer crashes with a stack overflow on certain code when a type-aware rule such asnoFloatingPromises,noMisusedPromises, ornoUnnecessaryConditionsis enabled. For example, the following code used to crash Biome:function f(visitor) {let ctrl = visitor();for (const x of [0]) ctrl = ctrl();} -
#10532
1da3c75Thanks @denbezrukov! - CSS declarations with comments before:or after!importantnow preserve spaces before:and;..selector {padding/* name */: 1px;color: red !important /* note */;padding/* name */ : 1px;color: red !important /* note */ ;} -
#10491
a1b5834Thanks @Mokto! - Fixed the Svelte parser rejecting{#each}blocks where the binding uses object destructuring with property renaming, e.g.{#each items as { id, component: Filter }}. Biome now correctly parses and formats these rename bindings. -
#10490
99bc7dfThanks @Mokto! - Fixed the CSS parser rejecting comma-separated selector lists inside:global()and:local()pseudo-class functions. Biome now correctly parses:global(.foo, .bar). -
#10543
c394faeThanks @mangod12! - Fixed #10477: The RDJSON reporter now emits code replacement text for fix suggestions instead of the human-readable fix description. -
#10530
e8e1e6aThanks @Conaclos! - Fixed #10493:useImportTypenow correctly separates types from a default named import when all imports are types and thestyleoption is set toseparatedType. -
#10555
263c7ccThanks @Mokto! - Improved Svelte lint rule accuracy for quoted attribute values containing{expression}interpolations.noRedundantAltno longer emits false positives when the alt text contains an interpolation, e.g.alt="image of {person}".useButtonTypeno longer emits false positives for dynamic button types written astype="{dynamicType}".noScriptUrlno longer emits false positives for dynamic hrefs such ashref="{url}".
-
#10489
96ef9a4Thanks @Mokto! - Fixed Svelte{#each}parser incorrectly rejecting TypeScriptas consttype assertions in the iterable expression. Biome now correctly parses{#each arr as const as item}. -
#10539
935c59aThanks @dyc3! - Improved how diagnostics print long lines of code, for example minified files where the entire source code is printed in one line.
2.4.16
Patch Changes
-
#10329
ef764d5Thanks @Conaclos! - Fixed an issue where diagnostics showed an incorrect location in Astro files. -
#10363
50aa415Thanks @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
0c718daThanks @dfedoryshchev! - Fixed diagnostics emitted by thenoUntrustedLicensesrule. -
#10358
05c2617Thanks @dyc3! - Fixed #10356:biome rage --linternow displays rules enabled through linter domains in the enabled rules list. -
#10300
950247cThanks @dyc3! - Fixed #10265: Svelte function bindings such asbind:value={get, set}are now parsed more precisely, sonoCommaOperatorwon’t emit false positives for that syntax anymore. -
#9786
e71f584Thanks @MeGaNeKoS! - Fixed #8480:useDestructuringnow providesvariableDeclaratorandassignmentExpressionoptions to control which contexts enforce destructuring, matching ESLint’sprefer-destructuringconfiguration. 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
1948b72Thanks @sjh9714! - Fixed #10244: TheuseOptionalChainrule now detects negated guard inequality chains like!foo || foo.bar !== "x". -
#10442
001f94fThanks @ematipico! - Fixed #10411:noMisusedPromisesno longer causes a stack overflow when a nested function returns an object with shorthand properties that shadow destructured variables from an outer scope. -
#10318
9b1577fThanks @dyc3! - Added support forformatter.trailingCommasin overrides. This option was previously available in the top-level formatter configuration but missing from formatter overrides. -
#10319
2e37709Thanks @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
0a58eb0Thanks @Netail! - Fixed #10361:noUnusedFunctionParametersnow mentions the parameter name in the diagnostic. -
#10439
df6b867Thanks @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
b30208cThanks @siketyan! - Fixed#10123: Corrected thenoReactNativeDeepImportssource rule to point to the proper upstream rule, so users can migrate from the original rule correctly. -
#10328
b59133fThanks @dyc3! - Fixed #10309: Biome no longer adds newlines to Astro frontmatter when linter or assist--writemode is enabled.
2.4.15
Patch Changes
-
#9394
ba3480eThanks @dyc3! - Added the nursery ruleuseTestHooksInOrderin thetestdomain. 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
e0a54ccThanks @dyc3! - Added a new nursery ruleuseVueNextTickPromise, which enforces Promise syntax when using VuenextTick.For example, the following snippet triggers the rule:
import { nextTick } from "vue";nextTick(() => {updateDom();}); -
#10219
64aee45Thanks @dyc3! - Added a new nursery rulenoVueVOnNumberValues, that disallows deprecated number modifiers on Vuev-ondirectives.For example, the following snippet triggers the rule:
<input @keyup.13="submit" /> -
#10195
7b8d4e1Thanks @dyc3! - Added the new nursery ruleuseVueValidVFor, which validates Vuev-fordirectives and reports invalid aliases, missing component keys, and keys that do not use iteration variables. -
#10238
1110256Thanks @dyc3! - Added the recommended nursery rulenoVueImportCompilerMacros, which disallows importing Vue compiler macros such asdefinePropsfromvuebecause they are automatically available. -
#10201
1a08f89Thanks @realknove! - Fixed #10193:style/useReadonlyClassPropertiesno longer reports class properties as readonly-able when they are assigned inside arrow callbacks nested in class property initializers. -
#9574
3bd2b6aThanks @Conaclos! - Fixed #9530. The diagnostics oforganizeImportsare now more detailed and more precise. They are also better at localizing where the issue is. -
#10205
a704a6cThanks @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
b565bedThanks @minseong0324! - ImprovednoMisleadingReturnType: 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
nullandnumberare included in the return annotations but never returned:function getUser(): string | null {return "hello";} // null is never returnedfunction getCode(): string | number {return "hello";} // number is never returned -
#10213
ac30057Thanks @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
9ee6c03Thanks @solithcy! - Fixed #10274: Svelte templates with missing expressions no longer parsed asHtmlBogusElement -
#10143
56798a7Thanks @minseong0324! -noMisleadingReturnTypenow detects misleading return type annotations when object literal properties are initialized withas 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
56798a7Thanks @minseong0324! -noUselessTypeConversionnow detects redundant conversions on object literal properties initialized withas const.This conversion is now reported because
message.valueis inferred as a string literal:const message = { value: "text" as const };String(message.value); -
#9807
0ae5840Thanks @dyc3! - Added the new nursery ruleuseThisInClassMethods, based on ESLint’sclass-methods-use-this.The rule now reports instance methods, getters, setters, and function-valued instance fields that do not use
this, andbiome migrate eslintpreserves the supportedignoreMethods,ignoreOverrideMethods, andignoreClassesWithImplementsoptions.Invalid:
class Foo {bar() {// does not use `this`, invalidconsole.log("Hello Biome");}} -
#10258
e7b18f7Thanks @ematipico! - Improved linter performance by narrowing the query nodes for several lint rules, reducing how often they are evaluated. -
#10273
04e22a1Thanks @dyc3! - Fixed #10271: The HTML parser now correctly parsesofas text content when in text contexts. -
#9838
83f7385Thanks @dyc3! - Added the nursery rulenoBaseToString, which reports stringification sites that fall back to Object’s default"[object Object]"formatting. The rule also supports theignoredTypeNamesoption. -
#10143
56798a7Thanks @minseong0324! -useExhaustiveSwitchCasesnow checks switch statements over object literal properties initialized withas const.This switch is now reported because
status.kindis inferred as the string literal"ready"but no case handles it:const status = { kind: "ready" as const };switch (status.kind) {} -
#10143
56798a7Thanks @minseong0324! -useStringStartsEndsWithnow detects string index comparisons on object literal properties initialized withas const.This comparison is now reported because
message.valueis inferred as a string literal:const message = { value: "hello" as const };message.value[0] === "h";
2.4.14
Patch Changes
-
#9393
491b171Thanks @dyc3! - Added the nursery ruleuseTestHooksOnTopin thetestdomain. 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
eefc5abThanks @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
0e9f569Thanks @minseong0324! -noMisleadingReturnTypeno longer misses widening from concrete object types, class instances, object literals, tuples, functions, and regular expressions to: object.A function annotated
: objectreturning an object literal:function f(): object {return { retry: true };} -
#10116
53269ebThanks @jiwon79! - Fixed #6201:noUselessEscapeInRegexno 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
33d8543Thanks @Conaclos! - Fixed #9097:organizeImportsno longer adds a blank line between a never-matched group and a matched group.Given the following
organizeImportsoptions:{"groups": [":NODE:", ":BLANK_LINE:", ":PACKAGE:", ":BLANK_LINE:", ":PATH:"]}The following code…
// Commentimport "package";import "./file.js";…was organized as:
// Commentimport "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:// Commentimport "package";import "./file.js"; -
#10138
a10b6c1Thanks @dyc3! - Fixed Vuev-forhandling fornoUndeclaredVariablesandnoUnusedVariables. Biome now recognizes variables declared byv-fordirectives and references to iterated values in Vue templates. -
#10115
d428d76Thanks @minseong0324! -noMisleadingReturnTypeno longer reports false positives when a union return type’sbooleanvariant is covered by bothtrueandfalsereturns. -
#9922
7acf1e0Thanks @dyc3! - Added the new nursery rulenoReactStringRefs, which disallows legacy React string refs such asref="hello"andthis.refs.hello.Biome also reports template-literal refs such as
ref={`hello`}, so React code can consistently migrate to callback refs,createRef(), oruseRef(). -
#10010
f3e76abThanks @dyc3! - Fixed a bug in the LSP file watcher registration so Biome now watches.biome.jsonand.biome.jsoncconfiguration files and reloads workspace settings when they change. -
#10176
8a40ef8Thanks @dyc3! - Fixed #10011: ThenoThisInStaticrule no longer reportsthiswhen it is used as the constructor target innew this(...), which is required for inherited static factory methods. -
#10163
6867e96Thanks @jiwon79! - Fixed #9884: TheuseSortedAttributesauto-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
d29dd19Thanks @Damix48! - Fixed false positive innoAssignInExpressionsfor Svelte{@const}blocks. Assignments in{@const name = value}are now correctly recognized as declarations rather than accidental assignments in expressions. -
#10080
5d8fdacThanks @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 (key(number))}<p>{number}</p>{/each} -
#10140
e7024b9Thanks @solithcy! - Fixed #10135: Biome no longer crashes on missing Svelte template expressions.The following code snippet longer panics:
{#if }<p>^ this would previously crash</p>{/if}{@const }<p> ^ this would also crash</p> -
#10111
7818009Thanks @jiwon79! - Fixed #9997:noDuplicateSelectorsno longer reports false positives for selectors inside@scopequeries. Biome now treats@scopeas a separate at-rule context, like@media,@supports,@container, and@starting-style.The following snippet is no longer flagged as a duplicate:
.Example {padding: 0;}@scope (.theme-dark) {.Example {color: white;}} -
#9926
d62b331Thanks @dyc3! - Added the nursery lint ruleuseMathMinMax, which prefersMath.min()andMath.max()over equivalent ternary comparisons.For example, this code:
const min = a < b ? a : b;is much more readable when rewritten as:
const min = Math.min(a, b); -
#10115
d428d76Thanks @minseong0324! -useExhaustiveSwitchCasesnow flags missingtrue/falsecases forbooleandiscriminants, including whenbooleanis a union variant. -
#10125
a55a0b6Thanks @bmish! - Fixed a resolver bug where packages that define a typed entry point throughpackage.json’smainfield but omittypeswere ignored during type-aware resolution. Type-aware rules such asnoFloatingPromisescan now inspect imports from those packages. -
#10117
895e809Thanks @denizdogan! - Added support for thecorner-shapefamily of CSS properties and thesuperellipse()/squircle()value functions, sonoUnknownPropertyandnoUnknownFunctionno longer flag them as unknown.New known properties:
corner-shape,corner-block-end-shape,corner-block-start-shape,corner-bottom-left-shape,corner-bottom-right-shape,corner-bottom-shape,corner-end-end-shape,corner-end-start-shape,corner-inline-end-shape,corner-inline-start-shape,corner-left-shape,corner-right-shape,corner-start-end-shape,corner-start-start-shape,corner-top-left-shape,corner-top-right-shape,corner-top-shape.New known value functions:
superellipse(),squircle(). -
#8620
8df8f73Thanks @dyc3! - Fixed #8062: Added support for parsing Vuev-fordirectives more accurately. -
#10191
aa055cdThanks @guney! - Now the rulenoStaticElementInteractionsdoesn’t trigger custom elements. -
#9757
2c62594Thanks @dyc3! - Fixed #9099: the HTML formatter collapsing non-text children (inline elements, Svelte expressions, comments) onto a single line when the source had them on separate lines. Biome now preserves the user’s intended line breaks for exclusively non-text children.For example, the following Svelte snippet is now preserved instead of being collapsed to
<div>{name}<!-- comment --></div>:<div>{name}<!-- comment --></div>Similarly, HTML elements like
<span>inside a<div>are now preserved when written on their own line:<div><span>text</span></div> -
#10105
e7c1a6dThanks @jiwon79! - Fixed #10039:useReadonlyClassPropertiesnow detects unreassigned private members in class expressions and export default classes, not only in class declarations.The following patterns are now correctly flagged:
const AnonClass = class {#prop = 123;constructor() {console.log(this.#prop);}};export default class {#prop = 123;constructor() {console.log(this.#prop);}} -
#10141
46a77d0Thanks @minseong0324! - ImprovednoUnnecessaryConditionsto detect conditions that are always truthy because they check built-in global class instances such asDate,Map,Set,WeakMap, andError. -
#10178
7b05a89Thanks @dyc3! - Fixed #10177: The HTML parser no longer reports lowercasehtmlordoctypetext as invalid after void elements such as<br>. -
#10155
0d4595dThanks @jiwon79! - Fixed #10045: the CSS formatter no longer compounds indentation inside nested functional pseudo-classes such as:not(:where(...)),:is(:where(...)), and similar combinations. The same fix also removes one level of unnecessary indentation that was added inside any pseudo-class function whose argument list wrapped onto multiple lines, including:nth-child(... of ...),::part(...), and:active-view-transition-type(...). The following snippet is now correctly formatted, matching Prettier.input:not(:where([type="submit"],[type="checkbox"],[type="radio"],[type="button"],[type="reset"])) {inline-size: 100%;} -
#10112
6f0251eThanks @dyc3! - Fixed #10110: Biome’s parser now accepts surrogate code points in JavaScript string\u{...}escapes. -
#10141
46a77d0Thanks @minseong0324! - ImprovednoMisleadingReturnTypeto detectobjectreturn annotations that hide built-in global class instances such asDate,Map,Set,WeakMap, andError. -
#10083
4a664c1Thanks @ematipico! - Added two new options tonoShadow, both defaulting totrueto match typescript-eslint’s behavior.Fixed #9482: Added
ignoreFunctionTypeParameterNameValueShadowoption. When enabled, parameter names inside function type annotations (e.g.(options: unknown) => void) are not flagged as shadowing outer variables.Fixed #7812: Added
ignoreTypeValueShadowoption. When enabled, a value binding that shares its name with a type-only declaration (type alias or interface) is not flagged, since types and values occupy separate namespaces in TypeScript. -
#9286
52695cfThanks @Hugo-Polloli! - Fixed #6316: Biome now resolves Svelte$storereferences to the underlyingstorebinding in semantic analysis, preventing falsenoUndeclaredVariablesdiagnostics when the store is declared. -
#10188
ae659ddThanks @dyc3! - Added a new nursery rulenoExcessiveNestedCallbacks, which disallows callbacks nested deeper than the configured maximum. -
#9757
2c62594Thanks @dyc3! - Fixed #9450: the HTML formatter now correctly preserves multiline formatting for nested<template>elements (e.g.<template #body>) when the source has children on separate lines. Previously, the children were collapsed onto a single line.<template><UModal><template #body> <p>content</p> </template><template #body><p>content</p></template></UModal></template> -
#10118
c6edcb4Thanks @Netail! - Fixed #10024:biome migrate eslintcorrectly migrateseslintrules that belong to multiple Biome rules.
2.4.13
Patch Changes
-
#9969
c5eb92bThanks @officialasishkumar! - Added the nursery rulenoUnnecessaryTemplateExpression, 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
f785e8cThanks @minseong0324! - Fixed #9810:noMisleadingReturnTypeno 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
5e2f90cThanks @jiwon79! - Fixed #10034:noUselessEscapeInRegexno longer flags escapes ofClassSetReservedPunctuatorcharacters (&,!,#,%,,,:,;,<,=,>,@,`,~) insidev-flag character classes as useless. These characters are reserved as individual code points inv-mode, so the escape is required.The following pattern is now considered valid:
/[a-z\&]/v; -
#10063
c9ffa16Thanks @Netail! - Added extra rule sources from ESLint CSS.biome migrate eslintshould do a bit better detecting rules in your eslint configurations. -
#10035
946b50eThanks @Netail! - Fixed #10032: useIframeSandbox now flags if there’s no initializer value. -
#9865
68fb8d4Thanks @dyc3! - Added the new nursery ruleuseDomNodeTextContent, which preferstextContentoverinnerTextfor DOM node text access and destructuring.For example, the following snippet triggers the rule:
const foo = node.innerText; -
#10023
bd1e74fThanks @ematipico! - Added a new nursery rulenoReactNativeDeepImportsthat disallows deep imports from thereact-nativepackage. Internal paths likereact-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
3dce737Thanks @dyc3! - Added a new nursery ruleuseDomQuerySelectorthat prefersquerySelector()andquerySelectorAll()over older DOM query methods such asgetElementById()andgetElementsByClassName(). -
#9995
4da9cafThanks @siketyan! - Fixed #9994: Biome now parses nested CSS rules correctly when declarations follow them inside embedded snippets. -
#10009
b41cc5aThanks @Jayllyz! - Fixed #10004:noComponentHookFactoriesno longer reports false positives for object methods and class methods. -
#9988
eabf54aThanks @Netail! - Tweaked the diagnostics range for useAltText, useButtonType, useHtmlLang, useIframeTitle, useValidAriaRole & useIfameSandbox to report on the opening tag instead of the full tag. -
#10043
fc65902Thanks @mujpao! - Fixed #10003: Biome no longer panics when parsing Svelte files containing{#}. -
#9815
5cc83b1Thanks @dyc3! - Added the new nursery rulenoLoopFunc. When enabled, it warns when a function declared inside a loop captures outer variables that can change across iterations. -
#9702
ef470baThanks @ryan-m-walker! - Added the nursery ruleuseRegexpTestthat enforcesRegExp.prototype.test()overString.prototype.match()andRegExp.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
245307dThanks @leetdavid! - Fixed #2245: Svelte<script>tag language detection when thegenericsattribute contains>characters (e.g.,<script lang="ts" generics="T extends Record<string, unknown>">). Biome now correctly recognizes TypeScript in such script blocks. -
#10046
0707de7Thanks @Conaclos! - Fixed #10038:organizeImportsnow 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
94ccca9Thanks @ematipico! - Added the nursery rulenoReactNativeLiteralColors, which disallows color literals inside React Native styles.The rule belongs to the
reactNativedomain. It reports properties whose name containscolorand whose value is a string literal when they appear inside aStyleSheet.create(...)call or inside a JSX attribute whose name containsstyle.// Invalidconst Hello = () => <Text style={{ backgroundColor: "#FFFFFF" }}>hi</Text>;const styles = StyleSheet.create({text: { color: "red" },});// Validconst red = "#f00";const styles = StyleSheet.create({text: { color: red },}); -
#10005
131019eThanks @ematipico! - Added the nursery rulenoReactNativeRawText, which disallows raw text outside of<Text>components in React Native.The rule belongs to the new
reactNativedomain.// Invalid<View>some text</View><View>{'some text'}</View>// Valid<View><Text>some text</Text></View>Additional components can be allowlisted through the
skipoption:{"options": {"skip": ["Title"]}} -
#9911
1603f78Thanks @Netail! - Added the nursery rulenoJsxLeakedDollar, which flags text nodes with a trailing$if the next sibling node is a JSX expression. This could be an unintentional mistake, resulting in a ’$’ being rendered as text in the output.Invalid:
function MyComponent({ user }) {return <div>Hello ${user.name}</div>;} -
#9999
f42405fThanks @minseong0324! - FixednoMisleadingReturnTypeincorrectly flagging functions with reassignedletvariables. -
#10075
295f97fThanks @ematipico! - Fixed#9983: Biome now parses functions declared inside Svelte#snippetblocks without throwing errors. -
#10006
cf4c1c9Thanks @minseong0324! - Fixed #9810:noMisleadingReturnTypeincorrectly flagging nested object literals with widened properties. -
#10033
11ddc05Thanks @ematipico! - Added the nursery ruleuseReactNativePlatformComponentsthat ensures platform-specific React Native components (e.g.ProgressBarAndroid,ActivityIndicatorIOS) are only imported in files with a matching platform suffix. It also reports when Android and iOS components are mixed in the same file.The following code triggers the rule when the file does not have an
.android.jssuffix:file.js import { ProgressBarAndroid } from "react-native";
2.4.12
Patch Changes
-
#9376
9701a33Thanks @dyc3! - Added thenursery/noIdenticalTestTitlelint rule. This rule disallows using the same title for twodescribeblocks or two test cases at the same nesting level.describe("foo", () => {});describe("foo", () => {// invalid: same title as previous describe blocktest("baz", () => {});test("baz", () => {}); // invalid: same title as previous test case}); -
#9889
7ae83f2Thanks @dyc3! - Improved the diagnostics foruseForOfto better explain the problem, why it matters, and how to fix it. -
#9916
27dd7b1Thanks @Jayllyz! - Added a new nursery rulenoComponentHookFactories, 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
098f1ffThanks @ematipico! - Fixed #9941: Biome now emits awarningdiagnostic when a file exceed thefiles.maxSizelimit. -
#9942
9956f1dThanks @dyc3! - Fixed #9918:useConsistentTestItno longer panics when applying fixes to chained calls such astest.for([])("x", () => {});. -
#9891
4d9ac51Thanks @dyc3! - Improved thenoGlobalObjectCallsdiagnostic to better explain why calling global objects likeMathorJSONis invalid and how to fix it. -
#9902
3f4d103Thanks @ematipico! - Fixed #9901: the commandlint --writeis now idempotent when it’s run against HTML-ish files that contains scripts and styles. -
#9891
4d9ac51Thanks @dyc3! - Improved thenoMultiStrdiagnostic to explain why escaped multiline strings are discouraged and what to use instead. -
#9966
322675eThanks @siketyan! - Fixed #9113: Biome now parses and formats@mediaand other conditional blocks correctly inside embedded CSS snippets. -
#9835
f8d49d9Thanks @bmish! - ThenoFloatingPromisesrule now detects floating promises through cross-module generic wrapper functions. Previously, patterns likeexport const fn = trace(asyncFn)— wheretracepreserves 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
02bd8ddThanks @siketyan! - Fixed #9975: Biome now parses nested CSS selectors correctly inside embedded snippets without requiring an explicit&. -
#9949
e0ba71dThanks @Netail! - Added the nursery ruleuseIframeSandbox, which enforces thesandboxattribute foriframetags.Invalid:
<iframe></iframe> -
#9913
d417803Thanks @Netail! - Added the nursery rulenoJsxNamespace, which disallows JSX namespace syntax.Invalid:
<ns:testcomponent /> -
#9892
e75d70eThanks @dyc3! - Improved thenoSelfComparediagnostic to better explain why comparing a value to itself is suspicious and what to use for NaN checks. -
#9861
2cff700Thanks @dyc3! - Added the new nursery ruleuseVarsOnTop, which requiresvardeclarations 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
e75d70eThanks @dyc3! - Improved thenoThenPropertydiagnostic to better explain why exposingthencan create thenable behavior and how to avoid it. -
#9892
e75d70eThanks @dyc3! - Improved thenoShorthandPropertyOverridesdiagnostic to explain why later shorthand declarations can unintentionally overwrite earlier longhand properties. -
#9978
4847715Thanks @mdevils! - Fixed #9744:useExhaustiveDependenciesno longer reports false positives for variables obtained via object destructuring with computed keys, e.g.const { [KEY]: key1 } = props. -
#9892
e75d70eThanks @dyc3! - Improved thenoRootTypediagnostic to better explain that the reported root type is disallowed by project configuration and how to proceed. -
#9927
7974ab7Thanks @dyc3! - Added eslint-plugin-unicorn’sno-nested-ternaryas a rule source fornoNestedTernary -
#9873
19ff706Thanks @minseong0324! -noMisleadingReturnTypenow checks class methods, object methods, and getters in addition to functions. -
#9888
362b638Thanks @dyc3! - Updated metadata forbiome migrate eslintto better reflect which ESLint rules are redundant versus unsupported versus unimplemented. -
#9892
e75d70eThanks @dyc3! - Improved thenoAutofocusdiagnostic to better explain why autofocus harms accessibility outside allowed modal contexts. -
#9982
d6bdf4aThanks @dyc3! - Improved performance of noMagicNumbers. Biome now maps ESLintno-magic-numberssources more accurately duringbiome migrate eslint. -
#9889
7ae83f2Thanks @dyc3! - Improved the diagnostics fornoConstantConditionto better explain the problem, why it matters, and how to fix it. -
#9866
40bd180Thanks @dyc3! - Added a new nursery rulenoExcessiveSelectorClasses, which limits how many class selectors can appear in a single CSS selector. -
#9796
f1c1363Thanks @dyc3! - Added a new nursery ruleuseStringStartsEndsWith, which prefersstartsWith()andendsWith()over verbose string prefix and suffix checks.The rule uses type information, so it only reports on strings and skips array lookups such as
items[0] === "a". -
#9942
9956f1dThanks @dyc3! - Fixed the safe fix fornoSkippedTestsso it no longer panics when rewriting skipped test function names such asxit(),xtest(), andxdescribe(). -
#9874
9e570d1Thanks @minseong0324! - Type-aware lint rules now resolve members throughPick<T, K>andOmit<T, K>utility types. -
#9909
0d0e611Thanks @Netail! - Added the nursery ruleuseReactAsyncServerFunction, which requires React server actions to be async.Invalid:
function serverFunction() {"use server";// ...} -
#9925
29accb3Thanks @ematipico! - Fixed #9910: added support for parsing member expressions in Svelte directive properties. Biome now correctly parses directives likein:renderer.in|global,use:obj.action, and deeply nested forms likein:a.b.c|global. -
#9904
e7775a5Thanks @ematipico! - Fixed #9626:noUnresolvedImportsno longer reports false positives for named imports from packages that have a corresponding@types/*package installed. For example,import { useState } from "react"with@types/reactinstalled is now correctly recognised. -
#9942
9956f1dThanks @dyc3! - Fixed the safe fix fornoFocusedTestsso it no longer panics when rewriting focused test function names such asfit()andfdescribe(). -
#9577
c499f46Thanks @tt-a1i! - Added the nursery ruleuseReduceTypeParameter. It flags type assertions on the initial value passed toArray#reduceandArray#reduceRightand recommends using a type parameter instead.// before: type assertion on initial valuearr.reduce((sum, num) => sum + num, [] as number[]);// after: type parameter on the callarr.reduce<number[]>((sum, num) => sum + num, []); -
#9895
1c8e1efThanks @Netail! - Added extra rule sources from react-xyz.biome migrate eslintshould do a bit better detecting rules in your eslint configurations. -
#9891
4d9ac51Thanks @dyc3! - Improved thenoInvalidUseBeforeDeclarationdiagnostic to better explain why using a declaration too early is problematic and how to fix it. -
#9889
7ae83f2Thanks @dyc3! - Improved the diagnostics fornoRedeclareto better explain the problem, why it matters, and how to fix it. -
#9875
a951586Thanks @minseong0324! - Type-aware lint rules now resolve members throughPartial<T>,Required<T>, andReadonly<T>utility types, preserving optional, readonly, and nullable member flags.
2.4.11
Patch Changes
-
#9350
4af4a3aThanks @dyc3! - Added the new nursery rule useConsistentTestIt in thetestdomain. The rule enforces consistent use of eitheritortestfor test functions in Jest/Vitest suites, with separate control for top-level tests and tests insidedescribeblocks.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
a2f3f7eThanks @ematipico! - Added the new nursery lint ruleuseExplicitReturnType. It reports TypeScript functions and methods that omit an explicit return type.function toString(x: any) {// rule triggered, it doesn't declare a return typereturn x.toString();} -
#9828
9e40844Thanks @ematipico! - Fixed #9484: the formatter no longer panics when formatting files that containgraphqltagged template literals combined with parenthesized expressions. -
#9886
e7c681eThanks @ematipico! - Fixed an issue where, occasionally, some bindings and references were not properly tracked, causing false positives fromnoUnusedVariablesandnoUndeclaredVariablesin Svelte, Vue, and Astro files. -
#9760
5b16d18Thanks @myx0m0p! - Fixed #4093: thenoDeleterule no longer triggers fordelete process.env.FOO, sincedeleteis the documented way to remove environment variables in Node.js. -
#9799
2af8efdThanks @minseong0324! - Added the rulenoMisleadingReturnType. 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
7f67749Thanks @dyc3! - Improved the diagnostics foruseFindto better explain the problem, why it matters, and how to fix it. -
#9755
bff7bdbThanks @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
aafca2dThanks @siketyan! - Add a new lint ruleuseDisposablesfor JavaScript, which detects disposable objects assigned to variables withoutusingorawait usingsyntax. Disposable objects that implement theDisposableorAsyncDisposableinterface 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
53b8e57Thanks @MeGaNeKoS! - Fixed #7760: Added support for CSS scroll-driven animationtimeline-range-namekeyframe selectors (cover,contain,entry,exit,entry-crossing,exit-crossing). Biome no longer reports parse errors on keyframes likeentry 0% { ... }orexit 100% { ... }. -
#9728
5085424Thanks @mkosei! - Fixed #9696: Astro frontmatter now correctly parses regular expression literals like/\d{4}/. -
#9261
16b6c49Thanks @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
957ea4cThanks @soconnor-seeq! - Fixed #1630: LSP project selection now prefers the most specific project root in nested workspaces. -
#9878
de6210fThanks @ematipico! - Fixed #9118:noUnusedImportsno longer reports false positives for default imports used inside Svelte, Vue and Astro components. -
#9879
ce7e2b7Thanks @dyc3! - Fixed a parser diagnostic’s message when vue syntax is disabled so that it no longer references the non-existanthtml.parser.vueoption. This option will become available in 2.5. -
#9880
7f67749Thanks @dyc3! - Improved the diagnostics foruseRegexpExecto better explain the problem, why it matters, and how to fix it. -
#9846
b7134d9Thanks @ematipico! - Fixed #9140: Biome now parses Astro’s attribute shorthand inside.astrofiles. The following snippet no longer reports a parse error:---const items = ['a', 'b'];---<ul>{items.map((item) => <li {item}>row</li>)}</ul> -
#9790
67df09dThanks @dyc3! - Fixed #9781: Trailing comments after a top-levelbiome-ignore-all formatsuppression are now preserved instead of being dropped. This applies to JavaScript, CSS, HTML, JSONC, GraphQL, and Grit files. -
#9745
d87073eThanks @ematipico! - Fixed #9741: the LSP server now correctly returns theorganizeImportscode action when the client requests it viasource.organizeImports.biomein theonlyfilter. Previously, editors withcodeAction/resolvesupport (e.g. Zed) received an empty response because the action was serialized with the wrong kind (source.biome.organizeImportsinstead ofsource.organizeImports.biome). -
#9880
7f67749Thanks @dyc3! - Improved the diagnostics foruseArraySometo better explain the problem, why it matters, and how to fix it. -
#9795
1d09f0fThanks @dyc3! - RelaxeduseExplicitTypefor trivially inferrable types.Type annotations can now be omitted when types are trivially inferrable from:
- Binary expressions (
const sum = 1 + 1) - Comparison expressions (
const isEqual = 'a' === 'b',const isTest = process.env.NODE_ENV === 'test') - Logical expressions (
const and = true && false) - Class instantiation (
const date = new Date()) - Array literals (
const arr = [1, 2, 3]) - Conditional expressions (
const val = true ? 'yes' : 'no') - Function calls (
const num = Math.random()) - Parameter defaults - any expression is now allowed (
const fn = (max = MAX_ATTEMPTS) => ...)
Comparison expressions always return
boolean, so any operands are now allowed (including property access likeprocess.env.NODE_ENV).Parameters with default values no longer require type annotations, as TypeScript can infer the type from the default value (even when referencing variables).
Also removed the redundant
anytype validation from this rule. Theanytype is now only validated by the dedicatednoExplicitAnyrule, following the Single Responsibility Principle. - Binary expressions (
-
#9809
e8cad58Thanks @Netail! - Added the new nursery ruleuseQwikLoaderLocation, which enforces that Qwik loader functions are declared in the correct location. -
#9877
fc9d715Thanks @ematipico! - Fixed #9136 and #9653:noUndeclaredVariablesandnoUnusedVariablesno longer report false positives on several Svelte template constructs that declare or reference bindings in the host grammar:{#snippet name(params)}— the snippet name and its parameters (including object, array, rest, and nested destructuring) are now tracked.{@render name(args)}— the snippet name used at the render site is now resolved against the snippet declaration.{#each items as item, index (key)}— theitembinding (plain identifier or destructured), the optionalindex, and the optionalkeyexpression are now tracked.{@const name = value}— the declared name is now tracked as a binding and the initializer is analyzed for undeclared references.{@debug a, b, c}— each debugged identifier is now analyzed and reported if undeclared.- Shorthand attributes
<img {src} />— the curly-shorthand attribute is now analyzed as an expression, so undeclared references inside it are reported.
For example, the following template no longer triggers either rule:
<script>let items = [];let total = 0;</script>{#snippet figure(image)}<figure><img src={image.src} alt={image.caption} /><figcaption>{image.caption}</figcaption></figure>{/snippet}{#each items as item}{@const price = item.price}{@render figure(item)}<span>{price}</span>{/each}{@debug items, total} -
#9869
78bce77Thanks @Netail! - UpdatednoDuplicateFieldDefinitionNamesto also flag duplicate fields within type extensions, interface extensions & input extensions. -
#9739
0bc2198Thanks @dyc3! - Fixed Grit queries that use native Biome AST node names with the native field names that are in our.ungramgrammar files. Queries such asJsConditionalExpression(consequent = $cons, alternate = $alt)now compile successfully inbiome searchand grit plugins. -
#9811
2dddca3Thanks @dyc3! - UpdatednoImpliedEvalto flagnew Function()usages, as its a form of indirecteval, and to includeno-new-funcas a rule source. -
#9870
ccf9770Thanks @Netail! - Marked eslint-qwik-plugin’sunused-serveras redundant since it was covered bynoUnusedVariables. -
#9701
1417c3bThanks @dyc3! - Added the new nursery rulenoUselessTypeConversion, which reports redundant primitive conversion patterns such asString(value)whenvalueis already a string. -
#9248
49f00a3Thanks @pkallos! -useNullishCoalescingnow also detects ternary expressions that check fornullorundefinedand suggests rewriting them with??. A newignoreTernaryTestsoption allows disabling this behavior. -
#9863
6a44619Thanks @ematipico! - Fixed #9690:biome check --writeis now idempotent on HTML files that contain embedded<style>or<script>blocks. Previously, each run reported “Fixed 1 file” even when the file content did not actually change, because the embedded language formatter’s output was not re-indented to match the surrounding HTML block.
2.4.10
Patch Changes
-
#8838
f3a6a6bThanks @baeseokjae! - Added new lint nursery rulenoImpliedEval.The rule detects implied
eval()usage through functions likesetTimeout,setInterval, andsetImmediatewhen called with string arguments.// InvalidsetTimeout("alert('Hello');", 100);// ValidsetTimeout(() => alert("Hello"), 100); -
#9320
93c3b6cThanks @taberoajorge! - Fixed #7664:noUnusedVariablesno longer reports false positives for TypeScript namespace declarations that participate in declaration merging with an exported or used value declaration (const,function, orclass) of the same name. The reverse direction is also handled: a value declaration merged with an exported namespace is no longer flagged. -
#9630
1dd4a56Thanks @raashish1601! - Fixed #9629:noNegationElsenow keeps ternary branch comments attached to the correct branch when applying its fixer. -
#9216
04243b0Thanks @FrederickStempfle! - Fixed #9061:noProcessEnvnow also detectsprocess.envwhenprocessis imported from the"process"or"node:process"modules.Previously, only the global
processobject was flagged:import process from "node:process";// This was not flagged, but now it is:console.log(process.env.NODE_ENV); -
#9692
61b7ec5Thanks @mkosei! - Fixed Svelte#eachdestructuring parsing and formatting for nested patterns such as[key, { a, b }]. -
#9627
06a0f35Thanks @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
5bfee36Thanks @dyc3! - Fixed #9347:useVueValidVBindno longer reports valid object bindings likev-bind="props". -
#9627
06a0f35Thanks @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, causingbiome checkto incorrectly return success. -
#9695
9856a87Thanks @dyc3! - Added the new nursery rulenoUnsafePlusOperands, which reports+and+=operations that use object-like,symbol,unknown, orneveroperands, or that mixnumberwithbigint. -
#9627
06a0f35Thanks @ematipico! - Fixed duplicate parse errors incheckandcioutput. When a file had syntax errors, the same parse error was printed twice and the error count was inflated. -
#9627
06a0f35Thanks @ematipico! - Improved the performance of the commandslintandcheckwhen they are called with--write. -
#9627
06a0f35Thanks @ematipico! - Fixed--diagnostic-levelnot fully filtering diagnostics. Setting--diagnostic-level=errornow correctly excludes warnings and infos from both the output and the summary counts. -
#9623
13b3261Thanks @ematipico! - Fixed #9258:--skipno longer causessuppressions/unusedwarnings for suppression comments targeting skipped rules or domains. -
#9631
599dd04Thanks @raashish1601! - Fixed #9625:experimentalEmbeddedSnippetsEnabledno 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```.
2.4.9
Patch Changes
-
#9315
085d324Thanks @ematipico! - Added a new nursery CSS rulenoDuplicateSelectors, 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
b7ab931Thanks @ematipico! - Fixed #7211:useOptionalChainnow detects negated logical OR chains. The following code is now considered invalid:!foo || !foo.bar; -
#8670
607ebf9Thanks @tt-a1i! - Fixed #8345:useAdjacentOverloadSignaturesno 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
97b80a8Thanks @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
0cd5298Thanks @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 unlesslinter.domains.react,linter.domains.qwik, or an explicit rule config also enables them, or their relative dependencies are installed. -
#9586
4cafb71Thanks @dyc3! - Fixed #8828: Grit patterns usingexport { $foo } from $sourcenow match named re-exports in JavaScript and TypeScript files. -
#9550
d4e3d6eThanks @dyc3! - Fixed #9548: Biome now parses conditional expressions whose consequent is an arrow function returning a parenthesized object expression. -
#8696
a7c19ccThanks @Faizanq! - Fixed #8685 wherenoUselessLoneBlockStatementswould remove empty blocks containing comments. The rule now preserves these blocks since comments may contain important information like TODOs or commented-out code. -
#9557
6671ac5Thanks @datalek! - Fixed #9557: Biome’s LSP server no longer crashes on startup when used with editors that don’t sendworkspaceFoldersduring initialization. This affected any LSP client that only sendsrootUri, which is valid per the LSP specification. -
#9455
1710cf1Thanks @omar-y-abdi! - Fixed #9174:useExpectnow correctly rejects asymmetric matchers in Vitest or Jest likeexpect.stringContaining(),expect.objectContaining(), and utilities likeexpect.extend()that are not valid assertions. Previously these constructs caused false negatives, allowing tests without real assertions to pass the lint rule. -
#9584
956e367Thanks @ematipico! - Fixed a bug where Vue directive attribute values likev-bind:class="{'dynamic': true}"were incorrectly parsed as JavaScript statements instead of expressions. Object literals inside directive values like:class,v-if, andv-htmlare now correctly parsed as expressions, preventing spurious parse errors. -
#9474
e168494Thanks @ematipico! - Added the new nursery rulenoUntrustedLicenses. 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 bothdenyandalloware provided,denytakes 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
723798bThanks @ViniciusDev26! - Added an unsafe fix touseConsistentMethodSignaturesthat automatically converts between method-style and property-style signatures. -
#9555
8a3647bThanks @ematipico! - Fixed#188: the Biome Language Server no longer panics when open files change abruptly, such as during git branch checkouts. -
#9605
f65c637Thanks @ematipico! - Fixed #9589. Now Biome correctly parses object expressions inside props and directives. The following code doesn’t emit errors anymore:<style is:global define:vars={{ bgLight: light }}><Component name={{ first, name }} /> -
#9565
ccb249eThanks @eyupcanakman! - Fixed #9505:noUselessStringConcatno longer reports tagged template literals as useless string concatenations. Tagged templates invoke a function and can return non-string values, so combining them with+is not equivalent to a single template literal. -
#9534
4d050dfThanks @Netail! - Added the nursery rulenoInlineStyles. The rule disallows the use of inlinestyleattributes in HTML and thestyleprop in JSX, includingReact.createElementcalls. Inline styles make code harder to maintain and can interfere with Content Security Policy. -
#9611
cddaa44Thanks @gaauwe! - Fixed a regression where Biome LSP could misread editor settings sent throughworkspace/didChangeConfigurationwhen the payload was wrapped in a top-levelbiomekey. This causedrequireConfigurationand related settings to be ignored in some editors.
2.4.8
Patch Changes
-
#9488
bc709f6Thanks @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
2f8bf80Thanks @mdm317! - Fixed #8959: Fixed TypeScript arrow function formatting when a comment appears after=>. -
#9525
e7b3b10Thanks @ViniciusDev26! - Added the rulenoDrizzleUpdateWithoutWhereto prevent accidental full-table updates when using Drizzle ORM without a.where()clause. -
#9531
1302740Thanks @ematipico! - Fixed #9187: Astro frontmatter containing regex literals with quotes (/'/,/"/) or dashes (/---/) no longer causes parse errors. -
#9535
b630d93Thanks @leno23! - Fixed #9524: remove extra space before>whenbracketSameLineis true and the self-closing slash is absent in HTML formatter. -
#9537
81e6306Thanks @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
4b64145Thanks @ematipico! - Fixed #9117:biome check --writeno longer falsely reports Svelte and Vue files as changed whenhtml.formatter.indentScriptAndStyleis enabled and the files are already correctly formatted. -
#9528
61451efThanks @ematipico! - Fixed #9341: Fixed an LSP crash that could corrupt file content when saving with format-on-save enabled. -
#9538
794f79cThanks @ematipico! - Fixed #9279: The rulenoSubstrnow detects.substr()and.substring()calls in all expression contexts, including variable declarations, function arguments, return statements, and arrow function bodies. -
#9462
c23272cThanks @ematipico! - Fixed #9370: The resolver now correctly prioritizes more specificexportspatterns over less specific ones. Previously, a pattern like"./*"could match before"./features/*", causing resolution failures for packages with overlapping subpath patterns. -
#9515
f85c069Thanks @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
7fe43c8Thanks @ematipico! - Fixed #6964: Biome now correctly resolves the.gitignorefile relative tovcs.rootwhen configured. Previously, thevcs.rootsetting was ignored and Biome always looked for the ignore file in the workspace directory. -
#9521
af39936Thanks @ematipico! - Fixed #9483. Now the rulenoRedeclaredoesn’t panic when it encounters constructor overloads. -
#9490
60cf024Thanks @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
4d42823Thanks @ematipico! - Fixed #9358 and #9375. Now attributes that have text expressions such asclass={buttonClass()}are correctly tracked in Svelte files. -
#9520
61f53eeThanks @ematipico! - Fixed #9519. NownoUnusedVariablesdoesn’t flag variables that are used astypeoftype. -
#9487
331dc0dThanks @mvanhorn! - Fixed #9477:source.fixAll.biomeno longer sorts imports whensource.organizeImports.biomeis disabled in editor settings. The organize imports action is now excluded from the fix-all pass unless explicitly requested. -
#9525
e7b3b10Thanks @ViniciusDev26! - Added the rulenoDrizzleDeleteWithoutWhereto prevent accidental full-table deletes when using Drizzle ORM without a.where()clause.
Copyright (c) 2023-present Biome Developers and Contributors.