Skip to content

fix(dev): print build errors on browser refresh after a failed build#9652

Merged
graphite-app[bot] merged 1 commit into
mainfrom
06-05-fix_dev_fix_rebuild_and_error_recovery
Jun 11, 2026
Merged

fix(dev): print build errors on browser refresh after a failed build#9652
graphite-app[bot] merged 1 commit into
mainfrom
06-05-fix_dev_fix_rebuild_and_error_recovery

Conversation

@h-a-n-a

@h-a-n-a h-a-n-a commented Jun 5, 2026

Copy link
Copy Markdown
Member

Design Principles

This PR mainly clarifies a few principles that we hold while implementing Rolldown's dev engine and Vite's full-bundle mode dev server. Mostly are written in meta/design/dev-engine.md. Just to give you a briefing, here're these things:

  1. Be conservative — rebuild only when the bundle is stale, and defer it until the full bundle is actually requested (e.g. a page refresh). By default we ship HMR-only output.
  2. Replay errors when needed — the dev engine is stateless across HTTP requests and never caches results from onHmrUpdates/onOutput; caching and replay are the dev server's job, so errors survive a refresh.
  3. File changes are the only recovery trigger — after a failed build the engine waits for a file edit (Vite config or source). Not a page refresh, elapsed time, or UI dismissal.
  4. Build errors are always recoverable — every error via on_output/on_hmr_updates is treated as a user error (source/plugin), fixable by editing source. Only a panic is unrecoverable.

Problem

#9552 made ensure_latest_bundle_output return None in FullBuildFailed /
Failed instead of retrying a build. That fixed a double-onOutput and an
infinite loop — but the retry it removed had been doing double duty: on a
browser refresh, the dev-server middleware calls ensureLatestBuildOutput,
the retry reran the build, and onOutput re-fired the error to the client.

With the retry gone, a refresh no longer reruns the build, so a project whose
build output contains an error stops re-emitting that error on refresh
— the
error overlay disappears even though the build is still broken.

The right fix is not to rerun the build on access (that brings back the loop
and the double-emit). It's to make Failed / FullBuildFailed work as the
genuine resting states they now are:

  • the error must survive a refresh without a rebuild, and
  • recovery must be driven entirely by file changes, re-running the stage that
    actually broke.

Changes

1. Expose errored-and-stale state to the consumer.
Snapshot field last_full_build_failedlast_build_errored, now true for
both FullBuildFailed and Failed { .. }. This is the predicate the
consumer pairs with has_stale_output to (a) replay its cached build error on
client reconnect instead of triggering a doomed regen, and (b) avoid the
access-triggered reload loop against a bundle the engine won't regenerate.

2. File-change-driven, stage-aware recovery.
Because access no longer retries, the next file change is the only recovery
trigger — and it must re-run the broken stage:

  • New ErrorStage enum (Hmr | Rebuild); BundlingTask tracks
    hmr_errored / rebuild_errored and collapses them with precedence
    Rebuild > Hmr (covers the Hmr → HmrRebuild auto-upgrade that then fails
    in rebuild).
  • CoordinatorState::Failed { last_error_stage } carries the stage;
    handle_file_changes forces HmrRebuild on a Rebuild-stage failure
    (regardless of rebuild_strategy) so the rebuild re-runs, and uses an Hmr
    task for an Hmr-stage failure.

Tests

Tests will be added when Rolldown's test-dev-server is fully aligned with Vite's full-bundle mode server.

This PR is meant to be released along with vitejs/vite#22617.

h-a-n-a commented Jun 5, 2026

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 5, 2026

Copy link
Copy Markdown

Deploy Preview for rolldown-rs canceled.

Name Link
🔨 Latest commit 599c585
🔍 Latest deploy log https://app.netlify.com/projects/rolldown-rs/deploys/6a2ac4d201147f0008cf9f30

@h-a-n-a h-a-n-a force-pushed the 06-05-fix_dev_fix_rebuild_and_error_recovery branch 5 times, most recently from 040007d to 247bdcd Compare June 8, 2026 08:01
@h-a-n-a h-a-n-a changed the title fix(dev): fix rebuild and error recovery fix(dev): print build errors on browser refresh after a failed build Jun 8, 2026
@h-a-n-a h-a-n-a marked this pull request as ready for review June 9, 2026 06:37
@h-a-n-a h-a-n-a requested review from hyf0 and sapphi-red June 9, 2026 06:37
@codspeed-hq

codspeed-hq Bot commented Jun 9, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 4 untouched benchmarks
⏩ 10 skipped benchmarks1


Comparing 06-05-fix_dev_fix_rebuild_and_error_recovery (599c585) with main (d7f919c)2

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.

  2. No successful run was found on main (599c585) during the generation of this report, so d7f919c was used instead as the comparison base. There might be some changes unrelated to this pull request in this report.

