summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
Diffstat (limited to 'cli')
-rw-r--r--cli/fmt_errors.rs17
-rw-r--r--cli/source_maps.rs7
-rw-r--r--cli/tests/integration/mod.rs12
-rw-r--r--cli/tests/testdata/error_cause.ts13
-rw-r--r--cli/tests/testdata/error_cause.ts.out17
-rw-r--r--cli/tests/testdata/error_cause_recursive.ts4
-rw-r--r--cli/tests/testdata/error_cause_recursive.ts.out14
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