github biomejs/biome @biomejs/biome@2.3.15
Biome CLI v2.3.15

7 hours ago

2.3.15

Patch Changes

  • #9019 043b67c Thanks @dyc3! - Added the lint rule noNestedPromises. This rule detects nested .then() or .catch() calls that could be refactored into flat promise chains.

    // Invalid: nested promise that can be flattened
    doThing().then(function () {
      return doOtherThing().then(console.log);
    });
    
    // Valid: flat promise chain
    doThing()
      .then(() => doOtherThing())
      .then(console.log);

    The rule intelligently allows nesting when the inner callback references variables from the outer scope, as these cases cannot be safely flattened.

  • #9029 6ebf6c6 Thanks @ff1451! - Added the nursery rule noUselessReturn. The rule reports redundant return; statements that don't affect the function's control flow.

    // Invalid: return at end of function is redundant
    function foo() {
      doSomething();
      return;
    }
  • #9017 8bac2da Thanks @mdevils! - Reverted a behavior change in useExhaustiveDependencies that was accidentally included as part of the #8802 fix. The change made method calls on objects (e.g., props.data.forEach(...)) report only the object (props.data) as a missing dependency instead of the full member expression. This behavior change will be reconsidered separately.

  • #9005 c8dbbbe Thanks @corvid-agent! - Fixed #8790: The noAssignInExpressions rule no longer reports a false positive when an assignment is used as the expression body of an arrow function (e.g., const f = b => a += b).

  • #8519 ccdc602 Thanks @ruidosujeira! - Fixed #8518, where globally excluded files in a monorepo were still being processed when using "extends": "//".

    When a package-level configuration extends the root configuration with "extends": "//", glob patterns (such as those in files.includes) are now correctly resolved relative to the project root directory, instead of the current workspace directory.

  • #9033 0628e0a Thanks @mdevils! - Fixed #8967. useExhaustiveDependencies no longer reports false positives for variables destructured from a rest pattern.

  • #9023 8ef9d1d Thanks @siketyan! - Fixed #9020: When javascript.jsxRuntime is set to reactClassic, noUnusedImports and useImportType rules now allow importing the React identifier from a package other than react. This aligns the behavior with tsc (--jsx=react), which also allows importing React from any package.

  • #8646 16fd71d Thanks @siketyan! - Fixed #8605: Text expressions in some template languages ({{ expr }} or { expr }) at the top level of an HTML document no longer causes panicking.

  • #8930 51c158e Thanks @ANKANJAGTAP! - Fixed #8917
    useExhaustiveDependencies now correctly detects JSX component identifiers as hook dependencies.

  • #9009 7d229c7 Thanks @Netail! - Fixed typo in noPositiveTabindex's quick fix text.

  • #8758 8c789f1 Thanks @Pranav2612000! - Updated the useJsxKeyInIterable rule to not run inside Map constructors

  • #8977 bbe0e0c Thanks @FrankFMY! - Fixed #4888.
    noUnusedImports now adds export {} when removing the last import in a TypeScript file to prevent it from becoming an ambient module. This does not apply to embedded scripts in Vue, Svelte, or Astro files, which are already in a module context.

  • #9016 9d4cfa3 Thanks @dyc3! - Added eslint migration metadata for the rules @typescript/no-var-requires, @typescript/keyword-spacing, @typescript/func-call-spacing, vue/keyword-spacing, vue/func-call-spacing, and unicorn/empty-brace-spaces,

  • #8848 2cba2b3 Thanks @LouisLau-art! - Fixed #8845. Now useGenericFontNames doesn't trigger when font is declared inside the @supports at-rule.

  • #8997 a5f3212 Thanks @mldangelo! - Fixed #8476.
    useAwaitThenable no longer reports false positives for await on call expressions whose return type cannot be resolved (e.g., cross-module function calls to Node.js builtins or npm packages).

  • #8978 cc7a478 Thanks @FrankFMY! - Fixed #8645.
    useAwait no longer reports async generator functions that use yield*, since yield* in an async generator delegates to an AsyncIterable and requires the async modifier.

What's Changed

  • docs: fix website sync by @dyc3 in #8957
  • chore(deps): update rust crate git2 to v0.20.4 [security] by @renovate[bot] in #8965
  • fix: jsx dependency detection in useexhaustivedependencies (#8917) by @ANKANJAGTAP in #8930
  • chore(doc): update formatter contributing doc by @tidefield in #8972
  • fix(useAwait): treat yield* as async operation in async generators by @FrankFMY in #8978
  • fix(css): ignore @supports queries in useGenericFontNames rule by @LouisLau-art in #8848
  • fix(html/parser): distinguish interpolations inside and outside tags by @siketyan in #8646
  • chore(deps): update rust:1.93.0-bookworm docker digest to d0a4aa3 by @renovate[bot] in #8999
  • chore(deps): update rust:1.93.0-bullseye docker digest to 3ebcc2d by @renovate[bot] in #9000
  • fix(codegen): remove duplicate preamble in generated analyzer files by @mldangelo in #8993
  • chore(deps): update rust crate anyhow to 1.0.101 by @renovate[bot] in #9004
  • chore(deps): update rust crate bpaf to 0.9.23 by @renovate[bot] in #9006
  • chore(deps): update rust crate insta to 1.46.3 by @renovate[bot] in #9007
  • chore(deps): update dependency tombi to v0.7.27 by @renovate[bot] in #9002
  • chore(deps): update github-actions by @renovate[bot] in #9003
  • chore(deps): update dependency @types/node to v24.10.11 by @renovate[bot] in #9001
  • fix(js_analyze): typo in noPositiveTabindex's action suggestion by @Netail in #9009
  • fix(useAwaitThenable): treat unresolved call expressions as uninferred by @mldangelo in #8997
  • fix(linter): allow assignment in arrow function expression body by @corvid-agent in #9005
  • feat(migrate): some more migration metadata by @dyc3 in #9016
  • fix(linter): useExhaustiveDependencies revert object method call behavior change, fixes #8958 by @mdevils in #9017
  • fix(linter): add export {} when noUnusedImports removes last import in TypeScript by @FrankFMY in #8977
  • fix(useJsxKeyInIterable): ignore rule in Map constructor by @Pranav2612000 in #8758
  • docs: correct default value for useEditorconfig schema setting by @lgaspari in #9025
  • fix(lint): remove import source check from is_global_react_import() by @siketyan in #9023
  • chore: upgrade CVE'ed crates, remove unmaintaned crates by @ematipico in #9032
  • feat(lint/js): add noNestedPromises by @dyc3 in #9019
  • fix: resolve glob patterns relative to project root when extending by @ruidosujeira in #8519
  • feat(lint): add nursery rule noUselessReturn by @ff1451 in #9029
  • fix(linter): useExhaustiveDependencies proper rest parameters handling, fixes #8967 by @mdevils in #9033
  • ci: release by @github-actions[bot] in #8973

New Contributors

Full Changelog: https://github.com/biomejs/biome/compare/@biomejs/biome@2.3.14...@biomejs/biome@2.3.15

Don't miss a new biome release

NewReleases is sending notifications on new releases.