0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-03-04 01:44:26 -05:00

refactor: add 'docs' suggestion (#26463)

Adds another kind to `FixSuggestionKind` specifically for links
documentation pages.
This commit is contained in:
Bartek Iwańczuk 2024-10-22 21:22:26 +01:00 committed by GitHub
parent 8282c38fe0
commit 28b5640657
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 40 additions and 21 deletions

View file

@ -1,12 +1,10 @@
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
//! This mod provides DenoError to unify errors across Deno. //! This mod provides DenoError to unify errors across Deno.
use color_print::cformat;
use color_print::cstr; use color_print::cstr;
use deno_core::error::format_frame; use deno_core::error::format_frame;
use deno_core::error::JsError; use deno_core::error::JsError;
use deno_terminal::colors::cyan; use deno_terminal::colors;
use deno_terminal::colors::italic_bold;
use deno_terminal::colors::red;
use deno_terminal::colors::yellow;
use std::fmt::Write as _; use std::fmt::Write as _;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -25,6 +23,7 @@ struct IndexedErrorReference<'a> {
enum FixSuggestionKind { enum FixSuggestionKind {
Info, Info,
Hint, Hint,
Docs,
} }
#[derive(Debug)] #[derive(Debug)]
@ -67,6 +66,13 @@ impl<'a> FixSuggestion<'a> {
message: FixSuggestionMessage::Multiline(messages), message: FixSuggestionMessage::Multiline(messages),
} }
} }
pub fn docs(url: &'a str) -> Self {
Self {
kind: FixSuggestionKind::Docs,
message: FixSuggestionMessage::Single(url),
}
}
} }
struct AnsiColors; struct AnsiColors;
@ -79,10 +85,10 @@ impl deno_core::error::ErrorFormat for AnsiColors {
use deno_core::error::ErrorElement::*; use deno_core::error::ErrorElement::*;
match element { match element {
Anonymous | NativeFrame | FileName | EvalOrigin => { Anonymous | NativeFrame | FileName | EvalOrigin => {
cyan(s).to_string().into() colors::cyan(s).to_string().into()
} }
LineNumber | ColumnNumber => yellow(s).to_string().into(), LineNumber | ColumnNumber => colors::yellow(s).to_string().into(),
FunctionName | PromiseAll => italic_bold(s).to_string().into(), FunctionName | PromiseAll => colors::italic_bold(s).to_string().into(),
} }
} }
} }
@ -115,7 +121,7 @@ fn format_maybe_source_line(
if column_number as usize > source_line.len() { if column_number as usize > source_line.len() {
return format!( return format!(
"\n{} Couldn't format source line: Column {} is out of bounds (source may have changed at runtime)", "\n{} Couldn't format source line: Column {} is out of bounds (source may have changed at runtime)",
yellow("Warning"), column_number, colors::yellow("Warning"), column_number,
); );
} }
@ -128,9 +134,9 @@ fn format_maybe_source_line(
} }
s.push('^'); s.push('^');
let color_underline = if is_error { let color_underline = if is_error {
red(&s).to_string() colors::red(&s).to_string()
} else { } else {
cyan(&s).to_string() colors::cyan(&s).to_string()
}; };
let indent = format!("{:indent$}", "", indent = level); let indent = format!("{:indent$}", "", indent = level);
@ -201,7 +207,8 @@ fn format_js_error_inner(
if let Some(circular) = &circular { if let Some(circular) = &circular {
if js_error.is_same_error(circular.reference.to) { if js_error.is_same_error(circular.reference.to) {
write!(s, " {}", cyan(format!("<ref *{}>", circular.index))).unwrap(); write!(s, " {}", colors::cyan(format!("<ref *{}>", circular.index)))
.unwrap();
} }
} }
@ -239,7 +246,8 @@ fn format_js_error_inner(
.unwrap_or(false); .unwrap_or(false);
let error_string = if is_caused_by_circular { let error_string = if is_caused_by_circular {
cyan(format!("[Circular *{}]", circular.unwrap().index)).to_string() colors::cyan(format!("[Circular *{}]", circular.unwrap().index))
.to_string()
} else { } else {
format_js_error_inner(cause, circular, false, vec![]) format_js_error_inner(cause, circular, false, vec![])
}; };
@ -256,12 +264,23 @@ fn format_js_error_inner(
for (index, suggestion) in suggestions.iter().enumerate() { for (index, suggestion) in suggestions.iter().enumerate() {
write!(s, " ").unwrap(); write!(s, " ").unwrap();
match suggestion.kind { match suggestion.kind {
FixSuggestionKind::Hint => write!(s, "{} ", cyan("hint:")).unwrap(), FixSuggestionKind::Hint => {
FixSuggestionKind::Info => write!(s, "{} ", yellow("info:")).unwrap(), write!(s, "{} ", colors::cyan("hint:")).unwrap()
}
FixSuggestionKind::Info => {
write!(s, "{} ", colors::yellow("info:")).unwrap()
}
FixSuggestionKind::Docs => {
write!(s, "{} ", colors::green("docs:")).unwrap()
}
}; };
match suggestion.message { match suggestion.message {
FixSuggestionMessage::Single(msg) => { FixSuggestionMessage::Single(msg) => {
write!(s, "{}", msg).unwrap(); if matches!(suggestion.kind, FixSuggestionKind::Docs) {
write!(s, "{}", cformat!("<u>{}</>", msg)).unwrap();
} else {
write!(s, "{}", msg).unwrap();
}
} }
FixSuggestionMessage::Multiline(messages) => { FixSuggestionMessage::Multiline(messages) => {
for (idx, message) in messages.iter().enumerate() { for (idx, message) in messages.iter().enumerate() {
@ -300,7 +319,7 @@ fn get_suggestions_for_terminal_errors(e: &JsError) -> Vec<FixSuggestion> {
cstr!("or add <u>package.json</> next to the file with <i>\"type\": \"commonjs\"</> option"), cstr!("or add <u>package.json</> next to the file with <i>\"type\": \"commonjs\"</> option"),
cstr!("and pass <i>--unstable-detect-cjs</> flag."), cstr!("and pass <i>--unstable-detect-cjs</> flag."),
]), ]),
FixSuggestion::hint("See https://docs.deno.com/go/commonjs for details"), FixSuggestion::docs("https://docs.deno.com/go/commonjs"),
]; ];
} else if msg.contains("openKv is not a function") { } else if msg.contains("openKv is not a function") {
return vec![ return vec![

View file

@ -9,4 +9,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
or change the file extension to .cjs, or change the file extension to .cjs,
or add package.json next to the file with "type": "commonjs" option or add package.json next to the file with "type": "commonjs" option
and pass --unstable-detect-cjs flag. and pass --unstable-detect-cjs flag.
hint: See https://docs.deno.com/go/commonjs for details docs: https://docs.deno.com/go/commonjs

View file

@ -9,4 +9,4 @@ module.exports = {
or change the file extension to .cjs, or change the file extension to .cjs,
or add package.json next to the file with "type": "commonjs" option or add package.json next to the file with "type": "commonjs" option
and pass --unstable-detect-cjs flag. and pass --unstable-detect-cjs flag.
hint: See https://docs.deno.com/go/commonjs for details docs: https://docs.deno.com/go/commonjs

View file

@ -9,4 +9,4 @@ const process = require("process");
or change the file extension to .cjs, or change the file extension to .cjs,
or add package.json next to the file with "type": "commonjs" option or add package.json next to the file with "type": "commonjs" option
and pass --unstable-detect-cjs flag. and pass --unstable-detect-cjs flag.
hint: See https://docs.deno.com/go/commonjs for details docs: https://docs.deno.com/go/commonjs

View file

@ -10,4 +10,4 @@ console.log(require("./add").add(1, 2));
or change the file extension to .cjs, or change the file extension to .cjs,
or add package.json next to the file with "type": "commonjs" option or add package.json next to the file with "type": "commonjs" option
and pass --unstable-detect-cjs flag. and pass --unstable-detect-cjs flag.
hint: See https://docs.deno.com/go/commonjs for details docs: https://docs.deno.com/go/commonjs

View file

@ -9,4 +9,4 @@ const { add } = require("./add");
or change the file extension to .cjs, or change the file extension to .cjs,
or add package.json next to the file with "type": "commonjs" option or add package.json next to the file with "type": "commonjs" option
and pass --unstable-detect-cjs flag. and pass --unstable-detect-cjs flag.
hint: See https://docs.deno.com/go/commonjs for details docs: https://docs.deno.com/go/commonjs