Skip to content

Releases: biomejs/biome

Biome CLI v2.4.4

20 Feb 21:30
6c296ea

Choose a tag to compare

2.4.4

Patch Changes

  • #9150 6946835 Thanks @dyc3! - Fixed #9138: Astro files containing --- in HTML content (e.g., <h1>---Hi</h1>) are now parsed correctly, both when a frontmatter block is present and when there is no frontmatter at all.

  • #9150 aa6f837 Thanks @dyc3! - Fixed #9138: The HTML parser incorrectly failing to parse bracket characters ([ and ]) in text content (e.g. <div>[Foo]</div>).

  • #9151 c0d4b0c Thanks @dyc3! - Fixed parsing of Svelte directive keywords (use, style) when used as plain text content in HTML/Svelte files. Previously, <p>use JavaScript</p> or <p>style it</p> would incorrectly produce a bogus element instead of proper text content.

  • #9162 7f1e060 Thanks @dyc3! - Fixed #9161: The Vue parser now correctly handles colon attributes like xlink:href and xmlns:xlink by parsing them as single attributes instead of splitting them into separate tokens.

  • #9164 458211b Thanks @dyc3! - Fixed #9161: The noAssignInExpressions rule no longer flags assignments in Vue v-on directives (e.g., @click="counter += 1"). Assignments in event handlers are idiomatic Vue patterns and are now skipped by the rule.

What's Changed

  • chore(scss): cherry-picks by @denbezrukov in #9149
  • fix(parse/html): don't lex square brackets as special tokens in contexts where they don't mean anything by @dyc3 in #9150
  • refactor(parse/html): use token_set! instead of matches! for svelte keywords and directives helpers by @dyc3 in #9148
  • fix(parse/html): don't lex "use" as USE_KW when in html text content by @dyc3 in #9151
  • feat(css): enhance SCSS qualified name detection by @denbezrukov in #9159
  • chore(html): more html benchmarks by @dyc3 in #8153
  • fix(parse/html/vue): don't treat : as special token outside of vue directives by @dyc3 in #9162
  • feat(lint/vue): automatically ignore noAssignInExpressions for vue v-on directives by @dyc3 in #9164
  • ci: release by @github-actions[bot] in #9160

Full Changelog: https://github.com/biomejs/biome/compare/@biomejs/biome@2.4.3...@biomejs/biome@2.4.4

Biome CLI v2.4.3

19 Feb 19:24
312b6db

Choose a tag to compare

2.4.3

Patch Changes

  • #9120 aa40fc2 Thanks @ematipico! - Fixed #9109, where the GitHub reporter wasn't correctly enabled when biome ci runs on GitHub Actions.

  • #9128 8ca3f7f Thanks @dyc3! - Fixed #9107: The HTML parser can now correctly parse Astro directives (client/set/class/is/server), which fixes the formatting for Astro directives.

  • #9124 f5b0e8d Thanks @ematipico! - Fixed #8882 and #9108: The Astro frontmatter lexer now correctly identifies the closing --- fence when the frontmatter contains multi-line block comments with quote characters, strings that mix quote types (e.g. "it's"), or escaped quote characters (e.g. "\").

  • #9142 3ca066b Thanks @THernandez03! - Fixed #9141: The noUnknownAttribute rule no longer reports closedby as an unknown attribute on <dialog> elements.

  • #9126 792013e Thanks @ematipico! - Added missing Mocha globals to the Test domain: context, run, setup, specify, suite, suiteSetup, suiteTeardown, teardown, xcontext, xdescribe, xit, and xspecify. These are injected by Mocha's BDD and TDD interfaces and were previously flagged as undeclared variables in projects using Mocha.

  • #8855 6918c9e Thanks @ruidosujeira! - Fixed #8840. Now the Biome CSS parser correctly parses not + scroll-state inside @container queries.

  • #9111 4fb55cf Thanks @Jayllyz! - Slightly improved performance of noIrregularWhitespace by adding early return optimization and simplifying character detection logic.

  • #8975 086a0c5 Thanks @FrankFMY! - Fixed #8478: useDestructuring no longer suggests destructuring when the variable has a type annotation, like const foo: string = object.foo.