Comment thread meta/design/dev-engine.md
@h-a-n-a h-a-n-a force-pushed the 06-05-fix_dev_fix_rebuild_and_error_recovery branch from 247bdcd to 28e741f Compare June 9, 2026 09:46
@h-a-n-a h-a-n-a force-pushed the 06-05-fix_dev_fix_rebuild_and_error_recovery branch from 28e741f to 44d05e2 Compare June 11, 2026 13:59
@graphite-app

graphite-app Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Merge activity

…9652)

## Design Principles

This PR mainly clarifies a few principles that we hold while implementing Rolldown's dev engine and Vite's full-bundle mode dev server. Mostly are written in `meta/design/dev-engine.md`. Just to give you a briefing, here're these things:

1. **Be conservative** — rebuild only when the bundle is stale, and defer it until the full bundle is actually requested (e.g. a page refresh). By default we ship HMR-only output.
2. **Replay errors when needed** — the dev *engine* is stateless across HTTP requests and never caches results from `onHmrUpdates`/`onOutput`; caching and replay are the dev *server*'s job, so errors survive a refresh.
3. **File changes are the only recovery trigger** — after a failed build the engine waits for a file edit (Vite config or source). Not a page refresh, elapsed time, or UI dismissal.
4. **Build errors are always recoverable** — every error via `on_output`/`on_hmr_updates` is treated as a user error (source/plugin), fixable by editing source. Only a panic is unrecoverable.

### Problem

  #9552 made `ensure_latest_bundle_output` return `None` in `FullBuildFailed` /
  `Failed` instead of retrying a build. That fixed a double-`onOutput` and an
  infinite loop — but the retry it removed had been doing double duty: on a
  browser refresh, the dev-server middleware calls `ensureLatestBuildOutput`,
  the retry reran the build, and `onOutput` re-fired the error to the client.

  With the retry gone, a refresh no longer reruns the build, so **a project whose
  build output contains an error stops re-emitting that error on refresh** — the
  error overlay disappears even though the build is still broken.

  The right fix is *not* to rerun the build on access (that brings back the loop
  and the double-emit). It's to make `Failed` / `FullBuildFailed` work as the
  genuine resting states they now are:

  - the error must survive a refresh **without** a rebuild, and
  - recovery must be driven entirely by file changes, re-running the stage that
    actually broke.

### Changes

  **1. Expose errored-and-stale state to the consumer.**
  Snapshot field `last_full_build_failed` → `last_build_errored`, now true for
  *both* `FullBuildFailed` and `Failed { .. }`. This is the predicate the
  consumer pairs with `has_stale_output` to (a) replay its cached build error on
  client reconnect instead of triggering a doomed regen, and (b) avoid the
  access-triggered reload loop against a bundle the engine won't regenerate.

  **2. File-change-driven, stage-aware recovery.**
  Because access no longer retries, the next file change is the only recovery
  trigger — and it must re-run the broken stage:

  - New `ErrorStage` enum (`Hmr` | `Rebuild`); `BundlingTask` tracks
    `hmr_errored` / `rebuild_errored` and collapses them with precedence
    `Rebuild > Hmr` (covers the `Hmr → HmrRebuild` auto-upgrade that then fails
    in rebuild).
  - `CoordinatorState::Failed { last_error_stage }` carries the stage;
    `handle_file_changes` forces `HmrRebuild` on a `Rebuild`-stage failure
    (regardless of `rebuild_strategy`) so the rebuild re-runs, and uses an `Hmr`
    task for an `Hmr`-stage failure.

### Tests

Tests will be added when Rolldown's test-dev-server is fully aligned with Vite's full-bundle mode server.

This PR is meant to be released along with vitejs/vite#22617.
@graphite-app graphite-app Bot force-pushed the 06-05-fix_dev_fix_rebuild_and_error_recovery branch from 44d05e2 to 599c585 Compare June 11, 2026 14:23
graphite-app Bot pushed a commit that referenced this pull request Jun 11, 2026
This PR adds one exception for the case described here: #9652 (comment).

HMR errors will now trigger full build after page refreshes.
This is to make it easier to recover if the HMR generation is broken for some reason.

Corresponding code in Vite has been updated: https://github.com/vitejs/vite/pull/22617/changes#diff-fa8a3ccea3d0248153b01e43e694f0c778ece12ea7887cde413299f79b697c4bR289-R304

Tests will be added once the alignment completes.
graphite-app Bot pushed a commit that referenced this pull request Jun 11, 2026
## Summary

Stacked on #9652.

Restructures `packages/test-dev-server` so it tracks Vite's full-bundle-mode dev
server (`packages/vite/src/node/server/environments/fullBundleEnvironment.ts`),
rather than carrying its own ad-hoc shape. The goal is to let dev-engine work be
exercised inside the rolldown repo against a server whose error handling,
middleware, and reload behavior match Vite's — so behavioral regressions in the
`dev()` engine surface here before they reach Vite.

