Skip to content

fix(arborist): load transitive optional deps into linked actual tree#9665

Merged
owlstronaut merged 1 commit into
release/v11from
backport/v11/9654
Jun 25, 2026
Merged

fix(arborist): load transitive optional deps into linked actual tree#9665
owlstronaut merged 1 commit into
release/v11from
backport/v11/9654

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Backport of #9654 to release/v11.

…9654)

In continuation of our exploration of using `install-strategy=linked` in
the [Gutenberg
monorepo](WordPress/gutenberg#75814), which
powers the WordPress Block Editor.

Under `install-strategy=linked`, an installed transitive optional
dependency was missing from the actual tree built by `loadActual` when
scanning the filesystem (`forceActual: true`), the path `npm sbom` and
`npm query` use. On disk the dep is correct — extracted in `.store` and
symlinked as a store sibling of its consumer — but `npm sbom` omitted it
(e.g. `chokidar` → `fsevents`: 14 components vs the hoisted strategy's
15; `esbuild` → `@esbuild/darwin-arm64` likewise).

In `#findMissingEdges()`, the skip condition treated an edge as already
resolved when `!edge.missing`. An unresolved optional edge has no target
yet reports `missing === false` (`Edge.error` returns `null` for an
optional edge with no target), so it was skipped and the on-disk store
sibling was never walked or loaded.

This changes the check to walk any edge whose target is unresolved,
including optional ones. The walk only loads a package that actually
exists in an ancestor `node_modules`, so genuinely-uninstalled optionals
(impossible platform) stay absent, and behavior is unchanged for
required, missing, dummy, and hoisted-ancestor edges. The linked SBOM
now matches the hoisted strategy.

## References

Fixes #9627

(cherry picked from commit 6a5bf26)
@owlstronaut owlstronaut merged commit f580889 into release/v11 Jun 25, 2026
50 checks passed
@owlstronaut owlstronaut deleted the backport/v11/9654 branch June 25, 2026 18:01
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.

2 participants