diff options
author | Nayeem Rahman <nayeemrmn99@gmail.com> | 2020-05-29 13:02:36 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-29 14:02:36 +0200 |
commit | 49c70774012e929b3c77b808edc5a7908bcb6fa2 (patch) | |
tree | 40bc92223baab70b46bdf4f7a2f5d5edf7592308 /cli/js | |
parent | ce246d8d85283af16250dcb5970eca6caf9cca6d (diff) |
fix(cli/js/error_stack): Expose Error.captureStackTrace (#5254)
Diffstat (limited to 'cli/js')
-rw-r--r-- | cli/js/error_stack.ts | 74 | ||||
-rw-r--r-- | cli/js/lib.deno.shared_globals.d.ts | 8 | ||||
-rw-r--r-- | cli/js/web/console.ts | 1 |
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); }; |