seamless-immutable
Advanced tools
Comparing version 2.0.2 to 2.1.0
{ | ||
"name": "seamless-immutable", | ||
"main": "seamless-immutable.js", | ||
"version": "2.0.2", | ||
"version": "2.1.0", | ||
"homepage": "https://github.com/rtfeldman/seamless-immutable", | ||
@@ -6,0 +6,0 @@ "authors": [ |
{ | ||
"name": "seamless-immutable", | ||
"version": "2.0.2", | ||
"version": "2.1.0", | ||
"description": "Immutable data structures for JavaScript which are backwards-compatible with normal JS Arrays and Objects.", | ||
@@ -5,0 +5,0 @@ "main": "seamless-immutable.js", |
@@ -196,2 +196,6 @@ seamless-immutable | ||
#### 2.1.0 | ||
Adds optional `merger` function to `#merge`. | ||
#### 2.0.2 | ||
@@ -198,0 +202,0 @@ |
@@ -223,3 +223,4 @@ (function(){ | ||
* @param {object} other - The other object to merge. Multiple objects can be passed as an array. In such a case, the later an object appears in that list, the higher its priority. | ||
* @param {object} config - Optional config object that contains settings. Right now only {deep: true} is supported for a merge deep. | ||
* @param {object} config - Optional config object that contains settings. Supported settings are: {deep: true} for deep merge and {merger: mergerFunc} where mergerFunc is a function | ||
* that takes a property from both objects. If anything is returned it overrides the normal merge behaviour. | ||
*/ | ||
@@ -240,2 +241,3 @@ function merge(other, config) { | ||
deep = config && config.deep, | ||
merger = config && config.merger, | ||
key; | ||
@@ -248,4 +250,6 @@ | ||
var immutableValue = Immutable(otherObj[key]); | ||
var mergerResult = merger && merger(currentObj[key], immutableValue); | ||
anyChanges = anyChanges || | ||
mergerResult !== undefined || | ||
(!currentObj.hasOwnProperty(key) || | ||
@@ -256,3 +260,5 @@ ((immutableValue !== currentObj[key]) && | ||
if (deep && isObject(currentObj[key]) && isObject(immutableValue)) { | ||
if (mergerResult) { | ||
result[key] = mergerResult; | ||
} else if (deep && isObject(currentObj[key]) && isObject(immutableValue)) { | ||
result[key] = currentObj[key].merge(immutableValue, config); | ||
@@ -259,0 +265,0 @@ } else { |
@@ -205,2 +205,25 @@ var Immutable = require("../../seamless-immutable.js"); | ||
function arrayMerger(thisValue, providedValue) { | ||
if (thisValue instanceof Array && providedValue instanceof Array) { | ||
return thisValue.concat(providedValue); | ||
} | ||
} | ||
it("merges with a custom merger when the config tells it to", function() { | ||
var expected = Immutable({all: "your base", are: {belong: "to us"}, you: ['have', 'no', 'chance', 'to', 'survive']}); | ||
var actual = Immutable({all: "your base", are: {belong: "to us"}, you: ['have', 'no']}).merge({you: ['chance', 'to', 'survive']}, {merger: arrayMerger}); | ||
assert.deepEqual(actual, expected); | ||
}); | ||
it("merges deep with a custom merger when the config tells it to", function() { | ||
var original = Immutable({id: 3, name: "three", valid: true, a: {id: 2}, b: [50], x: [1, 2], sub: {z: [100]}}); | ||
var toMerge = {id: 3, name: "three", valid: false, a: [1000], b: {id: 4}, x: [3, 4], sub: {y: [10, 11], z: [101, 102]}}; | ||
var expected = Immutable({id: 3, name: "three", valid: false, a: [1000], b: {id: 4}, x: [1, 2, 3, 4], sub: {z: [100, 101, 102], y: [10, 11]}}); | ||
var actual = original.merge(toMerge, {deep: true, merger: arrayMerger}); | ||
assert.deepEqual(actual, expected); | ||
}); | ||
describe("when passed a single object", function() { | ||
@@ -214,2 +237,6 @@ generateMergeTestsFor([TestUtils.ComplexObjectSpecifier()]); | ||
describe("when passed a single object with a custom merger", function() { | ||
generateMergeTestsFor([TestUtils.ComplexObjectSpecifier()], {merger: arrayMerger()}); | ||
}); | ||
describe("when passed an array of objects", function() { | ||
@@ -222,3 +249,7 @@ generateMergeTestsFor([generateArrayOfObjects]); | ||
}); | ||
describe("when passed an array of objects with a custom merger", function() { | ||
generateMergeTestsFor([generateArrayOfObjects], {merger: arrayMerger()}); | ||
}); | ||
}); | ||
}; |
75022
1169
234