@ai-sdk-tool/parser 3.3.1 → 3.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-7E6UFDFQ.js → chunk-5WKXBBCU.js} +20 -31
- package/dist/chunk-5WKXBBCU.js.map +1 -0
- package/dist/{chunk-EW3A6Y7O.js → chunk-ZDBNJWLY.js} +7 -4
- package/dist/chunk-ZDBNJWLY.js.map +1 -0
- package/dist/community.cjs +20 -29
- package/dist/community.cjs.map +1 -1
- package/dist/community.js +2 -2
- package/dist/index.cjs +20 -29
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.js +4 -3
- package/dist/rxml.cjs +5 -3
- package/dist/rxml.cjs.map +1 -1
- package/dist/rxml.js +1 -1
- package/package.json +13 -12
- package/dist/chunk-7E6UFDFQ.js.map +0 -1
- package/dist/chunk-EW3A6Y7O.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rxml/errors/types.ts","../src/rxml/core/types.ts","../src/rxml/utils/helpers.ts","../src/rxml/builders/stringify.ts","../src/rxml/schema/coercion.ts","../src/rxml/schema/extraction.ts","../src/rxml/core/tokenizer.ts","../src/rxml/core/parser.ts","../src/rxml/heuristics/engine.ts","../src/core/utils/regex.ts","../src/rxml/heuristics/xml-defaults.ts","../src/rxml/parse.ts"],"sourcesContent":["/**\n * Error classes for robust-xml parser\n */\n\nexport class RXMLParseError extends Error {\n cause?: unknown;\n line?: number;\n column?: number;\n\n constructor(\n message: string,\n cause?: unknown,\n line?: number,\n column?: number\n ) {\n super(message);\n this.name = \"RXMLParseError\";\n this.cause = cause;\n this.line = line;\n this.column = column;\n }\n}\n\nexport class RXMLDuplicateStringTagError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"RXMLDuplicateStringTagError\";\n }\n}\n\nexport class RXMLCoercionError extends Error {\n cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = \"RXMLCoercionError\";\n this.cause = cause;\n }\n}\n\nexport class RXMLStringifyError extends Error {\n cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = \"RXMLStringifyError\";\n this.cause = cause;\n }\n}\n\nexport class RXMLStreamError extends Error {\n cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = \"RXMLStreamError\";\n this.cause = cause;\n }\n}\n","/**\n * Core types for the robust-xml parser\n * Based on TXML structure but enhanced for schema-aware parsing\n */\n\nexport type OnErrorFn = (\n message: string,\n metadata?: Record<string, unknown>\n) => void;\n\n/**\n * Represents a parsed XML node in the DOM tree\n */\nexport interface RXMLNode {\n tagName: string;\n attributes: Record<string, string | null>;\n children: (RXMLNode | string)[];\n}\n\n/**\n * Options for XML parsing\n */\nexport interface ParseOptions {\n /** Position to start parsing from (for streaming) */\n pos?: number;\n /** Array of tag names that don't have children and don't need to be closed */\n noChildNodes?: string[];\n /** Whether to set position information in result */\n setPos?: boolean;\n /** Keep comments in the parsed result */\n keepComments?: boolean;\n /** Keep whitespace like spaces, tabs and line breaks as string content */\n keepWhitespace?: boolean;\n /** Name of the text node property (default: \"#text\") */\n textNodeName?: string;\n /** Whether to throw on duplicate string tags */\n throwOnDuplicateStringTags?: boolean;\n /** Error handling callback */\n onError?: OnErrorFn;\n /**\n * Apply internal repair heuristics for fragment parsing.\n * When enabled, parsing attempts normalization/repair before throwing.\n */\n repair?: boolean;\n /** Maximum reparses when repair heuristics are enabled */\n maxReparses?: number;\n /** Whether to parse a single node instead of children */\n parseNode?: boolean;\n /** Filter function for nodes */\n filter?: (\n node: RXMLNode,\n index: number,\n depth: number,\n path: string\n ) => boolean;\n /** Simplify the result structure */\n simplify?: boolean;\n}\n\n/**\n * Options for XML stringification\n */\nexport interface StringifyOptions {\n /** Whether to format the output with indentation */\n format?: boolean;\n /** Whether to suppress empty nodes */\n suppressEmptyNode?: boolean;\n /**\n * Whether to use minimal escaping per XML 1.0:\n * - In character data: escape '&' and '<' (and '>' only in ']]>' sequence)\n * - In attribute values: escape '&', '<', and only the wrapping quote\n * Defaults to false (conservative escaping of &, <, >, \", ')\n */\n minimalEscaping?: boolean;\n /** Error handling callback */\n onError?: OnErrorFn;\n /**\n * Whether to serialize boolean-like attributes (value === null)\n * as name=\"name\" to follow strict XML attribute rules.\n * When false (default), serialize as a convenience flag without value\n * (e.g., <item checked>), for compatibility with existing outputs.\n */\n strictBooleanAttributes?: boolean;\n /**\n * Whether to include the XML declaration\n */\n declaration?: boolean;\n}\n\n/**\n * Result of parsing with position information\n */\nexport interface ParseResult {\n result: (RXMLNode | string)[];\n pos: number;\n}\n\n/**\n * Character code constants for efficient parsing\n */\nexport const CharCodes = {\n OPEN_BRACKET: \"<\".charCodeAt(0),\n CLOSE_BRACKET: \">\".charCodeAt(0),\n MINUS: \"-\".charCodeAt(0),\n SLASH: \"/\".charCodeAt(0),\n EXCLAMATION: \"!\".charCodeAt(0),\n QUESTION: \"?\".charCodeAt(0),\n SINGLE_QUOTE: \"'\".charCodeAt(0),\n DOUBLE_QUOTE: '\"'.charCodeAt(0),\n OPEN_CORNER_BRACKET: \"[\".charCodeAt(0),\n CLOSE_CORNER_BRACKET: \"]\".charCodeAt(0),\n SPACE: \" \".charCodeAt(0),\n TAB: \"\\t\".charCodeAt(0),\n NEWLINE: \"\\n\".charCodeAt(0),\n CARRIAGE_RETURN: \"\\r\".charCodeAt(0),\n} as const;\n\n/**\n * Default self-closing HTML tags\n */\nexport const DEFAULT_NO_CHILD_NODES = [\n \"img\",\n \"br\",\n \"input\",\n \"meta\",\n \"link\",\n \"hr\",\n \"area\",\n \"base\",\n \"col\",\n \"embed\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n] as const;\n\n/**\n * Name spacer characters for tag name parsing\n */\nexport const NAME_SPACER = \"\\r\\n\\t>/= \";\n","/**\n * Utility functions for XML parsing\n */\n\nimport { CharCodes, NAME_SPACER } from \"../core/types\";\n\nconst NAME_START_CHAR_REGEX = /[A-Za-z_:]/;\nconst NAME_CHAR_REGEX = /[A-Za-z0-9_.:-]/;\n\n/**\n * Check if a character is a valid XML name start character\n */\nexport function isNameStartChar(ch: string): boolean {\n return NAME_START_CHAR_REGEX.test(ch);\n}\n\n/**\n * Check if a character is a valid XML name character\n */\nexport function isNameChar(ch: string): boolean {\n return NAME_CHAR_REGEX.test(ch);\n}\n\n/**\n * Check if a character is whitespace\n */\nexport function isWhitespace(charCode: number): boolean {\n return (\n charCode === CharCodes.SPACE ||\n charCode === CharCodes.TAB ||\n charCode === CharCodes.NEWLINE ||\n charCode === CharCodes.CARRIAGE_RETURN\n );\n}\n\n/**\n * Skip over quoted string content in XML\n */\nexport function skipQuoted(s: string, i: number): number {\n const quote = s[i];\n let pos = i + 1;\n while (pos < s.length) {\n const ch = s[pos];\n if (ch === \"\\\\\") {\n pos += 2;\n continue;\n }\n if (ch === quote) {\n return pos + 1;\n }\n pos += 1;\n }\n return pos;\n}\n\n/**\n * Parse a tag name from the current position\n */\nexport function parseName(\n s: string,\n pos: number\n): { name: string; newPos: number } {\n const start = pos;\n let currentPos = pos;\n while (NAME_SPACER.indexOf(s[currentPos]) === -1 && s[currentPos]) {\n currentPos += 1;\n }\n return { name: s.slice(start, currentPos), newPos: currentPos };\n}\n\n/**\n * Parse a quoted string value\n */\nexport function parseString(\n s: string,\n pos: number\n): { value: string; newPos: number } {\n const startChar = s[pos];\n const startPos = pos + 1;\n const endPos = s.indexOf(startChar, startPos);\n if (endPos === -1) {\n // Unclosed string - find the next > to continue parsing\n const tagEnd = s.indexOf(\">\", startPos);\n if (tagEnd !== -1) {\n return { value: s.slice(startPos, tagEnd), newPos: tagEnd };\n }\n // If no > found, return what we have\n return { value: s.slice(startPos), newPos: s.length };\n }\n return { value: s.slice(startPos, endPos), newPos: endPos + 1 };\n}\n\n/**\n * Find elements by attribute value (used for getElementById, etc.)\n */\nexport function findElementsByAttr(\n xmlString: string,\n attrName: string,\n attrValue: string\n): number[] {\n const regex = new RegExp(`\\\\s${attrName}\\\\s*=['\"\"]${attrValue}['\"\"]`);\n const positions: number[] = [];\n let searchPos = 0;\n\n while (true) {\n const match = regex.exec(xmlString.slice(searchPos));\n if (!match) {\n break;\n }\n\n const pos = xmlString.lastIndexOf(\"<\", searchPos + match.index);\n if (pos !== -1) {\n positions.push(pos);\n }\n searchPos += match.index + match[0].length;\n }\n\n return positions;\n}\n\n/**\n * Calculate line and column from position in string\n */\nexport function getLineColumn(\n s: string,\n pos: number\n): { line: number; column: number } {\n let line = 1;\n let column = 1;\n\n for (let i = 0; i < pos && i < s.length; i += 1) {\n if (s[i] === \"\\n\") {\n line += 1;\n column = 1;\n } else {\n column += 1;\n }\n }\n\n return { line, column };\n}\n\n/**\n * Escape XML special characters used in element content and attribute values.\n *\n * References (W3C XML 1.0, Fifth Edition):\n * - 2.4 Character Data and Markup: '<' and '&' MUST NOT appear literally in content;\n * they MUST be escaped. '>' MUST be escaped in the sequence ']]>' and MAY be\n * escaped otherwise. Spec: https://www.w3.org/TR/2008/REC-xml-20081126/\n * - 3.1 Start-Tags, End-Tags, and Empty-Element Tags (AttValue [10]): attribute\n * values are quoted with ' or \", and the matching quote MUST be escaped inside.\n * - 4.6 Predefined Entities: amp, lt, gt, apos, quot MUST be recognized by all\n * XML processors. Spec: https://www.w3.org/TR/2008/REC-xml-20081126/#sec-predefined-ent\n *\n * We conservatively escape &, <, >, \", ' using the predefined entities.\n */\nexport function escapeXml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n/**\n * Minimal escaping for character data per XML 1.0 §2.4.\n * - Escape '&' and '<' always\n * - Escape only the ']]>' sequence by turning '>' into '>' in that context\n */\nexport function escapeXmlMinimalText(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/]]>/g, \"]]>\");\n}\n\n/**\n * Minimal escaping for attribute values per XML 1.0 §3.1 (AttValue [10]).\n * - Escape '&' and '<' always\n * - Escape only the wrapper quote among ' or \"\n */\nexport function escapeXmlMinimalAttr(\n value: string,\n wrapper: '\"' | \"'\" = '\"'\n): string {\n let escaped = value.replace(/&/g, \"&\").replace(/</g, \"<\");\n if (wrapper === '\"') {\n escaped = escaped.replace(/\"/g, \""\");\n } else {\n escaped = escaped.replace(/'/g, \"'\");\n }\n return escaped;\n}\n\n/**\n * Unescape XML entities\n */\nexport function unescapeXml(text: string): string {\n return text\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&/g, \"&\");\n}\n","/**\n * XML stringification based on TXML's stringify approach\n * Replaces the fast-xml-parser XMLBuilder with a native implementation\n */\n\nimport type { RXMLNode, StringifyOptions } from \"../core/types\";\nimport { RXMLStringifyError } from \"../errors/types\";\nimport {\n escapeXml,\n escapeXmlMinimalAttr,\n escapeXmlMinimalText,\n} from \"../utils/helpers\";\n\n/**\n * Stringify an object to XML\n */\nexport function stringify(\n rootTag: string,\n obj: unknown,\n options: StringifyOptions = {}\n): string {\n try {\n const format = options.format ?? true;\n const declaration = options.declaration ?? false;\n const minimalEscaping = options.minimalEscaping ?? false;\n const suppressEmptyNode = options.suppressEmptyNode ?? false;\n const strictBooleanAttributes = options.strictBooleanAttributes ?? false;\n\n let result = \"\";\n\n if (declaration) {\n result += '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n }\n\n result += stringifyValue(rootTag, obj, {\n depth: 0,\n format,\n suppressEmptyNode,\n minimalEscaping,\n strictBooleanAttributes,\n });\n\n if (result.endsWith(\"\\n\")) {\n return result.slice(0, -1);\n }\n\n return result;\n } catch (error) {\n throw new RXMLStringifyError(\"Failed to stringify XML\", error);\n }\n}\n\ninterface StringifyContext {\n depth: number;\n format: boolean;\n suppressEmptyNode: boolean;\n minimalEscaping: boolean;\n strictBooleanAttributes: boolean;\n}\n\n/**\n * Escape content based on escaping mode\n */\nfunction escapeContent(content: string, minimalEscaping: boolean): string {\n return minimalEscaping ? escapeXmlMinimalText(content) : escapeXml(content);\n}\n\n/**\n * Create self-closing tag\n */\nfunction createSelfClosingTag(\n tagName: string,\n indent: string,\n newline: string\n): string {\n return `${indent}<${tagName}/>${newline}`;\n}\n\n/**\n * Create element with text content\n */\nfunction createTextElement(\n tagName: string,\n content: string,\n indent: string,\n newline: string\n): string {\n return `${indent}<${tagName}>${content}</${tagName}>${newline}`;\n}\n\n/**\n * Check if value is a primitive type\n */\nfunction isPrimitive(value: unknown): boolean {\n return (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n );\n}\n\ninterface FormatOptions {\n indent: string;\n newline: string;\n}\n\n/**\n * Stringify a primitive value\n */\nfunction stringifyPrimitive(\n tagName: string,\n value: unknown,\n context: StringifyContext,\n format: FormatOptions\n): string {\n const { minimalEscaping, suppressEmptyNode } = context;\n const content = escapeContent(String(value), minimalEscaping);\n\n if (content === \"\" && suppressEmptyNode) {\n return \"\";\n }\n\n return createTextElement(tagName, content, format.indent, format.newline);\n}\n\n/**\n * Stringify an array value\n */\nfunction stringifyArray(\n tagName: string,\n value: unknown[],\n context: StringifyContext\n): string {\n let result = \"\";\n for (const item of value) {\n result += stringifyValue(tagName, item, context);\n }\n return result;\n}\n\n/**\n * Stringify a value to XML format\n */\nfunction stringifyValue(\n tagName: string,\n value: unknown,\n context: StringifyContext\n): string {\n const { format, suppressEmptyNode, minimalEscaping } = context;\n const indent = format ? \" \".repeat(context.depth) : \"\";\n const newline = format ? \"\\n\" : \"\";\n\n if (value === null || value === undefined) {\n if (suppressEmptyNode) {\n return \"\";\n }\n return createSelfClosingTag(tagName, indent, newline);\n }\n\n if (isPrimitive(value)) {\n return stringifyPrimitive(tagName, value, context, { indent, newline });\n }\n\n if (Array.isArray(value)) {\n return stringifyArray(tagName, value, context);\n }\n\n if (typeof value === \"object\") {\n return stringifyObject(tagName, value as Record<string, unknown>, context);\n }\n\n // Fallback for other types\n const content = escapeContent(String(value), minimalEscaping);\n if (content === \"\" && suppressEmptyNode) {\n return \"\";\n }\n return createTextElement(tagName, content, indent, newline);\n}\n\ninterface ObjectParts {\n attributes: Record<string, unknown>;\n elements: Record<string, unknown>;\n textContent: string | undefined;\n}\n\n/**\n * Extract attributes, elements, and text content from an object\n */\nfunction extractObjectParts(obj: Record<string, unknown>): ObjectParts {\n const attributes: Record<string, unknown> = {};\n const elements: Record<string, unknown> = {};\n let textContent: string | undefined;\n\n for (const [key, value] of Object.entries(obj)) {\n if (key.startsWith(\"@\")) {\n attributes[key.substring(1)] = value;\n } else if (key === \"#text\" || key === \"_text\") {\n textContent = String(value);\n } else if (key === \"_attributes\") {\n if (typeof value === \"object\" && value !== null) {\n Object.assign(attributes, value as Record<string, unknown>);\n }\n } else {\n elements[key] = value;\n }\n }\n\n return { attributes, elements, textContent };\n}\n\n/**\n * Format a single attribute\n */\nfunction formatAttribute(\n attrName: string,\n attrValue: unknown,\n minimalEscaping: boolean,\n strictBooleanAttributes: boolean\n): string {\n if (attrValue === null) {\n return strictBooleanAttributes\n ? ` ${attrName}=\"${attrName}\"`\n : ` ${attrName}`;\n }\n\n const valueStr = String(attrValue);\n // Attribute quoting strategy per XML 1.0:\n // - 3.1 (AttValue [10]): attribute values MUST be quoted with ' or \".\n // If the same quote appears in the value, it MUST be escaped (via\n // predefined entities per 4.6). We choose the quote that minimizes\n // escaping: prefer \" unless value contains \", otherwise use '.\n // See: https://www.w3.org/TR/2008/REC-xml-20081126/\n if (valueStr.indexOf('\"') === -1) {\n const escaped = minimalEscaping\n ? escapeXmlMinimalAttr(valueStr, '\"')\n : escapeXml(valueStr);\n return ` ${attrName}=\"${escaped}\"`;\n }\n\n const escaped = minimalEscaping\n ? escapeXmlMinimalAttr(valueStr, \"'\")\n : escapeXml(valueStr);\n return ` ${attrName}='${escaped}'`;\n}\n\n/**\n * Build opening tag with attributes\n */\nfunction buildOpeningTag(\n tagName: string,\n attributes: Record<string, unknown>,\n context: StringifyContext\n): string {\n let openTag = `<${tagName}`;\n const { minimalEscaping, strictBooleanAttributes } = context;\n\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n openTag += formatAttribute(\n attrName,\n attrValue,\n minimalEscaping,\n strictBooleanAttributes\n );\n }\n\n return openTag;\n}\n\n/**\n * Stringify text-only content\n */\nfunction stringifyTextOnlyContent(options: {\n tagName: string;\n textContent: string;\n openTag: string;\n format: FormatOptions;\n minimalEscaping: boolean;\n}): string {\n const { tagName, textContent, openTag, format, minimalEscaping } = options;\n const content = escapeContent(textContent, minimalEscaping);\n return `${format.indent}${openTag}${content}</${tagName}>${format.newline}`;\n}\n\ninterface ComplexContentOptions {\n indent: string;\n newline: string;\n childIndent: string;\n openTag: string;\n}\n\n/**\n * Stringify complex content (text + elements)\n */\nfunction stringifyComplexContent(\n tagName: string,\n parts: ObjectParts,\n context: StringifyContext,\n options: ComplexContentOptions\n): string {\n const { format, minimalEscaping, depth } = context;\n const { textContent, elements } = parts;\n const hasElements = Object.keys(elements).length > 0;\n\n let result = `${options.indent}${options.openTag}`;\n\n if (textContent) {\n const content = escapeContent(textContent, minimalEscaping);\n result += format\n ? `${options.newline}${options.childIndent}${content}`\n : content;\n }\n\n if (hasElements) {\n if (format) {\n result += options.newline;\n }\n\n for (const [elementName, elementValue] of Object.entries(elements)) {\n result += stringifyValue(elementName, elementValue, {\n ...context,\n depth: depth + 1,\n });\n }\n\n if (format) {\n result += options.indent;\n }\n }\n\n result += `</${tagName}>${options.newline}`;\n return result;\n}\n\n/**\n * Stringify an object to XML\n */\nfunction stringifyObject(\n tagName: string,\n obj: Record<string, unknown>,\n context: StringifyContext\n): string {\n const { depth, format, suppressEmptyNode } = context;\n const indent = format ? \" \".repeat(depth) : \"\";\n const newline = format ? \"\\n\" : \"\";\n const childIndent = format ? \" \".repeat(depth + 1) : \"\";\n\n const parts = extractObjectParts(obj);\n const openTag = buildOpeningTag(tagName, parts.attributes, context);\n\n // Check if we have any content\n const hasElements = Object.keys(parts.elements).length > 0;\n const hasTextContent =\n parts.textContent !== undefined && parts.textContent !== \"\";\n\n if (!(hasElements || hasTextContent)) {\n if (suppressEmptyNode) {\n return \"\";\n }\n return `${indent}${openTag}/>${newline}`;\n }\n\n const fullOpenTag = `${openTag}>`;\n\n // Handle text-only content\n if (!hasElements && hasTextContent && parts.textContent) {\n return stringifyTextOnlyContent({\n tagName,\n textContent: parts.textContent,\n openTag: fullOpenTag,\n format: { indent, newline },\n minimalEscaping: context.minimalEscaping,\n });\n }\n\n // Handle complex content\n return stringifyComplexContent(tagName, parts, context, {\n indent,\n newline,\n childIndent,\n openTag: fullOpenTag,\n });\n}\n\n/**\n * Stringify parsed XML nodes back to XML string\n */\nexport function stringifyNodes(\n nodes: (RXMLNode | string)[],\n format = true,\n options: Pick<\n StringifyOptions,\n \"strictBooleanAttributes\" | \"minimalEscaping\"\n > = {}\n): string {\n let result = \"\";\n\n for (const node of nodes) {\n if (typeof node === \"string\") {\n result += node;\n } else {\n result += stringifyNode(node, 0, format, options);\n }\n }\n\n return result;\n}\n\ninterface NodeStringifyOptions {\n minimalEscaping: boolean;\n strictBooleanAttributes: boolean;\n indent: string;\n newline: string;\n}\n\n/**\n * Format a single node attribute\n */\nfunction formatNodeAttribute(\n attrName: string,\n attrValue: string | null,\n minimalEscaping: boolean,\n strictBooleanAttributes: boolean\n): string {\n if (attrValue === null) {\n if (strictBooleanAttributes) {\n return ` ${attrName}=\"${attrName}\"`;\n }\n return ` ${attrName}`;\n }\n\n if (attrValue.indexOf('\"') === -1) {\n const escaped = minimalEscaping\n ? escapeXmlMinimalAttr(attrValue, '\"')\n : escapeXml(attrValue);\n return ` ${attrName}=\"${escaped}\"`;\n }\n\n const escaped = minimalEscaping\n ? escapeXmlMinimalAttr(attrValue, \"'\")\n : escapeXml(attrValue);\n return ` ${attrName}='${escaped}'`;\n}\n\n/**\n * Build opening tag with attributes\n */\nfunction buildNodeOpeningTag(\n node: RXMLNode,\n opts: NodeStringifyOptions\n): string {\n let result = `${opts.indent}<${node.tagName}`;\n\n for (const [attrName, attrValue] of Object.entries(node.attributes)) {\n result += formatNodeAttribute(\n attrName,\n attrValue,\n opts.minimalEscaping,\n opts.strictBooleanAttributes\n );\n }\n\n return result;\n}\n\n/**\n * Stringify node children\n */\nfunction stringifyNodeChildren(options: {\n children: (RXMLNode | string)[];\n depth: number;\n format: boolean;\n stringifyOptions: Pick<\n StringifyOptions,\n \"strictBooleanAttributes\" | \"minimalEscaping\"\n >;\n minimalEscaping: boolean;\n newline: string;\n}): { content: string; hasElementChildren: boolean } {\n const {\n children,\n depth,\n format,\n stringifyOptions,\n minimalEscaping,\n newline,\n } = options;\n let content = \"\";\n let hasElementChildren = false;\n\n for (const child of children) {\n if (typeof child === \"string\") {\n content += minimalEscaping\n ? escapeXmlMinimalText(child)\n : escapeXml(child);\n } else {\n if (!hasElementChildren && format) {\n content += newline;\n hasElementChildren = true;\n }\n content += stringifyNode(child, depth + 1, format, stringifyOptions);\n }\n }\n\n return { content, hasElementChildren };\n}\n\n/**\n * Stringify a single XML node\n */\nexport function stringifyNode(\n node: RXMLNode,\n depth = 0,\n format = true,\n options: Pick<\n StringifyOptions,\n \"strictBooleanAttributes\" | \"minimalEscaping\"\n > = {}\n): string {\n const indent = format ? \" \".repeat(depth) : \"\";\n const newline = format ? \"\\n\" : \"\";\n const minimalEscaping = options.minimalEscaping ?? false;\n const strictBooleanAttributes = options.strictBooleanAttributes ?? false;\n\n const opts: NodeStringifyOptions = {\n minimalEscaping,\n strictBooleanAttributes,\n indent,\n newline,\n };\n\n let result = buildNodeOpeningTag(node, opts);\n\n // Handle processing instructions\n if (node.tagName[0] === \"?\") {\n return `${result}?>${newline}`;\n }\n\n // Handle self-closing tags\n if (node.children.length === 0) {\n return `${result}/>${newline}`;\n }\n\n result += \">\";\n\n // Handle children\n const { content, hasElementChildren } = stringifyNodeChildren({\n children: node.children,\n depth,\n format,\n stringifyOptions: options,\n minimalEscaping,\n newline,\n });\n\n result += content;\n\n if (hasElementChildren && format) {\n result += indent;\n }\n\n result += `</${node.tagName}>`;\n\n if (format) {\n result += newline;\n }\n\n return result;\n}\n\n/**\n * Convert content to a string representation (similar to TXML's toContentString)\n */\nexport function toContentString(nodes: (RXMLNode | string)[]): string {\n let result = \"\";\n\n for (const node of nodes) {\n if (typeof node === \"string\") {\n result += ` ${node}`;\n } else {\n result += ` ${toContentString(node.children)}`;\n }\n result = result.trim();\n }\n\n return result;\n}\n","/**\n * Schema-aware type coercion for robust-xml\n * Integrates with the existing coercion system but adds XML-specific handling\n */\n\nimport {\n coerceBySchema as baseCoerceBySchema,\n getSchemaType,\n unwrapJsonSchema,\n} from \"../../schema-coerce\";\nimport type { RXMLNode } from \"../core/types\";\nimport { RXMLCoercionError } from \"../errors/types\";\n\n/**\n * Get property schema from a parent schema\n */\nexport function getPropertySchema(toolSchema: unknown, key: string): unknown {\n const unwrapped = unwrapJsonSchema(toolSchema);\n if (!unwrapped || typeof unwrapped !== \"object\") {\n return;\n }\n const u = unwrapped as Record<string, unknown>;\n const props = u.properties as Record<string, unknown> | undefined;\n if (props && Object.hasOwn(props, key)) {\n return (props as Record<string, unknown>)[key];\n }\n return;\n}\n\n/**\n * Get node value from children\n */\nfunction getNodeValue(\n children: (RXMLNode | string)[],\n schema: unknown,\n tagName: string,\n textNodeName: string\n): unknown {\n if (children.length === 0) {\n return \"\";\n }\n if (children.length === 1 && typeof children[0] === \"string\") {\n return children[0];\n }\n return processComplexContent(\n children,\n getPropertySchema(schema, tagName),\n textNodeName\n );\n}\n\n/**\n * Add attributes to value\n */\nfunction addAttributesToValue(\n value: unknown,\n attributes: Record<string, string | null>,\n textNodeName: string\n): unknown {\n if (Object.keys(attributes).length === 0) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const valueResult: Record<string, unknown> = { [textNodeName]: value };\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n valueResult[`@_${attrName}`] = attrValue;\n }\n return valueResult;\n }\n\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n (value as Record<string, unknown>)[`@_${attrName}`] = attrValue;\n }\n }\n\n return value;\n}\n\n/**\n * Add value to result, handling duplicates\n */\nfunction addToResult(\n result: Record<string, unknown>,\n tagName: string,\n value: unknown\n): void {\n if (result[tagName]) {\n if (!Array.isArray(result[tagName])) {\n result[tagName] = [result[tagName]];\n }\n (result[tagName] as unknown[]).push(value);\n } else {\n result[tagName] = value;\n }\n}\n\n/**\n * Convert TXML-style DOM to flat object structure for schema coercion\n */\nexport function domToObject(\n nodes: (RXMLNode | string)[],\n schema: unknown,\n textNodeName = \"#text\"\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const node of nodes) {\n if (typeof node === \"string\") {\n continue;\n }\n\n const { tagName, children, attributes } = node;\n let value = getNodeValue(children, schema, tagName, textNodeName);\n value = addAttributesToValue(value, attributes, textNodeName);\n addToResult(result, tagName, value);\n }\n\n return result;\n}\n\n/**\n * Process child element node\n */\nfunction processChildElement(\n child: RXMLNode,\n schema: unknown,\n textNodeName: string\n): unknown {\n let childValue: unknown;\n\n if (child.children.length === 0) {\n childValue = \"\";\n } else if (\n child.children.length === 1 &&\n typeof child.children[0] === \"string\"\n ) {\n childValue = child.children[0];\n } else {\n childValue = processComplexContent(\n child.children,\n getPropertySchema(schema, child.tagName),\n textNodeName\n );\n }\n\n return addAttributesToValue(childValue, child.attributes, textNodeName);\n}\n\n/**\n * Combine text and elements into result\n */\nfunction combineContent(\n textContent: string[],\n elements: Record<string, unknown>,\n textNodeName: string\n): unknown {\n const hasText = textContent.length > 0;\n const hasElements = Object.keys(elements).length > 0;\n\n if (hasText && hasElements) {\n return {\n [textNodeName]: textContent.join(\"\").trim(),\n ...elements,\n };\n }\n\n if (hasText) {\n return textContent.join(\"\").trim();\n }\n\n if (hasElements) {\n return elements;\n }\n\n return \"\";\n}\n\n/**\n * Process complex content (mixed text and elements)\n */\nfunction processComplexContent(\n children: (RXMLNode | string)[],\n schema: unknown,\n textNodeName: string\n): unknown {\n const textContent: string[] = [];\n const elements: Record<string, unknown> = {};\n\n for (const child of children) {\n if (typeof child === \"string\") {\n textContent.push(child);\n } else {\n const childValue = processChildElement(child, schema, textNodeName);\n addToResult(elements, child.tagName, childValue);\n }\n }\n\n return combineContent(textContent, elements, textNodeName);\n}\n\n/**\n * Coerce DOM object using schema information\n */\nexport function coerceDomBySchema(\n domObject: Record<string, unknown>,\n schema: unknown\n): Record<string, unknown> {\n try {\n return baseCoerceBySchema(domObject, schema) as Record<string, unknown>;\n } catch (error) {\n throw new RXMLCoercionError(\"Failed to coerce DOM object by schema\", error);\n }\n}\n\n/**\n * Visit object schema properties\n */\nfunction visitObjectProperties(\n props: Record<string, unknown>,\n collected: Set<string>,\n visit: (s: unknown) => void\n): void {\n for (const [key, propSchema] of Object.entries(props)) {\n const t = getSchemaType(propSchema);\n if (t === \"string\") {\n collected.add(key);\n } else if (t === \"object\" || t === \"array\") {\n visit(propSchema);\n }\n }\n}\n\n/**\n * Visit array schema items\n */\nfunction visitArrayItems(\n u: Record<string, unknown>,\n visit: (s: unknown) => void\n): void {\n const items = u.items as unknown;\n if (items) {\n visit(items);\n }\n const prefix = u.prefixItems as unknown[] | undefined;\n if (Array.isArray(prefix)) {\n for (const item of prefix) {\n visit(item);\n }\n }\n}\n\n/**\n * Extract string-typed property names from schema\n */\nexport function getStringTypedProperties(schema: unknown): Set<string> {\n const collected = new Set<string>();\n\n const visit = (s: unknown): void => {\n const unwrapped = unwrapJsonSchema(s);\n if (!unwrapped || typeof unwrapped !== \"object\") {\n return;\n }\n const u = unwrapped as Record<string, unknown>;\n const type = getSchemaType(unwrapped);\n\n if (type === \"object\") {\n const props = u.properties as Record<string, unknown> | undefined;\n if (props && typeof props === \"object\") {\n visitObjectProperties(props, collected, visit);\n }\n } else if (type === \"array\") {\n visitArrayItems(u, visit);\n }\n };\n\n visit(schema);\n return collected;\n}\n\n/**\n * Process array-like structures from XML\n */\nexport function processArrayContent(\n value: unknown,\n schema: unknown,\n textNodeName: string\n): unknown {\n if (!Array.isArray(value)) {\n return value;\n }\n\n const schemaType = getSchemaType(schema);\n\n if (schemaType === \"string\") {\n // For string arrays, extract text content and take first item for duplicates\n return value.map((item) => {\n if (typeof item === \"string\") {\n return item.trim();\n }\n if (item && typeof item === \"object\" && textNodeName in item) {\n const textVal = (item as Record<string, unknown>)[textNodeName];\n return typeof textVal === \"string\" ? textVal.trim() : String(textVal);\n }\n return String(item);\n });\n }\n\n // For other types, process each item\n return value.map((item) => {\n if (typeof item === \"string\") {\n return item.trim();\n }\n if (item && typeof item === \"object\" && textNodeName in item) {\n const textVal = (item as Record<string, unknown>)[textNodeName];\n return typeof textVal === \"string\" ? textVal.trim() : textVal;\n }\n return item;\n });\n}\n\n/**\n * Handle indexed tuple structures (elements with numeric keys)\n */\nexport function processIndexedTuple(\n obj: Record<string, unknown>,\n textNodeName: string\n): unknown[] {\n const keys = Object.keys(obj);\n const indices = keys.map((k) => Number.parseInt(k, 10)).sort((a, b) => a - b);\n const isValidTuple =\n indices[0] === 0 && indices.every((val, idx) => val === idx);\n\n if (!isValidTuple) {\n return [obj];\n }\n\n const sortedKeys = keys.sort(\n (a, b) => Number.parseInt(a, 10) - Number.parseInt(b, 10)\n );\n return sortedKeys.map((key) => {\n const item = obj[key];\n if (item && typeof item === \"object\" && textNodeName in item) {\n const textVal = (item as Record<string, unknown>)[textNodeName];\n return typeof textVal === \"string\" ? textVal.trim() : textVal;\n }\n return typeof item === \"string\" ? item.trim() : item;\n });\n}\n","/**\n * Raw content extraction utilities for string-typed properties\n * This replaces the string-based extraction with DOM-based extraction\n */\n\nimport type { RXMLNode } from \"../core/types\";\nimport {\n isNameChar,\n isNameStartChar,\n parseName,\n skipQuoted,\n} from \"../utils/helpers\";\n\n/**\n * Helper to skip DOCTYPE declarations\n */\nfunction skipDoctype(xmlContent: string, i: number, len: number): number {\n const gt = xmlContent.indexOf(\">\", i + 1);\n return gt === -1 ? len : gt + 1;\n}\n\n/**\n * Helper to skip comments\n */\nfunction skipComment(xmlContent: string, i: number, len: number): number {\n const close = xmlContent.indexOf(\"-->\", i + 4);\n return close === -1 ? len : close + 3;\n}\n\n/**\n * Helper to skip CDATA sections\n */\nfunction skipCdata(xmlContent: string, i: number, len: number): number {\n const close = xmlContent.indexOf(\"]]>\", i + 9);\n return close === -1 ? len : close + 3;\n}\n\n/**\n * Helper to skip processing instructions\n */\nfunction skipProcessingInstruction(\n xmlContent: string,\n i: number,\n len: number\n): number {\n const close = xmlContent.indexOf(\"?>\", i + 1);\n return close === -1 ? len : close + 2;\n}\n\n/**\n * Helper to skip special XML constructs (comments, CDATA, DOCTYPE, processing instructions)\n * Returns the new position after the construct, or -1 if not a special construct\n */\nfunction skipSpecialConstruct(\n xmlContent: string,\n i: number,\n len: number\n): number {\n const ch = xmlContent[i];\n\n if (ch === \"!\") {\n if (xmlContent.startsWith(\"!DOCTYPE\", i + 1)) {\n return skipDoctype(xmlContent, i, len);\n }\n if (xmlContent.startsWith(\"!--\", i + 1)) {\n return skipComment(xmlContent, i, len);\n }\n if (xmlContent.startsWith(\"![CDATA[\", i + 1)) {\n return skipCdata(xmlContent, i, len);\n }\n // Other declarations\n const gt = xmlContent.indexOf(\">\", i + 1);\n return gt === -1 ? len : gt + 1;\n }\n\n if (ch === \"?\") {\n return skipProcessingInstruction(xmlContent, i, len);\n }\n\n return -1;\n}\n\n/**\n * Parse tag name starting at position i\n * Returns the tag name and position after the name\n */\nfunction parseTagName(\n xmlContent: string,\n i: number,\n len: number\n): { name: string; pos: number } {\n let j = i;\n if (j < len && isNameStartChar(xmlContent[j])) {\n j += 1;\n while (j < len && isNameChar(xmlContent[j])) {\n j += 1;\n }\n }\n return { name: xmlContent.slice(i, j), pos: j };\n}\n\n/**\n * Skip to the end of a tag (finding the closing > or />)\n * Returns { pos: position after >, isSelfClosing: boolean }\n */\nfunction skipToTagEnd(\n xmlContent: string,\n start: number,\n len: number\n): { pos: number; isSelfClosing: boolean } {\n let k = start;\n let isSelfClosing = false;\n\n while (k < len) {\n const c = xmlContent[k];\n if (c === '\"' || c === \"'\") {\n k = skipQuoted(xmlContent, k);\n continue;\n }\n if (c === \">\") {\n break;\n }\n if (c === \"/\" && xmlContent[k + 1] === \">\") {\n isSelfClosing = true;\n k += 1;\n break;\n }\n k += 1;\n }\n\n return { pos: k, isSelfClosing };\n}\n\n/**\n * Helper to process closing tag in findMatchingCloseTag\n */\nfunction processClosingTagMatch(options: {\n xmlContent: string;\n nx: number;\n len: number;\n tagName: string;\n depth: number;\n nextLt: number;\n}): { newPos: number; newDepth: number; found: boolean } {\n const { xmlContent, nx, len, tagName, depth, nextLt } = options;\n const tagInfo = parseTagName(xmlContent, nx + 1, len);\n const gt = xmlContent.indexOf(\">\", tagInfo.pos);\n\n if (tagInfo.name === tagName) {\n const newDepth = depth - 1;\n if (newDepth === 0) {\n return { newPos: nextLt, newDepth, found: true };\n }\n return { newPos: gt === -1 ? len : gt + 1, newDepth, found: false };\n }\n\n return { newPos: gt === -1 ? len : gt + 1, newDepth: depth, found: false };\n}\n\n/**\n * Helper to process opening tag in findMatchingCloseTag\n */\nfunction processOpeningTagMatch(options: {\n xmlContent: string;\n nx: number;\n len: number;\n tagName: string;\n depth: number;\n}): { newPos: number; newDepth: number } {\n const { xmlContent, nx, len, tagName, depth } = options;\n const tagInfo = parseTagName(xmlContent, nx, len);\n const tagEndInfo = skipToTagEnd(xmlContent, tagInfo.pos, len);\n\n const newDepth =\n tagInfo.name === tagName && !tagEndInfo.isSelfClosing ? depth + 1 : depth;\n\n const newPos =\n xmlContent[tagEndInfo.pos] === \">\"\n ? tagEndInfo.pos + 1\n : tagEndInfo.pos + 1;\n\n return { newPos, newDepth };\n}\n\n/**\n * Find the matching closing tag for a given opening tag\n * Returns the position of the start of the closing tag, or -1 if not found\n */\nfunction findMatchingCloseTag(\n xmlContent: string,\n startPos: number,\n tagName: string,\n len: number\n): number {\n let pos = startPos;\n let depth = 1;\n\n while (pos < len) {\n const nextLt = xmlContent.indexOf(\"<\", pos);\n if (nextLt === -1 || nextLt + 1 >= len) {\n break;\n }\n\n const nx = nextLt + 1;\n const h = xmlContent[nx];\n const specialPos = skipSpecialConstruct(xmlContent, nx, len);\n\n if (specialPos !== -1) {\n pos = specialPos;\n continue;\n }\n\n if (h === \"/\") {\n const result = processClosingTagMatch({\n xmlContent,\n nx,\n len,\n tagName,\n depth,\n nextLt,\n });\n if (result.found) {\n return result.newPos;\n }\n pos = result.newPos;\n depth = result.newDepth;\n } else {\n const result = processOpeningTagMatch({\n xmlContent,\n nx,\n len,\n tagName,\n depth,\n });\n pos = result.newPos;\n depth = result.newDepth;\n }\n }\n\n return -1;\n}\n\n/**\n * Helper to update best match if current depth is better\n */\nfunction updateBestMatch(\n depth: number,\n bestDepth: number,\n contentStart: number,\n contentEnd: number\n): { start: number; end: number; depth: number } | null {\n if (depth < bestDepth) {\n return { start: contentStart, end: contentEnd, depth };\n }\n return null;\n}\n\n/**\n * Helper to process target tag match\n */\nfunction processTargetTag(options: {\n xmlContent: string;\n tagEnd: number;\n isSelfClosing: boolean;\n target: string;\n len: number;\n depth: number;\n bestDepth: number;\n}): { start: number; end: number; depth: number } | null {\n const { xmlContent, tagEnd, isSelfClosing, target, len, depth, bestDepth } =\n options;\n const contentStart = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n\n if (isSelfClosing) {\n return updateBestMatch(depth, bestDepth, contentStart, contentStart);\n }\n\n const closePos = findMatchingCloseTag(xmlContent, contentStart, target, len);\n if (closePos !== -1) {\n return updateBestMatch(depth, bestDepth, contentStart, closePos);\n }\n return null;\n}\n\n/**\n * Helper to handle closing tag in extractRawInner\n */\nfunction handleClosingTagInExtract(\n xmlContent: string,\n i: number,\n len: number,\n depth: number\n): { newPos: number; newDepth: number } {\n const gt = xmlContent.indexOf(\">\", i + 1);\n return {\n newPos: gt === -1 ? len : gt + 1,\n newDepth: Math.max(0, depth - 1),\n };\n}\n\n/**\n * Helper to process opening tag in extractRawInner\n */\nfunction processOpeningTagInExtract(options: {\n xmlContent: string;\n i: number;\n len: number;\n target: string;\n depth: number;\n bestDepth: number;\n}): {\n newPos: number;\n newDepth: number;\n bestMatch: { start: number; end: number; depth: number } | null;\n} {\n const { xmlContent, i, len, target, depth, bestDepth } = options;\n const tagInfo = parseTagName(xmlContent, i, len);\n const tagEndInfo = skipToTagEnd(xmlContent, tagInfo.pos, len);\n const tagEnd = tagEndInfo.pos;\n const isSelfClosing = tagEndInfo.isSelfClosing;\n\n let bestMatch: { start: number; end: number; depth: number } | null = null;\n if (tagInfo.name === target) {\n bestMatch = processTargetTag({\n xmlContent,\n tagEnd,\n isSelfClosing,\n target,\n len,\n depth,\n bestDepth,\n });\n }\n\n return {\n newPos: xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1,\n newDepth: depth + (isSelfClosing ? 0 : 1),\n bestMatch,\n };\n}\n\n/**\n * Extract raw inner content from XML string for a specific tag\n * This is used for string-typed properties to preserve exact content\n */\nexport function extractRawInner(\n xmlContent: string,\n tagName: string\n): string | undefined {\n const len = xmlContent.length;\n const target = tagName;\n let bestStart = -1;\n let bestEnd = -1;\n let bestDepth = Number.POSITIVE_INFINITY;\n\n let i = 0;\n let depth = 0;\n\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1 || lt + 1 >= len) {\n return;\n }\n i = lt + 1;\n\n const ch = xmlContent[i];\n const specialPos = skipSpecialConstruct(xmlContent, i, len);\n if (specialPos !== -1) {\n i = specialPos;\n continue;\n }\n\n if (ch === \"/\") {\n const result = handleClosingTagInExtract(xmlContent, i, len, depth);\n i = result.newPos;\n depth = result.newDepth;\n continue;\n }\n\n const result = processOpeningTagInExtract({\n xmlContent,\n i,\n len,\n target,\n depth,\n bestDepth,\n });\n if (result.bestMatch) {\n bestStart = result.bestMatch.start;\n bestEnd = result.bestMatch.end;\n bestDepth = result.bestMatch.depth;\n }\n i = result.newPos;\n depth = result.newDepth;\n }\n\n if (bestStart !== -1) {\n return xmlContent.slice(bestStart, bestEnd);\n }\n return;\n}\n\n/**\n * Helper to process opening tag and add range if it's a target\n */\nfunction processOpeningTag(options: {\n xmlContent: string;\n tagEnd: number;\n isSelfClosing: boolean;\n target: string;\n len: number;\n ranges: Array<{ start: number; end: number }>;\n}): number {\n const { xmlContent, tagEnd, isSelfClosing, target, len, ranges } = options;\n const contentStart = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n\n if (isSelfClosing) {\n ranges.push({ start: contentStart, end: contentStart });\n return contentStart;\n }\n\n const closePos = findMatchingCloseTag(xmlContent, contentStart, target, len);\n if (closePos !== -1) {\n ranges.push({ start: contentStart, end: closePos });\n const gt = xmlContent.indexOf(\">\", closePos);\n return gt === -1 ? len : gt + 1;\n }\n\n // Unmatched tag\n return -1;\n}\n\n/**\n * Helper to handle closing tag in findAllInnerRanges\n */\nfunction handleClosingTagInFindAll(\n xmlContent: string,\n i: number,\n len: number\n): number {\n const gt = xmlContent.indexOf(\">\", i + 1);\n return gt === -1 ? len : gt + 1;\n}\n\n/**\n * Find all inner content ranges for a given tag name at any depth.\n * Returns ranges for the inner content between <tagName ...> and </tagName>.\n */\nexport function findAllInnerRanges(\n xmlContent: string,\n tagName: string\n): Array<{ start: number; end: number }> {\n const len = xmlContent.length;\n const target = tagName;\n const ranges: Array<{ start: number; end: number }> = [];\n\n let i = 0;\n\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1 || lt + 1 >= len) {\n break;\n }\n i = lt + 1;\n\n const ch = xmlContent[i];\n const specialPos = skipSpecialConstruct(xmlContent, i, len);\n if (specialPos !== -1) {\n i = specialPos;\n continue;\n }\n\n if (ch === \"/\") {\n i = handleClosingTagInFindAll(xmlContent, i, len);\n continue;\n }\n\n // Opening tag\n const tagInfo = parseTagName(xmlContent, i, len);\n const tagEndInfo = skipToTagEnd(xmlContent, tagInfo.pos, len);\n const tagEnd = tagEndInfo.pos;\n const isSelfClosing = tagEndInfo.isSelfClosing;\n\n if (tagInfo.name !== target) {\n // Advance over this tag\n i = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n continue;\n }\n\n // Found a target start tag\n const nextPos = processOpeningTag({\n xmlContent,\n tagEnd,\n isSelfClosing,\n target,\n len,\n ranges,\n });\n if (nextPos === -1) {\n // Unmatched tag, stop to avoid infinite loops\n break;\n }\n i = nextPos;\n }\n\n return ranges;\n}\n\n/**\n * Helper to find range for top-level target tag\n */\nfunction findTopLevelTargetRange(options: {\n xmlContent: string;\n tagEnd: number;\n isSelfClosing: boolean;\n target: string;\n len: number;\n}): { start: number; end: number } | undefined {\n const { xmlContent, tagEnd, isSelfClosing, target, len } = options;\n const contentStart = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n\n if (isSelfClosing) {\n return { start: contentStart, end: contentStart };\n }\n\n const closePos = findMatchingCloseTag(xmlContent, contentStart, target, len);\n if (closePos !== -1) {\n return { start: contentStart, end: closePos };\n }\n return;\n}\n\n/**\n * Helper to handle closing tag in findFirstTopLevelRange\n */\nfunction handleClosingTagInFindFirst(\n xmlContent: string,\n i: number,\n len: number,\n depth: number\n): { newPos: number; newDepth: number } {\n const gt = xmlContent.indexOf(\">\", i + 1);\n return {\n newPos: gt === -1 ? len : gt + 1,\n newDepth: Math.max(0, depth - 1),\n };\n}\n\n/**\n * Find the first top-level range for a tag\n */\nexport function findFirstTopLevelRange(\n xmlContent: string,\n tagName: string\n): { start: number; end: number } | undefined {\n const len = xmlContent.length;\n const target = tagName;\n\n let i = 0;\n let depth = 0;\n\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1 || lt + 1 >= len) {\n return;\n }\n i = lt + 1;\n\n const ch = xmlContent[i];\n const specialPos = skipSpecialConstruct(xmlContent, i, len);\n if (specialPos !== -1) {\n i = specialPos;\n continue;\n }\n\n if (ch === \"/\") {\n const result = handleClosingTagInFindFirst(xmlContent, i, len, depth);\n i = result.newPos;\n depth = result.newDepth;\n continue;\n }\n\n const tagInfo = parseTagName(xmlContent, i, len);\n const tagEndInfo = skipToTagEnd(xmlContent, tagInfo.pos, len);\n const tagEnd = tagEndInfo.pos;\n const isSelfClosing = tagEndInfo.isSelfClosing;\n\n if (depth === 0 && tagInfo.name === target) {\n return findTopLevelTargetRange({\n xmlContent,\n tagEnd,\n isSelfClosing,\n target,\n len,\n });\n }\n i = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n depth += isSelfClosing ? 0 : 1;\n }\n return;\n}\n\n/**\n * Helper to check if position is in excluded ranges\n */\nfunction isPositionExcluded(\n pos: number,\n excludeRanges?: Array<{ start: number; end: number }>\n): boolean {\n if (!excludeRanges || excludeRanges.length === 0) {\n return false;\n }\n for (const r of excludeRanges) {\n if (pos >= r.start && pos < r.end) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Helper to skip comment in counting\n */\nfunction skipCommentInCounting(\n xmlContent: string,\n i: number,\n len: number\n): number {\n const close = xmlContent.indexOf(\"-->\", i + 4);\n return close === -1 ? len : close + 3;\n}\n\n/**\n * Helper to skip CDATA in counting\n */\nfunction skipCdataInCounting(\n xmlContent: string,\n i: number,\n len: number\n): number {\n const close = xmlContent.indexOf(\"]]>\", i + 9);\n return close === -1 ? len : close + 3;\n}\n\n/**\n * Helper to handle special constructs in counting\n */\nfunction skipSpecialInCounting(\n xmlContent: string,\n ch: string,\n i: number,\n len: number\n): number {\n if (ch === \"!\") {\n if (xmlContent.startsWith(\"!--\", i + 1)) {\n return skipCommentInCounting(xmlContent, i, len);\n }\n if (xmlContent.startsWith(\"![CDATA[\", i + 1)) {\n return skipCdataInCounting(xmlContent, i, len);\n }\n const gt = xmlContent.indexOf(\">\", i + 1);\n return gt === -1 ? len : gt + 1;\n }\n if (ch === \"?\") {\n const close = xmlContent.indexOf(\"?>\", i + 1);\n return close === -1 ? len : close + 2;\n }\n if (ch === \"/\") {\n const gt = xmlContent.indexOf(\">\", i + 1);\n return gt === -1 ? len : gt + 1;\n }\n return -1;\n}\n\n/**\n * Helper to parse and count opening tag\n */\nfunction parseAndCountTag(options: {\n xmlContent: string;\n i: number;\n len: number;\n target: string;\n lt: number;\n excludeRanges?: Array<{ start: number; end: number }>;\n}): { nextPos: number; shouldCount: boolean } {\n const { xmlContent, i, len, target, lt, excludeRanges } = options;\n let j = i;\n if (j < len && isNameStartChar(xmlContent[j])) {\n j += 1;\n while (j < len && isNameChar(xmlContent[j])) {\n j += 1;\n }\n }\n const name = xmlContent.slice(i, j);\n let k = j;\n while (k < len) {\n const c = xmlContent[k];\n if (c === '\"' || c === \"'\") {\n k = skipQuoted(xmlContent, k);\n continue;\n }\n if (c === \">\") {\n break;\n }\n if (c === \"/\" && xmlContent[k + 1] === \">\") {\n k += 1;\n break;\n }\n k += 1;\n }\n const shouldCount = name === target && !isPositionExcluded(lt, excludeRanges);\n return { nextPos: k + 1, shouldCount };\n}\n\n/**\n * Count tag occurrences, excluding specified ranges\n */\nexport function countTagOccurrences(\n xmlContent: string,\n tagName: string,\n excludeRanges?: Array<{ start: number; end: number }>,\n shouldSkipFirst = true\n): number {\n const len = xmlContent.length;\n const target = tagName;\n\n let i = 0;\n let count = 0;\n let skipFirstLocal = shouldSkipFirst;\n\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1) {\n break;\n }\n i = lt + 1;\n if (i >= len) {\n break;\n }\n\n const ch = xmlContent[i];\n const skipPos = skipSpecialInCounting(xmlContent, ch, i, len);\n if (skipPos !== -1) {\n i = skipPos;\n continue;\n }\n\n const result = parseAndCountTag({\n xmlContent,\n i,\n len,\n target,\n lt,\n excludeRanges,\n });\n if (result.shouldCount) {\n if (skipFirstLocal) {\n skipFirstLocal = false;\n } else {\n count += 1;\n }\n }\n i = result.nextPos;\n }\n\n return count;\n}\n\n/**\n * Helper to skip attributes and find tag end position\n */\nfunction skipAttributes(xmlContent: string, i: number, len: number): number {\n let k = i;\n while (k < len && xmlContent[k] !== \">\") {\n const c = xmlContent[k];\n if (c === '\"' || c === \"'\") {\n k = skipQuoted(xmlContent, k);\n continue;\n }\n if (c === \"/\" && xmlContent[k + 1] === \">\") {\n k += 1;\n break;\n }\n k += 1;\n }\n return k;\n}\n\n/**\n * Helper to update depth for closing tag\n */\nfunction updateDepthForClosingTag(\n xmlContent: string,\n nextLt: number,\n target: string,\n closeDepth: number\n): number {\n const { name: closeName } = parseName(xmlContent, nextLt + 2);\n return closeName === target ? closeDepth - 1 : closeDepth;\n}\n\n/**\n * Helper to update depth for opening tag\n */\nfunction updateDepthForOpeningTag(\n xmlContent: string,\n nextLt: number,\n target: string,\n closeDepth: number\n): number {\n const { name: openName } = parseName(xmlContent, nextLt + 1);\n return openName === target ? closeDepth + 1 : closeDepth;\n}\n\n/**\n * Helper to find closing tag for top-level range\n */\nfunction findClosingTagForRange(\n xmlContent: string,\n k: number,\n len: number,\n target: string\n): number {\n let closeDepth = 1;\n let j = k + 1;\n\n while (j < len && closeDepth > 0) {\n const nextLt = xmlContent.indexOf(\"<\", j);\n if (nextLt === -1) {\n break;\n }\n\n if (xmlContent[nextLt + 1] === \"/\") {\n closeDepth = updateDepthForClosingTag(\n xmlContent,\n nextLt,\n target,\n closeDepth\n );\n } else if (\n xmlContent[nextLt + 1] !== \"!\" &&\n xmlContent[nextLt + 1] !== \"?\"\n ) {\n closeDepth = updateDepthForOpeningTag(\n xmlContent,\n nextLt,\n target,\n closeDepth\n );\n }\n\n j = xmlContent.indexOf(\">\", nextLt + 1);\n if (j === -1) {\n break;\n }\n j += 1;\n }\n\n return closeDepth === 0 ? j : -1;\n}\n\n/**\n * Helper to process top-level target tag\n */\nfunction processTopLevelTarget(options: {\n xmlContent: string;\n tagStart: number;\n k: number;\n len: number;\n target: string;\n ranges: Array<{ start: number; end: number }>;\n}): { newDepth: number } {\n const { xmlContent, tagStart, k, len, target, ranges } = options;\n const isSelfClosing = xmlContent[k] === \"/\" || xmlContent.startsWith(\"/>\", k);\n\n if (isSelfClosing) {\n ranges.push({\n start: tagStart,\n end: k + (xmlContent[k] === \"/\" ? 2 : 1),\n });\n return { newDepth: 0 };\n }\n\n const endPos = findClosingTagForRange(xmlContent, k, len, target);\n if (endPos !== -1) {\n ranges.push({ start: tagStart, end: endPos });\n }\n return { newDepth: 0 };\n}\n\n/**\n * Helper to skip DOCTYPE declaration\n */\nfunction skipDoctypeInSpecial(\n xmlContent: string,\n i: number,\n len: number\n): number {\n const gt = xmlContent.indexOf(\">\", i + 1);\n return gt === -1 ? len : gt + 1;\n}\n\n/**\n * Helper to handle special constructs for top-level ranges\n */\nfunction handleSpecialConstructs(\n xmlContent: string,\n ch: string,\n i: number,\n len: number\n): number {\n if (ch === \"!\") {\n if (xmlContent.startsWith(\"!DOCTYPE\", i + 1)) {\n return skipDoctypeInSpecial(xmlContent, i, len);\n }\n if (xmlContent.startsWith(\"!--\", i + 1)) {\n return skipCommentInCounting(xmlContent, i, len);\n }\n if (xmlContent.startsWith(\"![CDATA[\", i + 1)) {\n return skipCdataInCounting(xmlContent, i, len);\n }\n const gt = xmlContent.indexOf(\">\", i + 1);\n return gt === -1 ? len : gt + 1;\n }\n if (ch === \"?\") {\n const close = xmlContent.indexOf(\"?>\", i + 1);\n return close === -1 ? len : close + 2;\n }\n return -1;\n}\n\n/**\n * Helper to handle closing tag in findAllTopLevelRanges\n */\nfunction handleClosingTagInFindAllTop(\n xmlContent: string,\n i: number,\n target: string,\n depth: number\n): { newPos: number; newDepth: number } {\n const { name: closingName, newPos: closingPos } = parseName(\n xmlContent,\n i + 1\n );\n const newDepth = closingName === target ? depth - 1 : depth;\n const gt = xmlContent.indexOf(\">\", closingPos);\n return {\n newPos: gt === -1 ? -1 : gt + 1,\n newDepth,\n };\n}\n\n/**\n * Find all top-level ranges for a tag (for handling duplicates)\n */\nexport function findAllTopLevelRanges(\n xmlContent: string,\n tagName: string\n): Array<{ start: number; end: number }> {\n const ranges: Array<{ start: number; end: number }> = [];\n const len = xmlContent.length;\n const target = tagName;\n let i = 0;\n let depth = 0;\n\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1 || lt + 1 >= len) {\n break;\n }\n i = lt + 1;\n\n const ch = xmlContent[i];\n const specialPos = handleSpecialConstructs(xmlContent, ch, i, len);\n if (specialPos !== -1) {\n i = specialPos;\n continue;\n }\n\n if (ch === \"/\") {\n const result = handleClosingTagInFindAllTop(xmlContent, i, target, depth);\n if (result.newPos === -1) {\n break;\n }\n i = result.newPos;\n depth = result.newDepth;\n continue;\n }\n\n // Opening tag\n const { name, newPos } = parseName(xmlContent, i);\n i = newPos;\n\n const k = skipAttributes(xmlContent, i, len);\n\n if (name === target && depth === 0) {\n depth += 1;\n const result = processTopLevelTarget({\n xmlContent,\n tagStart: lt,\n k,\n len,\n target,\n ranges,\n });\n depth += result.newDepth;\n }\n\n i = k + 1;\n }\n\n return ranges;\n}\n\n/**\n * Extract raw content from DOM node\n */\nexport function extractRawFromNode(node: RXMLNode): string {\n if (node.children.length === 0) {\n return \"\";\n }\n if (node.children.length === 1 && typeof node.children[0] === \"string\") {\n return node.children[0];\n }\n\n // For complex content, concatenate all text nodes\n let result = \"\";\n for (const child of node.children) {\n if (typeof child === \"string\") {\n result += child;\n } else {\n result += extractRawFromNode(child);\n }\n }\n return result;\n}\n","/**\n * XML Tokenizer based on TXML's character-by-character parsing approach\n * with enhanced error tolerance and schema awareness\n */\n\nimport { RXMLParseError } from \"../errors/types\";\nimport { getLineColumn, parseName, parseString } from \"../utils/helpers\";\nimport type { ParseOptions, RXMLNode } from \"./types\";\nimport { CharCodes, DEFAULT_NO_CHILD_NODES } from \"./types\";\n\nexport class XMLTokenizer {\n private pos = 0;\n private readonly xmlString: string;\n private readonly options: ParseOptions;\n\n constructor(xmlString: string, options: ParseOptions = {}) {\n this.xmlString = xmlString;\n this.options = {\n keepComments: false,\n keepWhitespace: false,\n noChildNodes: DEFAULT_NO_CHILD_NODES.slice(),\n textNodeName: \"#text\",\n throwOnDuplicateStringTags: true,\n ...options,\n };\n this.pos = options.pos || 0;\n }\n\n /**\n * Handle closing tag parsing\n */\n private handleClosingTag(\n tagName: string | undefined,\n children: (RXMLNode | string)[]\n ): (RXMLNode | string)[] | null {\n const closeStart = this.pos + 2;\n this.pos = this.xmlString.indexOf(\">\", this.pos);\n\n const closeTag = this.xmlString.substring(closeStart, this.pos);\n if (tagName && closeTag.trim() !== tagName) {\n const { line, column } = getLineColumn(this.xmlString, this.pos);\n throw new RXMLParseError(\n `Unexpected close tag at line ${line}, column ${column}. Expected </${tagName}>, found </${closeTag}>`,\n undefined,\n line,\n column\n );\n }\n\n if (this.pos !== -1) {\n this.pos += 1;\n }\n return children;\n }\n\n /**\n * Check if we're at end of string and should throw unclosed tag error\n */\n private checkUnclosedTag(\n tagName: string | undefined,\n consumedToEnd: boolean\n ): void {\n if (tagName && this.pos >= this.xmlString.length && !consumedToEnd) {\n const { line, column } = getLineColumn(this.xmlString, this.pos - 1);\n throw new RXMLParseError(\n `Unclosed tag at line ${line}, column ${column}. Expected closing tag </${tagName}>`,\n undefined,\n line,\n column\n );\n }\n }\n\n /**\n * Process special content (comments, CDATA, DOCTYPE) and track if we consumed to end\n */\n private processSpecialContent(children: (RXMLNode | string)[]): boolean {\n const prevPos = this.pos;\n this.handleSpecialContent(children);\n return this.pos >= this.xmlString.length && prevPos < this.xmlString.length;\n }\n\n /**\n * Handle text content parsing\n */\n private handleTextContent(children: (RXMLNode | string)[]): void {\n const text = this.parseText();\n if (this.options.keepWhitespace) {\n if (text.length > 0) {\n children.push(text);\n }\n } else {\n const trimmed = text.trim();\n if (trimmed.length > 0) {\n children.push(trimmed);\n }\n }\n this.pos += 1;\n }\n\n /**\n * Handle regular element parsing\n */\n private handleRegularElement(children: (RXMLNode | string)[]): void {\n const node = this.parseNode();\n children.push(node);\n\n // Handle processing instructions differently\n if (node.tagName[0] === \"?\") {\n children.push(...node.children);\n node.children = [];\n }\n }\n\n /**\n * Process a single child element based on the current character\n */\n private processSingleChild(\n children: (RXMLNode | string)[],\n tagName: string | undefined\n ): { shouldReturn: boolean; consumedToEnd: boolean } {\n if (this.xmlString.charCodeAt(this.pos) !== CharCodes.OPEN_BRACKET) {\n // Text content\n this.handleTextContent(children);\n return { shouldReturn: false, consumedToEnd: false };\n }\n\n const nextChar = this.xmlString.charCodeAt(this.pos + 1);\n\n if (nextChar === CharCodes.SLASH) {\n // Closing tag\n const result = this.handleClosingTag(tagName, children);\n if (result !== null) {\n return { shouldReturn: true, consumedToEnd: false };\n }\n return { shouldReturn: false, consumedToEnd: false };\n }\n\n if (nextChar === CharCodes.EXCLAMATION) {\n // Comment, CDATA, or DOCTYPE\n const wasConsumedToEnd = this.processSpecialContent(children);\n return { shouldReturn: false, consumedToEnd: wasConsumedToEnd };\n }\n\n // Regular element\n this.handleRegularElement(children);\n return { shouldReturn: false, consumedToEnd: false };\n }\n\n /**\n * Parse XML children recursively\n */\n parseChildren(tagName?: string): (RXMLNode | string)[] {\n const children: (RXMLNode | string)[] = [];\n let consumedToEnd = false;\n\n while (this.xmlString[this.pos]) {\n const result = this.processSingleChild(children, tagName);\n if (result.shouldReturn) {\n return children;\n }\n if (result.consumedToEnd) {\n consumedToEnd = true;\n }\n }\n\n // Check for unclosed tags\n this.checkUnclosedTag(tagName, consumedToEnd);\n\n return children;\n }\n\n /**\n * Check if character is whitespace\n */\n private isWhitespace(code: number): boolean {\n return (\n code === CharCodes.SPACE ||\n code === CharCodes.TAB ||\n code === CharCodes.NEWLINE ||\n code === CharCodes.CARRIAGE_RETURN\n );\n }\n\n /**\n * Skip whitespace characters\n */\n private skipWhitespace(): void {\n while (\n this.pos < this.xmlString.length &&\n this.isWhitespace(this.xmlString.charCodeAt(this.pos))\n ) {\n this.pos += 1;\n }\n }\n\n /**\n * Parse attribute value\n */\n private parseAttributeValue(): string | null {\n if (this.pos >= this.xmlString.length || this.xmlString[this.pos] !== \"=\") {\n return null;\n }\n\n this.pos += 1; // Skip =\n this.skipWhitespace();\n\n const code = this.xmlString.charCodeAt(this.pos);\n if (code === CharCodes.SINGLE_QUOTE || code === CharCodes.DOUBLE_QUOTE) {\n const { value: parsedValue, newPos: valueEnd } = parseString(\n this.xmlString,\n this.pos\n );\n this.pos = valueEnd;\n return parsedValue;\n }\n\n return null;\n }\n\n /**\n * Parse single attribute\n */\n private parseAttribute(attributes: Record<string, string | null>): void {\n const { name: attrName, newPos: nameEnd } = parseName(\n this.xmlString,\n this.pos\n );\n this.pos = nameEnd;\n this.skipWhitespace();\n\n const value = this.parseAttributeValue();\n attributes[attrName] = value;\n }\n\n /**\n * Parse all attributes\n */\n private parseAttributes(): Record<string, string | null> {\n const attributes: Record<string, string | null> = {};\n\n while (\n this.xmlString.charCodeAt(this.pos) !== CharCodes.CLOSE_BRACKET &&\n this.xmlString[this.pos]\n ) {\n const c = this.xmlString.charCodeAt(this.pos);\n\n if (this.isWhitespace(c)) {\n this.pos += 1;\n continue;\n }\n\n if ((c > 64 && c < 91) || (c > 96 && c < 123)) {\n this.parseAttribute(attributes);\n } else {\n this.pos += 1;\n }\n }\n\n return attributes;\n }\n\n /**\n * Parse special tag content (script, style)\n */\n private parseSpecialTagContent(\n _tagName: string,\n closingTag: string\n ): (RXMLNode | string)[] {\n const start = this.pos + 1;\n this.pos = this.xmlString.indexOf(closingTag, this.pos);\n\n if (this.pos === -1) {\n const children = [this.xmlString.slice(start)];\n this.pos = this.xmlString.length;\n return children;\n }\n\n const children = [this.xmlString.slice(start, this.pos)];\n this.pos += closingTag.length;\n return children;\n }\n\n /**\n * Parse node children based on tag type\n */\n private parseNodeChildren(\n tagName: string,\n isSelfClosing: boolean\n ): (RXMLNode | string)[] {\n if (isSelfClosing) {\n this.pos += 1;\n return [];\n }\n\n if (tagName === \"script\") {\n return this.parseSpecialTagContent(tagName, \"</script>\");\n }\n\n if (tagName === \"style\") {\n return this.parseSpecialTagContent(tagName, \"</style>\");\n }\n\n if (this.options.noChildNodes?.indexOf(tagName) === -1) {\n this.pos += 1;\n return this.parseChildren(tagName);\n }\n\n // Tag is in noChildNodes\n this.pos += 1;\n if ((DEFAULT_NO_CHILD_NODES as readonly string[]).includes(tagName)) {\n return [];\n }\n\n // Custom noChildNodes tags might have closing tags to skip\n const closingTag = `</${tagName}>`;\n const closingPos = this.xmlString.indexOf(closingTag, this.pos);\n if (closingPos !== -1) {\n this.pos = closingPos + closingTag.length;\n }\n\n return [];\n }\n\n /**\n * Parse a single XML node\n */\n parseNode(): RXMLNode {\n this.pos += 1; // Skip opening <\n\n const { name: tagName, newPos } = parseName(this.xmlString, this.pos);\n this.pos = newPos;\n\n const attributes = this.parseAttributes();\n\n // Check for self-closing tag or processing instruction\n const isSelfClosing =\n this.xmlString.charCodeAt(this.pos - 1) === CharCodes.SLASH ||\n (tagName[0] === \"?\" &&\n this.xmlString.charCodeAt(this.pos - 1) === CharCodes.QUESTION);\n\n const children = this.parseNodeChildren(tagName, isSelfClosing);\n\n return { tagName, attributes, children };\n }\n\n /**\n * Parse text content until next tag\n */\n private parseText(): string {\n const start = this.pos;\n this.pos = this.xmlString.indexOf(\"<\", this.pos) - 1;\n if (this.pos === -2) {\n this.pos = this.xmlString.length;\n }\n return this.xmlString.slice(start, this.pos + 1);\n }\n\n /**\n * Handle comments, CDATA, and DOCTYPE declarations\n */\n private handleSpecialContent(children: (RXMLNode | string)[]): void {\n if (this.xmlString.charCodeAt(this.pos + 2) === CharCodes.MINUS) {\n // Comment\n this.handleComment(children);\n } else if (\n this.xmlString.charCodeAt(this.pos + 2) ===\n CharCodes.OPEN_CORNER_BRACKET &&\n this.xmlString.charCodeAt(this.pos + 8) ===\n CharCodes.OPEN_CORNER_BRACKET &&\n this.xmlString.substr(this.pos + 3, 5).toLowerCase() === \"cdata\"\n ) {\n // CDATA\n this.handleCData(children);\n } else {\n // DOCTYPE or other declaration\n this.handleDoctype(children);\n }\n }\n\n /**\n * Handle XML comments\n */\n private handleComment(children: (RXMLNode | string)[]): void {\n const startCommentPos = this.pos;\n\n // Find comment end\n while (\n this.pos !== -1 &&\n !(\n this.xmlString.charCodeAt(this.pos) === CharCodes.CLOSE_BRACKET &&\n this.xmlString.charCodeAt(this.pos - 1) === CharCodes.MINUS &&\n this.xmlString.charCodeAt(this.pos - 2) === CharCodes.MINUS\n )\n ) {\n this.pos = this.xmlString.indexOf(\">\", this.pos + 1);\n }\n\n if (this.pos === -1) {\n this.pos = this.xmlString.length;\n }\n\n if (this.options.keepComments) {\n children.push(this.xmlString.substring(startCommentPos, this.pos + 1));\n }\n\n this.pos += 1;\n }\n\n /**\n * Handle CDATA sections\n */\n private handleCData(children: (RXMLNode | string)[]): void {\n const cdataEndIndex = this.xmlString.indexOf(\"]]>\", this.pos);\n if (cdataEndIndex === -1) {\n // Unclosed CDATA - consume everything to the end\n children.push(this.xmlString.substr(this.pos + 9));\n this.pos = this.xmlString.length;\n } else {\n children.push(this.xmlString.substring(this.pos + 9, cdataEndIndex));\n this.pos = cdataEndIndex + 3;\n }\n }\n\n /**\n * Handle DOCTYPE declarations\n */\n private handleDoctype(children: (RXMLNode | string)[]): void {\n const startDoctype = this.pos + 1;\n this.pos += 2;\n let encapsulated = false;\n\n while (\n (this.xmlString.charCodeAt(this.pos) !== CharCodes.CLOSE_BRACKET ||\n encapsulated) &&\n this.xmlString[this.pos]\n ) {\n if (\n this.xmlString.charCodeAt(this.pos) === CharCodes.OPEN_CORNER_BRACKET\n ) {\n encapsulated = true;\n } else if (\n encapsulated &&\n this.xmlString.charCodeAt(this.pos) === CharCodes.CLOSE_CORNER_BRACKET\n ) {\n encapsulated = false;\n }\n this.pos += 1;\n }\n\n children.push(this.xmlString.substring(startDoctype, this.pos));\n this.pos += 1;\n }\n\n /**\n * Get current position\n */\n getPosition(): number {\n return this.pos;\n }\n\n /**\n * Set position\n */\n setPosition(pos: number): void {\n this.pos = pos;\n }\n}\n","/**\n * Main XML parser that integrates tokenization, schema awareness, and error tolerance\n * This replaces the fast-xml-parser dependency with a TXML-based implementation\n */\n\nimport { getSchemaType, unwrapJsonSchema } from \"../../schema-coerce\";\nimport {\n RXMLCoercionError,\n RXMLDuplicateStringTagError,\n RXMLParseError,\n} from \"../errors/types\";\n\n// Regex constants for performance\nconst WHITESPACE_REGEX = /\\s/;\nconst NUMERIC_STRING_REGEX = /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/;\nconst DIGIT_KEY_REGEX = /^\\d+$/;\n\n/**\n * Extract top-level string-typed properties from a schema\n */\nfunction getTopLevelStringProps(s: unknown): Set<string> {\n const set = new Set<string>();\n const unwrapped = unwrapJsonSchema(s);\n if (unwrapped && typeof unwrapped === \"object\") {\n const props = (unwrapped as Record<string, unknown>).properties as\n | Record<string, unknown>\n | undefined;\n if (props && typeof props === \"object\") {\n for (const [k, v] of Object.entries(props)) {\n if (getSchemaType(v) === \"string\") {\n set.add(k);\n }\n }\n }\n }\n return set;\n}\n\n/**\n * Restore a single string value from placeholder if needed\n */\nfunction restorePlaceholderString(\n val: string,\n placeholderMap: Map<string, string>\n): string {\n if (val.startsWith(\"__RXML_PLACEHOLDER_\")) {\n const orig = placeholderMap.get(val);\n return orig !== undefined ? orig : val;\n }\n return val;\n}\n\n/**\n * Restore placeholders in an object\n */\nfunction restorePlaceholdersInObject(\n obj: Record<string, unknown>,\n _placeholderMap: Map<string, string>,\n textNodeName: string,\n restorer: (val: unknown) => unknown\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n const restored = restorer(v);\n // Trim when restoring into text node field to match tokenizer's default trimming\n if (k === textNodeName && typeof restored === \"string\") {\n out[k] = restored.trim();\n } else {\n out[k] = restored;\n }\n }\n return out;\n}\n\n/**\n * Create a function to restore placeholders deeply in parsed structure\n */\nfunction createPlaceholderRestorer(\n placeholderMap: Map<string, string>,\n textNodeName: string\n): (val: unknown) => unknown {\n const restorer = (val: unknown): unknown => {\n if (val == null) {\n return val;\n }\n if (typeof val === \"string\") {\n return restorePlaceholderString(val, placeholderMap);\n }\n if (Array.isArray(val)) {\n return val.map(restorer);\n }\n if (typeof val === \"object\") {\n return restorePlaceholdersInObject(\n val as Record<string, unknown>,\n placeholderMap,\n textNodeName,\n restorer\n );\n }\n return val;\n };\n return restorer;\n}\n\n/**\n * Convert a value to a number if it matches numeric pattern\n */\nfunction tryConvertToNumber(val: unknown): unknown {\n if (typeof val !== \"string\") {\n return val;\n }\n const trimmed = val.trim();\n if (NUMERIC_STRING_REGEX.test(trimmed)) {\n const num = Number(trimmed);\n if (Number.isFinite(num)) {\n return num;\n }\n }\n return trimmed;\n}\n\n/**\n * Process a single item value, extracting text content and converting numbers\n */\nfunction processItemValue(item: unknown, textNodeName: string): unknown {\n let currentVal: unknown = item;\n if (item && typeof item === \"object\" && Object.hasOwn(item, textNodeName)) {\n currentVal = (item as Record<string, unknown>)[textNodeName];\n }\n const trimmed =\n typeof currentVal === \"string\" ? currentVal.trim() : currentVal;\n return tryConvertToNumber(trimmed);\n}\n\n/**\n * Process item wrapper pattern values\n */\nfunction processItemWrapper(itemValue: unknown, textNodeName: string): unknown {\n if (Array.isArray(itemValue)) {\n return itemValue.map((item) => processItemValue(item, textNodeName));\n }\n const trimmed = typeof itemValue === \"string\" ? itemValue.trim() : itemValue;\n return tryConvertToNumber(trimmed);\n}\n\n/**\n * Check if error should be re-thrown based on error type and XML simplicity\n */\nfunction shouldRethrowParseError(\n error: unknown,\n xmlString: string\n): error is RXMLParseError {\n if (!(error instanceof RXMLParseError)) {\n return false;\n }\n const isSimple = xmlString.split(\"<\").length < 6;\n return (\n (error.message.includes(\"Unexpected close tag\") && isSimple) ||\n (error.message.includes(\"Unclosed tag\") && isSimple)\n );\n}\n\n/**\n * Try to extract partial XML results from malformed XML\n */\nfunction extractPartialXmlResults(\n xmlString: string,\n options: ParseOptions\n): (RXMLNode | string)[] {\n const partialResults: (RXMLNode | string)[] = [];\n const xmlPattern = /<([a-zA-Z_][\\w.-]*)[^>]*>.*?<\\/\\1>/gs;\n let match: RegExpExecArray | null = null;\n\n match = xmlPattern.exec(xmlString);\n while (match !== null) {\n try {\n const elementXml = match[0];\n const tokenizer = new XMLTokenizer(elementXml, options);\n const parsed = tokenizer.parseChildren();\n partialResults.push(...parsed);\n } catch {\n // Ignore parse errors for individual elements\n }\n match = xmlPattern.exec(xmlString);\n }\n\n return partialResults;\n}\n\nimport {\n coerceDomBySchema,\n domToObject,\n getPropertySchema,\n getStringTypedProperties,\n processArrayContent,\n processIndexedTuple,\n} from \"../schema/coercion\";\nimport {\n countTagOccurrences,\n extractRawInner,\n findAllInnerRanges,\n findFirstTopLevelRange,\n} from \"../schema/extraction\";\nimport { unescapeXml } from \"../utils/helpers\";\nimport { XMLTokenizer } from \"./tokenizer\";\nimport type { ParseOptions, RXMLNode } from \"./types\";\n\n// Internal: schema-guided deep XML entity decoding\nfunction deepDecodeStringsBySchema(input: unknown, schema: unknown): unknown {\n if (input == null || schema == null) {\n return input;\n }\n\n const type = getSchemaType(schema);\n\n if (type === \"string\" && typeof input === \"string\") {\n return unescapeXml(input);\n }\n\n if (type === \"array\" && Array.isArray(input)) {\n const unwrapped = unwrapJsonSchema(schema) as\n | { items?: unknown }\n | undefined;\n const itemSchema = unwrapped?.items ?? {};\n return input.map((item) => deepDecodeStringsBySchema(item, itemSchema));\n }\n\n if (type === \"object\" && input && typeof input === \"object\") {\n const obj = input as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n const childSchema = getPropertySchema(schema, key);\n out[key] = deepDecodeStringsBySchema(obj[key], childSchema);\n }\n return out;\n }\n\n // Fallback: decode any string when schema typing is ambiguous/missing\n if (typeof input === \"string\") {\n return unescapeXml(input);\n }\n return input;\n}\n\n/**\n * Parse XML with schema-aware type coercion\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: This function handles complex XML parsing logic that is difficult to break down further without losing clarity\nexport function parse(\n xmlInner: string,\n schema: unknown,\n options: ParseOptions = {}\n): Record<string, unknown> {\n const textNodeName = options.textNodeName ?? \"#text\";\n const throwDup = options.throwOnDuplicateStringTags ?? true;\n\n // If xmlInner looks like a full XML document (single root element), extract its inner content\n // But only if the schema doesn't expect that root element. Use a parser-style scan for robustness.\n let actualXmlInner = xmlInner.trim();\n if (actualXmlInner.startsWith(\"<\") && actualXmlInner.endsWith(\">\")) {\n const s = actualXmlInner;\n let i = 0;\n let rootStart = -1;\n let rootName = \"\";\n\n while (i < s.length) {\n const lt = s.indexOf(\"<\", i);\n if (lt === -1) {\n break;\n }\n const next = s[lt + 1];\n if (next === \"?\") {\n const end = s.indexOf(\"?>\", lt + 2);\n i = end === -1 ? s.length : end + 2;\n continue;\n }\n if (next === \"!\") {\n if (s.startsWith(\"!--\", lt + 2)) {\n const end = s.indexOf(\"-->\", lt + 5);\n i = end === -1 ? s.length : end + 3;\n continue;\n }\n if (s.startsWith(\"![CDATA[\", lt + 2)) {\n const end = s.indexOf(\"]]>\", lt + 9);\n i = end === -1 ? s.length : end + 3;\n continue;\n }\n const end = s.indexOf(\">\", lt + 2);\n i = end === -1 ? s.length : end + 1;\n continue;\n }\n if (next === \"/\") {\n // unexpected close before open; treat as not-a-root document\n break;\n }\n // Found a start tag; parse name until whitespace, '/', or '>'\n let j = lt + 1;\n while (\n j < s.length &&\n s[j] !== \" \" &&\n s[j] !== \"\\n\" &&\n s[j] !== \"\\r\" &&\n s[j] !== \"\\t\" &&\n s[j] !== \"/\" &&\n s[j] !== \">\"\n ) {\n j += 1;\n }\n rootStart = lt;\n rootName = s.slice(lt + 1, j);\n break;\n }\n\n if (rootStart === 0 && rootName) {\n const range = findFirstTopLevelRange(s, rootName);\n if (range) {\n // Compute full closing tag end index allowing whitespace before '>'\n let fullEnd = range.end + `</${rootName}>`.length;\n const closeHead = s.indexOf(`</${rootName}`, range.end);\n if (closeHead === range.end) {\n let p = closeHead + 2 + rootName.length;\n while (p < s.length && WHITESPACE_REGEX.test(s[p])) {\n p += 1;\n }\n if (s[p] === \">\") {\n fullEnd = p + 1;\n }\n }\n\n if (fullEnd === s.length) {\n // Check if the schema expects this root tag\n const unwrapped = unwrapJsonSchema(schema);\n const schemaProps =\n unwrapped && typeof unwrapped === \"object\"\n ? ((unwrapped as Record<string, unknown>).properties as\n | Record<string, unknown>\n | undefined)\n : undefined;\n\n if (schemaProps && !Object.hasOwn(schemaProps, rootName)) {\n actualXmlInner = s.slice(range.start, range.end);\n }\n }\n }\n }\n }\n\n // Identify string-typed properties for special handling\n // Use top-level keys for duplicate detection/backfill, deep keys for placeholder shielding\n const topLevelStringProps = getTopLevelStringProps(schema);\n const deepStringTypedProps = getStringTypedProperties(schema);\n\n // First, check for duplicates before doing any placeholder replacement\n const duplicateKeys = new Set<string>();\n for (const key of topLevelStringProps) {\n const excludeRanges: Array<{ start: number; end: number }> = [];\n for (const other of topLevelStringProps) {\n if (other === key) {\n continue;\n }\n const range = findFirstTopLevelRange(actualXmlInner, other);\n if (range) {\n excludeRanges.push(range);\n }\n }\n\n const occurrences = countTagOccurrences(\n actualXmlInner,\n key,\n excludeRanges,\n true\n );\n\n if (occurrences > 0 && throwDup) {\n throw new RXMLDuplicateStringTagError(\n `Duplicate string tags for <${key}> detected`\n );\n }\n if (occurrences > 0 && !throwDup) {\n duplicateKeys.add(key);\n if (options.onError) {\n options.onError(\n `RXML: Duplicate string tags for <${key}> detected; using first occurrence.`,\n { tag: key, occurrences }\n );\n }\n }\n }\n\n // Replace inner content of string-typed tags with placeholders to avoid\n // XML parsing errors from constructs like <!DOCTYPE ...> within element bodies\n let xmlInnerForParsing = actualXmlInner;\n const originalContentMap = new Map<string, string>();\n try {\n // Collect ranges of all occurrences for each string-typed tag name (at any depth)\n const ranges: Array<{ start: number; end: number; key: string }> = [];\n for (const key of deepStringTypedProps) {\n const innerRanges = findAllInnerRanges(actualXmlInner, key);\n for (const r of innerRanges) {\n if (r.end > r.start) {\n ranges.push({ ...r, key });\n }\n }\n }\n\n if (ranges.length > 0) {\n // Sort by start index and replace from left to right\n const sorted = [...ranges].sort((a, b) => a.start - b.start);\n let rebuilt = \"\";\n let cursor = 0;\n for (const r of sorted) {\n if (r.start < cursor) {\n // Overlapping range (nested); skip, as outer replacement already handled it\n continue;\n }\n if (cursor < r.start) {\n rebuilt += actualXmlInner.slice(cursor, r.start);\n }\n const placeholder = `__RXML_PLACEHOLDER_${r.key}_${r.start}_${r.end}__`;\n const originalContent = actualXmlInner.slice(r.start, r.end);\n originalContentMap.set(placeholder, originalContent);\n rebuilt += placeholder;\n cursor = r.end;\n }\n if (cursor < actualXmlInner.length) {\n rebuilt += actualXmlInner.slice(cursor);\n }\n xmlInnerForParsing = rebuilt;\n }\n } catch (error) {\n // Non-fatal: fall back to original XML; allow caller to handle via onError\n if (options.onError) {\n options.onError(\n \"RXML: Failed to replace string placeholders, falling back to original XML.\",\n { error }\n );\n }\n xmlInnerForParsing = actualXmlInner;\n }\n\n // Parse XML using our TXML-based tokenizer\n let parsedNodes: (RXMLNode | string)[];\n try {\n const wrappedXml = `<root>${xmlInnerForParsing}</root>`;\n const tokenizer = new XMLTokenizer(wrappedXml, {\n ...options,\n textNodeName,\n });\n const rootNode = tokenizer.parseNode();\n\n // Extract content from root wrapper\n parsedNodes = rootNode.children;\n } catch (cause) {\n throw new RXMLParseError(\"Failed to parse XML\", cause);\n }\n\n // Convert DOM to flat object structure\n const parsedArgs = domToObject(parsedNodes, schema, textNodeName);\n\n // Restore any placeholders across the entire parsed structure before schema-aware processing\n const restorePlaceholdersDeep = createPlaceholderRestorer(\n originalContentMap,\n textNodeName\n );\n const parsedArgsRestored = restorePlaceholdersDeep(parsedArgs) as Record<\n string,\n unknown\n >;\n const args: Record<string, unknown> = {};\n\n // Process each property with schema-aware handling\n for (const k of Object.keys(parsedArgsRestored || {})) {\n const v = parsedArgsRestored[k];\n let val: unknown = v;\n const propSchema = getPropertySchema(schema, k);\n const propType = getSchemaType(propSchema);\n\n // Handle duplicates when throwOnDuplicateStringTags is false\n if (propType === \"string\" && duplicateKeys.has(k) && Array.isArray(v)) {\n // For duplicates, use the first occurrence\n const firstValue = v[0];\n if (\n typeof firstValue === \"string\" &&\n firstValue.startsWith(\"__RXML_PLACEHOLDER_\")\n ) {\n // Restore from placeholder\n const originalContent = originalContentMap.get(firstValue);\n if (originalContent !== undefined) {\n args[k] = originalContent;\n continue;\n }\n } else {\n args[k] = firstValue;\n continue;\n }\n }\n\n if (propType === \"string\" && !Array.isArray(v)) {\n // First, check if this is a placeholder value and restore original content\n const placeholderUsed =\n (typeof v === \"string\" && v.startsWith(\"__RXML_PLACEHOLDER_\")) ||\n (v &&\n typeof v === \"object\" &&\n Object.hasOwn(v, textNodeName) &&\n typeof (v as Record<string, unknown>)[textNodeName] === \"string\" &&\n ((v as Record<string, unknown>)[textNodeName] as string).startsWith(\n \"__RXML_PLACEHOLDER_\"\n ));\n\n if (placeholderUsed) {\n // Extract the original content from the placeholder map\n let placeholderKey: string;\n if (typeof v === \"string\") {\n placeholderKey = v;\n } else {\n placeholderKey = (v as Record<string, unknown>)[\n textNodeName\n ] as string;\n }\n\n const originalContent = originalContentMap.get(placeholderKey);\n if (originalContent !== undefined) {\n args[k] = originalContent;\n continue;\n }\n }\n\n // Try to extract raw content (duplicates already handled earlier)\n const raw = extractRawInner(actualXmlInner, k);\n if (typeof raw === \"string\") {\n args[k] = raw;\n continue;\n }\n }\n\n // Extract text content from wrapped objects\n if (v && typeof v === \"object\" && Object.hasOwn(v, textNodeName)) {\n val = (v as Record<string, unknown>)[textNodeName];\n }\n\n // Handle array content\n if (Array.isArray(v)) {\n if (propType === \"string\") {\n const mapped = v.map((item) => {\n if (\n item &&\n typeof item === \"object\" &&\n Object.hasOwn(item, textNodeName)\n ) {\n const textVal = (item as Record<string, unknown>)[textNodeName];\n return typeof textVal === \"string\" ? textVal : String(textVal);\n }\n return typeof item === \"string\" ? item : String(item);\n });\n\n if (mapped.length > 1 && throwDup) {\n throw new RXMLDuplicateStringTagError(\n `Duplicate string tags for <${k}> detected`\n );\n }\n if (mapped.length > 1 && !throwDup && options.onError) {\n options.onError(\n `RXML: Duplicate string tags for <${k}> detected; using first occurrence.`,\n { tag: k, occurrences: mapped.length }\n );\n }\n\n args[k] = mapped[0] ?? \"\";\n continue;\n }\n val = processArrayContent(v, propSchema, textNodeName);\n } else if (v && typeof v === \"object\" && !Object.hasOwn(v, textNodeName)) {\n const obj = v as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n // Handle <item> wrapper pattern\n if (keys.length === 1 && keys[0] === \"item\") {\n val = processItemWrapper(obj.item, textNodeName);\n } else {\n // Check for indexed tuple pattern (numeric keys)\n let isIndexedTuple = false;\n if (keys.length > 0 && keys.every((key) => DIGIT_KEY_REGEX.test(key))) {\n const indices = keys\n .map((keyStr) => Number.parseInt(keyStr, 10))\n .sort((a, b) => a - b);\n isIndexedTuple =\n indices[0] === 0 &&\n indices.every((indexVal, idx) => indexVal === idx);\n }\n\n if (isIndexedTuple) {\n val = processIndexedTuple(obj, textNodeName);\n } else {\n val = v;\n }\n }\n }\n\n args[k] = typeof val === \"string\" ? val.trim() : val;\n }\n\n // Ensure missing string-typed properties are populated from original XML\n for (const key of topLevelStringProps) {\n if (!Object.hasOwn(args, key)) {\n const raw = extractRawInner(actualXmlInner, key);\n if (typeof raw === \"string\") {\n args[key] = raw;\n }\n }\n }\n\n // Auto-unwrap single root element if schema doesn't expect it (before coercion)\n let dataToCoerce = args;\n const keys = Object.keys(args);\n if (keys.length === 1) {\n const rootKey = keys[0];\n const rootValue = args[rootKey];\n\n // Check if schema expects the root key\n const unwrapped = unwrapJsonSchema(schema);\n if (unwrapped && typeof unwrapped === \"object\") {\n const schemaProps = (unwrapped as Record<string, unknown>).properties as\n | Record<string, unknown>\n | undefined;\n if (schemaProps && !Object.hasOwn(schemaProps, rootKey)) {\n // Schema doesn't expect the root key, so unwrap it before coercion\n dataToCoerce = rootValue as Record<string, unknown>;\n }\n }\n }\n\n // Apply schema-based coercion\n try {\n const coerced = coerceDomBySchema(dataToCoerce, schema);\n const decoded = deepDecodeStringsBySchema(coerced, schema) as Record<\n string,\n unknown\n >;\n return decoded;\n } catch (error) {\n throw new RXMLCoercionError(\"Failed to coerce by schema\", error);\n }\n}\n\n/**\n * Parse XML without schema (similar to TXML's parse function)\n */\nexport function parseWithoutSchema(\n xmlString: string,\n options: ParseOptions = {}\n): (RXMLNode | string)[] {\n try {\n const tokenizer = new XMLTokenizer(xmlString, options);\n return tokenizer.parseChildren();\n } catch (error) {\n // Check if this is a specific type of error that should be re-thrown\n if (shouldRethrowParseError(error, xmlString)) {\n // Preserve the original error message and line/column information\n throw new RXMLParseError(\n error.message,\n error.cause,\n error.line,\n error.column\n );\n }\n\n // For other types of malformed XML, try to be more tolerant and return partial results\n if (options.onError) {\n options.onError(\"Failed to parse XML without schema\", { error });\n }\n\n // Try to extract any valid XML elements that we can parse\n try {\n const partialResults = extractPartialXmlResults(xmlString, options);\n if (partialResults.length > 0) {\n return partialResults;\n }\n } catch {\n // Fallback failed too\n }\n\n // Last resort: return the input as text content\n return [xmlString.trim()];\n }\n}\n\n/**\n * Parse a single XML node\n */\nexport function parseNode(\n xmlString: string,\n options: ParseOptions = {}\n): RXMLNode {\n try {\n const tokenizer = new XMLTokenizer(xmlString, options);\n return tokenizer.parseNode();\n } catch (error) {\n throw new RXMLParseError(\"Failed to parse XML node\", error);\n }\n}\n\n/**\n * Build node value with attributes if present\n */\nfunction buildNodeValue(child: RXMLNode): unknown {\n const kids = simplify(child.children);\n let nodeValue: unknown = kids;\n\n // Add attributes if present\n if (Object.keys(child.attributes).length) {\n if (typeof kids === \"string\") {\n nodeValue = kids;\n // For string content with attributes, we need to preserve both\n if (kids !== \"\") {\n nodeValue = { _attributes: child.attributes, value: kids };\n } else {\n nodeValue = { _attributes: child.attributes };\n }\n } else if (typeof kids === \"object\" && kids !== null) {\n (kids as Record<string, unknown>)._attributes = child.attributes;\n nodeValue = kids;\n } else {\n nodeValue = { _attributes: child.attributes };\n }\n }\n\n return nodeValue;\n}\n\n/**\n * Simplify parsed XML structure (similar to TXML's simplify)\n */\nexport function simplify(children: (RXMLNode | string)[]): unknown {\n if (!children.length) {\n return \"\";\n }\n\n if (children.length === 1 && typeof children[0] === \"string\") {\n return children[0];\n }\n\n const out: Record<string, unknown> = {};\n\n // Map each object\n for (const child of children) {\n if (typeof child !== \"object\") {\n continue;\n }\n\n if (!out[child.tagName]) {\n out[child.tagName] = [];\n }\n\n const nodeValue = buildNodeValue(child);\n (out[child.tagName] as unknown[]).push(nodeValue);\n }\n\n // Flatten single-item arrays\n for (const key in out) {\n if (!Object.hasOwn(out, key)) {\n continue;\n }\n const value = out[key];\n if (Array.isArray(value) && value.length === 1) {\n out[key] = value[0];\n }\n }\n\n return out;\n}\n\n/**\n * Filter XML nodes (similar to TXML's filter)\n */\nexport function filter(\n children: (RXMLNode | string)[],\n filterFn: (\n node: RXMLNode,\n index: number,\n currentDepth: number,\n currentPath: string\n ) => boolean,\n depth = 0,\n path = \"\"\n): RXMLNode[] {\n const out: RXMLNode[] = [];\n\n for (let i = 0; i < children.length; i += 1) {\n const child = children[i];\n if (typeof child === \"object\" && filterFn(child, i, depth, path)) {\n out.push(child);\n }\n if (typeof child === \"object\" && child.children) {\n const childPath = `${path ? `${path}.` : \"\"}${i}.${child.tagName}`;\n const kids = filter(child.children, filterFn, depth + 1, childPath);\n out.push(...kids);\n }\n }\n\n return out;\n}\n","/**\n * Heuristic Engine for XML Tool-Call Parsing\n *\n * Pluggable pipeline for text normalization, repair, and object coercion.\n *\n * Phases:\n * 1. pre-parse: Text normalization before initial parse\n * 2. fallback-reparse: Text repair when initial parse fails\n * 3. post-parse: Object repair/coercion after successful parse\n */\n\nexport type HeuristicPhase = \"pre-parse\" | \"fallback-reparse\" | \"post-parse\";\n\nexport interface IntermediateCall {\n toolName: string;\n schema: unknown;\n rawSegment: string;\n parsed: unknown | null;\n errors: unknown[];\n meta?: Record<string, unknown>;\n}\n\nexport interface HeuristicResult {\n rawSegment?: string;\n parsed?: unknown;\n reparse?: boolean;\n stop?: boolean;\n warnings?: string[];\n}\n\nexport interface ToolCallHeuristic {\n id: string;\n phase: HeuristicPhase;\n applies(ctx: IntermediateCall): boolean;\n run(ctx: IntermediateCall): HeuristicResult;\n}\n\nexport interface PipelineConfig {\n preParse?: ToolCallHeuristic[];\n fallbackReparse?: ToolCallHeuristic[];\n postParse?: ToolCallHeuristic[];\n}\n\nexport interface HeuristicEngineOptions {\n parse: (xml: string, schema: unknown) => unknown;\n onError?: (message: string, metadata?: Record<string, unknown>) => void;\n maxReparses?: number;\n}\n\nfunction applyRawSegmentUpdate(\n current: IntermediateCall,\n result: HeuristicResult\n): IntermediateCall {\n if (result.rawSegment !== undefined) {\n return { ...current, rawSegment: result.rawSegment };\n }\n return current;\n}\n\nfunction applyParsedUpdate(\n current: IntermediateCall,\n result: HeuristicResult\n): IntermediateCall {\n if (result.parsed !== undefined) {\n return { ...current, parsed: result.parsed };\n }\n return current;\n}\n\nfunction applyWarningsUpdate(\n current: IntermediateCall,\n result: HeuristicResult\n): IntermediateCall {\n if (result.warnings && result.warnings.length > 0) {\n const meta = current.meta ?? {};\n const existingWarnings = (meta.warnings as string[] | undefined) ?? [];\n return {\n ...current,\n meta: { ...meta, warnings: [...existingWarnings, ...result.warnings] },\n };\n }\n return current;\n}\n\nfunction attemptReparse(\n current: IntermediateCall,\n result: HeuristicResult,\n reparseCount: number,\n maxReparses: number,\n parse: (xml: string, schema: unknown) => unknown\n): { state: IntermediateCall; newCount: number } {\n if (\n !result.reparse ||\n result.rawSegment === undefined ||\n reparseCount >= maxReparses\n ) {\n return { state: current, newCount: reparseCount };\n }\n\n try {\n const reparsed = parse(result.rawSegment, current.schema);\n return {\n state: { ...current, parsed: reparsed, errors: [] },\n newCount: reparseCount + 1,\n };\n } catch (error) {\n return {\n state: { ...current, errors: [...current.errors, error] },\n newCount: reparseCount + 1,\n };\n }\n}\n\nfunction executePhase(\n ctx: IntermediateCall,\n heuristics: ToolCallHeuristic[],\n options: HeuristicEngineOptions\n): IntermediateCall {\n let current = ctx;\n let reparseCount = 0;\n const maxReparses = options.maxReparses ?? 2;\n\n for (const heuristic of heuristics) {\n if (!heuristic.applies(current)) {\n continue;\n }\n\n const result = heuristic.run(current);\n\n current = applyRawSegmentUpdate(current, result);\n current = applyParsedUpdate(current, result);\n current = applyWarningsUpdate(current, result);\n\n const reparseResult = attemptReparse(\n current,\n result,\n reparseCount,\n maxReparses,\n options.parse\n );\n current = reparseResult.state;\n reparseCount = reparseResult.newCount;\n\n if (result.stop) {\n break;\n }\n }\n\n return current;\n}\n\nexport function applyHeuristicPipeline(\n ctx: IntermediateCall,\n config: PipelineConfig,\n options: HeuristicEngineOptions\n): IntermediateCall {\n let current = ctx;\n\n if (config.preParse && config.preParse.length > 0) {\n current = executePhase(current, config.preParse, options);\n }\n\n if (current.parsed === null && current.errors.length === 0) {\n try {\n const parsed = options.parse(current.rawSegment, current.schema);\n current = { ...current, parsed, errors: [] };\n } catch (error) {\n current = { ...current, errors: [error] };\n }\n }\n\n if (\n current.errors.length > 0 &&\n config.fallbackReparse &&\n config.fallbackReparse.length > 0\n ) {\n current = executePhase(current, config.fallbackReparse, options);\n }\n\n if (\n current.parsed !== null &&\n config.postParse &&\n config.postParse.length > 0\n ) {\n current = executePhase(current, config.postParse, options);\n }\n\n return current;\n}\n\nexport function createIntermediateCall(\n toolName: string,\n rawSegment: string,\n schema: unknown\n): IntermediateCall {\n return {\n toolName,\n schema,\n rawSegment,\n parsed: null,\n errors: [],\n meta: { originalContent: rawSegment },\n };\n}\n\nexport function mergePipelineConfigs(\n ...configs: PipelineConfig[]\n): PipelineConfig {\n const result: PipelineConfig = {\n preParse: [],\n fallbackReparse: [],\n postParse: [],\n };\n\n for (const config of configs) {\n if (config.preParse) {\n result.preParse = [...(result.preParse ?? []), ...config.preParse];\n }\n if (config.fallbackReparse) {\n result.fallbackReparse = [\n ...(result.fallbackReparse ?? []),\n ...config.fallbackReparse,\n ];\n }\n if (config.postParse) {\n result.postParse = [...(result.postParse ?? []), ...config.postParse];\n }\n }\n\n return result;\n}\n","export function escapeRegExp(literal: string): string {\n return literal.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","/**\n * Default heuristics for XML fragment parsing.\n * Modular, reusable versions of normalization/repair logic from morph-xml-protocol.\n */\n\nimport { escapeRegExp } from \"../../core/utils/regex\";\nimport { unwrapJsonSchema } from \"../../schema-coerce\";\nimport { parse } from \"../core/parser\";\nimport type {\n HeuristicResult,\n IntermediateCall,\n PipelineConfig,\n ToolCallHeuristic,\n} from \"./engine\";\n\nconst MALFORMED_CLOSE_RE_G = /<\\/\\s+([A-Za-z0-9_:-]+)\\s*>/g;\nconst MALFORMED_CLOSE_RE = /<\\/\\s+([A-Za-z0-9_:-]+)\\s*>/;\nconst STATUS_TO_STEP_BOUNDARY_RE = /<\\/status>\\s*<step>/g;\nconst WHITESPACE_REGEX = /\\s/;\nconst NAME_CHAR_RE = /[A-Za-z0-9_:-]/;\n// NameStartChar per XML 1.0 spec: letter, underscore, or colon (digits NOT allowed as first char)\nconst NAME_START_CHAR_RE = /[A-Za-z_:]/;\nconst STEP_TAG_RE = /<step>([\\s\\S]*?)<\\/step>/i;\nconst STATUS_TAG_RE = /<status>([\\s\\S]*?)<\\/status>/i;\n\nexport const normalizeCloseTagsHeuristic: ToolCallHeuristic = {\n id: \"normalize-close-tags\",\n phase: \"pre-parse\",\n applies: () => true,\n run: (ctx: IntermediateCall): HeuristicResult => {\n const normalized = ctx.rawSegment.replace(MALFORMED_CLOSE_RE_G, \"</$1>\");\n if (normalized !== ctx.rawSegment) {\n return { rawSegment: normalized };\n }\n return {};\n },\n};\n\nexport const escapeInvalidLtHeuristic: ToolCallHeuristic = {\n id: \"escape-invalid-lt\",\n phase: \"pre-parse\",\n applies: () => true,\n run: (ctx: IntermediateCall): HeuristicResult => {\n const escaped = escapeInvalidLt(ctx.rawSegment);\n if (escaped !== ctx.rawSegment) {\n return { rawSegment: escaped };\n }\n return {};\n },\n};\n\nexport const balanceTagsHeuristic: ToolCallHeuristic = {\n id: \"balance-tags\",\n phase: \"fallback-reparse\",\n applies: (ctx: IntermediateCall): boolean => {\n const original = (ctx.meta?.originalContent as string) || ctx.rawSegment;\n const normalized = original.replace(MALFORMED_CLOSE_RE_G, \"</$1>\");\n const balanced = balanceTags(original);\n const hasMalformedClose = MALFORMED_CLOSE_RE.test(original);\n\n if (\n !hasMalformedClose &&\n balanced.length > normalized.length &&\n ctx.errors.length === 0\n ) {\n return false;\n }\n return balanced !== normalized;\n },\n run: (ctx: IntermediateCall): HeuristicResult => {\n const original = (ctx.meta?.originalContent as string) || ctx.rawSegment;\n const balanced = balanceTags(original);\n const escaped = escapeInvalidLt(balanced);\n return { rawSegment: escaped, reparse: true };\n },\n};\n\nexport const dedupeShellStringTagsHeuristic: ToolCallHeuristic = {\n id: \"dedupe-shell-string-tags\",\n phase: \"fallback-reparse\",\n applies: (ctx: IntermediateCall): boolean =>\n shouldDeduplicateStringTags(ctx.schema),\n run: (ctx: IntermediateCall): HeuristicResult => {\n const names = getStringPropertyNames(ctx.schema);\n let deduped = ctx.rawSegment;\n for (const key of names) {\n deduped = dedupeSingleTag(deduped, key);\n }\n if (deduped !== ctx.rawSegment) {\n return { rawSegment: deduped, reparse: true };\n }\n return {};\n },\n};\n\nexport const repairAgainstSchemaHeuristic: ToolCallHeuristic = {\n id: \"repair-against-schema\",\n phase: \"post-parse\",\n applies: (ctx: IntermediateCall): boolean =>\n ctx.parsed !== null && typeof ctx.parsed === \"object\",\n run: (ctx: IntermediateCall): HeuristicResult => {\n const repaired = repairParsedAgainstSchema(ctx.parsed, ctx.schema);\n if (repaired !== ctx.parsed) {\n return { parsed: repaired };\n }\n return {};\n },\n};\n\nexport const defaultPipelineConfig: PipelineConfig = {\n preParse: [normalizeCloseTagsHeuristic, escapeInvalidLtHeuristic],\n fallbackReparse: [balanceTagsHeuristic, dedupeShellStringTagsHeuristic],\n postParse: [repairAgainstSchemaHeuristic],\n};\n\nconst INDEX_TAG_RE = /^<(\\d+)(?:>|\\/?>)/;\n\nfunction isIndexTagAt(xml: string, pos: number): boolean {\n const remaining = xml.slice(pos);\n return INDEX_TAG_RE.test(remaining);\n}\n\nfunction escapeInvalidLt(xml: string): string {\n const len = xml.length;\n let out = \"\";\n for (let i = 0; i < len; i += 1) {\n const ch = xml[i];\n if (ch === \"<\") {\n const next = i + 1 < len ? xml[i + 1] : \"\";\n const isValidStart =\n NAME_START_CHAR_RE.test(next) ||\n next === \"/\" ||\n next === \"!\" ||\n next === \"?\";\n const isIndexTag = !isValidStart && isIndexTagAt(xml, i);\n if (!(isValidStart || isIndexTag)) {\n out += \"<\";\n continue;\n }\n }\n out += ch;\n }\n return out;\n}\n\nfunction balanceTags(xml: string): string {\n const src = xml\n .replace(MALFORMED_CLOSE_RE_G, \"</$1>\")\n .replace(STATUS_TO_STEP_BOUNDARY_RE, \"</status></step><step>\");\n let i = 0;\n const len = src.length;\n const out: string[] = [];\n const stack: string[] = [];\n\n while (i < len) {\n const lt = src.indexOf(\"<\", i);\n if (lt === -1) {\n out.push(src.slice(i));\n break;\n }\n out.push(src.slice(i, lt));\n if (lt + 1 >= len) {\n break;\n }\n const next = src[lt + 1];\n if (next === \"!\" || next === \"?\") {\n i = handleSpecialTagSegment(src, lt, out);\n continue;\n }\n if (next === \"/\") {\n i = handleClosingTagSegment(src, lt, out, stack);\n continue;\n }\n i = handleOpeningTagSegment(src, lt, out, stack);\n }\n\n for (let k = stack.length - 1; k >= 0; k -= 1) {\n out.push(`</${stack[k]}>`);\n }\n return out.join(\"\");\n}\n\nfunction skipWs(s: string, p: number, len: number): number {\n let idx = p;\n while (idx < len && WHITESPACE_REGEX.test(s[idx])) {\n idx += 1;\n }\n return idx;\n}\n\nfunction parseTagNameAt(\n s: string,\n p: number,\n len: number\n): { name: string; pos: number } {\n let idx = p;\n const start = idx;\n while (idx < len && NAME_CHAR_RE.test(s[idx])) {\n idx += 1;\n }\n return { name: s.slice(start, idx), pos: idx };\n}\n\nfunction handleSpecialTagSegment(\n src: string,\n lt: number,\n out: string[]\n): number {\n const gt = src.indexOf(\">\", lt + 1);\n if (gt === -1) {\n out.push(src.slice(lt));\n return src.length;\n }\n out.push(src.slice(lt, gt + 1));\n return gt + 1;\n}\n\nfunction handleClosingTagSegment(\n src: string,\n lt: number,\n out: string[],\n stack: string[]\n): number {\n const len = src.length;\n let p = skipWs(src, lt + 2, len);\n const { name, pos } = parseTagNameAt(src, p, len);\n p = pos;\n const gt = src.indexOf(\">\", p);\n const closingText = gt === -1 ? src.slice(lt) : src.slice(lt, gt + 1);\n const idx = stack.lastIndexOf(name);\n if (idx !== -1) {\n for (let k = stack.length - 1; k > idx; k -= 1) {\n out.push(`</${stack[k]}>`);\n stack.pop();\n }\n out.push(closingText);\n stack.pop();\n }\n return gt === -1 ? len : gt + 1;\n}\n\nfunction handleOpeningTagSegment(\n src: string,\n lt: number,\n out: string[],\n stack: string[]\n): number {\n const len = src.length;\n let p = skipWs(src, lt + 1, len);\n const nameStart = p;\n const parsed = parseTagNameAt(src, p, len);\n p = parsed.pos;\n const name = src.slice(nameStart, p);\n const q = src.indexOf(\">\", p);\n if (q === -1) {\n out.push(src.slice(lt));\n return len;\n }\n let r = q - 1;\n while (r >= nameStart && WHITESPACE_REGEX.test(src[r])) {\n r -= 1;\n }\n const selfClosing = src[r] === \"/\";\n out.push(src.slice(lt, q + 1));\n if (!selfClosing && name) {\n stack.push(name);\n }\n return q + 1;\n}\n\n/**\n * Extract properties from a JSON schema, handling $ref unwrapping.\n * Returns undefined if schema is invalid or has no properties.\n */\nfunction extractSchemaProperties(\n schema: unknown\n): Record<string, unknown> | undefined {\n const unwrapped = unwrapJsonSchema(schema);\n if (!unwrapped || typeof unwrapped !== \"object\") {\n return undefined;\n }\n return (unwrapped as { properties?: Record<string, unknown> }).properties;\n}\n\nfunction shouldDeduplicateStringTags(schema: unknown): boolean {\n const props = extractSchemaProperties(schema);\n if (!props) {\n return false;\n }\n const commandRaw = props.command;\n if (!commandRaw) {\n return false;\n }\n const command = unwrapJsonSchema(commandRaw) as { type?: string } | undefined;\n return command?.type === \"array\";\n}\n\nfunction getStringPropertyNames(schema: unknown): string[] {\n const props = extractSchemaProperties(schema);\n if (!props) {\n return [];\n }\n const names: string[] = [];\n for (const key of Object.keys(props)) {\n const prop = unwrapJsonSchema(props[key]) as { type?: string } | undefined;\n if (prop?.type === \"string\") {\n names.push(key);\n }\n }\n return names;\n}\n\nfunction dedupeSingleTag(xml: string, key: string): string {\n const escaped = escapeRegExp(key);\n const re = new RegExp(`<${escaped}>([\\\\s\\\\S]*?)<\\\\/${escaped}>`, \"g\");\n const matches = Array.from(xml.matchAll(re));\n if (matches.length <= 1) {\n return xml;\n }\n const last = matches.at(-1);\n let result = \"\";\n let cursor = 0;\n for (const m of matches) {\n const idx = m.index ?? 0;\n result += xml.slice(cursor, idx);\n if (last && idx === (last.index ?? -1)) {\n result += m[0];\n }\n cursor = idx + m[0].length;\n }\n result += xml.slice(cursor);\n return result;\n}\n\nfunction repairParsedAgainstSchema(input: unknown, schema: unknown): unknown {\n if (!input || typeof input !== \"object\") {\n return input;\n }\n const properties = extractSchemaProperties(schema);\n if (!properties) {\n return input;\n }\n applySchemaProps(input as Record<string, unknown>, properties);\n return input;\n}\n\ninterface PropSchema {\n type?: string;\n items?: unknown;\n}\n\nfunction applySchemaProps(\n obj: Record<string, unknown>,\n properties: Record<string, unknown>\n): void {\n for (const key of Object.keys(obj)) {\n const propSchema = properties[key];\n if (!propSchema) {\n continue;\n }\n const prop = unwrapJsonSchema(propSchema) as PropSchema | undefined;\n if (prop?.type === \"array\" && prop.items) {\n const itemSchema = unwrapJsonSchema(prop.items);\n obj[key] = coerceArrayItems(obj[key], itemSchema);\n continue;\n }\n if (prop?.type === \"object\") {\n const val = obj[key];\n if (val && typeof val === \"object\") {\n obj[key] = repairParsedAgainstSchema(val, prop);\n }\n }\n }\n}\n\nfunction coerceArrayItems(\n val: unknown,\n itemSchema: unknown\n): unknown[] | unknown {\n if (!Array.isArray(val)) {\n return val;\n }\n return val.map((v) => coerceArrayItem(v, itemSchema));\n}\n\nfunction coerceArrayItem(v: unknown, itemSchema: unknown): unknown {\n const itemType = (itemSchema as { type?: string })?.type;\n if (typeof v === \"string\" && itemType === \"object\") {\n const parsed = tryParseStringToSchemaObject(v, itemSchema);\n if (parsed !== null) {\n return parsed;\n }\n const fallback = extractStepStatusFromString(\n v.replace(MALFORMED_CLOSE_RE_G, \"</$1>\")\n );\n if (fallback) {\n return fallback;\n }\n return v;\n }\n if (v && typeof v === \"object\" && itemType === \"object\") {\n return repairParsedAgainstSchema(v, itemSchema);\n }\n return v;\n}\n\nfunction tryParseStringToSchemaObject(\n xml: string,\n itemSchema: unknown\n): unknown | null {\n try {\n const normalized = xml.replace(MALFORMED_CLOSE_RE_G, \"</$1>\");\n const fixed = parse(normalized, itemSchema, { noChildNodes: [] });\n return typeof fixed === \"string\" ? null : (fixed as unknown);\n } catch {\n return null;\n }\n}\n\nfunction extractStepStatusFromString(\n normXml: string\n): Record<string, string> | null {\n const stepMatch = normXml.match(STEP_TAG_RE);\n const statusMatch = normXml.match(STATUS_TAG_RE);\n if (stepMatch && statusMatch) {\n return { step: stepMatch[1], status: statusMatch[1] };\n }\n return null;\n}\n\nexport {\n escapeInvalidLt,\n balanceTags,\n shouldDeduplicateStringTags,\n getStringPropertyNames,\n dedupeSingleTag,\n repairParsedAgainstSchema,\n};\n","import { parse as parseCore } from \"./core/parser\";\nimport type { ParseOptions } from \"./core/types\";\nimport { RXMLParseError } from \"./errors/types\";\nimport {\n applyHeuristicPipeline,\n createIntermediateCall,\n defaultPipelineConfig,\n} from \"./heuristics\";\n\nexport function parse(\n xml: string,\n schema: unknown,\n options: ParseOptions = {}\n): Record<string, unknown> {\n if (!options.repair) {\n return parseCore(xml, schema, options);\n }\n\n const baseOptions: ParseOptions = {\n ...options,\n repair: false,\n };\n\n const ctx = createIntermediateCall(\"\", xml, schema);\n const result = applyHeuristicPipeline(ctx, defaultPipelineConfig, {\n parse: (raw, s) => parseCore(raw, s, baseOptions),\n onError: options.onError,\n maxReparses: options.maxReparses,\n });\n\n if (result.parsed !== null) {\n return result.parsed as Record<string, unknown>;\n }\n\n const error = result.errors[0];\n throw new RXMLParseError(\"Failed to parse XML with repair heuristics\", error);\n}\n"],"mappings":"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","names":["escaped","result","children","end","keys","parse","WHITESPACE_REGEX","parse"]}
|
package/dist/community.cjs
CHANGED
|
@@ -850,6 +850,13 @@ function generateId() {
|
|
|
850
850
|
return Math.random().toString(36).substring(2, 15);
|
|
851
851
|
}
|
|
852
852
|
|
|
853
|
+
// src/core/utils/protocol-utils.ts
|
|
854
|
+
function addTextSegment(text, processedElements) {
|
|
855
|
+
if (text.trim()) {
|
|
856
|
+
processedElements.push({ type: "text", text });
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
|
|
853
860
|
// src/core/utils/regex.ts
|
|
854
861
|
function escapeRegExp(literal) {
|
|
855
862
|
return literal.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
@@ -881,11 +888,6 @@ function processToolCallJson(toolCallJson, fullMatch, processedElements, options
|
|
|
881
888
|
processedElements.push({ type: "text", text: fullMatch });
|
|
882
889
|
}
|
|
883
890
|
}
|
|
884
|
-
function addTextSegment(text, processedElements) {
|
|
885
|
-
if (text.trim()) {
|
|
886
|
-
processedElements.push({ type: "text", text });
|
|
887
|
-
}
|
|
888
|
-
}
|
|
889
891
|
function processMatchedToolCall(context) {
|
|
890
892
|
const { match, text, currentIndex, processedElements, options } = context;
|
|
891
893
|
const startIndex = match.index;
|
|
@@ -3642,12 +3644,9 @@ function getStringPropertyNames(schema) {
|
|
|
3642
3644
|
}
|
|
3643
3645
|
return names;
|
|
3644
3646
|
}
|
|
3645
|
-
function escapeRegExp2(s) {
|
|
3646
|
-
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
3647
|
-
}
|
|
3648
3647
|
function dedupeSingleTag(xml, key) {
|
|
3649
3648
|
var _a, _b;
|
|
3650
|
-
const escaped =
|
|
3649
|
+
const escaped = escapeRegExp(key);
|
|
3651
3650
|
const re = new RegExp(`<${escaped}>([\\s\\S]*?)<\\/${escaped}>`, "g");
|
|
3652
3651
|
const matches = Array.from(xml.matchAll(re));
|
|
3653
3652
|
if (matches.length <= 1) {
|
|
@@ -3764,9 +3763,11 @@ function parse3(xml, schema, options = {}) {
|
|
|
3764
3763
|
throw new RXMLParseError("Failed to parse XML with repair heuristics", error);
|
|
3765
3764
|
}
|
|
3766
3765
|
|
|
3767
|
-
// src/core/
|
|
3766
|
+
// src/core/utils/regex-constants.ts
|
|
3768
3767
|
var NAME_CHAR_RE2 = /[A-Za-z0-9_:-]/;
|
|
3769
3768
|
var WHITESPACE_REGEX4 = /\s/;
|
|
3769
|
+
|
|
3770
|
+
// src/core/protocols/xml-protocol.ts
|
|
3770
3771
|
function getToolSchema(tools, toolName) {
|
|
3771
3772
|
var _a;
|
|
3772
3773
|
return (_a = tools.find((t) => t.name === toolName)) == null ? void 0 : _a.inputSchema;
|
|
@@ -4474,8 +4475,6 @@ var xmlProtocol = (protocolOptions) => {
|
|
|
4474
4475
|
|
|
4475
4476
|
// src/core/protocols/yaml-protocol.ts
|
|
4476
4477
|
var import_yaml = __toESM(require("yaml"), 1);
|
|
4477
|
-
var NAME_CHAR_RE3 = /[A-Za-z0-9_:-]/;
|
|
4478
|
-
var WHITESPACE_REGEX5 = /\s/;
|
|
4479
4478
|
var LEADING_WHITESPACE_RE = /^(\s*)/;
|
|
4480
4479
|
function findClosingTagEnd(text, contentStart, toolName) {
|
|
4481
4480
|
let pos = contentStart;
|
|
@@ -4492,11 +4491,11 @@ function findClosingTagEnd(text, contentStart, toolName) {
|
|
|
4492
4491
|
break;
|
|
4493
4492
|
}
|
|
4494
4493
|
let p = ltIdx + 2;
|
|
4495
|
-
while (p < gtIdx &&
|
|
4494
|
+
while (p < gtIdx && WHITESPACE_REGEX4.test(text[p])) {
|
|
4496
4495
|
p++;
|
|
4497
4496
|
}
|
|
4498
4497
|
const nameStart = p;
|
|
4499
|
-
while (p < gtIdx &&
|
|
4498
|
+
while (p < gtIdx && NAME_CHAR_RE2.test(text.charAt(p))) {
|
|
4500
4499
|
p++;
|
|
4501
4500
|
}
|
|
4502
4501
|
const name = text.slice(nameStart, p);
|
|
@@ -4512,11 +4511,11 @@ function findClosingTagEnd(text, contentStart, toolName) {
|
|
|
4512
4511
|
pos = gtIdx === -1 ? text.length : gtIdx + 1;
|
|
4513
4512
|
} else {
|
|
4514
4513
|
let p = ltIdx + 1;
|
|
4515
|
-
while (p < text.length &&
|
|
4514
|
+
while (p < text.length && WHITESPACE_REGEX4.test(text[p])) {
|
|
4516
4515
|
p++;
|
|
4517
4516
|
}
|
|
4518
4517
|
const nameStart = p;
|
|
4519
|
-
while (p < text.length &&
|
|
4518
|
+
while (p < text.length && NAME_CHAR_RE2.test(text.charAt(p))) {
|
|
4520
4519
|
p++;
|
|
4521
4520
|
}
|
|
4522
4521
|
const name = text.slice(nameStart, p);
|
|
@@ -4525,7 +4524,7 @@ function findClosingTagEnd(text, contentStart, toolName) {
|
|
|
4525
4524
|
break;
|
|
4526
4525
|
}
|
|
4527
4526
|
let r = gtIdx - 1;
|
|
4528
|
-
while (r >= nameStart &&
|
|
4527
|
+
while (r >= nameStart && WHITESPACE_REGEX4.test(text[r])) {
|
|
4529
4528
|
r--;
|
|
4530
4529
|
}
|
|
4531
4530
|
const selfClosing = text[r] === "/";
|
|
@@ -4643,22 +4642,14 @@ function parseYamlContent(yamlContent, options) {
|
|
|
4643
4642
|
return null;
|
|
4644
4643
|
}
|
|
4645
4644
|
}
|
|
4646
|
-
function appendTextPart(processedElements, textPart) {
|
|
4647
|
-
if (textPart.trim()) {
|
|
4648
|
-
processedElements.push({
|
|
4649
|
-
type: "text",
|
|
4650
|
-
text: textPart
|
|
4651
|
-
});
|
|
4652
|
-
}
|
|
4653
|
-
}
|
|
4654
4645
|
function processToolCallMatch(text, tc, currentIndex, processedElements, options) {
|
|
4655
4646
|
var _a;
|
|
4656
4647
|
if (tc.startIndex < currentIndex) {
|
|
4657
4648
|
return currentIndex;
|
|
4658
4649
|
}
|
|
4659
|
-
|
|
4660
|
-
|
|
4661
|
-
|
|
4650
|
+
addTextSegment(
|
|
4651
|
+
text.substring(currentIndex, tc.startIndex),
|
|
4652
|
+
processedElements
|
|
4662
4653
|
);
|
|
4663
4654
|
const parsedArgs = parseYamlContent(tc.content, options);
|
|
4664
4655
|
if (parsedArgs !== null) {
|
|
@@ -4776,7 +4767,7 @@ ${yamlContent}</${toolCall.toolName}>`;
|
|
|
4776
4767
|
);
|
|
4777
4768
|
}
|
|
4778
4769
|
if (currentIndex < text.length) {
|
|
4779
|
-
|
|
4770
|
+
addTextSegment(text.substring(currentIndex), processedElements);
|
|
4780
4771
|
}
|
|
4781
4772
|
return processedElements;
|
|
4782
4773
|
},
|