json-merge-patch
Advanced tools
Comparing version 0.2.3 to 1.0.0
'use strict'; | ||
var serialize = require('./utils').serialize; | ||
module.exports = function apply(target, patch) { | ||
if(patch === null || typeof patch !== 'object' || Array.isArray(patch)) { | ||
return patch; | ||
} | ||
if(target === null || typeof target !== 'object' || Array.isArray(target)) { | ||
target = {}; | ||
} | ||
var keys = Object.keys(patch); | ||
for(var i=0; i<keys.length; i++) { | ||
var key = keys[i]; | ||
if(patch[key] === null) { | ||
if(target.hasOwnProperty(key)) { | ||
delete target[key]; | ||
} | ||
} else { | ||
target[key] = apply(target[key], patch[key]); | ||
} | ||
} | ||
return target; | ||
patch = serialize(patch); | ||
if (patch === null || typeof patch !== 'object' || Array.isArray(patch)) { | ||
return patch; | ||
} | ||
target = serialize(target); | ||
if (target === null || typeof target !== 'object' || Array.isArray(target)) { | ||
target = {}; | ||
} | ||
var keys = Object.keys(patch); | ||
for (var i = 0; i < keys.length; i++) { | ||
var key = keys[i]; | ||
if (patch[key] === null) { | ||
if (target.hasOwnProperty(key)) { | ||
delete target[key]; | ||
} | ||
} else { | ||
target[key] = apply(target[key], patch[key]); | ||
} | ||
} | ||
return target; | ||
}; |
'use strict'; | ||
var equal = require('deep-equal'); | ||
var serialize = require('./utils').serialize; | ||
function arrayEquals(before, after) { | ||
if(before.length !== after.length) { | ||
if (before.length !== after.length) { | ||
return false; | ||
} | ||
for(var i=0; i<before.length; i++) { | ||
if(!equal(after[i], before[i])) { | ||
for (var i = 0; i < before.length; i++) { | ||
if (!equal(after[i], before[i])) { | ||
return false; | ||
@@ -18,3 +19,6 @@ } | ||
module.exports = function generate(before, after) { | ||
if(before === null || after === null || | ||
before = serialize(before); | ||
after = serialize(after); | ||
if (before === null || after === null || | ||
typeof before !== 'object' || typeof after !== 'object' || | ||
@@ -25,4 +29,4 @@ Array.isArray(before) !== Array.isArray(after)) { | ||
if(Array.isArray(before)) { | ||
if(!arrayEquals(before, after)) { | ||
if (Array.isArray(before)) { | ||
if (!arrayEquals(before, after)) { | ||
return after; | ||
@@ -41,7 +45,7 @@ } | ||
var newKeys = {}; | ||
for(i=0; i < afterKeys.length; i++) { | ||
for (i = 0; i < afterKeys.length; i++) { | ||
key = afterKeys[i]; | ||
if(beforeKeys.indexOf(key) === -1) { | ||
if (beforeKeys.indexOf(key) === -1) { | ||
newKeys[key] = true; | ||
patch[key] = after[key]; | ||
patch[key] = serialize(after[key]); | ||
} | ||
@@ -52,15 +56,15 @@ } | ||
var removedKeys = {}; | ||
for(i=0; i < beforeKeys.length; i++) { | ||
for (i = 0; i < beforeKeys.length; i++) { | ||
key = beforeKeys[i]; | ||
if(afterKeys.indexOf(key) === -1) { | ||
if (afterKeys.indexOf(key) === -1) { | ||
removedKeys[key] = true; | ||
patch[key] = null; | ||
} else { | ||
if(before[key] !== null && typeof before[key] === 'object') { | ||
if (before[key] !== null && typeof before[key] === 'object') { | ||
var subPatch = generate(before[key], after[key]); | ||
if(subPatch !== undefined) { | ||
if (subPatch !== undefined) { | ||
patch[key] = subPatch; | ||
} | ||
} else if(before[key] !== after[key]) { | ||
patch[key] = after[key]; | ||
} else if (before[key] !== after[key]) { | ||
patch[key] = serialize(after[key]); | ||
} | ||
@@ -67,0 +71,0 @@ } |
'use strict'; | ||
module.exports = function merge(patch1, patch2) { | ||
if(patch1 === null || patch2 === null || | ||
if (patch1 === null || patch2 === null || | ||
typeof patch1 !== 'object' || typeof patch2 !== 'object' || | ||
@@ -11,11 +11,11 @@ Array.isArray(patch1) !== Array.isArray(patch2)) { | ||
Object.keys(patch2) | ||
.forEach(function(key) { | ||
if(patch1[key] !== undefined) { | ||
patch[key] = merge(patch1[key], patch2[key]); | ||
} else { | ||
patch[key] = patch2[key]; | ||
} | ||
}); | ||
return patch; | ||
Object.keys(patch2) | ||
.forEach(function(key) { | ||
if (patch1[key] !== undefined) { | ||
patch[key] = merge(patch1[key], patch2[key]); | ||
} else { | ||
patch[key] = patch2[key]; | ||
} | ||
}); | ||
return patch; | ||
}; |
{ | ||
"name": "json-merge-patch", | ||
"version": "0.2.3", | ||
"version": "1.0.0", | ||
"description": "Implementation of JSON Merge Patch (RFC 7396)", | ||
@@ -10,9 +10,13 @@ "main": "index.js", | ||
"devDependencies": { | ||
"chai": "^2.2.0", | ||
"coveralls": "^2.11.2", | ||
"istanbul": "^0.3.11", | ||
"mocha": "^2.2.1" | ||
"chai": "^4.2.0", | ||
"coveralls": "^3.1.0", | ||
"eslint": "^7.0.0", | ||
"istanbul": "^0.4.5", | ||
"mocha": "^7.1.2" | ||
}, | ||
"scripts": { | ||
"test": "make test" | ||
"test": "NODE_ENV=test mocha -b --reporter spec --recursive test", | ||
"lint": "eslint ./lib ./index.js", | ||
"coverage": "istanbul cover _mocha -- -R spec --recursive test", | ||
"coveralls": "istanbul cover ./node_modules/mocha/bin/_mocha --report lcovonly -- -R spec --recursive test && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage" | ||
}, | ||
@@ -37,4 +41,4 @@ "repository": { | ||
"dependencies": { | ||
"deep-equal": "^1.0.0" | ||
"deep-equal": "^2.0.3" | ||
} | ||
} |
@@ -6,2 +6,4 @@ JSON Merge Patch | ||
[![Test coverage][coveralls-image]][coveralls-url] | ||
[![Dependency Status][dep-image]][dep-url] | ||
[![devDependency Status][devDep-image]][devDep-url] | ||
@@ -28,4 +30,10 @@ An implementation of the JSON Merge Patch [RFC 7396](http://tools.ietf.org/html/rfc7396) | ||
Applying patches: | ||
### Applying patches: | ||
```js | ||
jsonmergepatch.apply(obj: Object, patch: Object) : Object | ||
``` | ||
Applies `patch` onto source `obj`. | ||
### Example: | ||
```js | ||
var source = { | ||
@@ -56,4 +64,10 @@ "title": "Goodbye!", | ||
Generating patches: | ||
### Generating patches: | ||
```js | ||
jsonmergepatch.generate(source: Object, target: Object) : Object | ||
``` | ||
Compares `source` and `target` object and generates a `patch` of the changes necessary to convert `source` into `target`. | ||
### Example: | ||
```js | ||
var source = { | ||
@@ -76,21 +90,46 @@ "title": "Goodbye!", | ||
## API | ||
### Merging patches | ||
#### jsonmergepatch.apply (`obj` Object, `patch` Object) : Object | ||
This function is **outside the scope of the RFC**, its purpose is to combine/squash successive patches of the same entity into one patch. | ||
Use it at your own risks. | ||
Applies `patch` on `obj`. | ||
#### jsonmergepatch.generate (`source` Object, `target` Object) : `patch` Object | ||
### Usage with Javascript objects | ||
Generates a `patch` Object from source and target Object. | ||
This library is primarily designed to work with JSON. | ||
Nonetheless, it is possible to use Javascript objects if the method `toJSON()` is implemented, the library will then serialize your object using it. | ||
```js | ||
var patch = jsonmergepatch.generate( | ||
{ | ||
"title": "Goodbye!" | ||
}, | ||
{ | ||
toJSON: () { | ||
return { | ||
"title": "I am serialized" | ||
} | ||
}, | ||
} | ||
); | ||
// patch = { | ||
// "title": "I am serialized", | ||
// } | ||
``` | ||
```js | ||
var patch = jsonmergepatch.generate( | ||
{}, | ||
{ | ||
date: new Date("2020-05-09T00:00:00.000") | ||
} | ||
); | ||
// patch = { | ||
// date: "2020-05-09T00:00:00.000" | ||
// } | ||
``` | ||
#### jsonmergepatch.merge (`patch1` Object, `patch2` Object) : `patch` Object | ||
Generates a `patch` Object by merging patch1 and patch2. | ||
## Running tests | ||
```sh | ||
make test | ||
npm test | ||
``` | ||
@@ -106,1 +145,5 @@ | ||
[coveralls-url]: https://coveralls.io/r/pierreinglebert/json-merge-patch?branch=master | ||
[dep-image]: https://img.shields.io/david/pierreinglebert/json-merge-patch.svg | ||
[dep-url]: https://david-dm.org/pierreinglebert/json-merge-patch | ||
[devDep-image]: https://img.shields.io/david/dev/pierreinglebert/json-merge-patch.svg | ||
[devDep-url]: https://david-dm.org/pierreinglebert/json-merge-patch#info=devDependencies |
Sorry, the diff of this file is not supported yet
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
10687
111
0
145
5
+ Addedarray-buffer-byte-length@1.0.2(transitive)
+ Addedavailable-typed-arrays@1.0.7(transitive)
+ Addeddeep-equal@2.2.3(transitive)
+ Addedes-get-iterator@1.1.3(transitive)
+ Addedfor-each@0.3.5(transitive)
+ Addedhas-bigints@1.1.0(transitive)
+ Addedinternal-slot@1.1.0(transitive)
+ Addedis-array-buffer@3.0.5(transitive)
+ Addedis-bigint@1.1.0(transitive)
+ Addedis-boolean-object@1.2.2(transitive)
+ Addedis-callable@1.2.7(transitive)
+ Addedis-map@2.0.3(transitive)
+ Addedis-number-object@1.1.1(transitive)
+ Addedis-set@2.0.3(transitive)
+ Addedis-shared-array-buffer@1.0.4(transitive)
+ Addedis-string@1.1.1(transitive)
+ Addedis-symbol@1.1.1(transitive)
+ Addedis-weakmap@2.0.2(transitive)
+ Addedis-weakset@2.0.4(transitive)
+ Addedisarray@2.0.5(transitive)
+ Addedobject-inspect@1.13.4(transitive)
+ Addedobject.assign@4.1.7(transitive)
+ Addedpossible-typed-array-names@1.1.0(transitive)
+ Addedsafe-regex-test@1.1.0(transitive)
+ Addedside-channel@1.1.0(transitive)
+ Addedside-channel-list@1.0.0(transitive)
+ Addedside-channel-map@1.0.1(transitive)
+ Addedside-channel-weakmap@1.0.2(transitive)
+ Addedstop-iteration-iterator@1.1.0(transitive)
+ Addedwhich-boxed-primitive@1.1.1(transitive)
+ Addedwhich-collection@1.0.2(transitive)
+ Addedwhich-typed-array@1.1.18(transitive)
- Removeddeep-equal@1.1.2(transitive)
Updateddeep-equal@^2.0.3