@bjoerge/mutiny
Version:
Tiny toolkit for working with Sanity mutations in JavaScript & TypeScript
1 lines • 11.4 kB
Source Map (JSON)
{"version":3,"file":"decode.cjs","sources":["../../src/encoders/sanity/decode.ts"],"sourcesContent":["import {type SetIfMissingOp, type SetOp} from '../../mutations/operations/types'\nimport {\n type Mutation,\n type NodePatch,\n type SanityDocumentBase,\n} from '../../mutations/types'\nimport {parse as parsePath} from '../../path/parser/parse'\n\nexport type {Mutation, SanityDocumentBase}\n\nexport type SanityDiffMatchPatch = {\n id: string\n diffMatchPatch: {[path: string]: string}\n}\n\nexport type SanitySetPatch = {\n id: string\n set: {[path: string]: any}\n}\n\nexport type Insert = {\n before?: string\n after?: string\n replace?: string\n items: any[]\n}\n\nexport type SanityInsertPatch = {\n id: string\n insert: Insert\n}\n\nexport type SanityUnsetPatch = {\n id: string\n unset: string[]\n}\n\nexport type SanityIncPatch = {\n id: string\n inc: {[path: string]: number}\n}\n\nexport type SanityDecPatch = {\n id: string\n dec: {[path: string]: number}\n}\n\nexport type SanitySetIfMissingPatch = {\n id: string\n setIfMissing: {[path: string]: any}\n}\n\nexport type SanityPatch =\n | SanitySetPatch\n | SanityUnsetPatch\n | SanityInsertPatch\n | SanitySetIfMissingPatch\n | SanityDiffMatchPatch\n | SanityIncPatch\n | SanityDecPatch\n\nexport type SanityCreateIfNotExistsMutation<Doc extends SanityDocumentBase> = {\n createIfNotExists: Doc\n}\n\nexport type SanityCreateOrReplaceMutation<Doc extends SanityDocumentBase> = {\n createOrReplace: Doc\n}\n\nexport type SanityCreateMutation<Doc extends SanityDocumentBase> = {\n create: Doc\n}\n\nexport type SanityDeleteMutation = {\n delete: {id: string}\n}\n\nexport type SanityPatchMutation = {\n patch:\n | SanitySetPatch\n | SanitySetIfMissingPatch\n | SanityDiffMatchPatch\n | SanityInsertPatch\n | SanityUnsetPatch\n}\n\nexport type SanityMutation<\n Doc extends SanityDocumentBase = SanityDocumentBase,\n> =\n | SanityCreateMutation<Doc>\n | SanityCreateIfNotExistsMutation<Doc>\n | SanityCreateOrReplaceMutation<Doc>\n | SanityDeleteMutation\n | SanityPatchMutation\n\nfunction isCreateIfNotExistsMutation<Doc extends SanityDocumentBase>(\n sanityMutation: SanityMutation<Doc>,\n): sanityMutation is SanityCreateIfNotExistsMutation<Doc> {\n return 'createIfNotExists' in sanityMutation\n}\n\nfunction isCreateOrReplaceMutation<Doc extends SanityDocumentBase>(\n sanityMutation: SanityMutation<Doc>,\n): sanityMutation is SanityCreateOrReplaceMutation<Doc> {\n return 'createOrReplace' in sanityMutation\n}\n\nfunction isCreateMutation<Doc extends SanityDocumentBase>(\n sanityMutation: SanityMutation<Doc>,\n): sanityMutation is SanityCreateMutation<Doc> {\n return 'create' in sanityMutation\n}\n\nfunction isDeleteMutation(\n sanityMutation: SanityMutation<any>,\n): sanityMutation is SanityDeleteMutation {\n return 'delete' in sanityMutation\n}\n\nfunction isPatchMutation(\n sanityMutation: SanityMutation<any>,\n): sanityMutation is SanityPatchMutation {\n return 'patch' in sanityMutation\n}\n\nfunction isSetPatch(sanityPatch: SanityPatch): sanityPatch is SanitySetPatch {\n return 'set' in sanityPatch\n}\n\nfunction isSetIfMissingPatch(\n sanityPatch: SanityPatch,\n): sanityPatch is SanitySetIfMissingPatch {\n return 'setIfMissing' in sanityPatch\n}\n\nfunction isDiffMatchPatch(\n sanityPatch: SanityPatch,\n): sanityPatch is SanityDiffMatchPatch {\n return 'diffMatchPatch' in sanityPatch\n}\n\nfunction isUnsetPatch(\n sanityPatch: SanityPatch,\n): sanityPatch is SanityUnsetPatch {\n return 'unset' in sanityPatch\n}\n\nfunction isIncPatch(sanityPatch: SanityPatch): sanityPatch is SanityIncPatch {\n return 'inc' in sanityPatch\n}\n\nfunction isDecPatch(sanityPatch: SanityPatch): sanityPatch is SanityDecPatch {\n return 'inc' in sanityPatch\n}\n\nfunction isInsertPatch(\n sanityPatch: SanityPatch,\n): sanityPatch is SanityInsertPatch {\n return 'insert' in sanityPatch\n}\n\nexport function decodeAll<Doc extends SanityDocumentBase>(\n sanityMutations: SanityMutation<Doc>[],\n) {\n return sanityMutations.map(decodeMutation)\n}\n\nexport function decode<Doc extends SanityDocumentBase>(\n encodedMutation: SanityMutation<Doc>,\n) {\n return decodeMutation(encodedMutation)\n}\n\nfunction decodeMutation<Doc extends SanityDocumentBase>(\n encodedMutation: SanityMutation<Doc>,\n): Mutation {\n if (isCreateIfNotExistsMutation(encodedMutation)) {\n return {\n type: 'createIfNotExists',\n document: encodedMutation.createIfNotExists,\n }\n }\n if (isCreateOrReplaceMutation(encodedMutation)) {\n return {\n type: 'createOrReplace',\n document: encodedMutation.createOrReplace,\n }\n }\n if (isCreateMutation(encodedMutation)) {\n return {type: 'create', document: encodedMutation.create}\n }\n if (isDeleteMutation(encodedMutation)) {\n return {id: encodedMutation.delete.id, type: 'delete'}\n }\n if (isPatchMutation(encodedMutation)) {\n return {\n type: 'patch',\n id: encodedMutation.patch.id,\n patches: decodeNodePatches(encodedMutation.patch),\n }\n }\n throw new Error(`Unknown mutation: ${JSON.stringify(encodedMutation)}`)\n}\n\nconst POSITION_KEYS = ['before', 'replace', 'after'] as const\n\nfunction getInsertPosition(insert: Insert) {\n const positions = POSITION_KEYS.filter(k => k in insert)\n if (positions.length > 1) {\n throw new Error(\n `Insert patch is ambiguous. Should only contain one of: ${POSITION_KEYS.join(\n ', ',\n )}, instead found ${positions.join(', ')}`,\n )\n }\n return positions[0]\n}\n\nfunction decodeNodePatches<T>(patch: SanityPatch): NodePatch<any, any>[] {\n // If multiple patches are included, then the order of execution is as follows\n // set, setIfMissing, unset, inc, dec, insert.\n // order is defined here: https://www.sanity.io/docs/http-mutations#2f480b2baca5\n return [\n ...getSetPatches(patch),\n ...getSetIfMissingPatches(patch),\n ...getUnsetPatches(patch),\n ...getIncPatches(patch),\n ...getDecPatches(patch),\n ...getInsertPatches(patch),\n ]\n\n throw new Error(`Unknown patch: ${JSON.stringify(patch)}`)\n}\n\nfunction getSetPatches(patch: SanityPatch): NodePatch<any[], SetOp<any>>[] {\n return isSetPatch(patch)\n ? Object.keys(patch.set).map(path => ({\n path: parsePath(path),\n op: {type: 'set', value: patch.set[path]},\n }))\n : []\n}\n\nfunction getSetIfMissingPatches(\n patch: SanityPatch,\n): NodePatch<any[], SetIfMissingOp<any>>[] {\n return isSetIfMissingPatch(patch)\n ? Object.keys(patch.setIfMissing).map(path => ({\n path: parsePath(path),\n op: {type: 'setIfMissing', value: patch.setIfMissing[path]},\n }))\n : []\n}\n\nfunction getDiffMatchPatchPatches(patch: SanityPatch) {\n return isDiffMatchPatch(patch)\n ? Object.keys(patch.diffMatchPatch).map(path => ({\n path: parsePath(path),\n op: {type: 'diffMatchPatch', value: patch.diffMatchPatch[path]},\n }))\n : []\n}\n\nfunction getUnsetPatches(patch: SanityPatch) {\n return isUnsetPatch(patch)\n ? patch.unset.map(path => ({\n path: parsePath(path),\n op: {type: 'unset'},\n }))\n : []\n}\n\nfunction getIncPatches(patch: SanityPatch) {\n return isIncPatch(patch)\n ? Object.keys(patch.inc).map(path => ({\n path: parsePath(path),\n op: {type: 'inc', amount: patch.inc[path]},\n }))\n : []\n}\n\nfunction getDecPatches(patch: SanityPatch) {\n return isDecPatch(patch)\n ? Object.keys(patch.dec).map(path => ({\n path: parsePath(path),\n op: {type: 'dec', amount: patch.dec[path]},\n }))\n : []\n}\n\nfunction getInsertPatches(patch: SanityPatch) {\n if (!isInsertPatch(patch)) {\n return []\n }\n const position = getInsertPosition(patch.insert)\n if (!position) {\n throw new Error('Insert patch missing position')\n }\n\n const path = parsePath(patch.insert[position]!)\n const referenceItem = path.pop()\n\n const op =\n position === 'replace'\n ? {\n type: 'insert',\n position: position,\n referenceItem,\n items: patch.insert.items,\n }\n : {\n type: 'insert',\n position: position,\n referenceItem,\n items: patch.insert.items,\n }\n\n return [{path, op}]\n}\n"],"names":["parsePath"],"mappings":"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"}