diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2023-01-24 21:14:49 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-24 15:14:49 -0500 |
commit | f14ea3d4d43eb579674f508b6a534429cc9191d6 (patch) | |
tree | d727a8c0a02c5ffca9d891ca4fc462e67275ad19 /cli/graph_util.rs | |
parent | e1c51f3c0d595542fe471359916df2a7b6be5484 (diff) |
feat: suggest adding a "node:" prefix for bare specifiers that look like built-in Node modules (#17519)
Diffstat (limited to 'cli/graph_util.rs')
-rw-r--r-- | cli/graph_util.rs | 84 |
1 files changed, 58 insertions, 26 deletions
diff --git a/cli/graph_util.rs b/cli/graph_util.rs index 243fd6eef..3cf3b0d0b 100644 --- a/cli/graph_util.rs +++ b/cli/graph_util.rs @@ -27,7 +27,9 @@ use deno_graph::ModuleGraph; use deno_graph::ModuleGraphError; use deno_graph::ModuleKind; use deno_graph::Range; +use deno_graph::ResolutionError; use deno_graph::Resolved; +use deno_graph::SpecifierError; use deno_runtime::permissions::PermissionsContainer; use std::collections::BTreeMap; use std::collections::HashMap; @@ -346,13 +348,10 @@ impl GraphData { if check_types { if let Some(Resolved::Err(error)) = maybe_types { let range = error.range(); - if !range.specifier.as_str().contains("$deno") { - return Some(Err(custom_error( - get_error_class_name(&error.clone().into()), - format!("{}\n at {}", error, range), - ))); - } - return Some(Err(error.clone().into())); + return Some(handle_check_error( + error.clone().into(), + Some(range), + )); } } for (_, dep) in dependencies.iter() { @@ -365,31 +364,25 @@ impl GraphData { for resolved in resolutions { if let Resolved::Err(error) = resolved { let range = error.range(); - if !range.specifier.as_str().contains("$deno") { - return Some(Err(custom_error( - get_error_class_name(&error.clone().into()), - format!("{}\n at {}", error, range), - ))); - } - return Some(Err(error.clone().into())); + return Some(handle_check_error( + error.clone().into(), + Some(range), + )); } } } } } ModuleEntry::Error(error) => { - if !roots.contains(specifier) { - if let Some(range) = self.referrer_map.get(specifier) { - if !range.specifier.as_str().contains("$deno") { - let message = error.to_string(); - return Some(Err(custom_error( - get_error_class_name(&error.clone().into()), - format!("{}\n at {}", message, range), - ))); - } - } - } - return Some(Err(error.clone().into())); + let maybe_range = if roots.contains(specifier) { + None + } else { + self.referrer_map.get(specifier) + }; + return Some(handle_check_error( + error.clone().into(), + maybe_range.map(|r| &**r), + )); } _ => {} } @@ -629,3 +622,42 @@ pub fn error_for_any_npm_specifier( Ok(()) } } + +fn handle_check_error( + error: AnyError, + maybe_range: Option<&deno_graph::Range>, +) -> Result<(), AnyError> { + let mut message = if let Some(err) = error.downcast_ref::<ResolutionError>() { + enhanced_resolution_error_message(err) + } else { + format!("{}", error) + }; + + if let Some(range) = maybe_range { + if !range.specifier.as_str().contains("$deno") { + message.push_str(&format!("\n at {}", range)); + } + } + + Err(custom_error(get_error_class_name(&error), message)) +} + +/// Adds more explanatory information to a resolution error. +pub fn enhanced_resolution_error_message(error: &ResolutionError) -> String { + let mut message = format!("{}", error); + + if let ResolutionError::InvalidSpecifier { + error: SpecifierError::ImportPrefixMissing(specifier, _), + .. + } = error + { + if crate::node::resolve_builtin_node_module(specifier).is_ok() { + message.push_str(&format!( + "\nIf you want to use a built-in Node module, add a \"node:\" prefix (ex. \"node:{}\").", + specifier + )); + } + } + + message +} |