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 unexported `unique symbol`, nothing that imports it can specify any properties directly // (as far as excess property checks go) export type EmptyObject = { [mySym]?: never }; export type IsEmptyObject<T> = T extends EmptyObject ? true : false;
The rule's listed sources have been updated as well to reflect the original source rule (
ban-types) having been split into 3 separate rules circa April 2024. -
-
#8580
a3a1ad2Thanks @taga3s! - Added the nursery rulenoBeforeInteractiveScriptOutsideDocumentto the Next.js domain.
This rule prevents usage ofnext/script'sbeforeInteractivestrategy outside ofpages/_document.js. -
#8493
5fc24f4Thanks @ematipico! - Added support for parsing and formatting the Svelte{#each}syntax, whenhtml.experimentalFullSupportEnabledis set totrue.- {#each items as item } + {#each items as item} {/each}
-
#8546
0196c0eThanks @Zaczero! - Hardened union static-member type flattening in edge cases (e.g. unions containingunknownor inferred expression types). This keeps inference conservative and avoids unstable type growth innode = node.parent-style loops. -
#8569
1022c76Thanks @ematipico! - Fixed an issue where the Biome HTML parser would emit a parse error when certain keywords are inside the text of HTML tags. -
#8606
f50723bThanks @dyc3! - Fixed #8563: fixed a bounds check on bogus regex literals that caused panics when doing type inference -
#7410
ab9af9aThanks @sgarcialaguna! - Added the new nursery rulenoJsxPropsBind. This rule disallows .bind(), arrow functions, or function expressions in JSX props.Invalid:
<Foo onClick={() => console.log("Hello!")}></Foo>
-
#8523
5f22f1cThanks @ematipico! - Improved the diagnostics of nursery rules. Added a message to diagnostics emitted by nursery rules, so that users are aware of nature of nursery rules. -
#8571
03666fdThanks @dyc3! - Improved the performance ofnoRedeclareby eliminating string allocations -
#8591
9dd9ca7Thanks @Netail! - Added the nursery ruleuseUniqueArgumentNames. Enforce unique arguments for GraphQL fields & directives.Invalid:
query { field(arg1: "value", arg1: "value") }
-
#8521
a704be9Thanks @ToBinio! - Update useVueDefineMacrosOrder to only run on <script setup> blocks. -
#8344
7b982baThanks @ematipico! - Reduced the system calls when running the CLI. The performances might be noticeable in big projects that have multiple libraries and enable project rules. -
#8588
958e24bThanks @Netail! - Added the nursery ruleuseUniqueVariableNames. Enforce unique variable names for GraphQL operations.Invalid:
query ($x: Int, $x: Int) { field }
-
#8529
8794883Thanks @mdevils! - Fixed #8499:useExhaustiveDependenciesproperly handles aliased destructured object keys when usingstableResultconfiguration. -
#8557
4df2f4dThanks @dyc3! - Fixed an issue with the HTML formatter where it wouldn't add a space before the/>in self closing elements. This brings the HTML formatter more in line with Prettier.-<Component/> +<Component />
-
#8509
574a909Thanks @ematipico! - Added support for parsing and formatting the Svelte{#snippet}syntax, whenhtml.experimentalFullSupportEnabledis set totrue.-{#snippet foo() } +{#snippet foo()} {/snippe}
-
#8248
1231a5cThanks @emilyinure! - Added new nursery rulenoReturnAssign, which disallows assignments inside return statements.Invalid:
function f(a) { return (a = 1); }
-
#8531
6b09620Thanks @taga3s! - Fixed #8472: The CSS parser can now accept multiple comma separated parameters in:active-view-transition-type. -
#8615
b9da66dThanks @taga3s! - Removenext/scriptcomponent name check fromnoBeforeInteractiveScriptOutsideDocumentsince it is a default export. -
#8536
efbfbe2Thanks @dyc3! - Fixed #8527: Improved type inference where analyzing code with repeated object property access and assignments (e.g.node = node.parent, a pattern common when traversing trees in a while loop) could hit an internal type limit. Biome now handles these cases without exceeding the type limit. -
#8583
83be210Thanks @dyc3! - Added the new nursery ruleuseVueValidVCloak. Enforces that usages of thev-cloakdirective in Vue.js SFC are valid.<!-- Valid --> <div v-cloak /> <!-- Invalid --> <div v-cloak:aaa /> <div v-cloak.bbb /> <div v-cloak="ccc" />
-
#8583
83be210Thanks @dyc3! - Added the new nursery ruleuseVueValidVPre. Enforces that usages of thev-predirective in Vue.js SFC are valid.<!-- Valid --> <div v-pre /> <!-- Invalid --> <div v-pre:aaa /> <div v-pre.bbb /> <div v-pre="ccc" />
-
#8644
a3a27a7Thanks @JacquesLeupin! - Added the nursery ruleuseVueVaporto enforce<script setup vapor>in Vue SFCs. For example<script setup>is invalid. -
#8508
b86842cThanks @tt-a1i! - Fixed #6783: now, when a path is provided via--stdin-file-path, Biome checks whether the file exists on disk. If the path doesn't exist (virtual path), ignore checks (files.includesand VCS ignore rules) are skipped.
What's Changed
- fix: mdx generation by @Netail in #8492
- feat(html): support for svelte
#eachby @ematipico in #8493 - chore(deps): update typescript-eslint monorepo to v8.50.0 by @renovate[bot] in #8464
- fix(dx): gate usage of
biome_configurationin rules behind feature flag by @dyc3 in #8496 - feat(lint): ported
noMultiAssignfrom eslint by @washbin in #8316 - feat(html): parse
#awaitand#snippetby @ematipico in #8509 - chore(analyzer): improve diagnostics by @ematipico in #8511
- perf(core): reduce system calls by @ematipico in #8344
- feat(graph): support CSS files by @ematipico in #8329
- refactor(parse/tailwind): use trivia again by @dyc3 in #8513
- feat(parse/tailwind): parse data attribute selectors as dedicated syntax by @dyc3 in #8514
- feat(analyze/vue): add useVueConsistentDefinePropsDeclaration by @ToBinio in #8521
- fix(linter):
useExhaustiveDependenciesproperly handles aliased destructured object keys when usingstableResultconfiguration by @mdevils in #8529 - fix(yaml_parser): comment break yaml mapping by @l0ngvh in #8530
- fix(analyzer): nursery rules diagnostics by @ematipico in #8523
- chore: use tombi by @ematipico in #8534
- fix(analyze/types): reduce created types when flattening a static member access on a union type by @dyc3 in #8536
- perf(parse/tw): avoid going into basename store trie when not needed by @dyc3 in #8528
- fix(html): fmt svelte children by @ematipico in #8539
- fix(parser/css):
:active-view-transition-typeparameters should accept comma-separated custom identifiers by @taga3s in #8531 - chore(deps): update github-actions by @renovate[bot] in #8541
- chore(deps): update @biomejs packages by @renovate[bot] in #8542
- chore(deps): pin dependency tombi to 0.7.4 by @renovate[bot] in #8540
- chore(deps): update dependency @types/node to v24.10.4 by @renovate[bot] in #8543
- chore(deps): update dependency eslint to v9.39.2 by @renovate[bot] in #8544
- chore(deps): update pnpm to v10.26.1 by @renovate[bot] in #7957
- chore(deps): update github-actions (major) by @renovate[bot] in #8548
- fix(linter):
nursery/noMisusedPromisesshould emit warnings when a function returnsT | Promise<T>by @taga3s in #8495 - fix(html): improved svelte parsing by @ematipico in #8555
- fix(benchmark): biome commands were failing immediately during the benchmark by @mdevils in #8558
- feat(noUndeclaredEnvVars): add bracket notation and Bun.env support by @tt-a1i in #8498
- chore: update snapshot by @dyc3 in #8567
- fix(html): parse keywords by @ematipico in #8569
- perf(noRedeclare): reduce string allocations by @dyc3 in #8571
- feat(biome_js_analyze): implement noReturnAssign rule by @emilyinure in #8248
- fix(analyze/types): union static-member flattening by @Zaczero in #8546
- chore: add more language specific (in)valid test cases by @Netail in #8589
- feat(graphql_analyze): implement useUniqueVariableNames by @Netail in #8588
- feat(graphql_analyze): implement useUniqueInputFieldNames by @Netail in #8592
- feat(graphql_analyze): implement useUniqueFieldDefinitionNames by @Netail in #8598
- feat(graphql_analyze): implement useUniqueArgumentNames by @Netail in #8591
- chore: update .gitattributes by @dyc3 in #8599
- feat(biome_js_analyze): port
noBeforeInteractiveScriptOutsideDocumentfrom Next.js by @taga3s in #8580 - fix: changesets by @Netail in #8601
- feat(analyze/html/vue): add a few more simple vue lint rules by @dyc3 in #8583
- feat(analyze/html/vue): add v-bind/v-on style rules by @dyc3 in #8586
- fix(types): fix bounds check in
split_regex_literalby @dyc3 in #8606 - chore(deps): update rust crate proc-macro2 to 1.0.104 by @renovate[bot] in #8610
- chore(deps): update dependency tombi to v0.7.11 by @renovate[bot] in #8607
- chore(deps): update rust crate jiff to 0.2.17 by @renovate[bot] in #8609
- chore(deps): update rust crate serde_json to 1.0.148 by @renovate[bot] in #8611
- chore(deps): update github-actions by @renovate[bot] in #8614
- chore(deps): update typescript-eslint monorepo to v8.50.1 by @renovate[bot] in #8613
- fix(biome_js_analyze): remove
next/scriptname check fornoBeforeInteractiveScriptOutsideDocumentby @taga3s in #8615 - fix(lint): added more test cases for variable declarations in
noLeakedRenderby @dibashthapa in #8537 - feat: no-jsx-props-bind by @sgarcialaguna in #7410
- fix(format/html): preserve whitespace between a HtmlSingleTextExpression/HtmlElement and HtmlContent by @dyc3 in #8595
- docs: extra noDuplicateFields examples by @Netail in #8626
- fix(format/html): add space before
/>by @dyc3 in #8557 - fix(plugins): normalize relative plugin paths during config loading by @JacquesLeupin in #8524
- fix(cli): allow --stdin-file-path outside files.includes by @tt-a1i in #8508
- chore: rust 1.92, update crates by @ematipico in #8643
- chore(deps): update rust docker tag to v1.92.0 by @renovate[bot] in #8462
- fix(deps): update rust crates by @renovate[bot] in #8545
- feat(analyze/html/vue): add
useVueVForKeyby @dyc3 in #8587 - feat(analyze/html/vue): add useVueVapor rule by @JacquesLeupin in #8644
- chore(deps): update pnpm to v10.26.2 by @renovate[bot] in #8608
- docs(lint): update documentation, rule sources for
lint/complexity/noBannedTypesby @Bertie690 in #8632 - refactor(analyze/json): remove dependence on biome_configuration by @dyc3 in #8634
- chore: refactor some codgen to use proc macros to avoid merge conflicts for new rules by @dyc3 in #8633
- docs: document Markdown aside syntax for rule documentation by @nkoji21 in #8419
- fix(css-formatter): prefer breaking declaration values at top-level commas by @JacquesLeupin in #8655
- ci: release by @github-actions[bot] in #8507
New Contributors
- @washbin made their first contribution in #8316
- @Zaczero made their first contribution in #8546
- @sgarcialaguna made their first contribution in #7410
- @nkoji21 made their first contribution in #8419
Full Changelog: https://github.com/biomejs/biome/compare/@biomejs/biome@2.3.10...@biomejs/biome@2.3.11