fix(cli/fmt_errors): Abbreviate long data URLs in stack traces (#12127)

Co-authored-by: Mike White <mike.white@auctane.com>
This commit is contained in:
Nayeem Rahman 2021-09-18 14:40:04 +01:00 committed by GitHub
parent f840906943
commit 75ca013f07
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 80 additions and 22 deletions

View file

@ -5,13 +5,40 @@ use crate::colors::italic_bold;
use crate::colors::red;
use crate::colors::yellow;
use deno_core::error::{AnyError, JsError, JsStackFrame};
use deno_core::url::Url;
use std::error::Error;
use std::fmt;
use std::ops::Deref;
const SOURCE_ABBREV_THRESHOLD: usize = 150;
const DATA_URL_ABBREV_THRESHOLD: usize = 150;
// Keep in sync with `runtime/js/40_error_stack.js`.
pub fn format_file_name(file_name: &str) -> String {
if file_name.len() > DATA_URL_ABBREV_THRESHOLD {
if let Ok(url) = Url::parse(file_name) {
if url.scheme() == "data" {
let data_path = url.path();
if let Some(data_pieces) = data_path.split_once(',') {
let data_length = data_pieces.1.len();
if let Some(data_start) = data_pieces.1.get(0..20) {
if let Some(data_end) = data_pieces.1.get(data_length - 20..) {
return format!(
"{}:{},{}......{}",
url.scheme(),
data_pieces.0,
data_start,
data_end
);
}
}
}
}
}
}
file_name.to_string()
}
// Keep in sync with `/core/error.js`.
pub fn format_location(frame: &JsStackFrame) -> String {
let _internal = frame
.file_name
@ -22,7 +49,7 @@ pub fn format_location(frame: &JsStackFrame) -> String {
}
let mut result = String::new();
if let Some(file_name) = &frame.file_name {
result += &cyan(&file_name).to_string();
result += &cyan(&format_file_name(file_name)).to_string();
} else {
if frame.is_eval {
result +=