Skip to content

ci: release#9991

Merged
dyc3 merged 1 commit intomainfrom
changeset-release/main
Apr 23, 2026
Merged

ci: release#9991
dyc3 merged 1 commit intomainfrom
changeset-release/main

Conversation

@github-actions
Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot commented Apr 15, 2026

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and publish to npm yourself or setup this action to publish automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

@biomejs/[email protected]

Patch Changes

  • #9969 c5eb92b Thanks @officialasishkumar! - Added the nursery rule noUnnecessaryTemplateExpression, which disallows template literals that only contain string literal expressions. These can be replaced with a simpler string literal.

    For example, the following code triggers the rule:

    const a = `${"hello"}`; // can be 'hello'
    const b = `${"prefix"}_suffix`; // can be 'prefix_suffix'
    const c = `${"a"}${"b"}`; // can be 'ab'
  • #10037 f785e8c Thanks @minseong0324! - Fixed #9810: noMisleadingReturnType no longer reports false positives on a getter with a matching setter in the same namespace.

    class Store {
      get status(): string {
        if (Math.random() > 0.5) return "loading";
        return "idle";
      }
      set status(v: string) {}
    }
  • #10084 5e2f90c Thanks @jiwon79! - Fixed #10034: noUselessEscapeInRegex no longer flags escapes of ClassSetReservedPunctuator characters (&, !, #, %, ,, :, ;, <, =, >, @, `, ~) inside v-flag character classes as useless. These characters are reserved as individual code points in v-mode, so the escape is required.

    The following pattern is now considered valid:

    /[a-z\&]/v;
  • #10063 c9ffa16 Thanks @Netail! - Added extra rule sources from ESLint CSS. biome migrate eslint should do a bit better detecting rules in your eslint configurations.

  • #10035 946b50e Thanks @Netail! - Fixed #10032: useIframeSandbox now flags if there's no initializer value.

  • #9865 68fb8d4 Thanks @dyc3! - Added the new nursery rule useDomNodeTextContent, which prefers textContent over innerText for DOM node text access and destructuring.

    For example, the following snippet triggers the rule:

    const foo = node.innerText;
  • #10023 bd1e74f Thanks @ematipico! - Added a new nursery rule noReactNativeDeepImports that disallows deep imports from the react-native package. Internal paths like react-native/Libraries/... are not part of the public API and may change between versions.

    For example, the following code triggers the rule:

    import View from "react-native/Libraries/Components/View/View";
  • #9885 3dce737 Thanks @dyc3! - Added a new nursery rule useDomQuerySelector that prefers querySelector() and querySelectorAll() over older DOM query methods such as getElementById() and getElementsByClassName().

  • #9995 4da9caf Thanks @siketyan! - Fixed #9994: Biome now parses nested CSS rules correctly when declarations follow them inside embedded snippets.

  • #10009 b41cc5a Thanks @Jayllyz! - Fixed #10004: noComponentHookFactories no longer reports false positives for object methods and class methods.

  • #9988 eabf54a Thanks @Netail! - Tweaked the diagnostics range for useAltText, useButtonType, useHtmlLang, useIframeTitle, useValidAriaRole & useIfameSandbox to report on the opening tag instead of the full tag.

  • #10043 fc65902 Thanks @mujpao! - Fixed #10003: Biome no longer panics when parsing Svelte files containing {#}.

  • #9815 5cc83b1 Thanks @dyc3! - Added the new nursery rule noLoopFunc. When enabled, it warns when a function declared inside a loop captures outer variables that can change across iterations.

  • #9702 ef470ba Thanks @ryan-m-walker! - Added the nursery rule useRegexpTest that enforces RegExp.prototype.test() over String.prototype.match() and RegExp.prototype.exec() in boolean contexts. test() returns a boolean directly, avoiding unnecessary computation of match results.

    Invalid

    if ("hello world".match(/hello/)) {
    }

    Valid

    if (/hello/.test("hello world")) {
    }
  • #9743 245307d Thanks @leetdavid! - Fixed #2245: Svelte <script> tag language detection when the generics attribute contains > characters (e.g., <script lang="ts" generics="T extends Record<string, unknown>">). Biome now correctly recognizes TypeScript in such script blocks.

  • #10046 0707de7 Thanks @Conaclos! - Fixed #10038: organizeImports now sorts imports in TypeScript modules and declaration files.

      declare module "mymodule" {
    -  	import type { B } from "b";
      	import type { A } from "a";
    +  	import type { B } from "b";
      }
  • #10012 94ccca9 Thanks @ematipico! - Added the nursery rule noReactNativeLiteralColors, which disallows color literals inside React Native styles.

    The rule belongs to the reactNative domain. It reports properties whose name contains color and whose value is a string literal when they appear inside a StyleSheet.create(...) call or inside a JSX attribute whose name contains style.

    // Invalid
    const Hello = () => <Text style={{ backgroundColor: "#FFFFFF" }}>hi</Text>;
    
    const styles = StyleSheet.create({
      text: { color: "red" },
    });
    // Valid
    const red = "#f00";
    const styles = StyleSheet.create({
      text: { color: red },
    });
  • #10005 131019e Thanks @ematipico! - Added the nursery rule noReactNativeRawText, which disallows raw text outside of <Text> components in React Native.

    The rule belongs to the new reactNative domain.

    // Invalid
    <View>some text</View>
    <View>{'some text'}</View>
    // Valid
    <View>
      <Text>some text</Text>
    </View>

    Additional components can be allowlisted through the skip option:

    {
      "options": {
        "skip": ["Title"]
      }
    }
  • #9911 1603f78 Thanks @Netail! - Added the nursery rule noJsxLeakedDollar, which flags text nodes with a trailing $ if the next sibling node is a JSX expression. This could be an unintentional mistake, resulting in a '$' being rendered as text in the output.

    Invalid:

    function MyComponent({ user }) {
      return <div>Hello ${user.name}</div>;
    }
  • #9999 f42405f Thanks @minseong0324! - Fixed noMisleadingReturnType incorrectly flagging functions with reassigned let variables.

  • #10075 295f97f Thanks @ematipico! - Fixed #9983: Biome now parses functions declared inside Svelte #snippet blocks without throwing errors.

  • #10006 cf4c1c9 Thanks @minseong0324! - Fixed #9810: noMisleadingReturnType incorrectly flagging nested object literals with widened properties.

  • #10033 11ddc05 Thanks @ematipico! - Added the nursery rule useReactNativePlatformComponents that ensures platform-specific React Native components (e.g. ProgressBarAndroid, ActivityIndicatorIOS) are only imported in files with a matching platform suffix. It also reports when Android and iOS components are mixed in the same file.

    The following code triggers the rule when the file does not have an .android.js suffix:

    // file.js
    import { ProgressBarAndroid } from "react-native";

@biomejs/[email protected]

@biomejs/[email protected]

@biomejs/[email protected]

@biomejs/[email protected]

@biomejs/[email protected]

@biomejs/[email protected]

@biomejs/[email protected]

@biomejs/[email protected]

@biomejs/[email protected]

@biomejs/[email protected]

@biomejs/[email protected]

@biomejs/[email protected]

@github-actions github-actions Bot force-pushed the changeset-release/main branch 30 times, most recently from 320ac54 to af14867 Compare April 19, 2026 15:20
@github-actions github-actions Bot force-pushed the changeset-release/main branch 19 times, most recently from 826fc1a to e710262 Compare April 22, 2026 23:15
@github-actions github-actions Bot force-pushed the changeset-release/main branch from e710262 to 67f4d38 Compare April 23, 2026 14:01
@dyc3 dyc3 merged commit e316150 into main Apr 23, 2026
14 checks passed
@dyc3 dyc3 deleted the changeset-release/main branch April 23, 2026 14:14
@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented Apr 23, 2026

Merging this PR will not alter performance

✅ 58 untouched benchmarks
⏩ 196 skipped benchmarks1


Comparing changeset-release/main (67f4d38) with main (9ddda68)

Open in CodSpeed

Footnotes

  1. 196 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment