Skip to content

fix(ExportsFieldPlugin): prevent fallback to parent node_modules when exports target is missing#495

Merged
alexander-akait merged 1 commit intomainfrom
fix/exports-field-no-parent-fallback
Mar 17, 2026
Merged

fix(ExportsFieldPlugin): prevent fallback to parent node_modules when exports target is missing#495
alexander-akait merged 1 commit intomainfrom
fix/exports-field-no-parent-fallback

Conversation

@xiaoxiaojx
Copy link
Copy Markdown
Member

@xiaoxiaojx xiaoxiaojx commented Mar 17, 2026

Summary
fixes #399

When a package's exports field maps a request to a target file that does not exist on disk, resolution was incorrectly falling back to parent node_modules directories. This violated the Node.js ESM spec (issue #399).

Root cause: ExportsFieldPlugin returned null on failure, which Resolver.doResolve converted to undefined, signalling ModulesInHierarchicalDirectoriesPlugin to continue searching up the directory tree instead of stopping.

Fix: return an explicit error from the exports field processing callback when a match was found but no valid target file could be resolved, preventing any further directory traversal.

What kind of change does this PR introduce?
fix

Did you add tests for your changes?
Yes

Does this PR introduce a breaking change?
No

If relevant, what needs to be documented once your changes are merged or what have you already documented?
Nothing

Use of AI
Partial

… exports target is missing

When a package's exports field maps a request to a target file that does not
exist on disk, resolution was incorrectly falling back to parent node_modules
directories. This violated the Node.js ESM spec (issue #399).

Root cause: ExportsFieldPlugin returned null on failure, which Resolver.doResolve
converted to undefined, signalling ModulesInHierarchicalDirectoriesPlugin to
continue searching up the directory tree instead of stopping.

Fix: return an explicit error from the exports field processing callback when
a match was found but no valid target file could be resolved, preventing any
further directory traversal.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Mar 17, 2026

🦋 Changeset detected

Latest commit: 92c497e

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
enhanced-resolve Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@codecov
Copy link
Copy Markdown

codecov bot commented Mar 17, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 93.43%. Comparing base (ebc67d3) to head (92c497e).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #495      +/-   ##
==========================================
+ Coverage   93.42%   93.43%   +0.01%     
==========================================
  Files          50       50              
  Lines        2511     2515       +4     
  Branches      766      767       +1     
==========================================
+ Hits         2346     2350       +4     
  Misses        136      136              
  Partials       29       29              
Flag Coverage Δ
integration 93.43% <100.00%> (+0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@alexander-akait alexander-akait merged commit 56c87ce into main Mar 17, 2026
55 of 60 checks passed
@alexander-akait alexander-akait deleted the fix/exports-field-no-parent-fallback branch March 17, 2026 10:48
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.

ESM: Resolving to the wrong package with exports and nested same package but different versions

2 participants