UNPKG

@portabletext/patches

Version:
1 lines 15.3 kB
{"version":3,"file":"index.cjs","sources":["../src/arrayInsert.ts","../src/array.ts","../src/object.ts","../src/primitive.ts","../src/string.ts","../src/applyPatch.ts","../src/patches.ts"],"sourcesContent":["export const BEFORE = 'before'\nexport const AFTER = 'after'\n\nexport default function insert(\n array: any[],\n position: string,\n index: number,\n ...args: any[]\n) {\n if (position !== BEFORE && position !== AFTER) {\n throw new Error(\n `Invalid position \"${position}\", must be either ${BEFORE} or ${AFTER}`,\n )\n }\n\n const items = flatten(...args)\n\n if (array.length === 0) {\n return items\n }\n\n const len = array.length\n const idx = Math.abs((len + index) % len) % len\n\n const normalizedIdx = position === 'after' ? idx + 1 : idx\n\n const copy = array.slice()\n copy.splice(normalizedIdx, 0, ...flatten(items))\n return copy\n}\n\nfunction flatten(...values: any[]) {\n return values.reduce((prev, item) => prev.concat(item), [])\n}\n","import {findIndex} from 'lodash'\nimport applyPatch from './applyPatch'\nimport insert from './arrayInsert'\nimport type {PathSegment} from './types'\n\nconst hasOwn = Object.prototype.hasOwnProperty.call.bind(\n Object.prototype.hasOwnProperty,\n)\n\nfunction move(arr: any[], from: number, to: any) {\n const nextValue = arr.slice()\n const val = nextValue[from]\n nextValue.splice(from, 1)\n nextValue.splice(to, 0, val)\n return nextValue\n}\n\nfunction findTargetIndex(array: any[], pathSegment: PathSegment) {\n if (typeof pathSegment === 'number') {\n return pathSegment\n }\n const index = findIndex(array, pathSegment)\n return index === -1 ? false : index\n}\n\nexport default function apply(\n value: any,\n patch: {type: any; path: any; value: any; position: any; items: any},\n) {\n const nextValue = value.slice() // make a copy for internal mutation\n\n if (patch.path.length === 0) {\n // its directed to me\n if (patch.type === 'setIfMissing') {\n if (!Array.isArray(patch.value)) {\n throw new Error('Cannot set value of an array to a non-array')\n }\n return value === undefined ? patch.value : value\n } else if (patch.type === 'set') {\n if (!Array.isArray(patch.value)) {\n throw new Error('Cannot set value of an array to a non-array')\n }\n return patch.value\n } else if (patch.type === 'unset') {\n return undefined\n } else if (patch.type === 'move') {\n if (\n !patch.value ||\n !hasOwn(patch.value, 'from') ||\n !hasOwn(patch.value, 'to')\n ) {\n throw new Error(\n `Invalid value of 'move' patch. Expected a value with \"from\" and \"to\" indexes, instead got: ${JSON.stringify(\n patch.value,\n )}`,\n )\n }\n return move(nextValue, patch.value.from, patch.value.to)\n }\n throw new Error(`Invalid array operation: ${patch.type}`)\n }\n\n const [head, ...tail] = patch.path\n\n const index = findTargetIndex(value, head)\n\n // If the given selector could not be found, return as-is\n if (index === false) {\n return nextValue\n }\n\n if (tail.length === 0) {\n if (patch.type === 'insert') {\n const {position, items} = patch\n return insert(value, position, index, items)\n } else if (patch.type === 'unset') {\n if (typeof index !== 'number') {\n throw new Error(\n `Expected array index to be a number, instead got \"${index}\"`,\n )\n }\n nextValue.splice(index, 1)\n return nextValue\n }\n }\n\n // The patch is not directed to me\n nextValue[index] = applyPatch(nextValue[index], {\n ...patch,\n path: tail,\n })\n return nextValue\n}\n","import {clone, isObject, omit} from 'lodash'\nimport applyPatch from './applyPatch'\n\nexport default function apply(\n value: any,\n patch: {type: any; path: any; value: any},\n) {\n const nextValue = clone(value)\n if (patch.path.length === 0) {\n // its directed to me\n if (patch.type === 'set') {\n if (!isObject(patch.value)) {\n throw new Error('Cannot set value of an object to a non-object')\n }\n return patch.value\n } else if (patch.type === 'unset') {\n return undefined\n } else if (patch.type === 'setIfMissing') {\n // console.log('IS IT missing?', value)\n return value === undefined ? patch.value : value\n }\n throw new Error(`Invalid object operation: ${patch.type}`)\n }\n\n // The patch is not directed to me\n const [head, ...tail] = patch.path\n if (typeof head !== 'string') {\n throw new Error(`Expected field name to be a string, instad got: ${head}`)\n }\n\n if (tail.length === 0 && patch.type === 'unset') {\n return omit(nextValue, head)\n }\n\n nextValue[head] = applyPatch(nextValue[head], {\n ...patch,\n path: tail,\n })\n return nextValue\n}\n","const OPERATIONS: Record<string, any> = {\n replace(_currentValue: any, nextValue: any) {\n return nextValue\n },\n set(_currentValue: any, nextValue: any) {\n return nextValue\n },\n setIfMissing(currentValue: any, nextValue: any) {\n return currentValue === undefined ? nextValue : currentValue\n },\n unset(_currentValue: any, _nextValue: any) {\n return undefined\n },\n inc(currentValue: any, nextValue: any) {\n return currentValue + nextValue\n },\n dec(currentValue: any, nextValue: any) {\n return currentValue - nextValue\n },\n}\n\nconst SUPPORTED_PATCH_TYPES = Object.keys(OPERATIONS)\n\nexport default function apply(value: any, patch: any) {\n if (!SUPPORTED_PATCH_TYPES.includes(patch.type)) {\n throw new Error(\n `Received patch of unsupported type: \"${JSON.stringify(\n patch.type,\n )}\" for primitives. This is most likely a bug.`,\n )\n }\n\n if (patch.path.length > 0) {\n throw new Error(\n `Cannot apply deep operations on primitive values. Received patch with type \"${\n patch.type\n }\" and path \"${patch.path\n .map((path: any) => JSON.stringify(path))\n .join('.')} that targeted the value \"${JSON.stringify(value)}\"`,\n )\n }\n return OPERATIONS[patch.type](value, patch.value)\n}\n","import {applyPatches, parsePatch} from '@sanity/diff-match-patch'\n\ntype fn = (oldVal: any, newVal: any) => any\nconst OPERATIONS: Record<string, fn> = {\n replace(_currentValue: any, nextValue: any) {\n return nextValue\n },\n set(_currentValue: any, nextValue: any) {\n return nextValue\n },\n setIfMissing(currentValue: undefined, nextValue: any) {\n return currentValue === undefined ? nextValue : currentValue\n },\n unset(_currentValue: any, _nextValue: any) {\n return undefined\n },\n diffMatchPatch(currentValue: string, nextValue: string): string {\n const [result] = applyPatches(parsePatch(nextValue), currentValue, {\n allowExceedingIndices: true,\n })\n return result\n },\n}\n\nconst SUPPORTED_PATCH_TYPES = Object.keys(OPERATIONS)\n\nexport default function apply(\n value: string,\n patch: {type: string; path: any[]; value: any},\n): string {\n if (!SUPPORTED_PATCH_TYPES.includes(patch.type)) {\n throw new Error(\n `Received patch of unsupported type: \"${JSON.stringify(\n patch.type,\n )}\" for string. This is most likely a bug.`,\n )\n }\n\n if (patch.path.length > 0) {\n throw new Error(\n `Cannot apply deep operations on string values. Received patch with type \"${\n patch.type\n }\" and path \"${patch.path.join('.')} that targeted the value \"${JSON.stringify(value)}\"`,\n )\n }\n const func = OPERATIONS[patch.type]\n if (func) {\n return func(value, patch.value)\n }\n throw new Error('Unknown patch type')\n}\n","import {isObject, isString} from 'lodash'\nimport applyArrayPatch from './array'\nimport applyObjectPatch from './object'\nimport applyPrimitivePatch from './primitive'\nimport applyStringPatch from './string'\n\n/** @beta */\nexport function applyAll(value: any, patches: any[]) {\n return patches.reduce(_apply, value)\n}\n\nfunction applyPatch(\n value: string,\n patch: {type: string; path: any[]; value: any},\n) {\n if (Array.isArray(value)) {\n return applyArrayPatch(value, patch as any)\n }\n if (isString(value)) {\n return applyStringPatch(value, patch)\n }\n if (isObject(value)) {\n return applyObjectPatch(value, patch)\n }\n return applyPrimitivePatch(value, patch)\n}\n\nexport default function _apply(\n value: string,\n patch: {type: string; path: any[]; value: any},\n) {\n const res = applyPatch(value, patch)\n // console.log('applyPatch(%o, %o) : %o (noop? %o)', value, patch, res, value === res)\n return res\n}\n","import {makePatches, stringifyPatches} from '@sanity/diff-match-patch'\nimport type {\n DiffMatchPatch,\n InsertPatch,\n InsertPosition,\n Path,\n PathSegment,\n SetIfMissingPatch,\n SetPatch,\n UnsetPatch,\n} from './types'\n\n/** @public */\nexport function setIfMissing(value: any, path: Path = []): SetIfMissingPatch {\n return {\n type: 'setIfMissing',\n path,\n value,\n }\n}\n\n/** @public */\nexport function diffMatchPatch(\n currentValue: string,\n nextValue: string,\n path: Path = [],\n): DiffMatchPatch {\n const patches = makePatches(currentValue, nextValue)\n const patch = stringifyPatches(patches)\n return {type: 'diffMatchPatch', path, value: patch}\n}\n\n/** @public */\nexport function insert(\n items: any[],\n position: InsertPosition,\n path: Path = [],\n): InsertPatch {\n return {\n type: 'insert',\n path,\n position,\n items,\n }\n}\n\n/** @public */\nexport function set(value: any, path: Path = []): SetPatch {\n return {type: 'set', path, value}\n}\n\n/** @public */\nexport function unset(path: Path = []): UnsetPatch {\n return {type: 'unset', path}\n}\n\n/** @internal */\nexport function prefixPath<T extends {path: Path}>(\n patch: T,\n segment: PathSegment,\n): T {\n return {\n ...patch,\n path: [segment, ...patch.path],\n }\n}\n"],"names":["insert","findIndex","apply","applyPatch","clone","isObject","omit","OPERATIONS","SUPPORTED_PATCH_TYPES","applyPatches","parsePatch","applyArrayPatch","isString","applyStringPatch","applyObjectPatch","applyPrimitivePatch","makePatches","stringifyPatches"],"mappings":"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"}