Skip to content

fix: Panic on reexport external module in CJS format#5430

Merged
IWANABETHATGUY merged 1 commit intomainfrom
07-24-fix_5044
Jul 25, 2025
Merged

fix: Panic on reexport external module in CJS format#5430
IWANABETHATGUY merged 1 commit intomainfrom
07-24-fix_5044

Conversation

@IWANABETHATGUY
Copy link
Member

@IWANABETHATGUY IWANABETHATGUY commented Jul 25, 2025

Description

Here is a minimum reproduction:

// main.js
exoprt {createContext} from './lib.js'


// lib.js
export {createContext} from 'preact' // preact is a external module
image

after canonical_ref the createContext imported by main.js final pointed the symbol createContext exported by external module preact, so we need to generate code like:

Object.defineProperty(exports, 'createContext', {
  enumerable: true,
  get: function () {
    return ${external_preact_namespace_deconflicted_name}.createContext;
  }
});

When there is only one chunk we could reuse the name(generated by lib.js, for now we only record the external module that is directly imported by the module),

module.named_imports.iter().for_each(|(_, import)| {
let rec = &module.import_records[import.record_id];
if let Module::External(importee) = &self.link_output.module_table[rec.resolved_module]
{
imports_from_external_modules.entry(importee.idx).or_default().push(import.clone());
}
});

But when you enabled preserveModules or use advancedChunks split the two modules into two chunks,
main.js can't find deconflicted_name of preact(because it did not directly import preact), then it will panic.

  1. related [Bug]: Panic on preserveModules + CJS #5044
  2. related Failed to bundle vfile in cjs format #4585

This pr resovled the panic in both of the two issues above, left adding __toESM wrapper to require('external') in next pr.

Copy link
Member Author

This stack of pull requests is managed by Graphite. Learn more about stacking.

@netlify
Copy link

netlify bot commented Jul 25, 2025

Deploy Preview for rolldown-rs canceled.

Name Link
🔨 Latest commit b41b473
🔍 Latest deploy log https://app.netlify.com/projects/rolldown-rs/deploys/688384656daff200082a8c7d

@github-actions
Copy link
Contributor

github-actions bot commented Jul 25, 2025

Benchmarks Rust

group                                                        pr                                     target
-----                                                        --                                     ------
bundle/bundle@multi-duplicated-top-level-symbol              1.00     76.8±1.57ms        ? ?/sec    1.00     76.5±1.66ms        ? ?/sec
bundle/bundle@multi-duplicated-top-level-symbol-sourcemap    1.00     87.3±1.35ms        ? ?/sec    1.02     89.1±3.14ms        ? ?/sec
bundle/bundle@rome_ts                                        1.00    114.7±4.11ms        ? ?/sec    1.00    114.4±2.62ms        ? ?/sec
bundle/bundle@rome_ts-sourcemap                              1.00    137.1±1.76ms        ? ?/sec    1.00    136.9±1.68ms        ? ?/sec
bundle/bundle@threejs                                        1.02     42.2±2.35ms        ? ?/sec    1.00     41.3±1.08ms        ? ?/sec
bundle/bundle@threejs-sourcemap                              1.00     51.7±0.88ms        ? ?/sec    1.00     51.6±0.79ms        ? ?/sec
bundle/bundle@threejs10x                                     1.00    440.2±5.46ms        ? ?/sec    1.00    439.5±5.23ms        ? ?/sec
bundle/bundle@threejs10x-sourcemap                           1.00    526.2±2.92ms        ? ?/sec    1.00    524.6±6.97ms        ? ?/sec
scan/scan@rome_ts                                            1.00     88.9±2.42ms        ? ?/sec    1.00     89.1±1.31ms        ? ?/sec
scan/scan@threejs                                            1.00     30.8±0.47ms        ? ?/sec    1.02     31.4±1.92ms        ? ?/sec
scan/scan@threejs10x                                         1.00    322.8±3.33ms        ? ?/sec    1.00    323.7±3.28ms        ? ?/sec

@IWANABETHATGUY IWANABETHATGUY force-pushed the 07-24-fix_5044 branch 7 times, most recently from fd0b976 to e10c789 Compare July 25, 2025 13:13
@IWANABETHATGUY IWANABETHATGUY changed the title fix: 5044 fix: Panic on preserveModules + CJS Jul 25, 2025
@IWANABETHATGUY IWANABETHATGUY marked this pull request as ready for review July 25, 2025 13:25
@Brooooooklyn
Copy link
Member

