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"); + }); });