UNPKG

@sanity/mutator

Version:

A set of models to make it easier to utilize the powerful real time collaborative features of Sanity

75 lines (64 loc) 2.01 kB
import {DiffMatchPatch} from './DiffMatchPatch' import {IncPatch} from './IncPatch' import {InsertPatch} from './InsertPatch' import {SetIfMissingPatch} from './SetIfMissingPatch' import {SetPatch} from './SetPatch' import {type PatchTypes, type SingleDocumentPatch} from './types' import {UnsetPatch} from './UnsetPatch' // Parses a content lake patch into our own personal patch implementations export function parsePatch(patch: SingleDocumentPatch | SingleDocumentPatch[]): PatchTypes[] { const result: PatchTypes[] = [] if (Array.isArray(patch)) { return patch.reduce((r, p) => r.concat(parsePatch(p)), result) } const {set, setIfMissing, unset, diffMatchPatch, inc, dec, insert} = patch if (setIfMissing) { Object.keys(setIfMissing).forEach((path) => { result.push(new SetIfMissingPatch(patch.id, path, setIfMissing[path])) }) } if (set) { Object.keys(set).forEach((path) => { result.push(new SetPatch(patch.id, path, set[path])) }) } if (unset) { unset.forEach((path) => { result.push(new UnsetPatch(patch.id, path)) }) } if (diffMatchPatch) { Object.keys(diffMatchPatch).forEach((path) => { result.push(new DiffMatchPatch(patch.id, path, diffMatchPatch[path])) }) } if (inc) { Object.keys(inc).forEach((path) => { result.push(new IncPatch(patch.id, path, inc[path])) }) } if (dec) { Object.keys(dec).forEach((path) => { result.push(new IncPatch(patch.id, path, -dec[path])) }) } if (insert) { let location: string let path: string const spec = insert if ('before' in spec) { location = 'before' path = spec.before } else if ('after' in spec) { location = 'after' path = spec.after } else if ('replace' in spec) { location = 'replace' path = spec.replace } else { throw new Error('Invalid insert patch') } result.push(new InsertPatch(patch.id, location, path, spec.items)) } return result }