From 98cb0cd996fbb9cf07aa2b55f7ace673b21bdd30 Mon Sep 17 00:00:00 2001 From: Nathanial Hartman Date: Sat, 17 Feb 2018 18:32:25 -0800 Subject: [PATCH] Added Single Parent Flag --- src/freezer.js | 3 ++- src/frozen.js | 3 +++ tests/freezer-spec.js | 13 +++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/freezer.js b/src/freezer.js index b0165f8..daf1e78 100644 --- a/src/freezer.js +++ b/src/freezer.js @@ -11,7 +11,8 @@ var Freezer = function( initialValue, options ) { ops = options || {}, store = { live: ops.live || false, - freezeInstances: ops.freezeInstances || false + freezeInstances: ops.freezeInstances || false, + singleParent: ops.singleParent || false } ; diff --git a/src/frozen.js b/src/frozen.js index 9343fb7..35f9861 100644 --- a/src/frozen.js +++ b/src/frozen.js @@ -403,6 +403,9 @@ var Frozen = { ; if( index === -1 ){ + if(node.__.store.singleParent && parents.length >= 1){ + throw new Error('Node already has a parent'); + } parents[ parents.length ] = parent; } }, diff --git a/tests/freezer-spec.js b/tests/freezer-spec.js index 3ab373c..9f59961 100644 --- a/tests/freezer-spec.js +++ b/tests/freezer-spec.js @@ -434,4 +434,17 @@ describe("Freezer test", function(){ assert.equal( freezer.get().b.z, 0 ); assert.equal( freezer.get().b.x[0], 'z' ); }); + + it('singleParent should limit a node to having one parent', function () { + var freezer = new Freezer({ + a: { + b: {} + }, + c: {} + }, {singleParent: true, live: true}); + const oldB = freezer.get().a.b; + assert.throws(function() { + freezer.get().c.set({b: oldB}); + }, Error, "Node already has a parent"); + }); });