// Basic trimerge function that merges values, strings, and objects import { combineMergers, trimergeEquality, trimergeObject, trimergeString, } from 'trimerge'; import { create, Delta } from 'jsondiffpatch'; import { MergeAllBranchesFn, TrimergeClientOptions, } from '../TrimergeClientOptions'; import { produce } from 'immer'; import { computeRef as computeShaRef } from 'trimerge-sync-hash'; import { makeMergeAllBranchesFn, MergeDocFn } from '../merge-all-helper'; const trimergeObjects = combineMergers( trimergeEquality, trimergeString, trimergeObject, ); export const merge: MergeDocFn = (base, left, right) => ({ doc: trimergeObjects(base?.doc, left.doc, right.doc), metadata: { ref: `(${left.ref}+${right.ref})`, message: `merge`, }, }); export const mergeAllBranches: MergeAllBranchesFn = makeMergeAllBranchesFn((a, b) => (a < b ? -1 : 1), merge); export const jdp = create({ textDiff: { minLength: 20 } }); export function patch(base: T, delta: Delta | undefined): T { if (delta === undefined) { return base; } return produce(base, (draft) => jdp.patch(draft, delta)); } export function diff(left: T, right: T) { return jdp.diff(left, right); } export function computeRef( baseRef: string | undefined, mergeRef: string | undefined, delta: any, ): string { return computeShaRef(baseRef, mergeRef, delta).slice(0, 8); } export type TestSavedDoc = any; export type TestDoc = any; export type TestPresence = any; export const TEST_OPTS: Pick< TrimergeClientOptions, 'differ' | 'computeRef' | 'mergeAllBranches' > = { differ: { diff, patch, }, computeRef, mergeAllBranches, };