pub struct PeerContextOptions {
pub dedupe_peer_dependents: bool,
pub dedupe_peers: bool,
pub resolve_from_workspace_root: bool,
pub peers_suffix_max_length: usize,
}Expand description
Walk the resolved graph top-down from each importer and compute a
peer-dependency context for every package, producing a new graph whose
dep_paths carry pnpm-style (peer@ver) suffixes.
The goal is parity with pnpm’s v9 lockfile output: the same
name@version can appear multiple times — once per distinct set of peer
resolutions — so different subtrees that pin incompatible peers get
isolated virtual-store entries and truly different sibling-symlink
neighborhoods.
Algorithm per visited package P, reached at some point in a DFS from an
importer with ancestor_scope: name -> dep_path_tail:
- For each peer name declared by P, look it up in
ancestor_scope(nearest-ancestor-wins, since the scope is rebuilt per recursion). If missing, fall back to P’s own entry independencies— the BFS enqueue above auto-installed it as a transitive, which matches pnpm’sauto-install-peers=truedefault. - Sort the (peer_name, resolution) pairs and serialize as
(n1@v1)(n2@v2)…for the suffix. - Produce a contextualized dep_path
name@version{suffix}. If that key is already inout_packages(or currently on the DFS stack viavisiting), short-circuit — we’ve already emitted this variant. - Build a new scope for P’s children by merging the ancestor scope
with P’s own
dependencies(rewritten to point at contextualized children) and the resolved peer map. Recurse. - Emit the contextualized LockedPackage.
Cycles: protected by visiting — if a package is re-entered via a
dependency cycle, we return the already-computed dep_path without
recursing again. The peer context is fixed at first visit; any cycle
traversal uses whatever context was live at that first visit.
Nested peer suffixes: pnpm writes (react-dom@18.2.0(react@18.2.0))
when a declared peer has its own resolved peers. A single top-down
DFS pass can’t produce that form, because when a parent P records
a peer version in its children’s scope, it only knows the canonical
tail — the peer’s OWN suffix is computed later when the peer itself
gets visited. We solve this by running apply_peer_contexts_once in
a fixed-point loop: the second iteration’s input has Pass 1’s
contextualized tails in every pkg.dependencies map, so when a
descendant looks a peer up in ancestor scope it sees the full
nested tail and serializes it as such. Most peer chains converge in
2–3 iterations; we cap at 16 as a safety belt.
Limitations (documented as follow-ups in the README):
- No per-peer range satisfaction — we take whatever the ancestor has, even if it technically doesn’t match P’s declared peer range.
Knobs controlling the peer-context pass. Plumbed from four
pnpm-compatible settings (dedupe-peer-dependents, dedupe-peers,
resolve-peers-from-workspace-root, peers-suffix-max-length)
through the Resolver’s with_* setters.
Fields§
§dedupe_peer_dependents: boolWhen true, run the cross-subtree peer-variant collapse pass after every iteration of the fixed-point loop. Matches pnpm’s default.
dedupe_peers: boolWhen true, emit suffixes as (version) instead of
(name@version). Affects both the package key, the reference
tails stored in dependencies, and the cycle-break form of
contains_canonical_back_ref.
resolve_from_workspace_root: boolWhen true, unresolved peers can be satisfied by a dep declared
at the root importer (".") even if no ancestor scope carries
the peer. Runs between own-deps and graph-wide scan in the
peer-context visitor — see visit_peer_context in this
module for the owning implementation (intentionally crate-
private; the public API here is the option flag itself).
peers_suffix_max_length: usizeByte cap on the peer-ID suffix after which the entire suffix
is hashed to _<10-char-sha256-hex>. pnpm’s default is 1000.
Trait Implementations§
Source§impl Clone for PeerContextOptions
impl Clone for PeerContextOptions
Source§fn clone(&self) -> PeerContextOptions
fn clone(&self) -> PeerContextOptions
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for PeerContextOptions
impl Debug for PeerContextOptions
Source§impl Default for PeerContextOptions
impl Default for PeerContextOptions
impl Copy for PeerContextOptions
Auto Trait Implementations§
impl Freeze for PeerContextOptions
impl RefUnwindSafe for PeerContextOptions
impl Send for PeerContextOptions
impl Sync for PeerContextOptions
impl Unpin for PeerContextOptions
impl UnsafeUnpin for PeerContextOptions
impl UnwindSafe for PeerContextOptions
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more