A literal 1:1 port isn't possible: the test harness depends on pieces Vite
doesn't have. Those are **kept** intentionally:

- the standalone connect + `ws` server (Vite reuses its own HTTP/HMR transport),
- the **disk**-serving path for the node target,
- the `/_dev/status` endpoint plus `buildSeq` / `moduleRegistrationSeq` test
  instrumentation.

**Constraint:** the shared rolldown HMR runtime
(`crates/rolldown_plugin_hmr/src/runtime/runtime-extra-dev-default.js`) is **not**
touched — every change lives in `packages/test-dev-server`.

## Structure

The flat `dev-server.ts` is split to mirror Vite's layout:

| test-dev-server | Vite equivalent |
| --- | --- |
| `src/environments/full-bundle-dev-environment.ts` (`FullBundleDevEnvironment`) | `environments/fullBundleEnvironment.ts` |
| `src/middlewares/{memory-files,index-html,trigger-lazy-bundling,status}.ts` | `server/middlewares/*` |
| `src/{clients,memory-files,fallback-html}.ts`, `src/utils/{debounce,prepare-error}.ts` | Vite helpers |
| `src/dev-server.ts` | `server/index.ts` (connect/http/ws transport + middleware wiring only) |

`FullBundleDevEnvironment` now owns the dev engine, the in-memory output, the
client registry, and the `lastBuildError` / `fullReloadPending` state.

## Behavior ported from Vite

- **Error replay:** `lastBuildError` is cached from either callback channel
  (`onOutput` / `onHmrUpdates`), broadcast on break, and replayed on client
  connect so the overlay survives a refresh; it's cleared on a successful build
  from **either** channel.
- **Build-error overlay** (`error-overlay.ts`): stand-in for Vite's client
  overlay, injected into the generated `index.html` and the "Bundling in
  progress" spinner. Runs as its own ws client alongside the rolldown HMR
  runtime; because HMR patches are delivered per-client, recovery is signalled
  by a broadcast `build:ok` (HMR recovery) and a reload (full-build recovery).
- **`prepareError`** (`utils/prepare-error.ts`): port of Vite's helper — strips
  ANSI via `node:util`'s `stripVTControlCharacters` and copies only the fields
  the overlay needs (`message`/`stack`/`id`/`frame`/`plugin`/`pluginCode`/`loc`).
- **Reload handling:** deferred full reload (`fullReloadPending`), debounced
  reload, conservative stale-output regen guard
  (`hasStaleOutput && !lastBuildErrored && initialBuildCompleted`), and
  noop/empty HMR-batch filtering.
- **Serving targets:** browser target serves from memory with the spinner +
  `skipWrite`; node target serves from disk behind a request gate.

## Docs

Reconciles `meta/design/dev-engine.md` §2: it claimed `lastBuildError` clears
only on a successful `onOutput`, but Vite (and now this port) also clears it on a
successful `onHmrUpdates`.

## Testing

`pnpm test:fixtures` (9) and `pnpm test:browser` (10) pass, including a new
`browser.spec.ts` case asserting the build-error overlay appears on a break and
clears on recovery.
graphite-app Bot pushed a commit that referenced this pull request Jun 11, 2026
Adds e2e tests for the design principles in `meta/design/dev-engine.md` (all except panics), in the `hmr-full-bundle-mode` playground. One folder + one spec per scenario, same layout as `lazy-compilation`. Each check in the specs is tagged with the principle it proves (`Design Principle 1/2/3`).

This fully tests the fixes raised in #9652 and #9686

## New tests

- **`initial-error.spec.ts`** — the first build fails (syntax error). The page shows the error overlay, refreshing does not retry the build, and fixing the file recovers.
- **`rebuild-error.spec.ts`** — a rebuild fails (`generateBundle` throws, controlled by a flag file). The overlay shows and survives a refresh, refreshing never retries, each new failed build reports its own error, and a file change recovers. Also checks that opening the page on fresh output never triggers a build.
- **`hmr-error.spec.ts`** — an HMR update fails (syntax error). Refreshing the page triggers a full rebuild — the one case where page access starts a build. A second refresh does nothing, and fixing the file recovers.

What each test checks is observable from the outside: `/_dev/status` (`buildSeq` proves whether a build ran), the error overlay, and page content.

## Other changes

- Rewrote the comments in `tests/playground/` in simple english, keeping the useful references (design doc, PR numbers, file paths).
- Synced two stale notes in `dev-engine.md` (the refresh-after-HMR-error escape hatch is now wired up and covered by a test).

🤖 Generated with [Claude Code](https://claude.com/claude-code)
@graphite-app graphite-app Bot merged commit 599c585 into main Jun 11, 2026
34 checks passed
@graphite-app graphite-app Bot deleted the 06-05-fix_dev_fix_rebuild_and_error_recovery branch June 11, 2026 14:28
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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants