You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							69 lines
						
					
					
						
							1.4 KiB
						
					
					
				
			
		
		
	
	
							69 lines
						
					
					
						
							1.4 KiB
						
					
					
				'use strict'
 | 
						|
 | 
						|
module.exports = errSerializer
 | 
						|
 | 
						|
const { toString } = Object.prototype
 | 
						|
const seen = Symbol('circular-ref-tag')
 | 
						|
const rawSymbol = Symbol('pino-raw-err-ref')
 | 
						|
const pinoErrProto = Object.create({}, {
 | 
						|
  type: {
 | 
						|
    enumerable: true,
 | 
						|
    writable: true,
 | 
						|
    value: undefined
 | 
						|
  },
 | 
						|
  message: {
 | 
						|
    enumerable: true,
 | 
						|
    writable: true,
 | 
						|
    value: undefined
 | 
						|
  },
 | 
						|
  stack: {
 | 
						|
    enumerable: true,
 | 
						|
    writable: true,
 | 
						|
    value: undefined
 | 
						|
  },
 | 
						|
  raw: {
 | 
						|
    enumerable: false,
 | 
						|
    get: function () {
 | 
						|
      return this[rawSymbol]
 | 
						|
    },
 | 
						|
    set: function (val) {
 | 
						|
      this[rawSymbol] = val
 | 
						|
    }
 | 
						|
  }
 | 
						|
})
 | 
						|
Object.defineProperty(pinoErrProto, rawSymbol, {
 | 
						|
  writable: true,
 | 
						|
  value: {}
 | 
						|
})
 | 
						|
 | 
						|
function errSerializer (err) {
 | 
						|
  if (!(err instanceof Error)) {
 | 
						|
    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
 | 
						|
  for (const key in err) {
 | 
						|
    if (_err[key] === undefined) {
 | 
						|
      const val = err[key]
 | 
						|
      if (val instanceof Error) {
 | 
						|
        /* eslint-disable no-prototype-builtins */
 | 
						|
        if (!val.hasOwnProperty(seen)) {
 | 
						|
          _err[key] = errSerializer(val)
 | 
						|
        }
 | 
						|
      } else {
 | 
						|
        _err[key] = val
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  delete err[seen] // clean up tag in case err is serialized again later
 | 
						|
  _err.raw = err
 | 
						|
  return _err
 | 
						|
}
 |