Skip to content

refactor: identify AST nodes by NodeId instead of Span/Address#9609

Merged
graphite-app[bot] merged 1 commit into
mainfrom
chore/node-id-migration
Jun 13, 2026
Merged

refactor: identify AST nodes by NodeId instead of Span/Address#9609
graphite-app[bot] merged 1 commit into
mainfrom
chore/node-id-migration

Conversation

@IWANABETHATGUY

@IWANABETHATGUY IWANABETHATGUY commented May 30, 2026

Copy link
Copy Markdown
Member

Summary

Replaces the two ad-hoc cross-pass AST-node identity keys — oxc Span (deduped by PreProcessor) and arena Address — with oxc's post-semantic NodeId for every side table threaded from scan → link → finalize:

  • EcmaView::imports, dummy_record_set, new_url_references, this_expr_replace_map
  • MemberExprRef::node_id / LinkingMetadata::resolved_member_expr_refs
  • DynamicImportExprInfo::node_id / EntryPoint::related_stmt_infos
  • cross-module-optimization state (side-effect-free calls, unreachable dynamic imports)

Cross-module tables are keyed by (ModuleIdx, NodeId) because node ids are unique only within a single AST. Span is retained purely as source-location metadata (diagnostics, source maps, generated replacement spans); import records now carry an explicit importer_span so the TLA import-chain diagnostic no longer needs a reverse lookup over the (formerly span-keyed) imports map.

This removes the implicit "spans are stable and unique within a module" contract: finalizer-generated nodes keep NodeId::DUMMY and can no longer collide with scan-time records. The PreProcessor span-dedup machinery itself is untouched — its one remaining functional job is keeping the synthetic 0..0 span out of scanned ASTs for span.is_unspanned() checks; shrinking it down to that job is left as a follow-up.

Notes

  • The incremental-cache (make_copy) and HMR paths finalize a clone of the scanned AST (EcmaAst::clone_with_another_arena). The cache path relies on clone_in_with_semantic_ids to preserve node ids, since link/finalize reuse scan-time scoping without re-running semantic (plain clone_in would reset them to NodeId::DUMMY). The HMR path re-runs make_semantic on the clone, which re-stamps every id — lookups still hit because deterministic numbering over the unmutated clone re-derives the scan-time ids. Both mechanisms are documented in meta/design/ast-mutation.md.
  • meta/design/ast-mutation.md is rewritten to document the new NodeId contract.

🤖 Generated with Claude Code

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 May 30, 2026

Copy link
Copy Markdown

Deploy Preview for rolldown-rs ready!

Name Link
🔨 Latest commit a5157de
🔍 Latest deploy log https://app.netlify.com/projects/rolldown-rs/deploys/6a2cb67879cb0c0008505479
😎 Deploy Preview https://deploy-preview-9609--rolldown-rs.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@IWANABETHATGUY
IWANABETHATGUY force-pushed the chore/node-id-migration branch 2 times, most recently from 77574a0 to 5a92de4 Compare May 30, 2026 09:31
@IWANABETHATGUY IWANABETHATGUY changed the title u refactor: identify AST nodes by NodeId instead of Span/Address May 30, 2026
Comment thread crates/rolldown/src/ast_scanner/impl_visit.rs
@IWANABETHATGUY

Copy link
Copy Markdown
Member Author

@overlookmotel Thanks for the review. However, I still prefer using NodeId to identify nodes, for the following reasons:

Address is more error-prone. I know it is safe to use in most cases, but it can still potentially introduce bugs when unstable_address is involved.
Address comparison is indeed faster than NodeId comparison, but for Rolldown this should be trivial and probably not even observable, since AST traversal is only a small part of the overall pipeline.
If we keep using Address in some places, we would end up with two ways to identify a node, and three ways to inspect a node if we also count Span, which is used for diagnostics. This would make the code a bit messy.

Overall, I would prefer to use NodeId consistently for all AST node identification.

@IWANABETHATGUY
IWANABETHATGUY marked this pull request as ready for review June 4, 2026 04:59
@codspeed-hq

codspeed-hq Bot commented Jun 4, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 4 untouched benchmarks
⏩ 10 skipped benchmarks1


Comparing chore/node-id-migration (c5fef52) with main (3a1c886)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 (e66677d) during the generation of this report, so 3a1c886 was used instead as the comparison base. There might be some changes unrelated to this pull request in this report.

@overlookmotel

overlookmotel commented Jun 4, 2026

Copy link
Copy Markdown
Collaborator

OK, fair enough. I tend towards prioritising perf myself, but obviously simplicity has large advantages - your rationale makes total sense.

My understanding of where we're at with NodeId in Oxc is:

  1. AST which has come out of Semantic: all AST nodes have unique NodeIds defined.
  2. New AST nodes created in transformer / minifier: have dummy NodeId (0).

We need to fix the 2nd, but it wasn't on immediate roadmap. We'll likely need to have 2 x AstBuilders with/without NodeId creation. If it's important to Rolldown, we can bump it up the priority list.

