Skip to content

All versions since 2.3.2

2.3.2

Patch Changes

  • #7859 c600618 Thanks @Netail! - Added the nursery rule noIncrementDecrement, disallows the usage of the unary operators ++ and —.

  • #7901 0d17b05 Thanks @ematipico! - Fixed #7837, where Biome couldn’t properly parse text expressions that contained nested curly brackets. This was breaking parsing in Astro and Svelte files.

  • #7874 e617d36 Thanks @Bertie690! - Fixed #7230: noUselessStringConcat no longer emits false positives for multi-line strings with leading + operators.

    Previously, the rule did not check for leading newlines on the + operator, emitting false positives if one occurred at the start of a line.
    Notably, formatting with operatorLinebreak="before" would move the + operators to the start of lines automatically, resulting in spurious errors whenever a multi-line string was used.

    Now, the rule correctly detects and ignores multi-line concatenations with leading operators as well, working regardless of the setting of operatorLinebreak.

    Example

    // The following code used to error if the `+` operators were at the start of lines (as opposed to the end).
    // Now, the rule correctly recognizes this as a stylistic concatenation and ignores it.
    const reallyLongStringThatShouldNotError =
    "Lorem ipsum dolor sit amet consectetur adipiscing elit." +
    "Quisque faucibus ex sapien vitae pellentesque sem placerat." +
    "In id cursus mi pretium tellus duis convallis." +
    "Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla";
  • #7786 33ffcd5 Thanks @daivinhtran! - Fixed #7601: Properly match Grit plugin’s code snippet with only one child.

  • #7901 0d17b05 Thanks @ematipico! - Fixed #7837, where Biome Language Server panicked when opening HTML-ish files when the experimental full support is enabled.

2.3.3

Patch Changes

  • #7907 57bd662 Thanks @ematipico! - Fixed #7839. Now the Biome parser correctly parses the Astro frontmatter even when a triple fence is inside quotes.

  • #7934 a35c496 Thanks @alissonlauffer! - Fixed #7919: The HTML parser now correctly handles Unicode BOM (Byte Order Mark) characters at the beginning of HTML files, ensuring proper parsing and tokenization.

  • #7869 c80361d Thanks @matanshavit! - Fixed #7864: Biome now preserves component tag name casing in Svelte, Astro, and Vue files.

  • #7926 69cecec Thanks @matanshavit! - Added the rule noParametersOnlyUsedInRecursion.

    This rule detects function parameters that are exclusively used in recursive calls and can be removed to simplify the function signature since they are effectively unused.

    function factorial(n, acc) {
    if (n === 0) return 1;
    return factorial(n - 1, acc); // acc is only used here
    }

    Fixes #6484.

  • #7774 2509b91 Thanks @dibashthapa! - Fixed #7657: Added the new rule no-unknown-property from ESLint

  • #7918 7165d06 Thanks @dyc3! - Fixed #7913: The CSS parser, with tailwindDirectives enabled, will now correctly handle @slot.

  • #7959 ffae203 Thanks @siketyan! - Fixed the Biome Language Server so it no longer returns an internal error when the formatter is disabled in the configuration.

2.3.4 Latest

Patch Changes

  • #7989 4855c4a Thanks @alissonlauffer! - Fixed a regression in Astro frontmatter parsing where comments inside quoted strings were incorrectly detected as actual comments. This caused the parser to prematurely terminate frontmatter parsing when encountering strings like const test = "//";. For example, the following Astro frontmatter now parses correctly:

    ---
    const test = "// not a real comment";
    ---
  • #7968 0b28f5f Thanks @denbezrukov! - Refactored formatter to use strict Token element for better performance. The new Token variant is optimized for static, ASCII-only text (keywords, operators, punctuation) with the following constraints:

    • ASCII only (no Unicode characters)
    • No newlines (\n, \r)
    • No tab characters (\t)

    This enables faster printing and fitting logic by using bulk string operations (push_str, len()) instead of character-by-character iteration with Unicode width calculations.

  • #7941 19b8280 Thanks @Conaclos! - Fixed #7943. Rules’ options are now properly merged with the inherited options from a shared configuration.

    This means that you can now override a specific option from a rule without resetting the other options to their default.

    Given the following shared configuration:

    {
    "linter": {
    "rules": {
    "style": {
    "useNamingConvention": {
    "level": "on",
    "options": {
    "strictCase": false,
    "conventions": [
    {
    "selector": { "kind": "variable", "scope": "global" },
    "formats": ["CONSTANT_CASE"]
    }
    ]
    }
    }
    }
    }
    }
    }

    And the user configuration that extends this shared configuration:

    {
    "extends": ["shared.json"],
    "linter": {
    "rules": {
    "style": {
    "useNamingConvention": {
    "level": "on",
    "options": { "strictCase": true }
    }
    }
    }
    }
    }

    The obtained merged configuration is now as follows:

    {
    "extends": ["shared.json"],
    "linter": {
    "rules": {
    "style": {
    "useNamingConvention": {
    "level": "on",
    "options": {
    "strictCase": true,
    "conventions": [
    {
    "selector": { "kind": "variable", "scope": "global" },
    "formats": ["CONSTANT_CASE"]
    }
    ]
    }
    }
    }
    }
    }
    }
  • #7969 425963d Thanks @ematipico! - Added support for the Svelte syntax {@debug}. The Biome HTML parser is now able to parse and format the blocks:

    {@debug foo,bar, something}
    {@debug foo, bar, something}
  • #7986 3256f82 Thanks @lisiur! - Fixed #7981. Now Biome correctly detects and parses lang='tsx' and lang='jsx' languages when used inside in .vue files, when .experimentalFullSupportEnabled is enabled.

  • #7921 547c2da Thanks @dyc3! - Fixed #7854: The CSS parser, with tailwindDirectives enabled, will now parse @source inline("underline");.

  • #7856 c9e20c3 Thanks @Netail! - Added the nursery rule noContinue. Disallowing the usage of the continue statement, structured control flow statements such as if should be used instead.

    Invalid:

    let sum = 0,
    i;
    for (i = 0; i < 10; i++) {
    if (i >= 5) {
    continue;
    }
    sum += i;
    }

    Valid:

    let sum = 0,
    i;
    for (i = 0; i < 10; i++) {
    if (i < 5) {
    sum += i;
    }
    }