diff --git a/crates/turborepo-lockfiles/src/bun/de.rs b/crates/turborepo-lockfiles/src/bun/de.rs index c2006b3231180..b4fe305630717 100644 --- a/crates/turborepo-lockfiles/src/bun/de.rs +++ b/crates/turborepo-lockfiles/src/bun/de.rs @@ -153,6 +153,16 @@ mod test { dependencies: Some(("is-number".into(), "^6.0.0".into())) .into_iter() .collect(), + dev_dependencies: Some(("is-bigint".into(), "1.1.0".into())) + .into_iter() + .collect(), + peer_dependencies: Some(("is-even".into(), "1.0.0".into())) + .into_iter() + .collect(), + optional_peers: Some("is-even".into()).into_iter().collect(), + optional_dependencies: Some(("is-regexp".into(), "1.0.0".into())) + .into_iter() + .collect(), ..Default::default() }), checksum: Some("sha".into()), @@ -193,7 +203,7 @@ mod test { ); #[test_case(json!({"name": "bun-test", "devDependencies": {"turbo": "^2.3.3"}}), basic_workspace() ; "basic")] #[test_case(json!({"name": "docs", "version": "0.1.0"}), workspace_with_version() ; "with version")] - #[test_case(json!(["is-odd@3.0.1", "", {"dependencies": {"is-number": "^6.0.0"}}, "sha"]), registry_pkg() ; "registry package")] + #[test_case(json!(["is-odd@3.0.1", "", {"dependencies": {"is-number": "^6.0.0"}, "devDependencies": {"is-bigint": "1.1.0"}, "peerDependencies": {"is-even": "1.0.0"}, "optionalDependencies": {"is-regexp": "1.0.0"}, "optionalPeers": ["is-even"]}, "sha"]), registry_pkg() ; "registry package")] #[test_case(json!(["docs", {"dependencies": {"is-odd": "3.0.1"}}]), workspace_pkg() ; "workspace package")] #[test_case(json!(["some-package@root:", {"bin": "bin", "binDir": "binDir"}]), root_pkg() ; "root package")] fn test_deserialization Deserialize<'a> + PartialEq + std::fmt::Debug>( diff --git a/crates/turborepo-lockfiles/src/bun/mod.rs b/crates/turborepo-lockfiles/src/bun/mod.rs index 69bf0f74c6a3a..6be481b6b46fe 100644 --- a/crates/turborepo-lockfiles/src/bun/mod.rs +++ b/crates/turborepo-lockfiles/src/bun/mod.rs @@ -83,6 +83,7 @@ struct PackageEntry { } #[derive(Debug, Deserialize, Default, PartialEq, Clone, Serialize)] +#[serde(rename_all = "camelCase")] struct PackageInfo { #[serde(default, skip_serializing_if = "Map::is_empty")] dependencies: Map, @@ -92,6 +93,8 @@ struct PackageInfo { optional_dependencies: Map, #[serde(default, skip_serializing_if = "Map::is_empty")] peer_dependencies: Map, + #[serde(default, skip_serializing_if = "HashSet::is_empty")] + optional_peers: HashSet, // We do not care about the rest here // the values here should be generic #[serde(flatten)] @@ -163,9 +166,20 @@ impl Lockfile for BunLockfile { .ok_or_else(|| crate::Error::MissingPackage(key.into()))?; let mut deps = HashMap::new(); - for (dependency, version) in entry.info.iter().flat_map(|info| info.all_dependencies()) { + + let Some(info) = &entry.info else { + return Ok(Some(deps)); + }; + + let optional_peers = &info.optional_peers; + for (dependency, version) in info.all_dependencies() { let parent_key = format!("{entry_key}/{dependency}"); let Some((dep_key, _)) = self.package_entry(&parent_key) else { + // This is an optional peer dependency + if optional_peers.contains(&dependency.to_string()) { + continue; + } + return Err(crate::Error::MissingPackage(dependency.to_string())); }; deps.insert(dep_key.to_string(), version.to_string()); diff --git a/crates/turborepo-lockfiles/src/bun/ser.rs b/crates/turborepo-lockfiles/src/bun/ser.rs index 3cc3669c1950b..2ce3bf93edfdf 100644 --- a/crates/turborepo-lockfiles/src/bun/ser.rs +++ b/crates/turborepo-lockfiles/src/bun/ser.rs @@ -103,6 +103,16 @@ mod test { dependencies: Some(("is-number".into(), "^6.0.0".into())) .into_iter() .collect(), + dev_dependencies: Some(("is-bigint".into(), "1.1.0".into())) + .into_iter() + .collect(), + peer_dependencies: Some(("is-even".into(), "1.0.0".into())) + .into_iter() + .collect(), + optional_peers: Some("is-even".into()).into_iter().collect(), + optional_dependencies: Some(("is-regexp".into(), "1.0.0".into())) + .into_iter() + .collect(), ..Default::default() }), checksum: Some("sha".into()), @@ -143,7 +153,7 @@ mod test { ); #[test_case(json!({"name": "bun-test", "devDependencies": {"turbo": "^2.3.3"}}), basic_workspace() ; "basic")] #[test_case(json!({"name": "docs", "version": "0.1.0"}), workspace_with_version() ; "with version")] - #[test_case(json!(["is-odd@3.0.1", "", {"dependencies": {"is-number": "^6.0.0"}}, "sha"]), registry_pkg() ; "registry package")] + #[test_case(json!(["is-odd@3.0.1", "", {"dependencies": {"is-number": "^6.0.0"}, "devDependencies": {"is-bigint": "1.1.0"}, "peerDependencies": {"is-even": "1.0.0"}, "optionalDependencies": {"is-regexp": "1.0.0"}, "optionalPeers": ["is-even"]}, "sha"]), registry_pkg() ; "registry package")] #[test_case(json!(["docs", {"dependencies": {"is-odd": "3.0.1"}}]), workspace_pkg() ; "workspace package")] #[test_case(json!(["some-package@root:", {"bin": "bin", "binDir": "binDir"}]), root_pkg() ; "root package")] fn test_serialization(