UNPKG

@langchain/core

Version:
1 lines 13.3 kB
{"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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"}