Add Automerge CRDT datatype helpers

This commit is contained in:
Timothy J. Aveni
2026-07-12 19:57:27 -07:00
parent b018a0630e
commit 9e44c722e5
6 changed files with 179 additions and 0 deletions
+47
View File
@@ -0,0 +1,47 @@
import assert from "node:assert/strict";
import test from "node:test";
import * as Automerge from "@automerge/automerge";
import {
createAutomergeFieldValue,
loadAutomergeFieldDoc,
materializeAutomergeFieldValue,
mergeAutomergeFieldValues,
saveAutomergeFieldDoc,
} from "../src/crdt-automerge.js";
const type = "camino.CrdtJson";
test("Automerge CRDT fields lift plain values into stored envelopes", () => {
const stored = createAutomergeFieldValue({ title: "draft" }, type);
assert.equal(stored.$caminoCrdtType, type);
assert.equal(stored.$caminoCrdtEncoding, "base64");
assert.deepEqual(materializeAutomergeFieldValue(stored, type), {
title: "draft",
});
});
test("Automerge CRDT fields merge divergent saved documents", () => {
const base = loadAutomergeFieldDoc(
createAutomergeFieldValue({ left: false, right: false }, type),
type,
);
const left = Automerge.change(Automerge.clone(base, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), (doc) => {
(doc.value as { left: boolean }).left = true;
});
const right = Automerge.change(Automerge.clone(base, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"), (doc) => {
(doc.value as { right: boolean }).right = true;
});
const result = mergeAutomergeFieldValues({
existing: saveAutomergeFieldDoc(left, type),
incoming: saveAutomergeFieldDoc(right, type),
type,
});
assert.deepEqual(result.materialized, { left: true, right: true });
assert.deepEqual(materializeAutomergeFieldValue(result.stored, type), {
left: true,
right: true,
});
});