@@ -465,22 +465,43 @@ const formatStack = (thrown: Thrown | null) =>
465465 } ,
466466 ) ;
467467
468- function createMessageAndCauseMessage ( error : Error ) : string {
469- if ( error . cause instanceof Error ) {
470- return `{ message: ${ error . message } , cause: ${ createMessageAndCauseMessage (
471- error . cause ,
472- ) } }`;
468+ function createMessageAndCause ( error : Error ) {
469+ if ( error . cause ) {
470+ const seen = new WeakSet ( ) ;
471+ return JSON . stringify ( buildSerializeError ( error ) , ( _ , value ) => {
472+ if ( isObject ( value ) ) {
473+ if ( seen . has ( value ) ) return ;
474+ seen . add ( value ) ; // stop circular references
475+ }
476+ return value === undefined ? String ( undefined ) : value ;
477+ } ) ;
473478 }
474479
475- return `{ message: ${ error . message } }` ;
480+ return error . message ;
476481}
477482
478- function createMessageAndCause ( error : Error ) {
479- if ( error . cause instanceof Error ) {
480- return createMessageAndCauseMessage ( error ) ;
483+ function buildSerializeError ( error : { [ key : string ] : any } ) {
484+ if ( ! isObject ( error ) ) {
485+ return error ;
481486 }
482487
483- return error . message ;
488+ const result : { [ key : string ] : any } = { } ;
489+ for ( const name of Object . getOwnPropertyNames ( error ) . sort ( ) ) {
490+ if ( [ 'stack' , 'fileName' , 'lineNumber' ] . includes ( name ) ) {
491+ continue ;
492+ }
493+ if ( name === 'cause' ) {
494+ result [ name ] = buildSerializeError ( error [ 'cause' ] ) ;
495+ continue ;
496+ }
497+ result [ name ] = error [ name ] ;
498+ }
499+
500+ return result ;
501+ }
502+
503+ function isObject ( obj : unknown ) {
504+ return obj != null && typeof obj === 'object' ;
484505}
485506
486507function messageAndCause ( error : Error ) {
0 commit comments