Biome 2.5 Ships with `@biomejs/js-api` v6.0.0: A Major Bump for the JS API

Biome 2.5 Ships with `@biomejs/js-api` v6.0.0: A Major Bump for the JS API

lschvn

Biome shipped two coordinated releases on June 12, 2026: Biome CLI v2.5.0 and @biomejs/js-api v6.0.0. The headline is the JavaScript API's first major version bump since the project split the WASM packages from the CLI. The CLI bump is mostly a WASM sync, with a long list of small features on top.

The js-api v6.0.0 headline

The major bump is centered on a single new export: spanInBytesToSpanInCodeUnits(diagnostic.location.span, content). Biome's diagnostics carry UTF-8 byte offsets because that is how the analyzer indexes source internally. JavaScript strings are UTF-16, so any code that took a Biome diagnostic and called content.slice(spanStart, spanEnd) on the original string would get the wrong text on any non-ASCII content: emoji, accented characters, CJK. The slice boundary would land in the middle of a code unit, return undefined for the trailing surrogate, and silently corrupt the extracted snippet.

The new helper converts byte-based spans to UTF-16 code unit spans, including the surrogate pair and unpaired surrogate edge cases. It is the kind of fix that warrants a major version bump on its own, and Biome used the opportunity to version-bump the WASM packages: @biomejs/wasm-web, @biomejs/wasm-bundler, and @biomejs/wasm-nodejs all pin to 2.5.0 to match the CLI.

SCSS, JSON, linter, and CLI

The 2.5.0 release covers a long list of incremental features. On the parser side, SCSS support is meaningfully expanded: qualified names in values and function calls, unary expression parsing, nested declarations in declaration lists, declarations in @page blocks, and delimiters in bracketed value lists. JSON gets a new useSortedPackageJson rule. The linter picks up two new cross-language rules, a new includes option for plugin file scoping, an ignore option for no-unused-variables, and a noUndeclaredClasses change that now collects both local and global styles. organizeImports adds a sortBareImports option.

The CLI gets an ANSI art Biome logo on startup and a new concise reporter. biome_service gains support for applying GritQL plugin rewrites through the standard --write flag, which is the missing piece for shipping a custom refactor rule that runs through the same pipeline as the linter and formatter.

The HTML analyzer continues to grow. As of 2.5, it includes noRedundantRoles, useKeyWithMouseEvents, and useAriaActivedescendantWithTabindex (the noRedundantRoles port was reverted and re-landed after a follow-up fix, which is why the changelog shows it twice).

Why the major bump matters

For users consuming Biome as a CLI or through editor integrations, 2.5.0 is a routine upgrade. The interesting story is for projects that embed @biomejs/js-api directly: the helper is the first piece of a wider effort to make the API safe to use on non-ASCII source code, and the major version bump signals that the project is treating the public surface as a stable contract.

That positioning puts Biome closer to where Oxc sits with the Rust toolchain: a Rust-backed JavaScript toolchain with a programmatic API for embedding. The two projects take different positions on the spectrum (Biome bundles a linter, formatter, and import organizer in one binary, while Oxc splits those into separate crates), but both are now mature enough that programmatic embedding is a first-class use case. For teams that ran the previous API through a UTF-8-to-UTF-16 conversion workaround, 6.0.0 is the upgrade that makes the workaround unnecessary.

Frequently Asked Questions

Related articles

More coverage with overlapping topics and tags.

Prettier 3.9 Overhauls Five Parsers: micromark for Markdown, yaml v2, GraphQL.js v17, a Rust-Based Flow Parser, and Angular
tooling

Prettier 3.9 Overhauls Five Parsers: micromark for Markdown, yaml v2, GraphQL.js v17, a Rust-Based Flow Parser, and Angular

Prettier 3.9.0, released June 27, 2026 (prettier/prettier, blog post by Fisker Cheung), is a parser-heavy release that upgrades Markdown from remark-parse v8 to micromark v4 (better CommonMark and GFM compliance and a stack of long-standing bug fixes), YAML to yaml v2, GraphQL to GraphQL.js v17 (fragment arguments and directives on directive definitions), Flow to the Flow team's new Rust-based oxidized parser (roughly 37% faster on Prettier's valid Flow fixtures and 43% faster on flow_parser.js in local parser-only benchmarks), and Angular. The JavaScript and TypeScript printer is reworked too, particularly in --no-semi mode where comments around break and continue are now stable across repeated formats (an idempotency fix), plus redundant parenthesis removal in return statements, embedded-template interpolation alignment, and logical-not inlining. The release drops the legacy import ... assert {} syntax (Babel 8 removed the parser plugin; migrate to with), fixes a silently broken --cache-strategy content option, and stops EditorConfig files above Git worktrees from leaking in. The team reiterates pinning the exact version in package.json because the formatting changes will produce diffs.
Vite+: One CLI to Rule Them All, Or Just Another Layer of Hype?
tooling

Vite+: One CLI to Rule Them All, Or Just Another Layer of Hype?

VoidZero's Vite+ promises to unify runtime, package manager, bundler, linter, formatter, and test runner under a single command. We read the announcements, benchmarked the claims, and talked to people using it in production. Here is what we found.
Turborepo 2.10.3 Recognizes nub and aube, Two New Rust-Based Node.js Package Managers From Colin McDonnell (Zod) and Jeff Dickey (mise)
tooling

Turborepo 2.10.3 Recognizes nub and aube, Two New Rust-Based Node.js Package Managers From Colin McDonnell (Zod) and Jeff Dickey (mise)

Turborepo [v2.10.3](https://github.com/vercel/turborepo/releases/tag/v2.10.3) shipped on 2026-07-03 with first-class support for [nub](https://github.com/nubjs/nub) and [aube](https://github.com/jdx/aube), two Rust-based Node.js package managers that emerged in spring and summer 2026. nub is authored by Colin McDonnell (creator of [Zod](https://github.com/colinhacks/zod), 43k stars) and aube by Jeff Dickey (creator of [mise](https://github.com/jdx/mise)); both integrate with Turborepo as `packageManager` values in `package.json` and `devEngines.packageManager`. The release also lands a new TUI/streamed-logs toggle, click-to-select tasks in the TUI task list, auto-copy of TUI selections to clipboard on mouse release, a `--production` flag on `turbo prune`, TypeScript 7.0.1-rc as the workspace toolchain, thin LTO + `codegen-units=1` for release builds, and a long list of cache-hashing perf fixes. The headline signal: two of the JS toolchain's most respected builders are now shipping package managers that ride on stock Node instead of replacing it, and Turborepo is the first mainstream monorepo tool to formalize both.

Comments

Log in Log in to join the conversation.

No comments yet. Be the first to share your thoughts.