use reqwest::Client;
use serde::{Deserialize, Serialize};
use std::collections::{HashMap, HashSet, VecDeque};
use std::path::PathBuf;
#[derive(Debug, Clone, Deserialize)]
pub struct NpmPackageMetadata {
#[allow(dead_code)]
pub name: String,
#[serde(rename = "dist-tags")]
pub dist_tags: HashMap<String, String>,
pub versions: HashMap<String, NpmVersionInfo>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct NpmVersionInfo {
#[allow(dead_code)]
pub name: String,
pub version: String,
#[serde(default)]
pub dependencies: HashMap<String, String>,
#[serde(rename = "devDependencies", default)]
#[allow(dead_code)]
pub dev_dependencies: HashMap<String, String>,
#[serde(rename = "peerDependencies", default)]
pub peer_dependencies: HashMap<String, String>,
#[serde(rename = "optionalDependencies", default)]
pub optional_dependencies: HashMap<String, String>,
pub dist: NpmDist,
#[serde(default)]
pub bin: Option<serde_json::Value>,
#[serde(default)]
pub os: Option<Vec<String>>,
#[serde(default)]
#[allow(dead_code)]
pub cpu: Option<Vec<String>>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct NpmDist {
pub tarball: String,
pub integrity: Option<String>,
pub shasum: Option<String>,
}
#[derive(Debug, Clone)]
pub struct WorkspacePackageRef {
pub name: String,
pub relative_path: String,
}
#[derive(Debug, Clone, Serialize)]
pub struct ResolvedPackage {
pub pname: String,
pub version: String,
pub url: String,
pub integrity: String,
pub dependencies: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub has_bin: Option<bool>,
}
pub struct ResolutionContext {
pub client: Client,
pub registry: String,
pub platform: String,
pub metadata_cache: HashMap<String, NpmPackageMetadata>,
pub resolved: HashMap<String, ResolvedPackage>,
pub queue: VecDeque<(String, String, bool)>,
pub root_deps: Vec<String>,
pub failed: Vec<(String, String, String)>, pub queued: HashSet<String>,
pub workspace_packages: Vec<WorkspacePackageRef>,
}
impl ResolutionContext {
pub fn new(registry: String, platform: String) -> Self {
Self {
client: Client::new(),
registry,
platform,
metadata_cache: HashMap::new(),
resolved: HashMap::new(),
queue: VecDeque::new(),
root_deps: Vec::new(),
failed: Vec::new(),
queued: HashSet::new(),
workspace_packages: Vec::new(),
}
}
}
#[derive(Debug)]
pub struct NpmAlias {
pub target_package: String,
pub target_constraint: String,
}
#[derive(Debug, Deserialize)]
pub struct BuildManifestEntry {
pub pname: String,
pub version: String,
pub tarball: PathBuf,
#[serde(default)]
pub dependencies: Vec<String>,
#[serde(rename = "hasBin", default)]
pub has_bin: bool,
}
#[derive(Debug, Deserialize)]
pub struct WorkspacePackageEntry {
pub name: String,
pub path: PathBuf,
}
#[derive(Debug, Deserialize)]
pub struct BuildManifest {
pub packages: Vec<BuildManifestEntry>,
#[serde(rename = "workspacePackages", default)]
pub workspace_packages: Vec<WorkspacePackageEntry>,
#[serde(rename = "rootDependencies", default)]
pub root_dependencies: Vec<String>,
}