Skip to content

fix: correct inlining based on module's def format and esModule flag#8975

Merged
graphite-app[bot] merged 1 commit intomainfrom
04-01-fix_correct_inlining_based_on_module_s_def_format_and_esmodule_flag
Apr 1, 2026
Merged

fix: correct inlining based on module's def format and esModule flag#8975
graphite-app[bot] merged 1 commit intomainfrom
04-01-fix_correct_inlining_based_on_module_s_def_format_and_esmodule_flag

Conversation

@h-a-n-a
Copy link
Copy Markdown
Member

@h-a-n-a h-a-n-a commented Apr 1, 2026

Summary

inlineConst incorrectly inlined .default on CJS modules when .default actually represents module.exports (not exports.default). This happens when the importer uses Node ESM semantics ("type": "module") or the importee has no __esModule flag — in both cases __toESM sets .default = module.exports.

Test plan

  • Added esm_import_cjs_with_esmodule_flag fixture
  • All existing cjs_compat and inline_const tests pass

Copy link
Copy Markdown
Member Author

h-a-n-a commented Apr 1, 2026


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
Copy link
Copy Markdown

netlify bot commented Apr 1, 2026

Deploy Preview for rolldown-rs ready!

Name Link
🔨 Latest commit 76ce0cf
🔍 Latest deploy log https://app.netlify.com/projects/rolldown-rs/deploys/69ccaea9aade0700083976a2
😎 Deploy Preview https://deploy-preview-8975--rolldown-rs.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

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

@codspeed-hq
Copy link
Copy Markdown

codspeed-hq bot commented Apr 1, 2026

Merging this PR will not alter performance

✅ 4 untouched benchmarks
⏩ 10 skipped benchmarks1


Comparing 04-01-fix_correct_inlining_based_on_module_s_def_format_and_esmodule_flag (76ce0cf) with main (1d25f3d)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 (76ce0cf) during the generation of this report, so 1d25f3d was used instead as the comparison base. There might be some changes unrelated to this pull request in this report.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Fixes incorrect inlineConst behavior for .default access on CommonJS modules by accounting for the importer’s module format (Node ESM semantics) and the importee’s __esModule flag behavior, preventing inlining when .default actually represents module.exports.

Changes:

  • Update CJS member-expression resolution to avoid resolving/inlining .default when __toESM would map it to module.exports.
  • Add a new cjs_compat fixture covering ESM ("type": "module") importing a CJS module with an __esModule flag, with inlineConst enabled.
  • Add/record the expected snapshot output for the new fixture.

Reviewed changes

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

Show a summary per file
File Description
crates/rolldown/src/stages/link_stage/bind_imports_and_exports.rs Adjusts resolution logic to skip resolving .default to a specific CJS export when it represents module.exports.
crates/rolldown/tests/rolldown/cjs_compat/esm_import_cjs_with_esmodule_flag/package.json Marks the fixture as Node ESM ("type": "module").
crates/rolldown/tests/rolldown/cjs_compat/esm_import_cjs_with_esmodule_flag/main.js Asserts .default equals the whole module.exports object under Node ESM interop.
crates/rolldown/tests/rolldown/cjs_compat/esm_import_cjs_with_esmodule_flag/cjs.cjs Defines a CJS module with an __esModule flag and a default export.
crates/rolldown/tests/rolldown/cjs_compat/esm_import_cjs_with_esmodule_flag/_config.json Enables optimization.inlineConst for the fixture.
crates/rolldown/tests/rolldown/cjs_compat/esm_import_cjs_with_esmodule_flag/artifacts.snap Adds the expected bundled output snapshot for the fixture.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

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

@h-a-n-a h-a-n-a force-pushed the 04-01-fix_correct_inlining_based_on_module_s_def_format_and_esmodule_flag branch from 809c72c to 1c6712f Compare April 1, 2026 04:13
@graphite-app
Copy link
Copy Markdown
Contributor

graphite-app bot commented Apr 1, 2026

Merge activity

…8975)

## Summary

`inlineConst` incorrectly inlined `.default` on CJS modules when `.default` actually represents `module.exports` (not `exports.default`). This happens when the importer uses Node ESM semantics (`"type": "module"`) or the importee has no `__esModule` flag — in both cases `__toESM` sets `.default = module.exports`.

