Skip to content

fix(plugin/copy-module): honor external resolutions from other plugins#9139

Merged
hyf0 merged 2 commits intorolldown:mainfrom
TheAlexLichter:fix/copy-module-tolerate-missing
Apr 17, 2026
Merged

fix(plugin/copy-module): honor external resolutions from other plugins#9139
hyf0 merged 2 commits intorolldown:mainfrom
TheAlexLichter:fix/copy-module-tolerate-missing

Conversation

@TheAlexLichter
Copy link
Copy Markdown
Collaborator

@TheAlexLichter TheAlexLichter commented Apr 16, 2026

When another plugin resolves a specifier and marks it external: true, CopyModulePlugin::resolve_id was ignoring the flag and attempting to red the id, producing Failed to read copy module <id>.

This surfaces with rolldown-plugin-dts, which returns ambient-module glob specifiers such as typeof import("*.jpg") as external. If .jpg is also configured as moduleTypes: copy, the copy plugin invokes ctx.resolve, which runs the dts resolver, gets back { id: "*.jpg", external: true }, and then crashes trying to read *.jpg off disk.

Real world example: alveusgg/data#265

When another plugin resolves a specifier and marks it `external: true`,
`CopyModulePlugin::resolve_id` was ignoring the flag and attempting to
`tokio::fs::read` the id, producing `Failed to read copy module <id>`.

This surfaces with `rolldown-plugin-dts`, which returns ambient-module
glob specifiers such as `typeof import("*.jpg")` as external. If `.jpg`
is also configured as `moduleTypes: copy`, the copy plugin (running
`resolve_id` pre) invokes `ctx.resolve` — which runs the dts resolver —
gets back `{ id: "*.jpg", external: true }`, and then crashes trying to
read `*.jpg` off disk.

Fix: check `ResolvedId::external.is_external()` and bail out. The
`AssetModulePlugin` counterpart is not affected because it hooks `load`,
which rolldown skips for external ids.

Added a regression test in `packages/rolldown/tests/builtin-plugin/`
using a user plugin that mimics the dts-plugin behavior.
@netlify
Copy link
Copy Markdown

netlify Bot commented Apr 16, 2026

Deploy Preview for rolldown-rs canceled.

Name Link
🔨 Latest commit 5d3b41c
🔍 Latest deploy log https://app.netlify.com/projects/rolldown-rs/deploys/69e1b6f3d62d1f0008d846af

@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented Apr 16, 2026

Merging this PR will not alter performance

✅ 4 untouched benchmarks
⏩ 10 skipped benchmarks1


Comparing TheAlexLichter:fix/copy-module-tolerate-missing (5d3b41c) with main (77c7542)

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.

@IWANABETHATGUY
Copy link
Copy Markdown
Member

@shulaoda @hyf0 I am not familiar with this plugin. Could you help review this PR?

Comment thread crates/rolldown_plugin_copy_module/src/lib.rs
Copy link
Copy Markdown
Member

@hyf0 hyf0 left a comment

Choose a reason for hiding this comment

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

Well done!

@hyf0 hyf0 enabled auto-merge (squash) April 17, 2026 04:28
@hyf0 hyf0 merged commit 8559e64 into rolldown:main Apr 17, 2026
31 checks passed
@github-actions github-actions Bot mentioned this pull request Apr 22, 2026
This was referenced Apr 22, 2026
shulaoda added a commit that referenced this pull request Apr 22, 2026
## [1.0.0-rc.17] - 2026-04-22

### 🐛 Bug Fixes

- link: error on missing export between TS modules (#9197) by @IWANABETHATGUY
- rolldown_plugin_vite_import_glob: import path should not be affected by absolute base option (#9145) by @kermanx
- `this.resolve()` returns null for bare relative paths without importer (#9142) by @Copilot
- collect destructured bindings in HMR module exports (#9146) by @h-a-n-a
- esbuild-tests: handle 0.28.0 test cases (#9149) by @sapphi-red
- plugin/copy-module: honor external resolutions from other plugins (#9139) by @TheAlexLichter
- allow undefined in sourcesContent type (#9136) by @jurijzahn8019
- reduce false positives in chunk optimizer circular dependency detection (#9049) by @AlonMiz

### 🚜 Refactor

- chunk-optimizer: extract runtime-module placement into rehome_runtime_module (#9163) by @IWANABETHATGUY

### 📚 Documentation

- add design doc for sort_modules execution ordering (#9169) by @IWANABETHATGUY
- add document for `RenderedModule` (#9147) by @sapphi-red

### ⚡ Performance

- rolldown_plugin_vite_import_glob: skip self-import earlier using raw path comparison (#9193) by @shulaoda

### 🧪 Testing

- lazy: add `playground/lazy-compilation` (#7974) by @hyf0

### ⚙️ Miscellaneous Tasks

- use app token for release PR (#9198) by @Boshen
- upgrade oxc to 0.127.0 (#9194) by @Dunqing
- use oxc security action (#9196) by @Boshen
- esbuild-tests: remove some tests from ignored list as enum inline is now supported (#9184) by @sapphi-red
- deps: update dependency vite-plus to v0.1.19 (#9183) by @renovate[bot]
- use vp instead of pnpm in check-wasi-binding-deps (#9182) by @shulaoda
- verify wasm32-wasi binding deps match @rolldown/browser before publish (#9162) by @shulaoda
- deps: update esbuild for tests to 0.28.0 (#9172) by @sapphi-red
- deps: update rollup submodule for tests to v4.60.2 (#9173) by @sapphi-red
- deps: update test262 submodule for tests (#9174) by @sapphi-red
- sort_modules: fix stale async-entry sort key comment (#9170) by @IWANABETHATGUY
- deps: update npm packages (#9157) by @renovate[bot]
- deps: update dependency diff to v9 (#9158) by @renovate[bot]
- deps: update rust crates (#9156) by @renovate[bot]
- run Windows CI on PRs labeled with `ci: windows` (#9153) by @hyf0
- update-test-dependencies: run setup-rust before file changes (#9151) by @sapphi-red
- deps: update dependency rust to v1.95.0 (#9140) by @renovate[bot]

### ❤️ New Contributors

* @jurijzahn8019 made their first contribution in [#9136](#9136)
* @AlonMiz made their first contribution in [#9049](#9049)

---------

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.

4 participants