mirror of
https://github.com/denoland/deno.git
synced 2025-08-04 02:48:24 +00:00
fix(workspace): do not resolve to self for npm pkg depending on matching req (#24591)
Closes #24584
This commit is contained in:
parent
70a9631696
commit
29186d7e59
6 changed files with 77 additions and 29 deletions
|
@ -8,17 +8,26 @@ use deno_config::workspace::Workspace;
|
|||
use deno_semver::package::PackageReq;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct InstallNpmWorkspacePkg {
|
||||
pub struct InstallNpmRemotePkg {
|
||||
pub alias: String,
|
||||
pub pkg_dir: PathBuf,
|
||||
// todo(24419): use this when setting up the node_modules dir
|
||||
#[allow(dead_code)]
|
||||
pub base_dir: PathBuf,
|
||||
pub req: PackageReq,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct InstallNpmWorkspacePkg {
|
||||
pub alias: String,
|
||||
// todo(24419): use this when setting up the node_modules dir
|
||||
#[allow(dead_code)]
|
||||
pub base_dir: PathBuf,
|
||||
pub target_dir: PathBuf,
|
||||
}
|
||||
|
||||
// todo(#24419): this is not correct, but it's good enough for now.
|
||||
// We need deno_npm to be able to understand workspace packages and
|
||||
// then have a way to properly lay them out on the file system
|
||||
#[derive(Debug, Default)]
|
||||
pub struct PackageJsonInstallDepsProvider {
|
||||
remote_pkg_reqs: Vec<PackageReq>,
|
||||
remote_pkgs: Vec<InstallNpmRemotePkg>,
|
||||
workspace_pkgs: Vec<InstallNpmWorkspacePkg>,
|
||||
}
|
||||
|
||||
|
@ -29,27 +38,35 @@ impl PackageJsonInstallDepsProvider {
|
|||
|
||||
pub fn from_workspace(workspace: &Arc<Workspace>) -> Self {
|
||||
let mut workspace_pkgs = Vec::new();
|
||||
let mut remote_pkg_reqs = Vec::new();
|
||||
let mut remote_pkgs = Vec::new();
|
||||
let workspace_npm_pkgs = workspace.npm_packages();
|
||||
for pkg_json in workspace.package_jsons() {
|
||||
let deps = pkg_json.resolve_local_package_json_deps();
|
||||
let mut pkg_reqs = Vec::with_capacity(deps.len());
|
||||
let mut pkg_pkgs = Vec::with_capacity(deps.len());
|
||||
for (alias, dep) in deps {
|
||||
let Ok(dep) = dep else {
|
||||
continue;
|
||||
};
|
||||
match dep {
|
||||
PackageJsonDepValue::Req(pkg_req) => {
|
||||
if let Some(pkg) = workspace_npm_pkgs
|
||||
.iter()
|
||||
.find(|pkg| pkg.matches_req(&pkg_req))
|
||||
{
|
||||
let workspace_pkg = workspace_npm_pkgs.iter().find(|pkg| {
|
||||
pkg.matches_req(&pkg_req)
|
||||
// do not resolve to the current package
|
||||
&& pkg.pkg_json.path != pkg_json.path
|
||||
});
|
||||
|
||||
if let Some(pkg) = workspace_pkg {
|
||||
workspace_pkgs.push(InstallNpmWorkspacePkg {
|
||||
alias,
|
||||
pkg_dir: pkg.pkg_json.dir_path().to_path_buf(),
|
||||
base_dir: pkg_json.dir_path().to_path_buf(),
|
||||
target_dir: pkg.pkg_json.dir_path().to_path_buf(),
|
||||
});
|
||||
} else {
|
||||
pkg_reqs.push(pkg_req)
|
||||
pkg_pkgs.push(InstallNpmRemotePkg {
|
||||
alias,
|
||||
base_dir: pkg_json.dir_path().to_path_buf(),
|
||||
req: pkg_req,
|
||||
});
|
||||
}
|
||||
}
|
||||
PackageJsonDepValue::Workspace(version_req) => {
|
||||
|
@ -58,27 +75,28 @@ impl PackageJsonInstallDepsProvider {
|
|||
}) {
|
||||
workspace_pkgs.push(InstallNpmWorkspacePkg {
|
||||
alias,
|
||||
pkg_dir: pkg.pkg_json.dir_path().to_path_buf(),
|
||||
base_dir: pkg_json.dir_path().to_path_buf(),
|
||||
target_dir: pkg.pkg_json.dir_path().to_path_buf(),
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// sort within each package
|
||||
pkg_reqs.sort();
|
||||
pkg_pkgs.sort_by(|a, b| a.alias.cmp(&b.alias));
|
||||
|
||||
remote_pkg_reqs.extend(pkg_reqs);
|
||||
remote_pkgs.extend(pkg_pkgs);
|
||||
}
|
||||
remote_pkg_reqs.shrink_to_fit();
|
||||
remote_pkgs.shrink_to_fit();
|
||||
workspace_pkgs.shrink_to_fit();
|
||||
Self {
|
||||
remote_pkg_reqs,
|
||||
remote_pkgs,
|
||||
workspace_pkgs,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn remote_pkg_reqs(&self) -> &Vec<PackageReq> {
|
||||
&self.remote_pkg_reqs
|
||||
pub fn remote_pkgs(&self) -> &Vec<InstallNpmRemotePkg> {
|
||||
&self.remote_pkgs
|
||||
}
|
||||
|
||||
pub fn workspace_pkgs(&self) -> &Vec<InstallNpmWorkspacePkg> {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue