@sanity/mutate
Version:
Experimental toolkit for working with Sanity mutations in JavaScript & TypeScript
1 lines • 17.3 kB
Source Map (JSON)
{"version":3,"file":"encode.cjs","sources":["../../src/encoders/sanity/decode.ts","../../src/encoders/sanity/encode.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 ...getDiffMatchPatchPatches(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","import {\n type Mutation,\n type NodePatch,\n type Transaction,\n} from '../../mutations/types'\nimport {stringify as stringifyPath} from '../../path/parser/stringify'\n\nexport function encode(mutation: Mutation) {\n return encodeMutation(mutation)\n}\n\nexport function encodeAll(mutations: Mutation[]) {\n return mutations.flatMap(encode)\n}\n\nexport function encodeTransaction(transaction: Transaction) {\n return {\n transactionId: transaction.id,\n mutations: encodeAll(transaction.mutations),\n }\n}\n\nexport function encodeMutation(mutation: Mutation) {\n if (\n mutation.type === 'create' ||\n mutation.type === 'createIfNotExists' ||\n mutation.type === 'createOrReplace'\n ) {\n return {[mutation.type]: mutation.document}\n }\n if (mutation.type === 'delete') {\n return {\n delete: {id: mutation.id},\n }\n }\n const ifRevisionID = mutation.options?.ifRevision\n return mutation.patches.map(patch => {\n return {\n patch: {\n id: mutation.id,\n ...(ifRevisionID && {ifRevisionID}),\n ...patchToSanity(patch),\n },\n }\n })\n}\n\nfunction patchToSanity(patch: NodePatch) {\n const {path, op} = patch\n if (op.type === 'unset') {\n return {unset: [stringifyPath(path)]}\n }\n if (op.type === 'insert') {\n return {\n insert: {\n [op.position]: stringifyPath([...path, op.referenceItem]),\n items: op.items,\n },\n }\n }\n if (op.type === 'diffMatchPatch') {\n return {diffMatchPatch: {[stringifyPath(path)]: op.value}}\n }\n if (op.type === 'inc') {\n return {inc: {[stringifyPath(path)]: op.amount}}\n }\n if (op.type === 'dec') {\n return {dec: {[stringifyPath(path)]: op.amount}}\n }\n if (op.type === 'set' || op.type === 'setIfMissing') {\n return {[op.type]: {[stringifyPath(path)]: op.value}}\n }\n if (op.type === 'truncate') {\n const range = [\n op.startIndex,\n typeof op.endIndex === 'number' ? op.endIndex : '',\n ].join(':')\n\n return {unset: [`${stringifyPath(path)}[${range}]`]}\n }\n if (op.type === 'upsert') {\n // note: upsert currently not supported by sanity, so will always insert at reference position\n return {\n unset: op.items.map(item =>\n stringifyPath([...path, {_key: (item as any)._key}]),\n ),\n insert: {\n [op.position]: stringifyPath([...path, op.referenceItem]),\n items: op.items,\n },\n }\n }\n if (op.type === 'assign') {\n return {\n set: Object.fromEntries(\n Object.keys(op.value).map(key => [\n stringifyPath(path.concat(key)),\n op.value[key as keyof typeof op.value],\n ]),\n ),\n }\n }\n if (op.type === 'unassign') {\n return {\n unset: op.keys.map(key => stringifyPath(path.concat(key))),\n }\n }\n if (op.type === 'replace') {\n return {\n insert: {\n replace: stringifyPath(path.concat(op.referenceItem)),\n items: op.items,\n },\n }\n }\n if (op.type === 'remove') {\n return {\n unset: [stringifyPath(path.concat(op.referenceItem))],\n }\n }\n //@ts-expect-error all cases should be covered\n throw new Error(`Unknown operation type ${op.type}`)\n}\n"],"names":["parsePath","stringifyPath"],"mappings":"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"}