Skip to content

Commit 61f9efd

Browse files
committed
fix: handle linked package in snapshot_from_lockfile()
1 parent 1a63ff5 commit 61f9efd

File tree

1 file changed

+81
-6
lines changed

1 file changed

+81
-6
lines changed

src/resolution/snapshot.rs

Lines changed: 81 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -966,6 +966,15 @@ pub fn snapshot_from_lockfile(
966966
let mut root_packages = HashMap::<PackageReq, NpmPackageId>::with_capacity(
967967
lockfile.content.packages.specifiers.len(),
968968
);
969+
let link_package_ids = params
970+
.link_packages
971+
.iter()
972+
.flat_map(|(name, info_vec)| {
973+
info_vec.iter().map(move |info| {
974+
StackString::from_string(format!("{}@{}", name, info.version))
975+
})
976+
})
977+
.collect::<HashSet<_>>();
969978
// collect the specifiers to version mappings
970979
for (key, value) in &lockfile.content.packages.specifiers {
971980
match key.kind {
@@ -1000,12 +1009,16 @@ pub fn snapshot_from_lockfile(
10001009
}
10011010

10021011
packages.push(SerializedNpmResolutionSnapshotPackage {
1003-
dist: Some(dist_from_incomplete_package_info(
1004-
&id.nv,
1005-
package.integrity.as_deref(),
1006-
package.tarball.as_deref(),
1007-
default_tarball_url,
1008-
)),
1012+
dist: if !link_package_ids.contains(key) {
1013+
Some(dist_from_incomplete_package_info(
1014+
&id.nv,
1015+
package.integrity.as_deref(),
1016+
package.tarball.as_deref(),
1017+
default_tarball_url,
1018+
))
1019+
} else {
1020+
None
1021+
},
10091022
id,
10101023
dependencies: dependencies
10111024
.into_iter()
@@ -1552,4 +1565,66 @@ mod tests {
15521565
.is_err()
15531566
);
15541567
}
1568+
1569+
#[tokio::test]
1570+
async fn test_snapshot_from_lockfile_v5_with_linked_package() {
1571+
let api = TestNpmRegistryApi::default();
1572+
let lockfile = Lockfile::new(
1573+
NewLockfileOptions {
1574+
file_path: PathBuf::from("/deno.lock"),
1575+
content: r#"{
1576+
"version": "5",
1577+
"specifiers": {
1578+
"npm:cowsay@^1.6.0": "1.6.0"
1579+
},
1580+
"npm": {
1581+
1582+
},
1583+
"workspace": {
1584+
"packageJson": {
1585+
"dependencies": [
1586+
"npm:cowsay@^1.6.0"
1587+
]
1588+
},
1589+
"links": {
1590+
1591+
}
1592+
}
1593+
}"#,
1594+
overwrite: false,
1595+
},
1596+
&api,
1597+
)
1598+
.await
1599+
.unwrap();
1600+
let link_packages = &HashMap::from([(
1601+
PackageName::from_static("cowsay"),
1602+
vec![NpmPackageVersionInfo {
1603+
version: Version::parse_standard("1.6.0").unwrap(),
1604+
..Default::default()
1605+
}],
1606+
)]);
1607+
let snapshot = snapshot_from_lockfile(SnapshotFromLockfileParams {
1608+
lockfile: &lockfile,
1609+
link_packages,
1610+
default_tarball_url: &TestDefaultTarballUrlProvider,
1611+
})
1612+
.unwrap();
1613+
1614+
assert_eq!(
1615+
snapshot.as_serialized().packages,
1616+
vec![SerializedNpmResolutionSnapshotPackage{
1617+
id: NpmPackageId::from_serialized("[email protected]").unwrap(),
1618+
system: Default::default(),
1619+
dist: None, // should be None
1620+
dependencies: Default::default(),
1621+
optional_dependencies: Default::default(),
1622+
optional_peer_dependencies: Default::default(),
1623+
extra: None,
1624+
is_deprecated: false,
1625+
has_bin: false,
1626+
has_scripts: false,
1627+
}]
1628+
);
1629+
}
15551630
}

0 commit comments

Comments
 (0)