Skip to content

Commit 794a6d3

Browse files
committed
fix: Preserve pnpm aliased dependencies during prune
1 parent f925b44 commit 794a6d3

1 file changed

Lines changed: 68 additions & 11 deletions

File tree

  • crates/turborepo-lockfiles/src/pnpm

crates/turborepo-lockfiles/src/pnpm/data.rs

Lines changed: 68 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -654,21 +654,21 @@ impl PnpmLockfile {
654654
) -> Result<(Packages, Option<Snapshots>), crate::Error> {
655655
let mut pruned_packages = BTreeMap::new();
656656
if let Some(snapshots) = self.snapshots.as_ref() {
657-
let mut pruned_snapshots = BTreeMap::new();
657+
let mut pruned_snapshots = Some(BTreeMap::new());
658658
for package in packages {
659-
let entry = snapshots
660-
.get(package.as_str())
661-
.ok_or_else(|| crate::Error::MissingPackage(package.clone()))?;
662-
pruned_snapshots.insert(package.clone(), entry.clone());
659+
if !snapshots.contains_key(package.as_str()) {
660+
return Err(crate::Error::MissingPackage(package.clone()));
661+
}
663662

664663
let package_key = self.package_key_for_snapshot(package.as_str())?;
665-
let entry = self
666-
.get_packages(&package_key)
667-
.ok_or_else(|| crate::Error::MissingPackage(package_key.clone()))?;
668-
pruned_packages.insert(package_key, entry.clone());
664+
if self.get_packages(&package_key).is_none() {
665+
return Err(crate::Error::MissingPackage(package_key));
666+
}
667+
668+
self.retain_package(package, &mut pruned_packages, &mut pruned_snapshots)?;
669669
}
670670

671-
return Ok((pruned_packages, Some(pruned_snapshots)));
671+
return Ok((pruned_packages, pruned_snapshots));
672672
}
673673

674674
for package in packages {
@@ -707,7 +707,11 @@ impl PnpmLockfile {
707707
}
708708

709709
for (dep_name, dep_version) in snapshot.dependencies() {
710-
let dep_key = self.format_key(&dep_name, &dep_version);
710+
let dep_key = if self.has_package(&dep_version) {
711+
dep_version
712+
} else {
713+
self.format_key(&dep_name, &dep_version)
714+
};
711715
self.retain_package(&dep_key, pruned_packages, pruned_snapshots)?;
712716
}
713717

@@ -1400,6 +1404,59 @@ importers:
14001404
);
14011405
}
14021406

1407+
#[test]
1408+
fn test_subgraph_preserves_aliased_dependency_targets() {
1409+
let yaml = r#"lockfileVersion: '9.0'
1410+
1411+
importers:
1412+
1413+
.: {}
1414+
1415+
apps/web:
1416+
dependencies:
1417+
pretty-format:
1418+
specifier: 30.2.0
1419+
version: 30.2.0
1420+
1421+
packages:
1422+
1423+
pretty-format@30.2.0:
1424+
resolution: {integrity: sha512-abc}
1425+
1426+
react-is@19.2.8:
1427+
resolution: {integrity: sha512-def}
1428+
1429+
snapshots:
1430+
1431+
pretty-format@30.2.0:
1432+
dependencies:
1433+
react-is-19: react-is@19.2.8
1434+
1435+
react-is@19.2.8: {}
1436+
"#;
1437+
let lockfile = PnpmLockfile::from_bytes(yaml.as_bytes()).unwrap();
1438+
let pruned = lockfile
1439+
.subgraph(
1440+
&["apps/web".to_string()],
1441+
&["pretty-format@30.2.0".to_string()],
1442+
)
1443+
.unwrap();
1444+
1445+
let pruned_bytes = pruned.encode().unwrap();
1446+
let pruned_lockfile = PnpmLockfile::from_bytes(&pruned_bytes).unwrap();
1447+
let packages = pruned_lockfile
1448+
.packages
1449+
.as_ref()
1450+
.expect("should have packages");
1451+
let snapshots = pruned_lockfile
1452+
.snapshots
1453+
.as_ref()
1454+
.expect("should have snapshots");
1455+
1456+
assert!(packages.contains_key("react-is@19.2.8"));
1457+
assert!(snapshots.contains_key("react-is@19.2.8"));
1458+
}
1459+
14031460
#[test]
14041461
fn test_subgraph_preserves_leading_pnpm_v11_documents() {
14051462
let yaml = pnpm_v11_lockfile("11.0.0-rc.0");

0 commit comments

Comments
 (0)