summaryrefslogtreecommitdiff
path: root/cli/resolver.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/resolver.rs')
-rw-r--r--cli/resolver.rs76
1 files changed, 69 insertions, 7 deletions
diff --git a/cli/resolver.rs b/cli/resolver.rs
index c4037a75a..44de3aa3f 100644
--- a/cli/resolver.rs
+++ b/cli/resolver.rs
@@ -15,9 +15,11 @@ use deno_graph::source::UnknownBuiltInNodeModuleError;
use deno_graph::source::DEFAULT_JSX_IMPORT_SOURCE_MODULE;
use deno_runtime::deno_fs::FileSystem;
use deno_runtime::deno_node::is_builtin_node_module;
+use deno_runtime::deno_node::parse_npm_pkg_name;
use deno_runtime::deno_node::NodeResolution;
use deno_runtime::deno_node::NodeResolutionMode;
use deno_runtime::deno_node::NodeResolver;
+use deno_runtime::deno_node::NpmResolver as DenoNodeNpmResolver;
use deno_runtime::permissions::PermissionsContainer;
use deno_semver::npm::NpmPackageReqReference;
use deno_semver::package::PackageReq;
@@ -29,6 +31,7 @@ use crate::args::package_json::PackageJsonDeps;
use crate::args::JsxImportSourceConfig;
use crate::args::PackageJsonDepsProvider;
use crate::module_loader::CjsResolutionStore;
+use crate::npm::ByonmCliNpmResolver;
use crate::npm::CliNpmResolver;
use crate::npm::InnerCliNpmResolverRef;
use crate::util::sync::AtomicFlag;
@@ -177,6 +180,41 @@ impl CliGraphResolver {
pub fn found_package_json_dep(&self) -> bool {
self.found_package_json_dep_flag.is_raised()
}
+
+ fn check_surface_byonm_node_error(
+ &self,
+ specifier: &str,
+ referrer: &ModuleSpecifier,
+ mode: NodeResolutionMode,
+ original_err: AnyError,
+ resolver: &ByonmCliNpmResolver,
+ ) -> Result<(), AnyError> {
+ if let Ok((pkg_name, _, _)) = parse_npm_pkg_name(specifier, referrer) {
+ match resolver
+ .resolve_package_folder_from_package(&pkg_name, referrer, mode)
+ {
+ Ok(_) => {
+ return Err(original_err);
+ }
+ Err(_) => {
+ if resolver
+ .find_ancestor_package_json_with_dep(&pkg_name, referrer)
+ .is_some()
+ {
+ return Err(anyhow!(
+ concat!(
+ "Could not resolve \"{}\", but found it in a package.json. ",
+ "Deno expects the node_modules/ directory to be up to date. ",
+ "Did you forget to run `npm install`?"
+ ),
+ specifier
+ ));
+ }
+ }
+ }
+ }
+ Ok(())
+ }
}
impl Resolver for CliGraphResolver {
@@ -248,7 +286,7 @@ impl Resolver for CliGraphResolver {
let package_json_path = package_folder.join("package.json");
if !self.fs.exists_sync(&package_json_path) {
return Err(ResolveError::Other(anyhow!(
- "Could not find '{}'. Maybe run `npm install`?",
+ "Could not find '{}'. Deno expects the node_modules/ directory to be up to date. Did you forget to run `npm install`?",
package_json_path.display()
)));
}
@@ -290,14 +328,38 @@ impl Resolver for CliGraphResolver {
to_node_mode(mode),
&PermissionsContainer::allow_all(),
);
- if let Ok(Some(resolution)) = node_result {
- if let Some(cjs_resolutions) = &self.cjs_resolutions {
- if let NodeResolution::CommonJs(specifier) = &resolution {
- // remember that this was a common js resolution
- cjs_resolutions.insert(specifier.clone());
+ match node_result {
+ Ok(Some(resolution)) => {
+ if let Some(cjs_resolutions) = &self.cjs_resolutions {
+ if let NodeResolution::CommonJs(specifier) = &resolution {
+ // remember that this was a common js resolution
+ cjs_resolutions.insert(specifier.clone());
+ }
}
+ return Ok(resolution.into_url());
+ }
+ Ok(None) => {
+ self
+ .check_surface_byonm_node_error(
+ specifier,
+ referrer,
+ to_node_mode(mode),
+ anyhow!("Cannot find \"{}\"", specifier),
+ resolver,
+ )
+ .map_err(ResolveError::Other)?;
+ }
+ Err(err) => {
+ self
+ .check_surface_byonm_node_error(
+ specifier,
+ referrer,
+ to_node_mode(mode),
+ err,
+ resolver,
+ )
+ .map_err(ResolveError::Other)?;
}
- return Ok(resolution.into_url());
}
}
}