## Test plan
- Added `esm_import_cjs_with_esmodule_flag` fixture
- All existing `cjs_compat` and `inline_const` tests pass
@graphite-app graphite-app bot force-pushed the 04-01-fix_correct_inlining_based_on_module_s_def_format_and_esmodule_flag branch from 1c6712f to 76ce0cf Compare April 1, 2026 05:35
@graphite-app graphite-app bot merged commit 76ce0cf into main Apr 1, 2026
31 checks passed
@graphite-app graphite-app bot deleted the 04-01-fix_correct_inlining_based_on_module_s_def_format_and_esmodule_flag branch April 1, 2026 05:39
@github-actions github-actions bot mentioned this pull request Apr 1, 2026
shulaoda added a commit that referenced this pull request Apr 1, 2026
## [1.0.0-rc.13] - 2026-04-01

### 🚀 Features

- add friendly error for unloadable virtual modules (#8955) by @sapphi-red
- better error message for unsupported CSS error (#8911) by @sapphi-red

### 🐛 Bug Fixes

- prevent chunk merging from leaking entry side effects (#8979) by @IWANABETHATGUY
- correct inlining based on module's def format and esModule flag (#8975) by @h-a-n-a
- generate init calls for excluded re-exports in strict execution order (#8858) by @IWANABETHATGUY
- consistent order for `meta.chunks` in `renderChunk` hook (#8956) by @sapphi-red
- subpath imports in glob imports failing to find files (#8885) by @kalvenschraut
- browser: bundle binding types in dts output (#8930) by @nyan-left
- ci: guard artifact download step in `vite-test-ubuntu` when build is skipped (#8934) by @Copilot
- track CJS re-export import records to fix inline const and tree-shaking (#8925) by @h-a-n-a
- use ImportKind::Import for common-chunk root computation (#8899) by @IWANABETHATGUY
- watch: clear emitted_filenames between rebuilds (#8914) by @IWANABETHATGUY
- ci: cache esbuild snapshots to avoid 429 rate limiting (#8921) by @IWANABETHATGUY
- always check circular deps in chunk optimizer (#8915) by @IWANABETHATGUY
- don't mark calls to reassigned bindings as pure (#8917) by @IWANABETHATGUY
- magic-string: throw TypeError for non-string content args (#8905) by @IWANABETHATGUY
- magic-string: add split-point validation and overwrite/update options (#8904) by @IWANABETHATGUY

### 🚜 Refactor

- pre-compute has_side_effects on ChunkCandidate (#8981) by @IWANABETHATGUY
- cleanup and simplify in dynamic_import.rs (#8927) by @ulrichstark
- rename came_from_cjs to came_from_commonjs for consistency (#8938) by @IWANABETHATGUY
- inline `create_ecma_view` return destructuring and remove redundant binding (#8932) by @shulaoda

### 📚 Documentation

- document ensure_lazy_module_initialization_order in code-splitting design doc (#8931) by @IWANABETHATGUY

### 🧪 Testing

- add regression test for runtime helper circular dependency (#8958) by @h-a-n-a
- enable 8 previously-skipped MagicString remove tests (#8945) by @IWANABETHATGUY
- add test for why PureAnnotation is needed in execution order check (#8933) by @IWANABETHATGUY

### ⚙️ Miscellaneous Tasks

- add `@emnapi/runtime` and `@emnapi/core` as direct deps of `@rolldown/browser` (#8978) by @Copilot
- deps: update dependency vite-plus to v0.1.15 (#8970) by @renovate[bot]
- deps: update dependency oxfmt to ^0.43.0 (#8969) by @renovate[bot]
- deps: upgrade oxc to 0.123.0 (#8967) by @shulaoda
- justfile: deduplicate update-submodule as alias of setup-submodule (#8968) by @shulaoda
- deps: update rollup submodule for tests to v4.60.1 (#8965) by @sapphi-red
- deps: update test262 submodule for tests (#8966) by @sapphi-red
- remove unused `type-check` scripts (#8957) by @sapphi-red
- deps: update actions/cache action to v5 (#8953) by @renovate[bot]
- deps: update npm packages to v6 (major) (#8954) by @renovate[bot]
- deps: update npm packages (#8948) by @renovate[bot]
- deps: update rust crates (#8949) by @renovate[bot]
- deps: update github-actions (#8947) by @renovate[bot]
- deps: update napi (#8943) by @renovate[bot]
- deps: update dependency rolldown-plugin-dts to ^0.23.0 (#8944) by @renovate[bot]
- regenerate testing snapshots (#8928) by @ulrichstark
- deps: update dependency rust to v1.94.1 (#8923) by @renovate[bot]

### ❤️ New Contributors

* @kalvenschraut made their first contribution in [#8885](#8885)
* @nyan-left made their first contribution in [#8930](#8930)

Co-authored-by: shulaoda <[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