mirror of
https://github.com/denoland/deno.git
synced 2025-08-03 18:38:33 +00:00
feat(unstable/npm): support peer dependencies (#16561)
This adds support for peer dependencies in npm packages. 1. If not found higher in the tree (ancestor and ancestor siblings), peer dependencies are resolved like a dependency similar to npm 7. 2. Optional peer dependencies are only resolved if found higher in the tree. 3. This creates "copy packages" or duplicates of a package when a package has different resolution due to peer dependency resolution—see https://pnpm.io/how-peers-are-resolved. Unlike pnpm though, duplicates of packages will have `_1`, `_2`, etc. added to the end of the package version in the directory in order to minimize the chance of hitting the max file path limit on Windows. This is done for both the local "node_modules" directory and also the global npm cache. The files are hard linked in this case to reduce hard drive space. This is a first pass and the code is definitely more inefficient than it could be. Closes #15823
This commit is contained in:
parent
2c72e8d5f4
commit
cbb3f85433
38 changed files with 4331 additions and 1380 deletions
|
@ -70,13 +70,19 @@ pub async fn cache_packages(
|
|||
// and we want the output to be deterministic
|
||||
packages.sort_by(|a, b| a.id.cmp(&b.id));
|
||||
}
|
||||
|
||||
let mut handles = Vec::with_capacity(packages.len());
|
||||
for package in packages {
|
||||
assert_eq!(package.copy_index, 0); // the caller should not provide any of these
|
||||
let cache = cache.clone();
|
||||
let registry_url = registry_url.clone();
|
||||
let handle = tokio::task::spawn(async move {
|
||||
cache
|
||||
.ensure_package(&package.id, &package.dist, ®istry_url)
|
||||
.ensure_package(
|
||||
(package.id.name.as_str(), &package.id.version),
|
||||
&package.dist,
|
||||
®istry_url,
|
||||
)
|
||||
.await
|
||||
});
|
||||
if sync_download {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue