@@ -23,6 +23,7 @@ const {
2323 ArrayPrototypeSplice,
2424 Error,
2525 ErrorPrototypeToString,
26+ FunctionPrototypeCall,
2627 JSONStringify,
2728 MapPrototypeGet,
2829 MathMax,
@@ -73,18 +74,19 @@ const kTypes = [
7374
7475const MainContextError = Error ;
7576const overrideStackTrace = new SafeWeakMap ( ) ;
76- const kNoOverride = Symbol ( 'kNoOverride' ) ;
7777const nodeInternalPrefix = '__node_internal_' ;
7878
79- const prepareStackTrace = ( globalThis , error , trace ) => {
80- // API for node internals to override error stack formatting
81- // without interfering with userland code.
82- const fn = overrideStackTrace . get ( error ) ;
83- if ( fn !== undefined ) {
84- overrideStackTrace . delete ( error ) ;
85- return fn ( error , trace ) ;
86- }
79+ const defaultFormatStackTrace = ( errorString , trace ) => {
80+ return `${ errorString } \n at ${ ArrayPrototypeJoin ( trace , '\n at ' ) } ` ;
81+ } ;
82+ let formatStackTrace = defaultFormatStackTrace ;
8783
84+ function setFormatStackTrace ( fn = defaultFormatStackTrace ) {
85+ formatStackTrace = fn ;
86+ }
87+
88+ const prepareStackTrace = ( globalThis , error , trace ) => {
89+ // Remove stack frames that should be hidden.
8890 const firstFrame = trace [ 0 ] ?. getFunctionName ( ) ;
8991 if ( firstFrame && StringPrototypeStartsWith ( firstFrame , nodeInternalPrefix ) ) {
9092 let i = trace . length - 1 ;
@@ -100,9 +102,27 @@ const prepareStackTrace = (globalThis, error, trace) => {
100102 }
101103 }
102104
103- const globalOverride =
104- maybeOverridePrepareStackTrace ( globalThis , error , trace ) ;
105- if ( globalOverride !== kNoOverride ) return globalOverride ;
105+ // API for node internals to override error stack formatting
106+ // without interfering with userland code.
107+ const fn = overrideStackTrace . get ( error ) ;
108+ if ( fn !== undefined ) {
109+ overrideStackTrace . delete ( error ) ;
110+ return fn ( error , trace ) ;
111+ }
112+
113+ // Polyfill of V8's Error.prepareStackTrace API.
114+ // https://crbug.com/v8/7848
115+ // `globalThis` is the global that contains the constructor which
116+ // created `error`.
117+ if ( typeof globalThis . Error ?. prepareStackTrace === 'function' ) {
118+ return globalThis . Error . prepareStackTrace ( error , trace ) ;
119+ }
120+ // We still have legacy usage that depends on the main context's `Error`
121+ // being used, even when the error is from a different context.
122+ // TODO(devsnek): evaluate if this can be eventually deprecated/removed.
123+ if ( typeof MainContextError . prepareStackTrace === 'function' ) {
124+ return MainContextError . prepareStackTrace ( error , trace ) ;
125+ }
106126
107127 // Normal error formatting:
108128 //
@@ -123,25 +143,7 @@ const prepareStackTrace = (globalThis, error, trace) => {
123143 if ( trace . length === 0 ) {
124144 return errorString ;
125145 }
126- return `${ errorString } \n at ${ ArrayPrototypeJoin ( trace , '\n at ' ) } ` ;
127- } ;
128-
129- const maybeOverridePrepareStackTrace = ( globalThis , error , trace ) => {
130- // Polyfill of V8's Error.prepareStackTrace API.
131- // https://crbug.com/v8/7848
132- // `globalThis` is the global that contains the constructor which
133- // created `error`.
134- if ( typeof globalThis . Error ?. prepareStackTrace === 'function' ) {
135- return globalThis . Error . prepareStackTrace ( error , trace ) ;
136- }
137- // We still have legacy usage that depends on the main context's `Error`
138- // being used, even when the error is from a different context.
139- // TODO(devsnek): evaluate if this can be eventually deprecated/removed.
140- if ( typeof MainContextError . prepareStackTrace === 'function' ) {
141- return MainContextError . prepareStackTrace ( error , trace ) ;
142- }
143-
144- return kNoOverride ;
146+ return formatStackTrace ( errorString , trace ) ;
145147} ;
146148
147149const aggregateTwoErrors = hideStackFrames ( ( innerError , outerError ) => {
@@ -776,8 +778,7 @@ function hideInternalStackFrames(error) {
776778 result += `\n at ${ frame } ` ;
777779 }
778780 }
779- result = error + result ;
780- return result ;
781+ return error + result ;
781782 } ) ;
782783}
783784
@@ -869,8 +870,7 @@ module.exports = {
869870 setStackTraceLimit,
870871 isStackOverflowError,
871872 kEnhanceStackBeforeInspector,
872- kNoOverride,
873- maybeOverridePrepareStackTrace,
873+ setFormatStackTrace,
874874 overrideStackTrace,
875875 prepareStackTrace,
876876 setArrowMessage,
0 commit comments