github biomejs/biome @biomejs/biome@2.3.14
Biome CLI v2.3.14

14 hours ago

2.3.14

Patch Changes

  • #8921 29e2435 Thanks @siketyan! - Fixed #8759: The useConsistentTypeDefinitions rule no longer converts empty object type declarations into interfaces, as it will conflict with the noEmptyInterface rule and can cause an infinite loop when both rules are enabled.

  • #8928 ccaeac4 Thanks @taga3s! - Added the nursery rule useGlobalThis. This rule enforces using globalThis over window, self and global.

  • #8602 9a18daa Thanks @dyc3! - Added the new nursery rule noVueArrowFuncInWatch. This rule forbids using arrow functions in watchers in Vue components, because arrow functions do not give access to the component instance (via this), while regular functions do.

  • #8905 9b1eea8 Thanks @ryan-m-walker! - Fixed #8428: Improved parsing recovery when encountering qualified rules inside CSS @page at-rule blocks.

  • #8900 f788cff Thanks @mdevils! - Fixed #8802: useExhaustiveDependencies now correctly suggests dependencies without including callback-scoped variables or method names.

    When accessing object properties with a callback-scoped variable, only the object path is suggested:

    // Now correctly suggests `props.value` instead of `props.value[day]`
    useMemo(() => {
      return WeekdayValues.filter((day) => props.value[day]);
    }, [props.value]);

    When calling methods on objects, only the object is suggested as a dependency:

    // Now correctly suggests `props.data` instead of `props.data.forEach`
    useMemo(() => {
      props.data.forEach((item) => console.log(item));
    }, [props.data]);
  • #8913 e1e20ea Thanks @dyc3! - Fixed #8363: HTML parser no longer crashes when encountering a < character followed by a digit in text content (e.g., <12 months). The parser now correctly emits an "Unescaped < bracket character" error instead of treating <12 as a tag name and crashing.

  • #8910 2fb63a4 Thanks @dyc3! - Fixed #8774: Type aliases with generic parameters that have extends constraints now properly indent comments after the equals sign.

    Previously, comments after the = in type aliases with extends constraints were not indented:

    -type A<B, C extends D> = // Some comment
    -undefined;
    +type A<B, C extends D> =
    +    // Some comment
    +    undefined;
  • #8916 ea4bd04 Thanks @ryan-m-walker! - Fixed #4013, where comments in member chains caused unnecessary line breaks.

    // Before
    aFunction.b().c.d();
    
    // After
    aFunction.b().c.d();
  • #8945 fa66fe3 Thanks @fireairforce! - Fixed #8354: Don't remove quotes when type memeber is new.

    // Input:
    type X = {
      "new"(): string;
      "foo"(): string;
    };
    
    // Format Output:
    type X = {
      "new()": string;
      foo(): string;
    };
  • #8927 0ef3da5 Thanks @littleKitchen! - Fixed #8907: useExhaustiveDependencies now correctly recognizes stable hook results (like useState setters and useRef values) when declared with let.

  • #8931 4561751 Thanks @koshin01! - Added the new nursery rule noRedundantDefaultExport, which flags redundant default exports where the default export references the same identifier as a named export.

  • #8900 f788cff Thanks @mdevils! - Fixed #8883: useExhaustiveDependencies no longer produces false positives when props are destructured in the function body of arrow function components without parentheses around the parameter.

    type Props = { msg: string };
    
    // Arrow function without parentheses around `props`
    const Component: React.FC<Props> = (props) => {
      const { msg } = props;
      // Previously, this incorrectly reported `msg` as unnecessary
      useEffect(() => console.log(msg), [msg]);
    };
  • #8861 3531687 Thanks @dyc3! - Added the noDeprecatedMediaType CSS rule to flag deprecated media types like tv and handheld.

  • #8775 7ea71cd Thanks @igas! - Fixed the noUnnecessararyConditions rule to prevent trigger for optional fallback patterns.

  • #8860 95f1eea Thanks @dyc3! - Added the nursery rule noHexColors, which flags the use of hexadecimal color codes in CSS and suggests using named colors or RGB/RGBA/HSL/HSLA formats instead.

  • #8786 d876a38 Thanks @Bertie690! - Added the nursery rule useConsistentMethodSignatures.
    Inspired by the similarly named version from typescript-eslint, this rule aims to enforce a consistent style for methods used inside object types and interfaces.

    Examples

    Invalid code with style set to "property" (the default):

    interface Foo {
      method(a: string): void;
    }

    Invalid code with style set to "method":

    type Bar = {
      prop: (a: string) => void;
    }
  • #8864 5e97119 Thanks @dyc3! - Improved the summary provided by biome migrate eslint to be clearer on why rules were not migrated. Biome now specifies a reason when a rule is not migrated, such as being incompatible with the formatter or not implemented yet. This helps users make more informed decisions when migrating their ESLint configurations to Biome.

  • #8924 99b4cd1 Thanks @tmohammad78! - Fixed #8920: noUnknownFunction now knows about sibling-count, and sibling-index css functions

  • #8900 f788cff Thanks @mdevils! - Fixed #8885: useExhaustiveDependencies no longer incorrectly reports variables as unnecessary dependencies when they are derived from expressions containing post/pre-increment operators (++/--) or compound assignment operators (+=, -=, etc.).

    let renderCount = 0;
    
    export const MyComponent = () => {
      // `count` is now correctly recognized as a required dependency
      // because `renderCount++` can produce different values between renders
      const count = renderCount++;
    
      useEffect(() => {
        console.log(count);
      }, [count]); // no longer reports `count` as unnecessary
    };
  • #8619 d78e01d Thanks @Netail! - Added the nursery rule useInputName. Require mutation arguments to be called “input”, and the input type to be called Mutation name + “Input”.

    Invalid:

    type Mutation {
      SetMessage(message: String): String
    }
  • #8922 871b45e Thanks @siketyan! - Fixed #8829: Revamped the noGlobalDirnameFilename rule to catch many false negatives that have not been reported.

