Skip to content

Typescript ready attempt of RFC 7396 JSON Merge Patch method

License

Notifications You must be signed in to change notification settings

riagominota/ts-merge-patch

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ts-merge-patch

Typescript ready attempt of RFC 7396 JSON Merge Patch method

Based upon RFC7396: RFC 7396 This specification defines the JSON merge patch document format, processing rules, and associated MIME media type identifier. The merge patch format is primarily intended for use with the HTTP PATCH method [RFC5789] as a means of describing a set of modifications to a target resource's content.

Install

Install the module via NPM

npm

$ npm install ts-merge-patch --save

To use simply import apply from the module import {apply} from 'ts-merge-patch';

Applying a patch to a target origin:

apply<obj1Type,obj2Type>(target: obj1Type, patchItem: obj2Type) : Object | obj2Type | {}

Example

const patch = {
        title: "Hello!",
        phoneNumber: "+01-123-456-7890",
        author: {
            familyName: null,
        },
        tags: ["example"],
    };

const target = {
        title: "Goodbye!",
        author: {
            givenName: "John",
            familyName: "Doe",
        },
        tags: ["example", "sample"],
        content: "This will be unchanged",
    };

const updated = apply(target,patch);

console.log(updated);
{
    title: "Hello!",
    author: {
    givenName: "John",
    },
    tags: ["example"],
    content: "This will be unchanged",
    phoneNumber: "+01-123-456-7890",
}
import { apply } from "ts-merge-patch";

const target = { a: 56, b: 65, c: { e: 4, hi: 7 } };
const patch = { c: { e: 444 }, newProp: "test" };
console.log(apply(target, patch));
//{ a: 56, b: 65, c: { e: 444, hi: 7 }, newProp: 'test' }

interface ob1 {
  thisItem: string;
  thatItem: string;
  anotherItem: string;
}
interface ob2 {
  bonusItem: string;
  thisItem: string;
  thatItem: string;
}

interface combined extends ob1, ob2 {}

const target2: ob1 = { anotherItem: "bah", thisItem: "this", thatItem: "that" };
const patch2: ob2 = { thisItem: "this", thatItem: "nope", bonusItem: "bonus" };

const r = apply<ob1, ob2>(target2, patch2) as combined;
/*
{
  anotherItem: 'bah',
  thisItem: 'this',
  thatItem: 'nope',
  bonusItem: 'bonus'
}
*/

Running tests

Jest tests are available, many thanks goes to pierreinglebert as his tests provided the basis for which this test code was written. Just rejigged them to work in Jest.

npm test

License

MIT

About

Typescript ready attempt of RFC 7396 JSON Merge Patch method

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published