You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Apr 22, 2026. It is now read-only.
#93769701a33 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 blocktest("baz",()=>{});test("baz",()=>{});// invalid: same title as previous test case});
#98897ae83f2 Thanks @dyc3! - Improved the diagnostics for useForOf to better explain the problem, why it matters, and how to fix it.
#98914d9ac51 Thanks @dyc3! - Improved the noGlobalObjectCalls diagnostic to better explain why calling global objects like Math or JSON is invalid and how to fix it.
#99023f4d103 Thanks @ematipico! - Fixed #9901: the command lint --write is now idempotent when it's run against HTML-ish files that contains scripts and styles.
#98914d9ac51 Thanks @dyc3! - Improved the noMultiStr diagnostic to explain why escaped multiline strings are discouraged and what to use instead.
#9966322675e Thanks @siketyan! - Fixed #9113: Biome now parses and formats @media and other conditional blocks correctly inside embedded CSS snippets.
#9835f8d49d9 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.
#998102bd8dd Thanks @siketyan! - Fixed #9975: Biome now parses nested CSS selectors correctly inside embedded snippets without requiring an explicit &.
#9892e75d70e Thanks @dyc3! - Improved the noSelfCompare diagnostic to better explain why comparing a value to itself is suspicious and what to use for NaN checks.
#98612cff700 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:
functionf(){doSomething();varvalue=1;}
#9892e75d70e Thanks @dyc3! - Improved the noThenProperty diagnostic to better explain why exposing then can create thenable behavior and how to avoid it.
#9892e75d70e Thanks @dyc3! - Improved the noShorthandPropertyOverrides diagnostic to explain why later shorthand declarations can unintentionally overwrite earlier longhand properties.
#9892e75d70e Thanks @dyc3! - Improved the noRootType diagnostic to better explain that the reported root type is disallowed by project configuration and how to proceed.
#9888362b638 Thanks @dyc3! - Updated metadata for biome migrate eslint to better reflect which ESLint rules are redundant versus unsupported versus unimplemented.
#9892e75d70e Thanks @dyc3! - Improved the noAutofocus diagnostic to better explain why autofocus harms accessibility outside allowed modal contexts.
#9982d6bdf4a Thanks @dyc3! - Improved performance of noMagicNumbers.
Biome now maps ESLint no-magic-numbers sources more accurately during biome migrate eslint.
#9796f1c1363 Thanks @dyc3! - Added a new nursery rule useStringStartsEndsWith, which prefers startsWith() and endsWith() 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".
#99429956f1d Thanks @dyc3! - Fixed the safe fix for noSkippedTests so it no longer panics when rewriting skipped test function names such as xit(), xtest(), and xdescribe().
#98749e570d1 Thanks @minseong0324! - Type-aware lint rules now resolve members through Pick<T, K> and Omit<T, K> utility types.
#992529accb3 Thanks @ematipico! - Fixed #9910: added support for parsing member expressions in Svelte directive properties. Biome now correctly parses directives like in:renderer.in|global, use:obj.action, and deeply nested forms like in:a.b.c|global.
#9904e7775a5 Thanks @ematipico! - Fixed #9626: noUnresolvedImports no longer reports false positives for named imports from packages that have a corresponding @types/* package installed. For example, import { useState } from "react" with @types/react installed is now correctly recognised.
#99429956f1d Thanks @dyc3! - Fixed the safe fix for noFocusedTests so it no longer panics when rewriting focused test function names such as fit() and fdescribe().
#9577c499f46 Thanks @tt-a1i! - Added the nursery rule useReduceTypeParameter. It flags type assertions on the initial value passed to Array#reduce and Array#reduceRight and recommends using a type parameter instead.
// before: type assertion on initial valuearr.reduce((sum,num)=>sum+num,[]asnumber[]);// after: type parameter on the callarr.reduce<number[]>((sum,num)=>sum+num,[]);
#98951c8e1ef Thanks @Netail! - Added extra rule sources from react-xyz. biome migrate eslint should do a bit better detecting rules in your eslint configurations.
#98914d9ac51 Thanks @dyc3! - Improved the noInvalidUseBeforeDeclaration diagnostic to better explain why using a declaration too early is problematic and how to fix it.
#98897ae83f2 Thanks @dyc3! - Improved the diagnostics for noRedeclare to better explain the problem, why it matters, and how to fix it.
#9875a951586 Thanks @minseong0324! - Type-aware lint rules now resolve members through Partial<T>, Required<T>, and Readonly<T> utility types, preserving optional, readonly, and nullable member flags.
#93504af4a3a 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'});
functiontoString(x: any){// rule triggered, it doesn't declare a return typereturnx.toString();}
#98289e40844 Thanks @ematipico! - Fixed #9484: the formatter no longer panics when formatting files that contain graphql tagged template literals combined with parenthesized expressions.
#97605b16d18 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.
// Flagged: `: string` is wider than `"loading" | "idle"`functiongetStatus(b: boolean): string{if(b)return"loading";return"idle";}
#98807f67749 Thanks @dyc3! - Improved the diagnostics for useFind to better explain the problem, why it matters, and how to fix it.
#9755bff7bdb 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.
#8651aafca2d 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:
functioncreateDisposable(): Disposable{return{[Symbol.dispose](){// do something},};}constdisposable=createDisposable();
Valid:
functioncreateDisposable(): Disposable{return{[Symbol.dispose](){// do something},};}usingdisposable=createDisposable();
#978853b8e57 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% { ... }.
#97285085424 Thanks @mkosei! - Fixed #9696: Astro frontmatter now correctly parses regular expression literals like /\d{4}/.
#926116b6c49 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:
#9879ce7e2b7 Thanks @dyc3! - Fixed a parser diagnostic's message when vue syntax is disabled so that it no longer references the non-existant html.parser.vue option. This option will become available in 2.5.
#98807f67749 Thanks @dyc3! - Improved the diagnostics for useRegexpExec to better explain the problem, why it matters, and how to fix it.
#9846b7134d9 Thanks @ematipico! - Fixed #9140: Biome now parses Astro's attribute shorthand inside .astro files. The following snippet no longer reports a parse error:
#979067df09d Thanks @dyc3! - Fixed #9781: Trailing comments after a top-level biome-ignore-all format suppression are now preserved instead of being dropped. This applies to JavaScript, CSS, HTML, JSONC, GraphQL, and Grit files.
#9745d87073e Thanks @ematipico! - Fixed #9741: the LSP server now correctly returns the organizeImports code action when the client requests it via source.organizeImports.biome in the only filter. Previously, editors with codeAction/resolve support (e.g. Zed) received an empty response because the action was serialized with the wrong kind (source.biome.organizeImports instead of source.organizeImports.biome).
#98807f67749 Thanks @dyc3! - Improved the diagnostics for useArraySome to better explain the problem, why it matters, and how to fix it.
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 like process.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 any type validation from this rule. The any type
is now only validated by the dedicated noExplicitAny rule, following the
Single Responsibility Principle.
{#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)} — the item binding (plain identifier or destructured), the optional index, and the optional key expression 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:
#97390bc2198 Thanks @dyc3! - Fixed Grit queries that use native Biome AST node names with the native field names that are in our .ungram grammar files. Queries such as JsConditionalExpression(consequent = $cons, alternate = $alt) now compile successfully in biome search and grit plugins.
#98112dddca3 Thanks @dyc3! - Updated noImpliedEval to flag new Function() usages, as its a form of indirect eval, and to include no-new-func as a rule source.
#9870ccf9770 Thanks @Netail! - Marked eslint-qwik-plugin's unused-server as redundant since it was covered by noUnusedVariables.
#97011417c3b Thanks @dyc3! - Added the new nursery rule noUselessTypeConversion, which reports redundant primitive conversion patterns such as String(value) when value is already a string.
#924849f00a3 Thanks @pkallos! - useNullishCoalescing now also detects ternary expressions that check for null or undefined and suggests rewriting them with ??. A new ignoreTernaryTests option allows disabling this behavior.
#98636a44619 Thanks @ematipico! - Fixed #9690: biome check --write is 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.
#932093c3b6c 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.
#921604243b0 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:
importprocessfrom"node:process";// This was not flagged, but now it is:console.log(process.env.NODE_ENV);
#969261b7ec5 Thanks @mkosei! - Fixed Svelte #each destructuring parsing and formatting for nested patterns such as [key, { a, b }].
#962706a0f35 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.
#962706a0f35 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.
#96959856a87 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.
#962706a0f35 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.
#962706a0f35 Thanks @ematipico! - Improved the performance of the commands lint and check when they are called with --write.
#962706a0f35 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.
#962313b3261 Thanks @ematipico! - Fixed #9258: --skip no longer causes suppressions/unused warnings for suppression comments targeting skipped rules or domains.
#9631599dd04 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```.
#8670607ebf9 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.
classKek{statickek(): number{return0;}another(): string{return"";}kek(): number{return1;}// no longer reported as non-adjacent}
#947697b80a8 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.
#95530cd5298 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.
#95864cafb71 Thanks @dyc3! - Fixed #8828: Grit patterns using export { $foo } from $source now match named re-exports in JavaScript and TypeScript files.
#9550d4e3d6e Thanks @dyc3! - Fixed #9548: Biome now parses conditional expressions whose consequent is an arrow function returning a parenthesized object expression.
#8696a7c19cc 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.
#95576671ac5 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.
#94551710cf1 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.
#9584956e367 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.
#9474e168494 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.
#95558a3647b Thanks @ematipico! - Fixed #188: the Biome Language Server no longer panics when open files change abruptly, such as during git branch checkouts.
#9605f65c637 Thanks @ematipico! - Fixed #9589. Now Biome correctly parses object expressions inside props and directives. The following code doesn't emit errors anymore:
<styleis:globaldefine:vars={{ bgLight: light }}>
<Component name={{ first, name }} />
#9565ccb249e Thanks @eyupcanakman! - Fixed #9505: noUselessStringConcat no 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.
#95344d050df Thanks @Netail! - Added the nursery rule noInlineStyles. The rule disallows the use of inline style attributes in HTML and the style prop in JSX, including React.createElement calls. Inline styles make code harder to maintain and can interfere with Content Security Policy.
#9611cddaa44 Thanks @gaauwe! - Fixed a regression where Biome LSP could misread editor settings sent through workspace/didChangeConfiguration when the payload was wrapped in a top-level biome key. This caused requireConfiguration and related settings to be ignored in some editors.
#9488bc709f6 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.
#95272f8bf80 Thanks @mdm317! - Fixed #8959: Fixed TypeScript arrow function formatting when a comment appears after =>.
renovateBot
changed the title
chore(deps): update dependency @biomejs/biome to v2.3.14
chore(deps): update dependency @biomejs/biome to v2.3.15
Feb 14, 2026
Configuration file: biome.json with recommended rules enabled
Configuration Impact:
The biome.json schema URL is updated from 2.3.13 to 2.4.12
Current configuration uses:
rules.recommended: true - Will automatically adopt new recommended rules
VCS integration enabled
Formatter with tab indentation
Double quotes for JavaScript
Organize imports assist action enabled
Testing Results:
✅ bun install - Successfully installed version 2.4.12
✅ bun run lint - Passed with no issues (25 files checked)
✅ bun run format - Passed with no fixes needed (25 files checked)
✅ bunx vitest run - All 59 tests passed (2 test files)
✅ bun run build - TypeScript compilation successful
Impact on Dependencies:
No impact on other dependencies
Biome is a standalone tool with optional platform-specific binaries
All optional dependencies (@biomejs/cli-*) updated consistently
Code Compatibility:
No source code changes required
All existing code passes with the new version
No new violations introduced
Configuration remains fully compatible
💡 Recommended Actions
Immediate Actions:
✅ Merge this PR - The update is safe and backward compatible
No code changes required
No configuration changes required
Optional Considerations:
Review New Nursery Rules: While the current configuration only enables recommended rules, you may want to explore new nursery rules that could benefit the codebase:
noIdenticalTestTitle - Could improve test quality
useStringStartsEndsWith - Could improve code readability
Consider enabling specific nursery rules if they align with project standards
Monitor for Future Promotions: Some nursery rules may be promoted to recommended in future releases, which will automatically apply when using rules.recommended: true
renovateBot
changed the title
chore(deps): update dependency @biomejs/biome to v2.3.15
chore(deps): update dependency @biomejs/biome to v2.4.0
Feb 18, 2026
renovateBot
changed the title
chore(deps): update dependency @biomejs/biome to v2.4.0
chore(deps): update dependency @biomejs/biome to v2.4.1
Feb 19, 2026
renovateBot
changed the title
chore(deps): update dependency @biomejs/biome to v2.4.1
chore(deps): update dependency @biomejs/biome to v2.4.2
Feb 20, 2026
renovateBot
changed the title
chore(deps): update dependency @biomejs/biome to v2.4.2
chore(deps): update dependency @biomejs/biome to v2.4.3
Feb 22, 2026
renovateBot
changed the title
chore(deps): update dependency @biomejs/biome to v2.4.3
chore(deps): update dependency @biomejs/biome to v2.4.4
Feb 23, 2026
renovateBot
changed the title
chore(deps): update dependency @biomejs/biome to v2.4.4
chore(deps): update dependency @biomejs/biome to v2.4.5
Mar 5, 2026
renovateBot
changed the title
chore(deps): update dependency @biomejs/biome to v2.4.5
chore(deps): update dependency @biomejs/biome to v2.4.6
Mar 8, 2026
renovateBot
changed the title
chore(deps): update dependency @biomejs/biome to v2.4.6
chore(deps): update dependency @biomejs/biome to v2.4.7
Mar 16, 2026
renovateBot
changed the title
chore(deps): update dependency @biomejs/biome to v2.4.7
chore(deps): update dependency @biomejs/biome to v2.4.8
Mar 21, 2026
renovateBot
changed the title
chore(deps): update dependency @biomejs/biome to v2.4.8
chore(deps): update dependency @biomejs/biome to v2.4.9
Mar 28, 2026
renovateBot
changed the title
chore(deps): update dependency @biomejs/biome to v2.4.9
chore(deps): update dependency @biomejs/biome to v2.4.10
Apr 2, 2026
renovateBot
changed the title
chore(deps): update dependency @biomejs/biome to v2.4.10
chore(deps): update dependency @biomejs/biome to v2.4.11
Apr 16, 2026
renovateBot
changed the title
chore(deps): update dependency @biomejs/biome to v2.4.11
chore(deps): update dependency @biomejs/biome to v2.4.12
Apr 21, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Labels
None yet
0 participants
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
2.3.13→2.4.122.3.13→2.4.12Release Notes
biomejs/biome (@biomejs/biome)
v2.4.12Compare Source
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.#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:
#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:
#9913
d417803Thanks @Netail! - Added the nursery rulenoJsxNamespace, which disallows JSX namespace syntax.Invalid:
#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:
#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 ESLint
no-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:
#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.#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.v2.4.11Compare Source
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:
#9429
a2f3f7eThanks @ematipico! - Added the new nursery lint ruleuseExplicitReturnType. It reports TypeScript functions and methods that omit an explicit return type.#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.#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:
Valid:
#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:#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:
const sum = 1 + 1)const isEqual = 'a' === 'b',const isTest = process.env.NODE_ENV === 'test')const and = true && false)const date = new Date())const arr = [1, 2, 3])const val = true ? 'yes' : 'no')const num = Math.random())const fn = (max = MAX_ATTEMPTS) => ...)Comparison expressions always return
boolean, so any operands are now allowed(including property access like
process.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. Theanytypeis now only validated by the dedicated
noExplicitAnyrule, following theSingle Responsibility Principle.
#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.<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:
#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.v2.4.10Compare Source
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.#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:#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```.v2.4.9Compare Source
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:
#9567
b7ab931Thanks @ematipico! - Fixed #7211:useOptionalChainnow detects negated logical OR chains. The following code is now considered invalid:#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.#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 both
denyandalloware 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:#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.v2.4.8Compare Source
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](https://redirecConfiguration
📅 Schedule: (UTC)
* 0-4,22-23 * * 1-5)* * * * 0,6)🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
This PR was generated by Mend Renovate. View the repository job log.