What's Changed

New Contributors

Full Changelog: https://github.com/biomejs/biome/compare/@biomejs/biome@2.4.2...@biomejs/biome@2.4.3

Biome CLI v2.4.2

16 Feb 23:25
b99e7db

Choose a tag to compare

2.4.2

Patch Changes

What's Changed

  • fix(lint): don't report Props interface as unused in Astro files by @siketyan in #9101
  • fix(service): parse text expressions in svelte control flow blocks by @dyc3 in #9103
  • feat(migrate): more metadata for rules from html-eslint by @dyc3 in #9106
  • feat(lint): add Playwright ESLint rules by @abossenbroek in #8960
  • ci: release by @github-actions[bot] in #9104

New Contributors

Full Changelog: https://github.com/biomejs/biome/compare/@biomejs/biome@2.4.1...@biomejs/biome@2.4.2

Biome CLI v2.4.1

16 Feb 15:58
5153f2f

Choose a tag to compare

2.4.1

Patch Changes

  • #9092 6edd600 Thanks @ematipico! - Fixed #9052. This PR reverts changes introduced by #8519, which caused unwanted changes on how paths are resolved.

  • #9091 3bf674d Thanks @ematipico! - Fixed #9090, where SCSS files were incorrectly processed by Biome. This was a regressions caused by the latest developments for supporting SCSS out of the box.

  • #9100 66931a8 Thanks @siketyan! - Fixed #9081: The noUnknownPseudoElement rule no longer reports false positives for any known pseudo elements in CSS modules. This was a regression introduced in v2.4.0.

  • #9102 d01b903 Thanks @ematipico! - Fixed #9095, where Biome didn't print anything in stdin mode. This was a regression caused by a recent, internal refactor.

What's Changed

Full Changelog: https://github.com/biomejs/biome/compare/@biomejs/biome@2.4.0...@biomejs/biome@2.4.1

Biome CLI v2.4.0

15 Feb 16:14
bf6e5f9

Choose a tag to compare

2.4.0

Minor Changes

  • #8964 0353fa0 Thanks @dyc3! - Added ignore option to the useHookAtTopLevel rule.

    You can now specify function names that should not be treated as hooks, even if they follow the use* naming convention.

    Example configuration:

    {
      "linter": {
        "rules": {
          "correctness": {
            "useHookAtTopLevel": {
              "options": {
                "ignore": ["useDebounce", "useCustomUtility"]
              }
            }
          }
        }
      }
    }
  • #8769 d0358b0 Thanks @rahuld109! - Added the rule useAnchorContent for HTML to enforce that anchor elements have accessible content for screen readers. The rule flags empty anchors, anchors with only whitespace, and anchors where all content is hidden with aria-hidden. Anchors with aria-label or title attributes providing a non-empty accessible name are considered valid.

  • #8742 6340ce6 Thanks @rahuld109! - Added the rule useMediaCaption to the HTML language. Enforces that audio and video elements have a track element with kind="captions" for accessibility. Muted videos are allowed without captions.

  • #8621 d11130b Thanks @Netail! - Added support for multiple reporters, and the ability to save reporters on arbitrary files.

    Combine two reporters in CI

    If you run Biome on GitHub, take advantage of the reporter and still see the errors in console, you can now use both reporters:

    biome ci --reporter=default --reporter=github

    Save reporter output to a file

    With the new --reporter-file CLI option, it's now possible to save the output of all reporters to a file. The file is a path,
    so you can pass a relative or an absolute path:

    biome ci --reporter=rdjson --reporter-file=/etc/tmp/report.json
    biome ci --reporter=summary --reporter-file=./reports/file.txt

    You can combine these two features. For example, have the default reporter written on terminal, and the rdjson reporter written on file:

    biome ci --reporter=default --reporter=rdjson --reporter-file=/etc/tmp/report.json

    The --reporter and --reporter-file flags must appear next to each other, otherwise an error is thrown.

  • #8399 ab88099 Thanks @ematipico! - The Biome CSS parser is now able to parse Vue SFC syntax such as :slotted and :deep. These pseudo functions are only correctly parsed when the CSS is defined inside .vue components. Otherwise, Biome will a emit a parse error.

    This capability is only available when experimentalFullHtmlSupportedEnabled is set to true.

  • #8663 3dfea16 Thanks @ematipico! - Added support for Cursor files. When Biome sees a Cursor JSON file, it will parse it with comments enabled and trailing commas enabled:

    • $PROJECT/.cursor/
    • %APPDATA%\Cursor\User\ on Windows
    • ~/Library/Application Support/Cursor/User/ on macOS
    • ~/.config/Cursor/User/ on Linux
  • #8723 fe2c642 Thanks @cbstns! - Added JSON as a target language for GritQL pattern matching. You can now write Grit plugins for JSON files.

    This enables users to write GritQL patterns that match against JSON files, useful for:

    • Searching and transforming JSON configuration files
    • Enforcing patterns in package.json and other JSON configs
    • Writing custom lint rules for JSON using GritQL

    Example patterns:

    Match all key-value pairs:

    language json
    
    pair(key = $k, value = $v)
    

    Match objects with specific structure:

    language json
    
    JsonObjectValue()
    

    Supports both native Biome AST names (JsonMember, JsonObjectValue) and TreeSitter-compatible names (pair, object, array) for compatibility with existing Grit patterns.

    For more details, see the GritQL documentation.

  • #8814 4d9c676 Thanks @Netail! - Added ignore option to noUnknownProperty. If an unknown property name matches any of the items provided in ignore, a diagnostic won't be emitted.

  • #8631 4d8f19d Thanks @Netail! - Add a new reporter --reporter=sarif, that emits diagnostics using the SARIF format.

  • #8270 4f7909d Thanks @lucasweng! - Added the useIframeTitle lint rule for HTML. The rule enforces the usage of the title attribute for the iframe element.

    Invalid:

    <iframe></iframe> <iframe title=""></iframe>

    Valid:

    <iframe title="title"></iframe>
  • #8164 1d25856 Thanks @ematipico! - Added a new assist action useSortedInterfaceMembers that sorts TypeScript interface members, for readability.

    It includes an autofix.

    Invalid example.

    interface MixedMembers {
      z: string;
      a: number;
      (): void;
      y: boolean;
    }

    Valid example (after using the assist).

    interface MixedMembers {
      a: number;
      y: boolean;
      z: string;
      (): void;
    }
  • #8647 4c7c06f Thanks @siketyan! - It's now possible to provide the stacktrace for a fatal error. The stacktrace is only available when the environment variable RUST_BACKTRACE=1 is set, either via the CLI or exported $PATH. This is useful when providing detailed information for debugging purposes:

    RUST_BACKTRACE=1 biome lint
  • #7961 a04c8df Thanks @siketyan! - The Biome Language Server now reports progress while scanning files and dependencies in the project.

  • #8289 a9025d4 Thanks @theshadow27! - Fixed #8024. The rule useIterableCallbackReturn now supports a checkForEach option. When set to false, the rule will skip checking for forEach() callbacks for returning values.

  • #8690 e06e5d1 Thanks @ematipico! - Added the rule useValidLang to the HTML language.

  • #7847 e90b14f Thanks @Jagget! - Added support for jsxFactory and jsxFragmentFactory.Biome now respects jsxFactory and jsxFragmentFactory settings from tsconfig.json when using the classic JSX runtime, preventing false positive noUnusedImports errors for custom JSX libraries like Preact.

    // tsconfig.json
    {
      compilerOptions: {
        jsx: "react",
        jsxFactory: "h",
        jsxFragmentFactory: "Fragment",
      },
    }
    // Component.jsx
    import { h, Fragment } from "preact";
    
    function App() {
      return <div>Hello</div>;
    }
  • #8071 7f5bcf4 Thanks @ematipico! - Added new CLI options to the commands lsp-proxy and start that allow to control the Biome file watcher.

    --watcher-kind

    Controls how the Biome file watcher should behave. By default, Biome chooses the best watcher strategy for the
    current OS, however sometimes this could result in some issues, such as folders locked.

    The option accepts the current values:

    • recommended: the de...
Read more

