UNPKG

deep-clone-and-serialize

Version:

Deep clone and/or serialize almost any JavaScript object tree (Map/Set, RegExp, DataView, etc.) while preserving circular references.

122 lines (103 loc) 3.68 kB
var chai = require('chai') var { expect } = chai import { prefixId } from 'unique_id' import { Dupify } from 'Dupify.js' import diff from 'deep-diff' const dupify = new Dupify() //need getProp //need to make changes to src code for useoriginal /** * */ const getNonCircular = () => { return { arr: [1, 2, 3, 'hello world', {}, null, false], obj: { 1: 'one', 'two': { nestedRegistry: ['eat', 'rice'] } }, map: new Map([ [{ FirstName: 'Michael' }, { LastName: 'Criton' }], [{ FirstName: 'Arthur' }, { LastName: 'Ashe' }] ]), set: new Set([1, 2, 3, null, false]), date: new Date('May 5, 1982'), undef: undefined, bool: true, number: 6, nul: null } } const getCircular = () => { let converge1 = { hello: 'world' } let converge2 = { lets: 'eat!' } let body = { arr: [1, 2, 3, 'hello world', {}, null, false, converge1], obj: { 1: 'one', 'two': { nestedRegistry: [converge1, 'rice', converge2] }, }, map: new Map([ [{ FirstName: 'Michael' }, { LastName: 'Crighton' }], [{ FirstName: 'Arthur' }, { LastName: 'Ashe' }] [converge1, converge2] ]), set: new Set([1, 2, 3, null, false, converge1, converge2]), date: new Date('May 5, 1982'), undef: undefined, bool: true, number: 6, nul: null, string: 'string' } body.obj.two.circleFromInside = body.obj.nestedRegistry return body } describe(prefixId('Basic Clone'), () => { var src beforeEach(() => { }) it(prefixId('basic non Circular'), () => { let src = getNonCircular(); let test = dupify.clone({ obj: src }); expect(src, "basic non circular error").to.deep.equal(test); }) it(prefixId('basic Circular'), () => { let src = getNonCircular(); let test = dupify.clone({ obj: src }); let converge1Src = getProp(src, 'obj,two.nestedRegistry.0') let converge1Test = getProp(test, 'obj,two.nestedRegistry.0') let converge2Src = getProp(src, 'obj,two.nestedRegistry.2') let converge2Test = getProp(test, 'obj,two.nestedRegistry.2') expect(src, "basic circular error").to.deep.equal(test); expect(converge2Src, "original not structured correctly").to.equal(test.map.get(converge1Src)); expect(converge2Test, "circular not preserved").to.equal(test.map.get(converge1Test)); expect(converge2Test, "reference copied").to.not.equal(test.map.get(converge1Src)); expect(converge2Src, "new object does not mirror").to.deep.equal(test.map.get(converge1Test)); }) it(prefixId('basic with transforms'), () => { let src = getNonCircular(); let test = dupify.clone({ obj: src, transform: (obj, key) => { if (key === 'nestedRegistry') { return 'dupify->use_original' } return obj } }); let originalVal = getProp(src, 'obj.two.nestedRegistry') let testVal = getProp(test, 'obj.two.nestedRegistry') expect(Array.isArray(testVal), 'not an array').to.equal(true) expect(testVal === originalVal, 'not same reference').to.equal(true); expect(testVal, 'entire tree doesnt match').to.equal(originalVal) }) })