mod context;
pub mod lockfile;
mod package;
pub use context::NodeWorkspace;
pub use lockfile::{NodeLockDiffParser, NodeLockEntry, NodeLockfile};
pub use package::{NodePackage, parse_dependencies, read_package_name, read_package_version};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum NodePackageManager {
Npm,
Pnpm,
Bun,
}
impl NodePackageManager {
#[must_use]
pub const fn lockfile_name(self) -> &'static str {
match self {
Self::Npm => "package-lock.json",
Self::Pnpm => "pnpm-lock.yaml",
Self::Bun => "bun.lock",
}
}
#[must_use]
pub const fn workspace_config_name(self) -> &'static str {
match self {
Self::Npm | Self::Bun => "package.json",
Self::Pnpm => "pnpm-workspace.yaml",
}
}
#[must_use]
pub const fn display_name(self) -> &'static str {
match self {
Self::Npm => "npm",
Self::Pnpm => "pnpm",
Self::Bun => "bun",
}
}
}
impl std::fmt::Display for NodePackageManager {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.display_name())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_package_manager_lockfile_names() {
assert_eq!(NodePackageManager::Npm.lockfile_name(), "package-lock.json");
assert_eq!(NodePackageManager::Pnpm.lockfile_name(), "pnpm-lock.yaml");
assert_eq!(NodePackageManager::Bun.lockfile_name(), "bun.lock");
}
#[test]
fn test_package_manager_workspace_config() {
assert_eq!(
NodePackageManager::Npm.workspace_config_name(),
"package.json"
);
assert_eq!(
NodePackageManager::Pnpm.workspace_config_name(),
"pnpm-workspace.yaml"
);
assert_eq!(
NodePackageManager::Bun.workspace_config_name(),
"package.json"
);
}
#[test]
fn test_package_manager_display() {
assert_eq!(NodePackageManager::Npm.to_string(), "npm");
assert_eq!(NodePackageManager::Pnpm.to_string(), "pnpm");
assert_eq!(NodePackageManager::Bun.to_string(), "bun");
}
}