This PR: What I haven't figured out yet is whether it's going to hit problems due to the dummy NodeIds post-transform. I'd need to explore Rolldown (with an LLM) and get my head around the overall flow. I'm keen to do that - I've felt for a long time that I need to understand Rolldown much better - and this could be a good opportunity.

So... would you like to wait for me to do that and then review this PR (likely next week)? Or would you like to assess yourselves and get this merged earlier?

Sorry, I had hoped to get into it properly this week, but... other stuff has been going on.

@IWANABETHATGUY

Copy link
Copy Markdown
Member Author

OK, fair enough. I tend towards prioritising perf myself, but obviously simplicity has large advantages - your rationale makes total sense.

My understanding of where we're at with NodeId in Oxc is:

  1. AST which has come out of Semantic: all AST nodes have unique NodeIds defined.
  2. New AST nodes created in transformer / minifier: have dummy NodeId (0).

We need to fix the 2nd, but it wasn't on immediate roadmap. We'll likely need to have 2 x AstBuilders with/without NodeId creation. If it's important to Rolldown, we can bump it up the priority list.

This PR: What I haven't figured out yet is whether it's going to hit problems due to the dummy NodeIds post-transform. I'd need to explore Rolldown (with an LLM) and get my head around the overall flow. I'm keen to do that - I've felt for a long time that I need to understand Rolldown much better - and this could be a good opportunity.

So... would you like to wait for me to do that and then review this PR (likely next week)? Or would you like to assess yourselves and get this merged earlier?

Sorry, I had hoped to get into it properly this week, but... other stuff has been going on.

No rush. I’ll wait until you finish the review before merging it.

@IWANABETHATGUY
IWANABETHATGUY marked this pull request as draft June 4, 2026 13:37
graphite-app Bot pushed a commit that referenced this pull request Jun 9, 2026
## Summary

Adds `meta/design/ast-construction.md` documenting how rolldown should construct oxc AST, and cross-links it from `ast-mutation.md`.

The convention:
- **Generic nodes → oxc's `AstBuilder` directly** (handle named `ast`).
- **Rolldown-specific patterns → an `AstBuilderExt` extension trait**, methods prefixed `make_` and named after the operation (e.g. `make_to_esm_wrapper`), mirroring oxc's builder signature style. The call site self-identifies (bare node name = oxc; `make_*` = rolldown) and avoids inherent-vs-trait method shadowing.
- **Build programmatically by default; parsing source is an exception.** Direct construction has no runtime cost; parsing pays lexing+parsing overhead every build. Authoring code as JS and parsing it (`EcmaCompiler::parse`) is reserved for a large fixed blob — in practice just the runtime module.
- The `AstSnippet` facade is retired over time (its author already noted the name was a compromise for `AstBuilder`).

## Background

