{"version":3,"file":"find-reference-Ctre9VEI.mjs","names":["obj: Reference[\"obj\"]","key: Reference[\"key\"]"],"sources":["../src/pointer/find-reference.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n                       ⚡ Storm Software - Stryke\n\n This code was released as part of the Stryke project. Stryke\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/stryke.\n\n Website:                  https://stormsoftware.com\n Repository:               https://github.com/storm-software/stryke\n Documentation:            https://docs.stormsoftware.com/projects/stryke\n Contact:                  https://stormsoftware.com/contact\n\n SPDX-License-Identifier:  Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { isSetObject } from \"@stryke/type-checks/is-set-object\";\nimport { isString } from \"@stryke/type-checks/is-string\";\n\nexport interface Reference {\n  /** Target value where pointer is pointing. */\n  readonly val: unknown;\n  /** Object which contains the target value. */\n  readonly obj?: unknown | object | unknown[];\n  /** Key which targets the target value in the object. */\n  readonly key?: string | number;\n}\n\nconst { isArray } = Array;\n\n/**\n * Finds a target in document specified by JSON Pointer. Also returns the\n * object containing the target and key used to reference that object.\n *\n * Throws Error('NOT_FOUND') if pointer does not result into a value in the middle\n * of the path. If the last element of the path does not result into a value, the\n * lookup succeeds with `val` set to `undefined`. It can be used to discriminate\n * missing values, because `undefined` is not a valid JSON value.\n *\n * If last element in array is targeted using \"-\", e.g. \"/arr/-\", use\n * `isArrayEnd` to verify that:\n *\n * ```js\n * const ref = find({arr: [1, 2, 3], ['arr', '-']});\n * if (isArrayReference(ref)) {\n *   if (isArrayEnd(ref)) {\n *     // ...\n *   }\n * }\n * ```\n *\n * @param val - Document to search in.\n * @param path - JSON Pointer path.\n * @returns Reference to the target.\n */\nexport const find = (val: unknown, path: Reference[\"key\"][]): Reference => {\n  const pathLength = path.length;\n  if (!pathLength) {\n    return { val };\n  }\n\n  let obj: Reference[\"obj\"];\n  let key: Reference[\"key\"];\n  for (let i = 0; i < pathLength; i++) {\n    obj = val;\n    key = path[i];\n    if (isArray(obj)) {\n      const length = obj.length;\n      if (key === \"-\") {\n        key = length;\n      } else if (isString(key)) {\n        const key2 = Math.trunc(Number.parseInt(key));\n        if (String(key2) !== key) {\n          throw new Error(\"INVALID_INDEX\");\n        }\n\n        key = key2;\n        if (key < 0) {\n          throw new Error(\"INVALID_INDEX\");\n        }\n      }\n\n      if (key) {\n        val = obj[key];\n      }\n    } else if (isSetObject(obj)) {\n      val = key && key in obj ? (obj as any)[key] : undefined;\n    } else throw new Error(\"NOT_FOUND\");\n  }\n  const ref: Reference = {\n    val,\n    obj,\n    key\n  };\n\n  return ref;\n};\n\nexport interface ArrayReference<T = unknown> {\n  /** `undefined` in case JSON Pointer points to last element, e.g. \"/foo/-\". */\n  readonly val: undefined | T;\n  readonly obj: T[];\n  readonly key: number;\n}\n\nexport const isArrayReference = <T = unknown>(\n  ref: Reference\n): ref is ArrayReference<T> => isArray(ref.obj) && typeof ref.key === \"number\";\n\nexport const isArrayEnd = (ref: ArrayReference): boolean =>\n  ref.obj.length === ref.key;\n\nexport interface ObjectReference<T = unknown> {\n  readonly val: T;\n  readonly obj: Record<string, T>;\n  readonly key: string;\n}\n\nexport const isObjectReference = <T = unknown>(\n  ref: Reference\n): ref is ObjectReference<T> =>\n  typeof ref.obj === \"object\" && typeof ref.key === \"string\";\n"],"mappings":";;;;AA8BA,MAAM,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BpB,MAAa,QAAQ,KAAc,SAAwC;CACzE,MAAM,aAAa,KAAK;AACxB,KAAI,CAAC,WACH,QAAO,EAAE,KAAK;CAGhB,IAAIA;CACJ,IAAIC;AACJ,MAAK,IAAI,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,QAAM;AACN,QAAM,KAAK;AACX,MAAI,QAAQ,IAAI,EAAE;GAChB,MAAM,SAAS,IAAI;AACnB,OAAI,QAAQ,IACV,OAAM;YACG,SAAS,IAAI,EAAE;IACxB,MAAM,OAAO,KAAK,MAAM,OAAO,SAAS,IAAI,CAAC;AAC7C,QAAI,OAAO,KAAK,KAAK,IACnB,OAAM,IAAI,MAAM,gBAAgB;AAGlC,UAAM;AACN,QAAI,MAAM,EACR,OAAM,IAAI,MAAM,gBAAgB;;AAIpC,OAAI,IACF,OAAM,IAAI;aAEH,YAAY,IAAI,CACzB,OAAM,OAAO,OAAO,MAAO,IAAY,OAAO;MACzC,OAAM,IAAI,MAAM,YAAY;;AAQrC,QANuB;EACrB;EACA;EACA;EACD;;AAYH,MAAa,oBACX,QAC6B,QAAQ,IAAI,IAAI,IAAI,OAAO,IAAI,QAAQ;AAEtE,MAAa,cAAc,QACzB,IAAI,IAAI,WAAW,IAAI;AAQzB,MAAa,qBACX,QAEA,OAAO,IAAI,QAAQ,YAAY,OAAO,IAAI,QAAQ"}