summaryrefslogtreecommitdiff
path: root/cli/graph_util.rs
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2023-01-24 21:14:49 +0100
committerGitHub <noreply@github.com>2023-01-24 15:14:49 -0500
commitf14ea3d4d43eb579674f508b6a534429cc9191d6 (patch)
treed727a8c0a02c5ffca9d891ca4fc462e67275ad19 /cli/graph_util.rs
parente1c51f3c0d595542fe471359916df2a7b6be5484 (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.rs84
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
+}