diff options
Diffstat (limited to 'cli/npm/resolution.rs')
-rw-r--r-- | cli/npm/resolution.rs | 62 |
1 files changed, 56 insertions, 6 deletions
diff --git a/cli/npm/resolution.rs b/cli/npm/resolution.rs index 87fa9922f..15fffdf04 100644 --- a/cli/npm/resolution.rs +++ b/cli/npm/resolution.rs @@ -11,6 +11,8 @@ use deno_core::anyhow::Context; use deno_core::error::AnyError; use deno_core::futures; use deno_core::parking_lot::RwLock; +use serde::Deserialize; +use serde::Serialize; use super::registry::NpmPackageInfo; use super::registry::NpmPackageVersionDistInfo; @@ -91,7 +93,9 @@ impl std::fmt::Display for NpmPackageReference { } } -#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)] +#[derive( + Clone, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize, +)] pub struct NpmPackageReq { pub name: String, pub version_req: Option<SpecifierVersionReq>, @@ -127,7 +131,9 @@ impl NpmVersionMatcher for NpmPackageReq { } } -#[derive(Debug, Clone, PartialOrd, Ord, PartialEq, Eq, Hash)] +#[derive( + Debug, Clone, PartialOrd, Ord, PartialEq, Eq, Hash, Serialize, Deserialize, +)] pub struct NpmPackageId { pub name: String, pub version: NpmVersion, @@ -150,7 +156,7 @@ impl std::fmt::Display for NpmPackageId { } } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct NpmResolutionPackage { pub id: NpmPackageId, pub dist: NpmPackageVersionDistInfo, @@ -159,13 +165,54 @@ pub struct NpmResolutionPackage { pub dependencies: HashMap<String, NpmPackageId>, } -#[derive(Debug, Clone, Default)] +#[derive(Debug, Clone, Default, Serialize, Deserialize)] pub struct NpmResolutionSnapshot { + #[serde(with = "map_to_vec")] package_reqs: HashMap<NpmPackageReq, NpmVersion>, packages_by_name: HashMap<String, Vec<NpmVersion>>, + #[serde(with = "map_to_vec")] packages: HashMap<NpmPackageId, NpmResolutionPackage>, } +// This is done so the maps with non-string keys get serialized and deserialized as vectors. +// Adapted from: https://github.com/serde-rs/serde/issues/936#issuecomment-302281792 +mod map_to_vec { + use std::collections::HashMap; + + use serde::de::Deserialize; + use serde::de::Deserializer; + use serde::ser::Serializer; + use serde::Serialize; + + pub fn serialize<S, K: Serialize, V: Serialize>( + map: &HashMap<K, V>, + serializer: S, + ) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + serializer.collect_seq(map.iter()) + } + + pub fn deserialize< + 'de, + D, + K: Deserialize<'de> + Eq + std::hash::Hash, + V: Deserialize<'de>, + >( + deserializer: D, + ) -> Result<HashMap<K, V>, D::Error> + where + D: Deserializer<'de>, + { + let mut map = HashMap::new(); + for (key, value) in Vec::<(K, V)>::deserialize(deserializer)? { + map.insert(key, value); + } + Ok(map) + } +} + impl NpmResolutionSnapshot { /// Resolve a node package from a deno module. pub fn resolve_package_from_deno_module( @@ -292,10 +339,13 @@ impl std::fmt::Debug for NpmResolution { } impl NpmResolution { - pub fn new(api: NpmRegistryApi) -> Self { + pub fn new( + api: NpmRegistryApi, + initial_snapshot: Option<NpmResolutionSnapshot>, + ) -> Self { Self { api, - snapshot: Default::default(), + snapshot: RwLock::new(initial_snapshot.unwrap_or_default()), update_sempahore: tokio::sync::Semaphore::new(1), } } |