diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2024-07-09 12:15:03 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-09 12:15:03 -0400 |
commit | 839caf6fafdf9ca1cdec6cd9cef38296be41145f (patch) | |
tree | 691dba21b45e9c5640275304308aa5d8a5d4a7ba /cli/npm/managed/resolvers/global.rs | |
parent | 07613a6bf26d9112d47fda9e502425395bd78105 (diff) |
refactor: use concrete error types for node resolution (#24470)
This will help clean up some of the code in the CLI because we'll be
able to tell how the resolution failed (not part of this PR).
Diffstat (limited to 'cli/npm/managed/resolvers/global.rs')
-rw-r--r-- | cli/npm/managed/resolvers/global.rs | 65 |
1 files changed, 54 insertions, 11 deletions
diff --git a/cli/npm/managed/resolvers/global.rs b/cli/npm/managed/resolvers/global.rs index d10b33e7d..d16fe7cd0 100644 --- a/cli/npm/managed/resolvers/global.rs +++ b/cli/npm/managed/resolvers/global.rs @@ -8,13 +8,14 @@ use std::sync::Arc; use async_trait::async_trait; use deno_ast::ModuleSpecifier; -use deno_core::anyhow::bail; use deno_core::error::AnyError; use deno_core::url::Url; use deno_npm::NpmPackageCacheFolderId; use deno_npm::NpmPackageId; use deno_npm::NpmSystemInfo; use deno_runtime::deno_fs::FileSystem; +use deno_runtime::deno_node::errors::PackageFolderResolveError; +use deno_runtime::deno_node::errors::PackageFolderResolveErrorKind; use deno_runtime::deno_node::NodePermissions; use super::super::cache::NpmCache; @@ -65,29 +66,71 @@ impl NpmPackageFsResolver for GlobalNpmPackageResolver { None } - fn package_folder(&self, id: &NpmPackageId) -> Result<PathBuf, AnyError> { + fn maybe_package_folder(&self, id: &NpmPackageId) -> Option<PathBuf> { let folder_id = self .resolution - .resolve_pkg_cache_folder_id_from_pkg_id(id) - .unwrap(); - Ok(self.cache.package_folder_for_id(&folder_id)) + .resolve_pkg_cache_folder_id_from_pkg_id(id)?; + Some(self.cache.package_folder_for_id(&folder_id)) } fn resolve_package_folder_from_package( &self, name: &str, referrer: &ModuleSpecifier, - ) -> Result<PathBuf, AnyError> { - let Some(referrer_pkg_id) = self + ) -> Result<PathBuf, PackageFolderResolveError> { + use deno_npm::resolution::PackageNotFoundFromReferrerError; + let Some(referrer_cache_folder_id) = self .cache .resolve_package_folder_id_from_specifier(referrer) else { - bail!("could not find npm package for '{}'", referrer); + return Err( + PackageFolderResolveErrorKind::NotFoundReferrer { + referrer: referrer.clone(), + referrer_extra: None, + } + .into(), + ); }; - let pkg = self + let resolve_result = self .resolution - .resolve_package_from_package(name, &referrer_pkg_id)?; - self.package_folder(&pkg.id) + .resolve_package_from_package(name, &referrer_cache_folder_id); + match resolve_result { + Ok(pkg) => match self.maybe_package_folder(&pkg.id) { + Some(folder) => Ok(folder), + None => Err( + PackageFolderResolveErrorKind::NotFoundPackage { + package_name: name.to_string(), + referrer: referrer.clone(), + referrer_extra: Some(format!( + "{} -> {}", + referrer_cache_folder_id, + pkg.id.as_serialized() + )), + } + .into(), + ), + }, + Err(err) => match *err { + PackageNotFoundFromReferrerError::Referrer(cache_folder_id) => Err( + PackageFolderResolveErrorKind::NotFoundReferrer { + referrer: referrer.clone(), + referrer_extra: Some(cache_folder_id.to_string()), + } + .into(), + ), + PackageNotFoundFromReferrerError::Package { + name, + referrer: cache_folder_id_referrer, + } => Err( + PackageFolderResolveErrorKind::NotFoundPackage { + package_name: name, + referrer: referrer.clone(), + referrer_extra: Some(cache_folder_id_referrer.to_string()), + } + .into(), + ), + }, + } } fn resolve_package_cache_folder_id_from_specifier( |