Biome CLI v2.3.15

12 Feb 11:54
df21006

Choose a tag to compare

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):...
Read more

Biome CLI v2.3.14

03 Feb 15:57
3a38d5c

Choose a tag to compare

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](...

Read more

Biome CLI v2.3.13

26 Jan 14:27
2c5e505

Choose a tag to compare

2.3.13

Patch Changes

  • #8815 f924f23 Thanks @dyc3! - Improved useVueValidVOn to be more closely aligned with the source rule. It will now properly allow modifiers for all possible keyboard events. It should have better performance when there are no violations of the rule as well.

    Now treated valid:

    <div @keydown.arrow-down="handler"></div>
    <div @keydown.a="handler"></div>
    <div @keydown.b="handler"></div>
    <div @keydown.27="foo"></div>
  • #8856 85f81f9 Thanks @dyc3! - Fixed #8710: Biome now parses Vue dynamic slot shorthand arguments that use template literals in [].

  • #8850 2a190e0 Thanks @dyc3! - Fixed #8708: Tailwind @utility directives now parse functional utility names like px-* when Tailwind directives are enabled.

  • #8863 79386e0 Thanks @dyc3! - Fixed an issue with biome migrate eslint where it couldn't detect rules for CSS, GraphQL, and HTML.

  • #8771 6f56b6e Thanks @lghuahua! - Fix the --reporter=summary output incorrectly merging and displaying wrong issue counts for different rules. Fixes #8730

  • #8714 ac3a71f Thanks @Netail! - Added new nursery rule use-consistent-enum-value-type. This rule disallows enums from having both number and string members.

What's Changed

  • fix(dx/codegen): don't insert module into biome_rule_options/src/lib.rs if it already exists by @dyc3 in #8847
  • feat(js_analyze): implement useConsistentEnumValueType by @Netail in #8714
  • fix(parse/html/vue): parse dynamic slot directives that contain quotes by @dyc3 in #8856
  • fix(parse/css): improve parsing of @utility names by @dyc3 in #8850
  • fix(cli): improve RuleName ordering and update summary snapshots close #8730 by @lghuahua in #8771
  • fix(useVueValidVOn): align more with source rule, also use phf hash sets for perf by @dyc3 in #8815
  • fix(migrate): fix migrate command not picking up rules for css, graphql, html by @dyc3 in #8863
  • chore(deps): update dependency tombi to v0.7.23 by @renovate[bot] in #8865
  • chore(deps): update pnpm to v10.28.1 by @renovate[bot] in #8866
  • chore(deps): update rust crate proc-macro2 to 1.0.106 by @renovate[bot] in #8867
  • chore(deps): update rust crate quote to 1.0.44 by @renovate[bot] in #8868
  • fix(deps): update @biomejs packages by @renovate[bot] in #8869
  • chore(deps): update rust crate schemars to 1.2.0 by @renovate[bot] in #8875
  • chore(deps): update @biomejs packages by @renovate[bot] in #8872
  • chore(deps): update github-actions by @renovate[bot] in #8873
  • chore(deps): update typescript-eslint monorepo to v8.53.1 by @renovate[bot] in #8877
  • fix(deps): update dependency prettier to v3.8.1 by @renovate[bot] in #8878
  • chore(deps): update rust crate tokio to 1.49.0 by @renovate[bot] in #8876
  • ci: release by @github-actions[bot] in #8853

New Contributors

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

Biome CLI v2.3.12

23 Jan 15:54
fd33f86

Choose a tag to compare

2.3.12

Patch Changes

  • #8653 047576d Thanks @dyc3! - Added new nursery rule noDuplicateAttributes to forbid duplicate attributes in HTML elements.

  • #8648 96d09f4 Thanks @BaeSeokJae! - Added a new nursery rule noVueOptionsApi.

    Biome now reports Vue Options API usage, which is incompatible with Vue 3.6's Vapor Mode.
    This rule detects Options API patterns in <script> blocks, defineComponent(), and createApp() calls,
    helping prepare codebases for Vapor Mode adoption.

    For example, the following now triggers this rule:

    <script>
    export default {
      data() {
        return { count: 0 };
      },
    };
    </script>
  • #8832 b08270b Thanks @Exudev! - Fixed #8809, #7985, and #8136: the noSecrets rule no longer reports false positives on common CamelCase identifiers like paddingBottom, backgroundColor, unhandledRejection, uncaughtException, and IngestGatewayLogGroup.

    The entropy calculation algorithm now uses "average run length" to distinguish between legitimate CamelCase patterns (which have longer runs of same-case letters) and suspicious alternating case patterns (which have short runs).

  • #8793 c19fb0e Thanks @TheBaconWizard! - Properly handle parameters metavariables for arrow_function GritQL queries. The following biome search command no longer throws an error:

    biome search 'arrow_function(parameters=$parameters, body=$body)'
  • #8561 981affb Thanks @wataryooou! - Fixed noUnusedVariables to ignore type parameters declared in ambient contexts such as declare module blocks.

  • #8817 652cfbb Thanks @dyc3! - Fixed #8765: The HTML parser can now parse directive modifiers with a single colon, e.g. @keydown.:.

  • #8704 a1914d4 Thanks @Netail! - Added the nursery rule noRootType.
    Disallow the usage of specified root types. (e.g. mutation and/or subscription)

    Invalid:

    {
      "options": {
        "disallow": ["mutation"]
      }
    }
    type Mutation {
      SetMessage(message: String): String
    }
  • #8712 251b47b Thanks @Netail! - Renamed the following GraphQL nursery rules to match the Biome standard:

    • useUniqueArgumentNames -> noDuplicateArgumentNames
    • useUniqueFieldDefinitionNames -> noDuplicateFieldDefinitionNames
    • useUniqueGraphqlOperationName -> noDuplicateGraphqlOperationName
    • useUniqueInputFieldNames -> noDuplicateInputFieldNames
    • useUniqueVariableNames -> noDuplicateVariableNames

    Run the biome migrate --write command to automatically update the configuration file.

  • #7602 957cd8e Thanks @kedevked! - Added the nursery lint rule useErrorCause.

    This rule enforces that errors caught in a catch clause are not rethrown without wrapping them in a new Error object and specifying the original error as the cause. This helps preserve the error’s stack trace and context for better debugging.

    It can be configured with the following option:

    • requireCatchParameter: (default: true)
      • When true, the rule requires that catch clauses have a parameter. If a throw statement appears inside a catch clause without a parameter, it will be flagged.

    Invalid examples:

    try {
      foo();
    } catch {
      throw new Error("fail");
    }
    try {
      foo();
    } catch (err) {
      throw new Error(err.message);
    }

    Valid examples:

    try {
      foo();
    } catch (err) {
      throw new Error("fail", { cause: err });
    }
    try {
      foo();
    } catch (error) {
      throw new Error("Something went wrong", { cause: error });
    }

    Valid example when requireCatchParameter is false:

    Valid:

    try {
      foo();
    } catch {
      throw new Error("fail");
    }
  • #8725 95aba98 Thanks @dyc3! - Fixed #8715: The CSS parser will now recover slightly better if a semicolon is missing from Tailwind's @apply at-rule.

  • #8616 4ee3bda Thanks @Netail! - Added the nursery rule useLoneAnonymousOperation. Disallow anonymous operations when more than one operation specified in document.

    Invalid:

    query {
      fieldA
    }
    
    query B {
      fieldB
    }
  • #8624 291c9f2 Thanks @taga3s! - Added the nursery rule useInlineScriptId to the Next.js domain.
    This rule enforces id attribute on next/script components with inline content or dangerouslySetInnerHTML.

    The following code is invalid:

    import Script from "next/script";
    
    export default function Page() {
      return (
        <Script>{`console.log('Hello');`}</Script> // must have `id` attribute
      );
    }
  • #8767 0d15370 Thanks @mdevils! - Fixed #3512:
    useExhaustiveDependencies now properly handles nested destructuring patterns
    from hook results.

    const [[x, y], setXY] = useState([1, 2]);
    useEffect(() => {
      console.log(x, y);
    }, [x, y]); // x and y are now correctly recognized as unstable
  • #8757 17ed9d3 Thanks @Netail! - Added the nursery rule noDivRegex. Disallow equal signs explicitly at the beginning of regular expressions.

    Invalid:

    var f = function () {
      return /=foo/;
    };
  • #8836 aab1d17 Thanks @dyc3! - Fixed #7858: Biome now parses Astro files with empty frontmatter blocks.

  • #8755 3a15c29 Thanks @arturalkaim! - Fixed #6670. The $filename metavariable can now be used in GritQL where clauses to filter matches by filename.

  • #8821 63e68a1 Thanks @playhardgopro! - Fixed several bugs in Vue conditional rules (useVueValidVIf, useVueValidVElse, and useVueValidVElseIf) related to whitespace handling, newlines, and self-closing tags.

  • #8767 0d15370 Thanks @mdevils! - Fixed #3685:
    useExhaustiveDependencies now properly handles transparent expression
    wrappers like non-null assertions and type assertions in dependency comparisons.

    useMemo(() => Boolean(myObj!.x), [myObj!.x]); // No longer reports incorrect diagnostics
    useMemo(() => myObj!.x?.y === true, [myObj!.x?.y]); // Now correctly matches dependencies
  • #8597 [f764007](f7640071fa356808...

Read more

Biome CLI v2.3.11

03 Jan 15:52
1550e73

Choose a tag to compare

2.3.11

Patch Changes

  • #8583 83be210 Thanks @dyc3! - Added the new nursery rule useVueValidTemplateRoot.

    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>
  • #8586 df8fe06 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.

  • #8587 9a8c98d 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>
  • #8586 df8fe06 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.

  • #8583 83be210 Thanks @dyc3! - Added the new nursery rule useVueValidVOnce. Enforces that usages of the v-once directive in Vue.js SFC are valid.

    <!-- Valid -->
    <div v-once />
    
    <!-- Invalid -->
    <div v-once:aaa />
    <div v-once.bbb />
    <div v-once="ccc" />
  • #8498 d80fa41 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")).

  • #8509 574a909 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}
  • #8316 d64e92d Thanks @washbin! - Added the new nursery rule noMultiAssign. This rule helps to prevent multiple chained assignments.

    For example, the following code triggers because there are two assignment expressions in the same statement.

    const a = (b = 0);
  • #8592 a5f59cd Thanks @Netail! - Added the nursery rule useUniqueInputFieldNames. Require fields within an input object to be unique.

    Invalid:

    query A($x: Int, $x: Int) {
      field
    }
  • #8524 17a6156 Thanks @JacquesLeupin! - Fixed #8488: Relative plugin paths are now resolved from the configuration file directory, including when configurations are merged (e.g. extends: "//").

  • #8655 3260ec9 Thanks @JacquesLeupin! - Fixed #8636: Biome's CSS formatter now breaks comma-separated declaration values at top-level commas when wrapping.

  • #8537 cc3e851 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>
    );
  • #8511 16a9036 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.

  • #8521 a704be9 Thanks @ToBinio! - Added the nursery rule useVueConsistentDefinePropsDeclaration, which enforces consistent defineProps declaration style.

    Invalid

    <script setup lang="ts">
    const props = defineProps({
      kind: { type: String },
    });
    </script>

    Valid

    <script setup lang="ts">
    const props = defineProps<{
      kind: string;
    }>();
    </script>
  • #8595 7c85bf0 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>
  • #8598 5e85d43 Thanks @Netail! - Added the nursery rule useUniqueFieldDefinitionNames. Require all fields of a type to be unique.

    Invalid:

    type SomeObject {
      foo: String
      foo: String
    }
  • #8495 b573d14 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
  • #8632 0be7d12 Thanks @Bertie690! - The documentation & rule sources for lint/complexity/noBannedTypes have been updated to fix a few oversights.

    In addition to some general typo fixes:

    • The rule now recommends Record<keyof any, never> instead of Record<string, never> (the latter of which incorrectly allows symbol-keyed properties).

    • The rule mentions an alternate method to enforce object emptiness involving unique symbol-based guards used by type-fest and many other packages:

      declare const mySym: unique symbol;
      
      // Since this type's only property is an unexpor...
Read more