fix(plugin/copy-module): honor external resolutions from other plugins#9139
Merged
hyf0 merged 2 commits intorolldown:mainfrom Apr 17, 2026
Merged
Conversation
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.
✅ Deploy Preview for rolldown-rs canceled.
|
Merging this PR will not alter performance
Comparing Footnotes
|
Member
hyf0
reviewed
Apr 17, 2026
Closed
This was referenced Apr 22, 2026
Closed
Merged
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
When another plugin resolves a specifier and marks it
external: true,CopyModulePlugin::resolve_idwas ignoring the flag and attempting to red the id, producingFailed to read copy module <id>.This surfaces with
rolldown-plugin-dts, which returns ambient-module glob specifiers such astypeof import("*.jpg")as external. If.jpgis also configured asmoduleTypes: copy, the copy plugin invokesctx.resolve, which runs the dts resolver, gets back{ id: "*.jpg", external: true }, and then crashes trying to read*.jpgoff disk.Real world example: alveusgg/data#265