โ ๏ธ Breaking Change
Impact Score: 7/10
Biome CLI v2.1.4
Source available โ automated, not human-reviewed
Component: @biomejs/biome ยท Channel: stable. Automated analysis, not a compatibility certification. How this works.
Analysis updated: 2026-11-01.
Breaking-change evidence from the source
Breaking Change**: The `noImportCycles` rule no longer detects import cycles that include one or more type-only imports by default.
โก Executive Summary (TL;DR)
Biome @biomejs/[email protected]. Source highlight: Fixed #7111: Imported symbols using aliases are now correctly recognised.
Who Does This Impact? (Role-Based Analysis)
๐ป Software Engineers & Devs
Check the source notes against the package and APIs you use before upgrading.
๐ Product & Engineering Leads
Use the documented changes to assess relevance to your product; release frequency alone is not a quality measure.
โ๏ธ DevOps & Security
Verify the target version, runtime requirements and rollback procedure in the official documentation.
โ ๏ธ Breaking Changes & Deprecations (1)
- Breaking Change**: The `noImportCycles` rule no longer detects import cycles that include one or more type-only imports by default.
โจ New Features & Capabilities (6)
- feat(parse/tailwind): start implementing lexer/parser
- feat(qwik): add few new lint rules
- chore: add Claude sub-agents
- feat(format/html): implement suppression comments
- feat: add tailwind domain
- chore(lint): add version to the released rules
๐ง Bug Fixes & Patches (6)
- Fixed #7111: Imported symbols using aliases are now correctly recognised.
- Fixed #6933 and #6994.
- Added the `noQwikUseVisibleTask` rule to Qwik.
- Added the new nursery rule `noUnnecessararyConditions`, which detects whenever some conditions don't
- Added the `useImageSize` rule to Biome.
- Added the `useAnchorHref` rule to Biome.
๐ View Raw Release Notes (Original Developer Log)
## 2.1.4
### Patch Changes
- [#7121](https://github.com/biomejs/biome/pull/7121) [`b9642ab`](https://github.com/biomejs/biome/commit/b9642abc6d05135180f4243df30524cf40ba12df) Thanks [@arendjr](https://github.com/arendjr)! - Fixed [#7111](https://github.com/biomejs/biome/issues/7111): Imported symbols using aliases are now correctly recognised.
- [#7103](https://github.com/biomejs/biome/pull/7103) [`80515ec`](https://github.com/biomejs/biome/commit/80515ecad8cc272feeae4c17762d3b150acd88e7) Thanks [@omasakun](https://github.com/omasakun)! - Fixed [#6933](https://github.com/biomejs/biome/issues/6933) and [#6994](https://github.com/biomejs/biome/issues/6994).
When the values of private member assignment expressions, increment expressions, etc. are used, those private members are no longer marked as unused.
- [#6887](https://github.com/biomejs/biome/pull/6887) [`0cc38f5`](https://github.com/biomejs/biome/commit/0cc38f59cd9ddf0fdcd12d6f8cb3642743cc4406) Thanks [@ptkagori](https://github.com/ptkagori)! - Added the [`noQwikUseVisibleTask`](https://biomejs.dev/linter/rules/no-qwik-use-visible-task) rule to Qwik.
This rule is intended for use in Qwik applications to warn about the use of `useVisibleTask$()` functions which require careful consideration before use.
**Invalid:**
```js
useVisibleTask$(() => {
console.log("Component is visible");
});
```
**Valid:**
```js
useTask$(() => {
console.log("Task executed");
});
```
- [#7084](https://github.com/biomejs/biome/pull/7084) [`50ca155`](https://github.com/biomejs/biome/commit/50ca1553f08348ab1e92dc7cf04013c85ff743a4) Thanks [@ematipico](https://github.com/ematipico)! - Added the new nursery rule `noUnnecessararyConditions`, which detects whenever some conditions don't
change during the life cycle of the program, and truthy or false, hence deemed redundant.
For example, the following snippets will trigger the rule:
```js
// Always truthy literal conditions
if (true) {
console.log("always runs");
}
```
```ts
// Unnecessary condition on constrained string type
function foo(arg: "bar" | "baz") {
if (arg) {
// This check is unnecessary
}
}
```
- [#6887](https://github.com/biomejs/biome/pull/6887) [`0cc38f5`](https://github.com/biomejs/biome/commit/0cc38f59cd9ddf0fdcd12d6f8cb3642743cc4406) Thanks [@ptkagori](https://github.com/ptkagori)! - Added the [`useImageSize`](https://biomejs.dev/linter/rules/use-image-size) rule to Biome.
The `useImageSize` rule enforces the use of width and height attributes on `<img>` elements for performance reasons. This rule is intended to prevent layout shifts and improve Core Web Vitals by ensuring images have explicit dimensions.
**Invalid:**
```jsx
<img src="/image.png" />
<img src="https://example.com/image.png" />
<img src="/image.png" width="200" />
<img src="/image.png" height="200" />
```
**Valid:**
```jsx
<img width="200" height="600" src="/static/images/portrait-01.webp" />
<img width="100" height="100" src="https://example.com/image.png" />
```
- [#6887](https://github.com/biomejs/biome/pull/6887) [`0cc38f5`](https://github.com/biomejs/biome/commit/0cc38f59cd9ddf0fdcd12d6f8cb3642743cc4406) Thanks [@ptkagori](https://github.com/ptkagori)! - Added the [`useAnchorHref`](https://biomejs.dev/linter/rules/use-anchor-href) rule to Biome.
The `useAnchorHref` rule enforces the presence of an `href` attribute on `<a>` elements in JSX. This rule is intended to ensure that anchor elements are always valid and accessible.
**Invalid:**
```jsx
<a>Link</a>
```
```jsx
<a target="_blank">External</a>
```
**Valid:**
```jsx
<a href="/home">Home</a>
```
```jsx
<a href="https://example.com" target="_blank">
External
</a>
```
- [#7100](https://github.com/biomejs/biome/pull/7100) [`29fcb05`](https://github.com/biomejs/biome/commit/29fcb0540ed817d92a3f663132b658541706765b) Thanks [@Jayllyz](https://github.com/Jayllyz)! - Added the rule [`noNonNullAssertedOptionalChain`](https://biomejs.dev/linter/rules/no-non-null-asserted-optional-chain).
This rule prevents the use of non-null assertions (`!`) immediately after optional chaining expressions (`?.`). Optional chaining is designed to safely handle nullable values by returning `undefined` when the chain encounters `null` or `undefined`. Using a non-null assertion defeats this purpose and can lead to runtime errors.
```ts
// Invalid - non-null assertion after optional chaining
obj?.prop!;
obj?.method()!;
obj?.[key]!;
obj?.prop!;
// Valid - proper optional chaining usage
obj?.prop;
obj?.method();
obj?.prop ?? defaultValue;
obj!.prop?.method();
```
- [#7129](https://github.com/biomejs/biome/pull/7129) [`9f4538a`](https://github.com/biomejs/biome/commit/9f4538ab8bad8a974b8e408641b1fd4770d26c79) Thanks [@drwpow](https://github.com/drwpow)! - Removed option, combobox, listbox roles from [useSemanticElements](https://biomejs.dev/linter/rules/use-semantic-elements/) suggestions
- [#7106](https://github.com/biomejs/biome/pull/7106) [`236deaa`](https://github.com/biomejs/biome/commit/236deaadca077051f6e2ef01cfdbbc55cc1c3d78) Thanks [@arendjr](https://github.com/arendjr)! - Fixed [#6985](https://github.com/biomejs/biome/issues/6985): Inference of return types no longer mistakenly picks up return types of nested functions.
- [#7102](https://github.com/biomejs/biome/pull/7102) [`d3118c6`](https://github.com/biomejs/biome/commit/d3118c6ac3bba0ca29251fa7fc5ba36a9e4456b0) Thanks [@omasakun](https://github.com/omasakun)! - Fixed [#7101](https://github.com/biomejs/biome/issues/7101): [`noUnusedPrivateClassMembers`](https://biomejs.dev/linter/rules/no-unused-private-class-members/) now handles members declared as part of constructor arguments:
1. If a class member defined in a constructor argument is only used within the constructor, it removes the `private` modifier and makes it a plain method argument.
1. If it is not used at all, it will prefix it with an underscore, similar to `noUnusedFunctionParameter`.
- [#7104](https://github.com/biomejs/biome/pull/7104) [`5395297`](https://github.com/biomejs/biome/commit/53952972cd5786cfdcc3deda0c226d6488ef1aee) Thanks [@harxki](https://github.com/harxki)! - Reverting to prevent regressions around ref handling
- [#7143](https://github.com/biomejs/biome/pull/7143) [`1a6933a`](https://github.com/biomejs/biome/commit/1a6933aaf2c5b57d70a60d607b5cab68d532eeb4) Thanks [@siketyan](https://github.com/siketyan)! - Fixed [#6799](https://github.com/biomejs/biome/issues/6799): The [`noImportCycles`](https://biomejs.dev/linter/rules/no-import-cycles/) rule now ignores type-only imports if the new `ignoreTypes` option is enabled (enabled by default).
> [!WARNING]
> **Breaking Change**: The `noImportCycles` rule no longer detects import cycles that include one or more type-only imports by default.
> To keep the old behaviour, you can turn off the `ignoreTypes` option explicitly:
>
> ```json
> {
> "linter": {
> "rules": {
> "nursery": {
> "noImportCycles": {
> "options": {
> "ignoreTypes": false
> }
> }
> }
> }
> }
> }
> ```
- [#7099](https://github.com/biomejs/biome/pull/7099) [`6cc84cb`](https://github.com/biomejs/biome/commit/6cc84cb547480f83119d2cba5542e2d2afc65b4d) Thanks [@arendjr](https://github.com/arendjr)! - Fixed [#7062](https://github.com/biomejs/biome/issues/7062): Biome now correctly considers extended configs when determining the mode for the scanner.
- [#6887](https://github.com/biomejs/biome/pull/6887) [`0cc38f5`](https://github.com/biomejs/biome/commit/0cc38f59cd9ddf0fdcd12d6f8cb3642743cc4406) Thanks [@ptkagori](https://github.com/ptkagori)! - Added the [`useQwikClasslist`](https://biomejs.dev/linter/rules/use-qwik-classlist) rule to Biome.
This rule is intended for use in Qwik applications to encourage the use of the built-in `class` prop (which accepts a string, object, or array) instead of the `classnames` utility library.
**Invalid:**
```jsx
<div class={classnames({ active: true, disabled: false })} />
```
**Valid:**
```jsx
<div classlist={{ active: true, disabled: false }} />
```
- [#7019](https://github.com/biomejs/biome/pull/7019) [`57c15e6`](https://github.com/biomejs/biome/commit/57c15e6df5b6257ffb9f69d7614c3455a1f5c870) Thanks [@fireairforce](https://github.com/fireairforce)! - Added support in the JS parser for `import source`(a [stage3 proposal](https://github.com/tc39/proposal-source-phase-imports)). The syntax looks like:
```ts
import source foo from "<specifier>";
```
- [#7053](https://github.com/biomejs/biome/pull/7053) [`655049e`](https://github.com/biomejs/biome/commit/655049e9e38f536b33fff6d7b160299f0b446908) Thanks [@jakeleventhal](https://github.com/jakeleventhal)! - Added the [`useConsistentTypeDefinitions`](https://biomejs.dev/rules/use-consistent-type-definitions) rule.
This rule enforces consistent usage of either `interface` or `type` for object type definitions in TypeScript.
The rule accepts an option to specify the preferred style:
- `interface` (default): Prefer using `interface` for object type definitions
- `type`: Prefer using `type` for object type definitions
Examples:
```ts
// With default option (interface)
// โ Invalid
type Point = { x: number; y: number };
// โ
Valid
interface Point {
x: number;
y: number;
}
// With option { style: "type" }
// โ Invalid
interface Point {
x: number;
y: number;
}
// โ
Valid
type Point = { x: number; y: number };
```
The rule will automatically fix simple cases where conversion is straightforward.
## What's Changed
* ci: use faster runners on Windows by @ematipico in https://github.com/biomejs/biome/pull/7041
* chore: use own semver parser by @ematipico in https://github.com/biomejs/biome/pull/7061
* docs(analyze): about "Services" by @dyc3 in https://github.com/biomejs/biome/pull/7058
* feat(parse/tailwind): start implementing lexer/parser by @dyc3 in https://github.com/biomejs/biome/pull/6986
* feat(qwik): add few new lint rules by @ptkagori in https://github.com/biomejs/biome/pull/6887
* chore: add Claude sub-agents by @ematipico in https://github.com/biomejs/biome/pull/7066
* feat(format/html): implement suppression comments by @dyc3 in https://github.com/biomejs/biome/pull/5356
* feat: add tailwind domain by @dyc3 in https://github.com/biomejs/biome/pull/6972
* chore(lint): add version to the released rules by @siketyan in https://github.com/biomejs/biome/pull/7087
* chore(deps): update rust:1.88.0 docker digest to af306cf by @renovate[bot] in https://github.com/biomejs/biome/pull/7042
* chore(deps): update rust crate serde_json to 1.0.142 by @renovate[bot] in https://github.com/biomejs/biome/pull/7089
* chore(deps): update @biomejs packages by @renovate[bot] in https://github.com/biomejs/biome/pull/7091
* chore(deps): update dependency @types/node to v22.17.0 by @renovate[bot] in https://github.com/biomejs/biome/pull/7092
* chore(deps): update dependency eslint to v9.32.0 by @renovate[bot] in https://github.com/biomejs/biome/pull/7093
* chore(deps): update github-actions by @renovate[bot] in https://github.com/biomejs/biome/pull/7094
* chore(deps): update rust crate tokio to 1.47.1 by @renovate[bot] in https://github.com/biomejs/biome/pull/7096
* feat(analyze/js): added rule for `@typescript-eslint/consistent-type-definitions` by @jakeleventhal in https://github.com/biomejs/biome/pull/7053
* fix(core): consider extended configs for scan kind by @arendjr in https://github.com/biomejs/biome/pull/7099
* feat(analyse/js): add `noNonNullAssertedOptionalChain` rule by @Jayllyz in https://github.com/biomejs/biome/pull/7100
* fix(core): return type inference no longer picks up nested returns by @arendjr in https://github.com/biomejs/biome/pull/7106
* fix(lint/noUnusedPrivateClassMembers): improve member usage check by @omasakun in https://github.com/biomejs/biome/pull/7103
* fix(lint/noUnusedPrivateClassMembers): handle class members declared in constructor parameters correctly by @omasakun in https://github.com/biomejs/biome/pull/7102
* chore: setup autofix.ci workflow by @arendjr in https://github.com/biomejs/biome/pull/7113
* revert: "fix(lint/noUnassignedVariables): handle JSX ref attribute assโฆ by @harxki in https://github.com/biomejs/biome/pull/7104
* feat(lint): rule `noUnnecessaryConditions` by @ematipico in https://github.com/biomejs/biome/pull/7084
* chore: add CodeRabbit config by @arendjr in https://github.com/biomejs/biome/pull/7114
* ci: use faster runners on depot by @siketyan in https://github.com/biomejs/biome/pull/7115
* feat(parser): support import source by @fireairforce in https://github.com/biomejs/biome/pull/7019
* chore: apply CodeRabbit nits by @arendjr in https://github.com/biomejs/biome/pull/7116
* fix(core): resolve aliased imports by @arendjr in https://github.com/biomejs/biome/pull/7121
* fix: remove option, combobox, listbox from semantic element suggestions by @drwpow in https://github.com/biomejs/biome/pull/7129
* feat(analyze/js): add noVueDataObjectDeclaration by @amousa11 in https://github.com/biomejs/biome/pull/6574
* feat(lint): add ignoreTypes option to the noImportCycles rule by @siketyan in https://github.com/biomejs/biome/pull/7143
* ci: release by @github-actions[bot] in https://github.com/biomejs/biome/pull/7069
## New Contributors
* @jakeleventhal made their first contribution in https://github.com/biomejs/biome/pull/7053
* @omasakun made their first contribution in https://github.com/biomejs/biome/pull/7103
* @amousa11 made their first contribution in https://github.com/biomejs/biome/pull/6574
**Full Changelog**: https://github.com/biomejs/biome/compare/@biomejs/[email protected]...@biomejs/[email protected]