Rebase pending Automerge field edits

This commit is contained in:
Timothy J. Aveni
2026-09-03 09:39:22 -07:00
parent a5899e6b57
commit 1a4f3ab8cc
5 changed files with 56 additions and 15 deletions
+27
View File
@@ -11,6 +11,7 @@ import {
loadAutomergeFieldDoc,
materializeAutomergeFieldValue,
mergeAutomergeFieldValues,
reconcileAutomergeFieldDocs,
saveAutomergeFieldDoc,
} from "../src/crdt-automerge.js";
@@ -105,6 +106,32 @@ test("Automerge change application is idempotent", () => {
assert.deepEqual(twice.materialized, { count: 1 });
});
test("Automerge changes retain remote history while local writes are pending", () => {
const stored = createAutomergeFieldValue({ local: false, remote: false }, type);
const base = loadAutomergeFieldDoc(stored, type);
const local = Automerge.change(
Automerge.clone(base, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
(doc) => {
(doc.value as { local: boolean }).local = true;
},
);
const remote = Automerge.change(
Automerge.clone(base, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"),
(doc) => {
(doc.value as { remote: boolean }).remote = true;
},
);
const rebased = reconcileAutomergeFieldDocs(remote, local);
const update = createAutomergeFieldChanges(remote, rebased, type);
const result = mergeAutomergeFieldValues({
existing: saveAutomergeFieldDoc(remote, type),
incoming: update,
type,
});
assert.deepEqual(result.materialized, { local: true, remote: true });
});
test("Automerge change batches reject malformed framing", () => {
const stored = createAutomergeFieldValue({ count: 0 }, type);
assert.throws(