summaryrefslogtreecommitdiff
path: root/cli/npm/resolution.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/npm/resolution.rs')
-rw-r--r--cli/npm/resolution.rs62
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),
}
}