<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Biome | Blog</title><description/><link>https://biomejs.dev/</link><language>en</language><item><title>Biome v2.4—Embedded Snippets, HTML Accessibility, and Better Framework Support</title><link>https://biomejs.dev/blog/biome-v2-4/</link><guid isPermaLink="true">https://biomejs.dev/blog/biome-v2-4/</guid><description>Biome 2.4 introduces embedded CSS and GraphQL formatting, 15 new HTML accessibility rules, significantly improved support for Vue, Svelte, and Astro, and promotes 24 rules to stable. Plus new CLI reporters, rule profiler, and editor configuration features.

</description><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Biome v2.4 is the first minor release of the year! After more than ten patches from v2.3, today we bring to you a new version that contains many new features!&lt;/p&gt;
&lt;p&gt;Once you have upgraded to Biome v2.4.0, migrate your Biome configuration to the new version by running the &lt;code dir=&quot;auto&quot;&gt;migrate&lt;/code&gt; command:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;migrate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--write&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;highlights&quot;&gt;Highlights&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Among all the features shipped in this release, here are the ones we think you’re going to like most!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#embedded-snippets-in-javascript&quot;&gt;Embedded snippets in JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#editor-inline-configuration&quot;&gt;Editor inline configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#major-improvements-to-html-ish-languages&quot;&gt;Major improvements to HTML-ish languages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#html-accessibility-rules&quot;&gt;HTML accessibility rules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#rule-profiler&quot;&gt;Rule profiler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#configuration-file-discovery&quot;&gt;Configuration file discovery&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;embedded-snippets-in-javascript&quot;&gt;Embedded snippets in JavaScript&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;One of the most significant new features in Biome 2.4 is the ability to format and lint embedded CSS and GraphQL snippets within JavaScript files. Enable this experimental feature to automatically format and lint CSS and GraphQL code within template literals.&lt;/p&gt;
&lt;p&gt;Biome recognizes CSS snippets from styled-components, Emotion, and similar CSS-in-JS libraries:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;styled-components.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; styled &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;styled-components&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;Foo&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;styled&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;display: flex;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;color: red;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;GraphQL queries and mutations within JavaScript are now properly formatted and linted:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;graphql-query.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; gql &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;graphql-tag&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;PeopleCountQuery&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;gql&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;query PeopleCount {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;allPeople {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;totalCount&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;To enable these features, add this to your configuration:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;javascript&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;experimentalEmbeddedSnippetsEnabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;aside aria-label=&quot;Note&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;Snippets with interpolations are not yet supported.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h3 id=&quot;editor-inline-configuration&quot;&gt;Editor inline configuration&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Editors can now inject a Biome configuration to the Biome Language Server without affecting the project’s configuration.&lt;/p&gt;
&lt;p&gt;If you have a Biome extension compatible with your LSP-ready editor, you can map &lt;code dir=&quot;auto&quot;&gt;inlineConfig&lt;/code&gt;. The configuration will be merged with the project’s configuration and it will take precedence.&lt;/p&gt;
&lt;p&gt;In the following example, the editor won’t emit any diagnostics for the rule &lt;code dir=&quot;auto&quot;&gt;noConsole&lt;/code&gt;, but the CLI will still conform to the configuration of the project.&lt;/p&gt;
&lt;starlight-tabs data-sync-key=&quot;action&quot;&gt; &lt;div&gt; &lt;ul role=&quot;tablist&quot;&gt; &lt;li role=&quot;presentation&quot;&gt; &lt;a role=&quot;tab&quot; href=&quot;#tab-panel-138&quot; id=&quot;tab-138&quot; aria-selected=&quot;true&quot; tabindex=&quot;0&quot;&gt; &lt;svg aria-hidden=&quot;true&quot; width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot;&gt;&lt;path d=&quot;M2.25 1.5a.75.75 0 0 0-.75.75v16.5H0V2.25C0 1.01 1 0 2.25 0h20.1c1 0 1.5 1.21.79 1.92L10.76 14.3h3.49v-1.55h1.5v1.92c0 .62-.5 1.13-1.13 1.13H9.27L6.7 18.37h11.69V9h1.5v9.38c0 .82-.68 1.5-1.5 1.5H5.18L2.57 22.5h19.19c.41 0 .75-.34.75-.75V5.25H24v16.5c0 1.24-1 2.25-2.25 2.25H1.65c-1 0-1.5-1.21-.79-1.92L13.19 9.75H9.75v1.5h-1.5V9.37c0-.62.5-1.12 1.12-1.12h5.32l2.62-2.62H5.63V15h-1.5V5.63c0-.83.67-1.5 1.5-1.5H18.8l2.63-2.63H2.25Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt; Zed &lt;/a&gt; &lt;/li&gt;&lt;li role=&quot;presentation&quot;&gt; &lt;a role=&quot;tab&quot; href=&quot;#tab-panel-139&quot; id=&quot;tab-139&quot; aria-selected=&quot;false&quot; tabindex=&quot;-1&quot;&gt; &lt;svg aria-hidden=&quot;true&quot; width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot;&gt;&lt;path d=&quot;M23.15 2.59 18.2.2a1.5 1.5 0 0 0-1.7.29L7.04 9.13 2.93 6a1 1 0 0 0-1.28.06L.33 7.26a1 1 0 0 0 0 1.48L3.9 12 .32 15.26a1 1 0 0 0 0 1.48l1.33 1.2a1 1 0 0 0 1.28.06l4.12-3.13 9.46 8.63c.44.45 1.13.57 1.7.29l4.94-2.38c.52-.25.85-.77.85-1.35V3.94c0-.58-.33-1.1-.85-1.36ZM18 17.45 10.82 12 18 6.55v10.9Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt; VS Code &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/div&gt;  &lt;div id=&quot;tab-panel-138&quot; aria-labelledby=&quot;tab-138&quot; role=&quot;tabpanel&quot;&gt;  &lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;.zed/settings.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;lsp&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;biome&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;settings&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;&quot;inline_config&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;linter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;rules&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;suspicious&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;              &lt;/span&gt;&lt;span&gt;&quot;noConsole&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;off&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt; &lt;div id=&quot;tab-panel-139&quot; aria-labelledby=&quot;tab-139&quot; role=&quot;tabpanel&quot; hidden&gt;  &lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;.vscode/settings.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;biome.lsp&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;inlineConfig&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;linter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;rules&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;suspicious&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;noConsole&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;off&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;  &lt;/div&gt;  &lt;starlight-tabs-restore&gt;&lt;/starlight-tabs-restore&gt; &lt;/starlight-tabs&gt;  
&lt;div&gt;&lt;h3 id=&quot;major-improvements-to-html-ish-languages&quot;&gt;Major improvements to HTML-ish languages&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;In Biome v2.3, we announced experimental full support for HTML-ish languages such as Vue, Svelte, and Astro. We’ve since focused on improving the developer experience based on community feedback. Several improvements were shipped in patch releases.&lt;/p&gt;
&lt;p&gt;Biome 2.4 brings significantly improved parsing for Vue and Svelte, resulting in better formatting across the board. Additionally, the rules &lt;code dir=&quot;auto&quot;&gt;noUnusedVariables&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;useConst&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;useImportType&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;noUnusedImports&lt;/code&gt; have been substantially improved, so you will see fewer false positives.&lt;/p&gt;
&lt;p&gt;All these improvements are visible only when the flag &lt;code dir=&quot;auto&quot;&gt;html.experimentalFullSupportEnabled&lt;/code&gt; is set to &lt;code dir=&quot;auto&quot;&gt;true&lt;/code&gt;. If you previously used &lt;a href=&quot;https://biomejs.dev/internals/language-support/#linting-html-ish-languages&quot;&gt;the &lt;code dir=&quot;auto&quot;&gt;overrides&lt;/code&gt; configuration workaround&lt;/a&gt; to disable certain rules, you can now remove it. If you encounter false positives, please report them in this &lt;a href=&quot;https://github.com/biomejs/biome/issues/8590&quot;&gt;issue&lt;/a&gt;. We now have the infrastructure to address these problems.&lt;/p&gt;
&lt;p&gt;The CSS parser can now parse Vue SFC syntax such as &lt;code dir=&quot;auto&quot;&gt;:slotted&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;:deep&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;v-bind()&lt;/code&gt;, as well as &lt;code dir=&quot;auto&quot;&gt;:global&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;:local&lt;/code&gt; inside &lt;code dir=&quot;auto&quot;&gt;.astro&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;.svelte&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;.vue&lt;/code&gt; files.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;html-accessibility-rules&quot;&gt;HTML accessibility rules&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Biome 2.4 introduces 15 comprehensive accessibility-focused lint rules for HTML, helping you build more accessible web applications:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-autofocus/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noAutofocus&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-positive-tabindex/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noPositiveTabindex&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-alt-text/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useAltText&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-anchor-content/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useAnchorContent&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-media-caption/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useMediaCaption&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-html-lang/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useHtmlLang&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-valid-lang/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useValidLang&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-valid-aria-role/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useValidAriaRole&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-aria-props-for-role/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useAriaPropsForRole&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-button-type/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useButtonType&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-access-key/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noAccessKey&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-distracting-elements/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noDistractingElements&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-svg-without-title/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noSvgWithoutTitle&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-redundant-alt/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noRedundantAlt&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-iframe-title/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useIframeTitle&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These rules work seamlessly with Vue, Svelte, and Astro files. Please help us to ship more &lt;a href=&quot;https://github.com/biomejs/biome/issues/8155&quot;&gt;a11y rules&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;rule-profiler&quot;&gt;Rule profiler&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The commands &lt;code dir=&quot;auto&quot;&gt;lint&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;check&lt;/code&gt; now have a &lt;code dir=&quot;auto&quot;&gt;--profile-rules&lt;/code&gt; flag. This flag enables the new internal profiler, which allows you to capture the execution time of lint rules, assist actions, and GritQL plugins.&lt;/p&gt;
&lt;p&gt;The profiler tracks only the execution time of the rule, and it doesn’t track the time spent in querying Biome’s CST. The flag will print an output similar to this one:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Rule execution time (does not include any preprocessing)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;total       avg         min         max         count rule&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;42.069ms     1.010µs    41.000ns   227.625µs  41633  correctness/noUnusedVariables&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;23.131ms   452.000ns    42.000ns   330.750µs  51096  suspicious/noFocusedTests&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;9.864ms   193.000ns     0.000ns   149.375µs  51046  suspicious/noConsole&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;8.074ms   198.000ns     0.000ns   141.208µs  40721  correctness/noUnusedFunctionParameters&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;7.963ms   137.000ns     0.000ns   263.958µs  57899  style/useNodejsImportProtocol&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;6.711ms     4.355µs    41.000ns   686.000µs   1541  source/organizeImports&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;4.076ms   664.000ns     0.000ns   132.792µs   6130  correctness/noUnusedImports&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;4.015ms    55.000ns     0.000ns   131.250µs  72343  correctness/noTypeOnlyImportAttributes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;3.320ms   524.000ns     0.000ns   115.791µs   6334  style/useImportType&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;384.101µs   164.000ns     0.000ns    74.875µs   2328  correctness/noNodejsModules&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;384.042µs     2.782µs    42.000ns   163.417µs    138  correctness/noDuplicatePrivateClassMembers&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;10.753µs   282.000ns    83.000ns   833.000ns     38  correctness/noSuperWithoutExtends&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;One way to interpret the data is to check the rules/actions that have low counts, and check their execution time. For example, if the execution time feels way too high compared to what it should be, maybe it’s a good place to look for possible optimizations. Since we landed this feature, we have found some bottlenecks that we have fixed since then.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;configuration-file-discovery&quot;&gt;Configuration file discovery&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Biome 2.4 improves configuration file discovery in two major ways:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hidden configuration files&lt;/strong&gt;: Biome now loads &lt;code dir=&quot;auto&quot;&gt;.biome.json&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;.biome.jsonc&lt;/code&gt; files. The loading order is: &lt;code dir=&quot;auto&quot;&gt;biome.json&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;biome.jsonc&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;.biome.json&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;.biome.jsonc&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Config home directories&lt;/strong&gt;: Biome now attempts to load configuration files from platform-specific config directories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;$XDG_CONFIG_HOME&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;$HOME/.config/biome&lt;/code&gt; on Linux&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;/Users/$USER/Library/Application Support/biome&lt;/code&gt; on macOS&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;C:\Users\$USER\AppData\Roaming\biome\config&lt;/code&gt; on Windows&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The priority order is: project folder (working directory) → parent folders → config home.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;linter-and-assist&quot;&gt;Linter and Assist&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;new-assist-actions&quot;&gt;New Assist Actions&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;remove-duplicate-css-classes&quot;&gt;Remove Duplicate CSS Classes&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Biome 2.4 introduces the &lt;a href=&quot;https://biomejs.dev/assist/actions/no-duplicate-classes/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noDuplicateClasses&lt;/code&gt;&lt;/a&gt; assist action to detect and remove duplicate CSS classes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For JSX files:&lt;/strong&gt; Supports &lt;code dir=&quot;auto&quot;&gt;class&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;className&lt;/code&gt; attributes and utility functions like &lt;code dir=&quot;auto&quot;&gt;clsx&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;cn&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;cva&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For HTML files:&lt;/strong&gt; Checks &lt;code dir=&quot;auto&quot;&gt;class&lt;/code&gt; attributes. This is the first assist action for HTML.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;example.jsx&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Before&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;flex p-4 flex&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; /&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// After&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;flex p-4&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; /&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Thank you &lt;a href=&quot;https://github.com/mldangelo&quot; title=&quot;Contributor @mldangelo&quot;&gt;
@mldangelo &lt;/a&gt; .&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;sort-interface-members&quot;&gt;Sort Interface Members&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Added a new assist action &lt;code dir=&quot;auto&quot;&gt;useSortedInterfaceMembers&lt;/code&gt; that sorts TypeScript interface members for improved readability. It includes an autofix.&lt;/p&gt;
&lt;p&gt;Before:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;example.ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;interface&lt;/span&gt;&lt;span&gt; MixedMembers {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;number&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;boolean&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;After:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;example.ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;interface&lt;/span&gt;&lt;span&gt; MixedMembers {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;number&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;boolean&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;enhanced-lint-rules&quot;&gt;Enhanced Lint Rules&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;usesortedkeys-with-groupbynesting-option&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useSortedKeys&lt;/code&gt; with &lt;code dir=&quot;auto&quot;&gt;groupByNesting&lt;/code&gt; Option&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Added &lt;code dir=&quot;auto&quot;&gt;groupByNesting&lt;/code&gt; option to the &lt;code dir=&quot;auto&quot;&gt;useSortedKeys&lt;/code&gt; assist. When enabled, object keys are grouped by their value’s nesting depth before sorting alphabetically.&lt;/p&gt;
&lt;p&gt;Simple values (primitives, single-line arrays, and single-line objects) are sorted first, followed by nested values (multi-line arrays and multi-line objects).&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;assist&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;actions&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;source&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;useSortedKeys&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;level&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;options&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;groupByNesting&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;usehookattoplevel-with-ignore-option&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useHookAtTopLevel&lt;/code&gt; with &lt;code dir=&quot;auto&quot;&gt;ignore&lt;/code&gt; Option&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Added &lt;code dir=&quot;auto&quot;&gt;ignore&lt;/code&gt; option to the &lt;a href=&quot;https://biomejs.dev/linter/rules/use-hook-at-top-level/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useHookAtTopLevel&lt;/code&gt;&lt;/a&gt; rule. You can now specify function names that should not be treated as hooks, even if they follow the &lt;code dir=&quot;auto&quot;&gt;use*&lt;/code&gt; naming convention.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;linter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;rules&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;correctness&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;useHookAtTopLevel&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;options&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;ignore&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;useDebounce&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;useCustomUtility&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;useiterablecallbackreturn-with-checkforeach-option&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useIterableCallbackReturn&lt;/code&gt; with &lt;code dir=&quot;auto&quot;&gt;checkForEach&lt;/code&gt; Option&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;The rule &lt;a href=&quot;https://biomejs.dev/linter/rules/use-iterable-callback-return/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useIterableCallbackReturn&lt;/code&gt;&lt;/a&gt; now supports a &lt;code dir=&quot;auto&quot;&gt;checkForEach&lt;/code&gt; option. When set to &lt;code dir=&quot;auto&quot;&gt;false&lt;/code&gt;, the rule will skip checking for &lt;code dir=&quot;auto&quot;&gt;forEach()&lt;/code&gt; callbacks for returning values.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;improved-usehookattoplevel-detection&quot;&gt;Improved &lt;code dir=&quot;auto&quot;&gt;useHookAtTopLevel&lt;/code&gt; Detection&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Updated &lt;a href=&quot;https://biomejs.dev/linter/rules/use-hook-at-top-level/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useHookAtTopLevel&lt;/code&gt;&lt;/a&gt; to better catch invalid hook usage. The rule now generates diagnostics if:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A hook is used at the module level (top of the file, outside any function)&lt;/li&gt;
&lt;li&gt;A hook is used within a function or method which is not a hook or component, unless it is a function expression (such as arrow functions commonly used in tests)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h4 id=&quot;useimportextensions-with-custom-mappings&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useImportExtensions&lt;/code&gt; with Custom Mappings&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Added the &lt;code dir=&quot;auto&quot;&gt;extensionMappings&lt;/code&gt; option to &lt;code dir=&quot;auto&quot;&gt;useImportExtensions&lt;/code&gt;. This allows you to specify custom file extensions for different module types. For example, to ban all &lt;code dir=&quot;auto&quot;&gt;.ts&lt;/code&gt; imports in favor of &lt;code dir=&quot;auto&quot;&gt;.js&lt;/code&gt; imports:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;linter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;rules&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;nursery&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;useImportExtensions&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;level&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;options&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;extensionMappings&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;              &lt;/span&gt;&lt;span&gt;&quot;ts&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;js&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;useunifiedtypesignatures-enhancements&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useUnifiedTypeSignatures&lt;/code&gt; Enhancements&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Added 2 options from &lt;code dir=&quot;auto&quot;&gt;typescript-eslint&lt;/code&gt; to &lt;a href=&quot;https://biomejs.dev/linter/rules/use-unified-type-signatures/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useUnifiedTypeSignatures&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;ignoreDifferentlyNamedParameters&lt;/code&gt; - Ignores overload signatures whose parameter names differ&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;ignoreDifferentJsDoc&lt;/code&gt; - Ignores overload signatures whose JSDoc comments differ&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h4 id=&quot;ignore-options-for-css-rules&quot;&gt;Ignore Options for CSS Rules&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Added &lt;code dir=&quot;auto&quot;&gt;ignore&lt;/code&gt; option to &lt;a href=&quot;https://biomejs.dev/linter/rules/no-unknown-property&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noUnknownProperty&lt;/code&gt;&lt;/a&gt;, &lt;code dir=&quot;auto&quot;&gt;noUnknownFunction&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;noUnknownPseudoClass&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;noUnknownPseudoElement&lt;/code&gt;. If an unknown property/function/selector name matches any of the items provided in &lt;code dir=&quot;auto&quot;&gt;ignore&lt;/code&gt;, a diagnostic won’t be emitted.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;improved-svelte-variables-detection&quot;&gt;Improved Svelte Variables Detection&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Improved the rule &lt;code dir=&quot;auto&quot;&gt;noUnusedVariables&lt;/code&gt; in Svelte files by correctly detecting variables defined in the JavaScript blocks and used inside the templates.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;new-linter-domain-types&quot;&gt;New Linter Domain: &lt;code dir=&quot;auto&quot;&gt;types&lt;/code&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Biome 2.4 introduces a new linter domain called &lt;code dir=&quot;auto&quot;&gt;types&lt;/code&gt;. This domain enables all rules that require the type inference engine to function.&lt;/p&gt;
&lt;p&gt;As opposed to the &lt;code dir=&quot;auto&quot;&gt;project&lt;/code&gt; domain (which only enables rules that require the module graph), the &lt;code dir=&quot;auto&quot;&gt;types&lt;/code&gt; domain specifically targets rules that need type information.&lt;/p&gt;
&lt;p&gt;The following nursery rules have been moved to the &lt;code dir=&quot;auto&quot;&gt;types&lt;/code&gt; domain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;useArraySortCompare&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;useAwaitThenable&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;useFind&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;useRegexpExec&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;noUnnecessaryConditions&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;noMisusedPromises&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;noFloatingPromises&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This allows you to enable or disable type-based linting more granularly using the &lt;code dir=&quot;auto&quot;&gt;--only&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;--skip&lt;/code&gt; flags.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;promoted-rules&quot;&gt;Promoted Rules&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Biome 2.4 promotes 24 nursery rules to stable groups, making them production-ready.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;correctness-rules&quot;&gt;Correctness Rules&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Promoted the following rules to the &lt;code dir=&quot;auto&quot;&gt;correctness&lt;/code&gt; group:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-unresolved-imports/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noUnresolvedImports&lt;/code&gt;&lt;/a&gt; - Reports imports that cannot be resolved&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-vue-reserved-props/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noVueReservedProps&lt;/code&gt;&lt;/a&gt; - Reports Vue reserved props usage&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-vue-reserved-keys/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noVueReservedKeys&lt;/code&gt;&lt;/a&gt; - Reports Vue reserved keys usage&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-vue-data-object-declaration/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noVueDataObjectDeclaration&lt;/code&gt;&lt;/a&gt; - Reports Vue 2 data declared as an object instead of a function&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-next-async-client-component/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noNextAsyncClientComponent&lt;/code&gt;&lt;/a&gt; - Reports async Next.js client components&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-vue-duplicate-keys/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noVueDuplicateKeys&lt;/code&gt;&lt;/a&gt; - Reports duplicate keys in Vue component options&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-vue-setup-props-reactivity-loss/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noVueSetupPropsReactivityLoss&lt;/code&gt;&lt;/a&gt; - Reports destructuring of props in Vue 3 setup which causes reactivity loss&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-qwik-method-usage/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useQwikMethodUsage&lt;/code&gt;&lt;/a&gt; - Enforces correct Qwik framework method usage&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-qwik-valid-lexical-scope/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useQwikValidLexicalScope&lt;/code&gt;&lt;/a&gt; - Enforces valid lexical scope in Qwik framework&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h4 id=&quot;suspicious-rules&quot;&gt;Suspicious Rules&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Promoted the following rules to the &lt;code dir=&quot;auto&quot;&gt;suspicious&lt;/code&gt; group:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-import-cycles/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noImportCycles&lt;/code&gt;&lt;/a&gt; - Reports circular imports&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-deprecated-imports/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noDeprecatedImports&lt;/code&gt;&lt;/a&gt; - Reports imports of deprecated symbols&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-react-forward-ref/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noReactForwardRef&lt;/code&gt;&lt;/a&gt; - Reports usage of &lt;code dir=&quot;auto&quot;&gt;React.forwardRef&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-unused-expressions/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noUnusedExpressions&lt;/code&gt;&lt;/a&gt; - Reports expressions that are never used&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-empty-source/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noEmptySource&lt;/code&gt;&lt;/a&gt; - Reports empty source files&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-deprecated-date/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useDeprecatedDate&lt;/code&gt;&lt;/a&gt; - Enforces use of GraphQL &lt;code dir=&quot;auto&quot;&gt;@deprecated&lt;/code&gt; directive with date&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-duplicate-dependencies/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noDuplicateDependencies&lt;/code&gt;&lt;/a&gt; - Reports duplicate dependencies in package.json&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h4 id=&quot;complexity-rules&quot;&gt;Complexity Rules&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Promoted the following rules to the &lt;code dir=&quot;auto&quot;&gt;complexity&lt;/code&gt; group:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-useless-undefined/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noUselessUndefined&lt;/code&gt;&lt;/a&gt; - Reports useless &lt;code dir=&quot;auto&quot;&gt;undefined&lt;/code&gt; initialization and returns&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-max-params/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useMaxParams&lt;/code&gt;&lt;/a&gt; - Enforces a maximum number of function parameters&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-useless-catch-binding/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noUselessCatchBinding&lt;/code&gt;&lt;/a&gt; - Reports useless catch binding parameters&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h4 id=&quot;style-rules&quot;&gt;Style Rules&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Promoted the following rules to the &lt;code dir=&quot;auto&quot;&gt;style&lt;/code&gt; group:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-consistent-arrow-return/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useConsistentArrowReturn&lt;/code&gt;&lt;/a&gt; - Enforces consistent return in arrow functions&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-jsx-literals/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noJsxLiterals&lt;/code&gt;&lt;/a&gt; - Reports literal strings in JSX&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;formatter&quot;&gt;Formatter&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;embedded-snippets-formatting&quot;&gt;Embedded Snippets Formatting&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Biome 2.4 can now format embedded CSS and GraphQL snippets within JavaScript files. See the &lt;a href=&quot;#embedded-snippets-in-javascript&quot;&gt;Embedded snippets in JavaScript&lt;/a&gt; section in Highlights for details and examples.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;trailing-newline-option&quot;&gt;Trailing Newline Option&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Added the formatter option &lt;a href=&quot;https://biomejs.dev/reference/configuration/#formattertrailingnewline&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;trailingNewline&lt;/code&gt;&lt;/a&gt;. When set to &lt;code dir=&quot;auto&quot;&gt;false&lt;/code&gt;, the formatter will remove the trailing newline at the end of formatted files. The default value is &lt;code dir=&quot;auto&quot;&gt;true&lt;/code&gt;, which preserves the current behavior.&lt;/p&gt;
&lt;p&gt;This option is available globally and for each language-specific formatter configuration:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;formatter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;trailingNewline&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;javascript&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;formatter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;trailingNewline&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;CLI flags are also available: &lt;code dir=&quot;auto&quot;&gt;--formatter-trailing-newline&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;--javascript-formatter-trailing-newline&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;--json-formatter-trailing-newline&lt;/code&gt;, etc.&lt;/p&gt;
&lt;aside aria-label=&quot;Caution&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Caution&lt;/p&gt;&lt;div&gt;&lt;p&gt;Setting &lt;code dir=&quot;auto&quot;&gt;trailingNewline&lt;/code&gt; to &lt;code dir=&quot;auto&quot;&gt;false&lt;/code&gt; can cause issues in certain environments and tools. Many POSIX-compliant tools and text editors expect files to end with a newline character. Removing the trailing newline may result in:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Warnings or errors from compilers and interpreters&lt;/li&gt;
&lt;li&gt;Issues with shell scripts that may not process the last line correctly&lt;/li&gt;
&lt;li&gt;Problems with version control systems showing unnecessary diff changes&lt;/li&gt;
&lt;li&gt;Incompatibility with coding standards that require POSIX-compliant text files&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;We recommend keeping the default value of &lt;code dir=&quot;auto&quot;&gt;true&lt;/code&gt; unless you have a specific requirement to remove trailing newlines.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h3 id=&quot;top-level-suppression-comments&quot;&gt;Top-Level Suppression Comments&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Added support for the top-level suppression comment &lt;code dir=&quot;auto&quot;&gt;biome-ignore-all format: &amp;#x3C;explanation&gt;&lt;/code&gt;. When placed at the beginning of the document, Biome won’t format the code.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;generated.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// biome-ignore-all format: generated&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;formatting-applied-with-code-fixes&quot;&gt;Formatting Applied with Code Fixes&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Formatting is now applied when applying safe/unsafe fixes via &lt;code dir=&quot;auto&quot;&gt;biome check&lt;/code&gt;. This ensures your code is properly formatted after applying automated fixes.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;css-parser-improvements&quot;&gt;CSS Parser Improvements&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;css-function-at-rule-support&quot;&gt;CSS &lt;code dir=&quot;auto&quot;&gt;@function&lt;/code&gt; At-Rule Support&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Added support for parsing and formatting the CSS &lt;code dir=&quot;auto&quot;&gt;@function&lt;/code&gt; at-rule from the &lt;a href=&quot;https://drafts.csswg.org/css-mixins-1/#function-rule&quot;&gt;CSS Mixins Module Level 1&lt;/a&gt; specification:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;styles.css&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;@function&lt;/span&gt;&lt;span&gt; --transparent(--color &amp;#x3C;color&gt;, --alpha &amp;#x3C;number&gt;: 0.5) returns &amp;#x3C;color&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;result: oklch(from var(--color&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;l c h&lt;/span&gt;&lt;span&gt; / &lt;/span&gt;&lt;span&gt;var(--alpha&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;css-modules-auto-detection&quot;&gt;CSS Modules Auto-Detection&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Biome now automatically enables CSS modules parsing for &lt;code dir=&quot;auto&quot;&gt;*.module.css&lt;/code&gt; files. If your codebase only uses &lt;code dir=&quot;auto&quot;&gt;*.module.css&lt;/code&gt; files, you can remove the manual parser configuration.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;css-properties-ordering-update&quot;&gt;CSS Properties Ordering Update&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Updated the CSS properties ordering to align with &lt;code dir=&quot;auto&quot;&gt;stylelint-config-recess-order&lt;/code&gt; v7.4.0, adding support for containment properties, font synthesis properties, ruby properties, color adjustment properties, view transitions properties, shapes properties, motion path properties, and more.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;css-module-syntax-in-vuesvelteastro&quot;&gt;CSS Module Syntax in Vue/Svelte/Astro&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Added support for parsing &lt;code dir=&quot;auto&quot;&gt;:global&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;:local&lt;/code&gt; inside &lt;code dir=&quot;auto&quot;&gt;.astro&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;.svelte&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;.vue&lt;/code&gt; files, in the &lt;code dir=&quot;auto&quot;&gt;&amp;#x3C;style&gt;&lt;/code&gt; portion of the file. This capability is only available when &lt;code dir=&quot;auto&quot;&gt;experimentalFullHtmlSupportEnabled&lt;/code&gt; is set to &lt;code dir=&quot;auto&quot;&gt;true&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;cli&quot;&gt;CLI&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;enhanced---skip-and---only-flags&quot;&gt;Enhanced &lt;code dir=&quot;auto&quot;&gt;--skip&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;--only&lt;/code&gt; Flags&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Added &lt;code dir=&quot;auto&quot;&gt;--only&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;--skip&lt;/code&gt; options to &lt;code dir=&quot;auto&quot;&gt;biome check&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;biome ci&lt;/code&gt;, covering both lint diagnostics and assist actions. You can now run or exclude specific:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lint rules&lt;/li&gt;
&lt;li&gt;Assist actions&lt;/li&gt;
&lt;li&gt;Groups of rules and actions&lt;/li&gt;
&lt;li&gt;Domains (including the new &lt;code dir=&quot;auto&quot;&gt;types&lt;/code&gt; domain)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Examples:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;check&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--only=suspicious/noDebugger&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;src/&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;.js&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ci&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--skip=project&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;src/&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lint&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--only=types&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# Run only type-based rules&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;multiple-reporters-and-reporter-output-to-files&quot;&gt;Multiple Reporters and Reporter Output to Files&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Biome 2.4 adds support for multiple reporters and the ability to save reporter output to arbitrary files.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;combine-multiple-reporters-in-ci&quot;&gt;Combine Multiple Reporters in CI&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;If you run Biome on GitHub, you can now use both the default reporter and the GitHub reporter:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ci&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--reporter=default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--reporter=github&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;save-reporter-output-to-a-file&quot;&gt;Save Reporter Output to a File&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;With the new &lt;code dir=&quot;auto&quot;&gt;--reporter-file&lt;/code&gt; CLI option, it’s now possible to save the output of all reporters to a file:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ci&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--reporter=rdjson&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--reporter-file=/etc/tmp/report.json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ci&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--reporter=summary&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--reporter-file=./reports/file.txt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You can combine these two features. For example, have the &lt;code dir=&quot;auto&quot;&gt;default&lt;/code&gt; reporter written on terminal, and the &lt;code dir=&quot;auto&quot;&gt;rdjson&lt;/code&gt; reporter written on file:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ci&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--reporter=default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--reporter=rdjson&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--reporter-file=/etc/tmp/report.json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;The &lt;code dir=&quot;auto&quot;&gt;--reporter&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;--reporter-file&lt;/code&gt; flags must appear next to each other.&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;new-sarif-reporter&quot;&gt;New SARIF Reporter&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Added a new reporter &lt;code dir=&quot;auto&quot;&gt;--reporter=sarif&lt;/code&gt;, that emits diagnostics using the &lt;a href=&quot;https://sarifweb.azurewebsites.net/&quot;&gt;SARIF&lt;/a&gt; format. This is particularly useful for integrating Biome with security and code quality platforms.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ci&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--reporter=sarif&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--reporter-file=biome-results.sarif&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;file-watcher-control&quot;&gt;File Watcher Control&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Added new CLI options to the commands &lt;code dir=&quot;auto&quot;&gt;lsp-proxy&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;start&lt;/code&gt; that allow control over the Biome file watcher:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;--watcher-kind&lt;/code&gt;&lt;/strong&gt; (env: &lt;code dir=&quot;auto&quot;&gt;BIOME_WATCHER_KIND&lt;/code&gt;): Controls how the Biome file watcher behaves. Options: &lt;code dir=&quot;auto&quot;&gt;recommended&lt;/code&gt; (default), &lt;code dir=&quot;auto&quot;&gt;polling&lt;/code&gt;, or &lt;code dir=&quot;auto&quot;&gt;none&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;--watcher-polling-interval&lt;/code&gt;&lt;/strong&gt; (env: &lt;code dir=&quot;auto&quot;&gt;BIOME_WATCHER_POLLING_INTERVAL&lt;/code&gt;): The polling interval in milliseconds when using &lt;code dir=&quot;auto&quot;&gt;polling&lt;/code&gt; mode (defaults to 2000ms).&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;enhanced-logging-options&quot;&gt;Enhanced Logging Options&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Revamped the logging options for all Biome commands. The commands &lt;code dir=&quot;auto&quot;&gt;format&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;lint&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;check&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;ci&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;search&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;lsp-proxy&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;start&lt;/code&gt; now accept consistent logging CLI options with environment variable aliases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;--log-file&lt;/code&gt; (env: &lt;code dir=&quot;auto&quot;&gt;BIOME_LOG_FILE&lt;/code&gt;) - Optional path/file to redirect log messages to&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;--log-prefix-name&lt;/code&gt; (env: &lt;code dir=&quot;auto&quot;&gt;BIOME_LOG_PREFIX_NAME&lt;/code&gt;) - Allows changing the prefix applied to the file name of the logs (daemon only)&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;--log-path&lt;/code&gt; (env: &lt;code dir=&quot;auto&quot;&gt;BIOME_LOG_PATH&lt;/code&gt;) - Allows changing the folder where logs are stored (daemon only)&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;--log-level&lt;/code&gt; (env: &lt;code dir=&quot;auto&quot;&gt;BIOME_LOG_LEVEL&lt;/code&gt;) - The level of logging: &lt;code dir=&quot;auto&quot;&gt;debug&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;info&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;warn&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;error&lt;/code&gt;, or &lt;code dir=&quot;auto&quot;&gt;none&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;--log-kind&lt;/code&gt; (env: &lt;code dir=&quot;auto&quot;&gt;BIOME_LOG_KIND&lt;/code&gt;) - What the log should look like&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;stacktrace-for-fatal-errors&quot;&gt;Stacktrace for Fatal Errors&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;It’s now possible to provide the stacktrace for a fatal error. The stacktrace is only available when the environment variable &lt;code dir=&quot;auto&quot;&gt;RUST_BACKTRACE=1&lt;/code&gt; is set:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;RUST_BACKTRACE&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lint&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;additional-features&quot;&gt;Additional Features&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;gritql-json-support&quot;&gt;GritQL JSON Support&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Added JSON as a target language for GritQL pattern matching. You can now write Grit plugins for JSON files, enabling:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Searching and transforming JSON configuration files&lt;/li&gt;
&lt;li&gt;Enforcing patterns in &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt; and other JSON configs&lt;/li&gt;
&lt;li&gt;Writing custom lint rules for JSON using GritQL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example patterns:&lt;/p&gt;
&lt;p&gt;Match all key-value pairs:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;pattern.grit&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;language json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;pair(key = $k, value = $v)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Match objects with specific structure:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;pattern.grit&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;language json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;JsonObjectValue()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Supports both native Biome AST names (&lt;code dir=&quot;auto&quot;&gt;JsonMember&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;JsonObjectValue&lt;/code&gt;) and TreeSitter-compatible names (&lt;code dir=&quot;auto&quot;&gt;pair&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;object&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;array&lt;/code&gt;) for compatibility with existing Grit patterns.&lt;/p&gt;
&lt;p&gt;For more details, see the &lt;a href=&quot;https://biomejs.dev/reference/gritql/&quot;&gt;GritQL documentation&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;lsp-and-editor-features&quot;&gt;LSP and Editor Features&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;lsp-progress-reporting&quot;&gt;LSP Progress Reporting&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;The Biome Language Server now reports progress while scanning files and dependencies in the project, providing better feedback during long-running operations.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;configuration-and-editor-support&quot;&gt;Configuration and Editor Support&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;cursor-files-support&quot;&gt;Cursor Files Support&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Added support for Cursor files. When Biome sees a Cursor JSON file, it will parse it with comments enabled and trailing commas enabled:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;$PROJECT/.cursor/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;%APPDATA%\Cursor\User\&lt;/code&gt; on Windows&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;~/Library/Application Support/Cursor/User/&lt;/code&gt; on macOS&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;~/.config/Cursor/User/&lt;/code&gt; on Linux&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;other-improvements&quot;&gt;Other Improvements&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;vue-sfc-css-syntax-support&quot;&gt;Vue SFC CSS Syntax Support&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;The Biome CSS parser is now able to parse Vue SFC syntax such as &lt;code dir=&quot;auto&quot;&gt;:slotted&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;:deep&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;v-bind()&lt;/code&gt;. These pseudo-functions and directives are only correctly parsed when the CSS is defined inside &lt;code dir=&quot;auto&quot;&gt;.vue&lt;/code&gt; components.&lt;/p&gt;
&lt;p&gt;This capability is only available when &lt;code dir=&quot;auto&quot;&gt;experimentalFullHtmlSupportEnabled&lt;/code&gt; is set to &lt;code dir=&quot;auto&quot;&gt;true&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;e18e-eslint-plugin-support&quot;&gt;e18e ESLint Plugin Support&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Added e18e ESLint plugin as a recognized rule source. Six Biome rules now reference their e18e equivalents: &lt;code dir=&quot;auto&quot;&gt;useAtIndex&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;useExponentiationOperator&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;noPrototypeBuiltins&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;useDateNow&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;useSpread&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;useObjectSpread&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;more-improvements&quot;&gt;More Improvements&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;In addition to the features highlighted above, Biome 2.4 includes numerous bug fixes, performance improvements, and smaller enhancements across the toolchain. For a complete list of changes, refer to the &lt;a href=&quot;https://biomejs.dev/internals/changelog/version/2-4-0/&quot;&gt;changelog page&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;i-like-where-this-is-going-how-can-i-help&quot;&gt;I like where this is going, how can I help?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;I want to remind you that Biome is a project led by volunteers who like programming, open-source, and embrace the Biome philosophy, so any help is welcome.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;translations&quot;&gt;Translations&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;If you are familiar with Biome and would like to contribute to its outreach, you can assist us by translating the website into your native language. In this &lt;a href=&quot;https://biomejs.dev/i18n-dashboard/&quot;&gt;dashboard&lt;/a&gt;, you can check the supported languages and if they are up-to-date.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;chat-with-us&quot;&gt;Chat with us&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Join our &lt;a href=&quot;https://biomejs.dev/chat&quot;&gt;Discord server&lt;/a&gt;, and engage with the community. Chatting with the community and being part of the community is a form of contribution.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;code-contributions&quot;&gt;Code contributions&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;If you like the technical aspects of the project, and you want to make your way into the Rust language, or practice your knowledge around parsers, compilers, analysers, etc., Biome is the project for you!&lt;/p&gt;
&lt;p&gt;There are numerous aspects to explore; I assure you that you won’t get bored. Here is a small list of the things you can start with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create new lint rules! We have so many rules that we haven’t implemented yet (ESLint, ESLint plugins, Next.js, Solid, etc.). We have a very &lt;a href=&quot;https://github.com/biomejs/biome/blob/main/crates/biome_analyze/CONTRIBUTING.md&quot;&gt;extensive technical guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/biomejs/biome/blob/main/crates/biome_parser/CONTRIBUTING.md&quot;&gt;Help&lt;/a&gt; &lt;a href=&quot;https://github.com/biomejs/biome/tree/main/crates/biome_yaml_parser&quot;&gt;building&lt;/a&gt; &lt;a href=&quot;https://github.com/biomejs/biome/tree/main/crates/biome_html_parser&quot;&gt;Biome&lt;/a&gt; &lt;a href=&quot;https://github.com/biomejs/biome/tree/main/crates/biome_markdown_parser&quot;&gt;parsers&lt;/a&gt;!
One interesting fact about Biome parsers is that they are recoverable parsers &lt;a href=&quot;https://biomejs.dev/internals/architecture/#parser-and-cst&quot;&gt;error resilient&lt;/a&gt; which emit a &lt;a href=&quot;https://en.wikipedia.org/wiki/Parse_tree&quot;&gt;CST&lt;/a&gt; instead of a classic AST.&lt;/li&gt;
&lt;li&gt;Implement new capabilities in our &lt;a href=&quot;https://github.com/biomejs/biome/tree/main/crates/biome_lsp&quot;&gt;LSP (Language Server Protocol)&lt;/a&gt;, or add new features in one of our editor extensions: &lt;a href=&quot;https://github.com/biomejs/biome-vscode&quot;&gt;VS Code&lt;/a&gt;, &lt;a href=&quot;https://github.com/biomejs/biome-zed&quot;&gt;Zed&lt;/a&gt; and &lt;a href=&quot;https://github.com/biomejs/biome-intellij&quot;&gt;JetBrains IntelliJ&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;financial-help&quot;&gt;Financial help&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;If you believe in the future of the project, you can also help with a financial contribution, via &lt;a href=&quot;https://opencollective.com/biome&quot;&gt;Open Collective&lt;/a&gt; or &lt;a href=&quot;https://github.com/sponsors/biomejs&quot;&gt;GitHub Sponsors&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Additionally, the project provides an &lt;a href=&quot;https://biomejs.dev/enterprise&quot;&gt;enterprise support program &lt;/a&gt; where you as a company can employ one of the core contributors to work a specific aspect of the Biome toolchain.&lt;/p&gt;</content:encoded></item><item><title>Roadmap 2026</title><link>https://biomejs.dev/blog/roadmap-2026/</link><guid isPermaLink="true">https://biomejs.dev/blog/roadmap-2026/</guid><description>What to expect from Biome in 2026, and what Biome has achieved in 2025.

</description><pubDate>Wed, 21 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;In this article, we want to share with you all our roadmap for 2026!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The roadmap is a collection of ideas and interests that the maintainers of the project collect from various sources: user’s feedback, personal interests, time available to dedicate to the project, user’s proposal from GitHub discussions.&lt;/p&gt;
&lt;p&gt;The roadmap represents the overall direction that we want to take; however, things can change overtime.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;2025-achievements&quot;&gt;2025 achievements&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;We shipped Biome v2, which brought amazing new features to the ecosystem:
&lt;ul&gt;
&lt;li&gt;Support for nested configuration files, and better support in monorepos.&lt;/li&gt;
&lt;li&gt;First tool to ship type-aware lint rules that don’t rely on the TypeScript compiler (commonly known as &lt;code dir=&quot;auto&quot;&gt;tsc&lt;/code&gt;), thanks to its inference engine, &lt;a href=&quot;https://biomejs.dev/blog/vercel-partners-biome-type-inference/&quot;&gt;sponsored by Vercel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Support for project lint rules, such as &lt;a href=&quot;https://biomejs.dev/linter/rules/no-import-cycles/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noImportCycle&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Shipped the new concept of &lt;a href=&quot;https://biomejs.dev/linter/domains&quot;&gt;linter domains&lt;/a&gt;, a way to group different rules under different umbrellas, and a way to turn on those rules automatically based on your dependencies.&lt;/li&gt;
&lt;li&gt;Added support for plugins via &lt;a href=&quot;https://docs.grit.io/&quot;&gt;GritQL&lt;/a&gt;. Throughout the year the plugin engine has become even more powerful, allowing users to &lt;strong&gt;query the Biome CST&lt;/strong&gt; and report custom diagnostics.&lt;/li&gt;
&lt;li&gt;Shipped the new &lt;a href=&quot;https://biomejs.dev/assist/actions/organize-imports/&quot;&gt;JavaScript import and export organizer&lt;/a&gt; that provides advanced features like import merging, and custom import groups.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;We shipped &lt;strong&gt;three new minors&lt;/strong&gt; after v2, which have added many new features:
&lt;ul&gt;
&lt;li&gt;Support for Tailwind syntax in CSS files&lt;/li&gt;
&lt;li&gt;Experimental full support of parsing, formatting, linting for Vue, Svelte, and Astro. The language capabilities of Biome have improved and allow them to inspect multiple languages in the same document.&lt;/li&gt;
&lt;li&gt;We improved and fixed many bugs around the Biome watcher and scanner. Some of those bugs caused some memory leaks, causing Biome to be unusable for some users.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://depot.dev&quot;&gt;Depot&lt;/a&gt; has become a platinum sponsor.&lt;/li&gt;
&lt;li&gt;We have surpassed &lt;a href=&quot;https://www.npmcharts.com/compare/@biomejs/biome?interval=30&quot;&gt;15 million monthly downloads&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;GritQL has now become part of the &lt;a href=&quot;https://biomejs.dev/blog/gritql-under-biome-umbrella/&quot;&gt;Biome&lt;/a&gt; &lt;a href=&quot;https://github.com/biomejs/gritql&quot;&gt;organization&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;past-mistakes&quot;&gt;Past mistakes&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Of course, Biome and team are far from being perfect, so we want to acknowledge some of our past mistakes that we hope to address this year. We want to address them moving forward.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;monorepo-out-of-the-box&quot;&gt;Monorepo out of the box&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Biome is able to discover nested ignore files and nested configuration files out of the box, without any particular configuration. While this provides an optimal DX, it uncovered some undesired situations where memory leaks get out of hand. Also, in some cases, users don’t have enough control over the folders that are real libraries.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;difficult-to-debug&quot;&gt;Difficult to debug&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;With so many features, we overlooked the debugging capabilities of the tool. With the rise of tools such as &lt;code dir=&quot;auto&quot;&gt;ultracite&lt;/code&gt;, big monorepos, &lt;code dir=&quot;auto&quot;&gt;overrides&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;extends&lt;/code&gt;, and more, it has become difficult to understand and debug a complex configuration file. This is frustrating for both maintainers and users.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;poor-communication&quot;&gt;Poor communication&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Later last year, we announced the experimental full support of Vue, Svelte, and Astro. Many users weren’t happy about how we framed the announcement, especially after some users rightfully complained about the poor support of the Svelte files.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;2026-roadmap&quot;&gt;2026 roadmap&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;I can’t stress enough that Biome is a community-driven project, all the features we want to implement are driven by our passions and needs. We can’t promise that all of these features will be implemented. Alas, we will try our best to stay aligned and deliver what’s listed below.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;JavaScript embedded languages&lt;/strong&gt;: improve the DX of the embedded languages in JavaScript, such as CSS and GraphQL.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stabilize everything around HTML&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improve HTML formatting so that its formatting matches Prettier’s as much as possible.&lt;/li&gt;
&lt;li&gt;Enhance existing lint rules so that they work for HTML-ish languages too, notably Vue, Svelte, and Astro&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cross-language lint rules&lt;/strong&gt;: we want to explore and deliver lint rules that work across languages. Now that Biome has the infrastructure to do so, we might be able to achieve it. What’s a cross-language lint rule, you ask? Here’s an example: have you ever discovered a CSS class not used anywhere? What if there was a lint rule able to discover all your CSS styles, and check if they are actually used inside JSX/HTML-ish files? That’s where a cross-language lint rule comes into play!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Opt-in, improved &lt;code dir=&quot;auto&quot;&gt;workspaces&lt;/code&gt;&lt;/strong&gt;: this is mostly an idea, but we want to address the &lt;a href=&quot;#monorepo-out-of-the-box&quot;&gt;poor DX introduced by monorepo-out-the-box&lt;/a&gt;, by making it opt-in and offer better control. For example, we envision a solution where the configuration might look like this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;workspaces&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;packages/*&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;utilities/*&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;With a configuration like this, Biome knows where to look for possible nested configuration files. We believe a solution like this &lt;strong&gt;might improve the DX and the performance of the tool&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SCSS support&lt;/strong&gt;: we want to ship SCSS support. It was our &lt;a href=&quot;https://github.com/biomejs/biome/discussions/3441&quot;&gt;most wanted&lt;/a&gt;. We recently closed it, and started the works.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;More lint rules and assist actions&lt;/strong&gt;: keep shipping new lint rules, and assist actions. We recently started implementing &lt;a href=&quot;https://github.com/biomejs/biome/issues/8155&quot;&gt;Accessibility lint rules for HTML-ish languages&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Improve LSP features&lt;/strong&gt;: we want to explore and ship more LSP features. Internally, Biome has a module graph that can analyze and link with each other different files, such as JavaScript, CSS, and more. We want to explore and ship more IDE capabilities, such as the ability to highlight a reference such as a CSS class inside a JSX snippet, and allow users to navigate to its declaration inside the CSS file with a click.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stabilize YAML&lt;/strong&gt;: our YAML parser is almost ready! Once the parsing is stable enough, formatting is just right there.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;markdown&quot;&gt;Markdown&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;We really wish to implement the parsing of Markdown; however, we don’t have enough time and resources to look into it. If there’s someone who wishes to help, please let us know on &lt;a href=&quot;https://biomejs.dev/chat&quot;&gt;Discord&lt;/a&gt;! We’re looking for &lt;strong&gt;a champion&lt;/strong&gt; who would help with the implementation &lt;strong&gt;and the reviews&lt;/strong&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;can-i-help-move-biomes-roadmap-forward&quot;&gt;Can I help move Biome’s roadmap forward?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;We’re glad you asked! Biome is a project led by volunteers who like programming, open-source, and who embrace the Biome philosophy, so any help is welcome 😁&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;chat-with-us&quot;&gt;Chat with us&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Join our &lt;a href=&quot;https://biomejs.dev/chat&quot;&gt;Discord server&lt;/a&gt;, and engage with the community. You may always ask around if there’s something you can help with.&lt;/p&gt;
&lt;p&gt;We also have a &lt;a href=&quot;https://github.com/biomejs/biome/issues/2463&quot;&gt;GitHub umbrella issue&lt;/a&gt; that you can check out, but please be cautious to not start any work until you’ve engaged with the community first. This way we can be mindful of your contributions too.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;financial-help&quot;&gt;Financial help&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;If you believe in the long-term vision of Biome, you can also help with a financial contribution, via &lt;a href=&quot;https://opencollective.com/biome&quot;&gt;Open Collective&lt;/a&gt; or &lt;a href=&quot;https://github.com/sponsors/biomejs&quot;&gt;GitHub Sponsors&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Additionally, the project provides an &lt;a href=&quot;https://biomejs.dev/enterprise&quot;&gt;enterprise support program&lt;/a&gt; that companies can use to contract a core contributor to work on a specific aspect of the Biome toolchain.&lt;/p&gt;</content:encoded></item><item><title>GritQL accepted by the Biome organisation</title><link>https://biomejs.dev/blog/gritql-under-biome-umbrella/</link><guid isPermaLink="true">https://biomejs.dev/blog/gritql-under-biome-umbrella/</guid><description>GritQL has been in use by Biome as our preferred plugin language for a while now. As of today, we are happy to announce that GritQL comes under the Biome umbrella.

</description><pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today, we are happy and grateful to make a special announcement regarding the continuation of &lt;a href=&quot;https://docs.grit.io/&quot;&gt;GritQL&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Some observant members of the Biome and GritQL communities may have already spotted that something big was happening behind the scenes: Biome is now the proud owner of the &lt;a href=&quot;https://github.com/orgs/biomejs/repositories?q=gritql&quot;&gt;GritQL repositories&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ever since Biome 2.0, GritQL plugins have been supported as a mechanism to add custom linter rules to your project. We took a big gamble here, as GritQL was being pioneered by a startup led by &lt;a href=&quot;https://github.com/morgante&quot;&gt;Morgante Pell&lt;/a&gt; and the future of the language was still uncertain.&lt;/p&gt;
&lt;p&gt;We took a leap of faith, because we believed in Morgante’s vision of how GritQL can make plugin writing more intuitive for our end users. The expressive power of GritQL makes it so that end users can intuitively understand how to write plugins, even if they’re not familiar with the internals of AST structures themselves.&lt;/p&gt;
&lt;p&gt;When &lt;a href=&quot;https://www.honeycomb.io/&quot;&gt;Honeycomb&lt;/a&gt; acquired Grit earlier this year, and the future of the language looked unclear, it appeared our gamble was coming back to bite us. But thankfully, we’re excited to share that Morgante and Honeycomb have graciously agreed to donate the GritQL repositories to Biome.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;so-does-that-mean-biome-is-now-responsible-for-the-development-of-gritql&quot;&gt;So, does that mean Biome is now responsible for the development of GritQL?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Yes, it does.&lt;/p&gt;
&lt;p&gt;But Morgante’s gift came with something even more precious: he personally joined the Biome maintainers team. From under the Biome umbrella, he can continue working on GritQL and our plugin infrastructure as he sees fit.&lt;/p&gt;
&lt;p&gt;Please keep in mind that all Biome maintainers are volunteers, as most of us work on Biome in our free time. We have a respectful community that understands this, and this is something we continue to treasure.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-does-this-mean-for-biomes-plugin-infrastructure-concretely&quot;&gt;What does this mean for Biome’s plugin infrastructure, concretely?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;It’s hard to say exactly.&lt;/p&gt;
&lt;p&gt;Early 2024, we drafted our initial &lt;a href=&quot;https://github.com/biomejs/biome/discussions/1762&quot;&gt;Plugin Proposal RFC&lt;/a&gt;.  The release of Biome 2.0 in June 2025 saw the first realisation of Biome’s vision in the form of GritQL linter plugins. That leaves a lot of work on the table still, but as usual we’ll keep you posted.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;where-does-this-leave-javascripttypescript-plugins&quot;&gt;Where does this leave JavaScript/TypeScript plugins?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;We do recognise that not everyone likes writing plugins using GritQL.&lt;/p&gt;
&lt;p&gt;As the RFC mentioned, we also intend to work towards support for JS/TS plugins too. This August, we &lt;a href=&quot;https://github.com/biomejs/biome/pull/7300&quot;&gt;integrated&lt;/a&gt; &lt;a href=&quot;https://boajs.dev/&quot;&gt;Boa&lt;/a&gt; as a JavaScript interpreter that we can integrate into Biome. Back in 2024, Morgante also proposed a &lt;a href=&quot;https://github.com/biomejs/gritql/discussions/403&quot;&gt;TypeScript API&lt;/a&gt; for GritQL so that users may or may not be able to use both forms of plugin functionality together. We don’t know how this will pan out yet, but hopefully with Morgante’s commitment, some of the work may speed up a bit.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;can-i-help-move-biomes-plugin-efforts-forward&quot;&gt;Can I help move Biome’s plugin efforts forward?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;We’re glad you asked! Biome is a project led by volunteers who like programming, open-source, and who embrace the Biome philosophy, so any help is welcome 😁&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;chat-with-us&quot;&gt;Chat with us&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Join our &lt;a href=&quot;https://biomejs.dev/chat&quot;&gt;Discord server&lt;/a&gt;, and engage with the community. We have a dedicated &lt;code dir=&quot;auto&quot;&gt;#plugins&lt;/code&gt; channel that can be used for this purpose. You may always ask around if there’s something you can help with.&lt;/p&gt;
&lt;p&gt;We also have a &lt;a href=&quot;https://github.com/biomejs/biome/issues/2463&quot;&gt;GitHub umbrella issue&lt;/a&gt; that you can check out, but please be cautious to not start any work until you’ve engaged with the community first. This way we can be mindful of your contributions too.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;financial-help&quot;&gt;Financial help&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;If you believe in the long-term vision of Biome, you can also help with a financial contribution, via &lt;a href=&quot;https://opencollective.com/biome&quot;&gt;Open Collective&lt;/a&gt; or &lt;a href=&quot;https://github.com/sponsors/biomejs&quot;&gt;GitHub Sponsors&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Additionally, the project provides an &lt;a href=&quot;https://biomejs.dev/enterprise&quot;&gt;enterprise support program&lt;/a&gt; that companies can use to contract a core contributor to work on a specific aspect of the Biome toolchain.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;acknowledgements&quot;&gt;Acknowledgements&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Thanks again to both Morgante and Honeycomb for making this possible! And another round of thanks for our amazing community whom we are enjoying so much trust from! 💗&lt;/p&gt;</content:encoded></item><item><title>Depot becomes Biome&apos;s exclusive platinum sponsor</title><link>https://biomejs.dev/blog/depot-exclusive-sponsor/</link><guid isPermaLink="true">https://biomejs.dev/blog/depot-exclusive-sponsor/</guid><description>Depot has been sponsoring Biome for a while now, by providing fast and reliable GitHub Action runners for the whole organisation. Pull requests have seen quicker feedback and our releases have been way faster.

</description><pubDate>Mon, 01 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As of today, we’re happy to announce that &lt;a href=&quot;https://depot.dev&quot;&gt;Depot&lt;/a&gt; has become &lt;strong&gt;Biome’s exclusive platinum sponsor&lt;/strong&gt;!&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;biome-by-the-numbers&quot;&gt;Biome by the numbers&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Biome is a &lt;strong&gt;big Rust project&lt;/strong&gt;, that keeps growing over time. As of 17 November (time of writing of the blog post), the project has the following stats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A total of 90 internal crates (AKA &lt;code dir=&quot;auto&quot;&gt;biome_*&lt;/code&gt; crates) that are compiled and shipped in production.&lt;/li&gt;
&lt;li&gt;~651,971 lines of code between production code and test code.&lt;/li&gt;
&lt;li&gt;~3,217 Rust files, between production code and test code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Since Rust is a compiled language, with complex syntax, the resources required for compilation, testing, etc. are bound to increase over time. Before Depot came to the rescue, Biome used to use GitHub Action runners. Here’s a few numbers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linting for pull requests took around ~15 minutes.&lt;/li&gt;
&lt;li&gt;Tests for pull requests took around ~20 minutes.&lt;/li&gt;
&lt;li&gt;Benchmarks for pull requests took around ~30 minutes. Benchmarks take longer because the code is compiled in production mode, and we make sure to stress test
our infrastructure by feeding the benchmarks very complex inputs.&lt;/li&gt;
&lt;li&gt;A release might have required up to ~45 minutes.&lt;/li&gt;
&lt;li&gt;At some point, Biome on Windows couldn’t compile due to the memory required, which exceeded the memory available in the GitHub Actions runners.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;enter-depot&quot;&gt;Enter Depot&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;I discovered Depot by chance on social media. Someone thanked them for sponsoring their Rust project, so I reached out to see if they’d be willing to sponsor Biome. &lt;a href=&quot;https://github.com/jacobwgillespie&quot;&gt;Jacob Gillespie&lt;/a&gt;, CTO and Co-Founder at Depot, was incredibly responsive and eager to support us.&lt;/p&gt;
&lt;p&gt;Depot started sponsoring Biome’s GitHub infrastructure months ago as a gold sponsor. With their faster &lt;a href=&quot;https://depot.dev/docs/github-actions/overview&quot;&gt;GitHub Actions runners&lt;/a&gt;, our workflows saw dramatic improvements:&lt;/p&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Workflow&lt;/th&gt;&lt;th&gt;Before (GitHub runners)&lt;/th&gt;&lt;th&gt;After (Depot)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Linting&lt;/td&gt;&lt;td&gt;~15 minutes&lt;/td&gt;&lt;td&gt;~2 minutes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tests&lt;/td&gt;&lt;td&gt;~20 minutes&lt;/td&gt;&lt;td&gt;~4 minutes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Benchmarks&lt;/td&gt;&lt;td&gt;~30 minutes&lt;/td&gt;&lt;td&gt;~15 minutes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Releases&lt;/td&gt;&lt;td&gt;~45 minutes&lt;/td&gt;&lt;td&gt;~25 minutes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;&lt;h2 id=&quot;depots-impact-on-the-ecosystem&quot;&gt;Depot’s impact on the ecosystem&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;These aren’t just numbers. Having a faster CI has had a significant &lt;strong&gt;positive impact&lt;/strong&gt; to maintainers, contributors and end-users.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;maintainers&quot;&gt;Maintainers&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;We’ve seen positive outcomes throughout the entire project management process. We’re able to get faster feedback from our CI jobs, release more frequently and with more confidence, and we can fix CI issues faster. As you know, CI is a &lt;a href=&quot;https://www.urbandictionary.com/define.php?term=Yolo&quot;&gt;YOLO&lt;/a&gt; practice!&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;contributors&quot;&gt;Contributors&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Contributors can see the effect of their PRs way faster than before, and they can fix possible bugs promptly. This means that by the time a maintainer comes and reviews the PR, it might be approved already because the CI is green! One reason why we’re able to ship so many fixes in every patch release.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;end-users&quot;&gt;End-users&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;End-users - you, the developers - can enjoy that fix you needed sooner than before!&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;depots-endorsement&quot;&gt;Depot’s endorsement&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;As Vercel did before, Depot believes that &lt;a href=&quot;https://biomejs.dev/blog/vercel-partners-biome-type-inference/&quot;&gt;Biome’s inference engine&lt;/a&gt; can and will improve the developer experience even further.&lt;/p&gt;
&lt;p&gt;Depot believes in Biome’s mission, a unified toolchain where users can think less about their tools and dependencies, and more about building their own software using modern practices.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thank you, Depot!&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;i-like-where-this-is-going-how-can-i-help&quot;&gt;I like where this is going, how can I help?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;I want to remind you that Biome is a project led by volunteers who like programming, open-source, and embrace the Biome philosophy, so any help is welcome 😁&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;translations&quot;&gt;Translations&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;If you are familiar with Biome and would like to contribute to its outreach, you can assist us by translating the website into your native language. In this &lt;a href=&quot;https://biomejs.dev/i18n-dashboard/&quot;&gt;dashboard&lt;/a&gt;, you can check the supported languages and if they are up to date.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;chat-with-us&quot;&gt;Chat with us&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Join our &lt;a href=&quot;https://biomejs.dev/chat&quot;&gt;Discord server&lt;/a&gt;, and engage with the community. Chatting with the community and being part of the community is a form of contribution.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;code-contributions&quot;&gt;Code contributions&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;If you like the technical aspects of the project, and you want to make your way into the Rust language, or you wish to practice your knowledge around parsers, compilers, analysers, etc., Biome is the project that does for you!&lt;/p&gt;
&lt;p&gt;There are numerous aspects to explore; I assure you that you won’t get bored. Here is a small list of the things you can start with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create new lint rules! We have so many rules that we haven’t implemented yet (ESLint, ESLint plugins, Next.js, Solid, etc.). We have a very &lt;a href=&quot;https://github.com/biomejs/biome/blob/main/crates/biome_analyze/CONTRIBUTING.md&quot;&gt;extensive technical guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/biomejs/biome/blob/main/crates/biome_parser/CONTRIBUTING.md&quot;&gt;Help&lt;/a&gt; &lt;a href=&quot;https://github.com/biomejs/biome/tree/main/crates/biome_yaml_parser&quot;&gt;building&lt;/a&gt; &lt;a href=&quot;https://github.com/biomejs/biome/tree/main/crates/biome_html_parser&quot;&gt;Biome&lt;/a&gt; &lt;a href=&quot;https://github.com/biomejs/biome/tree/main/crates/biome_markdown_parser&quot;&gt;parsers&lt;/a&gt;!
One interesting fact about Biome parsers is that they are recoverable parsers &lt;a href=&quot;https://biomejs.dev/internals/architecture/#parser-and-cst&quot;&gt;error resilient&lt;/a&gt; which emit a &lt;a href=&quot;https://en.wikipedia.org/wiki/Parse_tree&quot;&gt;CST&lt;/a&gt; instead of a classic AST.&lt;/li&gt;
&lt;li&gt;Implement new capabilities in our &lt;a href=&quot;https://github.com/biomejs/biome/tree/main/crates/biome_lsp&quot;&gt;LSP (Language Server Protocol)&lt;/a&gt;, or add new features in one of our editor extensions: &lt;a href=&quot;https://github.com/biomejs/biome-vscode&quot;&gt;VS Code&lt;/a&gt;, &lt;a href=&quot;https://github.com/biomejs/biome-zed&quot;&gt;Zed&lt;/a&gt; and &lt;a href=&quot;https://github.com/biomejs/biome-intellij&quot;&gt;JetBrains IntelliJ&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h4 id=&quot;financial-help&quot;&gt;Financial help&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;If you believe in the future of the project, you can also help with a financial contribution, via &lt;a href=&quot;https://opencollective.com/biome&quot;&gt;Open Collective&lt;/a&gt; or &lt;a href=&quot;https://github.com/sponsors/biomejs&quot;&gt;GitHub Sponsors&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Additionally, the project provides an &lt;a href=&quot;https://biomejs.dev/enterprise&quot;&gt;enterprise support program&lt;/a&gt; that allows companies to employ one of the core contributors to work on a specific aspect of the Biome toolchain.&lt;/p&gt;</content:encoded></item><item><title>Biome v2.3—Let&apos;s bring the ecosystem closer</title><link>https://biomejs.dev/blog/biome-v2-3/</link><guid isPermaLink="true">https://biomejs.dev/blog/biome-v2-3/</guid><description>Biome 2.3 brings full support (experimental) for Vue, Svelte and Astro, new syntax to ignore paths, new CLI flags, new formatting options, new reporters and more.

</description><pubDate>Tue, 07 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We’re excited to announce the release of Biome 2.3, bringing several features that have been highly requested by the community. This release marks a significant milestone in our journey to support the broader web ecosystem.&lt;/p&gt;
&lt;p&gt;Once you have upgraded to Biome v2.3.0, migrate your Biome configuration to the new version by running the &lt;code dir=&quot;auto&quot;&gt;migrate&lt;/code&gt; command:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;migrate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--write&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;full-support-for-vue-svelte-and-astro&quot;&gt;Full support for Vue, Svelte, and Astro&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Biome 2.3 introduces full support for Vue, Svelte, and Astro files. This means you can now format and lint the JavaScript and TypeScript code inside &lt;code dir=&quot;auto&quot;&gt;&amp;#x3C;script&gt;&lt;/code&gt; tags, as well as the CSS inside &lt;code dir=&quot;auto&quot;&gt;&amp;#x3C;style&gt;&lt;/code&gt; tags in these frameworks. The HTML/template portions of these files are also parsed and formatted according to Biome’s HTML formatting rules.&lt;/p&gt;
&lt;p&gt;This achievement wouldn’t have been possible without the great efforts of &lt;span&gt; &lt;span&gt;Core Contributor&lt;/span&gt; &lt;a href=&quot;https://github.com/ematipico&quot; title=&quot;Member @ematipico&quot;&gt; &lt;img src=&quot;https://biomejs.dev/_astro/ematipico_1yuKlk.webp?dpl=69d3d5158d55f30009c8158f&quot; alt=&quot;Member @ematipico&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;25&quot; height=&quot;25&quot;&gt; &lt;span&gt;@ematipico&lt;/span&gt; &lt;/a&gt; &lt;/span&gt;  and &lt;span&gt; &lt;span&gt;Core Contributor&lt;/span&gt; &lt;a href=&quot;https://github.com/dyc3&quot; title=&quot;Member @dyc3&quot;&gt; &lt;img src=&quot;https://biomejs.dev/_astro/dyc3_2jNgdt.webp?dpl=69d3d5158d55f30009c8158f&quot; alt=&quot;Member @dyc3&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;25&quot; height=&quot;25&quot;&gt; &lt;span&gt;@dyc3&lt;/span&gt; &lt;/a&gt; &lt;/span&gt; .&lt;/p&gt;
&lt;p&gt;This is a feature that many developers have been asking for, and we’re thrilled to finally deliver it. Achieving this has had its challenges, and it required extensive trials to get the architecture right based on the constraints of the toolchain.&lt;/p&gt;
&lt;p&gt;However, this feature is marked as &lt;strong&gt;experimental&lt;/strong&gt; for several important reasons. First, these frameworks have their own specific syntaxes and idioms that extend beyond standard HTML, CSS, and JavaScript. While we’ve done extensive work to handle many patterns, there are cases and framework-specific syntaxes that may not yet be fully supported (for example Svelte control-flow syntax, or Astro JSX-like syntax). We encourage you to avail of this new feature, and fine-tune it based on your needs and possible limitations found.&lt;/p&gt;
&lt;p&gt;Please open a discussion if you find something that hasn’t been implemented, or an issue if there’s a parsing error that should be handled correctly.&lt;/p&gt;
&lt;p&gt;To enable the feature, you’ll have to opt in the new &lt;code dir=&quot;auto&quot;&gt;html.experimentalFullSupportEnabled&lt;/code&gt; option:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;html&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;ins&gt;&lt;span&gt;experimentalFullSupportEnabled&lt;/span&gt;&lt;/ins&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;aside aria-label=&quot;Note&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;We plan to fade out this option and make it the default. The option will be removed once the HTML parser becomes stable and supports more language-specific features.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h3 id=&quot;script-and-style-indentation&quot;&gt;Script and style indentation&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Additionally, you can configure specific formatting options for HTML content, such as whether to indent the content of &lt;code dir=&quot;auto&quot;&gt;&amp;#x3C;script&gt;&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;&amp;#x3C;style&gt;&lt;/code&gt; tags:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;html&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;formatter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;ins&gt;&lt;span&gt;indentScriptAndStyle&lt;/span&gt;&lt;/ins&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;file.vue&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;setup&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lang&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;ts&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;foo&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;bar&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;foo&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;bar&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;file.svelte&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;lang&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;ts&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;foo&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;bar&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;foo&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;bar&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;file.astro&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;foo&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;bar&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;foo&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;bar&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;By default, &lt;code dir=&quot;auto&quot;&gt;indentScriptAndStyle&lt;/code&gt; is set to &lt;code dir=&quot;auto&quot;&gt;false&lt;/code&gt; to match Prettier’s behavior.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;possible-inconsistencies&quot;&gt;Possible inconsistencies&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;With this release, we step into something new that needs to be addressed and discussed. In Biome you can configure each language as you see fit, which means that a project &lt;em&gt;might end up with different formatting (as example)&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In the following configuration file, JavaScript files are formatted using double quotes, while CSS files are formatted using single quotes.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;html&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;formatter&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;experimentalFullSupportEnabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;javascript&quot;&lt;/span&gt;&lt;span&gt; : {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;formatter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;quoteStyle&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;double&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;css&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;formatter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;quoteStyle&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;single&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Why would someone want that? That’s not for us to answer, however with a configuration like this you would end with &lt;strong&gt;different quotes inside your HTML-ish files&lt;/strong&gt;.
This could cause inconsistencies inside the same. We created a &lt;a href=&quot;https://github.com/biomejs/biome/discussions/7754&quot;&gt;GitHub discussion&lt;/a&gt; to understand if this is a problem, and if so, how Biome should solve it. Please let us know what do you think.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;new-ignore-syntax&quot;&gt;New ignore syntax&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Biome 2.3 introduces a refined syntax for ignoring paths in your project, addressing important problems that arose since the introduction of multi file analysis and TypeScript inference.&lt;/p&gt;
&lt;p&gt;When Biome 2.0 came out, we internally introduced the concept of “paths being indexed”. When a path is indexed, Biome parses it and updates the module graph and the type inference, if enabled.&lt;/p&gt;
&lt;p&gt;However, we slowly came to the realization that multi-file analysis and type inference are very complex problems that can get out of hand easily.&lt;/p&gt;
&lt;p&gt;For example, type inference can enter a very nasty loop where tons of types are recursively indexed, consuming a lot of memory.&lt;/p&gt;
&lt;p&gt;As for multi-file analysis, the &lt;code dir=&quot;auto&quot;&gt;node_modules/&lt;/code&gt; folder can be a rabbit hole, full of symbolic links with high depths and path names that exceed the maximum allowed characters.&lt;/p&gt;
&lt;p&gt;Solving these complex problems takes time, a lot of testing and patience from us and the community. With this new syntax, users have now more control over what Biome can and can’t do.&lt;/p&gt;
&lt;p&gt;With this release, two syntaxes are now available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;!&lt;/code&gt; (single exclamation mark): Ignores the path from linting and formatting, but still allows it to be indexed by the type system. This is useful for generated files or third-party code that you don’t want to format or lint, but still need for type inference and imports.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;!!&lt;/code&gt; (double exclamation mark): Completely ignores the path from all Biome operations, including type indexing. This is useful for files that should be entirely excluded from Biome’s analysis, such as &lt;code dir=&quot;auto&quot;&gt;dist/&lt;/code&gt; folders.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This distinction is particularly important when working with TypeScript projects that rely on type inference from dependencies or generated code. By using &lt;code dir=&quot;auto&quot;&gt;!&lt;/code&gt;, you can exclude these files from formatting and linting while still maintaining correct type information across your project.&lt;/p&gt;
&lt;p&gt;Here’s an example configuration:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;files&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;includes&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;!**/generated&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;ins&gt;&lt;span&gt;!!&lt;/span&gt;&lt;/ins&gt;&lt;span&gt;**/dist&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;In this configuration, files in the &lt;code dir=&quot;auto&quot;&gt;generated/&lt;/code&gt; directory are ignored for formatting and linting but remain indexed for types and module graph, while files in &lt;code dir=&quot;auto&quot;&gt;dist/&lt;/code&gt; directory are completely excluded from all Biome operations.&lt;/p&gt;
&lt;p&gt;This is an important tool &lt;strong&gt;at your disposal&lt;/strong&gt; that allows you to control Biome, and &lt;a href=&quot;https://github.com/biomejs/biome/issues/7173&quot;&gt;avoid&lt;/a&gt; &lt;a href=&quot;https://github.com/biomejs/biome/issues/7240&quot;&gt;possible&lt;/a&gt; &lt;a href=&quot;https://github.com/biomejs/biome/issues/7007&quot;&gt;slowness&lt;/a&gt; and &lt;a href=&quot;https://github.com/biomejs/biome/issues/6797&quot;&gt;memory&lt;/a&gt; &lt;a href=&quot;https://github.com/biomejs/biome/issues/7020&quot;&gt;leaks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As result, the option &lt;code dir=&quot;auto&quot;&gt;files.experimentalScannerIgnores&lt;/code&gt; has been &lt;strong&gt;deprecated&lt;/strong&gt;. We plan to remove this option in the next releases. Run the &lt;code dir=&quot;auto&quot;&gt;biome migrate&lt;/code&gt; command update your configuration file.&lt;/p&gt;
&lt;p&gt;Great shoutout to &lt;span&gt; &lt;span&gt;Core Contributor&lt;/span&gt; &lt;a href=&quot;https://github.com/arendjr&quot; title=&quot;Member @arendjr&quot;&gt; &lt;img src=&quot;https://biomejs.dev/_astro/arendjr_Z17IfhR.webp?dpl=69d3d5158d55f30009c8158f&quot; alt=&quot;Member @arendjr&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;25&quot; height=&quot;25&quot;&gt; &lt;span&gt;@arendjr&lt;/span&gt; &lt;/a&gt; &lt;/span&gt;  for implementing this new feature.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;tailwind-v4-support&quot;&gt;Tailwind v4 support&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;span&gt; &lt;span&gt;Core Contributor&lt;/span&gt; &lt;a href=&quot;https://github.com/dyc3&quot; title=&quot;Member @dyc3&quot;&gt; &lt;img src=&quot;https://biomejs.dev/_astro/dyc3_2jNgdt.webp?dpl=69d3d5158d55f30009c8158f&quot; alt=&quot;Member @dyc3&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;25&quot; height=&quot;25&quot;&gt; &lt;span&gt;@dyc3&lt;/span&gt; &lt;/a&gt; &lt;/span&gt;  worked really hard, and he shipped for us &lt;strong&gt;native support&lt;/strong&gt; of tailwind files!&lt;/p&gt;
&lt;p&gt;This is a opt-in feature of the CSS parser, and you can enable it using the new &lt;code dir=&quot;auto&quot;&gt;css.parser.tailwindDirectives&lt;/code&gt; option:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;css&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;parser&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;tailwindDirectives&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;tailwind.css&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;@utility&lt;/span&gt;&lt;span&gt; container {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;margin-inline&lt;/span&gt;&lt;span&gt;: auto;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;padding-inline&lt;/span&gt;&lt;span&gt;: 2rem;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;@theme&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--color-&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;: intial;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;lint-rules&quot;&gt;Lint rules&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;promoted-rules&quot;&gt;Promoted rules&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Promoted &lt;code dir=&quot;auto&quot;&gt;noNonNullAssertedOptionalChain&lt;/code&gt; to the suspicious group&lt;/li&gt;
&lt;li&gt;Promoted &lt;code dir=&quot;auto&quot;&gt;useReactFunctionComponents&lt;/code&gt; to the &lt;code dir=&quot;auto&quot;&gt;style&lt;/code&gt; group&lt;/li&gt;
&lt;li&gt;Promoted &lt;code dir=&quot;auto&quot;&gt;useImageSize&lt;/code&gt; to the &lt;code dir=&quot;auto&quot;&gt;correctness&lt;/code&gt; group&lt;/li&gt;
&lt;li&gt;Promoted &lt;code dir=&quot;auto&quot;&gt;useConsistentTypeDefinitions&lt;/code&gt; to the &lt;code dir=&quot;auto&quot;&gt;style&lt;/code&gt; group&lt;/li&gt;
&lt;li&gt;Promoted &lt;code dir=&quot;auto&quot;&gt;useQwikClasslist&lt;/code&gt; to the &lt;code dir=&quot;auto&quot;&gt;correctness&lt;/code&gt; group&lt;/li&gt;
&lt;li&gt;Promoted &lt;code dir=&quot;auto&quot;&gt;noSecrets&lt;/code&gt; to the &lt;code dir=&quot;auto&quot;&gt;security&lt;/code&gt; group&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;removed-rules&quot;&gt;Removed rules&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Removed nursery lint rule &lt;code dir=&quot;auto&quot;&gt;useAnchorHref&lt;/code&gt;, because its use case is covered by &lt;code dir=&quot;auto&quot;&gt;useValidAnchor&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;updated-the-react-domain&quot;&gt;Updated the &lt;code dir=&quot;auto&quot;&gt;react&lt;/code&gt; domain&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The following rules are now a part of the &lt;code dir=&quot;auto&quot;&gt;react&lt;/code&gt; domain, and they won’t be enabled automatically unless you enabled the domain, or Biome detects &lt;code dir=&quot;auto&quot;&gt;react&lt;/code&gt; as a dependency of your closest &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-children-prop/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;lint/correctness/noChildrenProp&lt;/code&gt;&lt;/a&gt; (recommended)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-react-prop-assignments/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;lint/correctness/noReactPropAssignments&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-dangerously-set-inner-html/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;lint/security/noDangerouslySetInnerHtml&lt;/code&gt;&lt;/a&gt; (recommended)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-dangerously-set-inner-html-with-children/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;lint/security/noDangerouslySetInnerHtmlWithChildren&lt;/code&gt;&lt;/a&gt; (recommended)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-component-export-only-modules/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;lint/style/useComponentExportOnlyModules&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-array-index-key/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;lint/suspicious/noArrayIndexKey&lt;/code&gt;&lt;/a&gt; (recommended)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;improved---skip-and---only-flags&quot;&gt;Improved &lt;code dir=&quot;auto&quot;&gt;--skip&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;--only&lt;/code&gt; flags&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The flags &lt;code dir=&quot;auto&quot;&gt;--skip&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;--only&lt;/code&gt; have been enhanced, and they can accept &lt;a href=&quot;https://biomejs.dev/linter/domains&quot;&gt;lint domains&lt;/a&gt; too.&lt;/p&gt;
&lt;p&gt;In the following example, the &lt;code dir=&quot;auto&quot;&gt;lint&lt;/code&gt; command runs only the rules that belong to the &lt;code dir=&quot;auto&quot;&gt;project&lt;/code&gt; domain:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lint&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--only=project&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;In the following example, the &lt;code dir=&quot;auto&quot;&gt;lint&lt;/code&gt; command runs all the rules that you configured, expect for the rules that belong to the &lt;code dir=&quot;auto&quot;&gt;test&lt;/code&gt; domain:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lint&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--skip=test&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;enhanced-init-command&quot;&gt;Enhanced &lt;code dir=&quot;auto&quot;&gt;init&lt;/code&gt; command&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;init&lt;/code&gt; command now checks if the project contains ignore files and &lt;code dir=&quot;auto&quot;&gt;dist/&lt;/code&gt; folders. If supported ignore files are found, Biome will
enable the &lt;a href=&quot;https://biomejs.dev/guides/integrate-in-vcs&quot;&gt;VCS integration&lt;/a&gt;, and if &lt;code dir=&quot;auto&quot;&gt;dist/&lt;/code&gt; folder is found, it will exclude it using the new ignore syntax. This should help reducing
the friction when starting with Biome:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;vcs&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;clientKind&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;useIgnoreFile&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;new-reporters&quot;&gt;New reporters&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Two new CLI reporters have been added:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://checkstyle.org/&quot;&gt;checkstyle reporter&lt;/a&gt; via the new option &lt;code dir=&quot;auto&quot;&gt;--reporter=checkstyle&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://reviewdog.github.io/rdjson-viewer/?rdjson=eJztmU1z2jAQhu%2F5FRpfcgm4pA1NmMmhnzOZ6altcun0IKw1qCNLVJJJSIb%2F3pVtCKQYDAPBYHOyZe1afh%2FvrhY%2FnRDiGRXrALwOecIzPJc0cmfeR67w4CwdjLVwY31rB6bj%2B1137Y9pMhh6OGHsZnmM055UxvLA4NxfiWHqEy8Gij3fY4VLX3BpQfs6FmB8qRqxjA2wBo8GSluTrSlxMqQiTlbrTPxAaQ2BlWCc2W1idZMZZTbjibEnVEAtV3J%2BVQNq%2B84flwwemvM301T25h8CB0GyF0PJ04o4cp5b52fzV3CdzkVrZnQ8O8Uzlmq7xONlAYcnL4%2BenzpCbWjyFN7PPjck1ZTgUSpyMxUqM6g8vtZitc83xtd6U8BjMX4%2FYAiaCqJCYvtgIGNpCNWwe5pDqjnt4th6PO%2BmZvsh2l4s%2F%2BXGQC8KOFwjHieykvBVYvJAKeYkwauNKb4v4LC8FF8zs0aUy7ouVpxeXRbLklC3A7SuikcAsapFkRrDjfVp4AQ2vtI9KvkjLM2rmU3a%2B05N9ttsnOdk1c1rYhGHRQHO5FHJCDw851SpLDF4tpuQZCrGd6YBf2MqlsSjic2AB1zFzuhzYvMlNdkPzJwE%2BG5jlm8LOCzG8tZw2SPX1ySiI9J1NdHQEPGGZKTihKgGMXJzlCR2NAASKNCordwJX%2BjGvR7oomgn0%2FeD9Woxhfa2Q7S9PtZ02%2BrCE4lifGJ1AkYwyWY7ITJRmuCaLEQg7S54YpYQSMs2qBw1BNiCXG8ysw9y9A2N9kP3YLZBE5HFiPSpSeii3Emw1kznERzMruiVmWpgEAjM9gVhfp%2FO3w%2FHcvecfRULJk8tmcpKTh9Pm%2BQT7kg5w5xrFeZfDB3kbInSOM99Z8GT5lQXz7j0bJJdrDf5gOJ%2Bcyotki5HvGXyLd4NvpAwV8RlMuZ6zgVl4cHdwkPFXAFjEKI9I33Q0PH%2BA%2FC7joUS57SFkRCWKRLaea%2Fr5fzrunYgXBR0vDoOwm3GwfQ9DpWO6IIyPEPvazIFY4PcO4xYiIZABtqFC0sqUqiEUPeuNwgUDkrbOYYGfjv%2Fv9T9exn69%2B2wrNv3crXv26Fad%2B%2Bl7PQq9g2jCs17xb5oHGvvXoXPxXXrvtpzLqjqtO5Hn9Hqzn2l49VhcICd%2B4lb0Pgf0iY3Ww%3D%3D&quot;&gt;RDJSON reporter&lt;/a&gt; via the new option &lt;code dir=&quot;auto&quot;&gt;--reporter=rdjson&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;new-cli-flags&quot;&gt;New CLI flags&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;We added the new CLI flags to better control Biome without relying on the configuration file. Here’s the list:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;--format-with-errors&lt;/code&gt;: CLI flag that allows to format code that contains parse errors.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;--css-parse-css-modules&lt;/code&gt;: CLI flag to control whether CSS Modules syntax is enabled.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;--css-parse-tailwind-directives&lt;/code&gt;: CLI flag to control whether Tailwind CSS 4.0 directives and functions are enabled.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;--json-parse-allow-comments&lt;/code&gt;: CLI flag to control whether comments are allowed in JSON files.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;--json-parse-allow-trailing-commas&lt;/code&gt;: CLI flag to control whether trailing commas are allowed in JSON files.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;lineending-format-option&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;lineEnding&lt;/code&gt; format option&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The option &lt;code dir=&quot;auto&quot;&gt;lineEnding&lt;/code&gt; now has a variant called &lt;code dir=&quot;auto&quot;&gt;auto&lt;/code&gt; to match the operating system’s expected
line-ending style: on Windows, this will be CRLF (&lt;code dir=&quot;auto&quot;&gt;\r\n&lt;/code&gt;), and on macOS / Linux, this will
be LF (&lt;code dir=&quot;auto&quot;&gt;\n&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;This allows for cross-platform projects that use Biome not to have to
force one option or the other, which aligns better with Git’s default behavior
on these platforms.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;formatter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;lineEnding&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;ins&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;auto&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--line-ending&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;auto&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;and-more&quot;&gt;And more!&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;More features and fixes have been shipped, like React v19 support, &lt;code dir=&quot;auto&quot;&gt;baseUrl&lt;/code&gt; support inside &lt;code dir=&quot;auto&quot;&gt;tsconfig.json&lt;/code&gt;, and more. Refer to the changelog page for a &lt;a href=&quot;https://biomejs.dev/internals/changelog/version/2-3-0/&quot;&gt;detailed breakdown of the features&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;i-like-where-this-is-going-how-can-i-help&quot;&gt;I like where this is going, how can I help?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;I want to remind you that Biome is a project led by volunteers who like programming, open-source, and embrace the Biome philosophy, so any help is welcome 😁&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;translations&quot;&gt;Translations&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;If you are familiar with Biome and would like to contribute to its outreach, you can assist us by translating the website into your native language. In this &lt;a href=&quot;https://biomejs.dev/i18n-dashboard/&quot;&gt;dashboard&lt;/a&gt;, you can check the supported languages and if they are up to date.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;chat-with-us&quot;&gt;Chat with us&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Join our &lt;a href=&quot;https://biomejs.dev/chat&quot;&gt;Discord server&lt;/a&gt;, and engage with the community. Chatting with the community and being part of the community is a form of contribution.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;code-contributions&quot;&gt;Code contributions&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;If you like the technical aspects of the project, and you want to make your way into the Rust language, or practice your knowledge around parsers, compilers, analysers, etc., Biome is the project that does for you!&lt;/p&gt;
&lt;p&gt;There are numerous aspects to explore; I assure you that you won’t get bored. Here is a small list of the things you can start with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create new lint rules! We have so many rules that we haven’t implemented yet (ESLint, ESLint plugins, Next.js, Solid, etc.). We have a very &lt;a href=&quot;https://github.com/biomejs/biome/blob/main/crates/biome_analyze/CONTRIBUTING.md&quot;&gt;extensive technical guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/biomejs/biome/blob/main/crates/biome_parser/CONTRIBUTING.md&quot;&gt;Help&lt;/a&gt; &lt;a href=&quot;https://github.com/biomejs/biome/tree/main/crates/biome_yaml_parser&quot;&gt;building&lt;/a&gt; &lt;a href=&quot;https://github.com/biomejs/biome/tree/main/crates/biome_html_parser&quot;&gt;Biome&lt;/a&gt; &lt;a href=&quot;https://github.com/biomejs/biome/tree/main/crates/biome_markdown_parser&quot;&gt;parsers&lt;/a&gt;!
One interesting fact about Biome parsers is that they are recoverable parsers &lt;a href=&quot;https://biomejs.dev/internals/architecture/#parser-and-cst&quot;&gt;error resilient&lt;/a&gt; which emit a &lt;a href=&quot;https://en.wikipedia.org/wiki/Parse_tree&quot;&gt;CST&lt;/a&gt; instead of a classic AST.&lt;/li&gt;
&lt;li&gt;Implement new capabilities in our &lt;a href=&quot;https://github.com/biomejs/biome/tree/main/crates/biome_lsp&quot;&gt;LSP (Language Server Protocol)&lt;/a&gt;, or add new features in one of our editor extensions: &lt;a href=&quot;https://github.com/biomejs/biome-vscode&quot;&gt;VS Code&lt;/a&gt;, &lt;a href=&quot;https://github.com/biomejs/biome-zed&quot;&gt;Zed&lt;/a&gt; and &lt;a href=&quot;https://github.com/biomejs/biome-intellij&quot;&gt;JetBrains IntelliJ&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h4 id=&quot;financial-help&quot;&gt;Financial help&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;If you believe in the future of the project, you can also help with a financial contribution, via &lt;a href=&quot;https://opencollective.com/biome&quot;&gt;Open Collective&lt;/a&gt; or &lt;a href=&quot;https://github.com/sponsors/biomejs&quot;&gt;GitHub Sponsors&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Additionally, the project provides an &lt;a href=&quot;https://biomejs.dev/enterprise&quot;&gt;enterprise support program &lt;/a&gt; where a company you can employ one of the core contributors to work a specific aspect of the Biome toolchain.&lt;/p&gt;</content:encoded></item><item><title>Biome v2.1</title><link>https://biomejs.dev/blog/biome-v2-1/</link><guid isPermaLink="true">https://biomejs.dev/blog/biome-v2-1/</guid><description>Biome 2.1 has been released with many bugfixes, a faster scanner, and improved type inference.

</description><pubDate>Tue, 08 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Biome 2.0 was released less than a month ago, and since then we have seen an
amazing uptake! Our Discord is buzzing, our downloads are spiking, and bugs are
rolling in :)&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;faster-scanner&quot;&gt;Faster scanner&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Probably the main point of contention is that Biome 2.0 introduced a new
scanner, which we use for discovering nested configuration files as well as for
populating our module graph, if project rules are enabled. The reason for this
contention is that having a scanner makes things slower, while people want Biome
to be fast.&lt;/p&gt;
&lt;p&gt;To mitigate the impact, we already made the project rules opt-in for 2.0, so
that users can choose between features and speed for themselves. But ideally,
we’d have both. And unfortunately, even without project rules, the scanner still
caused &lt;em&gt;some&lt;/em&gt; noticeable overhead.&lt;/p&gt;
&lt;p&gt;For Biome 2.1 we’re changing the logic for how the “light scanner” (the one
where project rules are disabled) works. Previously, it would always scan the
entire project from its root, whereas now it will use the files and folders that
you ask Biome to operate on as a hint for which parts of the project should be
scanned.&lt;/p&gt;
&lt;p&gt;This means if you run Biome without any arguments from the project root, you are
not going to notice a difference. But if you specify specific files to check, or
if you run Biome inside a nested folder, the scanner will know which parts of
the project you are interested in, and only scan those.&lt;/p&gt;
&lt;p&gt;Note that if you have enabled project rules, these improvements don’t apply.
This is because project rules often need to pull information from other files,
&lt;em&gt;including ones you didn’t specify&lt;/em&gt;, so we still scan the entire project for
now.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;improved-type-inference&quot;&gt;Improved type inference&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;When we released Biome 2.0, we mentioned that our type inference was able to
detect ~75% of cases that our
&lt;a href=&quot;https://biomejs.dev/linter/rules/no-floating-promises/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noFloatingPromises&lt;/code&gt; rule&lt;/a&gt;
should ideally detect. Since then, we’ve been able to improve this to ~85%, and
cases such as these can now be successfully inferred:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// We know that this evaluates to a `Promise`:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;reject&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;logical operator bypass&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// But this doesn&apos;t:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;reject&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;logical operator bypass&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Similarly, we now detect that this may return a `Promise`:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;condition&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;Math&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;random&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &gt; -&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;// Always true, but dynamic to linter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;condition &lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;reject&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;ternary bypass&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// On the other hand, we know the following is never a `Promise`:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;alwaysFalsy&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;alwaysFalsy &lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Promise&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;reject&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;ternary bypass&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// This will now get flagged because the `Promise`s are not handled:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;map&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; x &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Additionally, we have added support for getters, call signatures, comma
operators, and more. Our goal is for you to not have to worry about which parts
of TypeScript are supported, and the vast majority of cases to “just work”. It’s
still a work in progress, but we’re happy with the progress we are seeing.&lt;/p&gt;
&lt;p&gt;And finally we have also added the related rule
&lt;a href=&quot;https://biomejs.dev/linter/rules/no-misused-promises/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noMisusedPromises&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;rule-updates&quot;&gt;Rule updates&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The following new rules have been added in 2.1.0:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-alert/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noAlert&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-implicit-coercion/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noImplicitCoercion&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-magic-numbers/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noMagicNumbers&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-misused-promises/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noMisusedPromises&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-unassigned-variables/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noUnassignedVariables&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-readonly-class-properties/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useReadonlyClassProperties&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-unified-type-signature/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useUnifiedTypeSignature&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other notable change:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The rule
&lt;a href=&quot;https://biomejs.dev/linter/rules/no-unused-function-parameters/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noUnusedFunctionParameters&lt;/code&gt;&lt;/a&gt;
has been enhanced with an &lt;code dir=&quot;auto&quot;&gt;ignoreRestSiblings&lt;/code&gt; option.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;notable-bug-fixes&quot;&gt;Notable bug fixes&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;If you ignore a nested configuration file from your root configuration, it
will now be properly ignored.&lt;/li&gt;
&lt;li&gt;When extending a configuration from another, we now correctly ignore the
&lt;code dir=&quot;auto&quot;&gt;root&lt;/code&gt; of the other configuration. This one led to some confusion in several
use cases.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;whats-next&quot;&gt;What’s next&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;It’s still early days in our 2.x journey. Both the scanner are type inference
are likely to see further improvements. Additionally, our
&lt;a href=&quot;https://biomejs.dev/internals/people-and-credits#core-contributors&quot;&gt;Core Contributors&lt;/a&gt; will focus
on moving forward the &lt;a href=&quot;https://biomejs.dev/blog/roadmap-2025#-2025-roadmap&quot;&gt;Roadmap for 2025&lt;/a&gt;, and
focus on the following features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make HTML support stable.&lt;/li&gt;
&lt;li&gt;Expand HTML to support other frameworks such as Vue, Svelte, Astro and,
hopefully, Angular too.&lt;/li&gt;
&lt;li&gt;Work on Markdown support, starting from the parser.&lt;/li&gt;
&lt;li&gt;and more!&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;installation-and-migration&quot;&gt;Installation and migration&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Install or update the &lt;code dir=&quot;auto&quot;&gt;@biomejs/biome&lt;/code&gt; package. If you upgrade the package, run
the &lt;code dir=&quot;auto&quot;&gt;migrate&lt;/code&gt; command.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--save-dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--save-exact&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@biomejs/biome&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@biomejs/biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;migrate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--write&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;migrate&lt;/code&gt; command takes care of breaking changes of the configuration, so
you don’t have to.&lt;/p&gt;
&lt;aside aria-label=&quot;Note&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;If you are upgrading from Biome 1.x, please follow the
&lt;a href=&quot;https://biomejs.dev/guides/upgrade-to-biome-v2&quot;&gt;migration guide&lt;/a&gt; and upgrade to Biome 2.0 first,
before upgrading to Biome 2.1.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;i-like-where-this-is-going-how-can-i-help&quot;&gt;I like where this is going, how can I help?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Biome is a project led by volunteers who like programming, open-source, and
embrace the Biome philosophy, so any help is welcome 😁&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;translations&quot;&gt;Translations&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;If you are familiar with Biome and would like to contribute to its outreach, you
can assist us by translating the website into your native language. In this
&lt;a href=&quot;https://biomejs.dev/i18n-dashboard/&quot;&gt;dashboard&lt;/a&gt;, you can check the supported
languages and if they are up to date.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;chat-with-us&quot;&gt;Chat with us&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Join our &lt;a href=&quot;https://biomejs.dev/chat&quot;&gt;Discord server&lt;/a&gt;, and engage with the
community. Chatting with the community and being part of the community is a form
of contribution.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;code-contributions&quot;&gt;Code contributions&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;If you like the technical aspects of the project, and you want to make your way
into the Rust language, or practice your knowledge around parsers, compilers,
analysers, etc., Biome is the project that does for you!&lt;/p&gt;
&lt;p&gt;There are numerous aspects to explore; I assure you that you won’t get bored.
Here is a small list of the things you can start with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create new lint rules! We have so many rules that we haven’t implemented yet
(ESLint, ESLint plugins, Next.js, Solid, etc.). We have an &lt;a href=&quot;https://github.com/biomejs/biome/blob/main/crates/biome_analyze/CONTRIBUTING.md&quot;&gt;extensive
technical
guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/biomejs/biome/blob/main/crates/biome_parser/CONTRIBUTING.md&quot;&gt;Help&lt;/a&gt;
&lt;a href=&quot;https://github.com/biomejs/biome/tree/main/crates/biome_yaml_parser&quot;&gt;building&lt;/a&gt;
&lt;a href=&quot;https://github.com/biomejs/biome/tree/main/crates/biome_html_parser&quot;&gt;Biome&lt;/a&gt;
&lt;a href=&quot;https://github.com/biomejs/biome/tree/main/crates/biome_markdown_parser&quot;&gt;parsers&lt;/a&gt;!
One interesting fact about Biome parsers is that they are recoverable parsers
&lt;a href=&quot;https://biomejs.dev/internals/architecture/#parser-and-cst&quot;&gt;error resilient&lt;/a&gt; which emit a
&lt;a href=&quot;https://en.wikipedia.org/wiki/Parse_tree&quot;&gt;CST&lt;/a&gt; instead of a classic AST.&lt;/li&gt;
&lt;li&gt;Implement new capabilities in our &lt;a href=&quot;https://github.com/biomejs/biome/tree/main/crates/biome_lsp&quot;&gt;LSP (Language Server
Protocol)&lt;/a&gt;, or
add new features in one of our editor extensions: &lt;a href=&quot;https://github.com/biomejs/biome-vscode&quot;&gt;VS
Code&lt;/a&gt;,
&lt;a href=&quot;https://github.com/biomejs/biome-zed&quot;&gt;Zed&lt;/a&gt; and &lt;a href=&quot;https://github.com/biomejs/biome-intellij&quot;&gt;JetBrains
IntelliJ&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;financial-help&quot;&gt;Financial help&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;If you believe in the future of the project, you can also help with a financial
contribution, via &lt;a href=&quot;https://opencollective.com/biome&quot;&gt;Open Collective&lt;/a&gt; or &lt;a href=&quot;https://github.com/sponsors/biomejs&quot;&gt;GitHub
Sponsors&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Additionally, the project provides an &lt;a href=&quot;https://biomejs.dev/enterprise&quot;&gt;enterprise support program &lt;/a&gt;
where as a company you can contract one of the core contributors to work on a
specific aspect of the Biome toolchain.&lt;/p&gt;</content:encoded></item><item><title>Biome v2—codename: Biotype</title><link>https://biomejs.dev/blog/biome-v2/</link><guid isPermaLink="true">https://biomejs.dev/blog/biome-v2/</guid><description>Biome 2.0 is officially out, as the first JavaScript linter that provides type-aware linting rules
that don&apos;t rely on the TypeScript compiler. With this release, Biome also ships plugin support, multi-file analysis,
revamped import sorting, experimental HTML formatting, better suppressions, better LSP support, and more!

</description><pubDate>Tue, 17 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We are happy to announce that Biome v2 is officially out! 🍾 Biome v2—codename: Biotype, the &lt;em&gt;first&lt;/em&gt; JavaScript and TypeScript linter that provides
&lt;strong&gt;type-aware linting rules that doesn’t rely on the TypeScript compiler&lt;/strong&gt;! This means that you can lint your project
without necessarily installing the &lt;code dir=&quot;auto&quot;&gt;typescript&lt;/code&gt; package.&lt;/p&gt;
&lt;p&gt;With this release, the &lt;a href=&quot;https://biomejs.dev/internals/people-and-credits#core-contributors&quot;&gt;Core Contributors of the project&lt;/a&gt; want to show
to the whole community and web ecosystem that Biome is here to stay and deserves to earn its place as the next-generation toolchain for the web.
No other tools have achieved this great milestone in such a short amount of time (&lt;a href=&quot;https://biomejs.dev/blog/announcing-biome&quot;&gt;two years&lt;/a&gt;) and resources. This has been possible
thanks to the companies and people who believed in the project, with a special shoutout to &lt;a href=&quot;https://vercel.com/&quot;&gt;Vercel&lt;/a&gt; for sponsoring the type inference work.&lt;/p&gt;
&lt;p&gt;Preliminary testing shows that our &lt;a href=&quot;https://biomejs.dev/linter/rules/no-floating-promises/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noFloatingPromises&lt;/code&gt; rule&lt;/a&gt;, which is based on our new type inference work, can detect floating promises in about 75% of the cases that would be detected by using &lt;code dir=&quot;auto&quot;&gt;typescript-eslint&lt;/code&gt;, at a fraction of the performance impact. And needless to say, we have plenty of ideas on how to improve this metric even further.&lt;/p&gt;
&lt;p&gt;Keep in mind that your mileage may vary, as these early numbers are based on a limited set of use cases. Nevertheless, we look forward to people trying it out and reporting their experiences so that we can quickly reach a level of confidence that would be sufficient for most projects.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;installation-and-migration&quot;&gt;Installation and migration&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Install or update the &lt;code dir=&quot;auto&quot;&gt;@biomejs/biome&lt;/code&gt; package. If you upgrade the package, run the &lt;code dir=&quot;auto&quot;&gt;migrate&lt;/code&gt; command.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--save-dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--save-exact&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@biomejs/biome&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@biomejs/biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;migrate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--write&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;migrate&lt;/code&gt; command will take care of all the breaking changes of the configuration, so you don’t have to. However, there are
some other changes that we couldn’t automate. We created a &lt;a href=&quot;https://biomejs.dev/guides/upgrade-to-biome-v2&quot;&gt;migration guide&lt;/a&gt; that explains them,
together with manual migration paths, if applicable. Please get accustomed to the changes, as some of them fundamentally
change some of the core functionalities of Biome (for the better!).&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;relevant-features&quot;&gt;Relevant features&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Biome is packed with new features, some big and some small. We will focus on the ones that we believe are worth
mentioning. For a complete list of the new features, refer to the &lt;a href=&quot;https://biomejs.dev/internals/changelog&quot;&gt;web version of the changelog&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;multi-file-analysis-and-type-inference&quot;&gt;Multi-file analysis and type inference&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;These two features are closely related. You can’t create a type inference engine without the ability to query types imported from
other modules.&lt;/p&gt;
&lt;p&gt;Before version 2.0, Biome lint rules could only operate on one file at a time. This brought us far, but many of the more interesting rules require information from other files too.&lt;/p&gt;
&lt;p&gt;To accomplish this, we have added a &lt;em&gt;file scanner&lt;/em&gt; to Biome that scans all the files in your project and indexes them, similar to what an LSP service might do in your IDE.&lt;/p&gt;
&lt;p&gt;A file scanner comes with its baggage: slowness. We acknowledge that many users choose Biome for its speed. During the beta period, users raised some concerns about how this could affect their workflow.&lt;/p&gt;
&lt;p&gt;As for this release, the file scanner has the following characteristics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It’s &lt;strong&gt;opt-in&lt;/strong&gt;; which means migrating from v1 to v2 won’t significantly affect the performance of formatting and linting your projects.&lt;/li&gt;
&lt;li&gt;By default, the scanner is only used for discovering nested configuration files. This should be very fast, although a slight increase compared to v1 may be experienced.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;full scan&lt;/strong&gt; (which scans all your project files &lt;strong&gt;and&lt;/strong&gt; &lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt;) is performed &lt;em&gt;only&lt;/em&gt; when &lt;a href=&quot;https://biomejs.dev/linter/domains#project&quot;&gt;project rules&lt;/a&gt; are enabled.&lt;/li&gt;
&lt;li&gt;Users can control the scanned files using &lt;code dir=&quot;auto&quot;&gt;files.includes&lt;/code&gt;, with the exception of &lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Lint rules that need to collect types or query the module graph &lt;strong&gt;will never be recommended&lt;/strong&gt; outside the &lt;a href=&quot;https://biomejs.dev/linter/domains/#project&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;project&lt;/code&gt; domain&lt;/a&gt;. We put speed and performance first, and users have control over the rules.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;monorepo-support&quot;&gt;Monorepo Support&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;We’ve significantly improved our support for monorepos. This means that lint rules that rely on information from &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt; files will now use the &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt; from the right package. But perhaps more importantly: &lt;strong&gt;We now support nested configuration files.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Every project should still have a single &lt;code dir=&quot;auto&quot;&gt;biome.json&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;biome.jsonc&lt;/code&gt; at its root, similar to Biome v1. But projects are allowed to have any number of nested &lt;code dir=&quot;auto&quot;&gt;biome.json&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;biome.jsonc&lt;/code&gt; files in subdirectories. Nested configuration files must be explicitly marked as such, in one of two ways.&lt;/p&gt;
&lt;p&gt;The first looks like this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.jsonc&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;root&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;By setting the &lt;code dir=&quot;auto&quot;&gt;root&lt;/code&gt; field to &lt;code dir=&quot;auto&quot;&gt;false&lt;/code&gt;, you tell Biome this is a nested file. This is important, because if you run Biome inside the nested folder, it will know that the configuration is part of a bigger project and continue looking for the root configuration as well.&lt;/p&gt;
&lt;p&gt;It is important to stress that the settings within the nested folder &lt;strong&gt;do not&lt;/strong&gt; inherit from the root settings by default. Rather, we still want you to use the &lt;a href=&quot;https://biomejs.dev/guides/big-projects/#share-the-configuration&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;extends&lt;/code&gt; field&lt;/a&gt; that already existed in Biome v1 if you want to extend from another configuration.&lt;/p&gt;
&lt;p&gt;Which brings us to the second way a nested configuration can be defined:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.jsonc&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;extends&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;//&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This is a convenient micro-syntax that sets both the &lt;code dir=&quot;auto&quot;&gt;root&lt;/code&gt; field to &lt;code dir=&quot;auto&quot;&gt;false&lt;/code&gt;, and will tell Biome that this nested configuration extends from the root configuration.&lt;/p&gt;
&lt;p&gt;Say goodbye to wonky relative paths such as &lt;code dir=&quot;auto&quot;&gt;&quot;extends&quot;: [&quot;../../biome.json&quot;]&lt;/code&gt; 👋&lt;/p&gt;
&lt;p&gt;We prepared a &lt;a href=&quot;https://biomejs.dev/guides/big-projects#monorepo&quot;&gt;small guide&lt;/a&gt; that should help you set everything up.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;plugins&quot;&gt;Plugins&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Biome 2.0 comes with our first iteration of &lt;a href=&quot;https://biomejs.dev/linter/plugins&quot;&gt;Linter Plugins&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These plugins are still limited in scope: They only allow you to match code snippets and report diagnostics on them.&lt;/p&gt;
&lt;p&gt;Here is an example of a plugin that reports on all usages of &lt;code dir=&quot;auto&quot;&gt;Object.assign()&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;`$fn($args)` where {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;$fn &amp;#x3C;: `Object.assign`,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;register_diagnostic(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;span = $fn,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;message = &quot;Prefer object spread instead of `Object.assign()`&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;It’s a first step, but we have plenty of ideas for making them more powerful, and we’re eager to hear from our users about what they would like to see prioritised.&lt;/p&gt;
&lt;p&gt;As for now, we intentionally left out the distribution method of plugin for different reasons. However, we would like to hear from you. Please &lt;a href=&quot;https://github.com/biomejs/biome/discussions/6265&quot;&gt;join the discussion&lt;/a&gt; and share your ideas with us.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;import-organizer-revamp&quot;&gt;Import Organizer Revamp&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;In Biome 1.x, our Import Organizer had several limitations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Groups of imports separated by a blank line were considered separate &lt;em&gt;chunks&lt;/em&gt;, meaning they were sorted independently. This meant the following &lt;strong&gt;didn’t work&lt;/strong&gt; as expected:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;example.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { lib2 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;library2&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { util } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./utils.js&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { lib1 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;library1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;It would correctly sort &lt;code dir=&quot;auto&quot;&gt;&quot;library1&quot;&lt;/code&gt; to be placed above &lt;code dir=&quot;auto&quot;&gt;&quot;./utils.js&quot;&lt;/code&gt;, but it wouldn’t be able to
carry it over the blank line to the top. This is what we got:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;organizer_v1.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { lib2 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;library2&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { lib1 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;library1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { util } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./utils.js&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;But instead, what we really wanted was this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;organizer_v2.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { lib1 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;library1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { lib2 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;library2&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { util } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./utils.js&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Imports from the same module were not merged. Consider the following example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;example.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { util1 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./utils.js&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { util2 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./utils.js&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;What we wanted was this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;organizer_v2.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { util1, util2 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./utils.js&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No custom ordering could be configured. Perhaps you didn’t really like the default approach of ordering by “distance” from the source that you’re importing from. Perhaps you wanted to organise the imports like this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;organizer_v2.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { open } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;node:fs&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { internalLib1 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@company/library1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { internalLib2 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@company/library2&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { lib1 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;library1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In Biome 2.0, all these limitations are lifted. In fact, if you look at the examples above, all snippets labeled &lt;code dir=&quot;auto&quot;&gt;organizer_v2.js&lt;/code&gt; can be produced just like that by our new import organizer.&lt;/p&gt;
&lt;p&gt;Other improvements include support for organizing &lt;code dir=&quot;auto&quot;&gt;export&lt;/code&gt; statements, support for “detached” comments to explicitly separate import chunks if necessary, and import attribute sorting.&lt;/p&gt;
&lt;p&gt;You can find more in the &lt;a href=&quot;https://biomejs.dev/assist/actions/organize-imports&quot;&gt;documentation of the action&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;assists&quot;&gt;Assists&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The Import Organizer has always been a bit of a special case in Biome. It was neither part of the linter, nor of the formatter. This was because we didn’t want it to show diagnostics like the linter does, and its organizing features exceeded what we expect from the formatter.&lt;/p&gt;
&lt;p&gt;In Biome 2.0, we have generalised such use cases in the form of Biome Assist. Assist provides &lt;strong&gt;actions&lt;/strong&gt;, which are similar to the &lt;em&gt;fixes&lt;/em&gt; in lint rules, but without the diagnostics.&lt;/p&gt;
&lt;p&gt;The Import Organizer has become an assist, but we’ve started using this approach for new assists too: &lt;a href=&quot;https://biomejs.dev/assist/actions/use-sorted-keys/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useSortedKeys&lt;/code&gt;&lt;/a&gt; can sort keys in object literals, while &lt;a href=&quot;https://biomejs.dev/assist/actions/use-sorted-attributes/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useSortedAttributes&lt;/code&gt;&lt;/a&gt; can sort attributes in JSX.&lt;/p&gt;
&lt;p&gt;For more information about assists, see &lt;a href=&quot;https://biomejs.dev/assist/&quot;&gt;the relative page&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;improved-suppressions&quot;&gt;Improved suppressions&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;In addition to the &lt;code dir=&quot;auto&quot;&gt;// biome-ignore&lt;/code&gt; comments we already supported, we now support &lt;code dir=&quot;auto&quot;&gt;// biome-ignore-all&lt;/code&gt; for suppressing a lint rule or the formatter in an entire file.&lt;/p&gt;
&lt;p&gt;We also added support for suppression ranges using &lt;code dir=&quot;auto&quot;&gt;// biome-ignore-start&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;// biome-ignore-end&lt;/code&gt;. Note that &lt;code dir=&quot;auto&quot;&gt;// biome-ignore-end&lt;/code&gt; is optional in case you want to let a range run until the end of the file.&lt;/p&gt;
&lt;p&gt;For more information about suppressions, see &lt;a href=&quot;https://biomejs.dev/linter/#suppress-lint-rules&quot;&gt;the relative page&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;html-formatter&quot;&gt;HTML formatter&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;After several months of hard work, we are pleased to announce that the HTML formatter is now ready for users to try out and report bugs! This is a huge step towards Biome fully supporting HTML-ish templating languages used in frameworks such as Vue and Svelte.&lt;/p&gt;
&lt;p&gt;For now, the HTML formatter only touches actual &lt;code dir=&quot;auto&quot;&gt;.html&lt;/code&gt; files, so it doesn’t format HTML in &lt;code dir=&quot;auto&quot;&gt;.vue&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;.svelte&lt;/code&gt; files yet. It also won’t format embedded languages like JavaScript or CSS yet. HTML’s options like &lt;code dir=&quot;auto&quot;&gt;attributePosition&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;bracketSameLine&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;whitespaceSensitivity&lt;/code&gt; have been implemented.&lt;/p&gt;
&lt;p&gt;The HTML formatter is still in the experimental stage, so it will remain &lt;strong&gt;disabled by default for the full 2.0 release&lt;/strong&gt;. At the time of writing, Biome can parse most of the Prettier’s HTML test suite, and format 46/124 of them correctly. Despite not matching Prettier yet, we’re pretty confident that it &lt;em&gt;should&lt;/em&gt; output adequately formatted documents without destroying anything. If you find a case where it doesn’t, &lt;a href=&quot;https://github.com/biomejs/biome/issues&quot;&gt;please let us know&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;You can enable the HTML formatter by adding the following to your config file:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;html&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;formatter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;shout-outs&quot;&gt;Shout-outs&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;And now, let’s give credits where credits are due!&lt;/p&gt;
&lt;div&gt;&lt;img src=&quot;https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExdjQ2b3d6MjYzMTdsazdzcm41NmM1ZTMzaGcyM2xyeHo2N2k5NmxscyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/QW5nKIoebG8y4/giphy.gif?dpl=69d3d5158d55f30009c8158f&quot; alt=&quot;it&amp;#x27;s&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;400&quot; height=&quot;300&quot;&gt;&lt;/div&gt;
&lt;p&gt;Special thanks to Vercel, our platinum sponsor, &lt;a href=&quot;https://biomejs.dev/blog/vercel-partners-biome-type-inference&quot;&gt;for sponsoring the type inference work&lt;/a&gt;, led by &lt;span&gt; &lt;span&gt;Core Contributor&lt;/span&gt; &lt;a href=&quot;https://github.com/arendjr&quot; title=&quot;Member @arendjr&quot;&gt; &lt;img src=&quot;https://biomejs.dev/_astro/arendjr_Z17IfhR.webp?dpl=69d3d5158d55f30009c8158f&quot; alt=&quot;Member @arendjr&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;25&quot; height=&quot;25&quot;&gt; &lt;span&gt;@arendjr&lt;/span&gt; &lt;/a&gt; &lt;/span&gt; .&lt;/p&gt;
&lt;div&gt;&lt;a href=&quot;https://vercel.com&quot; rel=&quot;nofollow&quot; title=&quot;Vercel&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://biomejs.dev/_astro/vercel-logotype-dark.CrUgEJIc_pqJxz.webp?dpl=69d3d5158d55f30009c8158f&quot; alt=&quot;Vercel&quot; data-canonical-src=&quot;/_astro/vercel-logotype-dark.CrUgEJIc.png&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;500&quot; height=&quot;113&quot;&gt;&lt;img src=&quot;https://biomejs.dev/_astro/vercel-logotype-light.B4WmRf6j_2uiLNK.webp?dpl=69d3d5158d55f30009c8158f&quot; alt=&quot;Vercel&quot; data-canonical-src=&quot;/_astro/vercel-logotype-light.B4WmRf6j.png&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;500&quot; height=&quot;113&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Special thanks to Depot, our gold sponsor, for providing the project with powerful and fast CI runners. A huge &lt;strong&gt;time saver&lt;/strong&gt; and &lt;strong&gt;reliability&lt;/strong&gt; booster!&lt;/p&gt;
&lt;div&gt;&lt;a href=&quot;https://depot.dev&quot; rel=&quot;nofollow&quot; title=&quot;Depot&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://biomejs.dev/_astro/depot-logo-horizontal-on-light@3x.CwT7__a0_cbRmJ.webp?dpl=69d3d5158d55f30009c8158f&quot; alt=&quot;Depot&quot; data-canonical-src=&quot;/_astro/depot-logo-horizontal-on-light@3x.CwT7__a0.png&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;500&quot; height=&quot;125&quot;&gt;&lt;img src=&quot;https://biomejs.dev/_astro/depot-logo-horizontal-on-dark@3x.BWjsBfKV_Z19rYFI.webp?dpl=69d3d5158d55f30009c8158f&quot; alt=&quot;Depot&quot; data-canonical-src=&quot;/_astro/depot-logo-horizontal-on-dark@3x.BWjsBfKV.png&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;500&quot; height=&quot;125&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Congratulations to &lt;span&gt; &lt;span&gt;Core Contributor&lt;/span&gt; &lt;a href=&quot;https://github.com/siketyan&quot; title=&quot;Member @siketyan&quot;&gt; &lt;img src=&quot;https://biomejs.dev/_astro/siketyan_Z10drWU.webp?dpl=69d3d5158d55f30009c8158f&quot; alt=&quot;Member @siketyan&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;25&quot; height=&quot;25&quot;&gt; &lt;span&gt;@siketyan&lt;/span&gt; &lt;/a&gt; &lt;/span&gt; , who recently became a Core Contributor of the project! Thanks to their contributions,
the &lt;a href=&quot;https://plugins.jetbrains.com/plugin/22761-biome&quot;&gt;JetBrains extension&lt;/a&gt; is now stable and supports multiple workspaces.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;span&gt; &lt;span&gt;Core Contributor&lt;/span&gt; &lt;a href=&quot;https://github.com/conaclos&quot; title=&quot;Member @conaclos&quot;&gt; &lt;img src=&quot;https://biomejs.dev/_astro/conaclos_1JhQ4o.webp?dpl=69d3d5158d55f30009c8158f&quot; alt=&quot;Member @conaclos&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;25&quot; height=&quot;25&quot;&gt; &lt;span&gt;@conaclos&lt;/span&gt; &lt;/a&gt; &lt;/span&gt;  for their massive work in implementing many features such as the Import Organizer revamping,
the new glob engine, many new linting rules.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;span&gt; &lt;span&gt;Core Contributor&lt;/span&gt; &lt;a href=&quot;https://github.com/arendjr&quot; title=&quot;Member @arendjr&quot;&gt; &lt;img src=&quot;https://biomejs.dev/_astro/arendjr_Z17IfhR.webp?dpl=69d3d5158d55f30009c8158f&quot; alt=&quot;Member @arendjr&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;25&quot; height=&quot;25&quot;&gt; &lt;span&gt;@arendjr&lt;/span&gt; &lt;/a&gt; &lt;/span&gt;  for creating the multi-file architecture, the continuous work on the type inference, plugins, and miscellaneous improvements.&lt;/p&gt;
&lt;p&gt;Props to &lt;span&gt; &lt;span&gt;Core Contributor&lt;/span&gt; &lt;a href=&quot;https://github.com/nhedger&quot; title=&quot;Member @nhedger&quot;&gt; &lt;img src=&quot;https://biomejs.dev/_astro/nhedger_Z1HAhwb.webp?dpl=69d3d5158d55f30009c8158f&quot; alt=&quot;Member @nhedger&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;25&quot; height=&quot;25&quot;&gt; &lt;span&gt;@nhedger&lt;/span&gt; &lt;/a&gt; &lt;/span&gt;  for authoring the &lt;a href=&quot;https://github.com/biomejs/setup-biome&quot;&gt;GitHub Action&lt;/a&gt;, and &lt;a href=&quot;https://biomejs.dev/blog/2025-05-29-biome-vscode-v3/&quot;&gt;shipping&lt;/a&gt; the new version of the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=biomejs.biome&quot;&gt;VS Code extension&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;span&gt; &lt;span&gt;Core Contributor&lt;/span&gt; &lt;a href=&quot;https://github.com/dyc3&quot; title=&quot;Member @dyc3&quot;&gt; &lt;img src=&quot;https://biomejs.dev/_astro/dyc3_2jNgdt.webp?dpl=69d3d5158d55f30009c8158f&quot; alt=&quot;Member @dyc3&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;25&quot; height=&quot;25&quot;&gt; &lt;span&gt;@dyc3&lt;/span&gt; &lt;/a&gt; &lt;/span&gt;  for leading the work on the HTML parser and formatter. They are both very complex pieces of software, especially when it comes to matching Prettier’s formatting experience.&lt;/p&gt;
&lt;p&gt;Last but not least, a great thanks to all our other &lt;a href=&quot;https://github.com/biomejs/biome#sponsors&quot;&gt;sponsors&lt;/a&gt; and &lt;a href=&quot;https://biomejs.dev/internals/people-and-credits#contributors&quot;&gt;contributors&lt;/a&gt; as well!&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;whats-next&quot;&gt;What’s next&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;No software is exempt from bugs, so we will ensure that we squash them and release patches.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://biomejs.dev/internals/people-and-credits#core-contributors&quot;&gt;Core Contributors&lt;/a&gt; will focus on moving forward the &lt;a href=&quot;https://biomejs.dev/blog/roadmap-2025#-2025-roadmap&quot;&gt;Roadmap for 2025&lt;/a&gt;, and focus on the following features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make HTML support stable.&lt;/li&gt;
&lt;li&gt;Expand HTML to support other frameworks such as Vue, Svelte, and Astro.&lt;/li&gt;
&lt;li&gt;Work on Markdown support, starting from the parser.&lt;/li&gt;
&lt;li&gt;Continue working on the inference infrastructure, so we can cover more cases and add new rules.&lt;/li&gt;
&lt;li&gt;and more!&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;i-like-where-this-is-going-how-can-i-help&quot;&gt;I like where this is going, how can I help?&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;I want to remind you that Biome is a project led by volunteers who like programming, open-source, and embrace the Biome philosophy, so any help is welcome 😁&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;translations&quot;&gt;Translations&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;If you are familiar with Biome and would like to contribute to its outreach, you can assist us by translating the website into your native language. In this &lt;a href=&quot;https://biomejs.dev/i18n-dashboard/&quot;&gt;dashboard&lt;/a&gt;, you can check the supported languages and if they are up to date.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;chat-with-us&quot;&gt;Chat with us&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Join our &lt;a href=&quot;https://biomejs.dev/chat&quot;&gt;Discord server&lt;/a&gt;, and engage with the community. Chatting with the community and being part of the community is a form of contribution.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;code-contributions&quot;&gt;Code contributions&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;If you like the technical aspects of the project, and you want to make your way into the Rust language, or practice your knowledge around parsers, compilers, analysers, etc., Biome is the project that does for you!&lt;/p&gt;
&lt;p&gt;There are numerous aspects to explore; I assure you that you won’t get bored. Here is a small list of the things you can start with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create new lint rules! We have so many rules that we haven’t implemented yet (ESLint, ESLint plugins, Next.js, Solid, etc.). We have a very &lt;a href=&quot;https://github.com/biomejs/biome/blob/main/crates/biome_analyze/CONTRIBUTING.md&quot;&gt;extensive technical guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/biomejs/biome/blob/main/crates/biome_parser/CONTRIBUTING.md&quot;&gt;Help&lt;/a&gt; &lt;a href=&quot;https://github.com/biomejs/biome/tree/main/crates/biome_yaml_parser&quot;&gt;building&lt;/a&gt; &lt;a href=&quot;https://github.com/biomejs/biome/tree/main/crates/biome_html_parser&quot;&gt;Biome&lt;/a&gt; &lt;a href=&quot;https://github.com/biomejs/biome/tree/main/crates/biome_markdown_parser&quot;&gt;parsers&lt;/a&gt;!
One interesting fact about Biome parsers is that they are recoverable parsers &lt;a href=&quot;https://biomejs.dev/internals/architecture/#parser-and-cst&quot;&gt;error resilient&lt;/a&gt; which emit a &lt;a href=&quot;https://en.wikipedia.org/wiki/Parse_tree&quot;&gt;CST&lt;/a&gt; instead of a classic AST.&lt;/li&gt;
&lt;li&gt;Implement new capabilities in our &lt;a href=&quot;https://github.com/biomejs/biome/tree/main/crates/biome_lsp&quot;&gt;LSP (Language Server Protocol)&lt;/a&gt;, or add new features in one of our editor extensions: &lt;a href=&quot;https://github.com/biomejs/biome-vscode&quot;&gt;VS Code&lt;/a&gt;, &lt;a href=&quot;https://github.com/biomejs/biome-zed&quot;&gt;Zed&lt;/a&gt; and &lt;a href=&quot;https://github.com/biomejs/biome-intellij&quot;&gt;JetBrains IntelliJ&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h4 id=&quot;financial-help&quot;&gt;Financial help&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;If you believe in the future of the project, you can also help with a financial contribution, via &lt;a href=&quot;https://opencollective.com/biome&quot;&gt;Open Collective&lt;/a&gt; or &lt;a href=&quot;https://github.com/sponsors/biomejs&quot;&gt;GitHub Sponsors&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Additionally, the project provides an &lt;a href=&quot;https://biomejs.dev/enterprise&quot;&gt;enterprise support program &lt;/a&gt; where a company you can employ one of the core contributors to work a specific aspect of the Biome toolchain.&lt;/p&gt;</content:encoded></item><item><title>VS Code extension V3</title><link>https://biomejs.dev/blog/2025-05-29-biome-vscode-v3/</link><guid isPermaLink="true">https://biomejs.dev/blog/2025-05-29-biome-vscode-v3/</guid><description>Biome releases v3 of the VS Code extension

</description><pubDate>Tue, 29 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We’re excited to announce that version 3 of the Biome VS Code extension is now
available! This release includes a range of new features and improvements to
make your development experience even better:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🗄️ Support for multi-root workspaces&lt;/li&gt;
&lt;li&gt;📝 Support for single-file mode&lt;/li&gt;
&lt;li&gt;👻 Support for unsaved files&lt;/li&gt;
&lt;li&gt;🔄 Automatic reload after updating Biome&lt;/li&gt;
&lt;li&gt;⚙️ Automatic reload after configuration changes&lt;/li&gt;
&lt;li&gt;✨ Improved status indicator&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;multi-root-workspaces&quot;&gt;Multi-root workspaces&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The Biome extension now supports &lt;a href=&quot;https://code.visualstudio.com/docs/editor/multi-root-workspaces&quot;&gt;multi-root workspaces&lt;/a&gt;, so you can work on
multiple projects side by side in a single VS Code window. Each workspace folder
now runs its own independent Biome instance, keeping your projects isolated.&lt;/p&gt;
&lt;p&gt;:::caution[heads up for pre-release users] If you’ve been using the pre-release
version over the past few months, please note that support for the
&lt;code dir=&quot;auto&quot;&gt;biome.projects&lt;/code&gt; setting has been &lt;strong&gt;removed&lt;/strong&gt; in the final release. We now
recommend using &lt;strong&gt;multiple workspace folders&lt;/strong&gt; instead to manage multiple
projects. :::&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;single-file-mode&quot;&gt;Single-file mode&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Sometimes you just need to make a quick edit to &lt;em&gt;that one file&lt;/em&gt;. The extension
now fully supports &lt;strong&gt;single-file mode&lt;/strong&gt;, making it easy to work with files that
aren’t part of a full project.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;code&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;that-one-file.js&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;To use this feature, make sure you have &lt;a href=&quot;https://biomejs.dev/guides/manual-installation/&quot;&gt;Biome installed globally&lt;/a&gt;. No worries
if you forget, the extension will let you know if it can’t find Biome in your
&lt;code dir=&quot;auto&quot;&gt;PATH&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;unsaved-files--vs-code-settings&quot;&gt;Unsaved files &amp;#x26; VS Code settings&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The extension now supports formatting and linting unsaved (Untitled) files, as
well as your VS Code settings. When you open one of these, the extension will
spin up a global Biome instance on demand.&lt;/p&gt;
&lt;p&gt;As with single-file mode, this feature requires &lt;a href=&quot;https://biomejs.dev/guides/manual-installation/&quot;&gt;Biome to be installed
globally&lt;/a&gt;. The extension will notify you if it’s missing from your PATH.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;automatic-reload&quot;&gt;Automatic reload&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;When the extension detects that Biome has been updated in your project
dependencies, it will automatically reload the relevant Biome instances to use
the latest version.&lt;/p&gt;
&lt;p&gt;Additionally, any changes to the extension’s configuration will trigger a reload
of the Biome instance to ensure your new settings take effect immediately.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;improved-status-indicator&quot;&gt;Improved status indicator&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The status bar now more reliably reflects the status of Biome for your active
workspace folder. When you switch between workspace folders, the indicator
updates accordingly.&lt;/p&gt;
&lt;p&gt;Plus, clicking the status indicator opens the logs for the current Biome
instance, making it easier to access logs when troubleshooting.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;retiring-the-downloader&quot;&gt;Retiring the downloader&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;From the start, the downloader was meant to bridge the gap until you installed
Biome as a project dependency.&lt;/p&gt;
&lt;p&gt;Managing the lifecycle of downloaded binaries—including updates and
cross-platform support is complex. We believe package managers handle this
better than we could.&lt;/p&gt;
&lt;p&gt;Going forward, if the extension needs a global Biome installation but can’t find
it, you’ll see a notification with instructions on how to install Biome
globally. And don’t worry, you can easily silence this notification if you
prefer not to be reminded.&lt;/p&gt;</content:encoded></item><item><title>Biome partners with Vercel to improve type inference</title><link>https://biomejs.dev/blog/vercel-partners-biome-type-inference/</link><guid isPermaLink="true">https://biomejs.dev/blog/vercel-partners-biome-type-inference/</guid><description>Vercel has become a Platinum Sponsor of Biome to further our type inference efforts

</description><pubDate>Wed, 02 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Back at the start of 2024, Biome added an ambitious goal to its
&lt;a href=&quot;https://biomejs.dev/blog/roadmap-2024&quot;&gt;roadmap&lt;/a&gt;: integrate a subset of the
&lt;strong&gt;TypeScript type system&lt;/strong&gt; directly into Biome so that type-informed lint rules
can work out of the box.&lt;/p&gt;
&lt;p&gt;In order to make this feasible, we first needed better infrastructure. The main
blocker for this was multi-file analysis, which is coming with
&lt;a href=&quot;https://biomejs.dev/blog/biome-v2-0-beta&quot;&gt;Biome 2.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Today, we finally have the technical means to implement this goal, but, as a
project, we need more than only technical means. Which is why we are grateful
to announce Vercel as a partner to help us achieve this goal and push the web
forward.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;vercel-becomes-biomes-first-platinum-sponsor&quot;&gt;Vercel becomes Biome’s first platinum sponsor&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://vercel.com/&quot;&gt;Vercel&lt;/a&gt; has contracted me (one of the Biome lead
developers) to work on our type inference effort for many months. Vercel’s goal
with this partnership is to both help improve their own internal linter DX (as
they have recently standardized on Biome) and share those improvements with the
rest of the JavaScript ecosystem.&lt;/p&gt;
&lt;p&gt;We aim to have a fully
functioning&lt;a href=&quot;#how-can-you-write-a-type-informed-lint-rule-if-you-dont-know-the-type-information-is-correct&quot;&gt;(*)&lt;/a&gt;
versions of the &lt;a href=&quot;https://next.biomejs.dev/linter/rules/no-floating-promises/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noFloatingPromises&lt;/code&gt;&lt;/a&gt;
rule and a similar &lt;code dir=&quot;auto&quot;&gt;noMisusedPromises&lt;/code&gt; rule.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;frequently-asked-questions&quot;&gt;Frequently Asked Questions&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Because type inference and type checkers are popular topics in our community,
I have collected a few common questions on this topic.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;are-you-reimplementing-a-type-checker-in-biome&quot;&gt;Are you reimplementing a type checker in Biome?&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;No. TypeScript’s &lt;code dir=&quot;auto&quot;&gt;tsc&lt;/code&gt; is a complex and fully-featured type checker, and we have
no intention to rebuild it. For type &lt;em&gt;checking&lt;/em&gt; you are expected to continue to
use &lt;code dir=&quot;auto&quot;&gt;tsc&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This work focuses on type &lt;em&gt;inference&lt;/em&gt; which is a small subset of the
functionality of a full type checker. The goal is to be able to write lint rules
that act on type information, without needing to prove that this type
information is correct.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;how-can-you-write-a-type-informed-lint-rule-if-you-dont-know-the-type-information-is-correct&quot;&gt;How can you write a type-informed lint rule if you don’t know the type information is correct?&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Linters have different aims than type checkers. Where a type checker aims to
detect misuse of types, a linter aims to detect common mistakes in general. But
the goal of detecting common mistakes doesn’t require 100% correctness when it
comes to the types it operates on. In fact, even the
&lt;a href=&quot;https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals&quot;&gt;TypeScript Design Goals&lt;/a&gt;
state they are willing to compromise correctness in favor of productivity.&lt;/p&gt;
&lt;p&gt;For a linter, what’s most important is that we don’t flag &lt;em&gt;false positives&lt;/em&gt;,
instances where our lint rules may think there’s an issue when really there’s
not. False positives are a source of frustration for developers, because they
take time to analyze; time that was wasted when it turns out there really wasn’t
an issue to begin with.&lt;/p&gt;
&lt;p&gt;On the other hand, &lt;em&gt;false negatives&lt;/em&gt; are less problematic. They represent
situations where we wish the lint rule would flag an issue, but didn’t. They can
also represent lost productivity (by not flagging the issue early in the
pipeline), but they are not productivity lost due to the rule itself.&lt;/p&gt;
&lt;p&gt;Hypothetically, a lint rule that has no false positives, but has 20% false
negatives, still offers 80% of the value of a rule that is always correct. So
our goal is simply: Create lint rules that don’t flag false positives,
while trying to get the amount of false negatives down as much as we can.&lt;/p&gt;
&lt;p&gt;We cannot say upfront which percentage we will actually achieve, but since
Vercel is sponsoring this work, we’ll use their repositories as a benchmark and
try to optimise towards their use cases.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;how-does-microsofts-announcement-of-a-go-port-for-tsc-influence-your-work&quot;&gt;How does Microsoft’s announcement of a Go port for &lt;code dir=&quot;auto&quot;&gt;tsc&lt;/code&gt; influence your work?&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;It’s too early to tell. The Go port is not available to users yet, and the APIs
that should allow it to be used by other tooling aren’t expected until the end
of the year. Additionally, even though the Go port is supposedly much faster
than the Node.js version, it will likely still be significantly slower than an
implementation built into Biome’s core due to inter-process communication and
the need to do duplicate work such as parsing files in separate processes.&lt;/p&gt;
&lt;p&gt;For now, that gives us an opportunity to pursue our own type inference
implementation and see how it goes. When the Go version is available for
integration into other tools, we can always reevaluate our approach.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;can-we-follow-your-progress&quot;&gt;Can we follow your progress?&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Yes! There’s a public project overview that people can inspect:
&lt;a href=&quot;https://github.com/orgs/biomejs/projects/4/views/2&quot;&gt;https://github.com/orgs/biomejs/projects/4/views/2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Note that issues may be continuously added to the project as false negatives
keep popping up.&lt;/p&gt;</content:encoded></item><item><title>Biome v2.0 beta</title><link>https://biomejs.dev/blog/biome-v2-0-beta/</link><guid isPermaLink="true">https://biomejs.dev/blog/biome-v2-0-beta/</guid><description>Biome 2.0 will be packed with major features and many smaller fixes, rules, and other improvements.
There&apos;s a lot to unpack, and we request the community&apos;s help testing this beta, so the final
release can be as smooth as possible.

</description><pubDate>Mon, 24 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;After hard work from our team, Biome’s long-awaited 2.0 release is nearing completion. It will be packed with many large features, so we would like your help testing it with a public beta!&lt;/p&gt;
&lt;p&gt;If you would like to try it out, you can update Biome and migrate your configuration using the following commands:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--save-dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--save-exact&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@biomejs/biome@beta&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@biomejs/biome@beta&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;migrate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--write&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Also, make sure you use the prereleases of our IDE extensions. The stable versions of our extensions are not yet prepared for Biome 2.0!&lt;/p&gt;
&lt;p&gt;Documentation for the upcoming release can be found at &lt;a href=&quot;https://next.biomejs.dev/&quot;&gt;https://next.biomejs.dev/&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;new-features&quot;&gt;New features&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;While the final 2.0 release may still have small changes in its final feature set, here’s what you can expect in the beta:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Plugins:&lt;/strong&gt; You can write custom lint rules using GritQL.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Domains:&lt;/strong&gt; Domains help to group lint rules by technology, framework, or well, domain. Thanks to domains, your default set of recommended lint rules will only include those that are relevant to your project.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-file analysis:&lt;/strong&gt; Lint rules can now apply analysis based on information from other files, enabling rules such as &lt;code dir=&quot;auto&quot;&gt;noImportCycles&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;noFloatingPromises&lt;/code&gt;:&lt;/strong&gt; Still a proof-of-concept, but our first type-aware lint rule is making an appearance.&lt;/li&gt;
&lt;li&gt;Our &lt;strong&gt;Import Organizer&lt;/strong&gt; has seen a major revamp.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assists:&lt;/strong&gt; Biome Assist can provide actions without diagnostics, such as sorting object keys.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improved suppressions:&lt;/strong&gt; Suppress a rule in an entire file using &lt;code dir=&quot;auto&quot;&gt;// biome-ignore-all&lt;/code&gt;, or suppress a range using &lt;code dir=&quot;auto&quot;&gt;// biome-ignore-start&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;// biome-ignore-end&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTML formatter:&lt;/strong&gt; Still in preview, this is the first time we ship an HTML formatter.&lt;/li&gt;
&lt;li&gt;Many, &lt;strong&gt;many&lt;/strong&gt;, fixes, new lint rules, and other improvements.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;plugins&quot;&gt;Plugins&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Biome 2.0 comes with our first iteration of &lt;a href=&quot;https://biomejs.dev/linter/plugins&quot;&gt;Linter Plugins&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These plugins are still limited in scope: They allow for matching code snippets and reporting diagnostics on them.&lt;/p&gt;
&lt;p&gt;Here is an example of a plugin that reports on all usages of &lt;code dir=&quot;auto&quot;&gt;Object.assign()&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;`$fn($args)` where {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;$fn &amp;#x3C;: `Object.assign`,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;register_diagnostic(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;span = $fn,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;message = &quot;Prefer object spread instead of `Object.assign()`&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;It’s a first step, but we have plenty of ideas for making them more powerful, and we’ll eagerly hear from our users on what they would like to see prioritised.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;domains&quot;&gt;Domains&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;We’ve introduced a new linter feature: &lt;a href=&quot;https://next.biomejs.dev/linter/domains/&quot;&gt;Domains&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Domains are a new way to organise lint rules by technology, framework, or well, domain. Right now, we have identified four domains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;next&lt;/code&gt;: Rules related to Next.js.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;react&lt;/code&gt;: Rules related to React.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;solid&lt;/code&gt;: Rules related to Solid.js.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;test&lt;/code&gt;: Rules related to testing, regardless of framework or library.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can enable and disable rules that belong to a domain together:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.jsonc&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;linter&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;domains&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;test&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;all&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;// all rules that belong to this domain are enabled&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;react&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;recommended&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;// only the recommended rules from this domain are enabled&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;solid&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;none&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;//&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rules&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;related&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Solid&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;are&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;disabled&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;But it gets better: Biome will automatically inspect your &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt; and determine which domains should be enabled by default. For instance, if you have &lt;code dir=&quot;auto&quot;&gt;react&lt;/code&gt; defined as one of your dependencies, the default setting for the &lt;code dir=&quot;auto&quot;&gt;react&lt;/code&gt; domain automatically becomes &lt;code dir=&quot;auto&quot;&gt;recommended&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This way, Biome’s total set of recommended rules should be most relevant to your specific project needs.&lt;/p&gt;
&lt;p&gt;And finally, domains can add global variables to the &lt;code dir=&quot;auto&quot;&gt;javascript.globals&lt;/code&gt; setting. This should make Biome even easier to setup.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;multi-file-analysis&quot;&gt;Multi-file analysis&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Before version 2.0, Biome lint rules could only operate on one file at a time. This brought us far, but many of the more interesting rules require information from other files too.&lt;/p&gt;
&lt;p&gt;To accomplish this, we have added a &lt;em&gt;file scanner&lt;/em&gt; to Biome that scans all the files in your project and indexes them, similar to what an LSP service might do in your IDE. We’re not going to beat around the bush: Scanning projects means that Biome has become slower for many projects. But we do believe the ability to do multi-file analysis is worth it. And without a scanner, multi-file analysis would become &lt;em&gt;even slower&lt;/em&gt;, as rules would need to perform ad-hoc file system access individually.&lt;/p&gt;
&lt;p&gt;That said, this is a beta, and there are certainly more opportunities to improve our scanner and its performance. If you have a repository where you feel our performance became unacceptably slow, please reach out and &lt;a href=&quot;https://github.com/biomejs/biome/issues/new?template=03_bug.yml&quot;&gt;file an issue&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For now, we have a few interesting rules that can make use of our multi-file analysis:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://next.biomejs.dev/linter/rules/no-import-cycles/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noImportCycles&lt;/code&gt;&lt;/a&gt; is able to look at import statements and detect cycles between them.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://next.biomejs.dev/linter/rules/no-private-imports/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noPrivateImports&lt;/code&gt;&lt;/a&gt; is a new rule based on the &lt;code dir=&quot;auto&quot;&gt;useImportRestrictions&lt;/code&gt; nursery rule from Biome 1.x, and inspired by ESLint’s &lt;a href=&quot;https://github.com/uhyo/eslint-plugin-import-access&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;plugin-import-access&lt;/code&gt;&lt;/a&gt;. It forbids importing symbols with an &lt;code dir=&quot;auto&quot;&gt;@private&lt;/code&gt; JSDoc tag from other modules, and forbids importing symbols with an &lt;code dir=&quot;auto&quot;&gt;@package&lt;/code&gt; tag if the importing file is not in the same folder or one of its subfolders.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://next.biomejs.dev/linter/rules/use-import-extensions/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useImportExtensions&lt;/code&gt;&lt;/a&gt; has been improved because it can now determine the actual extension that needs to be used for an import, instead of guessing based on heuristics.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, we’ve also designed the multi-file analysis with monorepos in mind. While full monorepo support may not make it in time for the 2.0 release, we expect to be able to deliver more on this front soon.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;nofloatingpromises&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noFloatingPromises&lt;/code&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;With Biome’s linter we have always strived to provide a battery-included approach to linting. This means we’re not just aiming to replace ESLint, but also its plugins. One of the hardest plugins to replace is &lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;typescript-eslint&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Biome has featured some rules from &lt;code dir=&quot;auto&quot;&gt;typescript-eslint&lt;/code&gt; for a while now, but we could never replace all rules, because they relied on type information for their analysis. And in order to get type information, &lt;code dir=&quot;auto&quot;&gt;typescript-eslint&lt;/code&gt; relies on &lt;code dir=&quot;auto&quot;&gt;tsc&lt;/code&gt; itself, which is rather slow and also complicates setup.&lt;/p&gt;
&lt;p&gt;This is about to change. With Biome 2.0, we’re introducing a first version of the &lt;a href=&quot;https://next.biomejs.dev/linter/rules/no-floating-promises&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noFloatingPromises&lt;/code&gt;&lt;/a&gt; rule, one of the most-requested rules that relies on type information. In fairness, we should not consider it more than a proof-of-concept right now, because there are some notable limitations to its capabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It doesn’t understand complex types yet.&lt;/li&gt;
&lt;li&gt;It cannot do type inference yet.&lt;/li&gt;
&lt;li&gt;It can currently only analyse types that occur in the same file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Still, its capabilities are sufficient to catch some of the low-hanging fruit. Consider this small snippet:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;example.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;returnsPromise&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;/* ... */&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;returnsPromise&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;It will trigger the following diagnostic:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;example.js:3:1 lint/nursery/noFloatingPromises ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ℹ A “floating” Promise was found, meaning it is not properly handled and could lead to ignored errors or unexpected behavior.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1 │ async function returnsPromise() { /* ... */ }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;2 │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&gt; 3 │ returnsPromise().then(() =&gt; {});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;5 │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ℹ This happens when a Promise is not awaited, lacks a .catch or .then rejection handler, or is not explicitly ignored using the void operator.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;As you can guess, we intend to expand this rule’s capabilities over time. And with our new multi-file analysis in place, we expect to be able to make serious strides with this. Stay tuned for more announcements on this front!&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;import-organizer-revamp&quot;&gt;Import Organizer Revamp&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;In Biome 1.x, our Import Organizer had several limitations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Groups of imports or exports would be considered separate &lt;em&gt;chunks&lt;/em&gt;, meaning they would be sorted independently. This meant the following &lt;strong&gt;didn’t work&lt;/strong&gt; as expected:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;example.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { lib2 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;library2&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { util } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./utils.js&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { lib1 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;library1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;It would correctly sort &lt;code dir=&quot;auto&quot;&gt;&quot;library1&quot;&lt;/code&gt; to be placed above &lt;code dir=&quot;auto&quot;&gt;&quot;./utils.js&quot;&lt;/code&gt;, but it wouldn’t be able to
carry it over the newline to the top. What we got was this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;organizer_v1.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { lib2 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;library2&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { lib1 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;library1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { util } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./utils.js&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;But instead, what we really wanted was this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;organizer_v2.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { lib1 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;library1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { lib2 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;library2&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { util } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./utils.js&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Separate imports from the same module wouldn’t be merged. Consider the following example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;example.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { util1 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./utils.js&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { util2 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./utils.js&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Nothing would be done to merge these import statements, whereas what we would have wanted was this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;organizer_v2.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { util1, util2 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./utils.js&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No custom ordering could be configured. Maybe you didn’t really like the default approach of ordering by “distance” from the source file that you’re importing from. Maybe you wanted to organise like this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;organizer_v2.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { open } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;node:fs&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { internalLib1 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@company/library1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { internalLib2 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@company/library2&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { lib1 } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;library1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In Biome 2.0, all these limitations are lifted. In fact, if you look at the examples above, all snippets labeled &lt;code dir=&quot;auto&quot;&gt;organizer_v2.js&lt;/code&gt; can be produced just like that by our new import organizer.&lt;/p&gt;
&lt;p&gt;Other improvements include support for organizing &lt;code dir=&quot;auto&quot;&gt;export&lt;/code&gt; statements, support for “detached” comments for explicitly separating import chunks if necessary, and import attribute sorting.&lt;/p&gt;
&lt;p&gt;You can find the documentation on the new import organizer at &lt;a href=&quot;https://next.biomejs.dev/assist/actions/organize-imports/&quot;&gt;https://next.biomejs.dev/assist/actions/organize-imports/&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;assists&quot;&gt;Assists&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The Import Organizer was always a bit of a special case in Biome. It was neither part of the linter, nor of the formatter. This was because we didn’t want it to show diagnostics the way the linter does, while its organizing features went beyond what we expect from the formatter.&lt;/p&gt;
&lt;p&gt;In Biome 2.0, we have generalised such use cases in the form of Biome Assist. The assist is meant to provide &lt;strong&gt;actions&lt;/strong&gt;, which are similar to the &lt;em&gt;fixes&lt;/em&gt; in lint rules, but without the diagnostics.&lt;/p&gt;
&lt;p&gt;The Import Organizer has become an assist, but we’ve started using this approach for new assists too: &lt;a href=&quot;https://next.biomejs.dev/assist/actions/use-sorted-keys/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useSortedKeys&lt;/code&gt;&lt;/a&gt; can sort keys in object literals, while &lt;a href=&quot;https://next.biomejs.dev/assist/actions/use-sorted-attributes/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useSortedAttributes&lt;/code&gt;&lt;/a&gt; can sort attributes in JSX.&lt;/p&gt;
&lt;p&gt;For more information about assists, see: &lt;a href=&quot;https://next.biomejs.dev/assist/&quot;&gt;https://next.biomejs.dev/assist/&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;improved-suppressions&quot;&gt;Improved suppressions&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;In addition to the &lt;code dir=&quot;auto&quot;&gt;// biome-ignore&lt;/code&gt; comments we already supported, we now support &lt;code dir=&quot;auto&quot;&gt;// biome-ignore-all&lt;/code&gt; for suppressing a lint rule or the formatter in an entire file.&lt;/p&gt;
&lt;p&gt;We also added support for suppression ranges using &lt;code dir=&quot;auto&quot;&gt;// biome-ignore-start&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;// biome-ignore-end&lt;/code&gt;. Note that &lt;code dir=&quot;auto&quot;&gt;// biome-ignore-end&lt;/code&gt; is optional in case you want to let a range run until the end of the file.&lt;/p&gt;
&lt;p&gt;For more information about suppressions, see: &lt;a href=&quot;https://next.biomejs.dev/linter/#suppress-lint-rules&quot;&gt;https://next.biomejs.dev/linter/#suppress-lint-rules&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;html-formatter&quot;&gt;HTML formatter&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;After a few months of hard work, we are happy to announce that the HTML formatter is now ready for users to try out and start reporting bugs! This is a huge step towards Biome fully supporting HTML-ish templating languages used in frameworks like Vue and Svelte.&lt;/p&gt;
&lt;p&gt;The HTML formatter only touches actual &lt;code dir=&quot;auto&quot;&gt;.html&lt;/code&gt; files for now, so no formatting of html in &lt;code dir=&quot;auto&quot;&gt;.vue&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;.svelte&lt;/code&gt; files yet. It also won’t format embedded languages like JavaScript or CSS yet. HTML’s options like &lt;code dir=&quot;auto&quot;&gt;attributePosition&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;bracketSameLine&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;whitespaceSensitivity&lt;/code&gt; have been implemented.&lt;/p&gt;
&lt;p&gt;The HTML formatter is still pretty experimental, so it will remain &lt;strong&gt;disabled by default for the full 2.0 release&lt;/strong&gt;. At the time of writing, Biome is able to parse the grand majority of Prettier’s HTML tests, and format 46/124 of them correctly. Despite not matching Prettier yet, we’re pretty confident that it &lt;em&gt;should&lt;/em&gt; output documents that are formatted adequately without destroying anything. If you find a case where it doesn’t, &lt;a href=&quot;https://github.com/biomejs/biome/issues&quot;&gt;please let us know&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;You can enable the HTML formatter by adding the following to your config file:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;html&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;formatter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;new-rules&quot;&gt;New rules&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Several new rules have added since v1.9:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://next.biomejs.dev/linter/rules/no-await-in-loop&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noAwaitInLoop&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://next.biomejs.dev/linter/rules/no-bitwise-operators/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noBitwiseOperators&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://next.biomejs.dev/linter/rules/no-destructured-props/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noDestructuredProps&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://next.biomejs.dev/linter/rules/no-floating-promises&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noFloatingPromises&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://next.biomejs.dev/linter/rules/no-import-cycles&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noImportCycles&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://next.biomejs.dev/linter/rules/no-private-imports/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noPrivateImports&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://next.biomejs.dev/linter/rules/no-ts-ignore&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noTsIgnore&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://next.biomejs.dev/linter/rules/no-unwanted-polyfillio&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noUnwantedPolyfillio&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://next.biomejs.dev/linter/rules/use-consistent-object-definition/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useConsistentObjectDefinition&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://next.biomejs.dev/linter/rules/use-for-component/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useForComponent&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;miscellaneous&quot;&gt;Miscellaneous&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BREAKING:&lt;/strong&gt; The configuration fields &lt;code dir=&quot;auto&quot;&gt;include&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;ignore&lt;/code&gt; have been replaced with a single &lt;code dir=&quot;auto&quot;&gt;includes&lt;/code&gt; field.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BREAKING:&lt;/strong&gt; Reworked some recommended rules recommended to be less pedantic and blocking. This is a breaking change if your project relied on those rules to block the CI in case of violations. If you used the &lt;code dir=&quot;auto&quot;&gt;migrate&lt;/code&gt; command, the behaviour should remain as before.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BREAKING:&lt;/strong&gt; The &lt;code dir=&quot;auto&quot;&gt;style&lt;/code&gt; rules aren’t recommended anymore. If you used the &lt;code dir=&quot;auto&quot;&gt;migrate&lt;/code&gt; command, the behaviour should remain as before.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BREAKING:&lt;/strong&gt; Removed deprecated rules:
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;noConsoleLog&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;noInvalidNewBuiltin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;noNewSymbol&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;useShorthandArrayType&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;useSingleCaseStatement&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BREAKING:&lt;/strong&gt; Many deprecated options, including some that still referenced the old Rome name, have been removed.&lt;/li&gt;
&lt;li&gt;Added a new option &lt;code dir=&quot;auto&quot;&gt;javascript.parser.jsxEverywhere&lt;/code&gt; to control whether Biome should expect JSX syntax in &lt;code dir=&quot;auto&quot;&gt;.js&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;.mjs&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;.cjs&lt;/code&gt; files.&lt;/li&gt;
&lt;li&gt;Improved monorepo support: The rule &lt;a href=&quot;https://biomejs.dev/linter/rules/no-undeclared-dependencies/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noUndeclaredDependencies&lt;/code&gt;&lt;/a&gt; now works correctly in monorepos by using the nearest &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt; file, instead of only the root one.&lt;/li&gt;
&lt;li&gt;We have enabled support for &lt;code dir=&quot;auto&quot;&gt;.editorconfig&lt;/code&gt; files by default.&lt;/li&gt;
&lt;li&gt;Changed default formatting of &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt; to align better with formatting by package managers.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;and-more&quot;&gt;And more!&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;For the full list of changes, please refer to our &lt;a href=&quot;https://biomejs.dev/internals/changelog/&quot;&gt;changelog&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Roadmap 2025 and Biome 2.0</title><link>https://biomejs.dev/blog/roadmap-2025/</link><guid isPermaLink="true">https://biomejs.dev/blog/roadmap-2025/</guid><description>A look at what 2025 will bring for us: Biome 2.0, enterprise support, and our roadmap

</description><pubDate>Wed, 22 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today we’re happy to share our plans for Biome 2.0 as well as the rest of our roadmap for 2025. But before we dive into what’s coming, let’s do a quick recap of the major developments in 2024.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;-recap-biome-in-2024&quot;&gt;🎆 Recap: Biome in 2024&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;2024 was a great year for Biome. Let’s see what happened:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We released 4 new “minor” Biome versions, from 1.6 through 1.9, with plenty of useful features:
&lt;ul&gt;
&lt;li&gt;New &lt;code dir=&quot;auto&quot;&gt;biome search&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;biome explain&lt;/code&gt; commands, while the &lt;code dir=&quot;auto&quot;&gt;biome migrate&lt;/code&gt; command was significantly expanded to help users coming from ESLint and Prettier.&lt;/li&gt;
&lt;li&gt;Added support for &lt;strong&gt;CSS&lt;/strong&gt; and &lt;strong&gt;GraphQL&lt;/strong&gt; formatting and linting.&lt;/li&gt;
&lt;li&gt;Partial support for &lt;strong&gt;Astro&lt;/strong&gt;, &lt;strong&gt;Svelte&lt;/strong&gt; and &lt;strong&gt;Vue&lt;/strong&gt; files.&lt;/li&gt;
&lt;li&gt;The ability to let configuration files extend from one another, which is especially useful in monorepo and larger organizational setups.&lt;/li&gt;
&lt;li&gt;Custom &lt;a href=&quot;https://biomejs.dev/reference/reporters/&quot;&gt;reporters&lt;/a&gt; for better CI integration and machine-readable output.&lt;/li&gt;
&lt;li&gt;Support for &lt;code dir=&quot;auto&quot;&gt;.editorconfig&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;We added countless new lint rules and miscellaneous fixes and improvements, with a special shoutout to &lt;a href=&quot;https://biomejs.dev/linter/rules/use-sorted-classes/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useSortedClasses&lt;/code&gt;&lt;/a&gt; that marks the beginning of dedicated &lt;strong&gt;Tailwind&lt;/strong&gt; support.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Our &lt;a href=&quot;https://github.com/biomejs/biome/blob/main/CONTRIBUTING.md#current-members&quot;&gt;team of maintainers&lt;/a&gt; has grown from 10 members at the start of 2024 to 18 today.&lt;/li&gt;
&lt;li&gt;We won the &lt;strong&gt;Productivity Booster&lt;/strong&gt; award of the &lt;a href=&quot;https://osawards.com/javascript/2024&quot;&gt;OS Awards 2024&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;We gained several new &lt;a href=&quot;https://github.com/biomejs/biome#sponsors&quot;&gt;sponsors&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;We improved our IDE support on multiple fronts:
&lt;ul&gt;
&lt;li&gt;A new Zed extension has been contributed to the project.&lt;/li&gt;
&lt;li&gt;Our VS Code extension has seen an overhaul that’s currently in Pre-Release.&lt;/li&gt;
&lt;li&gt;And even though this happened after the new year, we shouldn’t neglect to mention that our IDEA plugin has seen a major update too, which is now available in the nightly channel.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;-enterprise-support&quot;&gt;💳 Enterprise Support&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;One more thing that we are happy to announce is that as of January 2025, we are also offering &lt;a href=&quot;https://biomejs.dev/enterprise&quot;&gt;Enterprise Support&lt;/a&gt; for Biome. Hopefully this will allow some of our contributors to spend more of their time and effort towards Biome!&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;️-biome-20&quot;&gt;⏭️ Biome 2.0&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Right now our team is busy preparing for the Biome 2.0 release. Because our project is still run by volunteer contributors, we do not have an ETA for you. But we can share some of the goodies that will be coming:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Plugins&lt;/strong&gt;. A long-requested feature, we started the development of Biome plugins after an &lt;a href=&quot;https://github.com/biomejs/biome/discussions/1762&quot;&gt;RFC process&lt;/a&gt; that started in January 2024. Biome 2.0 will feature the first fruits of this labor: Users will be able to create their own lint rules using &lt;a href=&quot;https://docs.grit.io/language/overview&quot;&gt;GritQL&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Domains&lt;/strong&gt;. &lt;a href=&quot;https://github.com/biomejs/biome/blob/main/.changeset/introduce_the_domains_linter_feature.md&quot;&gt;Domains&lt;/a&gt; are a configuration feature that makes it easy for users to enable or disable all rules related to a specific domain, such as React, Next.js or testing frameworks. It also allows Biome to automatically enable recommended domain-specific rules based on the dependencies listed in your &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monorepo Support&lt;/strong&gt;. While support for monorepos was already improved with our &lt;code dir=&quot;auto&quot;&gt;extends&lt;/code&gt; feature in &lt;code dir=&quot;auto&quot;&gt;biome.json&lt;/code&gt;, many weak spots remained. Biome 2.0 has an improved architecture based on an internal &lt;code dir=&quot;auto&quot;&gt;ProjectLayout&lt;/code&gt; that should resolve most of these.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suppressions&lt;/strong&gt;. Biome already allowed &lt;em&gt;suppression&lt;/em&gt; of linter diagnostics through the use of &lt;code dir=&quot;auto&quot;&gt;// biome-ignore&lt;/code&gt; suppression comments. With Biome 2.0 we’re adding support for &lt;code dir=&quot;auto&quot;&gt;// biome-ignore-all&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;// biome-ignore-start&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;biome-ignore-end&lt;/code&gt; comments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-file analysis&lt;/strong&gt;. Last but not least, we’re adding true &lt;a href=&quot;https://github.com/biomejs/biome/issues/3307&quot;&gt;Multi-file support&lt;/a&gt; to Biome 2.0. This means that our lint rules will be able to query information from other files, which will enable much more powerful lint rules.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;-2025-roadmap&quot;&gt;🌌 2025 roadmap&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Again, we should preface a disclaimer here: We’re a community-driven project, so we cannot promise to deliver any of the features below. But that doesn’t mean we don’t have a wishlist of things we would like to work on in 2025 😉&lt;/p&gt;
&lt;p&gt;This year we will focus on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/biomejs/biome/issues/4726&quot;&gt;&lt;strong&gt;HTML support&lt;/strong&gt;&lt;/a&gt;. No toolchain for the web is complete without it, and we’re already working on it!&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/biomejs/biome/issues/3334&quot;&gt;&lt;strong&gt;Embedded languages&lt;/strong&gt;&lt;/a&gt;. CSS or GraphQL snippets inside a template literal in a JavaScript file? JavaScript or CSS inside an HTML file? Biome should be able to handle these as well, and we’ll try to make it happen. This should also lead to better support for &lt;strong&gt;Astro&lt;/strong&gt;, &lt;strong&gt;Svelte&lt;/strong&gt;, and &lt;strong&gt;Vue&lt;/strong&gt; than we have today.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/biomejs/biome/issues/3187&quot;&gt;&lt;strong&gt;Type inference&lt;/strong&gt;&lt;/a&gt;. This was already a wish for 2024, and we’re busy filling in the prerequisites such as multi-file analysis. There’s even an &lt;a href=&quot;https://github.com/biomejs/biome/pull/4911&quot;&gt;early proof-of-concept&lt;/a&gt; for a &lt;code dir=&quot;auto&quot;&gt;noFloatingPromises&lt;/code&gt; rule. This year we want to ship a real version of &lt;code dir=&quot;auto&quot;&gt;noFloatingPromises&lt;/code&gt;, and hopefully dabble further into type inference.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;.d.ts generation&lt;/strong&gt;. While we’re on the subject of types, we would also like to create our first transformation: generating &lt;code dir=&quot;auto&quot;&gt;.d.ts&lt;/code&gt; files from TypeScript sources. Initially we would only focus on TypeScript using &lt;a href=&quot;https://www.typescriptlang.org/tsconfig/#isolatedModules&quot;&gt;Isolated Modules&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JSDoc support&lt;/strong&gt;. Can we use &lt;a href=&quot;https://jsdoc.app/&quot;&gt;JSDoc&lt;/a&gt; comments as a source of type information too? If we are able to do type inference, this seems an opportunity we cannot pass on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Markdown support&lt;/strong&gt;. Some work &lt;a href=&quot;https://github.com/biomejs/biome/issues/3718&quot;&gt;has already started&lt;/a&gt; for it and it would be a nice addition to round out our language support.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;More plugins&lt;/strong&gt;. While Biome 2.0 will launch with the ability to create lint rules in GritQL, that’s only the tip of the iceberg. We know our users want more, and we certainly have ideas for more types of plugins. We’ll first collect feedback from the 2.0 release, and then we’ll decide which plugin area we’ll focus on next.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;️-your-support&quot;&gt;❤️ Your Support&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;We would like to thank our users and sponsors alike for their amazing support in 2024! Without you, this project would not be what it is today.&lt;/p&gt;
&lt;p&gt;Hopefully we can also count on your support for the coming year. If you would like to help out, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/biomejs/biome/blob/main/CONTRIBUTING.md&quot;&gt;Become a contributor&lt;/a&gt;. Please help us to build those features!&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/biomejs/biome/tree/main#funding&quot;&gt;Sponsor us&lt;/a&gt;. Ask your company to sponsor us: Biome is so fast that it can reduce your company’s CI times, improve developer productivity, and save money. Sponsorships also create exposure for your company.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/enterprise/&quot;&gt;Hire us&lt;/a&gt;. Is Biome missing anything that prevents your company from adopting it? You can make it happen by hiring us! Any company that hires a contributor to work on Biome for 3 months or more automatically applies for sponsorship benefits.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/biomejs/website/&quot;&gt;Improve our documentation&lt;/a&gt;. Write guides or recipes, or help to keep our translations up-to-date for non-English speakers.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>Biome v1.9 Anniversary Release</title><link>https://biomejs.dev/blog/biome-v1-9/</link><guid isPermaLink="true">https://biomejs.dev/blog/biome-v1-9/</guid><description>Let&apos;s celebrate the first anniversary of Biome and the release of Biome v1.9.
This new version enables CSS and GraphQL formatting and linting by default.
It also brings .editorconfig support and introduces a new search command.

</description><pubDate>Thu, 12 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today we’re excited to announce the release of Biome v1.9 and to celebrate the first anniversary of Biome 🎊 Let’s take a look back at the first year of Biome and then explore the new features in Biome 1.9.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;one-year-of-biome&quot;&gt;One year of Biome&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;We officially &lt;a href=&quot;https://biomejs.dev/blog/annoucing-biome/&quot;&gt;announced Biome&lt;/a&gt; on 29 August 2023. From its inception, Biome has been a free open source software driven by its community. We have a &lt;a href=&quot;https://github.com/biomejs/biome/blob/main/GOVERNANCE.md&quot;&gt;governance&lt;/a&gt; and a solid base of contributors to ensure the longevity of the project.&lt;/p&gt;
&lt;p&gt;In October 2023, one of the creators of &lt;a href=&quot;https://prettier.io/&quot;&gt;Prettier&lt;/a&gt; launched &lt;a href=&quot;https://console.algora.io/challenges/prettier&quot;&gt;the Prettier challenge&lt;/a&gt; that rewarded any project written in Rust that passes at least 95% of the Prettier tests for JavaScript. The aim of this challenge was to create a fast competitor to Prettier in order to stimulate improvements in Prettier’s performance. We quickly organized ourselves to get there as soon as possible. By the end of November, we &lt;a href=&quot;https://biomejs.dev/blog/biome-wins-prettier-challenge/&quot;&gt;surpassed this goal&lt;/a&gt; by passing 97% of the Prettier tests for JavaScript, as well as TypeScript, JSX and TSX!
The Biome formatter is really fast: it can format a large code base in less than 1 second. In the process, we identified several formatting issues in Prettier. This has also pushed contributions to Prettier that greatly improved its performance. This challenge was a win for the whole web ecosystem!&lt;/p&gt;
&lt;p&gt;By winning the challenge, we brought Biome to light. Many developers were excited to discover a fast alternative to Prettier, but also a fast alternative to &lt;a href=&quot;https://eslint.org/&quot;&gt;ESLint&lt;/a&gt;!
The approach of bundling both a formatter and a linter in one tool provides a unified and consistent experience with minimal configuration. Biome has been quickly adopted by many projects, including big ones such as &lt;a href=&quot;https://ant.design/&quot;&gt;Ant Design&lt;/a&gt;, &lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt;, &lt;a href=&quot;https://sentry.io/&quot;&gt;Sentry&lt;/a&gt;, &lt;a href=&quot;https://daisyui.com/&quot;&gt;daisyUI&lt;/a&gt;, &lt;a href=&quot;https://refine.dev/&quot;&gt;Refine&lt;/a&gt;, &lt;a href=&quot;https://discord.com/&quot;&gt;Discord&lt;/a&gt;, &lt;a href=&quot;https://www.pulumi.com/&quot;&gt;Pulumi&lt;/a&gt;, &lt;a href=&quot;https://labelstud.io/&quot;&gt;Label Studio&lt;/a&gt;, &lt;a href=&quot;https://spicetify.app/&quot;&gt;Spicetify&lt;/a&gt;, &lt;a href=&quot;https://apify.com/&quot;&gt;Apify&lt;/a&gt;, &lt;a href=&quot;https://slint.dev/&quot;&gt;Slint&lt;/a&gt;, &lt;a href=&quot;https://rspack.dev/&quot;&gt;Rspack&lt;/a&gt;, &lt;a href=&quot;https://fluidframework.com/&quot;&gt;FluidFramework&lt;/a&gt;, &lt;a href=&quot;https://sourcegraph.com/search?q=file:biome.json&amp;#x26;patternType=literal&amp;#x26;sm=0&quot;&gt;and others&lt;/a&gt;. Biome surpassed 2.7 million monthly NPM downloads in August 2024.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Biome monthly NPM downloads&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1062&quot; height=&quot;340&quot; src=&quot;https://biomejs.dev/_astro/biome-monthly-npm-downloads.BDqAA5ti_Z1kngIa.svg?dpl=69d3d5158d55f30009c8158f&quot;&gt;&lt;/p&gt;
&lt;p&gt;We gained sponsorship, notably &lt;a href=&quot;https://shiguredo.jp/&quot;&gt;Shiguredo&lt;/a&gt;, &lt;a href=&quot;https://l2beat.com/&quot;&gt;l2BEAT&lt;/a&gt;, &lt;a href=&quot;https://www.phoenixlabs.dev/&quot;&gt;Phoenix Labs&lt;/a&gt;, &lt;a href=&quot;https://kanamekey.com/&quot;&gt;KANAME&lt;/a&gt;, &lt;a href=&quot;https://nanabit.dev/&quot;&gt;Nanabit&lt;/a&gt;, &lt;a href=&quot;https://vital.io/&quot;&gt;Vital&lt;/a&gt;, &lt;a href=&quot;https://coderabbit.ai/&quot;&gt;CodeRabbit&lt;/a&gt;, and &lt;a href=&quot;https://forge42.dev/&quot;&gt;Forge42&lt;/a&gt;. These sponsorships have helped move the project forward by rewarding contributors and even paying for maintenance work in recent months. We would like to reward and encourage more contributions, then if you use Biome, please consider &lt;a href=&quot;https://opencollective.com/biome&quot;&gt;sponsoring us&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;We also gained many new contributors. Contributors who have made a significant contribution are regularly invited to join the Biome team. We started with a team of 5 core contributors, and we are now a team of &lt;a href=&quot;https://github.com/biomejs/biome/blob/main/CONTRIBUTING.md#current-members&quot;&gt;8 core contributors and 10 maintainers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In June 2024, Biome won the &lt;a href=&quot;https://osawards.com/javascript/2024&quot;&gt;JSNation’s productivity booster Open Source Award&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;biome-v19&quot;&gt;Biome v1.9&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;As we celebrate Biome’s first year, we’re pleased to announce the release of Biome 1.9, which brings many new features and bug fixes.&lt;/p&gt;
&lt;p&gt;Once you have upgraded to Biome v1.9.0, migrate your Biome configuration to the new version by running the &lt;code dir=&quot;auto&quot;&gt;migrate&lt;/code&gt; command:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;migrate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--write&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;stable-css-formatter-and-linter&quot;&gt;Stable CSS formatter and linter&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;We are thrilled to announce that Biome’s CSS formatter and linter are now considered stable and are &lt;strong&gt;enabled by default&lt;/strong&gt;. Do note that Biome only parses &lt;strong&gt;standard CSS syntax&lt;/strong&gt; so far, and doesn’t yet handle CSS dialects such as SCSS. As this is brand new functionality, you may also still run into some rough edges. Please report any problems you encounter!&lt;/p&gt;
&lt;p&gt;The CSS linter provides 15 stable lint rules that were ported from &lt;a href=&quot;https://stylelint.io/&quot;&gt;stylelint&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-generic-font-names/&quot;&gt;a11y/useGenericFontNames&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-invalid-direction-in-linear-gradient/&quot;&gt;correctness/noInvalidDirectionInLinearGradient&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-invalid-grid-areas/&quot;&gt;correctness/noInvalidGridAreas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-invalid-position-at-import-rule/&quot;&gt;correctness/noInvalidPositionAtImportRule&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-unknown-function/&quot;&gt;correctness/noUnknownFunction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-unknown-media-feature-name/&quot;&gt;correctness/noUnknownMediaFeatureName&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-unknown-property/&quot;&gt;correctness/noUnknownProperty&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-unknown-unit/&quot;&gt;correctness/noUnknownUnit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-unmatchable-anb-selector/&quot;&gt;correctness/noUnmatchableAnbSelector&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-duplicate-at-import-rules/&quot;&gt;suspicious/noDuplicateAtImportRules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-duplicate-font-names/&quot;&gt;suspicious/noDuplicateFontNames&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-duplicate-selectors-keyframe-block/&quot;&gt;suspicious/noDuplicateSelectorsKeyframeBlock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-empty-block/&quot;&gt;suspicious/noEmptyBlock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-important-in-keyframe/&quot;&gt;suspicious/noImportantInKeyframe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-shorthand-property-overrides/&quot;&gt;suspicious/noShorthandPropertyOverrides&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It also provides the following nursery lint rules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-duplicate-custom-properties/&quot;&gt;nursery/noDuplicateCustomProperties&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-irregular-whitespace/&quot;&gt;nursery/noIrregularWhitespace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-unknown-pseudo-class/&quot;&gt;nursery/noUnknownPseudoClass&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-unknown-pseudo-element/&quot;&gt;nursery/noUnknownPseudoElement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-value-at-rule/&quot;&gt;nursery/noValueAtRule&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you don’t want Biome to format and lint your CSS files, you can disable the CSS formatter and linter in the Biome configuration file:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;css&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;formatter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;linter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;or on the command line:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--css-formatter-enabled=false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lint&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--css-linter-enabled=false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;check&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--css-formatter-enabled=false&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--css-linter-enabled=false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Special thanks to &lt;a href=&quot;https://github.com/denbezrukov&quot;&gt;Denis Bezrukov @denbezrukov&lt;/a&gt;, &lt;a href=&quot;https://github.com/faultyserver&quot;&gt;Jon Egeland @faultyserver&lt;/a&gt; and &lt;a href=&quot;https://github.com/togami2864&quot;&gt;Yoshiaki Togami @togami2864&lt;/a&gt; for coordinating and implementing most of the features related to CSS.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;stable-graphql-formatter-and-linter&quot;&gt;Stable GraphQL formatter and linter&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Another brand new feature: Biome now formats and lints &lt;a href=&quot;https://graphql.org/&quot;&gt;GraphQL&lt;/a&gt; files by default.&lt;/p&gt;
&lt;p&gt;For now, Biome provides only two nursery lint rules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-duplicate-fields/&quot;&gt;nursery/noDuplicateFields&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-deprecated-reason/&quot;&gt;nursery/useDeprecatedReason&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you don’t want Biome to format and lint your GraphQL files, you can disable the GraphQL formatter and linter in the Biome configuration file:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;graphql&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;formatter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;linter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;or on the command line:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--graphql-formatter-enabled=false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lint&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--graphql-linter-enabled=false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;check&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--graphql-formatter-enabled=false&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--css-linter-enabled=false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Special thanks to &lt;a href=&quot;https://www.swan.io/&quot;&gt;Swan&lt;/a&gt; that funded the implementation of the GraphQL formatter and to &lt;a href=&quot;https://github.com/vohoanglong0107&quot;&gt;Võ Hoàng Long @vohoanglong0107&lt;/a&gt; for implementing most of the features related to GraphQL.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;search-command&quot;&gt;Search command&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Back in February, one of our Core Contributors published &lt;a href=&quot;https://github.com/biomejs/biome/discussions/1762&quot;&gt;a proposal for plugin support&lt;/a&gt;. One of the highlights was the use of GritQL as a foundation for our plugin system.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.grit.io/language/overview&quot;&gt;GritQL&lt;/a&gt; is a powerful query language that lets you do structural searches on your codebase. This means that trivia such as whitespace or even the type of string quotes used will be ignored in your search query. It also has many features for querying the structure of your code, making it much more elegant for searching code than regular expressions.&lt;/p&gt;
&lt;p&gt;Integrating a query language such as GritQL is no easy feat, and throughout the year we published &lt;a href=&quot;https://github.com/biomejs/biome/discussions/2286&quot;&gt;multiple&lt;/a&gt; &lt;a href=&quot;https://github.com/biomejs/biome/discussions/2585&quot;&gt;status&lt;/a&gt; &lt;a href=&quot;https://github.com/biomejs/biome/discussions/3392&quot;&gt;updates&lt;/a&gt;. Today, we release the first product of this effort: A new &lt;code dir=&quot;auto&quot;&gt;biome search&lt;/code&gt; command.&lt;/p&gt;
&lt;p&gt;While we believe this command may already be useful to users in some situations (especially when it gets integrated in our IDE extensions!), this command is really a stepping stone towards our plugin efforts. By allowing our users to try it out in a first iteration, we hope to gain insight into the type of queries you want to do, as well as the bugs we need to focus on.&lt;/p&gt;
&lt;p&gt;For now, the &lt;code dir=&quot;auto&quot;&gt;search&lt;/code&gt; command is explicitly marked as &lt;strong&gt;EXPERIMENTAL&lt;/strong&gt;, since many limitations are yet to be fixed or explored. Keep this in mind when you try it out, and please let us know what you think!
For an overview of specific limitations, please see the &lt;a href=&quot;https://github.com/biomejs/biome/issues/2582&quot;&gt;dedicated issue&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Even though there are still plenty of limitations, we do believe the integration has progressed far enough that we can shift our focus towards the integration of actual plugins. We cannot yet promise a timeline, but we’ll keep you posted!&lt;/p&gt;
&lt;p&gt;PS.: GritQL escapes code snippets using backticks, but most shells interpret backticks as command invocations. To avoid this, it’s best to put single quotes around your Grit queries. For instance, the following command search for all &lt;code dir=&quot;auto&quot;&gt;console.log&lt;/code&gt; invocations:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;search&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;`console.$method($args)` where { $method &amp;#x3C;: or { `log`, `info` } }&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;./benchmark/bench.js:38:3 search ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  &lt;strong&gt;38 │ 	&lt;span&gt;console.info(`\n⌛ repository: ${name}`);&lt;/span&gt;&lt;/strong&gt;

./packages/@biomejs/js-api/scripts/update-nightly-version.mjs:27:1 search ━━━━━━━━━━━━━━

  &lt;strong&gt;27 │  &lt;span&gt;console.log(`version=${version}`);&lt;/span&gt;&lt;/strong&gt;

&lt;span&gt;Searched 67 files in 1034ms. Found 2 matches.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Special thanks to &lt;a href=&quot;https://grit.io&quot;&gt;Grit&lt;/a&gt; for open-sourcing GritQL, &lt;a href=&quot;https://github.com/arendjr&quot;&gt;Arend van Beelen @arendjr&lt;/a&gt; for integrating the GritQL engine into Biome, and to &lt;a href=&quot;https://github.com/BackupMiles/&quot;&gt;@BackupMiles&lt;/a&gt; for implementing the formatting of search results in the &lt;code dir=&quot;auto&quot;&gt;biome search&lt;/code&gt; command!&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;editorconfig-support&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;.editorconfig&lt;/code&gt; support&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Biome is now able to take the &lt;a href=&quot;https://editorconfig.org/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;.editorconfig&lt;/code&gt;&lt;/a&gt; of your project into account. This is an opt-in feature. You have to turn it on in your Biome configuration file:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;formatter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;useEditorconfig&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Note that all options specified in the Biome configuration file override the ones specified in &lt;code dir=&quot;auto&quot;&gt;.editorconfig&lt;/code&gt;. For now, only the &lt;code dir=&quot;auto&quot;&gt;.editorconfig&lt;/code&gt; at the root of your project is taken into account.&lt;/p&gt;
&lt;p&gt;Special thanks to &lt;a href=&quot;https://github.com/dyc3&quot;&gt;Carson McManus @dyc3&lt;/a&gt; for implementing this feature!&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;javascript-formatter-and-linter&quot;&gt;JavaScript formatter and linter&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;We updated the JavaScript formatter to match &lt;a href=&quot;https://github.com/prettier/prettier/blob/main/CHANGELOG.md#333&quot;&gt;Prettier v3.3&lt;/a&gt;. The most significant change is adding parentheses around nullish coalescing in ternaries. This change adds clarity to operator precedence.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Input&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;foo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bar&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;foo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;baz&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Biome 1.8.3 and Prettier 3.3.2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;foo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bar&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;foo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;baz&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Biome 1.9 and Prettier 3.3.3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;foo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;bar&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;foo&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;baz&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Regarding the linter, we stabilized the following lint rules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-label-without-control/&quot;&gt;a11y/noLabelWithoutControl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-focusable-interactive/&quot;&gt;a11y/useFocusableInteractive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-semantic-elements/&quot;&gt;accessibility/useSemanticElements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-useless-string-concat/&quot;&gt;complexity/noUselessStringConcat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-useless-undefined-initialization/&quot;&gt;complexity/noUselessUndefinedInitialization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-date-now/&quot;&gt;complexity/useDateNow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-undeclared-dependencies/&quot;&gt;correctness/noUndeclaredDependencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-invalid-builtin-instantiation/&quot;&gt;correctness/noInvalidBuiltinInstantiation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-unused-function-parameters/&quot;&gt;correctness/noUnusedFunctionParameters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-import-extensions/&quot;&gt;correctness/useImportExtensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-top-level-regex/&quot;&gt;performance/useTopLevelRegex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-done-callback/&quot;&gt;style/noDoneCallback&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-yoda-expression/&quot;&gt;style/noYodaExpression&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-consistent-builtin-instantiation/&quot;&gt;style/useConsistentBuiltinInstantiation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-default-switch-clause/&quot;&gt;style/useDefaultSwitchClause&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-explicit-length-check/&quot;&gt;style/useExplicitLengthCheck&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-throw-new-error/&quot;&gt;style/useThrowNewError&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-throw-only-error/&quot;&gt;style/useThrowOnlyError&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-console/&quot;&gt;suspicious/noConsole&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-evolving-types/&quot;&gt;suspicious/noEvolvingTypes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-misplaced-assertion/&quot;&gt;suspicious/noMisplacedAssertion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-react-specific-props/&quot;&gt;suspicious/noReactSpecificProps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-error-message/&quot;&gt;suspicious/useErrorMessage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-number-to-fixed-digits-argument/&quot;&gt;suspicious/useNumberToFixedDigitsArgument&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We added the following new rules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-common-js/&quot;&gt;nursery/noCommonJs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-duplicate-custom-properties/&quot;&gt;nursery/noDuplicateCustomProperties&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-dynamic-namespace-import-access/&quot;&gt;nursery/noDynamicNamespaceImportAccess&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-enum/&quot;&gt;nursery/noEnum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-irregular-whitespace&quot;&gt;nursery/noIrregularWhitespace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-restricted-types/&quot;&gt;nursery/noRestrictedTypes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-secrets/&quot;&gt;nursery/noSecrets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-useless-escape-in-regex/&quot;&gt;nursery/noUselessEscapeInRegex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-consistent-member-accessibility/&quot;&gt;nursery/useConsistentMemberAccessibility&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-trim-start-end/&quot;&gt;nursery/useTrimStartEnd&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And we deprecated the following rules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;correctness/noInvalidNewBuiltin&lt;/code&gt;. Use &lt;a href=&quot;https://biomejs.dev/linter/rules/no-invalid-builtin-instantiation/&quot;&gt;correctness/noInvalidBuiltinInstantiation&lt;/a&gt; instead.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;style/useSingleCaseStatement&lt;/code&gt;. Use &lt;a href=&quot;https://biomejs.dev/linter/rules/no-switch-declarations/&quot;&gt;correctness/noSwitchDeclarations&lt;/a&gt; instead.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;suspicious/noConsoleLog&lt;/code&gt;. Use &lt;a href=&quot;https://biomejs.dev/linter/rules/no-console/&quot;&gt;suspicious/noConsole&lt;/a&gt; instead.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Our linter has now more than 250 rules!
Most of the ESLint rules and rules from some plugins have been ported. We are close to completing the port of ESLint.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;and-more&quot;&gt;And more!&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;For the full list of changes, please refer to our &lt;a href=&quot;https://biomejs.dev/internals/changelog/&quot;&gt;changelog&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;whats-next&quot;&gt;What’s next&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;vscode-plugin-v3&quot;&gt;VSCode plugin v3&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nhedger&quot;&gt;Nicolas Hedger @nhedger&lt;/a&gt; is working on a new version of our first-party VSCode plugin. This new version will improve workspace support and fix some long-standing issues.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;biome-20&quot;&gt;Biome 2.0&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;During this first year, we have discovered a number of issues that cannot be solved without introducing small breaking changes. For example, we rely on a glob library that sometimes doesn’t behave as users expect. We feel it is time to address these long-standing issues. Following our &lt;a href=&quot;https://biomejs.dev/internals/versioning/&quot;&gt;versioning philosophy&lt;/a&gt;, these small breaking changes cannot be made without releasing a major release. Therefore, the next release of Biome will be a major release: Biome 2.0. We will use this opportunity to remove deprecated features. We will make the migration smooth by using the &lt;code dir=&quot;auto&quot;&gt;biome migrate&lt;/code&gt; command.&lt;/p&gt;</content:encoded></item><item><title>Biome v1.7</title><link>https://biomejs.dev/blog/biome-v1-7/</link><guid isPermaLink="true">https://biomejs.dev/blog/biome-v1-7/</guid><description>This new version provides an easy path to migrate from ESLint and Prettier.
It also introduces machine-readable reports for the formatter and the linter, new linter rules, and many fixes.

</description><pubDate>Mon, 15 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today we’re excited to announce the release of Biome v1.7!&lt;/p&gt;
&lt;p&gt;This new version provides an easy path to migrate from ESLint and Prettier. It also introduces experimental machine-readable reports for the formatter and the linter, new linter rules, and many fixes.&lt;/p&gt;
&lt;p&gt;Update Biome using the following commands:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm install --save-dev --save-exact @biomejs/biome@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx @biomejs/biome migrate&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;migrate-from-eslint-with-a-single-command&quot;&gt;Migrate from ESLint with a single command&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;This release introduces a new subcommand
&lt;code dir=&quot;auto&quot;&gt;biome migrate eslint&lt;/code&gt;. This command will read your ESLint configuration and attempt to port their settings to Biome.&lt;/p&gt;
&lt;p&gt;The subcommand is able to handle both the legacy and the flat configuration files. It supports the
&lt;code dir=&quot;auto&quot;&gt;extends&lt;/code&gt; field of the legacy configuration and loads both shared and plugin configurations!
The subcommand also migrates &lt;code dir=&quot;auto&quot;&gt;.eslintignore&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Given the following ESLint configuration:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;.eslintrc.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;extends&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;plugin:unicorn/recommended&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;plugins&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;unicorn&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;ignore_patterns&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;dist/**&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;globals&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;Global1&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;readonly&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;rules&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;eqeqeq&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;overrides&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;files&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;tests/**&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;rules&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;eqeqeq&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;off&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;And the following Biome configuration:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;linter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;rules&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;recommended&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Run
&lt;code dir=&quot;auto&quot;&gt;biome migrate eslint --write&lt;/code&gt; to migrate your ESLint configuration to Biome. The command overwrites your initial Biome configuration. For example, it disables
&lt;code dir=&quot;auto&quot;&gt;recommended&lt;/code&gt;. This results in the following Biome configuration:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;organizeImports&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;linter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;rules&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;recommended&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;complexity&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;noForEach&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;noStaticOnlyClass&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;noUselessSwitchCase&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;useFlatMap&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;style&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;noNegationElse&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;off&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;useForOf&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;useNodejsImportProtocol&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;useNumberNamespace&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;suspicious&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;noDoubleEquals&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;noThenProperty&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;useIsArray&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;javascript&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;globals&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Global1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;overrides&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;include&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;tests/**&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;linter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;rules&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;suspicious&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;noDoubleEquals&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;off&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The subcommand needs Node.js to load and resolve all the plugins and
&lt;code dir=&quot;auto&quot;&gt;extends&lt;/code&gt; configured in the ESLint configuration file. For now,
&lt;code dir=&quot;auto&quot;&gt;biome migrate eslint&lt;/code&gt; doesn’t support configuration written in YAML.&lt;/p&gt;
&lt;p&gt;We have a &lt;a href=&quot;https://biomejs.dev/linter/rules-sources/&quot;&gt;dedicated page&lt;/a&gt; that lists the equivalent Biome rule of a given ESLint rule. We handle some ESLint plugins such as &lt;a href=&quot;https://typescript-eslint.io/&quot;&gt;TypeScript ESLint&lt;/a&gt;, &lt;a href=&quot;https://github.com/jsx-eslint/eslint-plugin-jsx-a11y&quot;&gt;ESLint JSX A11y&lt;/a&gt;, &lt;a href=&quot;https://github.com/jsx-eslint/eslint-plugin-react&quot;&gt;ESLint React&lt;/a&gt;, and &lt;a href=&quot;https://github.com/sindresorhus/eslint-plugin-unicorn&quot;&gt;ESLint Unicorn&lt;/a&gt;. Some rules are equivalent to their ESLint counterparts, while others are inspired. By default, Biome doesn’t migrate inspired rules. You can use the CLI flag
&lt;code dir=&quot;auto&quot;&gt;--include-inspired&lt;/code&gt; to migrate them.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;migrate-from-prettier-with-a-single-command&quot;&gt;Migrate from Prettier with a single command&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/blog/biome-v1-6/#easier-migration-from-prettier&quot;&gt;Biome v1.6 introduced the subcommand &lt;code dir=&quot;auto&quot;&gt;biome migrate prettier&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In Biome v1.7, we add support of &lt;a href=&quot;https://prettier.io/docs/en/configuration.html#configuration-overrides&quot;&gt;Prettier’s
&lt;code dir=&quot;auto&quot;&gt;overrides&lt;/code&gt;&lt;/a&gt; and attempts to convert
&lt;code dir=&quot;auto&quot;&gt;.prettierignore&lt;/code&gt; glob patterns to globs supported by Biome.&lt;/p&gt;
&lt;p&gt;During the migration, Prettier’s &lt;code dir=&quot;auto&quot;&gt;overrides&lt;/code&gt; is translated to &lt;a href=&quot;https://biomejs.dev/reference/configuration/#overrides&quot;&gt;Biome’s
&lt;code dir=&quot;auto&quot;&gt;overrides&lt;/code&gt;&lt;/a&gt;. Given the following &lt;code dir=&quot;auto&quot;&gt;.prettierrc.json&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;.prettierrc.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;useTabs&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;singleQuote&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;overrides&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;files&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;*.json&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;options&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;tabWidth&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Run
&lt;code dir=&quot;auto&quot;&gt;biome migrate prettier --write&lt;/code&gt; to migrate your Prettier configuration to Biome. This results in the following Biome configuration:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;formatter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;formatWithErrors&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;indentStyle&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;space&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;indentWidth&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;lineEnding&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;lf&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;lineWidth&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;attributePosition&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;auto&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;organizeImports&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;linter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;rules&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;recommended&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;javascript&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;formatter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;jsxQuoteStyle&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;double&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;quoteProperties&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;asNeeded&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;trailingComma&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;all&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;semicolons&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;asNeeded&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;arrowParentheses&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;always&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;bracketSpacing&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;bracketSameLine&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;quoteStyle&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;single&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;attributePosition&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;auto&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;overrides&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;include&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;*.json&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;formatter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;indentWidth&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The subcommand needs Node.js to load JavaScript configurations such as &lt;code dir=&quot;auto&quot;&gt;.prettierrc.js&lt;/code&gt;.
&lt;code dir=&quot;auto&quot;&gt;biome migrate prettier&lt;/code&gt; doesn’t support configuration written in JSON5, TOML, or YAML.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;emit-machine-readable-reports&quot;&gt;Emit machine-readable reports&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Biome is now able to output JSON reports detailing the diagnostics emitted by a command.&lt;/p&gt;
&lt;p&gt;For instance, you can emit a report when you lint a codebase:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lint&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--reporter=json-pretty&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For now, we support two report formats: &lt;code dir=&quot;auto&quot;&gt;json&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;json-pretty&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Note that the report format is **experimental
**, and it might change in the future. Please try this feature and let us know if any information needs to be added to the reports.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;check-git-staged-files&quot;&gt;Check &lt;code dir=&quot;auto&quot;&gt;git&lt;/code&gt; staged files&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Biome v1.5 added the &lt;code dir=&quot;auto&quot;&gt;--changed&lt;/code&gt; to format and lint &lt;code dir=&quot;auto&quot;&gt;git&lt;/code&gt; tracked files that have been changed.&lt;/p&gt;
&lt;p&gt;Today we are introducing a new option &lt;code dir=&quot;auto&quot;&gt;--staged&lt;/code&gt; which allows you to check only files added to the &lt;em&gt;Git index&lt;/em&gt; (&lt;em&gt;staged
files&lt;/em&gt;). This is useful for checking that the files you want to commit are formatted and linted:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;check&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--staged&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This is handy for writing your own &lt;a href=&quot;https://biomejs.dev/recipes/git-hooks/#shell-script&quot;&gt;pre-commit script&lt;/a&gt;. Note that unstaged changes on a staged file are
&lt;strong&gt;not&lt;/strong&gt; ignored. Thus, we still recommend using a &lt;a href=&quot;https://biomejs.dev/recipes/git-hooks/&quot;&gt;dedicated pre-commit tool&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;https://github.com/castarco&quot;&gt;@castarco&lt;/a&gt; for implementing this feature!&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;linter&quot;&gt;Linter&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;new-nursery-rules&quot;&gt;New nursery rules&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Since &lt;em&gt;Biome
v1.6&lt;/em&gt;, we added several new rules. New rules are incubated in the nursery group. Nursery rules are exempt from semantic versioning.&lt;/p&gt;
&lt;p&gt;The new rules are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-constant-math-min-max-clamp/&quot;&gt;nursery/noConstantMathMinMaxClamp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-done-callback/&quot;&gt;nursery/noDoneCallback&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-duplicate-else-if/&quot;&gt;nursery/noDuplicateElseIf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-evolving-types/&quot;&gt;nursery/noEvolvingTypes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-flat-map-identity/&quot;&gt;nursery/noFlatMapIdentity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-misplaced-assertion/&quot;&gt;nursery/noMisplacedAssertion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;promoted-rules&quot;&gt;Promoted rules&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Once stable, a nursery rule is promoted to a stable group. The following rules are promoted:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-excessive-nested-test-suites&quot;&gt;complexity/noExcessiveNestedTestSuites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-useless-ternary/&quot;&gt;complexity/noUselessTernary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-jsx-key-in-iterable/&quot;&gt;correctness/useJsxKeyInIterable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-barrel-file/&quot;&gt;performance/noBarrelFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-re-export-all/&quot;&gt;performance/noReExportAll&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-namespace-import/&quot;&gt;style/noNamespaceImport&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-node-assert-strict/&quot;&gt;style/useNodeAssertStrict&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-duplicate-test-hooks/&quot;&gt;suspicious/noDuplicateTestHooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-exports-in-test/&quot;&gt;suspicious/noExportsInTest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-focused-tests/&quot;&gt;suspicious/noFocusedTests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-skipped-tests/&quot;&gt;suspicious/noSkippedTests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-suspicious-semicolon-in-jsx&quot;&gt;suspicious/noSuspiciousSemicolonInJsx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;miscellaneous&quot;&gt;Miscellaneous&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;By default, Biome searches a configuration file in the working directory and parent directories if it doesn’t exist. Biome provides a CLI option
&lt;code dir=&quot;auto&quot;&gt;--config-path&lt;/code&gt; and an environment variable
&lt;code dir=&quot;auto&quot;&gt;BIOME_CONFIG_PATH&lt;/code&gt; that allows which can be used to override this behavior. Previously, they required a directory containing a Biome configuration file. For example, the following command uses the Biome configuration file in
&lt;code dir=&quot;auto&quot;&gt;./config/&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--config-path=./config/&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./src&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This wasn’t very clear for many users who are used to specifying the configuration file path directly. They now accept a file, so the following command is valid:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--config-path=./config/biome.json&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./src&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can now ignore
&lt;code dir=&quot;auto&quot;&gt;React&lt;/code&gt; imports in the rules &lt;a href=&quot;https://biomejs.dev/linter/rules/no-unused-imports/#options&quot;&gt;noUnusedImports&lt;/a&gt; and &lt;a href=&quot;https://biomejs.dev/linter/rules/use-import-type/#options&quot;&gt;useImportType&lt;/a&gt; by setting &lt;a href=&quot;https://biomejs.dev/reference/configuration/#javascriptjsxruntime&quot;&gt;
&lt;code dir=&quot;auto&quot;&gt;javascript.jsxRuntime&lt;/code&gt;&lt;/a&gt; to &lt;code dir=&quot;auto&quot;&gt;reactClassic&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Biome applies specific settings to &lt;a href=&quot;https://biomejs.dev/guides/configure-biome/#well-known-files&quot;&gt;well-known files&lt;/a&gt;. It now recognizes more files and distinguishes between JSON files that only allow comments and JSON files that allow both comments and trailing commas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the React ecosystem, files ending in
&lt;code dir=&quot;auto&quot;&gt;.js&lt;/code&gt; are allowed to contain JSX syntax. The Biome extension is now able to parse JSX syntax in files that are associated with the JavaScript language identifier.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-exhaustive-dependencies/&quot;&gt;useExhaustiveDependencies&lt;/a&gt; now supports Preact.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See the &lt;a href=&quot;https://biomejs.dev/internals/changelog/#170-2024-04-15&quot;&gt;changelog&lt;/a&gt; for more details.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;whats-next&quot;&gt;What’s Next?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;We have started work on the CSS formatter and linter. Early implementation towards a &lt;a href=&quot;https://github.com/biomejs/biome/discussions/2286&quot;&gt;plugin system&lt;/a&gt; is also underway. Some of our contributors have started preliminary work for &lt;a href=&quot;https://github.com/biomejs/biome/issues/1927&quot;&gt;
&lt;em&gt;GraphQL&lt;/em&gt;&lt;/a&gt; and &lt;a href=&quot;https://github.com/biomejs/biome/issues/2365&quot;&gt;YAML&lt;/a&gt;. Any help is welcome!&lt;/p&gt;
&lt;p&gt;If Biome is valuable to you or your company, consider donating monthly to our &lt;a href=&quot;https://opencollective.com/biome&quot;&gt;Open Collective&lt;/a&gt;. You can also &lt;a href=&quot;https://github.com/sponsors/biomejs&quot;&gt;sponsor us on GitHub&lt;/a&gt;. This is important for the sustainability of the project.&lt;/p&gt;
&lt;p&gt;Follow us on &lt;a href=&quot;https://bsky.app/profile/biomejs.dev&quot;&gt;our BlueSky&lt;/a&gt; and join &lt;a href=&quot;https://biomejs.dev/chat&quot;&gt;our Discord community&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Biome v1.6</title><link>https://biomejs.dev/blog/biome-v1-6/</link><guid isPermaLink="true">https://biomejs.dev/blog/biome-v1-6/</guid><description>Partial support for Astro, Svelte and Vue files, both CLI and LSP.
Now, the extends field is able to pick configuration files that are exported from a dependency.
The formatter has new options.

</description><pubDate>Fri, 08 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Update Biome using the following commands:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--save-dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--save-exact&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@biomejs/biome@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@biomejs/biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;migrate&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;partial-support-for-astro-svelte-and-vue-files&quot;&gt;Partial support for Astro, Svelte and Vue files&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;In this release, we’re happy to provide partial support for Astro, Svelte and Vue files. What does &lt;strong&gt;partial&lt;/strong&gt; support mean?&lt;/p&gt;
&lt;p&gt;While the team is working on a &lt;a href=&quot;https://github.com/biomejs/biome/discussions/1726&quot;&gt;unified data structure&lt;/a&gt; for HTML-ish languages, we discovered that we could provide Biome functionalities to those files with just a few changes, albeit with some limitations.&lt;/p&gt;
&lt;p&gt;This means that Biome is able to analyze the JavaScript/TypeScript portion of said files, and all features are available: formatting, linting and import sorting! Here’s an example of what you should expect in terms of developer experience:&lt;/p&gt;
&lt;starlight-tabs&gt; &lt;div&gt; &lt;ul role=&quot;tablist&quot;&gt; &lt;li role=&quot;presentation&quot;&gt; &lt;a role=&quot;tab&quot; href=&quot;#tab-panel-135&quot; id=&quot;tab-135&quot; aria-selected=&quot;true&quot; tabindex=&quot;0&quot;&gt; &lt;svg aria-hidden=&quot;true&quot; width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot;&gt;&lt;path d=&quot;M7.233 15.856c-.456 1.5-.132 3.586.948 4.57v-.036l.036-.096c.132-.636.648-1.032 1.309-1.008.612.012.96.336 1.044 1.044.036.264.036.528.048.803v.084c0 .6.168 1.176.504 1.68.3.48.72.851 1.284 1.103l-.024-.048-.024-.096c-.42-1.26-.12-2.135.984-2.879l.336-.227.745-.492a3.647 3.647 0 0 0 1.536-2.603c.06-.456 0-.9-.132-1.331l-.18.12c-1.668.887-3.577 1.2-5.425.84-1.117-.169-2.197-.48-3-1.416l.011-.012ZM2 15.592s3.205-1.559 6.421-1.559l2.437-7.508c.084-.36.348-.6.648-.6.3 0 .552.24.648.612l2.425 7.496c3.816 0 6.421 1.56 6.421 1.56L15.539.72c-.144-.444-.42-.72-.768-.72H8.24c-.348 0-.6.276-.768.72L2 15.592Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt; Astro &lt;/a&gt; &lt;/li&gt;&lt;li role=&quot;presentation&quot;&gt; &lt;a role=&quot;tab&quot; href=&quot;#tab-panel-136&quot; id=&quot;tab-136&quot; aria-selected=&quot;false&quot; tabindex=&quot;-1&quot;&gt; &lt;svg aria-hidden=&quot;true&quot; width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot;&gt;&lt;path d=&quot;M6.117 1.659L12.000 11.870L17.883 1.659L14.775 1.659L12.000 6.469L9.225 1.659L6.117 1.659ZM23.951 1.659L19.178 1.659L12.000 14.090L4.822 1.659L0.049 1.659L12.000 22.341L23.951 1.659Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt; Vue &lt;/a&gt; &lt;/li&gt;&lt;li role=&quot;presentation&quot;&gt; &lt;a role=&quot;tab&quot; href=&quot;#tab-panel-137&quot; id=&quot;tab-137&quot; aria-selected=&quot;false&quot; tabindex=&quot;-1&quot;&gt; &lt;svg aria-hidden=&quot;true&quot; width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot;&gt;&lt;path d=&quot;M10.924 1.248L5.422 4.734L10.924 1.248Q12.436 0.240 14.284 0.177Q16.132 0.114 17.812 0.933Q19.492 1.752 20.584 3.306L20.584 3.306Q21.382 4.398 21.676 5.721Q21.970 7.044 21.739 8.367Q21.508 9.690 20.794 10.740L20.794 10.740Q21.844 12.798 21.424 15.024L21.424 15.024Q21.214 16.242 20.542 17.292Q19.870 18.342 18.862 19.056L18.862 19.056L13.066 22.752Q11.554 23.760 9.706 23.823Q7.858 23.886 6.178 23.067Q4.498 22.248 3.406 20.694L3.406 20.694Q2.650 19.602 2.335 18.258Q2.020 16.914 2.272 15.612Q2.524 14.310 3.238 13.218L3.238 13.218Q2.146 11.202 2.566 8.976L2.566 8.976Q2.776 7.758 3.448 6.708Q4.120 5.658 5.128 4.944L5.128 4.944L10.924 1.248ZM18.316 4.776L18.316 4.776Q17.518 3.642 16.237 3.159Q14.956 2.676 13.612 3.012L13.612 3.012Q13.192 3.138 12.772 3.348L12.772 3.348L7.018 7.002Q6.304 7.422 5.863 8.094Q5.422 8.766 5.275 9.564Q5.128 10.362 5.317 11.160Q5.506 11.958 5.968 12.630L5.968 12.630Q6.766 13.764 8.047 14.226Q9.328 14.688 10.672 14.352L10.672 14.352Q11.092 14.226 11.512 14.016L11.512 14.016L13.864 12.546Q14.032 12.420 14.200 12.378L14.200 12.378Q14.620 12.294 15.019 12.420Q15.418 12.546 15.628 12.924L15.628 12.924Q15.922 13.302 15.838 13.806L15.838 13.806Q15.754 14.226 15.460 14.478L15.460 14.478L9.832 18.090Q9.664 18.216 9.496 18.258L9.496 18.258Q9.076 18.342 8.698 18.195Q8.320 18.048 8.089 17.733Q7.858 17.418 7.858 17.082L7.858 17.082L7.858 16.704L7.648 16.620Q6.682 16.326 5.842 15.780L5.842 15.780L5.212 15.360L5.128 15.654Q5.044 15.906 5.002 16.200L5.002 16.200Q4.834 16.998 5.023 17.796Q5.212 18.594 5.674 19.224L5.674 19.224Q6.430 20.316 7.627 20.799Q8.824 21.282 10.126 21.030L10.126 21.030L10.378 20.988Q10.840 20.862 11.218 20.652L11.218 20.652L17.014 16.998Q17.686 16.578 18.127 15.906Q18.568 15.234 18.715 14.436Q18.862 13.638 18.673 12.840Q18.484 12.042 18.022 11.370L18.022 11.370Q17.224 10.236 15.943 9.774Q14.662 9.312 13.318 9.648L13.318 9.648Q12.898 9.774 12.478 9.984L12.478 9.984L10.126 11.454Q9.958 11.580 9.790 11.622L9.790 11.622Q9.370 11.706 8.992 11.580Q8.614 11.454 8.362 11.076L8.362 11.076Q8.068 10.698 8.152 10.194L8.152 10.194Q8.236 9.774 8.530 9.522L8.530 9.522L14.158 5.910Q14.326 5.784 14.494 5.742L14.494 5.742Q14.914 5.658 15.292 5.805Q15.670 5.952 15.901 6.267Q16.132 6.582 16.132 6.918L16.132 6.918L16.132 7.296L16.342 7.380Q17.308 7.674 18.148 8.220L18.148 8.220L18.778 8.640L18.862 8.346Q18.946 8.052 18.988 7.800L18.988 7.800Q19.156 7.002 18.967 6.204Q18.778 5.406 18.316 4.776Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt; Svelte &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/div&gt; &lt;div id=&quot;tab-panel-135&quot; aria-labelledby=&quot;tab-135&quot; role=&quot;tabpanel&quot; tabindex=&quot;0&quot;&gt; &lt;div align=&quot;center&quot;&gt;&lt;img src=&quot;https://biomejs.dev/_astro/astro-linter.BfzFLjo-_ANgTV.webp?dpl=69d3d5158d55f30009c8158f&quot; alt=&quot;Screenshot of Biome linting in action for an Astro file in VSCode&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;500&quot; height=&quot;593&quot;&gt;&lt;/div&gt; &lt;/div&gt;&lt;div id=&quot;tab-panel-136&quot; aria-labelledby=&quot;tab-136&quot; role=&quot;tabpanel&quot; tabindex=&quot;0&quot; hidden&gt; &lt;div align=&quot;center&quot;&gt;&lt;img src=&quot;https://biomejs.dev/_astro/vue-linter.BHM17JYs_ZlucRJ.webp?dpl=69d3d5158d55f30009c8158f&quot; alt=&quot;Screenshot of Biome linting in action for an Vue file in VSCode&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;500&quot; height=&quot;593&quot;&gt;&lt;/div&gt; &lt;/div&gt;&lt;div id=&quot;tab-panel-137&quot; aria-labelledby=&quot;tab-137&quot; role=&quot;tabpanel&quot; tabindex=&quot;0&quot; hidden&gt; &lt;div align=&quot;center&quot;&gt;&lt;img src=&quot;https://biomejs.dev/_astro/svelte-linter.BLgKcKe__11ltch.webp?dpl=69d3d5158d55f30009c8158f&quot; alt=&quot;Screenshot of Biome  linting in action for an Svelte file in VSCode&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;500&quot; height=&quot;593&quot;&gt;&lt;/div&gt; &lt;/div&gt;  &lt;/starlight-tabs&gt;  
&lt;p&gt;Make sure to read the &lt;a href=&quot;https://biomejs.dev/internals/language-support#html-super-languages-support&quot;&gt;documentation about expectations and limitations&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;configuration-lighter-and-more-powerful&quot;&gt;Configuration, lighter and more powerful&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;support-for-biomejsonc&quot;&gt;Support for &lt;code dir=&quot;auto&quot;&gt;biome.jsonc&lt;/code&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Biome now accepts the &lt;code dir=&quot;auto&quot;&gt;biome.jsonc&lt;/code&gt; file as configuration! You can insert all the comments you want in there.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;extends-resolves-dependencies&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;extends&lt;/code&gt; resolves dependencies&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;From this version, Biome can use the &lt;code dir=&quot;auto&quot;&gt;extends&lt;/code&gt; property to &lt;em&gt;resolve&lt;/em&gt; other configuration files that are inside installed dependencies.&lt;/p&gt;
&lt;p&gt;There are few important steps in order to make the configuration discoverable. The file must be exported from a &lt;code dir=&quot;auto&quot;&gt;&quot;module&quot;&lt;/code&gt; package, and the file should be exported in your &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt; like this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@shared-configs&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;type&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;module&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;exports&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;./biome&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./biome.json&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This set up allows to expose a specifier &lt;code dir=&quot;auto&quot;&gt;@shared-configs/biome&lt;/code&gt;, which you use inside your &lt;code dir=&quot;auto&quot;&gt;biome.json&lt;/code&gt; file.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;extends&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@shared-configs/biome&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The resolution of the dependencies is powered by the library &lt;a href=&quot;https://github.com/oxc-project/oxc-resolver&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;oxc-resolver&lt;/code&gt;&lt;/a&gt;, one of the many libraries provided by the &lt;a href=&quot;https://oxc-project.github.io/&quot;&gt;OXC project&lt;/a&gt;. It’s battle-tested and spec compliant!&lt;/p&gt;
&lt;aside aria-label=&quot;Note&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;You can also export &lt;code dir=&quot;auto&quot;&gt;biome.jsonc&lt;/code&gt; files!&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@shared-configs&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;type&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;module&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;exports&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;./biome&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;ins&gt;&lt;span&gt;./biome.jsonc&lt;/span&gt;&lt;/ins&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h3 id=&quot;reduced-memory-footprint&quot;&gt;Reduced memory footprint&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;We &lt;strong&gt;reduced&lt;/strong&gt; the size our configuration &lt;strong&gt;by a factor of 6.5&lt;/strong&gt;! This change might not have massive effects on the speed of the program, but it greatly reduced the memory used when running the CLI or the LSP.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;new-formatting-options&quot;&gt;New formatting options&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Other than fixes, the formatter provides two new options that should improve the compatibility with Prettier.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;option-attributeposition&quot;&gt;Option &lt;code dir=&quot;auto&quot;&gt;attributePosition&lt;/code&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;When &lt;code dir=&quot;auto&quot;&gt;formatter.attributePosition&lt;/code&gt; has the value &lt;code dir=&quot;auto&quot;&gt;multiline&lt;/code&gt;, all attributes of HTML-ish languages (JSX/TSX as for time of writing) will be collapsed on multiple lines regardless of their numbers:&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;h4&gt;With variant &lt;code dir=&quot;auto&quot;&gt;auto&lt;/code&gt; (default)&lt;/h4&gt;
The attributes are automatically formatted, and they will collapse in multiple lines only when they hit certain criteria.&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;file.jsx&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Button&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;primary&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://example.com&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Hit me&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;Button&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;h4&gt;With variant &lt;code dir=&quot;auto&quot;&gt;multiline&lt;/code&gt;&lt;/h4&gt;
The attributes are always formatted on multiple lines, regardless.&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;file.jsx&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Button&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;primary&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://example.com&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Hit me&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;Button&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The contributor &lt;a href=&quot;https://github.com/octoshikari&quot;&gt;@octoshikari&lt;/a&gt; implemented this new feature by themselves! Huge thank you for helping the Biome project.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;option-jsonformattertrailingcommas&quot;&gt;Option &lt;code dir=&quot;auto&quot;&gt;json.formatter.trailingCommas&lt;/code&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Previously, Biome parser introduced an option that would allow to parse JSON and JSONC files that contained a trailing comma. This was required to ease the friction caused by other tools that
tolerate trailing commas by default (e.g. VSCode, Prettier, etc.).&lt;/p&gt;
&lt;p&gt;Unfortunately, our formatter wasn’t as tolerant. But with this release, we’ve introduced the option &lt;code dir=&quot;auto&quot;&gt;json.formatter.trailingCommas&lt;/code&gt;. It allows you to apply the same rules as with &lt;code dir=&quot;auto&quot;&gt;js.formatter.trailingComma&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;h4&gt;With variant &lt;code dir=&quot;auto&quot;&gt;none&lt;/code&gt; (default)&lt;/h4&gt;
The formatter removes the trailing comma upon formatting.&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;file.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;lorem&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;ipsum&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;lorem&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;ipsum&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;lorem&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;ipsum&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;lorem&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;ins&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;ipsum_last&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;h4&gt;With variant &lt;code dir=&quot;auto&quot;&gt;all&lt;/code&gt;&lt;/h4&gt;
The formatter adds the trailing comma upon formatting.&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;file.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;lorem&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;ipsum&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;lorem&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;ipsum&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;lorem&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;ipsum&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;lorem&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;ins&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;ipsum_last&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;easier-migration-from-prettier&quot;&gt;Easier migration from Prettier&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;This release introduces a new command called &lt;code dir=&quot;auto&quot;&gt;biome migrate prettier&lt;/code&gt;. This command will read your Prettier &lt;code dir=&quot;auto&quot;&gt;.prettierrc&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;prettier.json&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;.prettierignore&lt;/code&gt;, and attempt to port its options and globs in Biome.&lt;/p&gt;
&lt;p&gt;Given a &lt;code dir=&quot;auto&quot;&gt;prettier.json&lt;/code&gt; file, Biome will &lt;strong&gt;modify&lt;/strong&gt; the existing configuration file to match Prettier’s options:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;prettier.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{ &lt;/span&gt;&lt;span&gt;&quot;useTabs&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;semi&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;singleQuote&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;formatter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;formatWithErrors&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;indentStyle&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;space&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;indentWidth&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;lineEnding&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;lf&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;lineWidth&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;attributePosition&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;auto&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;linter&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;javascript&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;formatter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;jsxQuoteStyle&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;double&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;quoteProperties&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;asNeeded&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;trailingCommas&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;all&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;semicolons&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;always&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;arrowParentheses&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;always&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;bracketSpacing&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;bracketSameLine&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;quoteStyle&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;single&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;attributePosition&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;auto&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;aside aria-label=&quot;Caution&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Caution&lt;/p&gt;&lt;div&gt;&lt;p&gt;Due to the different nature of &lt;code dir=&quot;auto&quot;&gt;.prettierignore&lt;/code&gt; globs and Biome’s globs, it’s &lt;strong&gt;highly advised&lt;/strong&gt; to make sure that those globs still work under Biome.
Prettier’s globs are &lt;strong&gt;git globs&lt;/strong&gt;, while Biome’s globs are &lt;strong&gt;unix-style&lt;/strong&gt; globs.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h3 id=&quot;linter&quot;&gt;Linter&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;promoted-rules&quot;&gt;Promoted rules&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;New rules are incubated in the nursery group.
Once stable, we promote them to a stable group.
The following rules are promoted:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-empty-type-parameters&quot;&gt;complexity/noEmptyTypeParameters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-useless-lone-block-statements&quot;&gt;complexity/noUselessLoneBlockStatements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-unused-imports&quot;&gt;correctness/noUnusedImports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-invalid-use-before-declaration&quot;&gt;correctness/noInvalidUseBeforeDeclaration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-unused-private-class-members&quot;&gt;correctness/noUnusedPrivateClassMembers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-await&quot;&gt;suspicious/useAwait&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-global-eval&quot;&gt;security/noGlobalEval&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-consistent-array-type&quot;&gt;style/useConsistentArrayType&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-export-type&quot;&gt;style/useExportType&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-filenaming-convention&quot;&gt;style/useFilenamingConvention&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-for-of&quot;&gt;style/useForOf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-import-type&quot;&gt;style/useImportType&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-nodejs-import-protocol&quot;&gt;style/useNodejsImportProtocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-number-namespace&quot;&gt;style/useNumberNamespace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-shorthand-function-type&quot;&gt;style/useShorthandFunctionType&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-empty-block-statements&quot;&gt;suspicious/noEmptyBlockStatements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-global-assign&quot;&gt;suspicious/noGlobalAssign&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-misleading-character-class&quot;&gt;suspicious/noMisleadingCharacterClass&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-then-property&quot;&gt;suspicious/noThenProperty&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additionally, the following rules are now recommended:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-approximative-numeric-constant&quot;&gt;suspicious/noApproximativeNumericConstant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-misrefactored-shorthand-assign&quot;&gt;suspicious/noMisrefactoredShorthandAssign&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h4 id=&quot;removed-rules&quot;&gt;Removed rules&lt;/h4&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Remove &lt;code dir=&quot;auto&quot;&gt;nursery/useGroupedTypeImport&lt;/code&gt;. The rule &lt;a href=&quot;https://biomejs.dev/linter/rules/use-import-type&quot;&gt;style/useImportType&lt;/a&gt; covers the behavior of this rule.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h4 id=&quot;new-rules&quot;&gt;New rules&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;New rules are now available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-barrel-file&quot;&gt;nursery/noBarrelFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-exports-in-test&quot;&gt;nursery/noExportsInTest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-focused-tests&quot;&gt;nursery/noFocusedTests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-namespace-import&quot;&gt;nursery/noNamespaceImport&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-semicolon-in-jsx&quot;&gt;nursery/noSemicolonInJsx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-skipped-tests&quot;&gt;nursery/noSkippedTests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-undeclared-dependencies&quot;&gt;nursery/noUndeclaredDependencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-node-assert-strict&quot;&gt;nursery/useNodeAssertStrict&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-sorted-classes&quot;&gt;nursery/useSortedClasses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;miscellaneous&quot;&gt;Miscellaneous&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;We drastically reduced the number of protected files, which means you can now format your &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;tsconfig.json&lt;/code&gt;, etc. with Biome. Lock files are still considered protected.&lt;/li&gt;
&lt;li&gt;The CLI now does a better job at reporting the total number of files and the files that were really changed.&lt;/li&gt;
&lt;li&gt;When a diagnostic shows a file name on the terminal that is integrated with your editor, you can click it and the editor will open the file for you.&lt;/li&gt;
&lt;li&gt;The command &lt;code dir=&quot;auto&quot;&gt;biome rage&lt;/code&gt; now accepts two nice options: &lt;code dir=&quot;auto&quot;&gt;--formatter&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;--linter&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;We removed some superfluous error diagnostic when running the &lt;code dir=&quot;auto&quot;&gt;biome check&lt;/code&gt; command.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>Biome v1.5</title><link>https://biomejs.dev/blog/biome-v1-5/</link><guid isPermaLink="true">https://biomejs.dev/blog/biome-v1-5/</guid><description>This version has few features around the CLI and many fixes in our formatter.
The TypeScript, JSX and JavaScript formatter has surpassed the 97% compatibility rate with Prettier.
Biome now provides over 190 lint rules.

</description><pubDate>Mon, 08 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Along with the &lt;a href=&quot;https://biomejs.dev/blog/roadmap-2024&quot;&gt;Roadmap for 2024&lt;/a&gt;, the &lt;a href=&quot;https://biomejs.dev/blog/roadmap-2024#new-logo-and-homepage&quot;&gt;new logo and homepage&lt;/a&gt;, we also published a new version. This version has few features around the CLI and
&lt;strong&gt;many&lt;/strong&gt; fixes in our formatter. Our TypeScript, JSX and JavaScript formatting has surpassed the &lt;strong&gt;97% compatibility
rate&lt;/strong&gt; with Prettier. Biome now provides &lt;strong&gt;over 190 lint rules&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Update Biome using the following commands:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--save-dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--save-exact&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@biomejs/biome@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@biomejs/biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;migrate&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;new-features&quot;&gt;New features&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Process only the files that were changed.&lt;/li&gt;
&lt;li&gt;The command &lt;code dir=&quot;auto&quot;&gt;biome ci&lt;/code&gt; now prints diagnostics in GitHub PRs.&lt;/li&gt;
&lt;li&gt;A new command,&lt;code dir=&quot;auto&quot;&gt;biome explain&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The command &lt;code dir=&quot;auto&quot;&gt;biome migrate&lt;/code&gt; updates the &lt;code dir=&quot;auto&quot;&gt;$schema&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;New lint rules.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;process-only-the-files-that-were-changed&quot;&gt;Process only the files that were changed&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;If you enable the integration with VCS, you can tell Biome to process only the files that were changed. As for now, this feature computes the files that were changed by using a VCS, so Biome doesn’t know exactly which lines changed.&lt;/p&gt;
&lt;p&gt;This feature practically makes some utilities such as &lt;code dir=&quot;auto&quot;&gt;lint-staged&lt;/code&gt; obsolete.&lt;/p&gt;
&lt;p&gt;To take advantage of this feature, you have to tell Biome what’s the default branch in the configuration file, and then you’ll have to pass the option &lt;code dir=&quot;auto&quot;&gt;--changed&lt;/code&gt; via CLI:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;vcs&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;clientKind&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;defaultBranch&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Once you modified some files, use the new option to the command you need, for example the &lt;code dir=&quot;auto&quot;&gt;format&lt;/code&gt; command:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;ins&gt;&lt;span&gt;--changed&lt;/span&gt;&lt;/ins&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--write&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;the-command-biome-ci-now-prints-diagnostics-in-github-prs&quot;&gt;The command &lt;code dir=&quot;auto&quot;&gt;biome ci&lt;/code&gt; now prints diagnostics in GitHub PRs&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;For quite some time, users were confused by the difference between the commands &lt;code dir=&quot;auto&quot;&gt;check&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;ci&lt;/code&gt;because, until now, their behaviours have been very similar. From this version, the command &lt;code dir=&quot;auto&quot;&gt;ci&lt;/code&gt; can detect the GitHub CI environment and print annotation in the PRs.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Screenshot of a GitHub annotation printed by Biome&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;610&quot; height=&quot;170&quot; src=&quot;https://biomejs.dev/_astro/github-annotation.B_unxUGt_Z25lKte.webp?dpl=69d3d5158d55f30009c8158f&quot;&gt;&lt;/p&gt;
&lt;p&gt;It’s possible that you would need to change your permissions of your workflow files in case you don’t see the annotations:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;.github/workflows/action.yml&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;permissions&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;pull-requests&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;a-new-command-biome-explain&quot;&gt;A new command &lt;code dir=&quot;auto&quot;&gt;biome explain&lt;/code&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;This command will serve as an “offline” documentation tool. In this release, the command supports the explanation of all the lint rules; for example you can request documentation for &lt;code dir=&quot;auto&quot;&gt;noAccumulatingSpread&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;explain&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;noAccumulatingSpread&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Which will print the following Markdown:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# noAccumulatingSpread&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;No fix available.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;This rule is recommended.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Description&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Disallow the use of spread (&lt;/span&gt;&lt;span&gt;`...`&lt;/span&gt;&lt;span&gt;) syntax on accumulators.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Spread syntax allows an iterable to be expanded into its individual elements.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Spread syntax should be avoided on accumulators (like those in &lt;/span&gt;&lt;span&gt;`.reduce`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;because it causes a time complexity of &lt;/span&gt;&lt;span&gt;`O(n^2)`&lt;/span&gt;&lt;span&gt; instead of &lt;/span&gt;&lt;span&gt;`O(n)`&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Source: https://prateeksurana.me/blog/why-using-object-spread-with-reduce-bad-idea/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;## Examples&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;### Invalid&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;```js,expect_diagnostic&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;var &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;reduce&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;acc&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;&lt;span&gt;acc&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;], []);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;```&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;```js,expect_diagnostic&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;var &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;reduce&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;acc&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;&lt;span&gt;acc&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;];}, []);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;```&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;```js,expect_diagnostic&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;var &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;reduce&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;acc&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; ({&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;&lt;span&gt;acc&lt;/span&gt;&lt;span&gt;, [&lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;]: &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;}), {});&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;```&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;## Valid&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;```js&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;var &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;reduce&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;acc&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt;acc&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;); &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;acc&lt;/span&gt;&lt;span&gt;}, []);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;```&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;We plan to make this output more readable for terminals, as well as provide autocompletion for this command.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;the-command-biome-migrate-updates-the-schema&quot;&gt;The command &lt;code dir=&quot;auto&quot;&gt;biome migrate&lt;/code&gt; updates the &lt;code dir=&quot;auto&quot;&gt;$schema&lt;/code&gt;&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;The command &lt;code dir=&quot;auto&quot;&gt;biome migrate&lt;/code&gt; now updates the &lt;code dir=&quot;auto&quot;&gt;$schema&lt;/code&gt; value inside the configuration file &lt;code dir=&quot;auto&quot;&gt;biome.json&lt;/code&gt; if you avail of the online schema. Run this command as soon as you update to Biome &lt;code dir=&quot;auto&quot;&gt;v1.5.0&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;$schema&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://biomejs.dev/schemas/1.4.1/schema.json&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$schema&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://biomejs.dev/schemas/&lt;/span&gt;&lt;ins&gt;&lt;span&gt;1.5.0&lt;/span&gt;&lt;/ins&gt;&lt;span&gt;/schema.json&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;new-rules&quot;&gt;New rules&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;useexporttype&quot;&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-export-type&quot;&gt;useExportType&lt;/a&gt;&lt;/h4&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;interface&lt;/span&gt;&lt;span&gt; I {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; {I};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;nursery/useExportType.js:2:8 &lt;a href=&quot;https://biomejs.dev/linter/rules/use-export-type&quot;&gt;lint/nursery/useExportType&lt;/a&gt; &lt;span&gt; FIXABLE &lt;/span&gt; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;✖&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;All exports are only types and should thus use &lt;/span&gt;&lt;span&gt;&lt;strong&gt;export type&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;

    &lt;strong&gt;1 │ &lt;/strong&gt;interface I {}
&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;2 │ &lt;/strong&gt;export { I };
   &lt;strong&gt;   │ &lt;/strong&gt;       &lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
    &lt;strong&gt;3 │ &lt;/strong&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Using &lt;/span&gt;&lt;span&gt;&lt;strong&gt;export type&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; allows transpilers to safely drop exports of types without looking for their definition.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Safe fix&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Use a grouped &lt;/span&gt;&lt;span&gt;&lt;strong&gt;export type&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;

&lt;strong&gt;  &lt;/strong&gt;&lt;strong&gt;  2 │ &lt;/strong&gt;export&lt;span&gt;·&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;&lt;span&gt;·&lt;/span&gt;&lt;/span&gt;{&lt;span&gt;·&lt;/span&gt;I&lt;span&gt;·&lt;/span&gt;};
&lt;strong&gt;  &lt;/strong&gt;&lt;strong&gt;    │ &lt;/strong&gt;       &lt;span&gt;+&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;h4 id=&quot;useimporttype&quot;&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-import-type&quot;&gt;useImportType&lt;/a&gt;&lt;/h4&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; {A} &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./mod.js&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt; TypeOfA &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;typeof&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;let &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;nursery/useImportType.js:1:1 &lt;a href=&quot;https://biomejs.dev/linter/rules/use-import-type&quot;&gt;lint/nursery/useImportType&lt;/a&gt; &lt;span&gt; FIXABLE &lt;/span&gt; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;✖&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;All these imports are only used as types.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;1 │ &lt;/strong&gt;import { A } from &quot;./mod.js&quot;;
   &lt;strong&gt;   │ &lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
    &lt;strong&gt;2 │ &lt;/strong&gt;type TypeOfA = typeof A;
    &lt;strong&gt;3 │ &lt;/strong&gt;let a: A;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Importing the types with &lt;/span&gt;&lt;span&gt;&lt;strong&gt;import type&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; ensures that they are removed by the transpilers and avoids loading unnecessary modules.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Safe fix&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Use &lt;/span&gt;&lt;span&gt;&lt;strong&gt;import type&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;

&lt;strong&gt;  &lt;/strong&gt;&lt;strong&gt;  1 │ &lt;/strong&gt;import&lt;span&gt;·&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;&lt;span&gt;·&lt;/span&gt;&lt;/span&gt;{&lt;span&gt;·&lt;/span&gt;A&lt;span&gt;·&lt;/span&gt;}&lt;span&gt;·&lt;/span&gt;from&lt;span&gt;·&lt;/span&gt;&quot;./mod.js&quot;;
&lt;strong&gt;  &lt;/strong&gt;&lt;strong&gt;    │ &lt;/strong&gt;       &lt;span&gt;+&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;h4 id=&quot;usefilenamingconvention&quot;&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-filenaming-convention&quot;&gt;useFilenamingConvention&lt;/a&gt;&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Enforces naming conventions for JavaScript and TypeScript filenames.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;usenodejsimportprotocol&quot;&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-nodejs-import-protocol&quot;&gt;useNodejsImportProtocol&lt;/a&gt;&lt;/h4&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; fs &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;fs&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;nursery/useNodejsImportProtocol.js:1:16 &lt;a href=&quot;https://biomejs.dev/linter/rules/use-nodejs-import-protocol&quot;&gt;lint/nursery/useNodejsImportProtocol&lt;/a&gt; &lt;span&gt; FIXABLE &lt;/span&gt; ━━━━━━━━━━━━━━━━━

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;⚠&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Import from Node.js builtin module &quot;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;fs&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&quot; should use the &quot;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;node:&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&quot; protocol.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;1 │ &lt;/strong&gt;import fs from &apos;fs&apos;;
   &lt;strong&gt;   │ &lt;/strong&gt;               &lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
    &lt;strong&gt;2 │ &lt;/strong&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Using the &lt;/span&gt;&lt;span&gt;&lt;strong&gt;node:&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; protocol is more explicit and signals that the imported module belongs to Node.js.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Unsafe fix&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Change to &quot;node:fs&quot;.&lt;/span&gt;

    &lt;strong&gt;1&lt;/strong&gt;  &lt;strong&gt; │ &lt;/strong&gt;&lt;span&gt;-&lt;/span&gt; &lt;span&gt;i&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;&lt;span&gt;·&lt;/span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;&lt;span&gt;·&lt;/span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;&lt;span&gt;·&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;&apos;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;f&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;s&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;&apos;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
      &lt;strong&gt;1&lt;/strong&gt;&lt;strong&gt; │ &lt;/strong&gt;&lt;span&gt;+&lt;/span&gt; &lt;span&gt;i&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;&lt;span&gt;·&lt;/span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;&lt;span&gt;·&lt;/span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;&lt;span&gt;·&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;&quot;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;n&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;o&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;d&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;e&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;f&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;s&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;&quot;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    &lt;strong&gt;2&lt;/strong&gt; &lt;strong&gt;2&lt;/strong&gt;&lt;strong&gt; │ &lt;/strong&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;h4 id=&quot;nonodejsmodules&quot;&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-nodejs-modules&quot;&gt;noNodejsModules&lt;/a&gt;&lt;/h4&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; fs &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;fs&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; path &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;node:path&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;nursery/noNodejsModules.js:1:16 &lt;a href=&quot;https://biomejs.dev/linter/rules/no-nodejs-modules&quot;&gt;lint/nursery/noNodejsModules&lt;/a&gt; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;⚠&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Using Node.js modules are forbidden.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;1 │ &lt;/strong&gt;import fs from &quot;fs&quot;;
   &lt;strong&gt;   │ &lt;/strong&gt;               &lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
    &lt;strong&gt;2 │ &lt;/strong&gt;import path from &quot;node:path&quot;;
    &lt;strong&gt;3 │ &lt;/strong&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Can be useful for client-side web projects that do not have access to those modules.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Remove the import module.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;h4 id=&quot;noinvalidusebeforedeclaration&quot;&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-invalid-use-before-declaration&quot;&gt;noInvalidUseBeforeDeclaration&lt;/a&gt;&lt;/h4&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;nursery/noInvalidUseBeforeDeclaration.js:3:11 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;✖&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Const declarations must have an initialized value.&lt;/span&gt;

    &lt;strong&gt;1 │ &lt;/strong&gt;function f() {
    &lt;strong&gt;2 │ &lt;/strong&gt;    console.log(x);
&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;3 │ &lt;/strong&gt;    const x;
   &lt;strong&gt;   │ &lt;/strong&gt;          &lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
    &lt;strong&gt;4 │ &lt;/strong&gt;}
    &lt;strong&gt;5 │ &lt;/strong&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;This variable needs to be initialized.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;h4 id=&quot;noglobaleval&quot;&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-global-eval&quot;&gt;noGlobalEval&lt;/a&gt;&lt;/h4&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;eval&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;var a = 0&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;nursery/noGlobalEval.js:1:1 &lt;a href=&quot;https://biomejs.dev/linter/rules/no-global-eval&quot;&gt;lint/nursery/noGlobalEval&lt;/a&gt; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;✖&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;&lt;strong&gt;eval()&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; exposes to security risks and performance issues.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;1 │ &lt;/strong&gt;eval(&quot;var a = 0&quot;);
   &lt;strong&gt;   │ &lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
    &lt;strong&gt;2 │ &lt;/strong&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;See the &lt;/span&gt;&lt;span&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#never_use_eval!&quot;&gt;MDN web docs&lt;/a&gt;&lt;/span&gt;&lt;span&gt; for more details.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Refactor the code so that it doesn&apos;t need to call &lt;/span&gt;&lt;span&gt;&lt;strong&gt;eval()&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;h4 id=&quot;noglobalassign&quot;&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-global-assign&quot;&gt;noGlobalAssign&lt;/a&gt;&lt;/h4&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;Object&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;nursery/noGlobalAssign.js:1:1 &lt;a href=&quot;https://biomejs.dev/linter/rules/no-global-assign&quot;&gt;lint/nursery/noGlobalAssign&lt;/a&gt; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;✖&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;A global variable should not be reassigned.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;1 │ &lt;/strong&gt;Object = null;
   &lt;strong&gt;   │ &lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
    &lt;strong&gt;2 │ &lt;/strong&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Assigning to a global variable can override essential functionality.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;h4 id=&quot;nomisleadingcharacterclass&quot;&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-misleading-character-class&quot;&gt;noMisleadingCharacterClass&lt;/a&gt;&lt;/h4&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;^&lt;/span&gt;&lt;span&gt;[Á]&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;nursery/noMisleadingCharacterClass.js:1:1 &lt;a href=&quot;https://biomejs.dev/linter/rules/no-misleading-character-class&quot;&gt;lint/nursery/noMisleadingCharacterClass&lt;/a&gt; ━━━━━━━━━━━━━━━━━━

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;⚠&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Unexpected combined character in the character class.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;1 │ &lt;/strong&gt;/^[Á]$/u;
   &lt;strong&gt;   │ &lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
    &lt;strong&gt;2 │ &lt;/strong&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;h4 id=&quot;nothenproperty&quot;&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-then-property&quot;&gt;noThenProperty&lt;/a&gt;&lt;/h4&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;foo&lt;/span&gt;&lt;span&gt; = {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;nursery/noThenProperty.js:2:5 &lt;a href=&quot;https://biomejs.dev/linter/rules/no-then-property&quot;&gt;lint/nursery/noThenProperty&lt;/a&gt; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;✖&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Do not add &lt;/span&gt;&lt;span&gt;&lt;strong&gt;then&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; to an object.&lt;/span&gt;

    &lt;strong&gt;1 │ &lt;/strong&gt;const foo = {
&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;2 │ &lt;/strong&gt;    then() {}
   &lt;strong&gt;   │ &lt;/strong&gt;    &lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
    &lt;strong&gt;3 │ &lt;/strong&gt;};
    &lt;strong&gt;4 │ &lt;/strong&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;foo&lt;/span&gt;&lt;span&gt; = {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;get &lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;nouselessternary&quot;&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-useless-ternary&quot;&gt;noUselessTernary&lt;/a&gt;&lt;/h4&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;var &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt; ? &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;nursery/noUselessTernary.js:1:9 &lt;a href=&quot;https://biomejs.dev/linter/rules/no-useless-ternary&quot;&gt;lint/nursery/noUselessTernary&lt;/a&gt; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;✖&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Unnecessary use of boolean literals in conditional expression.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;1 │ &lt;/strong&gt;var a = x ? true : true;
   &lt;strong&gt;   │ &lt;/strong&gt;        &lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
    &lt;strong&gt;2 │ &lt;/strong&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Simplify your code by directly assigning the result without using a ternary operator.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;If your goal is negation, you may use the logical NOT (!) or double NOT (!!) operator for clearer and concise code.
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt; Check for more details about &lt;/span&gt;&lt;span&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_NOT&quot;&gt;NOT&lt;/a&gt;&lt;/span&gt;&lt;span&gt; operator.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;</content:encoded></item><item><title>Roadmap 2024</title><link>https://biomejs.dev/blog/roadmap-2024/</link><guid isPermaLink="true">https://biomejs.dev/blog/roadmap-2024/</guid><description>Roadmap 2024, new logo and homepage

</description><pubDate>Mon, 08 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We are thrilled to share what the Core Contributors and Maintainers would like to focus on in 2024.&lt;/p&gt;
&lt;p&gt;We want to remind you that Biome is a community-driven project, so we can only promise that some of the ideas outlined below will be shipped.&lt;/p&gt;
&lt;p&gt;However, if you’re excited about some aspects of the project, and you want to see some of them developed faster than others, you can help us in many ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/biomejs&quot;&gt;&lt;strong&gt;Be involved in the project and the community&lt;/strong&gt;&lt;/a&gt;. Please help us to build those features.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opencollective.com/biome&quot;&gt;&lt;strong&gt;Sponsor us&lt;/strong&gt;&lt;/a&gt;. Ask your company to sponsor us. Biome is so fast that it can reduce your company’s CI times and save money. Performance is part of our mission. Plus, sponsorship is a good medium of
&lt;em&gt;advertisement&lt;/em&gt; for your company.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/guides/getting-started&quot;&gt;&lt;strong&gt;Improve our documentation with ideas, recipes, or guides&lt;/strong&gt;&lt;/a&gt;. Translate our documentation and help us to make Biome available to people who aren’t proficient in English.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;preface&quot;&gt;Preface&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The project is young and can’t compete against giants such as Prettier, ESLint, Webpack, Vite, ESBuild, etc. However, the recent events (sponsors, bounty challenge, Biome being a fork of Rome) showed that the users
&lt;strong&gt;have&lt;/strong&gt; interest in the project, and we showed those users that we have the tools to fulfil a need.&lt;/p&gt;
&lt;p&gt;Moving small projects from ESLint/Prettier is easy, but moving &lt;strong&gt;big&lt;/strong&gt; code bases is challenging and time-consuming; this is a big friction point in Biome.&lt;/p&gt;
&lt;p&gt;Users have different needs, though, so it will only be possible to satisfy some of them. We want to ensure that all features and contributions to our project &lt;a href=&quot;https://biomejs.dev/internals/philosophy/&quot;&gt;embrace our philosophy&lt;/a&gt; and provide the best experience by default.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;main-area-of-focus&quot;&gt;Main area of focus&lt;/h2&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Help users to move to Biome&lt;/li&gt;
&lt;li&gt;Expand Biome’s language support so Biome tools can span more of the web ecosystem&lt;/li&gt;
&lt;li&gt;Deepen Biome’s existing capabilities to offer more functionalities&lt;/li&gt;
&lt;li&gt;Plugins&lt;/li&gt;
&lt;li&gt;Transformations&lt;/li&gt;
&lt;li&gt;Community and content&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;h2 id=&quot;help-users-to-move-to-biome&quot;&gt;Help users to move to Biome&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Offer guides on our website to users who want to migrate from Prettier (CLI commands and configuration)&lt;/li&gt;
&lt;li&gt;Offer guides on our website to users who want to migrate from ESlint (CLI commands and configuration)&lt;/li&gt;
&lt;li&gt;Offer a section on our website that shows a mapping of the ESLint rules to our rules&lt;/li&gt;
&lt;li&gt;Offer commands to ease the transition
&lt;ul&gt;
&lt;li&gt;A command called &lt;code dir=&quot;auto&quot;&gt;biome migrate prettier&lt;/code&gt; that will read &lt;code dir=&quot;auto&quot;&gt;.prettierrc&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;.prettierignore&lt;/code&gt; will update the &lt;code dir=&quot;auto&quot;&gt;biome.json&lt;/code&gt; file (or create it) with the configuration from the Prettier files.&lt;/li&gt;
&lt;li&gt;A command called &lt;code dir=&quot;auto&quot;&gt;biome migrate eslint&lt;/code&gt; will read the JSON configuration of Eslint and the ignore file. There will be expectations and limitations.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;expand-biomes-language-support&quot;&gt;Expand Biome’s language support&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;CSS is our next language of focus, and we are making good progress. HTML and Markdown will follow. Follow our &lt;a href=&quot;https://biomejs.dev/internals/language-support&quot;&gt;up-to-date page&lt;/a&gt; to keep up with the progress of our work.&lt;/p&gt;
&lt;p&gt;The CSS language will enable much work and experimentation: CSS formatting and linting, and we will port some of the lint rules from &lt;code dir=&quot;auto&quot;&gt;stylelint&lt;/code&gt;. A new area of experimentation is cross-linting.&lt;/p&gt;
&lt;p&gt;The idea of cross-linting can be explained with an example: compute the CSS styles/classes defined in a project and warn a user when said styles aren’t used inside JSX/HTML files.&lt;/p&gt;
&lt;p&gt;Plus, we unlock another area of experimentation, which is embedded formatting.&lt;/p&gt;
&lt;p&gt;HTML and Markdown will be our next languages of focus. HTML will enable us to parse other variants of HTML that are popular in the frontend ecosystem: &lt;a href=&quot;https://vuejs.org/&quot;&gt;Vue&lt;/a&gt;, &lt;a href=&quot;https://svelte.dev/&quot;&gt;Svelte&lt;/a&gt; and &lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt;, and this would require some exploration of how to represent super languages of HTML.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;deepen-biomes-existing-capabilities-to-offer-more-functionalities&quot;&gt;Deepen Biome’s existing capabilities to offer more functionalities.&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Project analysis and dependency resolution&lt;/li&gt;
&lt;li&gt;Type system&lt;/li&gt;
&lt;li&gt;CLI&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;project-analysis-and-dependency-resolution&quot;&gt;Project analysis and dependency resolution&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;We will provide lint rules to read the manifest and detect errors such as invalid licenses.&lt;/p&gt;
&lt;p&gt;With project resolution, we will be able to provide more lint rules, some of which will be able to detect unused modules.&lt;/p&gt;
&lt;p&gt;With dependency resolution, we can - for example - detect dependencies that aren’t used inside a project.&lt;/p&gt;
&lt;p&gt;With this infrastructure, our LSP is going to be more powerful and provide more features, for example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;rename variables across a project;&lt;/li&gt;
&lt;li&gt;auto-complete for imports;&lt;/li&gt;
&lt;li&gt;in-line types&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;type-system&quot;&gt;Type system&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Building a full-fledged type system such as TypeScript is a massive effort; that’s why we decided to take a different direction and start by building a subset of the type system that requires stricter typing. This approach would allow us to build some important lint rules that users have been asking for.&lt;/p&gt;
&lt;p&gt;This will come with a downside: we will have to rely on a stricter code and minimal type inference from the compiler.&lt;/p&gt;
&lt;p&gt;Once we have something we can rely on, we can slowly widen the capabilities of our type system.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;cli&quot;&gt;CLI&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;More features for the command line tool, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add the &lt;code dir=&quot;auto&quot;&gt;explain&lt;/code&gt; command for offline documentation;&lt;/li&gt;
&lt;li&gt;Allow the output to be exported in different formats (JSON, etc.)&lt;/li&gt;
&lt;li&gt;Auto-completion for other shells such as &lt;code dir=&quot;auto&quot;&gt;zsh&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Implement the &lt;code dir=&quot;auto&quot;&gt;--modified&lt;/code&gt; argument, which allows to format - for example - only the modified lines of a document;&lt;/li&gt;
&lt;li&gt;Expose metrics for Biome’s operations and being able to track down possible performance bottlenecks;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;plugins&quot;&gt;Plugins&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;We will explore plugins and come up with a design that fits Biome. Biome is different from other tools because Biome is a toolchain that has multiple tools in it, so we have to think out of the box and propose a design that might differ from the tools people are used to.&lt;/p&gt;
&lt;p&gt;We don’t know yet what a Biome’s plugin will look like, although a plugin should be able to tap all the tools that Biome offers.&lt;/p&gt;
&lt;p&gt;Some ideas that we will consider:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DSL&lt;/li&gt;
&lt;li&gt;WASM&lt;/li&gt;
&lt;li&gt;A Runtime&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;transformations&quot;&gt;Transformations&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Transformations and code generation will be our first steps towards our compiler.&lt;/p&gt;
&lt;p&gt;We will provide the ability to transform TypeScript and JSX files into JavaScript files.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;community-and-content&quot;&gt;Community and content&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Biome has a growing ecosystem, with an official VSCode extension, an official IntelliJ extension, and a Discord bot. We want to grow the features these tools provide and welcome anyone who wants to help us.&lt;/p&gt;
&lt;p&gt;Our community is slowly growing, and we want to reward everyone who sticks around and contributes to Biome. At Biome, &lt;strong&gt;we value every contribution&lt;/strong&gt;, so you don’t need to be proficient in Rust to help us. Even participating in discussions and helping us to shape our features or helping other people are considered
&lt;em&gt;contributions&lt;/em&gt;. If you’d like to continue contributing to our ecosystem, we also encourage you to &lt;a href=&quot;https://github.com/biomejs/biome/blob/main/GOVERNANCE.md#maintainer-nomination&quot;&gt;nominate yourself as a maintainer of the project&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Recently Biome started its own &lt;a href=&quot;https://www.youtube.com/channel/UC6ssscaFgCSlbv1Pb6krGVw&quot;&gt;YouTube Channel&lt;/a&gt;. We will use this channel to share learning content with the community.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;new-logo-and-homepage&quot;&gt;New logo and homepage&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;With this blog post, we also want to officially announce our new logo, homepage and rebranding of the website.&lt;/p&gt;
&lt;p&gt;With this new logo, we want to give a different meaning to the project. Biome &lt;strong&gt;isn’t&lt;/strong&gt; a fork of Rome anymore, but a self-sufficient project ready to bloom.&lt;/p&gt;
&lt;p&gt;The triangle of the logo represents the mountains - &lt;strong&gt;soil&lt;/strong&gt; -, and the curly shape on the bottom left represents a wave of the ocean - &lt;strong&gt;water&lt;/strong&gt;. Two elements that are important in creating a self-sufficient ecosystem, so it can thrive and grow.&lt;/p&gt;</content:encoded></item><item><title>Biome formatter wins the Prettier challenge</title><link>https://biomejs.dev/blog/biome-wins-prettier-challenge/</link><guid isPermaLink="true">https://biomejs.dev/blog/biome-wins-prettier-challenge/</guid><description>Biome formatter now 95% compatible with Prettier

</description><pubDate>Mon, 27 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;With the release of Biome **&lt;code dir=&quot;auto&quot;&gt;v1.4.0&lt;/code&gt;
**, we claim the bounty of the &lt;a href=&quot;https://console.algora.io/challenges/prettier&quot;&gt;Prettier challenge&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;With
&lt;code dir=&quot;auto&quot;&gt;v1.4.0&lt;/code&gt;, you’ll get a better formatter experience, more formatting options, new VSCode features, new sponsors and more!&lt;/p&gt;
&lt;p&gt;You can upgrade Biome by running the following command:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--save-dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--save-exact&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@biomejs/biome@1.4.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--save-exact&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@biomejs/biome@1.4.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yarn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;upgrade&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--exact&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@biomejs/biome@1.4.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;better-formatter&quot;&gt;Better formatter&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Biome formatter has now **over 96% in terms of compatibility
** against &lt;a href=&quot;https://prettier.io/&quot;&gt;Prettier&lt;/a&gt;! This score is computed for JavaScript, TypeScript, and JSX formatting.&lt;/p&gt;
&lt;p&gt;Merit of challenge that was launched by &lt;a href=&quot;http://blog.vjeux.com/&quot;&gt;Christopher Chedeau&lt;/a&gt;, one of the Prettier’s creators.&lt;/p&gt;
&lt;p&gt;The challenge attracted the attention of many people, and some of them decided to contribute to Biome to claim part of the bounty. I did see something amazing: contributors had an amazing coordination, they took ownership of the tasks and delivered the solution in a matter of hours.&lt;/p&gt;
&lt;p&gt;I believe the main factors that made this possible are three:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Money. It’s a fact, and it’s completely fine if someone decides to contribute only for earning a small stipend out of it.&lt;/li&gt;
&lt;li&gt;Communication. We used &lt;a href=&quot;https://github.com/biomejs/biome/issues/720&quot;&gt;GitHub&lt;/a&gt; as only medium of coordination. We provided information, instructions and help on how to deliver.&lt;/li&gt;
&lt;li&gt;Infrastructure. Biome relies on a solid testing infrastructure, built by &lt;a href=&quot;https://github.com/MichaReiser&quot;&gt;previous&lt;/a&gt; Rome Tools &lt;a href=&quot;https://github.com/ematipico&quot;&gt;employees&lt;/a&gt; and &lt;a href=&quot;https://github.com/IWANABETHATGUY/&quot;&gt;contributors&lt;/a&gt;. It’s able to catch every reformat bug, provide granular diffs and warn the user if the emitted output is the different from the one emitted by Prettier.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Before the challenge, Biome had roughly a compatibility rate of 85%, based on our internal metrics (JavaScript, TypeScript and JSX, on options parity). Even though 85% might seem high, the impact of a low number such as 15% on big code bases is huge, and people might feel intimidated by so many changes, causing early adopters to receive frictions when bring Biome to their team. A member of our community shared some insights:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As a great example of how much even just that last 5% has improved things for large codebases (and specifically with
&lt;code dir=&quot;auto&quot;&gt;bracketSpacing&lt;/code&gt; and now &lt;code dir=&quot;auto&quot;&gt;bracketSameLine&lt;/code&gt; implemented) i ran it one project in our monorepo […].&lt;/p&gt;
&lt;p&gt;Just last week, this number
&lt;code dir=&quot;auto&quot;&gt;[diagnostics]&lt;/code&gt; was more than 6,000. Even with the bracket options ignored, it was still more than 1000, and now there are only 200 left!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Although the challenge is over, we are committed to improve even more the compatibility score with prettier. Any contribution in this regard is very welcome.&lt;/p&gt;
&lt;p&gt;The challenge has also uncovered some cases in Prettier’s emitted output that we decided to not follow. We have created a &lt;a href=&quot;https://biomejs.dev/formatter/differences-with-prettier&quot;&gt;new section&lt;/a&gt; in our website that explains them. Our hope is to make this section smaller with the time.&lt;/p&gt;
&lt;p&gt;If there’s a divergence that isn’t documented in our website, you should consider that a bug and file an issue.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;new-formatting-options&quot;&gt;New formatting options&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;With this challenge, we added new options to the formatter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/reference/configuration#formatterlineending&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;lineEnding&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Use this option to match the line endings of your OS. We support &lt;code dir=&quot;auto&quot;&gt;lf&lt;/code&gt; (line feed - &lt;code dir=&quot;auto&quot;&gt;\n&lt;/code&gt;), &lt;code dir=&quot;auto&quot;&gt;cr&lt;/code&gt; (carriage return -
&lt;code dir=&quot;auto&quot;&gt;\r&lt;/code&gt;) and &lt;code dir=&quot;auto&quot;&gt;crlf&lt;/code&gt; (carriage return line feed - &lt;code dir=&quot;auto&quot;&gt;\r\n&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/reference/configuration#javascriptormatterbracketsameline&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;bracketSameLine&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;example.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Existing behavior. Now also the default, meaning `bracketSameLine: false`.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Foo&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;className&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;somethingReallyLongThatForcesThisToWrap&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;anotherReallyLongAttribute&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;withAValueThatsSurelyTooLong&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;soThatEverythingWraps&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Hello&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;Foo&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Foo&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;selfClosingTags&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;likeThisOne&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;stillPlaceTheBracket&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;onItsOwnLine&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;toIndicateThat&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;itClosesItself&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;/&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;After formatting with &lt;code dir=&quot;auto&quot;&gt;&quot;bracketSameLine&quot;: true&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;example.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// New behavior, with `bracketSameLine: true`.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Foo&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;className&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;somethingReallyLongThatForcesThisToWrap&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;anotherReallyLongAttribute&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;withAValueThatsSurelyTooLong&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;soThatEverythingWraps&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Hello&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;Foo&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Foo&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;selfClosingTags&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;likeThisOne&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;stillPlaceTheBracket&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;onItsOwnLine&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;/&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/reference/configuration#javascriptformatterbracketspacing&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;bracketSpacing&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;example.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { sort } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;sort.js&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt; = { &lt;/span&gt;&lt;span&gt;sort&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;After formatting with &lt;code dir=&quot;auto&quot;&gt;&quot;bracketSpacing&quot;: false&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;example.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; {sort} &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;sort.js&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt; = {&lt;/span&gt;&lt;span&gt;sort&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;vscode-extension-goodies&quot;&gt;VSCode extension goodies&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The VSCode has been moved to a &lt;a href=&quot;https://github.com/biomejs/biome-vscode&quot;&gt;new repository&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We removed the bundled binary from the extension, and you’ll be able to download the version that you want. Here’s a small video of how it works:&lt;/p&gt;
&lt;video width=&quot;1200&quot; height=&quot;800&quot; controls&gt;
  &lt;source src=&quot;https://github.com/biomejs/biome-vscode/assets/649677/c7c1bf81-10a5-4cd6-bbdf-019d983a2d6a&quot; type=&quot;video/mp4&quot;&gt;
&lt;/video&gt;
&lt;p&gt;From today, we release a &lt;strong&gt;nightly&lt;/strong&gt; version of the extension.
This is a version meant for early adopters and to test things before they are officially released.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;some-cli-goodies&quot;&gt;Some CLI goodies&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;People that rely on Biome LSP will be pleased that they can now pass a custom configuration to the command
&lt;code dir=&quot;auto&quot;&gt;lsp-proxy&lt;/code&gt;, using the option &lt;code dir=&quot;auto&quot;&gt;--config-path&lt;/code&gt;. The same option is accepted by the command &lt;code dir=&quot;auto&quot;&gt;start&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--config-path=../path/where/config/is&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lsp-proxy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--config-path=../path/where/config/is&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The CLI now exposes the option &lt;code dir=&quot;auto&quot;&gt;--diagnostic-level&lt;/code&gt;, that allows to filter the kind of diagnostics printed to terminal.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;check&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--diagnostic-level=error&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./src&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;new-lint-rules-and-promoted-rule&quot;&gt;New lint rules, and promoted rule&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Biome is a linter too, and it features &lt;a href=&quot;https://biomejs.dev/linter/rules/&quot;&gt;177 rules&lt;/a&gt;! In this release, some rules are promoted and new ones are available.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;new-rules&quot;&gt;New rules&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-default-export&quot;&gt;noDefaultExport&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;nursery/noDefaultExport.js:1:8 &lt;a href=&quot;https://biomejs.dev/linter/rules/no-default-export&quot;&gt;lint/nursery/noDefaultExport&lt;/a&gt; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;⚠&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Avoid &lt;/span&gt;&lt;span&gt;&lt;strong&gt;default&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; exports.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;1 │ &lt;/strong&gt;export default function f() {};
   &lt;strong&gt;   │ &lt;/strong&gt;       &lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
    &lt;strong&gt;2 │ &lt;/strong&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Default exports cannot be easily discovered inside an editor and don&apos;t encourage the use of consistent names through a code base.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Use a named export instead.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-aria-hidden-on-focusable&quot;&gt;noAriaHiddenOnFocusable&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;aria-hidden&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tabIndex&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;nursery/noAriaHiddenOnFocusable.js:1:1 &lt;a href=&quot;https://biomejs.dev/linter/rules/no-aria-hidden-on-focusable&quot;&gt;lint/nursery/noAriaHiddenOnFocusable&lt;/a&gt; &lt;span&gt; FIXABLE &lt;/span&gt; ━━━━━━━━━━━━━━

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;✖&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Disallow &lt;/span&gt;&lt;span&gt;&lt;strong&gt;aria-hidden=&quot;true&quot;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; from being set on focusable elements.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;1 │ &lt;/strong&gt;&amp;#x3C;div aria-hidden=&quot;true&quot; tabIndex=&quot;0&quot; /&gt;
   &lt;strong&gt;   │ &lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
    &lt;strong&gt;2 │ &lt;/strong&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;&lt;strong&gt;aria-hidden&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; should not be set to &lt;/span&gt;&lt;span&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; on focusable elements because this can lead to confusing behavior for screen reader users.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Unsafe fix&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Remove the aria-hidden attribute from the element.&lt;/span&gt;

&lt;strong&gt;  &lt;/strong&gt;&lt;strong&gt;  1 │ &lt;/strong&gt;&amp;#x3C;div&lt;span&gt;·&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;h&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;·&lt;/span&gt;&lt;/span&gt;tabIndex=&quot;0&quot;&lt;span&gt;·&lt;/span&gt;/&gt;
&lt;strong&gt;  &lt;/strong&gt;&lt;strong&gt;    │ &lt;/strong&gt;     &lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-implicit-any-let&quot;&gt;noImplicitAnyLet&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;var &lt;/span&gt;&lt;span&gt;a;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;a &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;nursery/noImplicitAnyLet.js:1:5 &lt;a href=&quot;https://biomejs.dev/linter/rules/no-implicit-any-let&quot;&gt;lint/nursery/noImplicitAnyLet&lt;/a&gt; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;✖&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;This variable implicitly has the &lt;/span&gt;&lt;span&gt;&lt;strong&gt;any&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; type.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;1 │ &lt;/strong&gt;var a;
   &lt;strong&gt;   │ &lt;/strong&gt;    &lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
    &lt;strong&gt;2 │ &lt;/strong&gt;a = 2;
    &lt;strong&gt;3 │ &lt;/strong&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Variable declarations without type annotation and initialization have implicitly the &lt;/span&gt;&lt;span&gt;&lt;strong&gt;any&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; type. Declare type or initialize the variable with some value.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-await&quot;&gt;useAwait&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetchData&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Missing `await` for the promise returned by `fetch`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/data&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;nursery/useAwait.js:1:1 &lt;a href=&quot;https://biomejs.dev/linter/rules/use-await&quot;&gt;lint/nursery/useAwait&lt;/a&gt; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;✖&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;This &lt;/span&gt;&lt;span&gt;&lt;strong&gt;async&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; function lacks an &lt;/span&gt;&lt;span&gt;&lt;strong&gt;await&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; expression.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;1 │ &lt;/strong&gt;async function fetchData() {
   &lt;strong&gt;   │ &lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;2 │ &lt;/strong&gt;// Missing `await` for the promise returned by `fetch`
&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;3 │ &lt;/strong&gt;  return fetch(&apos;/data&apos;);
&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;4 │ &lt;/strong&gt;}
   &lt;strong&gt;   │ &lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
    &lt;strong&gt;5 │ &lt;/strong&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Remove this &lt;/span&gt;&lt;span&gt;&lt;strong&gt;async&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; modifier, or add an &lt;/span&gt;&lt;span&gt;&lt;strong&gt;await&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; expression in the function.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;1 │ &lt;/strong&gt;async function fetchData() {
   &lt;strong&gt;   │ &lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;2 │ &lt;/strong&gt;// Missing `await` for the promise returned by `fetch`
&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;3 │ &lt;/strong&gt;  return fetch(&apos;/data&apos;);
&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;4 │ &lt;/strong&gt;}
   &lt;strong&gt;   │ &lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
    &lt;strong&gt;5 │ &lt;/strong&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;&lt;strong&gt;Async&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; functions without &lt;/span&gt;&lt;span&gt;&lt;strong&gt;await&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; expressions may not need to be declared &lt;/span&gt;&lt;span&gt;&lt;strong&gt;async&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-valid-aria-role&quot;&gt;useValidAriaRole&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;role&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;datepicker&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;nursery/useValidAriaRole.js:1:1 &lt;a href=&quot;https://biomejs.dev/linter/rules/use-valid-aria-role&quot;&gt;lint/nursery/useValidAriaRole&lt;/a&gt; &lt;span&gt; FIXABLE &lt;/span&gt; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;✖&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Enforce that elements with ARIA roles must use a valid, non-abstract ARIA role.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;1 │ &lt;/strong&gt;&amp;#x3C;div role=&quot;datepicker&quot;&gt;&amp;#x3C;/div&gt;
   &lt;strong&gt;   │ &lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
    &lt;strong&gt;2 │ &lt;/strong&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Check &lt;/span&gt;&lt;span&gt;&lt;a href=&quot;https://www.w3.org/TR/wai-aria/#namefromauthor&quot;&gt;WAI-ARIA&lt;/a&gt;&lt;/span&gt;&lt;span&gt; for valid roles or provide options accordingly.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Unsafe fix&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Remove the invalid &lt;/span&gt;&lt;span&gt;&lt;strong&gt;role&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; attribute.
&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt; Check the list of all &lt;/span&gt;&lt;span&gt;&lt;a href=&quot;https://www.w3.org/TR/wai-aria/#role_definitions&quot;&gt;valid&lt;/a&gt;&lt;/span&gt;&lt;span&gt; role attributes.&lt;/span&gt;

&lt;strong&gt;  &lt;/strong&gt;&lt;strong&gt;  1 │ &lt;/strong&gt;&amp;#x3C;div&lt;span&gt;·&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span&gt;l&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&gt;&amp;#x3C;/div&gt;
&lt;strong&gt;  &lt;/strong&gt;&lt;strong&gt;    │ &lt;/strong&gt;     &lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-regex-literals&quot;&gt;useRegexLiterals&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;RegExp&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;abc&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;nursery/useRegexLiterals.js:1:1 &lt;a href=&quot;https://biomejs.dev/linter/rules/use-regex-literals&quot;&gt;lint/nursery/useRegexLiterals&lt;/a&gt; &lt;span&gt; FIXABLE &lt;/span&gt; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;⚠&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Use a regular expression literal instead of the &lt;/span&gt;&lt;span&gt;&lt;strong&gt;RegExp&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; constructor.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;1 │ &lt;/strong&gt;new RegExp(&quot;abc&quot;, &quot;u&quot;);
   &lt;strong&gt;   │ &lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
    &lt;strong&gt;2 │ &lt;/strong&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Regular expression literals avoid some escaping required in a string literal, and are easier to analyze statically.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Safe fix&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Use a &lt;/span&gt;&lt;span&gt;&lt;strong&gt;literal notation&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; instead.&lt;/span&gt;

    &lt;strong&gt;1&lt;/strong&gt;  &lt;strong&gt; │ &lt;/strong&gt;&lt;span&gt;-&lt;/span&gt; &lt;span&gt;&lt;strong&gt;n&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;e&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;w&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;strong&gt;·&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;R&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;e&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;g&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;E&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;x&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;p&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;(&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;&quot;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span&gt;&lt;strong&gt;&quot;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;,&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;strong&gt;·&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;&quot;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;&lt;strong&gt;&quot;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
      &lt;strong&gt;1&lt;/strong&gt;&lt;strong&gt; │ &lt;/strong&gt;&lt;span&gt;+&lt;/span&gt; &lt;span&gt;&lt;strong&gt;/&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span&gt;&lt;strong&gt;/&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
    &lt;strong&gt;2&lt;/strong&gt; &lt;strong&gt;2&lt;/strong&gt;&lt;strong&gt; │ &lt;/strong&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;h3 id=&quot;recommended-rules&quot;&gt;Recommended rules&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-access-key&quot;&gt;a11y/noAccessKey&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;submit&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;accessKey&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Submit&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;a11y/noAccessKey.js:1:22 &lt;a href=&quot;https://biomejs.dev/linter/rules/no-access-key&quot;&gt;lint/a11y/noAccessKey&lt;/a&gt; &lt;span&gt; FIXABLE &lt;/span&gt; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;✖&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Avoid the &lt;/span&gt;&lt;span&gt;&lt;strong&gt;accessKey&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; attribute to reduce inconsistencies between keyboard shortcuts and screen reader keyboard comments.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;1 │ &lt;/strong&gt;&amp;#x3C;input type=&quot;submit&quot; accessKey=&quot;s&quot; value=&quot;Submit&quot; /&gt;
   &lt;strong&gt;   │ &lt;/strong&gt;                     &lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
    &lt;strong&gt;2 │ &lt;/strong&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Assigning keyboard shortcuts using the &lt;/span&gt;&lt;span&gt;&lt;strong&gt;accessKey&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; attribute leads to inconsistent keyboard actions across applications.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Unsafe fix&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Remove the &lt;/span&gt;&lt;span&gt;&lt;strong&gt;accessKey&lt;/strong&gt;&lt;/span&gt;&lt;span&gt; attribute.&lt;/span&gt;

&lt;strong&gt;  &lt;/strong&gt;&lt;strong&gt;  1 │ &lt;/strong&gt;&amp;#x3C;input&lt;span&gt;·&lt;/span&gt;type=&quot;submit&quot;&lt;span&gt;·&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;K&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;·&lt;/span&gt;&lt;/span&gt;value=&quot;Submit&quot;&lt;span&gt;·&lt;/span&gt;/&gt;
&lt;strong&gt;  &lt;/strong&gt;&lt;strong&gt;    │ &lt;/strong&gt;                     &lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-heading-content&quot;&gt;a11y/useHeadingContent&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;h1&lt;/span&gt;&lt;span&gt; /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;a11y/useHeadingContent.js:1:1 &lt;a href=&quot;https://biomejs.dev/linter/rules/use-heading-content&quot;&gt;lint/a11y/useHeadingContent&lt;/a&gt; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;✖&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Provide screen reader accessible content when using &lt;/span&gt;&lt;span&gt;&lt;strong&gt;heading&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;  elements.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;1 │ &lt;/strong&gt;&amp;#x3C;h1 /&gt;
   &lt;strong&gt;   │ &lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
    &lt;strong&gt;2 │ &lt;/strong&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;All headings on a page should have content that is accessible to screen readers.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-simple-number-keys&quot;&gt;complexity/useSimpleNumberKeys&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;({ &lt;/span&gt;&lt;span&gt;0x1&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; });&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;complexity/useSimpleNumberKeys.js:1:4 &lt;a href=&quot;https://biomejs.dev/linter/rules/use-simple-number-keys&quot;&gt;lint/complexity/useSimpleNumberKeys&lt;/a&gt; &lt;span&gt; FIXABLE &lt;/span&gt; ━━━━━━━━━━━━━━━━

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;✖&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Hexadecimal number literal is not allowed here.&lt;/span&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;1 │ &lt;/strong&gt;({ 0x1: 1 });
   &lt;strong&gt;   │ &lt;/strong&gt;   &lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;^&lt;/span&gt;&lt;/strong&gt;
    &lt;strong&gt;2 │ &lt;/strong&gt;

&lt;strong&gt;&lt;span&gt;  &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;ℹ&lt;/span&gt;&lt;/strong&gt; &lt;span&gt;Safe fix&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Replace 0x1 with 1&lt;/span&gt;

&lt;strong&gt;1&lt;/strong&gt;  &lt;strong&gt; │ &lt;/strong&gt;&lt;span&gt;-&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt;·&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;x&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&lt;span&gt;·&lt;/span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&lt;span&gt;·&lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
  &lt;strong&gt;1&lt;/strong&gt;&lt;strong&gt; │ &lt;/strong&gt;&lt;span&gt;+&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt;·&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&lt;span&gt;·&lt;/span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&lt;span&gt;·&lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;strong&gt;2&lt;/strong&gt; &lt;strong&gt;2&lt;/strong&gt;&lt;strong&gt; │ &lt;/strong&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;promoted-rules&quot;&gt;Promoted rules&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-interactive-element-to-noninteractive-role&quot;&gt;a11y/noInteractiveElementToNoninteractiveRole&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-this-in-static&quot;&gt;complexity/noThisInStatic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-arrow-function&quot;&gt;complexity/useArrowFunction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-empty-character-class-in-regex&quot;&gt;correctness/noEmptyCharacterClassInRegex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-invalid-new-builtin&quot;&gt;correctness/noInvalidNewBuiltin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-useless-else&quot;&gt;style/noUselessElse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-as-const-assertion&quot;&gt;style/useAsConstAssertion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-shorthand-assign&quot;&gt;style/useShorthandAssign&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-approximative-numeric-constant&quot;&gt;suspicious/noApproximativeNumericConstant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-misleading-instantiator&quot;&gt;suspicious/noMisleadingInstantiator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-misrefactored-shorthand-assign&quot;&gt;suspicious/noMisrefactoredShorthandAssign&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;deprecated-rules&quot;&gt;Deprecated rules&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-new-symbol&quot;&gt;correctness/noNewSymbol&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The rule is replaced by &lt;a href=&quot;https://biomejs.dev/linter/rules/no-invalid-new-builtin&quot;&gt;correctness/noInvalidNewBuiltin&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;homage-to-our-maintainers&quot;&gt;Homage to our maintainers&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Since Biome was forked, new people joined the project. They have been helping with in so many ways that you can’t even imagine: new features, side projects, engaging with the community, support, documentation, and more. OSS is not just about coding.&lt;/p&gt;
&lt;p&gt;Thank you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/SuperchupuDev&quot;&gt;Madeline Gurriarán @SuperchupuDev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nhedger&quot;&gt;Nicolas Hedger @nhedger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/victor-teles&quot;&gt;Victor Teles @victor-teles&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And a big welcome to our new joined maintainer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/faultyserver&quot;&gt;Jon Egeland @faultyserver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/TaKO8Ki&quot;&gt;Takayuki Maeda @TaKO8Ki&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;new-sponsors&quot;&gt;New sponsors&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Last but not least, we are proud to announce that we have two new sponsors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gold: Shiguredō (&lt;a href=&quot;https://shiguredo.jp/&quot;&gt;https://shiguredo.jp/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Bronze: KANAME (&lt;a href=&quot;https://www.kanamekey.com/&quot;&gt;https://www.kanamekey.com/&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to economically contribute to the project and help it to ship more features, you can do so from the &lt;a href=&quot;https://github.com/sponsors/biomejs/&quot;&gt;GitHub Sponsorship page&lt;/a&gt; or the &lt;a href=&quot;https://opencollective.com/biome&quot;&gt;Open Collective page&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;whats-next&quot;&gt;What’s next&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The project is thriving, with more people curious about the project and contributors that want to be involved.&lt;/p&gt;
&lt;p&gt;In the next months we will focus on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Publishing a Roadmap. &lt;strong&gt;Keep an eye on it&lt;/strong&gt;, it will involve a lot of &lt;strong&gt;interesting&lt;/strong&gt; work.&lt;/li&gt;
&lt;li&gt;Rebranding the website with a new logo.&lt;/li&gt;
&lt;li&gt;Translate the website in Japanese.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;translations&quot;&gt;Translations&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://juejin.cn/post/7308643782375768118&quot;&gt;中文翻译: Biome赢得了Prettier挑战&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>Announcing Biome</title><link>https://biomejs.dev/blog/announcing-biome/</link><guid isPermaLink="true">https://biomejs.dev/blog/announcing-biome/</guid><description>Biome continues Rome&apos;s legacy; in this blog post, we explain why the fork, with some context and history.

</description><pubDate>Tue, 29 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We are happy to announce Biome, &lt;em&gt;toolchain of the web&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Biome is the &lt;strong&gt;official&lt;/strong&gt; fork of Rome and it will continue to be Rome’s legacy.&lt;/p&gt;
&lt;p&gt;Biome is &lt;strong&gt;led and maintained&lt;/strong&gt; by the same people that maintained Rome so far.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Follow us&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/biomejs&quot;&gt;Github organization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/biomejs/biome&quot;&gt;Official repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/chat&quot;&gt;Official discord server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;background&quot;&gt;Background&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;I want to give you some background and context, which could help you to get why the core team created a new project with a new name. If you’re not interested, feel free to jump to the &lt;a href=&quot;#enters-biome&quot;&gt;next section&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;how-it-started&quot;&gt;How it started&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Before explaining the reasons for the fork, I’d like to give you some background and context; this would help you understand the reasons
that led to this decision.&lt;/p&gt;
&lt;p&gt;When I &lt;a href=&quot;https://github.com/rome/tools/pull/794&quot;&gt;joined&lt;/a&gt; the Rome project, the project was still young and written in &lt;a href=&quot;https://github.com/rome/tools/tree/archived-js&quot;&gt;TypeScript&lt;/a&gt;.
A long time passed, and the project underwent many transitions.&lt;/p&gt;
&lt;p&gt;Rome was initially released and licensed under the Meta OSS umbrella. Meta is an excellent incubator for OSS projects, but some people didn’t like it. At least, my impression was that they didn’t.&lt;/p&gt;
&lt;p&gt;The npm package &lt;code dir=&quot;auto&quot;&gt;rome&lt;/code&gt; belonged to another person, so when ownership changed, there were already a lot of version numbers used. The team always struggled with versioning. It shouldn’t be hard to version a software!&lt;/p&gt;
&lt;p&gt;After a few months, the project got out of Meta’s OSS umbrella. In six months, the creator Sebastian McKenzie created the company Rome Tools Inc., to keep working on the Rome project so to eventually became sustainable.&lt;/p&gt;
&lt;p&gt;I was excited about the news because I believed in Rome’s mission, so I decided to quit my job and join the adventure. In a few weeks, I joined Rome Tools Inc. as
a full-time employee to work on developer tools as my daily job. For me, it was like a dream coming true!&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;how-it-ended-or-did-it&quot;&gt;How it ended (or did it?)&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Not all startups manage to succeed, and Rome Tools Inc. wasn’t one of the lucky ones. Eventually, all the employees were laid off.&lt;/p&gt;
&lt;p&gt;My adventure with Rome Tools Inc. sadly ended, but fortunately, my career working with developer tools continued! A few months later, I joined the &lt;a href=&quot;https://astro.build/&quot;&gt;Astro Technology Company&lt;/a&gt; working full-time. It’s a great place to work, and I get to do what I love every day with fantastic people. I love it!&lt;/p&gt;
&lt;p&gt;Part of me was still charmed by Rome’s mission though. However, it wasn’t just that. I like working on parsers/compilers in my free time. I &lt;strong&gt;love&lt;/strong&gt; the &lt;a href=&quot;https://www.rust-lang.org/&quot;&gt;Rust&lt;/a&gt; language, and Rome is the perfect OSS project where I can use it.&lt;/p&gt;
&lt;p&gt;So, in my free time, I continued with my contributions to Rome as much as possible; luckily, I still had some rights that allowed me to publish new versions of the project. Despite the unsuccessful adventure with Rome Tools Inc., I wanted to keep the project alive.&lt;/p&gt;
&lt;p&gt;A few new &lt;a href=&quot;#the-core-team&quot;&gt;OSS contributors&lt;/a&gt; joined the cause and helped in contributing to the project. I wasn’t alone, and that’s the great thing about OSS. You eventually find people who like the project and want to contribute too.&lt;/p&gt;
&lt;p&gt;In June, I &lt;a href=&quot;https://portal.gitnation.org/contents/rome-a-modern-toolchain&quot;&gt;gave a talk&lt;/a&gt; about Rome at JsNation 2023.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://biomejs.dev/_astro/JsNation_2023.Bny4KZ09_262Gct.webp?dpl=69d3d5158d55f30009c8158f&quot; alt=&quot;Emanuele Stoppa on the stage of JsNation&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2048&quot; height=&quot;1365&quot;&gt;&lt;/p&gt;
&lt;p&gt;So, the project is still alive, but maintaining it has become challenging:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I don’t have admin rights on Discord, so I can’t delegate moderation rights to other people;&lt;/li&gt;
&lt;li&gt;I don’t have access to the hosting platform of the website;&lt;/li&gt;
&lt;li&gt;I don’t have access to any registry (npm, VSCode, etc.);&lt;/li&gt;
&lt;li&gt;the project is still under the MIT license of Rome Tools Inc., which makes attributions and contributions seem foggy from a legal point of view (where’s the company? I don’t know).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Many attempts to reach out to the current owner were all void. There was only one thing I could do. &lt;strong&gt;&lt;a href=&quot;#the-core-team&quot;&gt;We could do&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;enters-biome&quot;&gt;Enters: Biome&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;We created Biome. After weeks of discussions among the members of the core team and conversations with some friends, we thought that a clean slate was the best course of action.&lt;/p&gt;
&lt;p&gt;We pondered the idea of keeping the “rome” name in the new fork, but that was proven difficult:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sebastian has registered tons of stuff with the “rome” name (GitHub organizations, website domains, open collectives, npm organizations). Finding the right combination wasn’t easy;&lt;/li&gt;
&lt;li&gt;without the proper rights in the Discord server, we couldn’t delegate the moderation rights. Discord is a very important asset for community building;&lt;/li&gt;
&lt;li&gt;keeping the name would have caused some attribution to Rome Tools Inc., making things still foggy when it comes to the legal aspects of the source code;&lt;/li&gt;
&lt;li&gt;we don’t know if the “rome” name is registered; if it turns out it is, we could have incurred some legal troubles;&lt;/li&gt;
&lt;li&gt;“Rome” has a lot of historical baggage, as explained before (Meta and, fail as a startup);&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Given all these difficulties, the core team settled for a new project.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;new-is-always-better&quot;&gt;”New is always better.”&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;img src=&quot;https://media.giphy.com/media/7EamSGumESd0Y/giphy.gif&quot; width=&quot;100%&quot;&gt;&lt;/div&gt;
&lt;p&gt;Biome will embrace the same &lt;a href=&quot;https://biomejs.dev/internals/philosophy&quot;&gt;philosophy&lt;/a&gt; of the old Rome and the same mission. Although, the roadmap will likely change, and the core team could decide to focus on making the current features more stable instead of releasing new ones.&lt;/p&gt;
&lt;p&gt;Still, the primary mission is alive, and Biome wants to be a 360° toolchain; we recently started working on &lt;strong&gt;transformations&lt;/strong&gt;, which will eventually set up the foundations of the compiler.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;why-biome&quot;&gt;Why Biome&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The team wanted to create a second “Rome”, a second version of it. So we fused the words “Bis” and “Rome”. **Biome&quot;&quot;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;i-still-use-the-rome-package-what-should-i-do&quot;&gt;I still use the &lt;code dir=&quot;auto&quot;&gt;rome&lt;/code&gt; package. What should I do?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;rome&lt;/code&gt; package &lt;strong&gt;&lt;em&gt;won’t be maintained anymore&lt;/em&gt;&lt;/strong&gt; by the core team, so you won’t get any more releases.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;You should use the &lt;code dir=&quot;auto&quot;&gt;@biomejs/biome&lt;/code&gt; package. Note that Biome also comes with a lot of new features and fixes. We’ve just prepared a &lt;a href=&quot;https://biomejs.dev/blog/biome-v1&quot;&gt;blog post&lt;/a&gt; for that.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;rome&quot;: &quot;12.1.3&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;@biomejs/biome&quot;: &quot;1.0.0&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And change the CLI name in your scripts:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;scripts&quot;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;format&quot;: &quot;rome format --write ./src&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;format&quot;: &quot;biome format --write ./src&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In your &lt;code dir=&quot;auto&quot;&gt;rome.json&lt;/code&gt; file, update the URL of the &lt;code dir=&quot;auto&quot;&gt;$schema&lt;/code&gt; field:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;$schema&quot;: &quot;https://docs.rome.tools/schemas/12.1.3/schema.json&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;$schema&quot;: &quot;https://biomejs.dev/schemas/1.0.0/schema.json&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Then install the new official &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=biomejs.biome&quot;&gt;VSCode&lt;/a&gt; or &lt;a href=&quot;https://open-vsx.org/extension/biomejs/biome&quot;&gt;open VSX&lt;/a&gt; extension. That’s an important step if you use these extensions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After the installation of the extension, open the &lt;code dir=&quot;auto&quot;&gt;settings.json&lt;/code&gt;. If you have some Rome related settings there, you’ll have to update them:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;[javascript]&quot;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;editor.defaultFormatter&quot;: &quot;rome.rome&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;editor.defaultFormatter&quot;: &quot;biomejs.biome&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;editor.codeActionsOnSave&quot;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;quickfix.rome&quot;: true,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;source.organizeImports.rome&quot;: true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;quickfix.biome&quot;: true,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;source.organizeImports.biome&quot;: true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Biome &lt;strong&gt;still accepts the &lt;code dir=&quot;auto&quot;&gt;rome.json&lt;/code&gt; file&lt;/strong&gt; as a configuration, so you don’t need to do anything yet. Biome also takes &lt;code dir=&quot;auto&quot;&gt;biome.json&lt;/code&gt; as a configuration file.&lt;/p&gt;
&lt;p&gt;We will eventually sunset the &lt;code dir=&quot;auto&quot;&gt;rome.json&lt;/code&gt; configuration file for &lt;code dir=&quot;auto&quot;&gt;biome.json&lt;/code&gt;, but Biome will do that for you in the subsequent releases. So, don’t worry about updating everything unless you want to.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-core-team&quot;&gt;The core team&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ematipico&quot;&gt;Emanuele Stoppa&lt;/a&gt;: me, the lead of the project 🤓&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/denbezrukov&quot;&gt;Denis Bezrukov&lt;/a&gt;: Denis has contributed to the project for a long time He made contributions to many tools like formatter and parser;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Conaclos&quot;&gt;Victorien Elvinger&lt;/a&gt;: Victorien is very passionate, and he’s made tons of contributions to the Biome linter by creating new rules and optimising the ones that were already there when he joined;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nissy-dev&quot;&gt;Daiki Nishikawa&lt;/a&gt;: Daiki worked on linter and parser, by adding new rules, fixing the existing ones, improving the internal semantic model, and adding new grammar to the JavaScript/TypeScript parser;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/unvalley&quot;&gt;unvalley&lt;/a&gt;: unvalley added a lot of value to the linter and parser. They tackled some complex rules, for example, especially the ones around regex;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;special-thanks&quot;&gt;Special thanks&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/strager&quot;&gt;Strager&lt;/a&gt;: his inputs and constructive criticisms to the project are what helped Biome to arrive to this point;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Boshen&quot;&gt;Boshen&lt;/a&gt;: one of the greatest admirers of the project since the Rust rewrite; he joined the Biome community to learn from us and contribute as much as possible. He now leads a similar project to Biome, &lt;a href=&quot;https://github.com/web-infra-dev/oxc&quot;&gt;oxc&lt;/a&gt;. Check it out.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/MichaReiser&quot;&gt;Micha&lt;/a&gt;: ex-employee of Rome Tools Inc., he is now a full-time developer of the project &lt;a href=&quot;https://github.com/astral-sh/ruff&quot;&gt;Ruff&lt;/a&gt;, he gave a lot of good pieces of advice, and he was a good listener when I was struggling to make the right decisions.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;translations&quot;&gt;Translations&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://juejin.cn/post/7308539123538608165&quot;&gt;中文翻译: 宣布 Biome&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>Biome v1</title><link>https://biomejs.dev/blog/biome-v1/</link><guid isPermaLink="true">https://biomejs.dev/blog/biome-v1/</guid><description>New formatter options, CLI improvements, JSONC support and more.

</description><pubDate>Tue, 29 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In Biome v1, the formatter has options for JSX quotes and parentheses in the arrow functions; the CLI adds a new command &lt;code dir=&quot;auto&quot;&gt;biome lint&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;.jsonc&lt;/code&gt; files are supported, and it’s possible to extend the configuration file.&lt;/p&gt;
&lt;p&gt;You can upgrade Biome by running the following command:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--save-dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--save-exact&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@biomejs/biome@1.0.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--save-exact&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@biomejs/biome@1.0.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yarn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;upgrade&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--exact&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@biomejs/biome@1.0.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Or install the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=biomejs.biome&quot;&gt;VS Code extension&lt;/a&gt; to integrate Biome into your editor.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;new-formatter-options&quot;&gt;New formatter options&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Biome now supports two new, long-awaited options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;support for formatting the preferred quote kind in JSX;&lt;/li&gt;
&lt;li&gt;support for formatting parenthesis in arrow functions only when they are needed;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;jsx-quotes-style&quot;&gt;JSX quotes style&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;You can use this option via CLI or via &lt;code dir=&quot;auto&quot;&gt;biome.json&lt;/code&gt; file:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;javascript&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;formatter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;jsxQuoteStyle&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;single&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--jsx-quote-style=single&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--write&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./src&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;And Biome will apply single quotes when defining attributes in JSX code:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; Item &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./item.jsx&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;Header&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; =&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return &lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Item&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Docs&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt; /&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;arrow-function-parenthesis&quot;&gt;Arrow function parenthesis&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;You can decide not to print parenthesis in arrow functions. You can customize the option via CLI or via &lt;code dir=&quot;auto&quot;&gt;biome.json&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;javascript&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;formatter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;arrowParentheses&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;asNeeded&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--arrow-parentheses=as-needed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--write&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./src&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;And Biome will print parenthesis only for those arrow functions that require them:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// no need for parentheses&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;filter&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;term&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; =&gt; {}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// needs parentheses&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;filterBy&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;term&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; =&gt; {}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;cli-improvements&quot;&gt;CLI improvements&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The CLI was heavily reworked to guarantee consistent behaviour when handling files, diagnostics emitted and commands.&lt;/p&gt;
&lt;p&gt;Among those changes, there are some &lt;strong&gt;breaking changes&lt;/strong&gt; in its behaviour.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The CLI exits with an error code if the configuration file contains errors; while Biome can parse the configuration successfully - even with errors - this was a hazard for our users.
A typo in the configuration file would have resulted in Biome applying its defaults, and executing Biome with a different behaviour compared to the one set by the user.&lt;/li&gt;
&lt;li&gt;The command &lt;code dir=&quot;auto&quot;&gt;biome check&lt;/code&gt; will now emit error diagnostics for &lt;em&gt;code not formatted&lt;/em&gt; and exits with an error code. This behaviour aligns with the semantics meant for this command.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;new-biome-lint-command&quot;&gt;New &lt;code dir=&quot;auto&quot;&gt;biome lint&lt;/code&gt; command&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The command &lt;code dir=&quot;auto&quot;&gt;biome check&lt;/code&gt; is meant to run multiple tools, which sometimes can overwhelm the users. With &lt;code dir=&quot;auto&quot;&gt;biome lint&lt;/code&gt;, Biome will only run lint rules against files.&lt;/p&gt;
&lt;p&gt;As for now, the command accepts almost all the CLI arguments of the &lt;code dir=&quot;auto&quot;&gt;biome check&lt;/code&gt;. In the future, this command will specialize and tweak its behaviour around linting.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;more-control-over-errors&quot;&gt;More control over errors&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;By default, when Biome sees a file that can’t handle, it fires a diagnostic and will exit with an error code.&lt;/p&gt;
&lt;p&gt;With &lt;code dir=&quot;auto&quot;&gt;--files-ignore-unknown&lt;/code&gt; option, the CLI won’t emit diagnostics and will continue processing files.&lt;/p&gt;
&lt;p&gt;You can define this behaviour in the &lt;code dir=&quot;auto&quot;&gt;biome.json&lt;/code&gt; too:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;files&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;ignoreUnknown&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;When Biome doesn’t process files during a command, it exits with an error code and emits an error diagnostic.&lt;/p&gt;
&lt;p&gt;Now, with &lt;code dir=&quot;auto&quot;&gt;--no-errors-on-unmatched&lt;/code&gt;, Biome will exist with a successful code and doesn’t emit any diagnostics.&lt;/p&gt;
&lt;p&gt;This new option allows users to use Biome with tools like &lt;code dir=&quot;auto&quot;&gt;lint-staged&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;exit-on-warnings&quot;&gt;Exit on warnings&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;In Biome, you can change the configuration of rules and allow them to emit diagnostics. This behaviour was limited, and now with &lt;code dir=&quot;auto&quot;&gt;--error-on-warnings&lt;/code&gt; option, you can tell Biome to exit with an error code if a &lt;strong&gt;warning&lt;/strong&gt; is emitted.&lt;/p&gt;
&lt;p&gt;Here’s an example, let’s change the diagnostic level of a rule via &lt;code dir=&quot;auto&quot;&gt;biome.json&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;linter&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;recommended&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;rules&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;a11y&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;useAltText&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;warn&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Here’s a sample code that will trigger the rule:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;Image&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; =&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return &lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;img&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;src&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://example.com/image.png&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt; /&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;And now, run the CLI using the new option:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;biome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lint&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--error-on-warnings&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./src&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;jsonc-support-and-comments&quot;&gt;JSONC support and comments&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Biome’s JSON parser now supports comments, so we enabled these exciting new features.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;jsonc-file-support&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;.jsonc&lt;/code&gt; file support&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Biome can now format and lint &lt;code dir=&quot;auto&quot;&gt;.jsonc&lt;/code&gt; files.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;allow-comments-in-json-files&quot;&gt;Allow comments in JSON files&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Biome can parse comments inside JSON files. You can opt-in to this feature via the configuration file:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;json&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;parser&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;allowComments&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;aside aria-label=&quot;Note&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;biome.json&lt;/code&gt; file &lt;strong&gt;doesn’t&lt;/strong&gt; allow comments.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;aside aria-label=&quot;Caution&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Caution&lt;/p&gt;&lt;div&gt;&lt;p&gt;When enabling this feature, comments will be permitted in &lt;strong&gt;all&lt;/strong&gt; JSON files encountered by Biome.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;Plus, Biome now recognizes some &lt;strong&gt;known&lt;/strong&gt; files as “JSON files that can have comments”. For example, now Biome can
format your &lt;code dir=&quot;auto&quot;&gt;tsconfig.json&lt;/code&gt; file with comments without emitting errors!&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;extends-property&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;extends&lt;/code&gt; property&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;You can now break down your configuration file into different files and join them using the new &lt;code dir=&quot;auto&quot;&gt;extends&lt;/code&gt; property.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;extends&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./formatter.json&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;./linter.json&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Check the &lt;a href=&quot;https://biomejs.dev/reference/configuration#extends&quot;&gt;documentation&lt;/a&gt; to understand how it works.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;linter&quot;&gt;Linter&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;We &lt;strong&gt;deleted&lt;/strong&gt; two rules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;useCamelCase&lt;/code&gt;, which is replaced by &lt;code dir=&quot;auto&quot;&gt;useNamingConvention&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;noExtraSemicolon&lt;/code&gt;, not needed; the formatter takes care of it;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;new-rules&quot;&gt;New Rules&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-duplicate-json-keys/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noDuplicateJsonKeys&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This rule disallows duplicate keys in a JSON object.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-excessive-cognitive-complexity/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noExcessiveComplexity&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This rule computes a complexity score and reports code with a score above a configurable threshold.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-fallthrough-switch-clause/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noFallthroughSwitchClause&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This rule disallows &lt;code dir=&quot;auto&quot;&gt;switch&lt;/code&gt; cases that fall through to the next &lt;code dir=&quot;auto&quot;&gt;case&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-global-is-finite/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noGlobalIsFinite&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This rule recommends using &lt;code dir=&quot;auto&quot;&gt;Number.isFinite&lt;/code&gt; instead of the global and unsafe &lt;code dir=&quot;auto&quot;&gt;isFinite&lt;/code&gt; that attempts a type of coercion.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-global-is-nan/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noGlobalIsNan&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This rule recommends using &lt;code dir=&quot;auto&quot;&gt;Number.isNaN&lt;/code&gt; instead of the global and unsafe &lt;code dir=&quot;auto&quot;&gt;isNaN&lt;/code&gt; that attempts a type of coercion.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-nonoctal-decimal-escape/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noNonoctalDecimalEscape&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This rule disallows &lt;code dir=&quot;auto&quot;&gt;\8&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;\9&lt;/code&gt; escape sequences in string literals.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-unsafe-declaration-merging/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noUnsafeDeclarationMerging&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This rule disallows declaration merging between an interface and a class.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-useless-empty-export/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noUselessEmptyExport&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This rule disallows useless &lt;code dir=&quot;auto&quot;&gt;export {}&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-useless-this-alias/&quot;&gt;noUselessThisAlias&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This rule disallows useless aliasing of &lt;code dir=&quot;auto&quot;&gt;this&lt;/code&gt; in arrow functions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-void/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noVoid&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This rule disallows the use of &lt;code dir=&quot;auto&quot;&gt;void&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-arrow-function/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useArrowFunction&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This rule proposes turning function expressions into arrow functions.
Function expressions that use &lt;code dir=&quot;auto&quot;&gt;this&lt;/code&gt; are ignored.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-getter-return/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useGetterReturn&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This rule enforces &lt;code dir=&quot;auto&quot;&gt;get&lt;/code&gt; methods to always return a value.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-import-restrictions/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useImportRestrictions&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enables restrictions on how local imports should be imported.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-is-array/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useIsArray&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This rule proposes using &lt;code dir=&quot;auto&quot;&gt;Array.isArray()&lt;/code&gt; instead of &lt;code dir=&quot;auto&quot;&gt;instanceof Array&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-naming-convention/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useNamingConvention&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The rule enforces wide-spread naming conventions of Javascript and TypeScript across a codebase.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h4 id=&quot;promoted-rules&quot;&gt;Promoted rules&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;New rules are promoted, please check &lt;a href=&quot;https://github.com/rome/tools/discussions/4750&quot;&gt;#4750&lt;/a&gt; for more details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-duplicate-jsx-props/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;suspicious/noDuplicateJsxProps&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-console-log/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;suspicious/noConsoleLog&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-is-nan/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;correctness/useIsNan&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-simple-number-keys/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;complexity/useSimpleNumberKeys&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-literal-keys/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;complexity/useLiteralKeys&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-for-each/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;complexity/noForEach&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-heading-content/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;a11y/useHeadingContent&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following rules are now recommended:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/use-exponentiation-operator/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;useExponentiationOperator&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-useless-fragments/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noUselessFragments&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://biomejs.dev/linter/rules/no-redundant-use-strict/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;noRedundantUseStrict&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;support-for-function-class-parameter-decorators&quot;&gt;Support for function class parameter decorators&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;In the last release, Biome introduced support for Stage 3 decorators. Although, this final proposal doesn’t support the function class parameter decorators:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Controller&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Param&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// ^^^^^^^^^^^^ syntax not covered by the official and final decorators spec&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Some users were dissatisfied because they couldn’t use Biome inside their Angular/NestJS project. Now you can do it via configuration:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;biome.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;javascript&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;parser&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;unsafeParameterDecoratorsEnabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div aria-live=&quot;polite&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;acknowledgements&quot;&gt;Acknowledgements&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Big thank you to the following contributors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/denbezrukov&quot;&gt;denbezrukov&lt;/a&gt;, they implemented the new decorator parameter, the new option &lt;code dir=&quot;auto&quot;&gt;jsxQuoteStyle&lt;/code&gt; in the formatter, and started the works for our new CSS parser;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Conaclos&quot;&gt;Conaclos&lt;/a&gt;, they continued creating new rules, making the existing ones smarter and adding tons of value to Biome;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/SuperchupuDev&quot;&gt;SuperchupuDev&lt;/a&gt;, they implemented the new option &lt;code dir=&quot;auto&quot;&gt;arrowParentheses&lt;/code&gt; in the formatter;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nissy-dev&quot;&gt;nissy-dev&lt;/a&gt;, they fixed a bunch of issues around the linter;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/unvalley&quot;&gt;unvalley&lt;/a&gt;, they fixed a bunch of issues around the linter and implemented new rules;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/arendjr&quot;&gt;arendjr&lt;/a&gt;, they implemented new rules in the linter and implemented the new import sorting strategy;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ddanielsantos&quot;&gt;ddanielsantos&lt;/a&gt;, for their first contribution to the project;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nikeee&quot;&gt;nikeee&lt;/a&gt;, for their first contribution to the project;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;translations&quot;&gt;Translations&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://juejin.cn/post/7308539123538624549&quot;&gt;中文翻译: Biome v1版本&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item></channel></rss>