Releases: biomejs/biome
Biome CLI v2.3.14
2.3.14
Patch Changes
-
#8921
29e2435Thanks @siketyan! - Fixed #8759: TheuseConsistentTypeDefinitionsrule no longer converts empty object type declarations into interfaces, as it will conflict with thenoEmptyInterfacerule and can cause an infinite loop when both rules are enabled. -
#8928
ccaeac4Thanks @taga3s! - Added the nursery ruleuseGlobalThis. This rule enforces usingglobalThisoverwindow,selfandglobal. -
#8602
9a18daaThanks @dyc3! - Added the new nursery rulenoVueArrowFuncInWatch. This rule forbids using arrow functions in watchers in Vue components, because arrow functions do not give access to the component instance (viathis), while regular functions do. -
#8905
9b1eea8Thanks @ryan-m-walker! - Fixed #8428: Improved parsing recovery when encountering qualified rules inside CSS@pageat-rule blocks. -
#8900
f788cffThanks @mdevils! - Fixed #8802:useExhaustiveDependenciesnow correctly suggests dependencies without including callback-scoped variables or method names.When accessing object properties with a callback-scoped variable, only the object path is suggested:
// Now correctly suggests `props.value` instead of `props.value[day]` useMemo(() => { return WeekdayValues.filter((day) => props.value[day]); }, [props.value]);
When calling methods on objects, only the object is suggested as a dependency:
// Now correctly suggests `props.data` instead of `props.data.forEach` useMemo(() => { props.data.forEach((item) => console.log(item)); }, [props.data]);
-
#8913
e1e20eaThanks @dyc3! - Fixed #8363: HTML parser no longer crashes when encountering a<character followed by a digit in text content (e.g.,<12 months). The parser now correctly emits an "Unescaped<bracket character" error instead of treating<12as a tag name and crashing. -
#8910
2fb63a4Thanks @dyc3! - Fixed #8774: Type aliases with generic parameters that haveextendsconstraints now properly indent comments after the equals sign.Previously, comments after the
=in type aliases withextendsconstraints were not indented:-type A<B, C extends D> = // Some comment -undefined; +type A<B, C extends D> = + // Some comment + undefined;
-
#8916
ea4bd04Thanks @ryan-m-walker! - Fixed #4013, where comments in member chains caused unnecessary line breaks.// Before aFunction.b().c.d(); // After aFunction.b().c.d();
-
#8945
fa66fe3Thanks @fireairforce! - Fixed #8354: Don't remove quotes when type memeber is new.// Input: type X = { "new"(): string; "foo"(): string; }; // Format Output: type X = { "new()": string; foo(): string; };
-
#8927
0ef3da5Thanks @littleKitchen! - Fixed #8907:useExhaustiveDependenciesnow correctly recognizes stable hook results (likeuseStatesetters anduseRefvalues) when declared withlet. -
#8931
4561751Thanks @koshin01! - Added the new nursery rulenoRedundantDefaultExport, which flags redundant default exports where the default export references the same identifier as a named export. -
#8900
f788cffThanks @mdevils! - Fixed #8883:useExhaustiveDependenciesno longer produces false positives when props are destructured in the function body of arrow function components without parentheses around the parameter.type Props = { msg: string }; // Arrow function without parentheses around `props` const Component: React.FC<Props> = (props) => { const { msg } = props; // Previously, this incorrectly reported `msg` as unnecessary useEffect(() => console.log(msg), [msg]); };
-
#8861
3531687Thanks @dyc3! - Added thenoDeprecatedMediaTypeCSS rule to flag deprecated media types liketvandhandheld. -
#8775
7ea71cdThanks @igas! - Fixed thenoUnnecessararyConditionsrule to prevent trigger for optional fallback patterns. -
#8860
95f1eeaThanks @dyc3! - Added the nursery rulenoHexColors, which flags the use of hexadecimal color codes in CSS and suggests using named colors or RGB/RGBA/HSL/HSLA formats instead. -
#8786
d876a38Thanks @Bertie690! - Added the nursery ruleuseConsistentMethodSignatures.
Inspired by the similarly named version fromtypescript-eslint, this rule aims to enforce a consistent style for methods used inside object types and interfaces.Examples
Invalid code with
styleset to"property"(the default):interface Foo { method(a: string): void; }
Invalid code with
styleset to"method":type Bar = { prop: (a: string) => void; }
-
#8864
5e97119Thanks @dyc3! - Improved the summary provided bybiome migrate eslintto be clearer on why rules were not migrated. Biome now specifies a reason when a rule is not migrated, such as being incompatible with the formatter or not implemented yet. This helps users make more informed decisions when migrating their ESLint configurations to Biome. -
#8924
99b4cd1Thanks @tmohammad78! - Fixed #8920:noUnknownFunctionnow knows aboutsibling-count, andsibling-indexcss functions -
#8900
f788cffThanks @mdevils! - Fixed #8885:useExhaustiveDependenciesno longer incorrectly reports variables as unnecessary dependencies when they are derived from expressions containing post/pre-increment operators (++/--) or compound assignment operators (+=,-=, etc.).let renderCount = 0; export const MyComponent = () => { // `count` is now correctly recognized as a required dependency // because `renderCount++` can produce different values between renders const count = renderCount++; useEffect(() => { console.log(count); }, [count]); // no longer reports `count` as unnecessary };
-
#8619 [
d78e01d](...
Biome CLI v2.3.13
2.3.13
Patch Changes
-
#8815
f924f23Thanks @dyc3! - ImproveduseVueValidVOnto be more closely aligned with the source rule. It will now properly allow modifiers for all possible keyboard events. It should have better performance when there are no violations of the rule as well.Now treated valid:
<div @keydown.arrow-down="handler"></div> <div @keydown.a="handler"></div> <div @keydown.b="handler"></div> <div @keydown.27="foo"></div>
-
#8856
85f81f9Thanks @dyc3! - Fixed #8710: Biome now parses Vue dynamic slot shorthand arguments that use template literals in[]. -
#8850
2a190e0Thanks @dyc3! - Fixed #8708: Tailwind@utilitydirectives now parse functional utility names likepx-*when Tailwind directives are enabled. -
#8863
79386e0Thanks @dyc3! - Fixed an issue withbiome migrate eslintwhere it couldn't detect rules for CSS, GraphQL, and HTML. -
#8771
6f56b6eThanks @lghuahua! - Fix the--reporter=summaryoutput incorrectly merging and displaying wrong issue counts for different rules. Fixes #8730 -
#8714
ac3a71fThanks @Netail! - Added new nursery ruleuse-consistent-enum-value-type. This rule disallows enums from having both number and string members.
What's Changed
- fix(dx/codegen): don't insert module into
biome_rule_options/src/lib.rsif it already exists by @dyc3 in #8847 - feat(js_analyze): implement useConsistentEnumValueType by @Netail in #8714
- fix(parse/html/vue): parse dynamic slot directives that contain quotes by @dyc3 in #8856
- fix(parse/css): improve parsing of
@utilitynames by @dyc3 in #8850 - fix(cli): improve RuleName ordering and update summary snapshots close #8730 by @lghuahua in #8771
- fix(useVueValidVOn): align more with source rule, also use phf hash sets for perf by @dyc3 in #8815
- fix(migrate): fix migrate command not picking up rules for css, graphql, html by @dyc3 in #8863
- chore(deps): update dependency tombi to v0.7.23 by @renovate[bot] in #8865
- chore(deps): update pnpm to v10.28.1 by @renovate[bot] in #8866
- chore(deps): update rust crate proc-macro2 to 1.0.106 by @renovate[bot] in #8867
- chore(deps): update rust crate quote to 1.0.44 by @renovate[bot] in #8868
- fix(deps): update @biomejs packages by @renovate[bot] in #8869
- chore(deps): update rust crate schemars to 1.2.0 by @renovate[bot] in #8875
- chore(deps): update @biomejs packages by @renovate[bot] in #8872
- chore(deps): update github-actions by @renovate[bot] in #8873
- chore(deps): update typescript-eslint monorepo to v8.53.1 by @renovate[bot] in #8877
- fix(deps): update dependency prettier to v3.8.1 by @renovate[bot] in #8878
- chore(deps): update rust crate tokio to 1.49.0 by @renovate[bot] in #8876
- ci: release by @github-actions[bot] in #8853
New Contributors
Full Changelog: https://github.com/biomejs/biome/compare/@biomejs/biome@2.3.12...@biomejs/biome@2.3.13
Biome CLI v2.3.12
2.3.12
Patch Changes
-
#8653
047576dThanks @dyc3! - Added new nursery rulenoDuplicateAttributesto forbid duplicate attributes in HTML elements. -
#8648
96d09f4Thanks @BaeSeokJae! - Added a new nursery rulenoVueOptionsApi.Biome now reports Vue Options API usage, which is incompatible with Vue 3.6's Vapor Mode.
This rule detects Options API patterns in<script>blocks,defineComponent(), andcreateApp()calls,
helping prepare codebases for Vapor Mode adoption.For example, the following now triggers this rule:
<script> export default { data() { return { count: 0 }; }, }; </script>
-
#8832
b08270bThanks @Exudev! - Fixed #8809, #7985, and #8136: thenoSecretsrule no longer reports false positives on common CamelCase identifiers likepaddingBottom,backgroundColor,unhandledRejection,uncaughtException, andIngestGatewayLogGroup.The entropy calculation algorithm now uses "average run length" to distinguish between legitimate CamelCase patterns (which have longer runs of same-case letters) and suspicious alternating case patterns (which have short runs).
-
#8793
c19fb0eThanks @TheBaconWizard! - Properly handleparametersmetavariables forarrow_functionGritQL queries. The followingbiome searchcommand no longer throws an error:biome search 'arrow_function(parameters=$parameters, body=$body)' -
#8561
981affbThanks @wataryooou! - FixednoUnusedVariablesto ignore type parameters declared in ambient contexts such asdeclare moduleblocks. -
#8817
652cfbbThanks @dyc3! - Fixed #8765: The HTML parser can now parse directive modifiers with a single colon, e.g.@keydown.:. -
#8704
a1914d4Thanks @Netail! - Added the nursery rulenoRootType.
Disallow the usage of specified root types. (e.g.mutationand/orsubscription)Invalid:
{ "options": { "disallow": ["mutation"] } }type Mutation { SetMessage(message: String): String }
-
#8712
251b47bThanks @Netail! - Renamed the following GraphQL nursery rules to match the Biome standard:useUniqueArgumentNames->noDuplicateArgumentNamesuseUniqueFieldDefinitionNames->noDuplicateFieldDefinitionNamesuseUniqueGraphqlOperationName->noDuplicateGraphqlOperationNameuseUniqueInputFieldNames->noDuplicateInputFieldNamesuseUniqueVariableNames->noDuplicateVariableNames
Run the
biome migrate --writecommand to automatically update the configuration file. -
#7602
957cd8eThanks @kedevked! - Added the nursery lint ruleuseErrorCause.This rule enforces that errors caught in a
catchclause are not rethrown without wrapping them in a newErrorobject and specifying the original error as thecause. This helps preserve the error’s stack trace and context for better debugging.It can be configured with the following option:
requireCatchParameter: (default:true)- When
true, the rule requires thatcatchclauses have a parameter. If athrowstatement appears inside acatchclause without a parameter, it will be flagged.
- When
Invalid examples:
try { foo(); } catch { throw new Error("fail"); }
try { foo(); } catch (err) { throw new Error(err.message); }
Valid examples:
try { foo(); } catch (err) { throw new Error("fail", { cause: err }); }
try { foo(); } catch (error) { throw new Error("Something went wrong", { cause: error }); }
Valid example when
requireCatchParameterisfalse:Valid:
try { foo(); } catch { throw new Error("fail"); }
-
#8725
95aba98Thanks @dyc3! - Fixed #8715: The CSS parser will now recover slightly better if a semicolon is missing from Tailwind's@applyat-rule. -
#8616
4ee3bdaThanks @Netail! - Added the nursery ruleuseLoneAnonymousOperation. Disallow anonymous operations when more than one operation specified in document.Invalid:
query { fieldA } query B { fieldB }
-
#8624
291c9f2Thanks @taga3s! - Added the nursery ruleuseInlineScriptIdto the Next.js domain.
This rule enforcesidattribute onnext/scriptcomponents with inline content ordangerouslySetInnerHTML.The following code is invalid:
import Script from "next/script"; export default function Page() { return ( <Script>{`console.log('Hello');`}</Script> // must have `id` attribute ); }
-
#8767
0d15370Thanks @mdevils! - Fixed #3512:
useExhaustiveDependenciesnow properly handles nested destructuring patterns
from hook results.const [[x, y], setXY] = useState([1, 2]); useEffect(() => { console.log(x, y); }, [x, y]); // x and y are now correctly recognized as unstable
-
#8757
17ed9d3Thanks @Netail! - Added the nursery rulenoDivRegex. Disallow equal signs explicitly at the beginning of regular expressions.Invalid:
var f = function () { return /=foo/; };
-
#8836
aab1d17Thanks @dyc3! - Fixed #7858: Biome now parses Astro files with empty frontmatter blocks. -
#8755
3a15c29Thanks @arturalkaim! - Fixed #6670. The$filenamemetavariable can now be used in GritQLwhereclauses to filter matches by filename. -
#8821
63e68a1Thanks @playhardgopro! - Fixed several bugs in Vue conditional rules (useVueValidVIf,useVueValidVElse, anduseVueValidVElseIf) related to whitespace handling, newlines, and self-closing tags. -
#8767
0d15370Thanks @mdevils! - Fixed #3685:
useExhaustiveDependenciesnow properly handles transparent expression
wrappers like non-null assertions and type assertions in dependency comparisons.useMemo(() => Boolean(myObj!.x), [myObj!.x]); // No longer reports incorrect diagnostics useMemo(() => myObj!.x?.y === true, [myObj!.x?.y]); // Now correctly matches dependencies
-
#8597 [
f764007](f7640071fa356808...
Biome CLI v2.3.11
2.3.11
Patch Changes
-
#8583
83be210Thanks @dyc3! - Added the new nursery ruleuseVueValidTemplateRoot.This rule validates only root-level
<template>elements in Vue single-file components. If the<template>has asrcattribute, it must be empty. Otherwise, it must contain content.Invalid examples:
<template src="./foo.html">content</template>
<template></template>
Valid examples:
<template>content</template>
<template src="./foo.html"></template>
-
#8586
df8fe06Thanks @dyc3! - Added a new nursery ruleuseVueConsistentVBindStyle. Enforces consistentv-bindstyle (:propshorthand vsv-bind:proplonghand). Default prefers shorthand; configurable via rule options. -
#8587
9a8c98dThanks @dyc3! - Added the ruleuseVueVForKey, which enforces that any element usingv-foralso specifies akey.Invalid
<li v-for="item in items">{{ item }}</li>
Valid
<li v-for="item in items" :key="item.id">{{ item }}</li>
-
#8586
df8fe06Thanks @dyc3! - Added a new nursery ruleuseVueConsistentVOnStyle. Enforces consistentv-onstyle (@eventshorthand vsv-on:eventlonghand). Default prefers shorthand; configurable via rule options. -
#8583
83be210Thanks @dyc3! - Added the new nursery ruleuseVueValidVOnce. Enforces that usages of thev-oncedirective in Vue.js SFC are valid.<!-- Valid --> <div v-once /> <!-- Invalid --> <div v-once:aaa /> <div v-once.bbb /> <div v-once="ccc" />
-
#8498
d80fa41Thanks @tt-a1i! - Fixed #8494. ExtendednoUndeclaredEnvVarsto support bracket notation (process.env["VAR"],import.meta.env["VAR"]), Bun runtime (Bun.env.VAR,Bun.env["VAR"]), and Deno runtime (Deno.env.get("VAR")). -
#8509
574a909Thanks @ematipico! - Added support for parsing and formatting the Svelte{#await}syntax, whenhtml.experimentalFullSupportEnabledis set totrue.-{#await promise then name } +{#await promise then name} -{:catch name} +{:catch name} {/await}
-
#8316
d64e92dThanks @washbin! - Added the new nursery rulenoMultiAssign. This rule helps to prevent multiple chained assignments.For example, the following code triggers because there are two assignment expressions in the same statement.
const a = (b = 0);
-
#8592
a5f59cdThanks @Netail! - Added the nursery ruleuseUniqueInputFieldNames. Require fields within an input object to be unique.Invalid:
query A($x: Int, $x: Int) { field }
-
#8524
17a6156Thanks @JacquesLeupin! - Fixed #8488: Relative plugin paths are now resolved from the configuration file directory, including when configurations are merged (e.g.extends: "//"). -
#8655
3260ec9Thanks @JacquesLeupin! - Fixed #8636: Biome's CSS formatter now breaks comma-separated declaration values at top-level commas when wrapping. -
#8537
cc3e851Thanks @dibashthapa! - Fixed #8491: Resolved false positive errors for safe boolean expressions. There are still pending fixes. Head to #8491 (comment) for more detailsThis new change will check for safe boolean expressions in variable declarations.
For example,
Valid:
let isOne = 1; let isPositiveNumber = number > 0; return ( <div> {" "} {isOne && "One"} {isPositiveNumber && "Is positive"} </div> );
Invalid:
let emptyStr = ""; let isZero = 0; return ( <div> {emptyStr && "Empty String"} {isZero && "Number is zero"}{" "} </div> );
-
#8511
16a9036Thanks @ematipico! - Improved the diagnostics of the rulesuseSortedClassesandnoUnnecessaryConditions. The diagnostics now state that these rules are a work in progress and link to the relevant GitHub issue. -
#8521
a704be9Thanks @ToBinio! - Added the nursery ruleuseVueConsistentDefinePropsDeclaration, which enforces consistentdefinePropsdeclaration style.Invalid
<script setup lang="ts"> const props = defineProps({ kind: { type: String }, }); </script>
Valid
<script setup lang="ts"> const props = defineProps<{ kind: string; }>(); </script>
-
#8595
7c85bf0Thanks @dyc3! - Fixed #8584: The HTML formatter will preserve whitespace after some elements and embedded expressions, which more closely aligns with Prettier's behavior.- <h1>Hello, {framework}and Svelte!</h1> + <h1>Hello, {framework} and Svelte!</h1>
-
#8598
5e85d43Thanks @Netail! - Added the nursery ruleuseUniqueFieldDefinitionNames. Require all fields of a type to be unique.Invalid:
type SomeObject { foo: String foo: String }
-
#8495
b573d14Thanks @taga3s! - Fixed #8405:noMisusedPromisesnow emits warnings/errors when a function returns union types such asT | Promise<T>which is used in conditionals.const a = (): boolean | Promise<boolean> => Promise.resolve(true); if (a()) { } // Now correctly flagged
-
#8632
0be7d12Thanks @Bertie690! - The documentation & rule sources forlint/complexity/noBannedTypeshave been updated to fix a few oversights.In addition to some general typo fixes:
-
The rule now recommends
Record<keyof any, never>instead ofRecord<string, never>(the latter of which incorrectly allows symbol-keyed properties). -
The rule mentions an alternate method to enforce object emptiness involving
unique symbol-based guards used bytype-festand many other packages:declare const mySym: unique symbol; // Since this type's only property is an unexpor...
-
Biome CLI v2.3.10
2.3.10
Patch Changes
-
#8417
c3a2557Thanks @taga3s! - Fixed #7809:noRedeclareno longer reports redeclarations forinfertype in conditional types. -
#8477
90e8684Thanks @dyc3! - Fixed #8475: fixed a regression in hownoExtraNonNullAssertionflags extra non-null assertions -
#8479
250b519Thanks @dyc3! - Fixed #8473: The semantic model now indexes typescript constructor method definitions, and no longer panics if you use one (a regression in 2.3.9). -
#8448
2af85c1Thanks @mdevils! - Improved handling ofdefineProps()macro in Vue components. ThenoVueReservedKeysrule now avoids false positives in non-setup scripts. -
#8420
42033b0Thanks @vsn4ik! - Fixed the nursery rulenoLeakedRender.The
biome migrate eslintcommand now correctly detects the rulereact/jsx-no-leaked-renderin your eslint configurations. -
#8426
285d932Thanks @anthonyshew! - Added a Turborepo domain and a new "noUndeclaredEnvVars" rule in it for warning users of unsafe environment variable usage in Turborepos. -
#8410
a21db74Thanks @ematipico! - Fixed #2988 where Biome couldn't handle properly characters that contain multiple code points when running instdinmode. -
#8372
b352ee4Thanks @Netail! - Added the nursery rulenoAmbiguousAnchorText, which disallows ambiguous anchor descriptions.Invalid
<a>learn more</a>
What's Changed
- feat: new Turborepo domain and
noUndeclaredEnvVarsrule by @anthonyshew in #8426 - fix(noExtraNonNullAssertion): fix regression by @dyc3 in #8477
- fix(analyze/js): index ts constructor methods in semantic model (regression) by @dyc3 in #8479
- fix(lint):
lint/suspicous/noRedeclareshould not report redeclarations forinfertype in conditional types by @taga3s in #8417 - fix(noLeakedRender): eslint rule name fix by @vsn4ik in #8420
- chore: add kraken as bronze sponsor by @dyc3 in #8486
- fix(linter): improve Vue defineProps handling in noVueReservedKeys by @mdevils in #8448
- fix(cli): colors with multi-codepoints characters by @ematipico in #8410
- feat(lint): implement noAmbiguousAnchorText by @Netail in #8372
- ci: release by @github-actions[bot] in #8474
- docs: fix typos for assist/actions/organize-imports by @sergioness in #8490
New Contributors
- @taga3s made their first contribution in #8417
- @vsn4ik made their first contribution in #8420
- @sergioness made their first contribution in #8490
Full Changelog: https://github.com/biomejs/biome/compare/@biomejs/biome@2.3.9...@biomejs/biome@2.3.10
Biome CLI v2.3.9
2.3.9
Patch Changes
-
#8232
84c9e08Thanks @ruidosujeira! - Added the nursery rulenoScriptUrl.This rule disallows the use of
javascript:URLs, which are considered a form ofevaland can pose security risks such as XSS vulnerabilities.<a href="javascript:alert('XSS')">Click me</a>
-
#8341
343dc4dThanks @arendjr! - Added the nursery ruleuseAwaitThenable, which enforces thatawaitis only used on Promise values.Invalid
await "value"; const createValue = () => "value"; await createValue();
Caution
This is a first iteration of the rule, and does not yet detect generic "thenable" values.
-
#8034
e7e0f6cThanks @Netail! - Added the nursery ruleuseRegexpExec. EnforceRegExp#execoverString#matchif no global flag is provided. -
#8137
d407efbThanks @denbezrukov! - Reduced the internal memory used by the Biome formatter. -
#8281
30b046fThanks @tylersayshi! - Added the ruleuseRequiredScripts, which enforces presence of configurable entries in thescriptssection ofpackage.jsonfiles. -
#8290
d74c8bdThanks @dyc3! - The HTML formatter has been updated to match Prettier 3.7's behavior for handling<iframe>'sallowattribute.- <iframe allow="layout-animations 'none'; unoptimized-images 'none'; oversized-images 'none'; sync-script 'none'; sync-xhr 'none'; unsized-media 'none';"></iframe> + <iframe + allow=" + layout-animations 'none'; + unoptimized-images 'none'; + oversized-images 'none'; + sync-script 'none'; + sync-xhr 'none'; + unsized-media 'none'; + " + ></iframe>
-
#8302
d1d5014Thanks @mlafeldt! - Fixed #8109: return statements in Astro frontmatter no longer trigger "Illegal return statement" errors when usingexperimentalFullSupportEnabled. -
#8346
f3aee1aThanks @arendjr! - Fixed #8292: Implement tracking
of types of TypeScript constructor parameter properties.This resolves certain false negatives in
noFloatingPromisesand other typed
rules.Example
class AsyncClass { async returnsPromise() { return "value"; } } class ShouldBeReported { constructor(public field: AsyncClass) {} // ^^^^^^^^^^^^----------------- Parameter property declaration async shouldBeReported() { // `noFloatingPromises` will now report the following usage: this.field.returnsPromise(); } }
-
#8326
153e3c6Thanks @ematipico! - Improved the rulenoBiomeFirstException. The rule can now inspect if extended configurations already contain the catch-all**insidefiles.includesand, if so, the rule suggests removing**from the user configuration. -
#8433
397547aThanks @dyc3! - Fixed #7920: The CSS parser, with Tailwind directives enabled, will no longer error when you use things likeprefix(tw)in@importat rules. -
#8378
cc2a62eThanks @Bertie690! - Clarify diagnostic message forlint/style/useUnifiedTypeSignaturesThe rule's diagnostic message now clearly states that multiple similar overload signatures are hard to read & maintain, as opposed to overload signatures in general.
-
#8296
9d3ef10Thanks @dyc3! -biome ragenow shows if you have experimental HTML full support enabled. -
#8414
09acf2aThanks @Bertie690! - Updated the documentation & diagnostic message forlint/nursery/noProto, mentioning the reasons for its longstanding deprecation and why more modern alternatives are preferred.Notably, the rule clearly states that using
__proto__inside object literal definitions is still allowed, being a standard way to set the prototype of a newly created object. -
#8445
c3df0e0Thanks @tt-a1i! - Fix--changedand--stagedflags throwing "No such file or directory" error when a file has been deleted or renamed in the working directory. The CLI now filters out files that no longer exist before processing. -
#8459
b17d12bThanks @ruidosujeira! - Fix #8435: resolved false positive innoUnusedVariablesfor generic type parameters in construct signature type members (new <T>(): T). -
#8439
a78774bThanks @tt-a1i! - Fixed #8011:useConsistentCurlyBracesno longer suggests removing curly braces from JSX expression children containing characters that would cause parsing issues or semantic changes when converted to plain JSX text ({,},<,>,&). -
#8436
a392c06Thanks @ruidosujeira! - Fixed #8429. Formatter, linter, and assist settings now correctly inherit from global configuration when not explicitly specified in overrides.Before this fix, when an override specified only one feature (e.g., only
linter), other features would be incorrectly disabled instead of inheriting from global settings.Example configuration that now works correctly:
{ "formatter": { "enabled": true }, "overrides": [ { "includes": ["*.vue"], "linter": { "enabled": false } } ] }After this fix,
.vuefiles will have the linter disabled (as specified in the override) but the formatter enabled (inherited from global settings). -
#8411
9f1b3b0Thanks @rriski! - Properly handlename,type_arguments, andattributesslots forJsxOpeningElementandJsxSelfClosingElementGritQL patterns.The following biome search commands no longer throw errors:
biome search 'JsxOpeningElement(name = $elem_name) where { $elem_name <: "div" }' biome search 'JsxSelfClosingElement(name = $elem_name) where { $elem_name <: "div" }'
-
#8441
cf37d0dThanks @tt-a1i! - Fixed #6577:noUselessUndefinedno longer reports() => undefinedin arrow function expression bodies. Previously, the rule would flag this pattern and suggest replacing it with() => {}, which conflicts with thenoEmptyBlockStatementsrule. -
#8444
8caa7a0Thanks @tt-a1i! - Fix [noUnknownMediaFeatureName](https://biomejs.dev/linter/rules/no-unknown-media-fe...
Biome CLI v2.3.8
2.3.8
Patch Changes
-
#8188
4ca088cThanks @ematipico! - Fixed #7390, where Biome couldn't apply the correct configuration passed via--config-path.If you have multiple root configuration files, running any command with
--config-pathwill now apply the chosen configuration file. -
#8171
79adaeaThanks @dibashthapa! - Added the new rulenoLeakedRender. This rule helps prevent potential leaks when rendering components that use binary expressions or ternaries.For example, the following code triggers the rule because the component would render
0:const Component = () => { const count = 0; return <div>{count && <span>Count: {count}</span>}</div>; };
-
#8116
b537918Thanks @Netail! - Added the nursery rulenoDuplicatedSpreadProps. Disallow JSX prop spreading the same identifier multiple times.Invalid:
<div {...props} something="else" {...props} />
-
#8256
f1e4696Thanks @cormacrelf! - Fixed a bug where logs were discarded (the kind from--log-level=infoetc.). This is a regression introduced after an internal refactor that wasn't adequately tested. -
#8226
3f19b52Thanks @dyc3! - Fixed #8222: The HTML parser, with Vue directives enabled, can now parsev-slotshorthand syntax, e.g.<template #foo>. -
#8007
182ecdcThanks @brandonmcconnell! - Added support for dollar-sign-prefixed filenames in theuseFilenamingConventionrule.Biome now allows filenames starting with the dollar-sign (e.g.
$postId.tsx) by default to support naming conventions used by frameworks such as TanStack Start for file-based-routing. -
#8218
91484d1Thanks @hirokiokada77! - Added thenoMultiStrrule, which disallows creating multiline strings by escaping newlines.Invalid:
const foo = "Line 1\n\ Line 2";
Valid:
const foo = "Line 1\nLine 2"; const bar = `Line 1 Line 2`;
-
#8225
98ca2aeThanks @ongyuxing! - Fixed #7806: Prefer breaking after the assignment operator for conditional types with generic parameters to match Prettier.-type True = unknown extends Type< - "many", - "generic", - "parameters", - "one", - "two", - "three" -> - ? true - : false; +type True = + unknown extends Type<"many", "generic", "parameters", "one", "two", "three"> + ? true + : false;
-
#6765
23f7855Thanks @emilyinure! - Fixed #6569: Allow files to export from themselves withnoImportCycles.This means the following is now allowed:
// example.js export function example() { return 1; } // Re-exports all named exports from the current module under a single namespace // and then imports the namespace from the current module. // Allows for encapsulating functions/variables into a namespace instead // of using a static class. export * as Example from "./example.js"; import { Example } from "./example.js";
-
#8214
68c052eThanks @hirokiokada77! - Added thenoEqualsToNullrule, which enforces the use of===and!==for comparison withnullinstead of==or!=.Invalid:
foo == null; foo != null;
Valid:
foo === null; foo !== null;
-
#8219
793bb9aThanks @dyc3! - Fixed #8190: The HTML parser will now parse Vue event handlers that contain:correctly, e.g.@update:modelValue="onUpdate". -
#8259
4a9139bThanks @hirokiokada77! - Fixed #8254: ThenoParameterAssignrule withpropertyAssignment: "deny"was incorrectly reporting an error when a function parameter was used on the right-hand side of an assignment to a local variable's property.The rule should only flag assignments that modify the parameter binding or its properties (L-value), not the use of its value.
Valid:
(input) => { const local = { property: 0 }; local.property = input; };
-
#8201
cd2edd7Thanks @Netail! - Added the nursery rulenoTernary. Disallow ternary operators.Invalid:
const foo = isBar ? baz : qux;
-
#8172
de98933Thanks @JeremyMoeglich! - Fixed #8145: handling of large hex literals, which previously caused both false positives and false negatives.This affects
noPrecisionLossandnoConstantMathMinMaxClamp. -
#8210
7b44e9eThanks @Netail! - Corrected rule source reference.biome migrate eslintshould do a bit better detecting rules in your eslint configurations. -
#8213
e430555Thanks @ruidosujeira! - Fixed #8209: Recognized formatting capability when either range or on-type formatting is supported, not only full-file formatting. This ensures editors and the language server correctly detect formatting support in files like JSONC. -
#8202
6f49d95Thanks @hirokiokada77! - Fixed #8079: Properly handlenameandvaluemetavariables forJsxAttributeGritQL queries.The following
biome searchcommand no longer throws an error:biome search 'JsxAttribute($name, $value) as $attr where { $name <: "style" }' -
#8276
f7e836fThanks @hirokiokada77! - Added thenoProtorule, which disallows the use of the__proto__property for getting or setting the prototype of an object.Invalid:
obj.__proto__ = a; const b = obj.__proto__;
Valid:
const a = Object.getPrototypeOf(obj); Object.setPrototypeOf(obj, b);
What's Changed
- fix(noImportCycles): prevent flagging on single file import cycling by @emilyinure in #6765
- chore: fix changeset by @ematipico in #8191
- ci: breakdown wasm CI build by @ematipico in #8187
- chore: disable docstrings in coderabbit by @Netail in #8203
- feat(js_analyze): implement noTernary by @Netail in #8201
- docs: missing references by @Netail in #8207
- fix(biome_grit_patterns): properly handle name and value m...
Biome CLI v2.3.7
2.3.7
Patch Changes
-
#8169
7fdcec8Thanks @arendjr! - Fixed #7999: Correctly placeawaitafter leading comment in auto-fix action fromnoFloatingPromisesrule. -
#8157
12d5b42Thanks @Conaclos! - Fixed #8148.noInvalidUseBeforeDeclarationno longer reports some valid use before declarations.The following code is no longer reported as invalid:
class classA { C = C; } const C = 0;
-
#8178
6ba4157Thanks @dyc3! - Fixed #8174, where the HTML parser would parse 2 directives as a single directive because it would not reject whitespace in Vue directives. This would cause the formatter to erroneously merge the 2 directives into one, resulting in broken code.- <Component v-else:property="123" /> + <Component v-else :property="123" />
-
#8088
0eb08e8Thanks @db295! - Fixed #7876: ThenoUnusedImportsrule now ignores imports that are used by @linkcode and @linkplain (previously supported @link and @see).The following code will no longer be a false positive:
import type { a } from "a" /** * {@linkcode a} */ function func() {}
-
#8119
8d64655Thanks @ematipico! - Improved the detection of the rulenoUnnecessaryConditions. Now the rule isn't triggered for variables that are mutated inside a module.This logic deviates from the original rule, hence
noUnnecessaryConditionsis now marked as "inspired".In the following example,
heystarts asfalse, but then it's assigned to a string. The rule isn't triggered inside theifcheck.let hey = false; function test() { hey = "string"; } if (hey) { }
-
#8149
e0a02bfThanks @Netail! - Fixed #8144: ImprovenoSyncScripts, ignore script tags withtype="module"as these are always non-blocking. -
#8182
e9f068eThanks @hirokiokada77! - Fixed #7877: Range suppressions now handle suppressed categories properly.Valid:
// biome-ignore-start lint: explanation const foo = 1; // biome-ignore-end lint: explanation
-
#8111
bf1a836Thanks @ryan-m-walker! - Added support for parsing and formatting the CSS if function.Example
.basic-style { color: if(style(--scheme: dark): #eeeeee; else: #000000;); }
-
#8173
7fc07c1Thanks @ematipico! - Fixed #8138 by reverting an internal refactor that caused a regression to the rulenoUnusedPrivateClassMembers. -
#8119
8d64655Thanks @ematipico! - Improved the type inference engine, by resolving types for variables that are assigned to multiple values. -
#8158
fb1458bThanks @dyc3! - Added theuseVueValidVTextlint rule to enforce validv-textdirectives. The rule reports whenv-texthas an argument, has modifiers, or is missing a value.Invalid:
<div v-text /> <!-- missing value --> <div v-text:aaa="foo" /> <!-- has argument --> <div v-text.bbb="foo" /> <!-- has modifier -->
-
#8158
fb1458bThanks @dyc3! - FixeduseVueValidVHtmlso that it will now flag empty strings, e.g.v-html="" -
#7078
bb7a15cThanks @emilyinure! - Fixed #6675: Now only flags
noAccumulatingSpread on Object.assign when a new object is being allocated on
each iteration. Before, all cases using Object.assign with reduce parameters
were warned despite not making new allocations.The following code will no longer be a false positive:
foo.reduce((acc, bar) => Object.assign(acc, bar), {});
The following cases which do make new allocations will continue to warn:
foo.reduce((acc, bar) => Object.assign({}, acc, bar), {});
-
#8175
0c8349eThanks @ryan-m-walker! - Fixed CSS formatting of dimension units to use correct casing forQ,HzandkHz.Before:
.cssUnits { a: 1Q; b: 1Hz; c: 1kHz; }
After:
.cssUnits { a: 1Q; b: 1Hz; c: 1kHz; }
What's Changed
- chore: remove gold sponsor by @ematipico in #8135
- fix: next namespace by @Netail in #8142
- fix(schema): domains and feature kind by @ematipico in #8147
- docs(lint/html): fix some html rule docs that mess up markdown rendering on the website by @dyc3 in #8154
- fix(noInvalidUseBeforeDeclaration): ignore valid use before declarations by @Conaclos in #8157
- fix: noSyncScripts type="module" by @Netail in #8149
- feat(css): add support for parsing and formatting the CSS if function by @ryan-m-walker in #8111
- chore: add regex globals by @arendjr in #8166
- ci: triggers for github merge queue by @dyc3 in #8168
- fix: correctly place await after comment by @arendjr in #8169
- fix(noUnusedImports): parse also linkcode, and not only link by @db295 in #8088
- fix(inference): improved inference for assignment types by @ematipico in #8119
- feat(lint/html/vue): add
useVueValidVTextby @dyc3 in #8158 - fix(css): updating formatting of non-lowercase CSS dimension units by @ryan-m-walker in #8175
- fix(parse/html/vue): reject whitespace before vue directive arguments by @dyc3 in #8178
- fix(biome_analyze): handle suppressed categories properly for range suppressions by @hirokiokada77 in #8182
- fix: only flag object assign in accumulators, if it is allocating a new object for each iter by @emilyinure in #7078
- fix: revert #7684 by @ematipico in #8173
- ci: release by @github-actions[bot] in #8161
New Contributors
Full Changelog: https://github.com/biomejs/biome/compare/@biomejs/biome@2.3.6...@biomejs/biome@2.3.7
Biome CLI v2.3.6
2.3.6
Patch Changes
-
#8100
82b9a8eThanks @Netail! - Added the nursery ruleuseFind. Enforce the use of Array.prototype.find() over Array.prototype.filter() followed by [0] when looking for a single result.Invalid:
[1, 2, 3].filter((x) => x > 1)[0]; [1, 2, 3].filter((x) => x > 1).at(0);
-
#8118
dbc7021Thanks @hirokiokada77! - Fixed #8117:useValidLangnow accepts valid BCP 47 language tags with script subtags.Valid:
<html lang="zh-Hans-CN"></html>
-
#7672
f1d5725Thanks @Netail! - Added the nursery ruleuseConsistentGraphqlDescriptions, requiring all descriptions to follow the same style (either block or inline) inside GraphQL files.Invalid:
enum EnumValue { "this is a description" DEFAULT }
Valid:
enum EnumValue { """ this is a description """ DEFAULT }
-
#8026
f102661Thanks @matanshavit! - Fixed #8004:noParametersOnlyUsedInRecursionnow correctly detects recursion by comparing function bindings instead of just names.Previously, the rule incorrectly flagged parameters when a method had the same name as an outer function but called the outer function (not itself):
function notRecursive(arg) { return arg; } const obj = { notRecursive(arg) { return notRecursive(arg); // This calls the outer function, not the method itself }, };
Biome now properly distinguishes between these cases and will not report false positives.
-
#8097
5fc5416Thanks @dyc3! - Added the nursery rulenoVueVIfWithVFor. This rule disallowsv-forandv-ifon the same element.<!-- Invalid --> <div v-for="item in items" v-if="item.isActive"> {{ item.name }} </div>
-
#8085
7983940Thanks @Netail! - Added the nursery rulenoForIn. Disallow iterating using a for-in loop.Invalid:
for (const i in array) { console.log(i, array[i]); }
-
#8086
2b41e82Thanks @matanshavit! - Fixed #8045: ThenoNestedTernaryrule now correctly detects nested ternary expressions even when they are wrapped in parentheses (e.g.foo ? (bar ? 1 : 2) : 3).Previously, the rule would not flag nested ternaries like
foo ? (bar ? 1 : 2) : 3because the parentheses prevented detection. The rule now looks through parentheses to identify nested conditionals.Previously not detected (now flagged):
const result = foo ? (bar ? 1 : 2) : 3;
Still valid (non-nested with parentheses):
const result = foo ? bar : baz;
-
#8075
e403868Thanks @YTomm! - Fixed #7948: TheuseReadonlyClassPropertiescode fix whencheckAllPropertiesis enabled will no longer insert a newline afterreadonlyand the class property. -
#8102
47d940eThanks @lucasweng! - Fixed #8027.useReactFunctionComponentsno longer reports class components that implementcomponentDidCatchusing class expressions.The rule now correctly recognizes error boundaries defined as class expressions:
const ErrorBoundary = class extends Component { componentDidCatch(error, info) {} render() { return this.props.children; } };
-
#8097
5fc5416Thanks @dyc3! - Added the nursery ruleuseVueHyphenatedAttributes, which encourages using kebab case for attribute names, per the Vue style guide's recommendations.<!-- Invalid --> <MyComponent myProp="value" /> <!-- Valid --> <MyComponent my-prop="value" />
-
#8108
0f0a658Thanks @Netail! - Added the nursery rulenoSyncScripts. Prevent the usage of synchronous scripts.Invalid:
<script src="https://third-party-script.js" />
Valid:
<script src="https://third-party-script.js" async /> <script src="https://third-party-script.js" defer />
-
#8098
1fdcaf0Thanks @Jayllyz! - Added documentation URLs to rule descriptions in the JSON schema. -
#8097
5fc5416Thanks @dyc3! - Fixed an issue with the HTML parser where it would treat Vue directives with dynamic arguments as static arguments instead. -
#7684
f4433b3Thanks @vladimir-ivanov! - ChangednoUnusedPrivateClassMembersto align more fully with meaningful reads.This rule now distinguishes more carefully between writes and reads of private class members.
- A meaningful read is any access that affects program behavior.
- For example,
this.#x += 1both reads and writes#x, so it counts as usage. - Pure writes without a read (e.g.
this.#x = 1with no getter) are no longer treated as usage.
This change ensures that private members are only considered “used” when they are actually read in a way that influences execution.
Invalid examples (previously valid)
class UsedMember { set #x(value) { doSomething(value); } foo() { // This assignment does not actually read #x, because there is no getter. // Previously, this was considered a usage, but now it’s correctly flagged. this.#x = 1; } }
Valid example (Previously invalid)
class Foo { #usedOnlyInWriteStatement = 5; method() { // This counts as a meaningful read because we both read and write the value. this.#usedOnlyInWriteStatement += 42; } }
-
#7684
f4433b3Thanks @vladimir-ivanov! - Improved detection of used private class membersThe analysis for private class members has been improved: now the tool only considers a private member “used” if it is actually referenced in the code.
- Previously, some private members might have been reported as used even if they weren’t actually accessed.
- With this change, only members that are truly read or called in the code are counted as used.
- Members that are never accessed will now be correctly reported as unused.
This makes reports about unused private members more accurate and helps you clean up truly unused code.
Example (previously valid)
type YesNo = "yes" | "no"; export class SampleYesNo { private yes: () => void; private no: () => void; private dontKnow: () => void; // <- will now report as unused on(action: YesNo): void { this[action](); } }
-
#7681
b406db6Thanks @kedevked! - Added the new lint rule,useSpread, po...
Biome CLI v2.3.5
2.3.5
Patch Changes
-
#8023
96f3e77Thanks @ematipico! - Added support Svelte syntax{@html}. Biome now is able to parse and format the Svelte syntax{@html}:-{@html 'div'} +{@html 'div'}
The contents of the expressions inside the
{@html <expression>}aren't formatted yet. -
#8058
5f68bccThanks @ematipico! - Fixed a bug where the Biome Language Server would enable its project file watcher even when no project rules were enabled.Now the watching of nested configuration files and nested ignore files is delegated to the editor, if their LSP spec supports it.
-
#8023
96f3e77Thanks @ematipico! - Added support Svelte syntax{@render}. Biome now is able to parse and format the Svelte syntax{@render}:-{@render sum(1, 2) } +{@render sum(1, 2)}
The contents of the expressions inside the
{@render <expression>}aren't formatted yet. -
#8006
f0612a5Thanks @Bertie690! - Updated documentation and diagnostic forlint/complexity/noBannedTypes. The rule should have a more detailed description and diagnostic error message. -
#8039
da70d8bThanks @PFiS1737! - Biome now keeps a blank line after the frontmatter section in Astro files. -
#8042
b7efa6fThanks @dyc3! - The CSS Parser, withtailwindDirectivesenabled, will now accept at rules like@mediaand@supportsin@custom-variantshorthand syntax. -
#8064
3ff9d45Thanks @dibashthapa! - Fixed #7967: Fixed the issue with support for advanced SVG props -
#8023
96f3e77Thanks @ematipico! - Added support Svelte syntax{@attach}. Biome now is able to parse and format the Svelte syntax{@attach}:-<div {@attach myAttachment }>...</div> +<div {@attach myAttachment}>...</div>
The contents of the expressions inside the
{@attach <expression>}aren't formatted yet. -
#8001
6e8a50eThanks @ematipico! - Added support Svelte syntax{#key}. Biome now is able to parse and format the Svelte syntax{#key}:-{#key expression} <div></div> {/key} +{#key expression} + <div></div> +{/key}
The contents of the expressions inside the
{#key <expression>}aren't formatted yet. -
#8023
96f3e77Thanks @ematipico! - Added support Svelte syntax{@const}. Biome now is able to parse and format the Svelte syntax{@const}:-{@const name = value} +{@const name = value}
The contents of the expressions inside the
{@const <expression>}aren't formatted yet. -
#8044
8f77d4aThanks @Netail! - Corrected rule source references.biome migrate eslintshould do a bit better detecting rules in your eslint configurations. -
#8065
1a2d1afThanks @Netail! - Added the nursery ruleuseArraySortCompare. Require Array#sort and Array#toSorted calls to always provide a compareFunction.Invalid:
const array = []; array.sort();
Valid:
const array = []; array.sort((a, b) => a - b);
-
#7673
a3a713dThanks @dyc3! - The HTML parser is now able to parse vue directives. This enables us to write/port Vue lint rules that require inspecting the<template>section. However, this more complex parsing may result in parsing errors where there was none before. For those of you that have opted in to the experimental support (akaexperimentalFullSupportEnabled), we greatly appreciate your help testing this out, and your bug reports. -
#8031
fa6798aThanks @ematipico! - Added support for the Svelte syntax{#if}{/if}. The Biome HTML parser is now able to parse and format the{#if}{/if} blocks:<!-- if / else-if / else --> {#if porridge.temperature > 100} -<p>too hot!</p> + <p>too hot!</p> {:else if 80 > porridge.temperature} -<p>too cold!</p> + <p>too cold!</p> {:else if 100 > porridge.temperature} -<p>too too cold!</p> + <p>too too cold!</p> {:else} -<p>just right!</p> + <p>just right!</p> {/if} -
#8041
beeb7bbThanks @dyc3! - The CSS parser, withtailwindDirectivesenabled, will now accept lists of selectors in@custom-variantshorthand syntax.@custom-variant cell (th:has(&), td:has(&));
-
#8028
c09e45cThanks @fmajestic! - The GitLab reporter now outputs format errors. -
#8037
78011b1Thanks @PFiS1737! -indentScriptAndStyleno longer indents the frontmatter in Astro files. -
#8009
6374b1fThanks @tmcw! - Fixed an edge case in theuseArrowFunctionrule.The rule no longer emits diagnostics for or offers to fix functions that reference
the arguments object,
because that object is undefined for arrow functions.Valid example:
// Valid: this function cannot be transformed into an arrow function because // arguments is not defined for arrow functions. const getFirstArg = function () { return arguments[0]; };
What's Changed
- feat(html/svelte): key blocks by @ematipico in #8001
- chore(parser): increase size of TokenSet by @ryan-m-walker in #7997
- feat(html/svelte): parsing of new blocks by @ematipico in #8023
- fix(useArrowFunction): make useArrowFunction rule fixer safer by @tmcw in #8009
- fix(deps): update rust crates by @renovate[bot] in #7889
- feat(cli): add format errors to GitLab reporter by @fmajestic in #8028
- fix(html/astro): don't indent Astro frontmatter by @PFiS1737 in #8037
- fix(html/astro): keep a blank after the frontmatter by @PFiS1737 in #8039
- fix(parse/tailwind): fix lexing
inset-x,border-slate-500, and others by @dyc3 in #7975 - fix(parse/css/tailwind): make
@custom-variantaccept selector lists by @dyc3 in #8041 - docs: rules.rs cleanup by @Netail in #8044
- docs: update documentation + diagnostic for
noBannedTypesdescription by @Bertie690 in #8006 - refactor(deserialize): exact allocation for arrays and maps by @Conaclos in #8040
- feat(parse/tailwind): add benchmark by @dyc3 in #7976
- feat(html/svelte):
if/elsesyntax by @ematipico in #8031 - fix(parse/css/tailwind): make
@custom-variantaccept at-rules like@media...