{"version":3,"file":"json.cjs","names":[],"sources":["../../src/utils/json.ts"],"sourcesContent":["export function parseJsonMarkdown(s: string, parser = parsePartialJson) {\n  // oxlint-disable-next-line no-param-reassign\n  s = s.trim();\n\n  const firstFenceIndex = s.indexOf(\"```\");\n  if (firstFenceIndex === -1) {\n    return parser(s);\n  }\n\n  let contentAfterFence = s.substring(firstFenceIndex + 3);\n\n  if (contentAfterFence.startsWith(\"json\\n\")) {\n    contentAfterFence = contentAfterFence.substring(5);\n  } else if (contentAfterFence.startsWith(\"json\")) {\n    contentAfterFence = contentAfterFence.substring(4);\n  } else if (contentAfterFence.startsWith(\"\\n\")) {\n    contentAfterFence = contentAfterFence.substring(1);\n  }\n\n  const closingFenceIndex = contentAfterFence.indexOf(\"```\");\n  let finalContent = contentAfterFence;\n  if (closingFenceIndex !== -1) {\n    finalContent = contentAfterFence.substring(0, closingFenceIndex);\n  }\n\n  return parser(finalContent.trim());\n}\n\n/**\n * Recursive descent partial JSON parser.\n * @param s - The string to parse.\n * @returns The parsed value.\n * @throws Error if the input is a malformed JSON string.\n */\nexport function strictParsePartialJson(s: string): unknown {\n  try {\n    return JSON.parse(s);\n  } catch {\n    // Continue to partial parsing\n  }\n\n  const buffer = s.trim();\n  if (buffer.length === 0) throw new Error(\"Unexpected end of JSON input\");\n\n  let pos = 0;\n\n  function skipWhitespace(): void {\n    while (pos < buffer.length && /\\s/.test(buffer[pos])) {\n      pos += 1;\n    }\n  }\n\n  function parseString(): string {\n    if (buffer[pos] !== '\"') {\n      throw new Error(`Expected '\"' at position ${pos}, got '${buffer[pos]}'`);\n    }\n\n    pos += 1;\n    let result = \"\";\n    let escaped = false;\n\n    while (pos < buffer.length) {\n      const char = buffer[pos];\n\n      if (escaped) {\n        if (char === \"n\") {\n          result += \"\\n\";\n        } else if (char === \"t\") {\n          result += \"\\t\";\n        } else if (char === \"r\") {\n          result += \"\\r\";\n        } else if (char === \"\\\\\") {\n          result += \"\\\\\";\n        } else if (char === '\"') {\n          result += '\"';\n        } else if (char === \"b\") {\n          result += \"\\b\";\n        } else if (char === \"f\") {\n          result += \"\\f\";\n        } else if (char === \"/\") {\n          result += \"/\";\n        } else if (char === \"u\") {\n          const hex = buffer.substring(pos + 1, pos + 5);\n          if (/^[0-9A-Fa-f]{0,4}$/.test(hex)) {\n            if (hex.length === 4) {\n              result += String.fromCharCode(Number.parseInt(hex, 16));\n            } else {\n              result += `u${hex}`;\n            }\n\n            pos += hex.length;\n          } else {\n            throw new Error(\n              `Invalid unicode escape sequence '\\\\u${hex}' at position ${pos}`\n            );\n          }\n        } else {\n          throw new Error(\n            `Invalid escape sequence '\\\\${char}' at position ${pos}`\n          );\n        }\n        escaped = false;\n      } else if (char === \"\\\\\") {\n        escaped = true;\n      } else if (char === '\"') {\n        pos += 1;\n        return result;\n      } else {\n        result += char;\n      }\n\n      pos += 1;\n    }\n\n    if (escaped) result += \"\\\\\";\n    return result;\n  }\n\n  function parseNumber(): number {\n    const start = pos;\n    let numStr = \"\";\n\n    if (buffer[pos] === \"-\") {\n      numStr += \"-\";\n      pos += 1;\n    }\n\n    if (pos < buffer.length && buffer[pos] === \"0\") {\n      numStr += \"0\";\n      pos += 1;\n\n      if (buffer[pos] >= \"0\" && buffer[pos] <= \"9\") {\n        throw new Error(`Invalid number at position ${start}`);\n      }\n    }\n\n    if (pos < buffer.length && buffer[pos] >= \"1\" && buffer[pos] <= \"9\") {\n      while (pos < buffer.length && buffer[pos] >= \"0\" && buffer[pos] <= \"9\") {\n        numStr += buffer[pos];\n        pos += 1;\n      }\n    }\n\n    if (pos < buffer.length && buffer[pos] === \".\") {\n      numStr += \".\";\n      pos += 1;\n      while (pos < buffer.length && buffer[pos] >= \"0\" && buffer[pos] <= \"9\") {\n        numStr += buffer[pos];\n        pos += 1;\n      }\n    }\n\n    if (pos < buffer.length && (buffer[pos] === \"e\" || buffer[pos] === \"E\")) {\n      numStr += buffer[pos];\n      pos += 1;\n      if (pos < buffer.length && (buffer[pos] === \"+\" || buffer[pos] === \"-\")) {\n        numStr += buffer[pos];\n        pos += 1;\n      }\n      while (pos < buffer.length && buffer[pos] >= \"0\" && buffer[pos] <= \"9\") {\n        numStr += buffer[pos];\n        pos += 1;\n      }\n    }\n\n    if (numStr === \"-\") return -0;\n\n    const num = Number.parseFloat(numStr);\n\n    if (Number.isNaN(num)) {\n      pos = start;\n      throw new Error(`Invalid number '${numStr}' at position ${start}`);\n    }\n\n    return num;\n  }\n\n  function parseValue(): unknown {\n    skipWhitespace();\n\n    if (pos >= buffer.length) {\n      throw new Error(`Unexpected end of input at position ${pos}`);\n    }\n\n    const char = buffer[pos];\n\n    if (char === \"{\") return parseObject();\n    if (char === \"[\") return parseArray();\n    if (char === '\"') return parseString();\n\n    if (\"null\".startsWith(buffer.substring(pos, pos + 4))) {\n      pos += Math.min(4, buffer.length - pos);\n      return null;\n    }\n\n    if (\"true\".startsWith(buffer.substring(pos, pos + 4))) {\n      pos += Math.min(4, buffer.length - pos);\n      return true;\n    }\n\n    if (\"false\".startsWith(buffer.substring(pos, pos + 5))) {\n      pos += Math.min(5, buffer.length - pos);\n      return false;\n    }\n\n    if (char === \"-\" || (char >= \"0\" && char <= \"9\")) {\n      return parseNumber();\n    }\n\n    throw new Error(`Unexpected character '${char}' at position ${pos}`);\n  }\n\n  function parseArray(): unknown[] {\n    if (buffer[pos] !== \"[\") {\n      throw new Error(`Expected '[' at position ${pos}, got '${buffer[pos]}'`);\n    }\n\n    const arr: unknown[] = [];\n\n    pos += 1;\n    skipWhitespace();\n\n    if (pos >= buffer.length) return arr;\n    if (buffer[pos] === \"]\") {\n      pos += 1;\n      return arr;\n    }\n\n    while (pos < buffer.length) {\n      skipWhitespace();\n      if (pos >= buffer.length) return arr;\n\n      arr.push(parseValue());\n\n      skipWhitespace();\n      if (pos >= buffer.length) return arr;\n\n      if (buffer[pos] === \"]\") {\n        pos += 1;\n        return arr;\n      } else if (buffer[pos] === \",\") {\n        pos += 1;\n        continue;\n      }\n\n      throw new Error(\n        `Expected ',' or ']' at position ${pos}, got '${buffer[pos]}'`\n      );\n    }\n\n    return arr;\n  }\n\n  function parseObject(): Record<string, unknown> {\n    if (buffer[pos] !== \"{\") {\n      throw new Error(`Expected '{' at position ${pos}, got '${buffer[pos]}'`);\n    }\n\n    const obj: Record<string, unknown> = {};\n    pos += 1;\n    skipWhitespace();\n\n    if (pos >= buffer.length) return obj;\n    if (buffer[pos] === \"}\") {\n      pos += 1;\n      return obj;\n    }\n\n    while (pos < buffer.length) {\n      skipWhitespace();\n      if (pos >= buffer.length) return obj;\n\n      const key = parseString();\n\n      skipWhitespace();\n      if (pos >= buffer.length) return obj;\n\n      if (buffer[pos] !== \":\") {\n        throw new Error(\n          `Expected ':' at position ${pos}, got '${buffer[pos]}'`\n        );\n      }\n      pos += 1;\n\n      skipWhitespace();\n      if (pos >= buffer.length) return obj;\n\n      obj[key] = parseValue();\n\n      skipWhitespace();\n      if (pos >= buffer.length) return obj;\n\n      if (buffer[pos] === \"}\") {\n        pos += 1;\n        return obj;\n      } else if (buffer[pos] === \",\") {\n        pos += 1;\n        continue;\n      }\n\n      throw new Error(\n        `Expected ',' or '}' at position ${pos}, got '${buffer[pos]}'`\n      );\n    }\n\n    return obj;\n  }\n\n  const value = parseValue();\n  skipWhitespace();\n\n  if (pos < buffer.length) {\n    throw new Error(`Unexpected character '${buffer[pos]}' at position ${pos}`);\n  }\n\n  return value;\n}\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parsePartialJson(s: string): any | null {\n  // Attempt to parse the modified string as JSON.\n  try {\n    if (typeof s === \"undefined\") return null;\n    return strictParsePartialJson(s);\n  } catch {\n    // If we still can't parse the string as JSON, return null to indicate failure.\n    return null;\n  }\n}\n"],"mappings":"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"}