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

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

lschvn

Prettier 3.9.0, released June 27, 2026 in a 37-minute blog post by Fisker Cheung, is unusual for a Prettier release: the headline is not a new config option or a speedier CLI, it is five parser upgrades landing at once. Markdown, YAML, GraphQL, Flow, and Angular all move to newer upstream parsers, and the JavaScript and TypeScript printer gets a rework that will show up as a diff in most repos. If you treat Prettier output as stable, 3.9 is a release to land deliberately and pin the exact version.

Five parsers, one release

The Markdown change is the one most users will feel. Prettier's Markdown parser moves from the outdated remark-parse v8 to micromark v4, the modern CommonMark parser. The release notes frame this as "significantly enhanced CommonMark and GFM compliance" plus "numerous long-standing parsing bugs" resolved, and it lays a cleaner foundation for future work. There is one caveat: the MDX parser migration is not yet complete, and the team is asking for contributors familiar with the unified and micromark ecosystem to finish it.

YAML moves to yaml v2, which fixes many long-standing parse issues, with thanks to ota-meshi's work on yaml-unist-parser. GraphQL moves to GraphQL.js v17, which adds support for newer syntax: fragment arguments (...dynamicProfilePic(size: $size)) and directives on directive definitions and extend directive, both of which errored or misparsed on 3.8.

The Flow upgrade is the performance story. Prettier now uses the new Rust-based (oxidized) Flow parser released by the Flow team. In Prettier's local parser-only benchmarks, the new parser formatted Prettier's valid Flow fixtures in a 266.4ms median versus 422.6ms for the old parser, and parsed flow_parser.js in 1298.0ms versus 2269.6ms. That is roughly 37% and 43% faster, and it is the same Rust-native-frontend direction the project has explored through its OXC and Hermes plugins and that the wider ecosystem has been taking with Oxc and SWC.

The JavaScript and TypeScript printer changed

The parser upgrades are half the release; the other half is a batch of printer changes that will produce a diff. The most notable is a long-standing --no-semi idempotency bug. On 3.8, a break or continue followed by a line comment produced different output on the first and second format, so running Prettier twice could keep changing the file. On 3.9, the comment handling around break and continue is stable across formats.

A short list of the other printer changes:

  • Redundant parentheses removed in return statements, so return (a, b) is no longer rewritten to return ((a, b)).
  • Embedded-template interpolations realigned in tagged templates, avoiding unexpected line breaks and fixing alignment in CSS-in-template-literal blocks.
  • Logical-not inlining: !(...) in if/while/do..while conditions is inlined to reduce diff when a condition flips to its negated form, fixing a real-world double-paren case inside the Prettier codebase itself.
  • JSDoc trailing double spaces preserved, because some tooling treats them as meaningful.
  • Comment placement around empty call argument lists and parenthesized callees is corrected.

None of this is a config change, but together they mean a prettier --write . after upgrading will reformat files.

The one real breaking change: import assertions

The release drops support for the legacy import ... assert {} syntax:

- import foo from "./foo.json" assert { type: "json" };
+ import foo from "./foo.json" with { type: "json" };

The reason is upstream: Babel 8 completely removed support for the legacy assert keyword (the old parser plugin is gone), and without Babel parser support Prettier can no longer reliably parse or format that syntax. The current standard is the with keyword from the import attributes proposal. If your codebase still uses assert, migrate before upgrading; Prettier links to its disclaimer about non-standard syntax for context.

CLI fixes worth knowing

A few CLI fixes round out the release. --cache-strategy content was silently broken: file-entry-cache v11 renamed the useChecksum option to useCheckSum (capital S), and Prettier was still passing the old casing, so content-based cache comparison was disabled and only file size was compared. That is now fixed, so content-based caching actually works again.

Prettier also stops searching for EditorConfig files above Git worktrees: a .git file (used in worktrees and submodules) is now treated as a project root marker alongside a .git directory, so an EditorConfig from a parent directory no longer leaks into worktree formatting. Two crash fixes handle directory and file names with special characters (bracketed names like username[repo-name], and leading quotes), and the experimental CLI sees updates.

What to watch

The practical advice is straightforward: pin the exact version. The release notes repeat the standing recommendation to use "prettier": "3.9.0" rather than ^3.9.0, because the Markdown, YAML, GraphQL, and JS/TS changes all produce output diffs, and a caret range can pull a new minor that reformats a whole project on a fresh install. If you use @prettier/plugin-oxc or @prettier/plugin-hermes, upgrade them at the same time so the new formatting rules apply.

Two things to test before committing the upgrade: any Markdown or MDX documentation (the micromark switch is the broadest change), and any Flow-typed or GraphQL-heavy code. The MDX migration is still open, so MDX output in particular is worth a careful diff. The full changelog is on the compare view, and 3.9.1 followed on the same day with follow-up fixes.

Frequently Asked Questions

Cline 4.0 Migrates the VS Code Extension Onto the Shared Cline SDK, Adds ClinePass, a Customize Marketplace, Plugins, and Queued Prompts

Cline shipped v4.0.0 on June 26, 2026 (github.com/cline/cline), a major version that migrates the VS Code extension from its legacy standalone task implementation onto the shared Cline SDK, the same TypeScript engine that runs the Cline CLI, Kanban, and JetBrains plugin. The release adds ClinePass (built-in onboarding, provider selection, subscription handoff, and entitlement handling), a Customize marketplace for Skills, MCP servers, and the new Cline Plugins, queued prompts, edit-and-regenerate, a provider and model configuration rework around providers.json and a shared model catalog (Fireworks GLM 5.2, Kimi K2.6 Fast, Kimi K2.7 Code, Qwen 3.7 Plus, MiniMax M3, SAP AI Core, LiteLLM, Codex OAuth), command auto-approval disabled by default, and an extension build and package workflow moved to Bun. Subagents are temporarily disabled in the extension while the SDK-backed experience stabilizes.

Cline 4.0.1 Rolls Back the SDK Migration After 4.0.0 Regressions; 4.0.2 Brings the SDK Code Back with Reasoning Effort and ClinePass Fixes

Cline shipped v4.0.1 on June 28, 2026 and v4.0.2 on June 29, 2026 (github.com/cline/cline), a two-step recovery cycle for the v4.0.0 SDK migration that landed on June 26. v4.0.1 ships the pre-SDK 3.89.x VS Code extension under a 4.0.1 version number, built from a dedicated `legacy-extension` branch via a new `ext-vscode-publish-legacy.yml` workflow, to resolve regressions reported in 4.0.0 (broken diff previews in the editor, run_commands errors during file edits, broken file-editing flow with GLM 5.2 and MiniMax M3 through Ollama). v4.0.2 restores the SDK-backed code path on top of the same legacy branch, adding reasoning effort support (including `xhigh`) for DeepSeek thinking models (#11938), a centralized reasoning effort control layer for ClinePass (#11954), canonical Z.ai model ids (#11951), webview env replacement fix (#11955), ClinePass and Z.ai metadata polish (#11958), and a default focus chain settings fix (#11960). CLI v3.0.32 ships the same day with SDK v0.0.54 context-compaction improvements and ClinePass onboarding polish. The release sequence shows a project recovering a major migration in 72 hours by tagging the legacy branch forward rather than reverting the SDK work.

Related articles

More coverage with overlapping topics and tags.

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

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

Biome's CLI hits 2.5.0 and the JavaScript API moves to a major v6.0.0. The headline is a new spanInBytesToSpanInCodeUnits helper that fixes a real bug in non-ASCII text extraction, plus a long list of SCSS, JSON, linter, and CLI improvements.
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.