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, }); });