mirror of
https://github.com/denoland/deno.git
synced 2025-08-04 02:48:24 +00:00
fix(npm): dependency types were sometimes not being resolved when package had no types entry (#16958)
Closes #16957
This commit is contained in:
parent
79285fa83b
commit
3973ceb634
10 changed files with 58 additions and 45 deletions
|
@ -13,15 +13,16 @@ use deno_core::futures::future::BoxFuture;
|
|||
use deno_core::futures::FutureExt;
|
||||
use deno_core::url::Url;
|
||||
use deno_runtime::deno_node::NodeResolutionMode;
|
||||
use deno_runtime::deno_node::PackageJson;
|
||||
|
||||
use crate::args::Lockfile;
|
||||
use crate::npm::cache::NpmPackageCacheFolderId;
|
||||
use crate::npm::resolution::NpmResolution;
|
||||
use crate::npm::resolution::NpmResolutionSnapshot;
|
||||
use crate::npm::resolvers::common::cache_packages;
|
||||
use crate::npm::NpmCache;
|
||||
use crate::npm::NpmPackageId;
|
||||
use crate::npm::NpmPackageReq;
|
||||
use crate::npm::NpmResolutionPackage;
|
||||
use crate::npm::RealNpmRegistryApi;
|
||||
|
||||
use super::common::ensure_registry_read_permission;
|
||||
|
@ -61,6 +62,17 @@ impl GlobalNpmPackageResolver {
|
|||
.cache
|
||||
.package_folder_for_id(&folder_id, &self.registry_url)
|
||||
}
|
||||
|
||||
fn resolve_types_package(
|
||||
&self,
|
||||
package_name: &str,
|
||||
referrer_pkg_id: &NpmPackageCacheFolderId,
|
||||
) -> Result<NpmResolutionPackage, AnyError> {
|
||||
let types_name = types_package_name(package_name);
|
||||
self
|
||||
.resolution
|
||||
.resolve_package_from_package(&types_name, referrer_pkg_id)
|
||||
}
|
||||
}
|
||||
|
||||
impl InnerNpmPackageResolver for GlobalNpmPackageResolver {
|
||||
|
@ -81,30 +93,20 @@ impl InnerNpmPackageResolver for GlobalNpmPackageResolver {
|
|||
let referrer_pkg_id = self
|
||||
.cache
|
||||
.resolve_package_folder_id_from_specifier(referrer, &self.registry_url)?;
|
||||
let pkg_result = self
|
||||
.resolution
|
||||
.resolve_package_from_package(name, &referrer_pkg_id);
|
||||
if mode.is_types() && !name.starts_with("@types/") {
|
||||
// When doing types resolution, the package must contain a "types"
|
||||
// entry, or else it will then search for a @types package
|
||||
if let Ok(pkg) = pkg_result {
|
||||
let package_folder = self.package_folder(&pkg.id);
|
||||
let package_json = PackageJson::load_skip_read_permission(
|
||||
package_folder.join("package.json"),
|
||||
)?;
|
||||
if package_json.types.is_some() {
|
||||
return Ok(package_folder);
|
||||
}
|
||||
let pkg = if mode.is_types() && !name.starts_with("@types/") {
|
||||
// attempt to resolve the types package first, then fallback to the regular package
|
||||
match self.resolve_types_package(name, &referrer_pkg_id) {
|
||||
Ok(pkg) => pkg,
|
||||
Err(_) => self
|
||||
.resolution
|
||||
.resolve_package_from_package(name, &referrer_pkg_id)?,
|
||||
}
|
||||
|
||||
let name = types_package_name(name);
|
||||
let pkg = self
|
||||
.resolution
|
||||
.resolve_package_from_package(&name, &referrer_pkg_id)?;
|
||||
Ok(self.package_folder(&pkg.id))
|
||||
} else {
|
||||
Ok(self.package_folder(&pkg_result?.id))
|
||||
}
|
||||
self
|
||||
.resolution
|
||||
.resolve_package_from_package(name, &referrer_pkg_id)?
|
||||
};
|
||||
Ok(self.package_folder(&pkg.id))
|
||||
}
|
||||
|
||||
fn resolve_package_folder_from_specifier(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue