All versions since 2.3.13
2.3.13
Patch Changes
-
#8815
f924f23Thanks @dyc3! - ImproveduseVueValidVOnto be more closely aligned with the source rule. It will now properly allow modifiers for all possible keyboard events. It should have better performance when there are no violations of the rule as well.Now treated valid:
<div @keydown.arrow-down="handler"></div><div @keydown.a="handler"></div><div @keydown.b="handler"></div><div @keydown.27="foo"></div> -
#8856
85f81f9Thanks @dyc3! - Fixed #8710: Biome now parses Vue dynamic slot shorthand arguments that use template literals in[]. -
#8850
2a190e0Thanks @dyc3! - Fixed #8708: Tailwind@utilitydirectives now parse functional utility names likepx-*when Tailwind directives are enabled. -
#8863
79386e0Thanks @dyc3! - Fixed an issue withbiome migrate eslintwhere it couldn’t detect rules for CSS, GraphQL, and HTML. -
#8771
6f56b6eThanks @lghuahua! - Fix the--reporter=summaryoutput incorrectly merging and displaying wrong issue counts for different rules. Fixes #8730 -
#8714
ac3a71fThanks @Netail! - Added new nursery ruleuse-consistent-enum-value-type. This rule disallows enums from having both number and string members.
2.3.14
Patch Changes
-
#8921
29e2435Thanks @siketyan! - Fixed #8759: TheuseConsistentTypeDefinitionsrule no longer converts empty object type declarations into interfaces, as it will conflict with thenoEmptyInterfacerule and can cause an infinite loop when both rules are enabled. -
#8928
ccaeac4Thanks @taga3s! - Added the nursery ruleuseGlobalThis. This rule enforces usingglobalThisoverwindow,selfandglobal. -
#8602
9a18daaThanks @dyc3! - Added the new nursery rulenoVueArrowFuncInWatch. This rule forbids using arrow functions in watchers in Vue components, because arrow functions do not give access to the component instance (viathis), while regular functions do. -
#8905
9b1eea8Thanks @ryan-m-walker! - Fixed #8428: Improved parsing recovery when encountering qualified rules inside CSS@pageat-rule blocks. -
#8900
f788cffThanks @mdevils! - Fixed #8802:useExhaustiveDependenciesnow correctly suggests dependencies without including callback-scoped variables or method names.When accessing object properties with a callback-scoped variable, only the object path is suggested:
// Now correctly suggests `props.value` instead of `props.value[day]`useMemo(() => {return WeekdayValues.filter((day) => props.value[day]);}, [props.value]);When calling methods on objects, only the object is suggested as a dependency:
// Now correctly suggests `props.data` instead of `props.data.forEach`useMemo(() => {props.data.forEach((item) => console.log(item));}, [props.data]); -
#8913
e1e20eaThanks @dyc3! - Fixed #8363: HTML parser no longer crashes when encountering a<character followed by a digit in text content (e.g.,<12 months). The parser now correctly emits an “Unescaped<bracket character” error instead of treating<12as a tag name and crashing. -
#8910
2fb63a4Thanks @dyc3! - Fixed #8774: Type aliases with generic parameters that haveextendsconstraints now properly indent comments after the equals sign.Previously, comments after the
=in type aliases withextendsconstraints were not indented:type A<B, C extends D> = // Some commentundefined;type A<B, C extends D> =// Some commentundefined; -
#8916
ea4bd04Thanks @ryan-m-walker! - Fixed #4013, where comments in member chains caused unnecessary line breaks.// BeforeaFunction.b().c.d();// AfteraFunction.b().c.d(); -
#8945
fa66fe3Thanks @fireairforce! - Fixed #8354: Don’t remove quotes when type memeber is new.// Input:type X = {"new"(): string;"foo"(): string;};// Format Output:type X = {"new()": string;foo(): string;}; -
#8927
0ef3da5Thanks @littleKitchen! - Fixed #8907:useExhaustiveDependenciesnow correctly recognizes stable hook results (likeuseStatesetters anduseRefvalues) when declared withlet. -
#8931
4561751Thanks @koshin01! - Added the new nursery rulenoRedundantDefaultExport, which flags redundant default exports where the default export references the same identifier as a named export. -
#8900
f788cffThanks @mdevils! - Fixed #8883:useExhaustiveDependenciesno longer produces false positives when props are destructured in the function body of arrow function components without parentheses around the parameter.type Props = { msg: string };// Arrow function without parentheses around `props`const Component: React.FC<Props> = (props) => {const { msg } = props;// Previously, this incorrectly reported `msg` as unnecessaryuseEffect(() => console.log(msg), [msg]);}; -
#8861
3531687Thanks @dyc3! - Added thenoDeprecatedMediaTypeCSS rule to flag deprecated media types liketvandhandheld. -
#8775
7ea71cdThanks @igas! - Fixed thenoUnnecessararyConditionsrule to prevent trigger for optional fallback patterns. -
#8860
95f1eeaThanks @dyc3! - Added the nursery rulenoHexColors, which flags the use of hexadecimal color codes in CSS and suggests using named colors or RGB/RGBA/HSL/HSLA formats instead. -
#8786
d876a38Thanks @Bertie690! - Added the nursery ruleuseConsistentMethodSignatures.
Inspired by the similarly named version fromtypescript-eslint, this rule aims to enforce a consistent style for methods used inside object types and interfaces.Examples
Invalid code with
styleset to"property"(the default):interface Foo {method(a: string): void;}Invalid code with
styleset to"method":type Bar = {prop: (a: string) => void;} -
#8864
5e97119Thanks @dyc3! - Improved the summary provided bybiome migrate eslintto be clearer on why rules were not migrated. Biome now specifies a reason when a rule is not migrated, such as being incompatible with the formatter or not implemented yet. This helps users make more informed decisions when migrating their ESLint configurations to Biome. -
#8924
99b4cd1Thanks @tmohammad78! - Fixed #8920:noUnknownFunctionnow knows aboutsibling-count, andsibling-indexcss functions -
#8900
f788cffThanks @mdevils! - Fixed #8885:useExhaustiveDependenciesno longer incorrectly reports variables as unnecessary dependencies when they are derived from expressions containing post/pre-increment operators (++/--) or compound assignment operators (+=,-=, etc.).let renderCount = 0;export const MyComponent = () => {// `count` is now correctly recognized as a required dependency// because `renderCount++` can produce different values between rendersconst count = renderCount++;useEffect(() => {console.log(count);}, [count]); // no longer reports `count` as unnecessary}; -
#8619
d78e01dThanks @Netail! - Added the nursery ruleuseInputName. Require mutation arguments to be called “input”, and the input type to be called Mutation name + “Input”.Invalid:
type Mutation {SetMessage(message: String): String} -
#8922
871b45eThanks @siketyan! - Fixed #8829: Revamped thenoGlobalDirnameFilenamerule to catch many false negatives that have not been reported.
2.3.15
Patch Changes
-
#9019
043b67cThanks @dyc3! - Added the lint rulenoNestedPromises. This rule detects nested.then()or.catch()calls that could be refactored into flat promise chains.// Invalid: nested promise that can be flatteneddoThing().then(function () {return doOtherThing().then(console.log);});// Valid: flat promise chaindoThing().then(() => doOtherThing()).then(console.log);The rule intelligently allows nesting when the inner callback references variables from the outer scope, as these cases cannot be safely flattened.
-
#9029
6ebf6c6Thanks @ff1451! - Added the nursery rulenoUselessReturn. The rule reports redundantreturn;statements that don’t affect the function’s control flow.// Invalid: return at end of function is redundantfunction foo() {doSomething();return;} -
#9017
8bac2daThanks @mdevils! - Reverted a behavior change inuseExhaustiveDependenciesthat was accidentally included as part of the #8802 fix. The change made method calls on objects (e.g.,props.data.forEach(...)) report only the object (props.data) as a missing dependency instead of the full member expression. This behavior change will be reconsidered separately. -
#9005
c8dbbbeThanks @corvid-agent! - Fixed #8790: ThenoAssignInExpressionsrule no longer reports a false positive when an assignment is used as the expression body of an arrow function (e.g.,const f = b => a += b). -
#8519
ccdc602Thanks @ruidosujeira! - Fixed #8518, where globally excluded files in a monorepo were still being processed when using"extends": "//".When a package-level configuration extends the root configuration with
"extends": "//", glob patterns (such as those infiles.includes) are now correctly resolved relative to the project root directory, instead of the current workspace directory. -
#9033
0628e0aThanks @mdevils! - Fixed #8967. useExhaustiveDependencies no longer reports false positives for variables destructured from a rest pattern. -
#9023
8ef9d1dThanks @siketyan! - Fixed #9020: Whenjavascript.jsxRuntimeis set toreactClassic,noUnusedImportsanduseImportTyperules now allow importing theReactidentifier from a package other thanreact. This aligns the behavior withtsc(--jsx=react), which also allows importingReactfrom any package. -
#8646
16fd71dThanks @siketyan! - Fixed #8605: Text expressions in some template languages ({{ expr }}or{ expr }) at the top level of an HTML document no longer causes panicking. -
#8930
51c158eThanks @ANKANJAGTAP! - Fixed #8917 useExhaustiveDependencies now correctly detects JSX component identifiers as hook dependencies. -
#9009
7d229c7Thanks @Netail! - Fixed typo in noPositiveTabindex’s quick fix text. -
#8758
8c789f1Thanks @Pranav2612000! - Updated the useJsxKeyInIterable rule to not run inside Map constructors -
#8977
bbe0e0cThanks @FrankFMY! - Fixed #4888. noUnusedImports now addsexport {}when removing the last import in a TypeScript file to prevent it from becoming an ambient module. This does not apply to embedded scripts in Vue, Svelte, or Astro files, which are already in a module context. -
#9016
9d4cfa3Thanks @dyc3! - Added eslint migration metadata for the rules@typescript/no-var-requires,@typescript/keyword-spacing,@typescript/func-call-spacing,vue/keyword-spacing,vue/func-call-spacing, andunicorn/empty-brace-spaces, -
#8848
2cba2b3Thanks @LouisLau-art! - Fixed #8845. NowuseGenericFontNamesdoesn’t trigger whenfontis declared inside the@supportsat-rule. -
#8997
a5f3212Thanks @mldangelo! - Fixed #8476. useAwaitThenable no longer reports false positives forawaiton call expressions whose return type cannot be resolved (e.g., cross-module function calls to Node.js builtins or npm packages). -
#8978
cc7a478Thanks @FrankFMY! - Fixed #8645. useAwait no longer reportsasyncgenerator functions that useyield*, sinceyield*in an async generator delegates to anAsyncIterableand requires theasyncmodifier.
2.4.0
Minor Changes
-
#8964
0353fa0Thanks @dyc3! - Addedignoreoption to theuseHookAtTopLevelrule.You can now specify function names that should not be treated as hooks, even if they follow the
use*naming convention.Example configuration:
{"linter": {"rules": {"correctness": {"useHookAtTopLevel": {"options": {"ignore": ["useDebounce", "useCustomUtility"]}}}}}} -
#8769
d0358b0Thanks @rahuld109! - Added the ruleuseAnchorContentfor HTML to enforce that anchor elements have accessible content for screen readers. The rule flags empty anchors, anchors with only whitespace, and anchors where all content is hidden witharia-hidden. Anchors witharia-labelortitleattributes providing a non-empty accessible name are considered valid. -
#8742
6340ce6Thanks @rahuld109! - Added the ruleuseMediaCaptionto the HTML language. Enforces thataudioandvideoelements have atrackelement withkind="captions"for accessibility. Muted videos are allowed without captions. -
#8621
d11130bThanks @Netail! - Added support for multiple reporters, and the ability to save reporters on arbitrary files.Combine two reporters in CI
If you run Biome on GitHub, take advantage of the reporter and still see the errors in console, you can now use both reporters:
Terminal window biome ci --reporter=default --reporter=githubSave reporter output to a file
With the new
--reporter-fileCLI option, it’s now possible to save the output of all reporters to a file. The file is a path, so you can pass a relative or an absolute path:Terminal window biome ci --reporter=rdjson --reporter-file=/etc/tmp/report.jsonbiome ci --reporter=summary --reporter-file=./reports/file.txtYou can combine these two features. For example, have the
defaultreporter written on terminal, and therdjsonreporter written on file:Terminal window biome ci --reporter=default --reporter=rdjson --reporter-file=/etc/tmp/report.jsonThe
--reporterand--reporter-fileflags must appear next to each other, otherwise an error is thrown. -
#8399
ab88099Thanks @ematipico! - The Biome CSS parser is now able to parse Vue SFC syntax such as:slottedand:deep. These pseudo functions are only correctly parsed when the CSS is defined inside.vuecomponents. Otherwise, Biome will a emit a parse error.This capability is only available when
experimentalFullHtmlSupportedEnabledis set totrue. -
#8663
3dfea16Thanks @ematipico! - Added support for Cursor files. When Biome sees a Cursor JSON file, it will parse it with comments enabled and trailing commas enabled:$PROJECT/.cursor/%APPDATA%\Cursor\User\on Windows~/Library/Application Support/Cursor/User/on macOS~/.config/Cursor/User/on Linux
-
#8723
fe2c642Thanks @cbstns! - Added JSON as a target language for GritQL pattern matching. You can now write Grit plugins for JSON files.This enables users to write GritQL patterns that match against JSON files, useful for:
- Searching and transforming JSON configuration files
- Enforcing patterns in
package.jsonand other JSON configs - Writing custom lint rules for JSON using GritQL
Example patterns:
Match all key-value pairs:
language jsonpair(key = $k, value = $v)Match objects with specific structure:
language jsonJsonObjectValue()Supports both native Biome AST names (
JsonMember,JsonObjectValue) and TreeSitter-compatible names (pair,object,array) for compatibility with existing Grit patterns.For more details, see the GritQL documentation.
-
#8814
4d9c676Thanks @Netail! - Addedignoreoption tonoUnknownProperty. If an unknown property name matches any of the items provided inignore, a diagnostic won’t be emitted. -
#8631
4d8f19dThanks @Netail! - Add a new reporter--reporter=sarif, that emits diagnostics using the SARIF format. -
#8270
4f7909dThanks @lucasweng! - Added theuseIframeTitlelint rule for HTML. The rule enforces the usage of thetitleattribute for theiframeelement.Invalid:
<iframe></iframe> <iframe title=""></iframe>Valid:
<iframe title="title"></iframe> -
#8164
1d25856Thanks @ematipico! - Added a new assist actionuseSortedInterfaceMembersthat sorts TypeScript interface members, for readability.It includes an autofix.
Invalid example.
interface MixedMembers {z: string;a: number;(): void;y: boolean;}Valid example (after using the assist).
interface MixedMembers {a: number;y: boolean;z: string;(): void;} -
#8647
4c7c06fThanks @siketyan! - It’s now possible to provide the stacktrace for a fatal error. The stacktrace is only available when the environment variableRUST_BACKTRACE=1is set, either via the CLI or exported$PATH. This is useful when providing detailed information for debugging purposes:Terminal window RUST_BACKTRACE=1 biome lint -
#7961
a04c8dfThanks @siketyan! - The Biome Language Server now reports progress while scanning files and dependencies in the project. -
#8289
a9025d4Thanks @theshadow27! - Fixed #8024. The ruleuseIterableCallbackReturnnow supports acheckForEachoption. When set tofalse, the rule will skip checking forforEach()callbacks for returning values. -
#8690
e06e5d1Thanks @ematipico! - Added the ruleuseValidLangto the HTML language. -
#7847
e90b14fThanks @Jagget! - Added support forjsxFactoryandjsxFragmentFactory.Biome now respectsjsxFactoryandjsxFragmentFactorysettings fromtsconfig.jsonwhen using the classic JSX runtime, preventing false positive noUnusedImports errors for custom JSX libraries like Preact.tsconfig.json {compilerOptions: {jsx: "react",jsxFactory: "h",jsxFragmentFactory: "Fragment",},}Component.jsx import { h, Fragment } from "preact";function App() {return <div>Hello</div>;} -
#8071
7f5bcf4Thanks @ematipico! - Added new CLI options to the commandslsp-proxyandstartthat allow to control the Biome file watcher.--watcher-kindControls how the Biome file watcher should behave. By default, Biome chooses the best watcher strategy for the current OS, however sometimes this could result in some issues, such as folders locked.
The option accepts the current values:
recommended: the default option, which chooses the best watcher for the current platform.polling: uses the polling strategy.none: it doesn’t enable the watcher. When the watcher is disabled, changes to files aren’t recorded anymore by Biome. This might have repercussions on some lint rules that might rely on updated types or updated paths.
The environment variable
BIOME_WATCHER_KINDcan be used as alias.--watcher-polling-intervalThe polling interval in milliseconds. This is only applicable when using the
pollingwatcher. It defaults to2000milliseconds.The environment variable
BIOME_WATCHER_POLLING_INTERVALcan be used as alias. -
#8262
4186b83Thanks @lucasweng! - Added theuseHtmlLanglint rule for HTML. The rule enforces that thehtmlelement has alangattribute.Invalid:
<html></html><html lang></html><html lang=""></html>Valid:
<html lang="en"></html> -
#8376
1a9334cThanks @siketyan! - Added support for formatting and linting embedded GraphQL snippets in JavaScript.For example, the following snippets are now formatted:
import gql from "graphql-tag";const PeopleCountQuery = gql`query PeopleCount {allPeople {totalCount}}`;import { graphql } from "./graphql";const PeopleCountQuery = graphql(`query PeopleCount {allPeople {totalCount}}`);This feature is experimental and must be enabled explicitly in the configuration:
{"javascript": {"experimentalEmbeddedSnippetsEnabled": true}} -
#7799
54682aaThanks @PaulRBerg! - AddedgroupByNestingoption to theuseSortedKeysassist. When enabled, object keys are grouped by their value’s nesting depth before sorting alphabetically.Simple values (primitives, single-line arrays, and single-line objects) are sorted first, followed by nested values (multi-line arrays and multi-line objects).
Example
To enable this option, configure it in your
biome.json:{"linter": {"rules": {"source": {"useSortedKeys": {"options": {"groupByNesting": true}}}}}}With this option, the following unsorted object:
const object = {name: "Sample",details: {description: "nested",},id: 123,};Will be sorted as:
const object = {id: 123,name: "Sample",details: {description: "nested",},}; -
#8641
1dc8dc2Thanks @tt-a1i! - Added thenoAutofocuslint rule for HTML. This rule enforces that theautofocusattribute is not used on elements, as it can cause usability issues for sighted and non-sighted users. The rule allowsautofocusinsidedialogelements or elements with thepopoverattribute, as these are modal contexts where autofocus is expected. -
#8501
8eb3f19Thanks @tt-a1i! - AddednoPositiveTabindexto HTML. This rule prevents the usage of positive integers on thetabindexattribute, which can disrupt natural keyboard navigation order. -
#8661
b36ff03Thanks @tt-a1i! - Added theuseAltTextlint rule for HTML. This rule enforces that elements requiring alternative text (<img>,<area>,<input type="image">,<object>) provide meaningful information for screen reader users viaalt,title(for objects),aria-label, oraria-labelledbyattributes. Elements witharia-hidden="true"are exempt. -
#7749
1c59333Thanks @andogq! - Implements #1984. UpdateduseHookAtTopLevelto better catch invalid hook usage.This rule is now capable of finding invalid hook usage in more locations. A diagnostic will now be generated if:
- A hook is used at the module level (top of the file, outside any function).
- 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).
Invalid:
// Invalid: hooks cannot be called at the module level.useHook();// Invalid: hooks must be called from another hook or component.function notAHook() {useHook();}Valid:
// Valid: hooks may be called from function expressions, such as in tests.test("my hook", () => {renderHook(() => useHook());renderHook(function () {return useHook();});}); -
#8307
789b0e7Thanks @mehm8128! - Added theuseValidAriaRolelint rule for HTML. The rule enforces that elements with ARIA roles must use a valid, non-abstract ARIA role. -
#8814
4d9c676Thanks @Netail! - Addedignoreoption tonoUnknownFunction. If an unknown function name matches any of the items provided inignore, a diagnostic won’t be emitted. -
#8814
4d9c676Thanks @Netail! - Addedignoreoption tonoUnknownPseudoClass. If an unknown pseudo-class name matches any of the items provided inignore, a diagnostic won’t be emitted. -
#8623
dc1f94eThanks @mldangelo! - Added thenoDuplicateClassesassist action to detect and remove duplicate CSS classes.For JSX files: Supports
class,classNameattributes and utility functions likeclsx,cn,cva.For HTML files: Checks
classattributes. This is the first assist action for HTML.// Before<div class="flex p-4 flex" />;// After<div class="flex p-4" />; -
#8399
ab88099Thanks @ematipico! - Improved the CSS parser for CSS modules. Biome now automatically enables CSS modules parsing for*.module.cssfiles.If your codebase has only
*.module.cssfiles, you can remove the parser feature as follows, because now Biome does it for you:{"css": {"parser": {"cssModules": true}}} -
#8399
ab88099Thanks @ematipico! - Added support for parsing:globaland:localinside.astro,.svelteand.vuefiles, in<style>portion of the file.This capability is only available when
experimentalFullHtmlSupportedEnabledis set totrue. -
#9011
e014336Thanks @ematipico! - Promoted 21 nursery rules to stable groups.Correctness
Promoted the following rules to the
correctnessgroup:noUnresolvedImports. The rule reports imports that cannot be resolved. The default rule severity is set toerror.noVueReservedProps. The rule reports Vue reserved props usage. The default rule severity is set toerror.noVueReservedKeys. The rule reports Vue reserved keys usage. The default rule severity is set toerror.noVueDataObjectDeclaration. The rule reports Vue 2 data declared as an object instead of a function. The default rule severity is set towarn.noNextAsyncClientComponent. The rule reports async Next.js client components. The default rule severity is set towarn.noVueDuplicateKeys. The rule reports duplicate keys in Vue component options. The default rule severity is set toerror.noVueSetupPropsReactivityLoss. The rule reports destructuring of props in Vue 3 setup which causes reactivity loss. The default rule severity is set toerror.useQwikMethodUsage. The rule enforces correct Qwik framework method usage. The default rule severity is set toerror.useQwikValidLexicalScope. The rule enforces valid lexical scope in Qwik framework. The default rule severity is set toerror.
Suspicious
Promoted the following rules to the
suspiciousgroup:noImportCycles. The rule reports circular imports. The default rule severity is set towarn.noDeprecatedImports. The rule reports imports of deprecated symbols. The default rule severity is set towarn.noReactForwardRef. The rule reports usage ofReact.forwardRef. The default rule severity is set towarn.noUnusedExpressions. The rule reports expressions that are never used. The default rule severity is set towarn.noEmptySource. The rule reports empty source files. The default rule severity is set towarn.useDeprecatedDate. The rule enforces use of GraphQL@deprecateddirective with date. The default rule severity is set towarn.noDuplicateDependencies. The rule reports duplicate dependencies in package.json. The default rule severity is set towarn.
Complexity
Promoted the following rules to the
complexitygroup:noUselessUndefined. The rule reports uselessundefinedinitialization and returns. The default rule severity is set toinfo.useMaxParams. The rule enforces a maximum number of function parameters. The default rule severity is set towarn.noUselessCatchBinding. The rule reports useless catch binding parameters. The default rule severity is set toinfo.
Style
Promoted the following rules to the
stylegroup:useConsistentArrowReturn. The rule enforces consistent return in arrow functions. The default rule severity is set toinfo.noJsxLiterals. The rule reports literal strings in JSX. The default rule severity is set toinfo.
-
#8695
d8f0309Thanks @ematipico! - Added support for the top-level suppression commentbiome-ignore-all format: <explanation>.When the comment
biome-ignore-all format: <explanation>is placed at the beginning of the document, Biome won’t format the code.The feature works for all supported languages. In the following JavaScript snippet, the code isn’t formatted and will stay as is.
// biome-ignore-all format: generatedconst a = [];const a = [];const a = []; -
#8255
da85e3cThanks @ryan-m-walker! - Added support for the typedattrfunction. Addresses issue #6183.Example
.btn {width: attr(data-size type(<length> | <percentage>), 0px);} -
#8165
e0b3f62Thanks @lucasweng! - Added thenoAccessKeylint rule for HTML. The rule enforces that theaccesskeyattribute is not used on any HTML element, as it can conflict with keyboard commands used by screen readers and keyboard-only users.Invalid:
<input type="submit" accesskey="s" value="Submit" /><a href="https://webaim.org/" accesskey="w">WebAIM.org</a><button accesskey="n">Next</button>Valid:
<input type="submit" value="Submit" /><a href="https://webaim.org/">WebAIM.org</a><button>Next</button> -
#8278
7207effThanks @ematipico! - Added a feature that allows editors to inject a Biome configuration to the Biome Language Server without affecting the configuration of the project.If you have a Biome extension that is compatible with your preferred LSP-ready editor, you can map
inlineConfig. The configuration will be merged with the configuration of the project (or the default configuration):For example, with the Zed editor, you would have the following configuration, which will format all files using four spaces as indentation style:
.zed/settings.json {lsp: {biome: {settings: {inline_config: {formatter: {indentStyle: "space",indentWidth: 4,},},},},},} -
#8368
8aa5f5bThanks @Bertie690! - Added 2 options fromtypescript-eslint(ignoreDifferentlyNamedParametersandignoreDifferentJsDoc) touseUnifiedTypeSignatures.Each option makes the rule ignore overload signatures whose parameter names or JSDoc comments differ.
Examples
Valid code with
ignoreDifferentlyNamedParametersset totrue:function cook(scoops: IceCreamScoop[]): void;function cook(cakeType: string): void;Valid code with
ignoreDifferentJsDocset totrue:/** Does objs have "cow" inside it? */function hasCow(objs: string[]): boolean;/** @deprecated - convert to array */function hasCow(objs: string): boolean; -
#8562
361350eThanks @dyc3! - Added the rule profiler behind the--profile-rulescli flag. You can now see a report of which lint rules took the longest to execute. -
#8234
e2e6e66Thanks @ongyuxing! - Updated the CSS properties ordering to align withstylelint-config-recess-orderv7.4.0.It adds support for:
- Containment properties
- Font synthesis properties
- Ruby properties
- Color adjustment properties
- View transitions properties
- Shapes properties
- Motion path properties
- etc.
For the complete list of changes, see: https://github.com/stormwarning/stylelint-config-recess-order/compare/v6.0.0…v7.4.0.
-
#8814
4d9c676Thanks @Netail! - Addedignoreoption tonoUnknownPseudoElement. If an unknown pseudo-element name matches any of the items provided inignore, a diagnostic won’t be emitted. -
#8663
3dfea16Thanks @ematipico! - Added the ability to load the configuration from new known paths. Biome now attempts to load the configuration files from the following locations:$XDG_CONFIG_HOMEor$HOME/.config/biomeon Linux/Users/$USER/Library/Application Support/biomeon macOSC:\Users\$USER\AppData\Roaming\biome\configon Windows
The priority how Biome will attempt to load the configuration files is the following:
- project folder (working directory)
- parent folders
- config home
$XDG_CONFIG_HOMEor$HOME/.config/biomeon Linux/Users/$USER/Library/Application Support/biomeon macOSC:\Users\$USER\AppData\Roaming\biome\configon Windows
-
#7973
bc0e8b4Thanks @siketyan! - Added support for formatting and linting embedded CSS snippets in JavaScript.For example, the following snippets are now formatted and linted:
import styled from "styled-components";const Foo = styled.div`display: flex;color: red;`;import styled from "@emotion/styled";const Foo = styled(Box)`display: flex;color: red;`;import { css } from "@emotion/react";const style = css`display: flex;color: red;`;However, snippets with interpolations are not supported yet. For example, the following snippet isn’t formatted:
import styled from "@emotion/styled";const Foo = styled.div<{ color: string }>`display: flex;color: ${(props) => props.color};`;This feature is experimental and must be enabled explicitly in the configuration:
{"javascript": {"experimentalEmbeddedSnippetsEnabled": true}} -
#8381
50c3513Thanks @mehm8128! - Added theuseAriaPropsForRolelint rule for HTML. The rule enforces that elements with ARIA roles must have all required ARIA attributes for that role. -
#7762
5901d79Thanks @dyc3! - Added theextensionMappingsoption touseImportExtensions. This allows users to specify custom file extensions for different module types.For example, if you want to ban all
.tsimports in favor of.jsimports, you can now do so with this option:{"options": {"extensionMappings": {"ts": "js"}}} -
#8532
01bccc8Thanks @jonaylor89! - Added--onlyand--skipoptions tobiome checkandbiome ci, covering both lint diagnostics and assist actions. Biome now lets you run or exclude specific lint rules, assist actions, group or rules and actions, or domains when running these commands.Examples:
Terminal window biome check --only=suspicious/noDebugger src/**/*.jsbiome ci --skip=project src/** -
#8666
7733f90Thanks @ematipico! - Added the rulenoRedundantAltto HTML. The rule enforces that theimgelementaltattribute does not contain the words “image”, “picture”, or “photo”. -
#8287
a248e88Thanks @mehm8128! - Added thenoDistractingElementslint rule for HTML. The rule enforces that no distracting elements like<marquee>or<blink>are used. -
#8564
adcce82Thanks @ematipico! - Added the new linter domaintypes. This is a domain that enables all rules that require the type inference engine.As opposed to the
projectdomain, which only enables rules that require the module graph to function.The following nursery rules have been moved to the
typesdomain:useArraySortCompareuseAwaitThenableuseFinduseRegexpExecnoUnnecessaryConditionsnoMisusedPromisesnoFloatingPromises
-
#8556
47a79f1Thanks @mehm8128! - Added two new behaviors to thenoSvgWithoutTitlerule.- Support for
graphics-documentandgraphics-symbolroles. - Support for multiple role specifications.
- Support for
-
#8663
3dfea16Thanks @ematipico! - Added the ability to load the hidden files.biome.jsonand.biome.jsonc. This is the order how Biome will attempt the configuration file is:biome.jsonbiome.jsonc.biome.json.biome.jsonc
-
#8334
ae8ac8eThanks @ematipico! - Added the formatter optiontrailingNewline.When set to
false, the formatter will remove the trailing newline at the end of formatted files. The default value istrue, which preserves the current behavior of adding a trailing newline.This option is available globally and for each language-specific formatter configuration:
{"formatter": {"trailingNewline": false},"javascript": {"formatter": {"trailingNewline": true}}}The following CLI flags have been added. They accept
trueorfalseas value:--formatter-trailing-newline--javascript-formatter-trailing-newline--json-formatter-trailing-newline--graphql-formatter-trailing-newline--css-formatter-trailing-newline--html-formatter-trailing-newline
-
#8854
1469968Thanks @ematipico! - Formatting is now applied when applying safe/unsafe fixes viabiome check. -
#8642
46f33a7Thanks @ematipico! - Improved the rulenoUnusedVariablesin Svelte files, by correctly detecting variables defined in the JavaScript blocks, and used inside the templates. -
#8839
79b38aaThanks @ryan-m-walker! - Added support for parsing and formatting the CSS@functionat-rule from the CSS Mixins Module Level 1 specification. Addresses issue #8184.@function --transparent(--color <color>, --alpha <number>: 0.5) returns<color> {result: oklch(from var(--color) l c h / var(--alpha));} -
#8412
73f4f53Thanks @mehm8128! - Added thenoSvgWithoutTitlelint rule to HTML. The rule enforces the usage of thetitleelement for thesvgelement. -
#8243
4291ff3Thanks @ashnewmanjones! - Added theuseButtonTypelint rule for HTML. The rule enforces that thetypeattribute is present and valid on all button elements.Invalid:
<button>Do something</button><button type="incorrectType">Do something</button><button type>Do something</button><button type />Valid:
<button type="button">Do something</button><button type="reset">Do something</button><button type="submit" />
Patch Changes
-
#8898
7e48bd4Thanks @ematipico! - Added e18e ESLint plugin as a recognized rule source. Six Biome rules now reference their e18e equivalents:useAtIndex,useExponentiationOperator,noPrototypeBuiltins,useDateNow,useSpread, anduseObjectSpread. -
#8719
a215408Thanks @ematipico! - Added proper parsing and formatting for Svelte directives when thehtml.experimentalFullSupportEnabledis set totrue. -
#8071
7f5bcf4Thanks @ematipico! - Revamped the logging options for all Biome commands. Now the commandsformat,lint,check,ci,search,lsp-proxyandstartaccept the following CLI options.Some options might have been present before, but they were inconsistent. Plus, all new options have an environment variable as aliases.
--log-fileOptional path/file to redirect log messages to. This option is applicable only to the CLI. If omitted, logs are printed to stdout.
Environment variable alias:
BIOME_LOG_FILE--log-prefix-nameAllows changing the prefix applied to the file name of the logs. This option is applicable only to the daemon.
Environment variable alias:
BIOME_LOG_PREFIX_NAME--log-pathAllows changing the folder where logs are stored. This option is applicable only to the daemon.
Environment variable alias:
BIOME_LOG_PATH--log-levelThe level of logging. In order, from the most verbose to the least verbose:
debug,info,warn,errorThe value
nonewon’t show any logging.Environment variable alias:
BIOME_LOG_LEVEL--log-kindWhat the log should look like.
Environment variable alias:
BIOME_LOG_KINDReduce dumping of LSP logs
When you use a Biome editor extension, Biome’s Daemon dumps its logs using the
debuglevel. If you want to reduce the quantity of these logs, you can now customize it:Terminal window BIOME_LOG_LEVEL=info biome lsp-proxy -
#8663
3dfea16Thanks @ematipico! - Fixed #901. Biome now allows trailing commas in inside Zedsettings.jsonand VSCodesettings.json. -
#8669
683f50dThanks @tt-a1i! - Fixed #8628:useComponentExportOnlyModulesnow allows components referenced as object property values in exported expressions. This fixes false positives for TanStack Router patterns.export const Route = createFileRoute('/')({component: HomeComponent,})function HomeComponent() { ... } // no longer reported as "should be exported" -
#9060
0e47f5aThanks @dyc3! - Fixed #9057: Incorrect diagnostic spans for suppression comments and other raw diagnostics in HTML-ish files (Vue, Svelte, Astro). Previously, diagnostics like “unused suppression” pointed to the wrong location in the document due to the diagnostic offset not being applied. -
#9028
5ac2ad6Thanks @LouisLau-art! - Fixed #9024: Biome no longer reports<hr role="presentation">undernoInteractiveElementToNoninteractiveRole. -
#9072
8656fc0Thanks @dyc3! - Fixed #9068: ThenoVueDuplicateKeysrule now correctly handlestoRefs(props)patterns and no longer produces false positives when destructuring props, particularly in<script setup>blocks. -
#9049
c0ab6ddThanks @ematipico! - Fixed #7138. Now the Biome language server correctly handles theconfigurationPathsetting coming from the editor extension. -
#8556
47a79f1Thanks @mehm8128! - Fixed thenoSvgWithoutTitlerule not to recursively traversetitleelements. -
#8894
6bf1b09Thanks @ematipico! - Added proper parsing for spread attributes{...props}in Svelte and Astro files. -
#8833
375792eThanks @dyc3! - Fixed #4927, #6407: The HTML formatter will now correctly break a block-like element if it has more than 2 children, and at least one of them is another block-like element.<div>a<div>b</div> c</div><div>a<div>b</div>c</div> -
#8854
1469968Thanks @ematipico! - Fixed#7912, where Biome incorrectly added a leading newline to the code contained inside the Astro frontmatter. -
#8806
cb112ceThanks @dyc3! - Major Breaking Changes to the HTML formatter onlyThe HTML formatter (which is still experimental) has been completely overhauled from the ground up to more closely resemble Prettier’s formatting. If you have opted in to the HTML formatter, you may see large formatting diffs for your HTML, Vue, Svelte, and Astro files.
This overhaul fixes several issues (#5150, #6625, #8437) around whitespace sensitivity that were causing incorrect formatting in certain scenarios that were difficult or impossible to fully address before.
-
#8700
0f5a05bThanks @ematipico! - Improved the rulesuseConst,noUnusedImports,useImportTypesandnoUnusedVariablesinside Vue, Svelte and Astro files whenexperimentalFullSupportEnabledis set totrue.Now variables and components that are imported or defined inside the files won’t trigger false positives.
Until now, we suggested disabling these rules with an override. Now the rules are more stable; however, you might still experience a few false positives. Those are probably issues caused by our parser.
If you use
experimentalFullSupportEnabled, you can remove the following override:{"overrides": [{"includes": ["**/*.svelte", "**/*.astro", "**/*.vue"],"linter": {"rules": {"style": {"useConst": "off","useImportType": "off"},"correctness": {"noUnusedVariables": "off","noUnusedImports": "off"}}}}]} -
#8485
bf02ba6Thanks @ematipico! - Fixed an issue where some info diagnostics weren’t tracked by the final summary. -
#8846
5701eadThanks @dyc3! - Fixed #8692: Biome now accepts Vue’sv-bind()function in CSS when Vue CSS modules parsing is enabled. -
#9012
18cdd45Thanks @kiroushi! - Fixed plugin diagnostics showing incorrect line numbers in Vue, Astro, and Svelte files. Plugin diagnostics now correctly account for the template/frontmatter offset, pointing to the right location in the<script>block.
2.4.1
Patch Changes
-
#9092
6edd600Thanks @ematipico! - Fixed #9052. This PR reverts changes introduced by https://github.com/biomejs/biome/pull/8519, which caused unwanted changes on how paths are resolved. -
#9091
3bf674dThanks @ematipico! - Fixed #9090, where SCSS files were incorrectly processed by Biome. This was a regressions caused by the latest developments for supporting SCSS out of the box. -
#9100
66931a8Thanks @siketyan! - Fixed #9081: ThenoUnknownPseudoElementrule no longer reports false positives for any known pseudo elements in CSS modules. This was a regression introduced in v2.4.0. -
#9102
d01b903Thanks @ematipico! - Fixed #9095, where Biome didn’t print anything in stdin mode. This was a regression caused by a recent, internal refactor.
2.4.2
Patch Changes
-
#9103
fc9850cThanks @dyc3! - Fixed #9098:useImportTypeno longer incorrectly flags imports used in Svelte control flow blocks ({#if},{#each},{#await},{#key}) as type-only imports. -
#9106
f4b7296Thanks @dyc3! - Updated rule source metadata for rules fromhtml-eslint. -
#8960
4a5ff40Thanks @abossenbroek! - Added the nursery rulenoConditionalExpect. This rule disallows conditionalexpect()calls inside tests, which can lead to tests that silently pass when assertions never run.// Invalid - conditional expect may not runtest("conditional", async ({ page }) => {if (someCondition) {await expect(page).toHaveTitle("Title");}});// Valid - unconditional expecttest("unconditional", async ({ page }) => {await expect(page).toHaveTitle("Title");}); -
#8960
4a5ff40Thanks @abossenbroek! - Added the nursery rulenoPlaywrightElementHandle. Prefers locators to element handles.const el = await page.$(".btn"); -
#8960
4a5ff40Thanks @abossenbroek! - Added the nursery rulenoPlaywrightEval. Disallowspage.$eval()andpage.$$eval()methods.await page.$eval(".btn", (el) => el.textContent); -
#8960
4a5ff40Thanks @abossenbroek! - Added the nursery rulenoPlaywrightForceOption. Disallows theforceoption on user interactions.await locator.click({ force: true }); -
#8960
4a5ff40Thanks @abossenbroek! - Added the nursery rulenoPlaywrightMissingAwait. Enforces awaiting async Playwright APIs.const el = page.locator(".btn");el.click(); // Missing await -
#8960
4a5ff40Thanks @abossenbroek! - Added the nursery rulenoPlaywrightNetworkidle. Disallows deprecatednetworkidlewait option.await page.goto(url, { waitUntil: "networkidle" }); -
#8960
4a5ff40Thanks @abossenbroek! - Added the nursery rulenoPlaywrightPagePause. Disallowspage.pause()debugging calls in committed code.await page.pause(); -
#8960
4a5ff40Thanks @abossenbroek! - Added the nursery rulenoPlaywrightUselessAwait. Disallows unnecessaryawaiton synchronous Playwright methods.// Incorrect - locator() is synchronousconst loc = await page.locator(".btn"); -
#8960
4a5ff40Thanks @abossenbroek! - Added the nursery rulenoPlaywrightWaitForNavigation. Prefers modern navigation APIs over deprecatedwaitForNavigation().await page.waitForNavigation(); -
#8960
4a5ff40Thanks @abossenbroek! - Added the nursery rulenoPlaywrightWaitForSelector. Prefers locators over deprecatedwaitForSelector().await page.waitForSelector(".btn"); -
#8960
4a5ff40Thanks @abossenbroek! - Added the nursery rulenoPlaywrightWaitForTimeout. Disallows hard-coded timeouts withwaitForTimeout().await page.waitForTimeout(5000); -
#8960
4a5ff40Thanks @abossenbroek! - EnhancednoSkippedTeststo detect Playwright patterns (.fixme,test.describe,test.step, bracket notation, bare calls). ConsolidatednoPlaywrightSkippedTestinto this rule. -
#9101
0c0fb6fThanks @siketyan! - Fixed#9080: ThenoUnusedVariablesrule no longer reports a top-levelPropsinterface or type alias as unused in Astro files. -
#8960
4a5ff40Thanks @abossenbroek! - Added the nursery ruleuseExpect. This rule ensures that test functions contain at least oneexpect()assertion.// Invalid - test without assertiontest("no assertion", async ({ page }) => {await page.goto("/");});// Valid - test with assertiontest("has assertion", async ({ page }) => {await expect(page).toHaveTitle("Title");}); -
#8960
4a5ff40Thanks @abossenbroek! - Added the nursery ruleusePlaywrightValidDescribeCallback. Validates that describe callback signatures are not async.test.describe("suite", async () => {});
2.4.3 Latest
Patch Changes
-
#9120
aa40fc2Thanks @ematipico! - Fixed #9109, where the GitHub reporter wasn’t correctly enabled whenbiome ciruns on GitHub Actions. -
#9128
8ca3f7fThanks @dyc3! - Fixed #9107: The HTML parser can now correctly parse Astro directives (client/set/class/is/server), which fixes the formatting for Astro directives. -
#9124
f5b0e8dThanks @ematipico! - Fixed #8882 and #9108: The Astro frontmatter lexer now correctly identifies the closing---fence when the frontmatter contains multi-line block comments with quote characters, strings that mix quote types (e.g."it's"), or escaped quote characters (e.g."\"). -
#9142
3ca066bThanks @THernandez03! - Fixed #9141: ThenoUnknownAttributerule no longer reportsclosedbyas an unknown attribute on<dialog>elements. -
#9126
792013eThanks @ematipico! - Added missing Mocha globals to theTestdomain:context,run,setup,specify,suite,suiteSetup,suiteTeardown,teardown,xcontext,xdescribe,xit, andxspecify. These are injected by Mocha’s BDD and TDD interfaces and were previously flagged as undeclared variables in projects using Mocha. -
#8855
6918c9eThanks @ruidosujeira! - Fixed #8840. Now the Biome CSS parser correctly parsesnot + scroll-stateinside@containerqueries. -
#9111
4fb55cfThanks @Jayllyz! - Slightly improved performance ofnoIrregularWhitespaceby adding early return optimization and simplifying character detection logic. -
#8975
086a0c5Thanks @FrankFMY! - Fixed #8478:useDestructuringno longer suggests destructuring when the variable has a type annotation, likeconst foo: string = object.foo.
Copyright (c) 2023-present Biome Developers and Contributors.