oxc made `AstBuilder` the single sanctioned construction path (`#[non_exhaustive]` on `NodeId`-bearing nodes, oxc#23046, handled in #9670) and is redesigning it further (oxc#23043, which cites #9609). This doc aligns rolldown with that direction instead of growing a divergent local layer.

## Notes

- **Docs-only; no code changes.**
- The `## Plan` section is **temporary** and will be removed once the migration it describes is implemented.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
@hyfdev

hyfdev commented Jun 10, 2026

Copy link
Copy Markdown
Member

So... would you like to wait for me to do that and then review this PR (likely next week)? Or would you like to assess yourselves and get this merged earlier?

@overlookmotel

There isn't really a hurry for this, but I also get sometimes we want things to get too pefect to be done. If you could finish the review in time that's good, if you can't that's fine too. On the other hands, merging this would be also a way of getting feedbacks for the node id design. Will plan to merge this after this weeks' release, so we get a full week time to revert this PR if you find some significant downsides.

I wanna push this forward, because I'm looking at the some internal improvement/refactor. I want the future refactor can build on top of the new basis. It might not be perfect, but we still want to fix bugs on top of the new basis instead of the old one.

@hyfdev
hyfdev marked this pull request as ready for review June 12, 2026 06:49
@hyfdev

hyfdev commented Jun 12, 2026

Copy link
Copy Markdown
Member

FYI: pushed a merge commit (13a1cc3) that only resolves the merge conflict — no other changes. The conflicted hunk in module_finalizers/mod.rs takes main's side, since #9712 replaced its imports-map lookup with the precomputed transitive_esm_init_targets.

@hyfdev

hyfdev commented Jun 12, 2026

Copy link
Copy Markdown
Member

Pushed c5fef52 (docs/comments only, no behavior change) and edited the PR description, based on findings from an adversarial review pass over the diff:

  • meta/design/ast-mutation.md: the clone-path note attributed id survival in both paths to clone_in_with_semantic_ids. That's only true for the incremental-cache path (link/finalize reuse scan-time scoping and never re-run semantic). The HMR renderers re-run make_semantic on the clone, which re-stamps every NodeId — lookups still hit because SemanticBuilder numbers nodes purely by tree shape, so an unmutated clone re-derives exactly the scan-time ids. The doc now describes both mechanisms and the two invariants the HMR path rests on (clone must stay unmutated until make_semantic; oxc numbering must stay shape-deterministic — verified for 0.135). Also added: NodeId::DUMMY == NodeId::ROOT == 0 (the Program node's id — don't ever record a Program-keyed side-table entry), and named the one remaining functional consumer of PreProcessor's span machinery (span.is_unspanned() discrimination for synthesized nodes, e.g. the global-require rewrite guard) instead of the vague "older code paths".
  • meta/design/ast-construction.md: still said synthetic SPAN exists to avoid false-matching "span-keyed side tables" — stale after this PR; false-match protection is NodeId::DUMMY now.
  • hmr_stage.rs: a comment at the three make_semantic sites stating the unmutated-clone invariant, since it's enforced by convention only and breaking it fails loudly at the imports[&…] lookups but silently at the .get() lookups.
  • PR description: removed the claim that the PreProcessor synthetic-span workaround was removed (it's untouched by this diff; shrinking it is follow-up material), and corrected the HMR mechanism note per the above.

FWIW the same review pass found no correctness issues in the migration itself — every insert/lookup pair is same-node, the (span, importer_span) argument pairs are correct at all call sites, and the Address→NodeId equality semantics check out against oxc 0.135's generated delegation impls (including preserve_parens: true cases).

hyfdev commented Jun 13, 2026

Copy link
Copy Markdown
Member

Merge activity

## Summary

Replaces the two ad-hoc cross-pass AST-node identity keys — oxc `Span` (deduped by `PreProcessor`) and arena `Address` — with oxc's post-semantic `NodeId` for every side table threaded from scan → link → finalize:

- `EcmaView::imports`, `dummy_record_set`, `new_url_references`, `this_expr_replace_map`
- `MemberExprRef::node_id` / `LinkingMetadata::resolved_member_expr_refs`
- `DynamicImportExprInfo::node_id` / `EntryPoint::related_stmt_infos`
- cross-module-optimization state (side-effect-free calls, unreachable dynamic imports)

Cross-module tables are keyed by `(ModuleIdx, NodeId)` because node ids are unique only within a single AST. `Span` is retained purely as source-location metadata (diagnostics, source maps, generated replacement spans); import records now carry an explicit `importer_span` so the TLA import-chain diagnostic no longer needs a reverse lookup over the (formerly span-keyed) `imports` map.

This removes the implicit "spans are stable and unique within a module" contract: finalizer-generated nodes keep `NodeId::DUMMY` and can no longer collide with scan-time records. The `PreProcessor` span-dedup machinery itself is untouched — its one remaining functional job is keeping the synthetic `0..0` span out of scanned ASTs for `span.is_unspanned()` checks; shrinking it down to that job is left as a follow-up.

## Notes

- The incremental-cache (`make_copy`) and HMR paths finalize a *clone* of the scanned AST (`EcmaAst::clone_with_another_arena`). The cache path relies on `clone_in_with_semantic_ids` to preserve node ids, since link/finalize reuse scan-time scoping without re-running semantic (plain `clone_in` would reset them to `NodeId::DUMMY`). The HMR path re-runs `make_semantic` on the clone, which re-stamps every id — lookups still hit because deterministic numbering over the unmutated clone re-derives the scan-time ids. Both mechanisms are documented in `meta/design/ast-mutation.md`.
- `meta/design/ast-mutation.md` is rewritten to document the new `NodeId` contract.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
@graphite-app
graphite-app Bot force-pushed the chore/node-id-migration branch from c5fef52 to a5157de Compare June 13, 2026 01:46
@graphite-app
graphite-app Bot merged commit a5157de into main Jun 13, 2026
34 checks passed
@graphite-app
graphite-app Bot deleted the chore/node-id-migration branch June 13, 2026 01:51
graphite-app Bot pushed a commit that referenced this pull request Jun 13, 2026
## Summary

Follow-up to #9609.

- Remove the old `PreProcessor` span uniqueness machinery entirely: no visited-span set, no duplicate-span rewrite, and no synthetic-span rewrite for pre-scan-created nodes.
- Let pre-scan-created `require(...)` / `import(...)` nodes keep `SPAN` (`0..0`); their cross-pass identity is their post-semantic `NodeId`.
- Remove the finalizer's `require()` `span.is_unspanned()` guard so recognized pre-scan-created `require()` calls are still finalized via `EcmaView::imports.get(call_expr.node_id())`.
- Update `meta/design/ast-mutation.md` to document the post-NodeId contract.

## Why

After cross-pass AST identity moved from `Span`/`Address` to post-semantic `NodeId`, PreProcessor does not need to maintain source-span uniqueness or keep its own generated nodes out of `SPAN`. Scanner-visible pre-scan nodes get semantic `NodeId`s and can hit side tables; finalizer-created nodes keep `NodeId::DUMMY` and miss.

## Validation

- `cargo fmt --all -- --emit=files`
- `cargo fmt --all -- --check`
- `just t-run crates/rolldown/tests/esbuild/default/conditional_require/_config.json`
- `just t-run crates/rolldown/tests/esbuild/default/conditional_import/_config.json`
- `cargo check -p rolldown --all-targets --all-features --locked`
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 <[email protected]>
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 <[email protected]>
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