Skip to content

fix: this.resolve() returns null for bare relative paths without importer#9142

Merged
shulaoda merged 3 commits intomainfrom
copilot/fix-null-return-for-relative-paths
Apr 19, 2026
Merged

fix: this.resolve() returns null for bare relative paths without importer#9142
shulaoda merged 3 commits intomainfrom
copilot/fix-null-return-for-relative-paths

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 17, 2026

When calling this.resolve('src/index.ts') (bare relative path, no ./ prefix) from a plugin hook without an importer, Rolldown returns null. Rollup resolves such paths against CWD, which is the expected behavior.

Root cause

try_rollup_compatibility_resolve — which handles CWD-relative fallback resolution — was gated on is_user_defined_entry. Plugin this.resolve() calls go through NativePluginContextImpl::resolve(), which hardcodes is_user_defined_entry = false, so the fallback was never triggered.

Rollup's built-in resolver skips bare specifiers only when an importer is present:

if (importer !== undefined && !isAbsolute(source) && source[0] !== '.') return null;
// No importer → falls through to path.resolve(source) → <cwd>/src/index.ts

Fix

Extend the condition in Resolver::resolve to also apply the compatibility fallback when importer is None, regardless of is_user_defined_entry:

// Before
if resolution.is_err() && is_user_defined_entry {

// After
if resolution.is_err() && (is_user_defined_entry || importer.is_none()) {

This covers both user-defined entries ({ input: 'main' }) and plugin-initiated this.resolve() calls without an importer — both are semantically entry-level resolves with no relative base.

Test

Added an integration test that calls ctx.resolve("src/lib.js", None, None) from buildStart and asserts it resolves to <cwd>/src/lib.js.

@netlify
Copy link
Copy Markdown

netlify Bot commented Apr 17, 2026

Deploy Preview for rolldown-rs canceled.

Name Link
🔨 Latest commit 12c1f4c
🔍 Latest deploy log https://app.netlify.com/projects/rolldown-rs/deploys/69e56a2792d08e00087b8783

Copilot AI changed the title [WIP] Fix null return for bare relative paths in resolve method fix: this.resolve() returns null for bare relative paths without importer Apr 17, 2026
Copilot AI requested a review from shulaoda April 17, 2026 00:18
@shulaoda shulaoda force-pushed the copilot/fix-null-return-for-relative-paths branch from f42131a to cc2437f Compare April 17, 2026 00:39
@shulaoda shulaoda marked this pull request as ready for review April 17, 2026 00:39
@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented Apr 17, 2026

Merging this PR will not alter performance

✅ 4 untouched benchmarks
⏩ 10 skipped benchmarks1


Comparing copilot/fix-null-return-for-relative-paths (12c1f4c) with main (bd417f2)

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.

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.

Nice!

@shulaoda shulaoda merged commit 49ee002 into main Apr 19, 2026
32 checks passed
@shulaoda shulaoda deleted the copilot/fix-null-return-for-relative-paths branch April 19, 2026 23:56
@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.

[Bug]: this.resolve() returns null for bare relative paths (e.g. await this.resolve("src/index.ts")) without importer

3 participants