From 32612a0f0d1fe0a551b98c35b856a57320d563e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Tue, 1 Oct 2024 22:28:36 +0200 Subject: [PATCH 1/3] feat: Add suggestion for Node-API modules --- cli/main.rs | 25 +++++++++++++++++++++++++ runtime/fmt_errors.rs | 42 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/cli/main.rs b/cli/main.rs index c0eccab5df9c77..f85c1122eda98c 100644 --- a/cli/main.rs +++ b/cli/main.rs @@ -392,6 +392,31 @@ fn get_suggestions_for_terminal_errors(e: &JsError) -> Vec { "Run again with `--unstable-webgpu` flag to enable this API.", ), ]; + // Try to capture errors like: + // ``` + // Uncaught Error: Cannot find module '../build/Release/canvas.node' + // Require stack: + // - /.../deno/npm/registry.npmjs.org/canvas/2.11.2/lib/bindings.js + // - /.../.cache/deno/npm/registry.npmjs.org/canvas/2.11.2/lib/canvas.js + // ``` + } else if msg.contains("Cannot find module") + && msg.contains("Require stack") + && msg.contains(".node'") + { + return vec![ + FixSuggestion::info_multiline( + &[ + "Trying to execute an npm package using Node-API addons,", + "these packages require local `node_modules` directory to be present" + ] + ), + FixSuggestion::hint_multiline( + &[ + "Add `\"nodeModulesDir\": \"auto\" option to `deno.json`,", + "and then run `deno install --allow-scripts=npm:` to setup `node_modules` directory." + ] + ) + ]; } } diff --git a/runtime/fmt_errors.rs b/runtime/fmt_errors.rs index b2cec2a5a6e1d5..44a947732729c5 100644 --- a/runtime/fmt_errors.rs +++ b/runtime/fmt_errors.rs @@ -26,24 +26,44 @@ enum FixSuggestionKind { Hint, } +#[derive(Debug)] +enum FixSuggestionMessage<'a> { + Single(&'a str), + Multiline(&'a [&'a str]), +} + #[derive(Debug)] pub struct FixSuggestion<'a> { kind: FixSuggestionKind, - message: &'a str, + message: FixSuggestionMessage<'a>, } impl<'a> FixSuggestion<'a> { pub fn info(message: &'a str) -> Self { Self { kind: FixSuggestionKind::Info, - message, + message: FixSuggestionMessage::Single(message), + } + } + + pub fn info_multiline(messages: &'a [&'a str]) -> Self { + Self { + kind: FixSuggestionKind::Info, + message: FixSuggestionMessage::Multiline(messages), } } pub fn hint(message: &'a str) -> Self { Self { kind: FixSuggestionKind::Hint, - message, + message: FixSuggestionMessage::Single(message), + } + } + + pub fn hint_multiline(messages: &'a [&'a str]) -> Self { + Self { + kind: FixSuggestionKind::Hint, + message: FixSuggestionMessage::Multiline(messages), } } } @@ -238,7 +258,21 @@ fn format_js_error_inner( FixSuggestionKind::Hint => write!(s, "{} ", cyan("hint:")).unwrap(), FixSuggestionKind::Info => write!(s, "{} ", yellow("info:")).unwrap(), }; - write!(s, "{}", suggestion.message).unwrap(); + match suggestion.message { + FixSuggestionMessage::Single(msg) => { + write!(s, "{}", msg).unwrap(); + } + FixSuggestionMessage::Multiline(messages) => { + for (idx, message) in messages.iter().enumerate() { + if idx != 0 { + writeln!(s).unwrap(); + write!(s, " ").unwrap(); + } + write!(s, "{}", message).unwrap(); + } + } + } + if index != (suggestions.len() - 1) { writeln!(s).unwrap(); } From 92427a3aef21a9cc2e6bccca1c3b4e26e0743844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Tue, 1 Oct 2024 22:37:13 +0200 Subject: [PATCH 2/3] reword hint --- cli/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/main.rs b/cli/main.rs index f85c1122eda98c..e014a9ff05f86c 100644 --- a/cli/main.rs +++ b/cli/main.rs @@ -412,8 +412,8 @@ fn get_suggestions_for_terminal_errors(e: &JsError) -> Vec { ), FixSuggestion::hint_multiline( &[ - "Add `\"nodeModulesDir\": \"auto\" option to `deno.json`,", - "and then run `deno install --allow-scripts=npm:` to setup `node_modules` directory." + "Add `\"nodeModulesDir\": \"auto\" option to `deno.json`, and then run", + "`deno install --allow-scripts=npm: --entrypoint