feat: support output.dynamicImportInCjs option#7677
Conversation
How to use the Graphite Merge QueueAdd 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. |
output.dynamicImportInCjs option
✅ Deploy Preview for rolldown-rs ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
64cf34b to
c017834
Compare
There was a problem hiding this comment.
Pull request overview
This PR adds a new output.dynamicImportInCjs option to control how dynamic imports of external modules are handled when outputting to CommonJS format.
- Adds
dynamicImportInCjsboolean option (default:true) to preserve current behavior - When set to
false, converts external module dynamic imports from nativeimport()toPromise.resolve().then(() => __toESM(require())) - Updates all TypeScript/Rust infrastructure to support the new option
Reviewed changes
Copilot reviewed 22 out of 22 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/rolldown/tests/cli/snapshots/cli-e2e.test.ts.snap | Adds CLI flag for the new option |
| packages/rolldown/src/utils/validator.ts | Adds schema validation for dynamicImportInCjs option |
| packages/rolldown/src/utils/bindingify-output-options.ts | Passes the option to Rust binding |
| packages/rolldown/src/options/output-options.ts | Adds TypeScript interface definition |
| packages/rolldown/src/options/normalized-output-options.ts | Adds normalized option getter |
| packages/rolldown/src/binding.d.cts | Updates TypeScript bindings with new option |
| crates/rolldown_testing_config/src/config_variant.rs | Adds option to test configuration |
| crates/rolldown_testing/_config.schema.json | Updates JSON schema for test configs |
| crates/rolldown_common/src/inner_bundler_options/types/normalized_bundler_options.rs | Adds field with default value of true |
| crates/rolldown_common/src/inner_bundler_options/mod.rs | Adds option to bundler options struct |
| crates/rolldown_binding/src/utils/normalize_binding_options.rs | Normalizes option from JavaScript |
| crates/rolldown_binding/src/types/binding_normalized_options.rs | Exposes option getter to JavaScript |
| crates/rolldown_binding/src/options/binding_output_options/mod.rs | Adds option to binding output options |
| crates/rolldown/tests/snapshots/integration_rolldown__filename_with_hash.snap | Updates hash snapshot with new test |
| crates/rolldown/tests/rolldown/cjs_compat/dynamic_import_in_cjs/main.js | Test input with three dynamic import scenarios |
| crates/rolldown/tests/rolldown/cjs_compat/dynamic_import_in_cjs/internal.js | Internal ESM module for testing |
| crates/rolldown/tests/rolldown/cjs_compat/dynamic_import_in_cjs/internal-cjs.js | Internal CJS module for testing |
| crates/rolldown/tests/rolldown/cjs_compat/dynamic_import_in_cjs/artifacts.snap | Expected output showing require-based polyfills |
| crates/rolldown/tests/rolldown/cjs_compat/dynamic_import_in_cjs/_config.json | Test config with dynamicImportInCjs: false |
| crates/rolldown/src/utils/prepare_build_context.rs | Sets default value to true when normalizing |
| crates/rolldown/src/stages/link_stage/reference_needed_symbols.rs | References __toESM helper when option is false |
| crates/rolldown/src/module_finalizers/mod.rs | Implements conversion logic for external module dynamic imports |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
output.dynamicImportInCjs optionoutput.dynamicImportInCjs option
Benchmarks Rust |
c017834 to
7adaf48
Compare
## [1.0.0-beta.58] - 2025-12-31 ### 💥 BREAKING CHANGES - experimental/devtools: rename InputOptions#debug to InputOptions#devtools (#7686) by @Copilot ### 🚀 Features - implement target feature check in `should_transform_js` for raw options (#7697) by @shulaoda - support `output.dynamicImportInCjs` option (#7677) by @shulaoda - types: expose `ChecksOptions` type (#7653) by @sapphi-red ### 🐛 Bug Fixes - export runtime helpers for cross-chunk access (#7658) by @shulaoda - cjs namespace merging regression (#7665) by @IWANABETHATGUY - replace panic with proper error handling for hash placeholder generation (#7661) by @shulaoda - remove the blank line between shebang and postBanner (#7643) by @btea - rolldown_plugin_vite_reporter: apply padding before ANSI coloring for proper size column alignment (#7649) by @shulaoda ### 🚜 Refactor - rust: use `StableModuleId` as the map key if possible (#7718) by @hyf0 - rust: return `StableModuleId` instead of `&str` from `Module#stable_id()` (#7717) by @hyf0 - rust: return correct stable id of external module from `Module#stable_id()` (#7716) by @hyf0 - rust: introduce `StableModuleId` type (#7715) by @hyf0 - rust: reduce unnecessary `id.as_arc_str().clone().into()` (#7714) by @hyf0 - rust: remove `ModuleId#resource_id` and use `as_arc_str` directly (#7710) by @hyf0 - rust: remove unused `Module#id_clone` (#7709) by @hyf0 - rust: remove `Module#id_as_str` and use `Module#id` directly (#7708) by @hyf0 - consolidate namespace call analysis into import analyzer (#7657) by @IWANABETHATGUY - rust: make `ExternalModule#id` have the type `ModuleId` (#7707) by @hyf0 - rust: rename `Module#id` to `Module#id_as_str` (#7706) by @hyf0 - rust: use `ModuleId` instead of raw `ArcStr` for `ScanStageCache` (#7701) by @hyf0 - simplify error propagation in cache merge (#7702) by @shulaoda - use `ModuleId` as the type of `ResolvedId#id` (#7694) by @hyf0 - types: rename `resolved_request_info.rs` to `resolved_id.rs` and move its contents (#7687) by @hyf0 - devtools: emit data to `<CWD>/node_modules/.rolldown` (#7692) by @hyf0 - use `InvalidOption` for hash placeholder generation errors (#7674) by @shulaoda - rolldown_error: remove dependency on rolldown_utils (#7672) by @shulaoda - use nodejs-built-in-modules v1.0.0 directly in callsites (#7667) by @Boshen ### 📚 Documentation - migrate input options content from options to auto gen docs (#7663) by @mdong1909 - create reference index page (#7659) by @mdong1909 - tweak auto-generated reference output (#7654) by @sapphi-red - initialize auto-gen docs (#7252) by @mdong1909 ### ⚙️ Miscellaneous Tasks - deps: update napi (#7705) by @renovate[bot] - pin Node.js version to 24.12.0 LTS in .node-version file (#7713) by @Copilot - update esbuild test reasons (#7703) by @sapphi-red - deps: update crate-ci/typos action to v1.40.1 (#7696) by @renovate[bot] - deps: update oxc to v0.106.0 (#7512) by @renovate[bot] - js: replace dprint with oxfmt (#7214) by @Boshen - deps: update dependency oxlint to v1.36.0 (#7691) by @renovate[bot] - deps: update github-actions (#7679) by @renovate[bot] - deps: update npm packages (#7680) by @renovate[bot] - deps: update rust crates (#7678) by @renovate[bot] - deps: update oxc resolver to v11.16.2 (#7668) by @renovate[bot] - add API reference files to knip entry points (#7669) by @Copilot - deps: update notify (#7651) by @sapphi-red - add `homepage` field to package.json (#7648) by @trivikr - deps: update oxc resolver to v11.16.1 (#7647) by @renovate[bot] - deps: update rolldown-plugin-dts to 0.20.0 (#7645) by @shulaoda Co-authored-by: shulaoda <165626830+shulaoda@users.noreply.github.com>
…ults (#7776) Follow-up to #7677 It seems these are not passing yet. NOTE: I had to use `--no-verify` to workaround oxc-project/oxc#17729

closes #6511
Wait #7655 to be resolved