{"version":3,"sources":["../src/query/json-pointer.ts"],"names":["readOwnProperty"],"mappings":";;;;;AAIO,IAAM,sBAAA,GAAyB;AAkI/B,SAAS,YAAY,QAAA,EAA4C;AACtE,EAAA,IAAI,QAAA,CAAS,SAAS,sBAAA,EAAwB;AAC5C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,+BAAA,EAAkC,sBAAsB,CAAA,EAAA,EAAK,QAAA,CAAS,MAAM,CAAA;AAAA,KAC9E;AAAA,EACF;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY;AACxC,IAAA,IAAI,YAAY,GAAA,EAAK;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,OAAO,CAAA,IAAK,UAAU,CAAA,EAAG;AAC7C,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,sDAAsD,OAAO,CAAA;AAAA,SAC/D;AAAA,MACF;AACA,MAAA,OAAO,QAAQ,QAAA,EAAS;AAAA,IAC1B;AACA,IAAA,OAAO,yBAAyB,OAAO,CAAA;AAAA,EACzC,CAAC,CAAA;AAED,EAAA,OAAO,CAAA,CAAA,EAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAC9B;AAEA,SAAS,sBACP,KAAA,EACwC;AACxC,EAAA,OAAO,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5B;AAEO,SAAS,qBACd,KAAA,EACa;AACb,EAAA,IAAI,qBAAA,CAAsB,KAAK,CAAA,EAAG;AAChC,IAAA,OAAO,YAAY,KAAK,CAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,kBAAkB,KAAK,CAAA;AAChC;AAEO,SAAS,iBAAiB,OAAA,EAAyC;AACxE,EAAA,IAAI,YAAY,EAAA,EAAI;AAClB,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,cAAc,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,GAAG,CAAA;AAC9C,EAAA,OAAO,YAAY,GAAA,CAAI,CAAC,OAAA,KAAY,wBAAA,CAAyB,OAAO,CAAC,CAAA;AACvE;AAaO,SAAS,kBAAA,CACd,OACA,OAAA,EACS;AACT,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,KAAA,MAAW,OAAA,IAAW,gBAAA,CAAiB,OAAO,CAAA,EAAG;AAC/C,IAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,MAAA,EAAW,OAAO,MAAA;AACtD,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,MAAA;AACxC,IAAA,OAAA,GAAUA,iCAAA,CAAgB,SAAoC,OAAO,CAAA;AAAA,EACvE;AACA,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,gBAAA,CACd,MACA,QAAA,EACa;AACb,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,KAAS,EAAA,EAAI;AACxB,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,IAAI,aAAa,EAAA,EAAI;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,gBAAA,GAAmB;AAAA,IACvB,GAAG,iBAAiB,IAAI,CAAA;AAAA,IACxB,GAAG,iBAAiB,QAAQ;AAAA,GAC9B;AACA,EAAA,OAAO,YAAY,gBAAgB,CAAA;AACrC;AAEA,SAAS,kBAAkB,OAAA,EAA8B;AACvD,EAAA,IAAI,YAAY,EAAA,IAAM,CAAC,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC9C,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAChE;AAEA,EAAA,MAAM,QAAA,GAAW,OAAA,KAAY,EAAA,GAAK,EAAC,GAAI,QAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA;AACjE,EAAA,IAAI,QAAA,CAAS,SAAS,sBAAA,EAAwB;AAC5C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,+BAAA,EAAkC,sBAAsB,CAAA,EAAA,EAAK,QAAA,CAAS,MAAM,CAAA;AAAA,KAC9E;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,YAAY,GAAA,EAAK;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,sBAAA,CAAuB,OAAO,CAAA,EAAG;AACpC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,oDAAoD,OAAO,CAAA;AAAA,OAC7D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAMO,SAAS,yBAAyB,OAAA,EAAyB;AAChE,EAAA,OAAO,QAAQ,UAAA,CAAW,GAAA,EAAK,IAAI,CAAA,CAAE,UAAA,CAAW,KAAK,IAAI,CAAA;AAC3D;AAEA,SAAS,yBAAyB,OAAA,EAAyB;AACzD,EAAA,OAAO,QAAQ,UAAA,CAAW,IAAA,EAAM,GAAG,CAAA,CAAE,UAAA,CAAW,MAAM,GAAG,CAAA;AAC3D;AAEA,SAAS,uBAAuB,OAAA,EAA0B;AACxD,EAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,OAAA,CAAQ,MAAA,EAAQ,SAAS,CAAA,EAAG;AACtD,IAAA,IAAI,OAAA,CAAQ,KAAK,CAAA,KAAM,GAAA,EAAK;AAC1B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,GAAQ,CAAC,CAAA;AAC9B,IAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,EAAK;AAChC,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,KAAA,IAAS,CAAA;AAAA,EACX;AACA,EAAA,OAAO,IAAA;AACT","file":"chunk-OZ3ZU7Q2.cjs","sourcesContent":["// JSON Pointer utilities and types.\n\nimport { readOwnProperty } from \"../utils/object\";\n\nexport const MAX_JSON_POINTER_DEPTH = 5 as const;\n\nexport type JsonPointer = string & { readonly __jsonPointer: unique symbol };\nexport type JsonPointerSegment = string | number;\nexport type JsonPointerSegments = readonly JsonPointerSegment[];\n\ntype Depth = 0 | 1 | 2 | 3 | 4 | 5;\n\ninterface DepthDecrementMap {\n  0: 0;\n  1: 0;\n  2: 1;\n  3: 2;\n  4: 3;\n  5: 4;\n}\n\ntype Decrement<Current extends Depth> = DepthDecrementMap[Current];\n\ntype NonNegativeIntegerString = Exclude<`${bigint}`, `-${string}`>;\ntype ObjectPointerKey<T> = Exclude<\n  Extract<keyof T, string>,\n  NonNegativeIntegerString\n>;\n\ntype EncodeTilde<S extends string> =\n  S extends `${infer Head}~${infer Tail}` ?\n    `${EncodeTilde<Head>}~0${EncodeTilde<Tail>}`\n  : S;\n\ntype EncodeSlash<S extends string> =\n  S extends `${infer Head}/${infer Tail}` ?\n    `${EncodeSlash<Head>}~1${EncodeSlash<Tail>}`\n  : S;\n\ntype EncodePointerSegment<S extends string> = EncodeSlash<EncodeTilde<S>>;\n\ntype DecodePointerSegment<S extends string> =\n  S extends `${infer Head}~1${infer Tail}` ?\n    `${DecodePointerSegment<Head>}/${DecodePointerSegment<Tail>}`\n  : S extends `${infer Head}~0${infer Tail}` ?\n    `${DecodePointerSegment<Head>}~${DecodePointerSegment<Tail>}`\n  : S;\n\ntype PointerForArray<T, Current extends Depth> =\n  | `/${NonNegativeIntegerString}`\n  | (Current extends 1 ? never\n    : `/${NonNegativeIntegerString}${JsonPointerFor<T, Decrement<Current>>}`);\n\ntype PointerForObject<T, Current extends Depth> = {\n  [K in ObjectPointerKey<T>]:\n    | `/${EncodePointerSegment<K>}`\n    | (Current extends 1 ? never\n      : `/${EncodePointerSegment<K>}${JsonPointerFor<T[K], Decrement<Current>>}`);\n}[ObjectPointerKey<T>];\n\nexport type JsonPointerFor<T, Current extends Depth = 5> =\n  | \"\"\n  | (Current extends 0 ? \"\"\n    : T extends readonly (infer U)[] ? PointerForArray<U, Current>\n    : never)\n  | (Current extends 0 ? \"\"\n    : T extends Record<string, unknown> ? PointerForObject<T, Current>\n    : never);\n\ntype PointerSegmentsForArray<T, Current extends Depth> =\n  | readonly [number]\n  | (Current extends 1 ? readonly [number]\n    : readonly [number, ...JsonPointerSegmentsFor<T, Decrement<Current>>]);\n\ntype PointerSegmentsForObject<T, Current extends Depth> = {\n  [K in ObjectPointerKey<T>]:\n    | readonly [K]\n    | (Current extends 1 ? readonly [K]\n      : readonly [K, ...JsonPointerSegmentsFor<T[K], Decrement<Current>>]);\n}[ObjectPointerKey<T>];\n\nexport type JsonPointerSegmentsFor<T, Current extends Depth = 5> =\n  | readonly []\n  | (Current extends 0 ? readonly []\n    : T extends readonly (infer U)[] ? PointerSegmentsForArray<U, Current>\n    : never)\n  | (Current extends 0 ? readonly []\n    : T extends Record<string, unknown> ? PointerSegmentsForObject<T, Current>\n    : never);\n\nexport type JsonPointerInput<T> =\n  JsonPointerFor<T> | JsonPointerSegmentsFor<T> | JsonPointer;\n\nexport type ResolveJsonPointer<T, Pointer extends string> =\n  Pointer extends \"\" ? T\n  : Pointer extends `/${infer Head}/${infer Tail}` ?\n    ResolveJsonPointer<\n      ResolvePointerSegment<T, DecodePointerSegment<Head>>,\n      `/${Tail}`\n    >\n  : Pointer extends `/${infer Head}` ?\n    ResolvePointerSegment<T, DecodePointerSegment<Head>>\n  : unknown;\n\ntype ResolvePointerSegment<T, Segment extends string> =\n  T extends readonly (infer U)[] ?\n    Segment extends NonNegativeIntegerString ?\n      U\n    : unknown\n  : T extends Record<string, unknown> ?\n    Segment extends keyof T ?\n      Segment extends NonNegativeIntegerString ?\n        unknown\n      : T[Segment]\n    : unknown\n  : unknown;\n\nexport type ResolveJsonPointerSegments<\n  T,\n  Segments extends readonly JsonPointerSegment[],\n> =\n  Segments extends readonly [] ? T\n  : Segments extends readonly [infer Head, ...infer Tail] ?\n    ResolveJsonPointerSegments<\n      ResolvePointerSegment<T, SegmentToString<Head>>,\n      Extract<Tail, readonly JsonPointerSegment[]>\n    >\n  : unknown;\n\ntype SegmentToString<Segment> =\n  Segment extends number ? `${Segment}`\n  : Segment extends string ? Segment\n  : string;\n\nexport function jsonPointer(segments: JsonPointerSegments): JsonPointer {\n  if (segments.length > MAX_JSON_POINTER_DEPTH) {\n    throw new Error(\n      `JSON Pointer exceeds max depth ${MAX_JSON_POINTER_DEPTH}: ${segments.length}`,\n    );\n  }\n\n  if (segments.length === 0) {\n    return \"\" as JsonPointer;\n  }\n\n  const encoded = segments.map((segment) => {\n    if (segment === \"-\") {\n      throw new Error(\n        \"JSON Pointer '-' segment is not allowed for query access\",\n      );\n    }\n    if (typeof segment === \"number\") {\n      if (!Number.isInteger(segment) || segment < 0) {\n        throw new Error(\n          `JSON Pointer index must be a non-negative integer: ${segment}`,\n        );\n      }\n      return segment.toString();\n    }\n    return encodeJsonPointerSegment(segment);\n  });\n\n  return `/${encoded.join(\"/\")}` as JsonPointer;\n}\n\nfunction isJsonPointerSegments(\n  input: unknown,\n): input is readonly JsonPointerSegment[] {\n  return Array.isArray(input);\n}\n\nexport function normalizeJsonPointer<T>(\n  input: JsonPointerInput<T>,\n): JsonPointer {\n  if (isJsonPointerSegments(input)) {\n    return jsonPointer(input);\n  }\n\n  return assertJsonPointer(input);\n}\n\nexport function parseJsonPointer(pointer: JsonPointer): readonly string[] {\n  if (pointer === \"\") {\n    return [];\n  }\n\n  const rawSegments = pointer.slice(1).split(\"/\");\n  return rawSegments.map((segment) => decodeJsonPointerSegment(segment));\n}\n\n/**\n * Resolves the value at a JSON pointer within a plain JS value, returning\n * `undefined` if any segment is missing or traverses a non-object.\n *\n * Segments are read by OWN key: the values walked here are data (a props bag\n * parsed out of a JSON column, a caller's probe record) and the segments are\n * data too — they come from schema field names. A raw read would answer a\n * segment named after an `Object.prototype` member (\"toString\") with the\n * inherited member instead of `undefined`, so a missing field would resolve to\n * a function for every value.\n */\nexport function resolveJsonPointer(\n  value: unknown,\n  pointer: JsonPointer,\n): unknown {\n  let current = value;\n  for (const segment of parseJsonPointer(pointer)) {\n    if (current === null || current === undefined) return undefined;\n    if (typeof current !== \"object\") return undefined;\n    current = readOwnProperty(current as Record<string, unknown>, segment);\n  }\n  return current;\n}\n\nexport function joinJsonPointers(\n  base: JsonPointer | undefined,\n  relative: JsonPointer,\n): JsonPointer {\n  if (!base || base === \"\") {\n    return relative;\n  }\n  if (relative === \"\") {\n    return base;\n  }\n\n  const combinedSegments = [\n    ...parseJsonPointer(base),\n    ...parseJsonPointer(relative),\n  ];\n  return jsonPointer(combinedSegments);\n}\n\nfunction assertJsonPointer(pointer: string): JsonPointer {\n  if (pointer !== \"\" && !pointer.startsWith(\"/\")) {\n    throw new Error(\"JSON Pointer must be empty or start with '/'\");\n  }\n\n  const segments = pointer === \"\" ? [] : pointer.slice(1).split(\"/\");\n  if (segments.length > MAX_JSON_POINTER_DEPTH) {\n    throw new Error(\n      `JSON Pointer exceeds max depth ${MAX_JSON_POINTER_DEPTH}: ${segments.length}`,\n    );\n  }\n\n  for (const segment of segments) {\n    if (segment === \"-\") {\n      throw new Error(\n        \"JSON Pointer '-' segment is not allowed for query access\",\n      );\n    }\n    if (!isValidPointerEncoding(segment)) {\n      throw new Error(\n        `Invalid JSON Pointer escape sequence in segment: ${segment}`,\n      );\n    }\n  }\n\n  return pointer as JsonPointer;\n}\n\n/**\n * Escape a single JSON Pointer reference segment per RFC 6901: `~`\n * becomes `~0`, `/` becomes `~1`. Callers join the result with `/`.\n */\nexport function encodeJsonPointerSegment(segment: string): string {\n  return segment.replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\");\n}\n\nfunction decodeJsonPointerSegment(segment: string): string {\n  return segment.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\");\n}\n\nfunction isValidPointerEncoding(segment: string): boolean {\n  for (let index = 0; index < segment.length; index += 1) {\n    if (segment[index] !== \"~\") {\n      continue;\n    }\n    const next = segment[index + 1];\n    if (next !== \"0\" && next !== \"1\") {\n      return false;\n    }\n    index += 1;\n  }\n  return true;\n}\n"]}