0.14.0 • Published 11 months ago

@onsetsoftware/automerge-patcher v0.14.0

Weekly downloads
-
License
-
Repository
github
Last release
11 months ago

Automerge Patcher

Utility functions to apply and invert patches generated by Automerge document changes.

Installation

npm install @onsetsoftware/automerge-patcher

Usage

patch(doc: Doc, patch: Patch): Patch

Used to take a single automerge patch and apply it to a document. It can also be used to apply an Automerge patch to a plain javascript object with the same shape as the relevant document

import { patch } from "@onsetsoftware/automerge-patcher";
import { from, change, type PutPatch } from "@automerge/automerge";

const doc = from({ foo: "bar" });
const toApply = {
  action: "put",
  path: ["foo"],
  value: "baz",
};

const updated = change(doc, (d) => {
  patch(d, toApply);
});

console.log(updated); // => { foo: 'baz' }

unpatch(beforeDoc: Doc, patch: Patch): Patch

Provides the inverse of a patch, given the initial document (before the change) on which the patch applies.

import { unpatch } from "@onsetsoftware/automerge-patcher";
import { from } from "@automerge/automerge";

const doc = from({ foo: "bar" });
const patch = {
  action: "put",
  path: ["foo"],
  value: "baz",
};

const inverse = unpatch(doc, patch);
console.log(inverse); // => { action: 'put', path: ["foo"], value: "bar"}

unpatchAll(beforeDoc: Doc, patches: Patch[]): Patch[]

unpatchAll can be used to reverse an array of patches relative to the initial (before changes) document which produced them. It works by progressively updating a copy of the document after applying each patch, then reversing the next patch based on the new state.

!NOTE
The best (and fastest) way to get the reverse of a change is to use the automerge diff function, but it isn't ready quite yet. In the meantime, the unpatchAll function is provided to acheive this.

import { patch, unpatchAll } from "@onsetsoftware/automerge-patcher";
import { from, change, type Patch } from "@automerge/automerge";

const doc = from({ foo: "bar" });

let reverse: Patch[];

const doc2 = change(
  doc,
  {
    patchCallback: (patches, { before }) => {
      // capture reverse of the patches for undo
      reverse = unpatchAll(before, patches);
    },
  },
  (doc) => {
    doc.foo = "baz";
  },
);

console.log(reverse); // [{action: 'put', path: ['foo'], value: 'bar'}]
console.log(doc2.foo); // baz

const doc3 = change(doc2, (doc) => {
  // apply the patch to revert the change
  reverse.forEach((patch) => {
    applyPatch(doc, patch);
  });
});

console.log(doc3.foo); // bar
0.14.0

11 months ago

0.13.0

1 year ago

0.12.2

1 year ago

0.12.1

1 year ago

0.12.0

1 year ago

0.11.0

1 year ago

0.10.0

1 year ago

0.9.0

2 years ago

0.8.0-alpha.11

2 years ago

0.8.0-alpha.10

2 years ago

0.8.0-alpha.9

2 years ago

0.8.0-alpha.6

2 years ago

0.8.0-alpha.5

2 years ago

0.8.0-alpha.8

2 years ago

0.8.0-beta.3

2 years ago

0.8.0-beta.1

2 years ago

0.8.0-alpha.4

2 years ago

0.8.0-beta.2

2 years ago

0.8.1

2 years ago

0.8.0

2 years ago

0.8.0-alpha.3

2 years ago

0.8.0-alpha.2

2 years ago

0.8.0-alpha.1

2 years ago

0.8.0-alpha.0

2 years ago

0.7.2

2 years ago

0.7.3

2 years ago

0.7.1

2 years ago

0.7.0

2 years ago

0.5.0

2 years ago

0.4.1

2 years ago

0.6.0

2 years ago

0.4.0

2 years ago

0.3.0

2 years ago

0.2.0

2 years ago

0.1.1

2 years ago

0.1.0

3 years ago