Skip to content

test: cover preserveModules named export via namespace re-export (#6010)#9937

Merged
graphite-app[bot] merged 1 commit into
mainfrom
fix/preserve-modules-named-export-6010
Jun 23, 2026
Merged

test: cover preserveModules named export via namespace re-export (#6010)#9937
graphite-app[bot] merged 1 commit into
mainfrom
fix/preserve-modules-named-export-6010

Conversation

@IWANABETHATGUY

Copy link
Copy Markdown
Member

What

Adds a regression fixture for #6010. Under preserveModules, a named export reached only through an export * as namespace chain was dropped from its module's emitted export list.

Reproduction (index → two → three):

// index.js
export * as two from './two.js';
// two.js
export * as three from './three.js';
// three.js
export const myVariable = 'world';
  • Before: dist/three.js emitted export { three_exports };myVariable dropped.
  • After: dist/three.js emits export { myVariable, three_exports }; — matching the issue's expected output and Rollup.

Fix location

This is the same root cause as #9122 — the named export's home survives tree-shaking (the namespace getter references it) but it was missing from the module's declared interface. The fix lands in the stacked PR #9934 (preserve_reexported_interfaces post-pass + full declared-interface emission in compute_cross_chunk_links), which already produces the correct output for this namespace-chain variant.

This PR is test-only — it adds the issues/6010 fixture covering the export * as chain, a distinct scenario from #9122's export { x } from re-export facades.

Stacked on #9934. Verified: the fixture fails on main (drops myVariable) and passes with #9934's fix in place.

Closes #6010

🤖 Generated with Claude Code

@IWANABETHATGUY IWANABETHATGUY force-pushed the fix/preserve-modules-named-export-6010 branch from ddbd228 to 2852bd9 Compare June 23, 2026 08:56
@graphite-app graphite-app Bot force-pushed the fix/preserve-modules-reexport-9122 branch from f77bfe9 to 7f03488 Compare June 23, 2026 09:11
Base automatically changed from fix/preserve-modules-reexport-9122 to main June 23, 2026 09:16
@shulaoda shulaoda marked this pull request as draft June 23, 2026 11:24
@IWANABETHATGUY IWANABETHATGUY force-pushed the fix/preserve-modules-named-export-6010 branch from 2852bd9 to c831c99 Compare June 23, 2026 14:53
@netlify

netlify Bot commented Jun 23, 2026

Copy link
Copy Markdown

Deploy Preview for rolldown-rs canceled.

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

@IWANABETHATGUY IWANABETHATGUY marked this pull request as ready for review June 23, 2026 15:02

IWANABETHATGUY commented Jun 23, 2026

Copy link
Copy Markdown
Member Author

Merge activity

  • Jun 23, 3:02 PM UTC: The merge label 'graphite: merge-when-ready' was detected. This PR will be added to the Graphite merge queue once it meets the requirements.
  • Jun 23, 3:02 PM UTC: IWANABETHATGUY added this pull request to the Graphite merge queue.
  • Jun 23, 3:08 PM UTC: Merged by the Graphite merge queue.

…) (#9937)

## What

Adds a regression fixture for #6010. Under `preserveModules`, a named export reached **only** through an `export * as` namespace chain was dropped from its module's emitted export list.

Reproduction (`index → two → three`):

```js
// index.js
export * as two from './two.js';
// two.js
export * as three from './three.js';
// three.js
export const myVariable = 'world';
```

- **Before:** `dist/three.js` emitted `export { three_exports };` — `myVariable` dropped.
- **After:** `dist/three.js` emits `export { myVariable, three_exports };` — matching the issue's expected output and Rollup.

## Fix location

This is the same root cause as #9122 — the named export's home survives tree-shaking (the namespace getter references it) but it was missing from the module's declared interface. The fix lands in the stacked PR #9934 (`preserve_reexported_interfaces` post-pass + full declared-interface emission in `compute_cross_chunk_links`), which already produces the correct output for this namespace-chain variant.

**This PR is test-only** — it adds the `issues/6010` fixture covering the `export * as` chain, a distinct scenario from #9122's `export { x } from` re-export facades.

> Stacked on #9934. Verified: the fixture fails on `main` (drops `myVariable`) and passes with #9934's fix in place.

Closes #6010

🤖 Generated with [Claude Code](https://claude.com/claude-code)
@graphite-app graphite-app Bot force-pushed the fix/preserve-modules-named-export-6010 branch from c831c99 to da9563a Compare June 23, 2026 15:02
@graphite-app graphite-app Bot merged commit da9563a into main Jun 23, 2026
33 checks passed
@graphite-app graphite-app Bot deleted the fix/preserve-modules-named-export-6010 branch June 23, 2026 15:08
@rolldown-guard rolldown-guard Bot mentioned this pull request Jun 24, 2026
shulaoda added a commit that referenced this pull request Jun 24, 2026
## [1.1.3] - 2026-06-24

### 🐛 Bug Fixes

- `defer_drop` crashes the browser main thread (#9942) by @shulaoda
- camel-case: correct camel case for nested values (#9933) by @kb019
- cli: display --help options in camelCase (#9941) by @IWANABETHATGUY
- preserve used re-exports under preserveModules (#9122) (#9934) by @IWANABETHATGUY
- watch: make close reentrant in event callbacks (#9904) by @hyf0
- git for windows treats symlink files as regular files (#9915) by @AliceLanniste
- dev: cancel pending full reload on build error (#9903) by @h-a-n-a
- chunking: pass plugin meta to codeSplitting groups name function (#9267) by @Kyujenius
- dev: serve assets emitted during HMR/lazy compile (vite#22596) (#9815) by @h-a-n-a
- release: dry-run step no longer publishes binding packages (#9866) by @Boshen

### 🚜 Refactor

- rolldown_common: model ModuleId as a classified Path/Virtual/Bare enum (#9927) by @Boshen
- remove unused LegacyModuleIdx (#9872) by @shulaoda
- remove unused StmtInfos::get_namespace_stmt_info (#9870) by @shulaoda
- remove unused Module::as_external_mut (#9871) by @shulaoda
- remove unused EcmaAst::is_body_empty (#9869) by @shulaoda
- drop dead is_css_module handling in resolve_dependencies (#9867) by @shulaoda
- drop redundant with_commonjs on cjs source type (#9868) by @shulaoda

### 📚 Documentation

- clarify on drafting PRs (#9952) by @h-a-n-a
- update contribution guidelines (#9944) by @fubhy
- note Rust crates don't follow semver in AGENTS.md (#9905) by @IWANABETHATGUY
- add feedback form (#9159) by @TheAlexLichter

### ⚡ Performance

- utils: avoid allocation in default_sanitize_file_name for clean names (#9928) by @Boshen
- binding: box once-per-build futures before spawn_future (#9864) by @Boshen
- utils: avoid wasted allocation in legitimize_identifier_name (#9926) by @Boshen
- rolldown: fuse the canonical-name dedup and insert in the renamer (#9900) by @Boshen
- rolldown: probe the name map once in ConflictResolver::resolve (#9899) by @Boshen
- cut two heap allocations from wrapped ESM init finalize (#9901) by @Boshen
- rolldown_plugin_vite_reporter: hoist invariant out_dir prefix out of reporter loop (#9873) by @shulaoda
- drop throwaway Vec in wrapped esm init stmt (#9878) by @shulaoda
- borrow owner_filename in build-import-analysis AddDeps (#9874) by @shulaoda

### 🧪 Testing

- cover preserveModules named export via namespace re-export (#6010) (#9937) by @IWANABETHATGUY

### ⚙️ Miscellaneous Tasks

- deps: update napi to v3.9.4 (#9954) by @shulaoda
- reduce noise from CODEOWNERS for trival changes (#9953) by @h-a-n-a
- deps: update mimalloc-safe to 0.1.64 (#9950) by @shulaoda
- deps: update rollup submodule for tests to v4.62.2 (#9931) by @rolldown-guard[bot]
- deps: test mimalloc-safe upstream-mimalloc switch in CI (#9930) by @shulaoda
- rolldown_plugin_vite_build_import_analysis: remove unused v2 code path (#9917) by @shulaoda
- rolldown_plugin_vite_manifest: remove unused is_enable_v2 code path (#9916) by @shulaoda
- rolldown_plugin_vite_asset_import_meta_url: remove unexposed native vite plugin (#9896) by @shulaoda
- rolldown_plugin_vite_asset: remove unexposed native vite plugin (#9895) by @shulaoda
- rolldown_plugin_vite_css_post: remove unexposed native vite plugin (#9894) by @shulaoda
- rolldown_plugin_vite_css: remove unexposed native vite plugin (#9893) by @shulaoda
- rolldown_plugin_vite_html_inline_proxy: remove unexposed native vite plugin (#9892) by @shulaoda
- rolldown_plugin_vite_html: remove unexposed native vite plugin (#9891) by @shulaoda
- deps: update github actions (#9909) by @renovate[bot]
- deps: update rust crate oxc_sourcemap to v8.0.2 (#9910) by @renovate[bot]
- deps: update npm packages (#9912) by @renovate[bot]
- deps: update github actions to v7 (#9913) by @renovate[bot]
- deps: update rolldown-plugin-dts to ^0.26.0 (#9897) by @renovate[bot]
- remove rolldown_filter_analyzer crate (#9865) by @Boshen

### ❤️ New Contributors

* @fubhy made their first contribution in [#9944](#9944)

Co-authored-by: shulaoda <165626830+shulaoda@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.

[Bug]: preserveModules removes named exports

2 participants