# json-merge-patch

> Implementation of JSON Merge Patch (RFC 7396)

Latest version **1.0.2** (published 2021-07-21) · MIT license · 0 weekly downloads

## Install

```sh
npm install json-merge-patch
pnpm add json-merge-patch
yarn add json-merge-patch
bun add json-merge-patch
```

## Health

**Score 23/100 (F)** — status: abandoned.

Positive: has types package; no vulnerabilities; high quality score.

Warnings: low downloads; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.0.2 |
| Published | 2021-07-21 |
| First published | 2015-03-28 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | separate (@types/json-merge-patch) |
| Module format | CommonJS |
| Dependencies | 1 |
| Unpacked size | 10.5 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 90 |
| Author | Pierre Inglebert |
| Maintainers | pierre.inglebert |
| Keywords | JSON, Merge, Patch, rfc, 7396 |

## Links

- npm: https://www.npmjs.com/package/json-merge-patch
- Repository: https://github.com/pierreinglebert/json-merge-patch
- Issues: https://github.com/pierreinglebert/json-merge-patch/issues
- npm.io page: https://npm.io/package/json-merge-patch

## Dependencies (1)

- [fast-deep-equal](https://npm.io/package/fast-deep-equal.md) ^3.1.3

## Alternatives

- [@mapbox/jsonlint-lines-primitives](https://npm.io/package/@mapbox/jsonlint-lines-primitives.md) — 5.3M weekly downloads
- [reftools](https://npm.io/package/reftools.md) — 3.5M weekly downloads
- [@hey-api/openapi-ts](https://npm.io/package/@hey-api/openapi-ts.md) — 3.5M weekly downloads
- [@mapbox/geojson-rewind](https://npm.io/package/@mapbox/geojson-rewind.md) — 2.4M weekly downloads
- [turbo-stream](https://npm.io/package/turbo-stream.md) — 1.7M weekly downloads

## Recent versions

- 1.0.2 (latest) — 2021-07-21
- 1.0.1 — 2020-10-13
- 1.0.0 — 2020-05-09
- 0.2.3 — 2015-04-09
- 0.2.2 — 2015-04-09
- 0.2.1 — 2015-04-08
- 0.2.0 — 2015-04-01
- 0.1.1 — 2015-03-29
- 0.1.0 — 2015-03-28

## README

JSON Merge Patch
===============

[![build status][travis-image]][travis-url]
[![Test coverage][coveralls-image]][coveralls-url]
[![Dependency Status][dep-image]][dep-url]
[![devDependency Status][devDep-image]][devDep-url]

An implementation of the JSON Merge Patch [RFC 7396](http://tools.ietf.org/html/rfc7396)

JSON Merge Patch [(RFC 7396)](http://tools.ietf.org/html/rfc7396) is a standard format that
allows you to update a JSON document by sending the changes rather than the whole document.
JSON Merge Patch plays well with the HTTP PATCH verb (method) and REST style programming.


## Install

Install the current version (and save it as a dependency):

### npm

```sh
$ npm install json-merge-patch --save
```


## Usage

### Applying patches:
```js
jsonmergepatch.apply(obj: Object, patch: Object) : Object
```
Applies `patch` onto source `obj`.

### Example:
```js
var source = {
  "title": "Goodbye!",
  "author" : {
		"givenName" : "John",
		"familyName" : "Doe"
	}
};

var patch = {
	"title": 'Hello!',
	"author": {
		"familyName": null
	}
}

var target = jsonmergepatch.apply(source, patch);

// target = {
// 	"title": "Hello!",
//   "author" : {
// 		"givenName" : "John",
// 	}
// }
```

### 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 = {
  "title": "Goodbye!",
  "author" : "John Doe"
};

var target = {
	"title": "Hello!",
};

var patch = jsonmergepatch.generate(source, target);

// patch = {
// 	"title": 'Hello!',
// 	"author": null
// }
```

### Merging patches

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.


### Usage with Javascript objects

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"
// }
```

## Running tests

```sh
npm test
```

# License

  MIT

[travis-image]: https://img.shields.io/travis/pierreinglebert/json-merge-patch/master.svg?style=flat-square
[travis-url]: https://travis-ci.org/pierreinglebert/json-merge-patch
[coveralls-image]: https://img.shields.io/coveralls/pierreinglebert/json-merge-patch/master.svg?style=flat-square
[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

---
_Source: https://npm.io/package/json-merge-patch · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
