49 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
'use strict'
 | 
						|
 | 
						|
module.exports = errWithCauseSerializer
 | 
						|
 | 
						|
const { isErrorLike } = require('./err-helpers')
 | 
						|
const { pinoErrProto, pinoErrorSymbols } = require('./err-proto')
 | 
						|
const { seen } = pinoErrorSymbols
 | 
						|
 | 
						|
const { toString } = Object.prototype
 | 
						|
 | 
						|
function errWithCauseSerializer (err) {
 | 
						|
  if (!isErrorLike(err)) {
 | 
						|
    return err
 | 
						|
  }
 | 
						|
 | 
						|
  err[seen] = undefined // tag to prevent re-looking at this
 | 
						|
  const _err = Object.create(pinoErrProto)
 | 
						|
  _err.type = toString.call(err.constructor) === '[object Function]'
 | 
						|
    ? err.constructor.name
 | 
						|
    : err.name
 | 
						|
  _err.message = err.message
 | 
						|
  _err.stack = err.stack
 | 
						|
 | 
						|
  if (Array.isArray(err.errors)) {
 | 
						|
    _err.aggregateErrors = err.errors.map(err => errWithCauseSerializer(err))
 | 
						|
  }
 | 
						|
 | 
						|
  if (isErrorLike(err.cause) && !Object.prototype.hasOwnProperty.call(err.cause, seen)) {
 | 
						|
    _err.cause = errWithCauseSerializer(err.cause)
 | 
						|
  }
 | 
						|
 | 
						|
  for (const key in err) {
 | 
						|
    if (_err[key] === undefined) {
 | 
						|
      const val = err[key]
 | 
						|
      if (isErrorLike(val)) {
 | 
						|
        if (!Object.prototype.hasOwnProperty.call(val, seen)) {
 | 
						|
          _err[key] = errWithCauseSerializer(val)
 | 
						|
        }
 | 
						|
      } else {
 | 
						|
        _err[key] = val
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  delete err[seen] // clean up tag in case err is serialized again later
 | 
						|
  _err.raw = err
 | 
						|
  return _err
 | 
						|
}
 |