What's Changed

  • fix(css): improve CSS if() function parsing recovery by @ryan-m-walker in #8321
  • feat(graphql_analyze): implement useInputName by @Netail in #8619
  • feat(lint/css): add noHexColors by @dyc3 in #8860
  • feat(lint/css): add noDeprecatedMediaType by @dyc3 in #8861
  • docs: document the markup macro by @dyc3 in #8895
  • feat(migrate): more unsupported rule metadata for better clarity by @dyc3 in #8864
  • feat(analyze/js/vue): add noVueArrowFuncInWatch by @dyc3 in #8602
  • fix(linter): useExhaustiveDependencies regressions, fixes #8802, fixes #8883, fixes #8885 by @mdevils in #8900
  • fix(css): improve parsing recovery when encountering qualified rules inside CSS @page at-rule blocks by @ryan-m-walker in #8905
  • fix(format/js): preserve newline in type alias if right side has a comment by @dyc3 in #8910
  • refactor(codegen): generate lint/assist/syntax groups by proc macro by @dyc3 in #8901
  • fix(noUnnecessararyConditions): no false positive on optional param with fallback by @igas in #8775
  • fix(parse/html): fix panic caused by malformed tag <12 by @dyc3 in #8913
  • fix(format/js): fix comments in JavaScript member chains causing unnecessary line breaks by @ryan-m-walker in #8916
  • feat(wasm): expose grit search functions to wasm by @dyc3 in #8911
  • chore(deps): update dependency rust to v1.93.0 by @renovate[bot] in #8870
  • fix(css-functions): add sibiling index, count as valid functions by @tmohammad78 in #8924
  • fix(lint): do not convert empty object types to interfaces by @siketyan in #8921
  • fix(lint): revamp the noGlobalDirnameFilename rule to catch many false negatives by @siketyan in #8922
  • feat(lint): implement useConsistentMethodSignatures from typescript-eslint by @Bertie690 in #8786
  • docs(lint): clarify useArrowFunction rule by @zbycz in #8932
  • chore(just): add just new-crate by @tidefield in #8933
  • chore(deps): update rust crate insta to 1.46.2 by @renovate[bot] in #8874
  • chore(deps): update dependency tombi to v0.7.25 by @renovate[bot] in #8936
  • chore(deps): update pnpm to v10.28.2 by @renovate[bot] in #8937
  • chore(deps): update rust crate filetime to 0.2.27 by @renovate[bot] in #8938
  • chore(deps): update rust crate prettyplease to 0.2.37 by @renovate[bot] in #8939
  • chore(deps): update rust crate schemars to 1.2.1 - autoclosed by @renovate[bot] in #8940
  • fix(deps): update @biomejs packages by @renovate[bot] in #8941
  • chore(deps): update github-actions by @renovate[bot] in #8942
  • fix(formatter): don't remove quotes when type memeber is new by @fireairforce in #8945
  • feat(biome_js_analyze): implement useGlobalThis by @taga3s in #8928
  • fix(linter): recognize stable hook results declared with let by @littleKitchen in #8927
  • feat(linter): add rule noRedundantDefaultExport by @koshin01 in #8931
  • chore(deps): update mcr.microsoft.com/devcontainers/universal docker tag to v5 by @renovate[bot] in #8549
  • chore(deps): update typescript-eslint monorepo to v8.54.0 - autoclosed by @renovate[bot] in #8943
  • ci: lock crate wasm-bindgen by @ematipico in #8954
  • ci: release by @github-actions[bot] in #8888

New Contributors

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

Don't miss a new biome release

NewReleases is sending notifications on new releases.