cursor review verbose=true

@cursor
Copy link

cursor bot commented Jul 25, 2025

Bugbot request id: serverGenReqId_dea4073a-cd30-4102-b678-0bdaa0ad6923

@cursor
Copy link

cursor bot commented Jul 25, 2025

🚨 Bugbot couldn't run

Something went wrong. Try again by commenting "Cursor review" or "bugbot run", or contact support (requestId: serverGenReqId_dea4073a-cd30-4102-b678-0bdaa0ad6923).

@IWANABETHATGUY IWANABETHATGUY changed the title fix: Panic on preserveModules + CJS fix: Panic on reexport external module in CJS format Jul 25, 2025
@IWANABETHATGUY IWANABETHATGUY added this pull request to the merge queue Jul 25, 2025
Merged via the queue into main with commit fbd59d3 Jul 25, 2025
28 checks passed
@IWANABETHATGUY IWANABETHATGUY deleted the 07-24-fix_5044 branch July 25, 2025 17:36
Boshen pushed a commit that referenced this pull request Jul 30, 2025
## [1.0.0-beta.30] - 2025-07-30

### 💥 BREAKING CHANGES

- rolldown: remove unfinished module federation support (#5471) by @Boshen
- disable `strictExecutionOrder` by default (#5436) by @hyf0

### 🚀 Features

- hmr: multiple changes should result to multiple updates (#5500) by @hyf0
- binding: add memory adjustment hint in fn write (#5375) by @Brooooooklyn
- store sideEffects information about global var access (#5495) by @IWANABETHATGUY
- merge side effects detail (#5486) by @IWANABETHATGUY
- plugin/vite-resolve: add warn / debug logs (#5476) by @sapphi-red
- plugin/vite-resolve: avoid wrapping errors with napi errors (#5483) by @sapphi-red
- add `this.fs` support (#5475) by @sapphi-red
- rolldown_plugin_asset: align `generate_bundle` logic (#5480) by @shulaoda
- hmr: prepare to launch that batched edits should result to multiple hmr output (#5458) by @hyf0
- hmr: support `import.meta.hot.invalidate` (#5457) by @hyf0
- mark all `toESM` as pure (#5461) by @IWANABETHATGUY
- rolldown_plugin_asset: align load hook logic (#5452) by @shulaoda
- rolldown_plugin_utils: align `file_to_built_url` (#5450) by @shulaoda
- rolldown_plugin_utils: align `should_inline` logic (#5308) by @AliceLanniste
- rolldown_plugin_asset: add partial `file_to_built_url` support (#5445) by @shulaoda
- expose `optimization.pifeForModuleWrappers` option (#5433) by @sapphi-red
- add `optimization.pifeForModuleWrappers` option (#5432) by @sapphi-red
- use PIFE for callback passed to `createCjsInitializer` (#5427) by @sapphi-red
- use PIFE for callbacks passed to `__commonJSMin` / `_commonJS` wrapper (#5426) by @sapphi-red
- use PIFE for callback passed to `createEsmInitializer` (#5425) by @sapphi-red
- use PIFE for callbacks passed to `__esm` wrapper (#5424) by @sapphi-red
- use PIFE for callbacks passed to `__esmMin` wrapper (#5319) by @sapphi-red
- rolldown: oxc v0.78.0 (#5421) by @Boshen
- rolldown: support `output.sourcemapBaseUrl` (#5413) by @situ2001
- mark all `__commonJS` CallExpression as **Pure** (#5419) by @IWANABETHATGUY
- rolldown_plugin_alias: warn if alias resolves to non-absolute path (#5417) by @shulaoda
- rolldown_plugin_asset: align `encode_uri_path` logic (#5410) by @shulaoda
- add warning and conversion for `import.meta` for non-`esm` output format (#5378) by @7086cmd

### 🐛 Bug Fixes

- use uuid_v4 to generate unique id for hook calls (#5501) by @hyf0
- modules that are sideeffect free but relies on the execution order is not wrapped (#5498) by @IWANABETHATGUY
- missing_export warning should not be an hard error (#5493) by @sapphi-red
- cli: remove unnecessary `await` (#5487) by @situ2001
- browser: stub fs/promises for browser build (#5484) by @sapphi-red
- indirect requiring external module  is not wrapped by `__toESM` in cjs format (#5454) by @IWANABETHATGUY
- Panic on reexport external module in  CJS format (#5430) by @IWANABETHATGUY
- handle top-level return statements in CommonJS modules (#5437) by @hyf0
- panic when using preserveModules: true and certain dependencies (#5415) by @IWANABETHATGUY
- rolldown_plugin_alias: only replace the first matched alias (#5412) by @shulaoda
- canonical name not found panic happens with treeshake.commonjs=true (#5409) by @IWANABETHATGUY
- hmr: shouldn't consider self-accepting module as hmr boundary for its importee (#5405) by @hyf0
- hmr: should detect hmr boundary correctly (#5400) by @hyf0
- optimization.inlineConst: true generates invalid code when importing a module statically and dynamically (#5398) by @IWANABETHATGUY
- top level VarDeclaration is not hoisted when wrapped in `__esm` (#5396) by @IWANABETHATGUY

### 🚜 Refactor

- use pascal case when naming bitflags field (#5497) by @IWANABETHATGUY
- test/hmr: use sensible time to wait (#5490) by @hyf0
- hmr: update message types to use 'hmr:update' (#5489) by @hyf0
- hmr: replace `HmrOutput` with `HmrUpdate` (#5488) by @hyf0
- node/hmr: re-organize file structures (#5485) by @hyf0
- rolldown_plugin_utils: improve `asset_to_data_url` (#5481) by @shulaoda
- replace pattern match for SideEffectsDetail with bitflags api (#5479) by @IWANABETHATGUY
- rename stmtSideEffect to SideEffectDetail (#5478) by @IWANABETHATGUY
- use bitflags store more details about side effects (#5477) by @IWANABETHATGUY
- node/hmr: tweak package `test-dev-server` (#5462) by @hyf0
- hmr: tweak naming and add comments (#5459) by @hyf0
- test/hmr: remove hard-code edited content (#5189) by @hyf0
- rust: make `Log#code` an `Option` (#5416) by @shulaoda
- hmr: should mark self-accept module correctly (#5406) by @hyf0
- hmr: remove unnecessary data during `propagate_update` (#5402) by @hyf0
- hmr: make hmr patch output less changeable (#5401) by @hyf0
- `__esm` top level bindings hoisted (#5397) by @IWANABETHATGUY
- skip fast in  esm format when transform import.meta (#5395) by @IWANABETHATGUY

### 📚 Documentation

- clarify rolldown-rollup behavior difference around output generation (#5439) by @sapphi-red

### ⚡ Performance

- reduce runtime symbol memory usage and hashtable lookup (#5460) by @IWANABETHATGUY

### 🧪 Testing

- hmr: support to run mutiple test fixtures (#5456) by @hyf0
- basic tests for `optimization.pifeForModuleWrappers` (#5435) by @sapphi-red

### ⚙️ Miscellaneous Tasks

- deps: update github-actions (#5509) by @renovate[bot]
- debug: update default session ID to meaningful `unknown-session` (#5502) by @hyf0
- deps: update dependency rolldown-plugin-dts to v0.14.2 (#5492) by @renovate[bot]
- auto generated runtime_helper bitflags (#5474) by @IWANABETHATGUY
- fix wasi build failed (#5470) by @IWANABETHATGUY
- deps: lock file maintenance (#5467) by @renovate[bot]
- deps: lock file maintenance (#5466) by @renovate[bot]
- deps: lock file maintenance rust crates (#5465) by @renovate[bot]
- deps: lock file maintenance npm packages (#5464) by @renovate[bot]
- deps: update github-actions (#5463) by @renovate[bot]
- export `__commonJSMin` in runtime-base.js (#5455) by @IWANABETHATGUY
- rolldown_plugin_utils: remove `file_to_dev_url` temporarily (#5446) by @shulaoda
- rolldown_plugin_asset: move `remove_url_query` into `rolldown_plugin_utils` (#5444) by @shulaoda
- rolldown: disable aarch64 atomics (#5447) by @Brooooooklyn
- remove diff with esbuild (#5428) by @IWANABETHATGUY
- dx/ai: add deepwiki badge to enable automatic refresh (#5423) by @hyf0
- dx/ai: Use `.cursorignore` to ignore meaningless files for AI (#5422) by @hyf0
- rolldown_plugin_alias: inline matches and remove redundant comment (#5418) by @shulaoda
- rolldown_plugin_asset: remove unnecessary comments (#5411) by @shulaoda
- rolldown_plugin_manifest: remove unnecessary code (#5408) by @shulaoda
- deps: update dependency tsdown to v0.13.0 (#5392) by @renovate[bot]
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