summaryrefslogtreecommitdiff
path: root/cli/js
diff options
context:
space:
mode:
authorNayeem Rahman <nayeemrmn99@gmail.com>2020-05-29 13:02:36 +0100
committerGitHub <noreply@github.com>2020-05-29 14:02:36 +0200
commit49c70774012e929b3c77b808edc5a7908bcb6fa2 (patch)
tree40bc92223baab70b46bdf4f7a2f5d5edf7592308 /cli/js
parentce246d8d85283af16250dcb5970eca6caf9cca6d (diff)
fix(cli/js/error_stack): Expose Error.captureStackTrace (#5254)
Diffstat (limited to 'cli/js')
-rw-r--r--cli/js/error_stack.ts74
-rw-r--r--cli/js/lib.deno.shared_globals.d.ts8
-rw-r--r--cli/js/web/console.ts1
3 files changed, 43 insertions, 40 deletions
diff --git a/cli/js/error_stack.ts b/cli/js/error_stack.ts
index 8a3d0530b..daf983ba1 100644
--- a/cli/js/error_stack.ts
+++ b/cli/js/error_stack.ts
@@ -214,51 +214,47 @@ function evaluateCallSite(callSite: CallSite): CallSiteEval {
};
}
-function prepareStackTrace(
- error: Error,
- structuredStackTrace: CallSite[]
-): string {
+function prepareStackTrace(error: Error, callSites: CallSite[]): string {
+ const mappedCallSites = callSites.map(
+ (callSite): CallSite => {
+ const fileName = callSite.getFileName();
+ const lineNumber = callSite.getLineNumber();
+ const columnNumber = callSite.getColumnNumber();
+ if (fileName && lineNumber != null && columnNumber != null) {
+ return patchCallSite(
+ callSite,
+ applySourceMap({
+ fileName,
+ lineNumber,
+ columnNumber,
+ })
+ );
+ }
+ return callSite;
+ }
+ );
Object.defineProperties(error, {
- __callSiteEvals: { value: [] },
- __formattedFrames: { value: [] },
+ __callSiteEvals: { value: [], configurable: true },
+ __formattedFrames: { value: [], configurable: true },
});
- const errorString =
- `${error.name}: ${error.message}\n` +
- structuredStackTrace
- .map(
- (callSite): CallSite => {
- const fileName = callSite.getFileName();
- const lineNumber = callSite.getLineNumber();
- const columnNumber = callSite.getColumnNumber();
- if (fileName && lineNumber != null && columnNumber != null) {
- return patchCallSite(
- callSite,
- applySourceMap({
- fileName,
- lineNumber,
- columnNumber,
- })
- );
- }
- return callSite;
- }
- )
- .map((callSite): string => {
- // @ts-expect-error
- error.__callSiteEvals.push(Object.freeze(evaluateCallSite(callSite)));
- const isInternal =
- callSite.getFileName()?.startsWith("$deno$") ?? false;
- const string = callSiteToString(callSite, isInternal);
- // @ts-expect-error
- error.__formattedFrames.push(string);
- return ` at ${colors.stripColor(string)}`;
- })
- .join("\n");
+ for (const callSite of mappedCallSites) {
+ // @ts-expect-error
+ error.__callSiteEvals.push(Object.freeze(evaluateCallSite(callSite)));
+ const isInternal = callSite.getFileName()?.startsWith("$deno$") ?? false;
+ // @ts-expect-error
+ error.__formattedFrames.push(callSiteToString(callSite, isInternal));
+ }
// @ts-expect-error
Object.freeze(error.__callSiteEvals);
// @ts-expect-error
Object.freeze(error.__formattedFrames);
- return errorString;
+ return (
+ `${error.name}: ${error.message}\n` +
+ // @ts-expect-error
+ error.__formattedFrames
+ .map((s: string) => ` at ${colors.stripColor(s)}`)
+ .join("\n")
+ );
}
// @internal
diff --git a/cli/js/lib.deno.shared_globals.d.ts b/cli/js/lib.deno.shared_globals.d.ts
index f3a565668..2ad39545b 100644
--- a/cli/js/lib.deno.shared_globals.d.ts
+++ b/cli/js/lib.deno.shared_globals.d.ts
@@ -1481,3 +1481,11 @@ declare const AbortSignal: {
prototype: AbortSignal;
new (): AbortSignal;
};
+
+interface ErrorConstructor {
+ /** See https://v8.dev/docs/stack-trace-api#stack-trace-collection-for-custom-exceptions. */
+ // eslint-disable-next-line @typescript-eslint/ban-types
+ captureStackTrace(error: Object, constructor?: Function): void;
+ // TODO(nayeemrmn): Support `Error.prepareStackTrace()`. We currently use this
+ // internally in a way that makes it unavailable for users.
+}
diff --git a/cli/js/web/console.ts b/cli/js/web/console.ts
index 0e17d2efb..4b5423631 100644
--- a/cli/js/web/console.ts
+++ b/cli/js/web/console.ts
@@ -948,7 +948,6 @@ export class Console {
name: "Trace",
message,
};
- // @ts-expect-error
Error.captureStackTrace(err, this.trace);
this.error((err as Error).stack);
};