Expand description
Workspace and dependency resolution for cuenv across multiple package managers.
This crate provides trait-based abstractions for discovering, parsing, and resolving workspace configurations and dependencies across different package managers including npm, Bun, pnpm, Yarn (Classic and Modern), and Cargo.
§Architecture
The crate is built around three core traits:
WorkspaceDiscovery- Discovers workspace configuration from a root directoryLockfileParser- Parses lockfiles into structured entriesDependencyResolver- Builds dependency graphs from workspace and lockfile data
§Workspace Discovery
The discovery module provides implementations for finding workspace members from configuration files.
§Feature flags
§Discovery Features
discovery-javascript- Enables npm, Bun, Yarn, and pnpm workspace discovery (enabled by default)discovery-rust- Enables Cargo workspace discovery
§Fine-grained Discovery Features
For minimal dependency footprint:
discovery-package-json- npm/Bun/Yarn discovery viapackage.jsondiscovery-pnpm- pnpm discovery viapnpm-workspace.yamldiscovery-cargo- Cargo discovery viaCargo.toml
§Default Features
The crate enables the following features by default:
detection- Package manager detection from lockfiles and commandsparsers-javascript- All JavaScript lockfile parsersdiscovery-javascript- All JavaScript workspace discoveries
This provides a complete out-of-the-box experience for JavaScript/TypeScript projects. To minimize dependencies for Rust-only or specialized use cases, disable default features:
[dependencies]
cuenv-workspaces = { version = "...", default-features = false, features = ["discovery-rust"] }§Discovery Behavior for Edge Cases
§Cargo (CargoTomlDiscovery)
- Missing
[workspace]section: Treated as a valid empty workspace (single-package repository). Discovery succeeds with zero members. - Missing or malformed member manifests: Silently skipped during member enumeration. Only valid, parseable members are included in the result.
§JavaScript (PackageJsonDiscovery, PnpmWorkspaceDiscovery)
- Missing or malformed member manifests: Silently skipped during member enumeration.
Only valid, parseable members with a
namefield are included in the result.
This tolerant behavior ensures that discovery does not fail due to individual member issues, allowing partial workspace analysis to proceed.
§Usage examples
use cuenv_workspaces::{PackageJsonDiscovery, WorkspaceDiscovery};
use std::path::Path;
let root = Path::new(".");
let discovery = PackageJsonDiscovery;
if let Ok(workspace) = discovery.discover(root) {
println!("Found workspace with {} members", workspace.member_count());
}§Example
use cuenv_workspaces::{WorkspaceDiscovery, PackageManager, Workspace};
use std::path::Path;
// Discover a workspace
let root = Path::new("/path/to/workspace");
let workspace = some_discovery_impl.discover(root)?;
// Access workspace information
println!("Found {} members", workspace.member_count());
for member in &workspace.members {
println!(" - {} at {}", member.name, member.path.display());
}§Core Types
Workspace- Represents a discovered workspace with all its membersWorkspaceMember- Represents a single package/crate in the workspacePackageManager- Identifies the package manager in useDependencySpec- Describes how a dependency is specifiedLockfileEntry- Represents a resolved dependency from a lockfile
§Package Manager Detection
The detection module provides automatic package manager detection by scanning for lockfiles and workspace configurations:
use cuenv_workspaces::detect_package_managers;
use std::path::Path;
let root = Path::new("/path/to/workspace");
let managers = detect_package_managers(root)?;
for manager in managers {
println!("Detected: {}", manager);
}You can also detect package managers from command strings:
use cuenv_workspaces::detect_from_command;
if let Some(manager) = detect_from_command("cargo build") {
println!("Command uses: {}", manager);
}§Lockfile Parsers
The parsers module provides implementations for parsing various package manager lockfiles. Each parser is gated behind a feature flag to minimize binary size.
§Recommended feature flags
Use these aggregate features to enable all parsers for an ecosystem:
parsers-javascript- Enables all JavaScript parsers (npm, bun, pnpm, yarn classic, yarn modern)parsers-rust- Enables all Rust parsers (currently only Cargo)
§Fine-grained feature flags
For minimal dependency footprint, you can enable individual parsers:
parser-npm- npm’spackage-lock.json(v3)parser-bun- Bun’sbun.lock(JSONC format)parser-pnpm- pnpm’spnpm-lock.yamlparser-yarn-classic- Yarn Classic (v1.x)yarn.lockparser-yarn-modern- Yarn Modern (v2+)yarn.lockparser-cargo- Cargo’sCargo.lock
§Usage examples
use cuenv_workspaces::{NpmLockfileParser, LockfileParser};
use std::path::Path;
let parser = NpmLockfileParser;
let entries = parser.parse(Path::new("package-lock.json"))?;
for entry in entries {
println!("{} @ {}", entry.name, entry.version);
}use cuenv_workspaces::{CargoLockfileParser, LockfileParser};
use std::path::Path;
let parser = CargoLockfileParser;
let entries = parser.parse(Path::new("Cargo.lock"))?;
for entry in entries {
println!("{} @ {}", entry.name, entry.version);
}Re-exports§
pub use core::DependencyRef;pub use core::DependencySource;pub use core::DependencySpec;pub use core::LockfileEntry;pub use core::PackageManager;pub use core::Version;pub use core::VersionReq;pub use core::Workspace;pub use core::WorkspaceMember;pub use core::DependencyResolver;pub use core::LockfileParser;pub use core::WorkspaceDiscovery;pub use resolver::GenericDependencyResolver;pub use error::Error;pub use error::Result;pub use detection::detect_from_command;pub use detection::detect_package_managers;pub use detection::detect_with_command_hint;pub use discovery::PackageJsonDiscovery;pub use discovery::PnpmWorkspaceDiscovery;pub use parsers::javascript::BunLockfileParser;pub use parsers::javascript::NpmLockfileParser;pub use parsers::javascript::PnpmLockfileParser;pub use parsers::javascript::YarnClassicLockfileParser;pub use parsers::javascript::YarnModernLockfileParser;
Modules§
- core
- Core abstractions for workspace and dependency resolution.
- detection
- Package manager detection module.
- discovery
- Workspace discovery implementations for various package managers.
- error
- Error types for workspace operations.
- materializer
- Materialization of dependencies into execution environments.
- parsers
- Parser implementations for converting package-manager lockfiles into
LockfileEntrystructs. - resolver
- Dependency resolution implementation for workspaces.