{"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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"}