Skip to content

Library to diff JSON objects into atomic put and delete operations, and apply change sets to objects. Useful with Levelup/LevelDB object synchronization.

License

Notifications You must be signed in to change notification settings

deepforge-dev/changeset

Repository files navigation

changeset

Generate diff changesets for javascript objects, decomposing diffs into a series of puts and delete operations. The format is similar to the levelupbatch operation list for bulk operations.

Handles circular references of Objects and Arrays.

build status

Example

Take a diff of two objects and produce a list of transformation operations:

vardiff=require('changeset');vara={name: 'Eugene',number: 42,tags: ['tag1','tag2','tag3'],scores: {tetris: 1000,carmageddon: 3}};varb={name: 'Susan',number: 43,tags: ['tag1','tag4'],scores: {carmageddon: 3,zelda: 3000},age: 37};varchanges=diff(a,b);expect(changes).to.deep.equal([{type: 'put',key: ['name'],value: 'Susan'},{type: 'put',key: ['number'],value: 43},{type: 'put',key: ['tags','1'],value: 'tag4'},{type: 'del',key: ['tags','2']},{type: 'del',key: ['scores','tetris']},{type: 'put',key: ['scores','zelda'],value: 3000},{type: 'put',key: ['age'],value: 37}]);

Apply an operational changeset and apply it to an object to get a transformed object:

vardiff=require('changeset');varchanges=[{type: 'put',key: ['name'],value: 'Susan'},{type: 'put',key: ['number'],value: 43},{type: 'put',key: ['tags','1'],value: 'tag4'},{type: 'del',key: ['tags','2']},{type: 'del',key: ['scores','tetris']},{type: 'put',key: ['scores','zelda'],value: 3000},{type: 'put',key: ['age'],value: 37}];vara={name: 'Eugene',number: 42,tags: ['tag1','tag2','tag3'],scores: {tetris: 1000,carmageddon: 3}};// apply the changes to avarb_=diff.apply(changes,a);varb={name: 'Susan',number: 43,tags: ['tag1','tag4'],scores: {carmageddon: 3,zelda: 3000},age: 37};// the transformed object should now equal bexpect(b_).to.deep.equals(b);

By default apply will return a new modified object after applying the changeset. If you want to modify the destination, pass true as the third parameter:

// apply the changes to a and modify avarb_=diff.apply(changes,a,true);// a is now modified, and b_ is the same as aexpect(b_).to.equal(a);

About

Library to diff JSON objects into atomic put and delete operations, and apply change sets to objects. Useful with Levelup/LevelDB object synchronization.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • TypeScript100.0%