@langchain/core
Version:
Core LangChain.js abstractions and schemas
1 lines • 13.1 kB
Source Map (JSON)
{"version":3,"file":"json.cjs","names":[],"sources":["../../src/utils/json.ts"],"sourcesContent":["export function parseJsonMarkdown(s: string, parser = parsePartialJson) {\n // eslint-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// eslint-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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"}