diff options
Diffstat (limited to 'cli')
-rw-r--r-- | cli/fmt_errors.rs | 17 | ||||
-rw-r--r-- | cli/source_maps.rs | 7 | ||||
-rw-r--r-- | cli/tests/integration/mod.rs | 12 | ||||
-rw-r--r-- | cli/tests/testdata/error_cause.ts | 13 | ||||
-rw-r--r-- | cli/tests/testdata/error_cause.ts.out | 17 | ||||
-rw-r--r-- | cli/tests/testdata/error_cause_recursive.ts | 4 | ||||
-rw-r--r-- | cli/tests/testdata/error_cause_recursive.ts.out | 14 |
7 files changed, 84 insertions, 0 deletions
diff --git a/cli/fmt_errors.rs b/cli/fmt_errors.rs index 6c4a4893a..b4e455026 100644 --- a/cli/fmt_errors.rs +++ b/cli/fmt_errors.rs @@ -128,9 +128,11 @@ fn format_frame(frame: &JsStackFrame) -> String { result } +#[allow(clippy::too_many_arguments)] fn format_stack( is_error: bool, message_line: &str, + cause: Option<&str>, source_line: Option<&str>, start_column: Option<i64>, end_column: Option<i64>, @@ -154,6 +156,14 @@ fn format_stack( indent = level )); } + if let Some(cause) = cause { + s.push_str(&format!( + "\n{:indent$}Caused by: {}", + "", + cause, + indent = level + )); + } s } @@ -262,12 +272,19 @@ impl fmt::Display for PrettyJsError { )]; } + let cause = self + .0 + .cause + .clone() + .map(|cause| format!("{}", PrettyJsError(*cause))); + write!( f, "{}", &format_stack( true, &self.0.message, + cause.as_deref(), self.0.source_line.as_deref(), self.0.start_column, self.0.end_column, diff --git a/cli/source_maps.rs b/cli/source_maps.rs index 74c390893..c2b950954 100644 --- a/cli/source_maps.rs +++ b/cli/source_maps.rs @@ -79,8 +79,14 @@ pub fn apply_source_map<G: SourceMapGetter>( } } + let cause = js_error + .cause + .clone() + .map(|cause| Box::new(apply_source_map(&*cause, getter))); + JsError { message: js_error.message.clone(), + cause, source_line, script_resource_name, line_number, @@ -238,6 +244,7 @@ mod tests { fn apply_source_map_line() { let e = JsError { message: "TypeError: baz".to_string(), + cause: None, source_line: Some("foo".to_string()), script_resource_name: Some("foo_bar.ts".to_string()), line_number: Some(4), diff --git a/cli/tests/integration/mod.rs b/cli/tests/integration/mod.rs index 8dd50b2f3..150683749 100644 --- a/cli/tests/integration/mod.rs +++ b/cli/tests/integration/mod.rs @@ -464,6 +464,18 @@ fn broken_stdout() { assert!(!stderr.contains("panic")); } +itest!(error_cause { + args: "run error_cause.ts", + output: "error_cause.ts.out", + exit_code: 1, +}); + +itest!(error_cause_recursive { + args: "run error_cause_recursive.ts", + output: "error_cause_recursive.ts.out", + exit_code: 1, +}); + itest_flaky!(cafile_url_imports { args: "run --quiet --reload --cert tls/RootCA.pem cafile_url_imports.ts", output: "cafile_url_imports.ts.out", diff --git a/cli/tests/testdata/error_cause.ts b/cli/tests/testdata/error_cause.ts new file mode 100644 index 000000000..7ebd5a48a --- /dev/null +++ b/cli/tests/testdata/error_cause.ts @@ -0,0 +1,13 @@ +function a() { + throw new Error("foo", { cause: new Error("bar", { cause: "deno" }) }); +} + +function b() { + a(); +} + +function c() { + b(); +} + +c(); diff --git a/cli/tests/testdata/error_cause.ts.out b/cli/tests/testdata/error_cause.ts.out new file mode 100644 index 000000000..155ef656e --- /dev/null +++ b/cli/tests/testdata/error_cause.ts.out @@ -0,0 +1,17 @@ +[WILDCARD] +error: Uncaught Error: foo + throw new Error("foo", { cause: new Error("bar", { cause: "deno" }) }); + ^ + at a (file:///[WILDCARD]/error_cause.ts:2:9) + at b (file:///[WILDCARD]/error_cause.ts:6:3) + at c (file:///[WILDCARD]/error_cause.ts:10:3) + at file:///[WILDCARD]/error_cause.ts:13:1 +Caused by: Uncaught Error: bar + throw new Error("foo", { cause: new Error("bar", { cause: "deno" }) }); + ^ + at a (file:///[WILDCARD]/error_cause.ts:2:35) + at b (file:///[WILDCARD]/error_cause.ts:6:3) + at c (file:///[WILDCARD]/error_cause.ts:10:3) + at file:///[WILDCARD]/error_cause.ts:13:1 +Caused by: Uncaught deno +[WILDCARD]
\ No newline at end of file diff --git a/cli/tests/testdata/error_cause_recursive.ts b/cli/tests/testdata/error_cause_recursive.ts new file mode 100644 index 000000000..a6999b1ff --- /dev/null +++ b/cli/tests/testdata/error_cause_recursive.ts @@ -0,0 +1,4 @@ +const x = new Error("foo"); +const y = new Error("bar", { cause: x }); +x.cause = y; +throw y; diff --git a/cli/tests/testdata/error_cause_recursive.ts.out b/cli/tests/testdata/error_cause_recursive.ts.out new file mode 100644 index 000000000..8bfda02fb --- /dev/null +++ b/cli/tests/testdata/error_cause_recursive.ts.out @@ -0,0 +1,14 @@ +[WILDCARD] +error: Uncaught Error: bar +const y = new Error("bar", { cause: x }); + ^ + at file:///[WILDCARD]/error_cause_recursive.ts:2:11 +Caused by: Uncaught Error: foo +const x = new Error("foo"); + ^ + at file:///[WILDCARD]/error_cause_recursive.ts:1:11 +Caused by: Uncaught Error: bar +const y = new Error("bar", { cause: x }); + ^ + at file:///[WILDCARD]/error_cause_recursive.ts:2:11 +[WILDCARD]
\ No newline at end of file |