Deep clones any json datatype
npm install utils-deep-clone# utils-deep-clone
Deep clones any json datatype

## Installation
`` bash`
yarn add utils-deep-clone
` bash`
npm install utils-deep-clone
## Motivation
utils-deep-clone is designed specifically for winstonJS but it can be used wheresoever required. WinstonJS have an open bug that if you pass Error data type nested inside Object or nested inside any other data type then because Error being enumerable it won’t get printed in logs. So to handle this here’s a workaround. Just call toJSON function before calling winston.log and pass the response object in it. An example for this is given at the bottom.
# Normal DeepCloning - THE NEED
`javascript`
const someError = new Error('Something wrong happened')
const someError2 = new Error('Something wrong happened again')
const someError3 = new Error('Something wrong happened again again')
someError3.someData = 'Some data'
someError3.isActive = true
var obj = {
someError,
nestedValue: {
someError2
},
arrayValue: ['value1' ,'value2', someError3]
}
console.log(JSON.parse(JSON.stringify(obj)))
Response:
``
{ someError: {},
nestedValue: { someError2: {} },
arrayValue: [ 'value1', 'value2', { someData: 'Some data', isActive: true } ] }
Error is not getting printed because of it’s enumerable property.
# Usage - THE SOLUTION
Now doing the same thing with utils-deep-clone
`javascript
const { toJSON } = require('utils-deep-clone')
const someError = new Error('Something wrong happened')
const someError2 = new Error('Something wrong happened again')
const someError3 = new Error('Something wrong happened again again')
someError3.someData = 'Some data'
someError3.isActive = true
var obj = {
someError,
nestedValue: {
someError2
},
arrayValue: ['value1' ,'value2', someError3]
}
console.log(toJSON(obj))
`
Response:
``
{ someError:
{ message: 'Something wrong happened',
stack: 'Error: Something wrong happened\n at Object.
arrayValue:
[ 'value1',
'value2',
{ message: 'Something wrong happened again again',
stack: 'Error: Something wrong happened again again\n at Object.
someData: 'Some data',
isActive: true } ],
nestedValue:
{ someError2:
{ message: 'Something wrong happened again',
stack: 'Error: Something wrong happened again\n at Object.
## Debugging
`javascript
const { toJSON, debug } = require('utils-deep-clone')
// Simply Call this for getting debug logs
debug()
const someError = new Error('Something wrong happened')
console.log(toJSON(someError))
`
# Winston Bug
Here’s the example from winston 2.x but the same bug exists in winston 3.x also.
`javascript
const winston = require('winston')
const winstonLogger = new (winston.Logger)({
transports: [
new (winston.transports.Console)()
]
})
const log = (message, payload) => {
return winstonLogger.log('info', message, payload)
}
const testObj = {
error: new Error('Nothing will happen')
}
log('Testing few bugs', testObj)
`
Response:
``
info: Testing few bugs
Now, we’ll be also using utils-deep-clone
`javascript
const winston = require('winston')
const { toJSON } = require('utils-deep-clone')
const winstonLogger = new (winston.Logger)({
transports: [
new (winston.transports.Console)()
]
})
const log = (message, payload) => {
try {
payload = toJSON(payload)
return winstonLogger.log('info', message, payload)
} catch(error) {
console.error('some error occured while consoling')
}
}
const testObj = {
error: new Error('It should work')
}
log('Testing few bugs', testObj)
`
Response:
```
info: Testing few bugs message=It should work, stack=Error: It should work
at Object.
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Function.Module.runMain (module.js:693:10)
at startup (bootstrap_node.js:188:16)
at bootstrap_node.js:609:3