UNPKG

utils-deep-clone

Version:
180 lines (134 loc) 5.8 kB
*# utils-deep-clone* Deep clones any `json` datatype [![NPM](https://nodei.co/npm/utils-deep-clone.png?mini=true)](_https://nodei.co/npm/utils-deep-clone/_) *## Installation* ``` bash yarn add utils-deep-clone ``` ``` bash npm install utils-deep-clone ``` *## Motivation* `utils-deep-clone` is designed specifically for [winstonJS](_https://github.com/winstonjs/winston/_) but it can be used wheresoever required. [WinstonJS](_https://github.com/winstonjs/winston/_) 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.<anonymous> (/Users/atishay/Documents/utils-error-deep-log/Untitled-1.js:3:19)\n at Module._compile (module.js:652:30)\n at Object.Module._extensions..js (module.js:663:10)\n at Module.load (module.js:565:32)\n at tryModuleLoad (module.js:505:12)\n at Function.Module._load (module.js:497:3)\n at Function.Module.runMain (module.js:693:10)\n at startup (bootstrap_node.js:188:16)\n at bootstrap_node.js:609:3' }, arrayValue: [ 'value1', 'value2', { message: 'Something wrong happened again again', stack: 'Error: Something wrong happened again again\n at Object.<anonymous> (/Users/atishay/Documents/utils-error-deep-log/Untitled-1.js:5:20)\n at Module._compile (module.js:652:30)\n at Object.Module._extensions..js (module.js:663:10)\n at Module.load (module.js:565:32)\n at tryModuleLoad (module.js:505:12)\n at Function.Module._load (module.js:497:3)\n at Function.Module.runMain (module.js:693:10)\n at startup (bootstrap_node.js:188:16)\n at bootstrap_node.js:609:3', someData: 'Some data', isActive: true } ], nestedValue: { someError2: { message: 'Something wrong happened again', stack: 'Error: Something wrong happened again\n at Object.<anonymous> (/Users/atishay/Documents/utils-error-deep-log/Untitled-1.js:4:20)\n at Module._compile (module.js:652:30)\n at Object.Module._extensions..js (module.js:663:10)\n at Module.load (module.js:565:32)\n at tryModuleLoad (module.js:505:12)\n at Function.Module._load (module.js:497:3)\n at Function.Module.runMain (module.js:693:10)\n at startup (bootstrap_node.js:188:16)\n at bootstrap_node.js:609:3' } } } ``` *## 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.<anonymous> (/Users/atishay/Desktop/utils-error-deep-log/logger.js:20:10) 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 ```