Skip to content

fix: avoid O(N^2) rendering of high-volume diagnostics (#9748)#9749

Merged
IWANABETHATGUY merged 6 commits into
mainfrom
06-15-fix_9748
Jun 16, 2026
Merged

fix: avoid O(N^2) rendering of high-volume diagnostics (#9748)#9749
IWANABETHATGUY merged 6 commits into
mainfrom
06-15-fix_9748

Conversation

@IWANABETHATGUY

@IWANABETHATGUY IWANABETHATGUY commented Jun 15, 2026

Copy link
Copy Markdown
Member

Fixes #9748.

Problem

Emitting a high volume of warnings in one large module made the build appear to hang. Rendering was O(N^2) for two independent reasons, both paid once per diagnostic:

  1. The ariadne Source (its rope + full line index) was rebuilt for the whole file on every diagnostic.
  2. is_context_too_long built a whole-file ropey::Rope on every call, even though only the ~300 chars around the span matter.

With tens of thousands of warnings pointing into the same file, this quadratic work is what actually stalled the build.

Fix

  • Add Diagnostic::render_batch, which builds the per-source ariadne Source cache and a per-source LineTable once and shares them across all diagnostics. Line lookup is O(log lines) per diagnostic; the UTF-16 column is read by scanning only the matched line.
  • Replace the per-call ropey::Rope in is_context_too_long with direct string slicing of the prefix/postfix around the span, removing the ropey dependency entirely.
  • Dispatch warning callbacks sequentially in both the binding (handle_warnings) and the watcher (emit_warnings), awaiting each before the next. A handler may throw from onwarn/onLog to abort the build, so calls must stop at the first failure without racing later in-flight callbacks. The expensive part of [Bug]: Build deadlocks (promise never resolves) when emitting a very high volume of warnings #9748 was the per-warning re-render, not the JS round-trip, so this does not reintroduce the hang.

Residual cost (documented, not a regression)

ariadne still prints the entire labelled line for every diagnostic, so N diagnostics all landing on one very long line (e.g. a minified bundle) cost O(N * line_len) inside ariadne itself. That is bounded by the same per-line cost and is unrelated to the cross-diagnostic O(N^2) blow-up this PR removes.

Tests

  • delivers every warning when a build emits a high volume of them — 20k EVAL warnings complete quickly and every warning is delivered exactly once.
  • throwing from a warning handler aborts before invoking later handlers — guards the sequential-dispatch / throw-to-abort contract.
  • A LineTable unit test validates line/column/UTF-16 offset math against an independent linear reference across multi-byte, astral, and trailing-newline edge cases.

Note

Will consolidate the existing byte locator in #9762

Copy link
Copy Markdown
Member Author

How to use the Graphite Merge Queue

Add the label graphite: merge-when-ready to this PR to add it to the merge queue.

You must have a Graphite account in order to use the merge queue. Sign up using this link.

An organization admin has enabled the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

This stack of pull requests is managed by Graphite. Learn more about stacking.

@netlify

netlify Bot commented Jun 15, 2026

Copy link
Copy Markdown

Deploy Preview for rolldown-rs canceled.

Name Link
🔨 Latest commit 39478eb
🔍 Latest deploy log https://app.netlify.com/projects/rolldown-rs/deploys/6a311b583b82780008d6ed8d

@pkg-pr-new

pkg-pr-new Bot commented Jun 15, 2026

Copy link
Copy Markdown

Open in StackBlitz

@rolldown/browser

pnpm add https://pkg.pr.new/rolldown/rolldown/@rolldown/browser@9749 -D
npm i https://pkg.pr.new/rolldown/rolldown/@rolldown/browser@9749 -D
yarn add https://pkg.pr.new/rolldown/rolldown/@rolldown/browser@9749.tgz -D

@rolldown/debug

pnpm add https://pkg.pr.new/rolldown/rolldown/@rolldown/debug@9749 -D
npm i https://pkg.pr.new/rolldown/rolldown/@rolldown/debug@9749 -D
yarn add https://pkg.pr.new/rolldown/rolldown/@rolldown/debug@9749.tgz -D

rolldown

pnpm add https://pkg.pr.new/rolldown/rolldown@9749 -D
npm i https://pkg.pr.new/rolldown/rolldown@9749 -D
yarn add https://pkg.pr.new/rolldown/rolldown@9749.tgz -D

@rolldown/binding-android-arm64

pnpm add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-android-arm64@9749 -D
npm i https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-android-arm64@9749 -D
yarn add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-android-arm64@9749.tgz -D

@rolldown/binding-darwin-arm64

pnpm add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@9749 -D
npm i https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@9749 -D
yarn add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@9749.tgz -D

@rolldown/binding-darwin-x64

pnpm add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@9749 -D
npm i https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@9749 -D
yarn add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@9749.tgz -D

@rolldown/binding-freebsd-x64

pnpm add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@9749 -D
npm i https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@9749 -D
yarn add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@9749.tgz -D

@rolldown/binding-linux-arm-gnueabihf

pnpm add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@9749 -D
npm i https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@9749 -D
yarn add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@9749.tgz -D

@rolldown/binding-linux-arm64-gnu

pnpm add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@9749 -D
npm i https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@9749 -D
yarn add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@9749.tgz -D

@rolldown/binding-linux-arm64-musl

pnpm add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@9749 -D
npm i https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@9749 -D
yarn add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@9749.tgz -D

@rolldown/binding-linux-ppc64-gnu

pnpm add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-ppc64-gnu@9749 -D
npm i https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-ppc64-gnu@9749 -D
yarn add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-ppc64-gnu@9749.tgz -D

@rolldown/binding-linux-s390x-gnu

pnpm add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-s390x-gnu@9749 -D
npm i https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-s390x-gnu@9749 -D
yarn add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-s390x-gnu@9749.tgz -D

@rolldown/binding-linux-x64-gnu

pnpm add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@9749 -D
npm i https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@9749 -D
yarn add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@9749.tgz -D

@rolldown/binding-linux-x64-musl

pnpm add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@9749 -D
npm i https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@9749 -D
yarn add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@9749.tgz -D

@rolldown/binding-openharmony-arm64

pnpm add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-openharmony-arm64@9749 -D
npm i https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-openharmony-arm64@9749 -D
yarn add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-openharmony-arm64@9749.tgz -D

@rolldown/binding-wasm32-wasi

pnpm add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@9749 -D
npm i https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@9749 -D
yarn add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@9749.tgz -D

@rolldown/binding-win32-arm64-msvc

pnpm add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@9749 -D
npm i https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@9749 -D
yarn add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@9749.tgz -D

@rolldown/binding-win32-x64-msvc

pnpm add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@9749 -D
npm i https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@9749 -D
yarn add https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@9749.tgz -D

commit: 3d19ba2

@IWANABETHATGUY IWANABETHATGUY changed the title fix: 9748 fix: avoid O(N^2) rendering of high-volume diagnostics (#9748) Jun 16, 2026
@IWANABETHATGUY IWANABETHATGUY marked this pull request as ready for review June 16, 2026 07:34
@IWANABETHATGUY IWANABETHATGUY requested a review from Copilot June 16, 2026 07:34
@IWANABETHATGUY

Copy link
Copy Markdown
Member Author

This has been verified to solve the issue #9748 (comment)

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR addresses #9748 by eliminating quadratic-time diagnostic rendering when many warnings reference the same large source, primarily by batching rendering work per source and removing whole-file rope construction from context-length checks.

Changes:

  • Add Diagnostic::render_batch plus a per-source LineTable cache to share ariadne Source/line-index work across many diagnostics.
  • Replace ropey-based whole-file processing in is_context_too_long with direct string slicing and drop the ropey dependency.
  • Add high-volume warning regression tests and update warning emission paths to use the batch renderer.

Reviewed changes

Copilot reviewed 8 out of 9 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
packages/rolldown/tests/behaviors/many-warnings.test.ts Adds regression tests for high-volume warning delivery and abort-on-throw behavior.
crates/rolldown_watcher/src/watch_task.rs Uses batched diagnostic rendering to avoid per-warning per-file ariadne rebuilds in watcher warning emission.
crates/rolldown_error/src/utils/is_context_too_long.rs Removes per-call ropey::Rope construction by slicing the relevant source prefix/postfix directly.
crates/rolldown_error/src/lib.rs Re-exports new diagnostic rendering/location types for downstream use.
crates/rolldown_error/src/build_diagnostic/diagnostic.rs Introduces render_batch, cached ariadne source rendering, and LineTable + tests for UTF-16 location math.
crates/rolldown_error/Cargo.toml Removes ropey dependency from rolldown_error.
crates/rolldown_binding/src/utils/mod.rs Switches binding warning logging to batched rendering to avoid O(N²) re-rendering.
Cargo.toml Removes workspace-level ropey dependency entry.
Cargo.lock Removes ropey from the lockfile dependency graph.

Comment thread packages/rolldown/tests/behaviors/many-warnings.test.ts
@codspeed-hq

codspeed-hq Bot commented Jun 16, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 4 untouched benchmarks
⏩ 10 skipped benchmarks1


Comparing 06-15-fix_9748 (39478eb) with main (eb2dc1f)

Open in CodSpeed

Footnotes

  1. 10 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@IWANABETHATGUY

Copy link
Copy Markdown
Member Author

@codspeedbot explain why this is faster

IWANABETHATGUY and others added 6 commits June 16, 2026 17:45
Emitting many warnings was O(N^2): for every diagnostic rolldown re-scanned
the source from offset 0 to locate its span, rebuilt the ariadne `Source`
(line index) for the whole file, and `is_context_too_long` built a whole-file
rope -- all repeated per warning. With tens of thousands of warnings in one
large module this made the build appear to hang (#9748).

Share the per-source work across all diagnostics instead:

- add `Diagnostic::render_batch`, which builds one line table and one ariadne
  source cache per file and reuses them for every diagnostic (O(N log N));
- map a byte offset to line/column via a binary-searched line table rather
  than scanning from the start of the file;
- slice the `&str` directly in `is_context_too_long` instead of building a
  ropey rope just to inspect ~300 chars around the span.

Route the warning emitters in the napi binding and the watcher through the
batch API; warning emission also keeps the bounded-concurrency napi pipelining.

Diagnostic output is byte-for-byte unchanged (full `test:main` snapshot suite
passes). Measured in release: 20k warnings ~17.9s -> ~0.2s, 5k ~0.9s -> ~0.09s.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Address review feedback on the high-volume diagnostics fix:

- Dispatch warning callbacks sequentially in both the binding and the
  watcher instead of pipelining with bounded concurrency. A handler may
  `throw` from onwarn/onLog to abort the build, so calls must stop at the
  first failure without racing later in-flight callbacks. The per-warning
  re-render was the actual O(N^2) cost, not the JS round-trip, so awaiting
  one call at a time does not reintroduce the hang.
- Make the binding and watcher dispatch paths consistent (both ordered).
- Drop the oversold "O(N log N)" wording: the cross-diagnostic blow-up is
  removed, but a single very long line still costs O(N * line_len) inside
  ariadne, which is documented explicitly.
- Revert the utf16-deficit column optimization back to a simple linear
  within-line scan, bounded by that same per-line ariadne cost.
- Add a regression test asserting a throwing handler aborts before later
  handlers run, plus a LineTable unit test against an independent reference.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Trim the fixture list from seven cases to three, each annotated with the
path it exercises (empty/single-entry table + clamp, multi-line
binary-search lookup, astral+accent cumulative utf16 table). The dropped
cases duplicated those paths. The independent reference oracle and the
full char-boundary sweep are unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add try-finally so the bundle is closed even when onwarn throws, avoiding
potential native resource leaks across tests. Mirrors the pattern in other
rejection-path tests (e.g. dev-mode-validation.test.ts).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@IWANABETHATGUY IWANABETHATGUY enabled auto-merge (squash) June 16, 2026 09:46
@IWANABETHATGUY IWANABETHATGUY merged commit 697a7c4 into main Jun 16, 2026
33 checks passed
@IWANABETHATGUY IWANABETHATGUY deleted the 06-15-fix_9748 branch June 16, 2026 09:50
IWANABETHATGUY added a commit that referenced this pull request Jun 16, 2026
…9762)

Stacked on #9749.

Follow-up requested in review: the previous commit added a private
`LineTable` to map a diagnostic span's byte offset to `(line, utf-16
column, utf-16 position)`. That duplicated the existing `ByteLocator` in
this crate, which already builds the per-line byte-offset index for the
reverse (line/column -> byte) lookup.

This PR:
- extends `ByteLocator` with `locate_utf16` -- a binary search over the
line starts plus a parallel utf-16 line-start table;
- uses it from `Diagnostic::render_batch` and removes `LineTable`;
- adds a unit test covering the forward lookup for ASCII and
surrogate-pair sources.

Behavior is unchanged: the full `test:main` suite passes with no
snapshot changes, and `cargo test -p rolldown_error locator` passes.
This was referenced Jun 18, 2026
shulaoda added a commit that referenced this pull request Jun 18, 2026
## [1.1.2] - 2026-06-18

### 📝 Notable tsconfig behavior changes

These ship via the `oxc_resolver` 11.21.3 bump (#9841) and affect `resolve.tsconfigPaths` (Vite 8 resolves through oxc-resolver):

- **Honor explicit non-TS extensions in `include`** (oxc-project/oxc-resolver#1213). `compilerOptions.paths` now resolve for importers whose extension is explicitly listed in a tsconfig's `include` (e.g. `src/**/*.vue`, `src/**/*.svelte`). Previously oxc-resolver filtered importers by extension before evaluating the `include` globs, so a `.vue`/`.svelte` file listed in `include` never matched its project and its `paths` were skipped. This unblocks the default create-vite Vue + TS layout (a solution-style root plus a referenced `tsconfig.app.json` that declares `paths` and `include: ["src/**/*.ts", "src/**/*.vue"]`). Matches vue-tsc and svelte-check, which register these extensions via TypeScript's `extraFileExtensions`.
- **No fallback to the outermost tsconfig in auto-discovery** (oxc-project/oxc-resolver#1220). Auto-discovery no longer attaches the topmost ancestor `tsconfig.json` to a file that no project actually owns (via `files` / `include` / project references). Previously such a file inherited the outermost ancestor's `paths` / `baseUrl`, leaking aliases into files that project does not own. oxc-resolver now returns no config in that case, matching tsserver / typescript-go, which route such files to an inferred project with no aliases.

### 🚀 Features

- add option named for invalid return type errors for more places (#9846) by @shulaoda
- add option names for invalid return type errors (#9821) by @sapphi-red
- transform: infer decorator strictNullChecks from tsconfig (#9590) by @kylecannon
- expose React Compiler options for rolldown and Vite users (#9801) by @Boshen
- tracing: gate chrome-json trace layer behind `chrome-tracing` feature (#9773) by @hyf0
- dev: align test-dev-server with Vite dev server (#9668) by @h-a-n-a

### 🐛 Bug Fixes

- plugin_timings: point doc link to existing checks reference page (#9837) by @hyf0
- generator: correct contradictory panic message in cjs cross-chunk symbol lookup (#9836) by @hyf0
- esm: preserve with clause on export * from external (#9796) by @hyf0
- Make external_import_binding_merger deterministic (#9755) by @naruaway
- surface invalid `manualCodeSplitting` group `test` regex as an error (#9792) by @shulaoda
- avoid panic on `output.file` without a file name (#9789) by @shulaoda
- avoid O(N^2) rendering of high-volume diagnostics (#9748) (#9749) by @IWANABETHATGUY
- avoid panic on JSON numbers outside f64 range (#9788) by @shulaoda
- deps: bump mimalloc-safe to 0.1.63 to fix worker_threads segfault (#9785) by @shulaoda
- cache ESM evaluation errors (#9784) by @sapphi-red
- wrap node require helper in pure IIFE (#9783) by @kb019
- lazy-barrel: load locally-used imports on a re-exported record (#9757) by @shulaoda
- avoid dangling wrapped-ESM init call across chunks (#9502) (#9717) by @IWANABETHATGUY
- dev: detect same-second rewrites in CI poll watcher (#9736) by @h-a-n-a
- dev: force rebuild after HMR errors (#9686) by @h-a-n-a
- dev: print build errors on browser refresh after a failed build (#9652) by @h-a-n-a

### 🚜 Refactor

- single-source the chunk $N symbol-naming algorithm (#9831) by @Dunqing
- simplify common_dir helper (#9857) by @IWANABETHATGUY
- drop commondir crate in favor of in-house helper (#9849) by @Boshen
- binding: extract helpers from normalize_binding_options (#9842) by @Boshen
- move rolldown_filter_analyzer to tasks and scope oxc cfg feature (#9839) by @Boshen
- options: merge manualCodeSplitting into codeSplitting object form (#9805) by @IWANABETHATGUY
- options: support codeSplitting object form in CodeSplittingMode (#9804) by @IWANABETHATGUY
- diagnostic: reuse ByteLocator for per-source line lookup (#9762) by @IWANABETHATGUY
- remove redundant Arc around tracing spans (#9778) by @camc314
- remove unnecessary `Arc` around sourcemap sender (#9777) by @camc314
- rolldown_plugin_vite_wasm_fallback: remove the plugin (#9775) by @sapphi-red
- binding: remove infer-able `napi(ts_type)` (#9737) by @sapphi-red
- remove preprocessor span dedup (#9734) by @hyf0
- identify AST nodes by NodeId instead of Span/Address (#9609) by @IWANABETHATGUY

### 📚 Documentation

- tsconfig: align auto-discovery docs with oxc-resolver behavior (#9845) by @shulaoda
- relocate meta/design to internal-docs, split design from implementation (#9826) by @h-a-n-a
- meta: add options normalization design doc (#9818) by @IWANABETHATGUY
- document why the napi tracing feature is enabled (#9766) by @Boshen
- dev: move test-dev-server test guidance into the testing docs (#9809) by @h-a-n-a

### ⚡ Performance

- drop unused regex unicode property tables from the binding (#9848) by @Boshen
- drop urlencoding crate in favor of percent-encoding (#9851) by @Boshen
- drop owo-colors supports-colors feature in vite reporter (#9824) by @Boshen
- skip enum member value extraction for non-TypeScript modules (#9840) by @shulaoda
- rolldown: use unstable sort for itertools sorted_by at unique-key sites (#9827) by @Boshen
- cheaper deterministic ordering in external import binding merger (#9810) by @IWANABETHATGUY
- disable idna's ICU backend by pinning idna_adapter to 1.0.0 (-129 KB) (#9811) by @Boshen
- size: use unstable sort where stability is unneeded (#9803) by @Boshen
- remove num-format dependency from vite reporter (#9795) by @Boshen
- reduce js callback error size (#9776) by @Boshen
- rolldown_error: remove Debug supertrait from BuildEvent (#9798) by @Boshen
- reduce plugin hook order code size (#9761) by @Boshen
- deps: disable `infer` default features to reduce binary size (#9765) by @Boshen
- reduce pluginable monomorphization size (#9771) by @Boshen
- avoid rebuilding replace plugin values (#9764) by @Boshen
- defer link-stage-output drop to rayon workers after output is produced (#9733) by @Brooooooklyn
- tree-shaking: hoist already-included guard to call sites in inclusion DFS (#9738) by @Brooooooklyn
- renamer: dedup before allocating the owned name in add_symbol_in_root_scope (#9740) by @Brooooooklyn

### 🧪 Testing

- allocs: track allocation counts for rolldown_sourcemap (#9835) by @hyf0
- bench: add CodSpeed micro-benchmarks for rolldown_sourcemap (#9834) by @hyf0
- add cjs named export mutation test (#9823) by @sapphi-red
- dev: restore shared-page reliability conventions in AGENTS.md (#9786) by @h-a-n-a
- dev: add `AGENTS.md` test guidance for agents (#9763) by @h-a-n-a
- dev: split out initial-build-error into its own playground (#9772) by @h-a-n-a
- dev: align e2e suite with Vite and parallelize playgrounds (#9759) by @h-a-n-a
- remove unnecessary module namespace object JSON serializations in tests (#9725) by @sapphi-red
- use `assert.deepStrictEqual` instead of `assert.deepEqual` by using `assert/strict` instead of `assert` (#9724) by @sapphi-red
- hmr: add test case for #5301 (#5302) by @sapphi-red
- dev: add tests for dev-engine principles (#9720) by @h-a-n-a
- dev: align dev-engine test harness with Vite (#9684) by @h-a-n-a

### ⚙️ Miscellaneous Tasks

- deps: update napi to 3.9.3 (#9862) by @shulaoda
- deps: update oxc to 0.137.0 (#9856) by @Boshen
- re-enable default lld linker on x86_64-unknown-linux-gnu (#9855) by @Boshen
- deps: bump vite-plus to 0.2.1 (#9850) by @Boshen
- skills: translate _config.json when encoding rolldown REPL links (#9847) by @IWANABETHATGUY
- deps: update oxc_resolver and oxc_resolver_napi to 11.21.3 (#9841) by @Boshen
- pin vite-plus (vp) CLI to 0.1.24 in setup-vp (#9830) by @Boshen
- add crate/package-level CODEOWNERS (#9819) by @IWANABETHATGUY
- drop unused derive_more display feature from rolldown_plugin (#9820) by @Boshen
- remove auto-assign PR workflow (#9807) by @IWANABETHATGUY
- deps: update rollup submodule for tests to v4.62.0 (#9780) by @rolldown-guard[bot]
- deps: update esbuild for tests to 0.28.1 (#9779) by @rolldown-guard[bot]
- deps: update test262 submodule for tests (#9781) by @rolldown-guard[bot]
- deps: update oxc to 0.136.0 (#9770) by @Boshen
- add pull request template (#9756) by @sapphi-red
- clarify `rolldown_plugin_vite_*` is compatible for the same minor (#9774) by @sapphi-red
- deps: update github actions (#9745) by @renovate[bot]
- deps: update rust crates (#9747) by @renovate[bot]
- deps: update napi to v3.9.2 (#9744) by @renovate[bot]
- deps: update npm packages (#9746) by @renovate[bot]
- deps: update @napi-rs/cli and emnapi deps (#9741) by @Brooooooklyn
- generator: fix `vp fmt` on Windows (#9727) by @sapphi-red
- ban importing from `assert` and recommend `assert/strict` (#9726) by @sapphi-red

### ❤️ New Contributors

* @naruaway made their first contribution in [#9755](#9755)
* @kb019 made their first contribution in [#9783](#9783)

Co-authored-by: shulaoda <165626830+shulaoda@users.noreply.github.com>
leegeunhyeok added a commit to rollipop-dev/rolldown that referenced this pull request Jun 18, 2026
## [1.0.16] - 2026-06-18

### 🚀 Features

- add option named for invalid return type errors for more places
(rolldown#9846) by `@shulaoda`
- add option names for invalid return type errors (rolldown#9821) by
`@sapphi-red`
- transform: infer decorator strictNullChecks from tsconfig (rolldown#9590) by
`@kylecannon`
- expose React Compiler options for rolldown and Vite users (rolldown#9801) by
`@Boshen`
- tracing: gate chrome-json trace layer behind `chrome-tracing` feature
(rolldown#9773) by `@hyf0`
- dev: align test-dev-server with Vite dev server (rolldown#9668) by `@h-a-n-a`

### 🐛 Bug Fixes

- plugin_timings: point doc link to existing checks reference page
(rolldown#9837) by `@hyf0`
- generator: correct contradictory panic message in cjs cross-chunk
symbol lookup (rolldown#9836) by `@hyf0`
- esm: preserve with clause on export * from external (rolldown#9796) by `@hyf0`
- Make external_import_binding_merger deterministic (rolldown#9755) by
`@naruaway`
- surface invalid `manualCodeSplitting` group `test` regex as an error
(rolldown#9792) by `@shulaoda`
- avoid panic on `output.file` without a file name (rolldown#9789) by
`@shulaoda`
- avoid O(N^2) rendering of high-volume diagnostics (rolldown#9748) (rolldown#9749) by
`@IWANABETHATGUY`
- avoid panic on JSON numbers outside f64 range (rolldown#9788) by `@shulaoda`
- deps: bump mimalloc-safe to 0.1.63 to fix worker_threads segfault
(rolldown#9785) by `@shulaoda`
- cache ESM evaluation errors (rolldown#9784) by `@sapphi-red`
- wrap node require helper in pure IIFE (rolldown#9783) by `@kb019`
- lazy-barrel: load locally-used imports on a re-exported record (rolldown#9757)
by `@shulaoda`
- avoid dangling wrapped-ESM init call across chunks (rolldown#9502) (rolldown#9717) by
`@IWANABETHATGUY`
- dev: detect same-second rewrites in CI poll watcher (rolldown#9736) by
`@h-a-n-a`
- dev: force rebuild after HMR errors (rolldown#9686) by `@h-a-n-a`
- dev: print build errors on browser refresh after a failed build
(rolldown#9652) by `@h-a-n-a`

### 🚜 Refactor

- single-source the chunk $N symbol-naming algorithm (rolldown#9831) by
`@Dunqing`
- simplify common_dir helper (rolldown#9857) by `@IWANABETHATGUY`
- drop commondir crate in favor of in-house helper (rolldown#9849) by `@Boshen`
- binding: extract helpers from normalize_binding_options (rolldown#9842) by
`@Boshen`
- move rolldown_filter_analyzer to tasks and scope oxc cfg feature
(rolldown#9839) by `@Boshen`
- options: merge manualCodeSplitting into codeSplitting object form
(rolldown#9805) by `@IWANABETHATGUY`
- options: support codeSplitting object form in CodeSplittingMode
(rolldown#9804) by `@IWANABETHATGUY`
- diagnostic: reuse ByteLocator for per-source line lookup (rolldown#9762) by
`@IWANABETHATGUY`
- remove redundant Arc around tracing spans (rolldown#9778) by `@camc314`
- remove unnecessary `Arc` around sourcemap sender (rolldown#9777) by `@camc314`
- rolldown_plugin_vite_wasm_fallback: remove the plugin (rolldown#9775) by
`@sapphi-red`
- binding: remove infer-able `napi(ts_type)` (rolldown#9737) by `@sapphi-red`
- remove preprocessor span dedup (rolldown#9734) by `@hyf0`
- identify AST nodes by NodeId instead of Span/Address (rolldown#9609) by
`@IWANABETHATGUY`

### 📚 Documentation

- tsconfig: align auto-discovery docs with oxc-resolver behavior (rolldown#9845)
by `@shulaoda`
- relocate meta/design to internal-docs, split design from
implementation (rolldown#9826) by `@h-a-n-a`
- meta: add options normalization design doc (rolldown#9818) by
`@IWANABETHATGUY`
- document why the napi tracing feature is enabled (rolldown#9766) by `@Boshen`
- dev: move test-dev-server test guidance into the testing docs (rolldown#9809)
by `@h-a-n-a`

### ⚡ Performance

- drop unused regex unicode property tables from the binding (rolldown#9848) by
`@Boshen`
- drop urlencoding crate in favor of percent-encoding (rolldown#9851) by
`@Boshen`
- drop owo-colors supports-colors feature in vite reporter (rolldown#9824) by
`@Boshen`
- skip enum member value extraction for non-TypeScript modules (rolldown#9840)
by `@shulaoda`
- rolldown: use unstable sort for itertools sorted_by at unique-key
sites (rolldown#9827) by `@Boshen`
- cheaper deterministic ordering in external import binding merger
(rolldown#9810) by `@IWANABETHATGUY`
- disable idna's ICU backend by pinning idna_adapter to 1.0.0 (-129 KB)
(rolldown#9811) by `@Boshen`
- size: use unstable sort where stability is unneeded (rolldown#9803) by
`@Boshen`
- remove num-format dependency from vite reporter (rolldown#9795) by `@Boshen`
- reduce js callback error size (rolldown#9776) by `@Boshen`
- rolldown_error: remove Debug supertrait from BuildEvent (rolldown#9798) by
`@Boshen`
- reduce plugin hook order code size (rolldown#9761) by `@Boshen`
- deps: disable `infer` default features to reduce binary size (rolldown#9765)
by `@Boshen`
- reduce pluginable monomorphization size (rolldown#9771) by `@Boshen`
- avoid rebuilding replace plugin values (rolldown#9764) by `@Boshen`
- defer link-stage-output drop to rayon workers after output is produced
(rolldown#9733) by `@Brooooooklyn`
- tree-shaking: hoist already-included guard to call sites in inclusion
DFS (rolldown#9738) by `@Brooooooklyn`
- renamer: dedup before allocating the owned name in
add_symbol_in_root_scope (rolldown#9740) by `@Brooooooklyn`

### 🧪 Testing

- allocs: track allocation counts for rolldown_sourcemap (rolldown#9835) by
`@hyf0`
- bench: add CodSpeed micro-benchmarks for rolldown_sourcemap (rolldown#9834) by
`@hyf0`
- add cjs named export mutation test (rolldown#9823) by `@sapphi-red`
- dev: restore shared-page reliability conventions in AGENTS.md (rolldown#9786)
by `@h-a-n-a`
- dev: add `AGENTS.md` test guidance for agents (rolldown#9763) by `@h-a-n-a`
- dev: split out initial-build-error into its own playground (rolldown#9772) by
`@h-a-n-a`
- dev: align e2e suite with Vite and parallelize playgrounds (rolldown#9759) by
`@h-a-n-a`
- remove unnecessary module namespace object JSON serializations in
tests (rolldown#9725) by `@sapphi-red`
- use `assert.deepStrictEqual` instead of `assert.deepEqual` by using
`assert/strict` instead of `assert` (rolldown#9724) by `@sapphi-red`
- hmr: add test case for rolldown#5301 (rolldown#5302) by `@sapphi-red`
- dev: add tests for dev-engine principles (rolldown#9720) by `@h-a-n-a`
- dev: align dev-engine test harness with Vite (rolldown#9684) by `@h-a-n-a`

### ⚙️ Miscellaneous Tasks

- add rollipop-integration skill by `@leegeunhyeok`
- update esbuild snap diff metrics by `@leegeunhyeok`
- sync upstream rolldown v1.1.2 by `@leegeunhyeok`
- deps: update napi to 3.9.3 (rolldown#9862) by `@shulaoda`
- deps: update oxc to 0.137.0 (rolldown#9856) by `@Boshen`
- re-enable default lld linker on x86_64-unknown-linux-gnu (rolldown#9855) by
`@Boshen`
- deps: bump vite-plus to 0.2.1 (rolldown#9850) by `@Boshen`
- skills: translate _config.json when encoding rolldown REPL links
(rolldown#9847) by `@IWANABETHATGUY`
- deps: update oxc_resolver and oxc_resolver_napi to 11.21.3 (rolldown#9841) by
`@Boshen`
- pin vite-plus (vp) CLI to 0.1.24 in setup-vp (rolldown#9830) by `@Boshen`
- add crate/package-level CODEOWNERS (rolldown#9819) by `@IWANABETHATGUY`
- drop unused derive_more display feature from rolldown_plugin (rolldown#9820)
by `@Boshen`
- remove auto-assign PR workflow (rolldown#9807) by `@IWANABETHATGUY`
- deps: update rollup submodule for tests to v4.62.0 (rolldown#9780) by
`@rolldown-guard[bot]`
- deps: update esbuild for tests to 0.28.1 (rolldown#9779) by
`@rolldown-guard[bot]`
- deps: update test262 submodule for tests (rolldown#9781) by
`@rolldown-guard[bot]`
- deps: update oxc to 0.136.0 (rolldown#9770) by `@Boshen`
- add pull request template (rolldown#9756) by `@sapphi-red`
- clarify `rolldown_plugin_vite_*` is compatible for the same minor
(rolldown#9774) by `@sapphi-red`
- deps: update github actions (rolldown#9745) by `@renovate[bot]`
- deps: update rust crates (rolldown#9747) by `@renovate[bot]`
- deps: update napi to v3.9.2 (rolldown#9744) by `@renovate[bot]`
- deps: update npm packages (rolldown#9746) by `@renovate[bot]`
- deps: update @napi-rs/cli and emnapi deps (rolldown#9741) by `@Brooooooklyn`
- generator: fix `vp fmt` on Windows (rolldown#9727) by `@sapphi-red`
- ban importing from `assert` and recommend `assert/strict` (rolldown#9726) by
`@sapphi-red`

Co-authored-by: leegeunhyeok <26512984+leegeunhyeok@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Build deadlocks (promise never resolves) when emitting a very high volume of warnings

4 participants