\n ```\n\n ### Valid\n\n ```vue\n \n ```\n\n- [#8595](https://github.com/biomejs/biome/pull/8595) [`7c85bf0`](https://github.com/biomejs/biome/commit/7c85bf0def1212e8f0a4754b96f603fdf4bf9195) Thanks [@dyc3](https://github.com/dyc3)! - Fixed [#8584](https://github.com/biomejs/biome/issues/8584): The HTML formatter will preserve whitespace after some elements and embedded expressions, which more closely aligns with Prettier's behavior.\n\n ```diff\n -
Hello, {framework}and Svelte!
\n +
Hello, {framework} and Svelte!
\n ```\n\n- [#8598](https://github.com/biomejs/biome/pull/8598) [`5e85d43`](https://github.com/biomejs/biome/commit/5e85d4360d5b8848cf3c04b5ef9e74dc14f251bd) Thanks [@Netail](https://github.com/Netail)! - Added the nursery rule [`useUniqueFieldDefinitionNames`](https://biomejs.dev/linter/rules/use-unique-field-definition-names/). Require all fields of a type to be unique.\n\n **Invalid:**\n\n ```graphql\n type SomeObject {\n foo: String\n foo: String\n }\n ```\n\n- [#8495](https://github.com/biomejs/biome/pull/8495) [`b573d14`](https://github.com/biomejs/biome/commit/b573d14a5c3cdf2e23888c975df1b9b581b82dc3) Thanks [@taga3s](https://github.com/taga3s)! - Fixed [#8405](https://github.com/biomejs/biome/issues/8405): [`noMisusedPromises`](https://biomejs.dev/linter/rules/no-misused-promises/) now emits warnings/errors when a function returns union types such as `T | Promise` which is used in conditionals.\n\n ```ts\n const a = (): boolean | Promise => Promise.resolve(true);\n if (a()) {\n } // Now correctly flagged\n ```\n\n- [#8632](https://github.com/biomejs/biome/pull/8632) [`0be7d12`](https://github.com/biomejs/biome/commit/0be7d12ea944a1ebd79800af0473f9afec066dcd) Thanks [@Bertie690](https://github.com/Bertie690)! - The documentation & rule sources for [`lint/complexity/noBannedTypes`](https://biomejs.dev/linter/rules/no-banned-types) have been updated to fix a few oversights.\n\n In addition to some general typo fixes:\n - The rule now recommends `Record` instead of `Record` (the latter of which incorrectly allows symbol-keyed properties).\n - The rule mentions an alternate method to enforce object emptiness involving `unique symbol`-based guards used by [`type-fest`](https://github.com/sindresorhus/type-fest/blob/main/source/empty-object.d.ts) and [many other packages](https://github.com/search?q=lang%3ATypeScript+%2Ftype%5Cs*%5Cw%2B%5Cs*%3D%5Cs*%5C%7B%5Cs*%5C%5B%5Cw%2B%5C%5D%5C%3F%3A+never%2F&type=code):\n\n ```ts\n declare const mySym: unique symbol;\n\n // Since this type's only property is an unexported `unique symbol`, nothing that imports it can specify any properties directly\n // (as far as excess property checks go)\n export type EmptyObject = { [mySym]?: never };\n export type IsEmptyObject = T extends EmptyObject ? true : false;\n ```\n\n 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](https://github.com/typescript-eslint/typescript-eslint/pull/8977) circa April 2024.\n\n- [#8580](https://github.com/biomejs/biome/pull/8580) [`a3a1ad2`](https://github.com/biomejs/biome/commit/a3a1ad2b3d2bc85b296472a811a6554c84b63f53) Thanks [@taga3s](https://github.com/taga3s)! - Added the nursery rule [`noBeforeInteractiveScriptOutsideDocument`](https://biomejs.dev/linter/rules/no-before-interactive-script-outside-document/) to the Next.js domain.\n This rule prevents usage of `next/script`'s `beforeInteractive` strategy outside of `pages/_document.js`.\n\n- [#8493](https://github.com/biomejs/biome/pull/8493) [`5fc24f4`](https://github.com/biomejs/biome/commit/5fc24f4c67a6de9105d460a59c8f613d14d58c4d) Thanks [@ematipico](https://github.com/ematipico)! - Added support for parsing and formatting the Svelte `{#each}` syntax, when `html.experimentalFullSupportEnabled` is set to `true`.\n\n ```diff\n - {#each items as item }\n + {#each items as item}\n\n {/each}\n ```\n\n- [#8546](https://github.com/biomejs/biome/pull/8546) [`0196c0e`](https://github.com/biomejs/biome/commit/0196c0e6f4cdcfb9fcbbb1e54590f3a84938475c) Thanks [@Zaczero](https://github.com/Zaczero)! - Hardened union static-member type flattening in edge cases (e.g. unions containing `unknown` or inferred expression types). This keeps inference conservative and avoids unstable type growth in `node = node.parent`-style loops.\n\n- [#8569](https://github.com/biomejs/biome/pull/8569) [`1022c76`](https://github.com/biomejs/biome/commit/1022c766e25d2be100b236f5933b9d266dcc3b2a) Thanks [@ematipico](https://github.com/ematipico)! - Fixed an issue where the Biome HTML parser would emit a parse error when certain keywords are inside the text of HTML tags.\n\n- [#8606](https://github.com/biomejs/biome/pull/8606) [`f50723b`](https://github.com/biomejs/biome/commit/f50723b37bfb405530303c573d97a2b479c3f85a) Thanks [@dyc3](https://github.com/dyc3)! - Fixed #8563: fixed a bounds check on bogus regex literals that caused panics when doing type inference\n\n- [#7410](https://github.com/biomejs/biome/pull/7410) [`ab9af9a`](https://github.com/biomejs/biome/commit/ab9af9a48aa06caf72c867ede4613a0c0045c2f2) Thanks [@sgarcialaguna](https://github.com/sgarcialaguna)! - Added the new nursery rule [`noJsxPropsBind`](https://biomejs.dev/linter/rules/no-jsx-props-bind). This rule disallows .bind(), arrow functions, or function expressions in JSX props.\n\n **Invalid:**\n\n ```jsx\n console.log(\"Hello!\")}>\n ```\n\n- [#8523](https://github.com/biomejs/biome/pull/8523) [`5f22f1c`](https://github.com/biomejs/biome/commit/5f22f1c131f88a38d0d5206c47fa160b096a7e7b) Thanks [@ematipico](https://github.com/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.\n\n- [#8571](https://github.com/biomejs/biome/pull/8571) [`03666fd`](https://github.com/biomejs/biome/commit/03666fdc29d0c9c40c6e3e0d8c9ec7a59424b1ec) Thanks [@dyc3](https://github.com/dyc3)! - Improved the performance of `noRedeclare` by eliminating string allocations\n\n- [#8591](https://github.com/biomejs/biome/pull/8591) [`9dd9ca7`](https://github.com/biomejs/biome/commit/9dd9ca776a9aebc5faac023aa94cd7c790b225e3) Thanks [@Netail](https://github.com/Netail)! - Added the nursery rule [`useUniqueArgumentNames`](https://biomejs.dev/linter/rules/use-unique-argument-names/). Enforce unique arguments for GraphQL fields & directives.\n\n **Invalid:**\n\n ```graphql\n query {\n field(arg1: \"value\", arg1: \"value\")\n }\n ```\n\n- [#8521](https://github.com/biomejs/biome/pull/8521) [`a704be9`](https://github.com/biomejs/biome/commit/a704be99f627960b3c96c4a99dfa2525f086160c) Thanks [@ToBinio](https://github.com/ToBinio)! - Update [useVueDefineMacrosOrder](https://biomejs.dev/linter/rules/use-vue-define-macros-order/) to only run on Back to changelog
This rule validates only root-level <template> elements in Vue single-file components. If the <template> has a src attribute, it must be empty. Otherwise, it must contain content.
Invalid examples:
<template src="./foo.html">content</template>
<template></template>
Valid examples:
<template>content</template>
<template src="./foo.html"></template>
#8586df8fe06 Thanks @dyc3! - Added a new nursery rule useVueConsistentVBindStyle. Enforces consistent v-bind style (:prop shorthand vs v-bind:prop longhand). Default prefers shorthand; configurable via rule options.
#85879a8c98d Thanks @dyc3! - Added the rule useVueVForKey, which enforces that any element using v-for also specifies a key.
Invalid
<li v-for="item in items">{{ item }}</li>
Valid
<li v-for="item in items" :key="item.id">{{ item }}</li>
#8586df8fe06 Thanks @dyc3! - Added a new nursery rule useVueConsistentVOnStyle. Enforces consistent v-on style (@event shorthand vs v-on:event longhand). Default prefers shorthand; configurable via rule options.
#858383be210 Thanks @dyc3! - Added the new nursery rule useVueValidVOnce. Enforces that usages of the v-once directive in Vue.js SFC are valid.
#8498d80fa41 Thanks @tt-a1i! - Fixed #8494. Extended noUndeclaredEnvVars to support bracket notation (process.env["VAR"], import.meta.env["VAR"]), Bun runtime (Bun.env.VAR, Bun.env["VAR"]), and Deno runtime (Deno.env.get("VAR")).
#8509574a909 Thanks @ematipico! - Added support for parsing and formatting the Svelte {#await} syntax, when html.experimentalFullSupportEnabled is set to true.
-{#await promise then name }
+{#await promise then name}
-{:catch name}
+{:catch name}
{/await}
#852417a6156 Thanks @JacquesLeupin! - Fixed #8488: Relative plugin paths are now resolved from the configuration file directory, including when configurations are merged (e.g. extends: "//").
#86553260ec9 Thanks @JacquesLeupin! - Fixed #8636: Biome's CSS formatter now breaks comma-separated declaration values at top-level commas when wrapping.
#8537cc3e851 Thanks @dibashthapa! - Fixed #8491: Resolved false positive errors for safe boolean expressions. There are still pending fixes. Head to #8491 (comment) for more details
This new change will check for safe boolean expressions in variable declarations.
For example,
Valid:
let isOne = 1;
let isPositiveNumber = number > 0;
return (
<div>
{" "}
{isOne && "One"} {isPositiveNumber && "Is positive"}
</div>
);
Invalid:
let emptyStr = "";
let isZero = 0;
return (
<div>
{emptyStr && "Empty String"} {isZero && "Number is zero"}{" "}
</div>
);
#851116a9036 Thanks @ematipico! - Improved the diagnostics of the rules useSortedClasses and noUnnecessaryConditions. The diagnostics now state that these rules are a work in progress and link to the relevant GitHub issue.
#85957c85bf0 Thanks @dyc3! - Fixed #8584: The HTML formatter will preserve whitespace after some elements and embedded expressions, which more closely aligns with Prettier's behavior.
- <h1>Hello, {framework}and Svelte!</h1>
+ <h1>Hello, {framework} and Svelte!</h1>
#8495b573d14 Thanks @taga3s! - Fixed #8405: noMisusedPromises now emits warnings/errors when a function returns union types such as T | Promise<T> which is used in conditionals.
const a = (): boolean | Promise<boolean> => Promise.resolve(true);
if (a()) {
} // Now correctly flagged
#84935fc24f4 Thanks @ematipico! - Added support for parsing and formatting the Svelte {#each} syntax, when html.experimentalFullSupportEnabled is set to true.
- {#each items as item }
+ {#each items as item}
{/each}
#85460196c0e Thanks @Zaczero! - Hardened union static-member type flattening in edge cases (e.g. unions containing unknown or inferred expression types). This keeps inference conservative and avoids unstable type growth in node = node.parent-style loops.
#85691022c76 Thanks @ematipico! - Fixed an issue where the Biome HTML parser would emit a parse error when certain keywords are inside the text of HTML tags.
#8606f50723b Thanks @dyc3! - Fixed #8563: fixed a bounds check on bogus regex literals that caused panics when doing type inference
#7410ab9af9a Thanks @sgarcialaguna! - Added the new nursery rule noJsxPropsBind. This rule disallows .bind(), arrow functions, or function expressions in JSX props.
Invalid:
<Foo onClick={() => console.log("Hello!")}></Foo>
#85235f22f1c Thanks @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.
#857103666fd Thanks @dyc3! - Improved the performance of noRedeclare by eliminating string allocations
#83447b982ba Thanks @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.
#85298794883 Thanks @mdevils! - Fixed #8499: useExhaustiveDependencies properly handles aliased destructured object keys when using stableResult configuration.
#85574df2f4d Thanks @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 />
#8509574a909 Thanks @ematipico! - Added support for parsing and formatting the Svelte {#snippet} syntax, when html.experimentalFullSupportEnabled is set to true.
#8536efbfbe2 Thanks @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.
#858383be210 Thanks @dyc3! - Added the new nursery rule useVueValidVCloak. Enforces that usages of the v-cloak directive in Vue.js SFC are valid.
#8644a3a27a7 Thanks @JacquesLeupin! - Added the nursery rule useVueVapor to enforce <script setup vapor> in Vue SFCs. For example <script setup> is invalid.
#8508b86842c Thanks @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.includes and VCS ignore rules) are skipped.
What's Changed
fix: mdx generation by @Netail in https://github.com/biomejs/biome/pull/8492
feat(html): support for svelte #each by @ematipico in https://github.com/biomejs/biome/pull/8493
chore(deps): update typescript-eslint monorepo to v8.50.0 by @renovate[bot] in https://github.com/biomejs/biome/pull/8464
fix(dx): gate usage of biome_configuration in rules behind feature flag by @dyc3 in https://github.com/biomejs/biome/pull/8496
feat(lint): ported noMultiAssign from eslint by @washbin in https://github.com/biomejs/biome/pull/8316
feat(html): parse #await and #snippet by @ematipico in https://github.com/biomejs/biome/pull/8509
chore(analyzer): improve diagnostics by @ematipico in https://github.com/biomejs/biome/pull/8511
perf(core): reduce system calls by @ematipico in https://github.com/biomejs/biome/pull/8344
feat(graph): support CSS files by @ematipico in https://github.com/biomejs/biome/pull/8329
refactor(parse/tailwind): use trivia again by @dyc3 in https://github.com/biomejs/biome/pull/8513
feat(parse/tailwind): parse data attribute selectors as dedicated syntax by @dyc3 in https://github.com/biomejs/biome/pull/8514
feat(analyze/vue): add useVueConsistentDefinePropsDeclaration by @ToBinio in https://github.com/biomejs/biome/pull/8521
fix(linter): useExhaustiveDependencies properly handles aliased destructured object keys when using stableResult configuration by @mdevils in https://github.com/biomejs/biome/pull/8529
fix(yaml_parser): comment break yaml mapping by @l0ngvh in https://github.com/biomejs/biome/pull/8530
fix(analyzer): nursery rules diagnostics by @ematipico in https://github.com/biomejs/biome/pull/8523
chore: use tombi by @ematipico in https://github.com/biomejs/biome/pull/8534
fix(analyze/types): reduce created types when flattening a static member access on a union type by @dyc3 in https://github.com/biomejs/biome/pull/8536
perf(parse/tw): avoid going into basename store trie when not needed by @dyc3 in https://github.com/biomejs/biome/pull/8528
fix(html): fmt svelte children by @ematipico in https://github.com/biomejs/biome/pull/8539
fix(parser/css): :active-view-transition-type parameters should accept comma-separated custom identifiers by @taga3s in https://github.com/biomejs/biome/pull/8531
chore(deps): update github-actions by @renovate[bot] in https://github.com/biomejs/biome/pull/8541
chore(deps): update @biomejs packages by @renovate[bot] in https://github.com/biomejs/biome/pull/8542
chore(deps): pin dependency tombi to 0.7.4 by @renovate[bot] in https://github.com/biomejs/biome/pull/8540
New Contributors
@washbin made their first contribution in https://github.com/biomejs/biome/pull/8316
@Zaczero made their first contribution in https://github.com/biomejs/biome/pull/8546
@sgarcialaguna made their first contribution in https://github.com/biomejs/biome/pull/7410
@nkoji21 made their first contribution in https://github.com/biomejs/biome/pull/8419
Full Changelog: https://github.com/biomejs/biome/compare/@biomejs/biome@2.3.10...@biomejs/biome@2.3.11
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.
chore(deps): update dependency @types/node to v24.10.4 by @renovate[bot] in https://github.com/biomejs/biome/pull/8543
chore(deps): update dependency eslint to v9.39.2 by @renovate[bot] in https://github.com/biomejs/biome/pull/8544
chore(deps): update pnpm to v10.26.1 by @renovate[bot] in https://github.com/biomejs/biome/pull/7957
chore(deps): update github-actions (major) by @renovate[bot] in https://github.com/biomejs/biome/pull/8548
fix(linter): nursery/noMisusedPromises should emit warnings when a function returns T | Promise<T> by @taga3s in https://github.com/biomejs/biome/pull/8495
fix(html): improved svelte parsing by @ematipico in https://github.com/biomejs/biome/pull/8555
fix(benchmark): biome commands were failing immediately during the benchmark by @mdevils in https://github.com/biomejs/biome/pull/8558
feat(noUndeclaredEnvVars): add bracket notation and Bun.env support by @tt-a1i in https://github.com/biomejs/biome/pull/8498
chore: update snapshot by @dyc3 in https://github.com/biomejs/biome/pull/8567
fix(html): parse keywords by @ematipico in https://github.com/biomejs/biome/pull/8569
perf(noRedeclare): reduce string allocations by @dyc3 in https://github.com/biomejs/biome/pull/8571
feat(biome_js_analyze): implement noReturnAssign rule by @emilyinure in https://github.com/biomejs/biome/pull/8248
fix(analyze/types): union static-member flattening by @Zaczero in https://github.com/biomejs/biome/pull/8546
chore: add more language specific (in)valid test cases by @Netail in https://github.com/biomejs/biome/pull/8589
feat(graphql_analyze): implement useUniqueVariableNames by @Netail in https://github.com/biomejs/biome/pull/8588
feat(graphql_analyze): implement useUniqueInputFieldNames by @Netail in https://github.com/biomejs/biome/pull/8592
feat(graphql_analyze): implement useUniqueFieldDefinitionNames by @Netail in https://github.com/biomejs/biome/pull/8598
feat(graphql_analyze): implement useUniqueArgumentNames by @Netail in https://github.com/biomejs/biome/pull/8591
chore: update .gitattributes by @dyc3 in https://github.com/biomejs/biome/pull/8599
feat(biome_js_analyze): port noBeforeInteractiveScriptOutsideDocument from Next.js by @taga3s in https://github.com/biomejs/biome/pull/8580
fix: changesets by @Netail in https://github.com/biomejs/biome/pull/8601
feat(analyze/html/vue): add a few more simple vue lint rules by @dyc3 in https://github.com/biomejs/biome/pull/8583
feat(analyze/html/vue): add v-bind/v-on style rules by @dyc3 in https://github.com/biomejs/biome/pull/8586
fix(types): fix bounds check in split_regex_literal by @dyc3 in https://github.com/biomejs/biome/pull/8606
chore(deps): update rust crate proc-macro2 to 1.0.104 by @renovate[bot] in https://github.com/biomejs/biome/pull/8610
chore(deps): update dependency tombi to v0.7.11 by @renovate[bot] in https://github.com/biomejs/biome/pull/8607
chore(deps): update rust crate jiff to 0.2.17 by @renovate[bot] in https://github.com/biomejs/biome/pull/8609
chore(deps): update rust crate serde_json to 1.0.148 by @renovate[bot] in https://github.com/biomejs/biome/pull/8611
chore(deps): update github-actions by @renovate[bot] in https://github.com/biomejs/biome/pull/8614
chore(deps): update typescript-eslint monorepo to v8.50.1 by @renovate[bot] in https://github.com/biomejs/biome/pull/8613
fix(biome_js_analyze): remove next/script name check for noBeforeInteractiveScriptOutsideDocument by @taga3s in https://github.com/biomejs/biome/pull/8615
fix(lint): added more test cases for variable declarations in noLeakedRender by @dibashthapa in https://github.com/biomejs/biome/pull/8537
feat: no-jsx-props-bind by @sgarcialaguna in https://github.com/biomejs/biome/pull/7410
fix(format/html): preserve whitespace between a HtmlSingleTextExpression/HtmlElement and HtmlContent by @dyc3 in https://github.com/biomejs/biome/pull/8595
docs: extra noDuplicateFields examples by @Netail in https://github.com/biomejs/biome/pull/8626
fix(format/html): add space before /> by @dyc3 in https://github.com/biomejs/biome/pull/8557
fix(plugins): normalize relative plugin paths during config loading by @JacquesLeupin in https://github.com/biomejs/biome/pull/8524
fix(cli): allow --stdin-file-path outside files.includes by @tt-a1i in https://github.com/biomejs/biome/pull/8508
chore: rust 1.92, update crates by @ematipico in https://github.com/biomejs/biome/pull/8643
chore(deps): update rust docker tag to v1.92.0 by @renovate[bot] in https://github.com/biomejs/biome/pull/8462
fix(deps): update rust crates by @renovate[bot] in https://github.com/biomejs/biome/pull/8545
feat(analyze/html/vue): add useVueVForKey by @dyc3 in https://github.com/biomejs/biome/pull/8587
feat(analyze/html/vue): add useVueVapor rule by @JacquesLeupin in https://github.com/biomejs/biome/pull/8644
chore(deps): update pnpm to v10.26.2 by @renovate[bot] in https://github.com/biomejs/biome/pull/8608
docs(lint): update documentation, rule sources for lint/complexity/noBannedTypes by @Bertie690 in https://github.com/biomejs/biome/pull/8632
refactor(analyze/json): remove dependence on biome_configuration by @dyc3 in https://github.com/biomejs/biome/pull/8634
chore: refactor some codgen to use proc macros to avoid merge conflicts for new rules by @dyc3 in https://github.com/biomejs/biome/pull/8633
docs: document Markdown aside syntax for rule documentation by @nkoji21 in https://github.com/biomejs/biome/pull/8419
fix(css-formatter): prefer breaking declaration values at top-level commas by @JacquesLeupin in https://github.com/biomejs/biome/pull/8655
ci: release by @github-actions[bot] in https://github.com/biomejs/biome/pull/8507