Skip to content

fix(arborist): propagate overrides through Link nodes to targets#9198

Open
manzoorwanijk wants to merge 3 commits intonpm:latestfrom
manzoorwanijk:fix/linked-overrides-not-propagated
Open

fix(arborist): propagate overrides through Link nodes to targets#9198
manzoorwanijk wants to merge 3 commits intonpm:latestfrom
manzoorwanijk:fix/linked-overrides-not-propagated

Conversation

@manzoorwanijk
Copy link
Copy Markdown
Contributor

@manzoorwanijk manzoorwanijk commented Apr 7, 2026

In continuation of our exploration of using install-strategy=linked in the Gutenberg monorepo, which powers the WordPress Block Editor.

When using install-strategy=linked, npm overrides for transitive dependencies were ignored.
The overridden version was installed but reported as invalid instead of overridden, and with strict-peer-deps the install failed entirely with ERESOLVE.

The root cause is that override propagation stops at Link nodes and never reaches their targets.
Overrides propagate through the tree via addEdgeIn -> updateOverridesEdgeInAdded -> recalculateOutEdgesOverrides.
When a Link node receives overrides, recalculateOutEdgesOverrides iterates over this.edgesOut — but Links have no edgesOut (their targets do).
So overrides never reach the target node's dependency edges, and those edges use rawSpec instead of the overridden spec.

In the linked strategy, all packages in node_modules/ are Links pointing to targets in .store/.
This meant no overrides propagated past the first level of the dependency tree.

The fix overrides recalculateOutEdgesOverrides in the Link class to forward overrides to the target node.
When buildIdealTree creates a root Link (e.g. on macOS where /tmp -> /private/tmp), the target Node is now created with loadOverrides: true so it loads override rules from package.json.

The #applyRootOverridesToWorkspaces workaround method is removed — it was compensating for this exact bug by detaching workspace edges whose specs didn't match. With proper propagation, workspace edges already have the correct overridden spec, making the workaround dead code.

References

Fixes #9197

This method was a workaround for overrides not propagating through Link
nodes to their targets. Now that Link.recalculateOutEdgesOverrides
properly forwards overrides, workspace edges already have the correct
overridden spec, making this detach logic unreachable dead code.
Verifies that when a Link node receives overrides via edgesIn, they are
forwarded to its target node. The target's outgoing edges should use the
overridden spec. Also covers the no-op case when target is null.
@manzoorwanijk manzoorwanijk marked this pull request as ready for review April 7, 2026 02:47
@manzoorwanijk manzoorwanijk requested a review from a team as a code owner April 7, 2026 02:47
@wraithgar
Copy link
Copy Markdown
Member

We are waiting to land any PRs until node ships with a newer version of the cli. CI should be green when that happens.

@wraithgar wraithgar self-assigned this Apr 7, 2026
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] Overrides ignored for transitive dependencies with install-strategy=linked

2 participants