use serde::Deserialize;
use std::collections::BTreeMap;
#[derive(Clone)]
pub(super) struct InstallPathInfo {
pub(super) name: String,
pub(super) dep_path: String,
}
#[derive(Debug, Deserialize)]
pub(super) struct RawNpmLockfile {
#[serde(rename = "lockfileVersion")]
pub(super) lockfile_version: u32,
#[serde(default)]
pub(super) packages: BTreeMap<String, RawNpmPackage>,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(super) struct RawNpmPackage {
#[serde(default)]
pub(super) name: Option<String>,
#[serde(default)]
pub(super) version: Option<String>,
#[serde(default)]
pub(super) integrity: Option<String>,
#[serde(default)]
pub(super) resolved: Option<String>,
#[serde(default)]
pub(super) link: bool,
#[serde(default)]
pub(super) dependencies: BTreeMap<String, String>,
#[serde(default)]
pub(super) dev_dependencies: BTreeMap<String, String>,
#[serde(default)]
pub(super) optional_dependencies: BTreeMap<String, String>,
#[serde(default)]
pub(super) peer_dependencies: BTreeMap<String, String>,
#[serde(default)]
pub(super) peer_dependencies_meta: BTreeMap<String, RawNpmPeerDepMeta>,
#[serde(default, deserialize_with = "aube_util::string_or_seq")]
pub(super) os: Vec<String>,
#[serde(default, deserialize_with = "aube_util::string_or_seq")]
pub(super) cpu: Vec<String>,
#[serde(default, deserialize_with = "aube_util::string_or_seq")]
pub(super) libc: Vec<String>,
#[serde(default, deserialize_with = "aube_manifest::engines_tolerant")]
pub(super) engines: BTreeMap<String, String>,
#[serde(default)]
pub(super) bin: BTreeMap<String, String>,
#[serde(default)]
pub(super) license: Option<RawNpmLicense>,
#[serde(default)]
pub(super) funding: Option<RawNpmFunding>,
}
#[derive(Debug, Clone, Default)]
pub(super) struct RawNpmLicense {
pub(super) value: Option<String>,
}
impl<'de> Deserialize<'de> for RawNpmLicense {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
use serde::de::{MapAccess, SeqAccess, Visitor};
use std::fmt;
struct LicenseVisitor;
impl<'de> Visitor<'de> for LicenseVisitor {
type Value = RawNpmLicense;
fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("an SPDX string, a {type: ...} object, or an array of either")
}
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
Ok(RawNpmLicense {
value: Some(v.to_owned()),
})
}
fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
Ok(RawNpmLicense { value: Some(v) })
}
fn visit_map<M>(self, mut map: M) -> Result<Self::Value, M::Error>
where
M: MapAccess<'de>,
{
let mut value: Option<String> = None;
while let Some(key) = map.next_key::<String>()? {
if key == "type" {
value = map.next_value::<Option<String>>()?;
} else {
let _ = map.next_value::<serde::de::IgnoredAny>()?;
}
}
Ok(RawNpmLicense { value })
}
fn visit_seq<S>(self, mut seq: S) -> Result<Self::Value, S::Error>
where
S: SeqAccess<'de>,
{
let mut chosen: Option<String> = None;
while let Some(item) = seq.next_element::<RawNpmLicense>()? {
if chosen.is_none() {
chosen = item.value;
}
}
Ok(RawNpmLicense { value: chosen })
}
}
deserializer.deserialize_any(LicenseVisitor)
}
}
#[derive(Debug, Clone, Default)]
pub(super) struct RawNpmFunding {
pub(super) url: Option<String>,
}
impl<'de> Deserialize<'de> for RawNpmFunding {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
use serde::de::{MapAccess, SeqAccess, Visitor};
use std::fmt;
struct FundingVisitor;
impl<'de> Visitor<'de> for FundingVisitor {
type Value = RawNpmFunding;
fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("a funding URL string, a {url: ...} object, or an array of either")
}
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
Ok(RawNpmFunding {
url: Some(v.to_owned()),
})
}
fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
Ok(RawNpmFunding { url: Some(v) })
}
fn visit_map<M>(self, mut map: M) -> Result<Self::Value, M::Error>
where
M: MapAccess<'de>,
{
let mut url: Option<String> = None;
while let Some(key) = map.next_key::<String>()? {
if key == "url" {
url = map.next_value::<Option<String>>()?;
} else {
let _ = map.next_value::<serde::de::IgnoredAny>()?;
}
}
Ok(RawNpmFunding { url })
}
fn visit_seq<S>(self, mut seq: S) -> Result<Self::Value, S::Error>
where
S: SeqAccess<'de>,
{
let mut chosen: Option<String> = None;
while let Some(item) = seq.next_element::<RawNpmFunding>()? {
if chosen.is_none() {
chosen = item.url;
}
}
Ok(RawNpmFunding { url: chosen })
}
}
deserializer.deserialize_any(FundingVisitor)
}
}
#[derive(Debug, Clone, Default, Deserialize)]
pub(super) struct RawNpmPeerDepMeta {
#[serde(default)]
pub(super) optional: bool,
}