@ai-sdk-tool/rxml 0.1.1 → 0.1.2-canary.0

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors/types.ts","../src/schema/base-coercion.ts","../src/schema/coercion.ts","../src/core/types.ts","../src/utils/helpers.ts","../src/schema/extraction.ts","../src/core/tokenizer.ts","../src/core/parser.ts","../src/core/stream.ts","../src/builders/stringify.ts"],"sourcesContent":["// Core functionality\nexport {\n filter,\n parse,\n parseNode,\n parseWithoutSchema,\n simplify,\n} from \"./core/parser\";\nexport {\n createXMLStream,\n findElementByIdStream,\n findElementsByClassStream,\n parseFromStream,\n processXMLStream,\n XMLTransformStream,\n} from \"./core/stream\";\nexport { XMLTokenizer } from \"./core/tokenizer\";\n\n// Schema integration\nexport {\n coerceBySchema,\n getSchemaType,\n unwrapJsonSchema,\n} from \"./schema/base-coercion\";\nexport {\n coerceDomBySchema,\n domToObject,\n getPropertySchema,\n getStringTypedProperties,\n processArrayContent,\n processIndexedTuple,\n} from \"./schema/coercion\";\nexport {\n countTagOccurrences,\n extractRawInner,\n findAllTopLevelRanges,\n findFirstTopLevelRange,\n} from \"./schema/extraction\";\n\n// Builders\nexport {\n stringify,\n stringifyNode,\n stringifyNodes,\n toContentString,\n} from \"./builders/stringify\";\n\n// Utils\nexport { unescapeXml } from \"./utils/helpers\";\n\n// Types\nexport type { ParseOptions, RXMLNode, StringifyOptions } from \"./core/types\";\n\n// Errors\nexport {\n RXMLCoercionError,\n RXMLDuplicateStringTagError,\n RXMLParseError,\n RXMLStreamError,\n RXMLStringifyError,\n} from \"./errors/types\";\n\n// Compatibility\nexport interface Options {\n textNodeName?: string;\n throwOnDuplicateStringTags?: boolean;\n onError?: (message: string, context?: Record<string, unknown>) => void;\n}\n","/**\n * Error classes for robust-xml parser\n */\n\nexport class RXMLParseError extends Error {\n constructor(\n message: string,\n public cause?: unknown,\n public line?: number,\n public column?: number\n ) {\n super(message);\n this.name = \"RXMLParseError\";\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 constructor(\n message: string,\n public cause?: unknown\n ) {\n super(message);\n this.name = \"RXMLCoercionError\";\n }\n}\n\nexport class RXMLStringifyError extends Error {\n constructor(\n message: string,\n public cause?: unknown\n ) {\n super(message);\n this.name = \"RXMLStringifyError\";\n }\n}\n\nexport class RXMLStreamError extends Error {\n constructor(\n message: string,\n public cause?: unknown\n ) {\n super(message);\n this.name = \"RXMLStreamError\";\n }\n}\n","export function unwrapJsonSchema(schema: unknown): unknown {\n if (!schema || typeof schema !== \"object\") return schema;\n const s = schema as Record<string, unknown>;\n if (s.jsonSchema && typeof s.jsonSchema === \"object\") {\n return unwrapJsonSchema(s.jsonSchema);\n }\n return schema;\n}\n\nexport function getSchemaType(schema: unknown): string | undefined {\n const unwrapped = unwrapJsonSchema(schema);\n if (!unwrapped || typeof unwrapped !== \"object\") return undefined;\n const t: unknown = (unwrapped as Record<string, unknown>).type;\n if (typeof t === \"string\") return t;\n if (Array.isArray(t)) {\n const preferred = [\n \"object\",\n \"array\",\n \"boolean\",\n \"number\",\n \"integer\",\n \"string\",\n ];\n for (const p of preferred) if (t.includes(p)) return p;\n }\n const s = unwrapped as Record<string, unknown>;\n if (s && typeof s === \"object\" && (s.properties || s.additionalProperties)) {\n return \"object\";\n }\n if (\n s &&\n typeof s === \"object\" &&\n (s.items || (s as Record<string, unknown>).prefixItems)\n ) {\n return \"array\";\n }\n return undefined;\n}\n\nexport function coerceBySchema(value: unknown, schema?: unknown): unknown {\n const unwrapped = unwrapJsonSchema(schema);\n if (!unwrapped || typeof unwrapped !== \"object\") {\n if (typeof value === \"string\") {\n const s = value.trim();\n const lower = s.toLowerCase();\n if (lower === \"true\") return true;\n if (lower === \"false\") return false;\n if (/^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(s)) {\n const num = Number(s);\n if (Number.isFinite(num)) return num;\n }\n\n // Fallback: try parsing JSON-like strings when no schema info\n if (\n (s.startsWith(\"{\") && s.endsWith(\"}\")) ||\n (s.startsWith(\"[\") && s.endsWith(\"]\"))\n ) {\n try {\n const parsed = JSON.parse(s);\n // Recursively apply coercion to the parsed value without schema\n return coerceBySchema(parsed, undefined);\n } catch {\n // If parsing fails, return original value\n }\n }\n }\n\n return value;\n }\n\n const schemaType = getSchemaType(unwrapped);\n\n if (typeof value === \"string\") {\n const s = value.trim();\n if (schemaType === \"object\") {\n try {\n // Better normalization for JSON strings with newlines and indentation\n let normalized = s.replace(/'/g, '\"');\n // Handle empty object cases\n normalized = normalized.replace(/^\\{\\s*\\}$/s, \"{}\");\n\n const obj = JSON.parse(normalized);\n if (obj && typeof obj === \"object\" && !Array.isArray(obj)) {\n const props = (unwrapped as Record<string, unknown>).properties as\n | Record<string, unknown>\n | undefined;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj as Record<string, unknown>)) {\n const propSchema = props ? (props[k] as unknown) : undefined;\n out[k] =\n typeof propSchema === \"boolean\"\n ? v\n : coerceBySchema(v, propSchema);\n }\n return out;\n }\n } catch {\n // fallthrough\n }\n }\n if (schemaType === \"array\") {\n try {\n const normalized = s.replace(/'/g, '\"');\n const arr = JSON.parse(normalized);\n if (Array.isArray(arr)) {\n const u = unwrapped as Record<string, unknown>;\n const prefixItems = Array.isArray(\n (u as Record<string, unknown>).prefixItems\n )\n ? ((u as Record<string, unknown>).prefixItems as unknown[])\n : undefined;\n const itemsSchema = u.items as unknown;\n if (prefixItems && arr.length === prefixItems.length) {\n return arr.map((v, i) => coerceBySchema(v, prefixItems[i]));\n }\n return arr.map(v => coerceBySchema(v, itemsSchema));\n }\n } catch {\n const csv = s.includes(\"\\n\") ? s.split(/\\n+/) : s.split(/,\\s*/);\n const trimmed = csv.map(x => x.trim()).filter(x => x.length > 0);\n const u = unwrapped as Record<string, unknown>;\n const prefixItems = Array.isArray(\n (u as Record<string, unknown>).prefixItems\n )\n ? ((u as Record<string, unknown>).prefixItems as unknown[])\n : undefined;\n const itemsSchema = u.items as unknown;\n if (prefixItems && trimmed.length === prefixItems.length) {\n return trimmed.map((x, i) => coerceBySchema(x, prefixItems[i]));\n }\n return trimmed.map(x => coerceBySchema(x, itemsSchema));\n }\n }\n }\n\n if (\n schemaType === \"object\" &&\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value)\n ) {\n const out: Record<string, unknown> = {};\n const props = (unwrapped as Record<string, unknown>).properties as\n | Record<string, unknown>\n | undefined;\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n const propSchema = props ? (props[k] as unknown) : undefined;\n out[k] =\n typeof propSchema === \"boolean\" ? v : coerceBySchema(v, propSchema);\n }\n return out;\n }\n\n if (schemaType === \"array\") {\n const u = unwrapped as Record<string, unknown>;\n const itemsSchema = u.items as unknown;\n const prefixItems = Array.isArray(\n (u as Record<string, unknown>).prefixItems\n )\n ? ((u as Record<string, unknown>).prefixItems as unknown[])\n : undefined;\n\n if (Array.isArray(value)) {\n if (prefixItems && value.length === prefixItems.length) {\n return value.map((v, i) => coerceBySchema(v, prefixItems[i]));\n }\n return value.map(v => coerceBySchema(v, itemsSchema));\n }\n\n if (value && typeof value === \"object\") {\n const maybe = value as Record<string, unknown>;\n if (Object.prototype.hasOwnProperty.call(maybe, \"item\")) {\n const items = (maybe as Record<string, unknown>).item as unknown;\n const arr = Array.isArray(items) ? items : [items];\n if (prefixItems && arr.length === prefixItems.length) {\n return arr.map((v, i) => coerceBySchema(v, prefixItems[i]));\n }\n return arr.map(v => coerceBySchema(v, itemsSchema));\n }\n\n // Special handling for objects with array-like field names that might represent arrays\n // This commonly happens when models output <multiples><number>3</number><number>5</number></multiples>\n // which gets parsed as { \"number\": [\"3\", \"5\"] }\n const keys = Object.keys(maybe);\n\n // Check for single field that contains an array (common XML pattern)\n if (keys.length === 1) {\n const singleKey = keys[0];\n const singleValue = maybe[singleKey];\n if (Array.isArray(singleValue)) {\n const coercedArray = singleValue.map(v =>\n coerceBySchema(v, itemsSchema)\n );\n return coercedArray;\n }\n }\n\n // Check for numeric keys (traditional tuple handling)\n if (keys.length > 0 && keys.every(k => /^\\d+$/.test(k))) {\n const arr = keys\n .sort((a, b) => Number(a) - Number(b))\n .map(k => (maybe as Record<string, unknown>)[k]);\n if (prefixItems && arr.length === prefixItems.length) {\n return arr.map((v, i) => coerceBySchema(v, prefixItems[i]));\n }\n return arr.map(v => coerceBySchema(v, itemsSchema));\n }\n }\n\n if (\n value == null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n if (prefixItems && prefixItems.length > 0) {\n return [coerceBySchema(value, prefixItems[0])];\n }\n return [coerceBySchema(value, itemsSchema)];\n }\n }\n\n if (typeof value === \"string\") {\n const s = value.trim();\n if (schemaType === \"boolean\") {\n const lower = s.toLowerCase();\n if (lower === \"true\") return true;\n if (lower === \"false\") return false;\n }\n if (schemaType === \"number\" || schemaType === \"integer\") {\n if (/^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(s)) {\n const num = Number(s);\n if (Number.isFinite(num)) return num;\n }\n }\n }\n\n return value;\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 type { RXMLNode } from \"../core/types\";\nimport { RXMLCoercionError } from \"../errors/types\";\nimport {\n coerceBySchema as baseCoerceBySchema,\n getSchemaType,\n unwrapJsonSchema,\n} from \"./base-coercion\";\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\") return undefined;\n const u = unwrapped as Record<string, unknown>;\n const props = u.properties as Record<string, unknown> | undefined;\n if (props && Object.prototype.hasOwnProperty.call(props, key)) {\n return (props as Record<string, unknown>)[key];\n }\n return undefined;\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 // Top-level text content - usually from DOCTYPE, comments, etc.\n continue;\n }\n\n const { tagName, children, attributes } = node;\n\n // Handle the node content\n let value: unknown;\n\n if (children.length === 0) {\n // Empty element\n value = \"\";\n } else if (children.length === 1 && typeof children[0] === \"string\") {\n // Simple text content\n value = children[0];\n } else {\n // Complex content - convert children to object/array\n value = processComplexContent(\n children,\n getPropertySchema(schema, tagName),\n textNodeName\n );\n }\n\n // Add attributes if present\n if (Object.keys(attributes).length > 0) {\n if (typeof value === \"string\") {\n // For string values with attributes, create an object with text content and prefixed attributes\n const result: Record<string, unknown> = { [textNodeName]: value };\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n result[`@_${attrName}`] = attrValue;\n }\n value = result;\n } else if (value && typeof value === \"object\" && !Array.isArray(value)) {\n // For object values, add attributes with @_ prefix\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n (value as Record<string, unknown>)[`@_${attrName}`] = attrValue;\n }\n }\n }\n\n // Handle multiple elements with same tag name\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 return result;\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 // Process the entire child node, not just its children\n let childValue: unknown;\n\n if (child.children.length === 0) {\n // Empty element\n childValue = \"\";\n } else if (\n child.children.length === 1 &&\n typeof child.children[0] === \"string\"\n ) {\n // Simple text content\n childValue = child.children[0];\n } else {\n // Complex content - convert children to object/array\n childValue = processComplexContent(\n child.children,\n getPropertySchema(schema, child.tagName),\n textNodeName\n );\n }\n\n // Add attributes if present\n if (Object.keys(child.attributes).length > 0) {\n if (typeof childValue === \"string\") {\n // For string values with attributes, create an object with text content and prefixed attributes\n const result: Record<string, unknown> = {\n [textNodeName]: childValue,\n };\n for (const [attrName, attrValue] of Object.entries(\n child.attributes\n )) {\n result[`@_${attrName}`] = attrValue;\n }\n childValue = result;\n } else if (\n childValue &&\n typeof childValue === \"object\" &&\n !Array.isArray(childValue)\n ) {\n // For object values, add attributes with @_ prefix\n for (const [attrName, attrValue] of Object.entries(\n child.attributes\n )) {\n (childValue as Record<string, unknown>)[`@_${attrName}`] =\n attrValue;\n }\n }\n }\n\n if (elements[child.tagName]) {\n if (!Array.isArray(elements[child.tagName])) {\n elements[child.tagName] = [elements[child.tagName]];\n }\n (elements[child.tagName] as unknown[]).push(childValue);\n } else {\n elements[child.tagName] = childValue;\n }\n }\n }\n\n // If we have both text and elements, create a mixed content object\n if (textContent.length > 0 && Object.keys(elements).length > 0) {\n return {\n [textNodeName]: textContent.join(\"\").trim(),\n ...elements,\n };\n }\n\n // If only text content\n if (textContent.length > 0 && Object.keys(elements).length === 0) {\n return textContent.join(\"\").trim();\n }\n\n // If only elements\n if (Object.keys(elements).length > 0) {\n return elements;\n }\n\n // Empty content\n return \"\";\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 * 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\") return;\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 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 } else if (type === \"array\") {\n const items = (u as Record<string, unknown>).items as unknown;\n if (items) visit(items);\n const prefix = (u as Record<string, unknown>).prefixItems as\n | unknown[]\n | undefined;\n if (Array.isArray(prefix)) prefix.forEach(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)) return value;\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\") return item.trim();\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\") return item.trim();\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 => 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) return [obj];\n\n const sortedKeys = keys.sort((a, b) => parseInt(a, 10) - parseInt(b, 10));\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 * 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 /** 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 * When true, 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\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\n/**\n * Check if a character is a valid XML name start character\n */\nexport function isNameStartChar(ch: string): boolean {\n return /[A-Za-z_:]/.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 /[A-Za-z0-9_.:-]/.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 i++;\n while (i < s.length) {\n const ch = s[i];\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === quote) return i + 1;\n i++;\n }\n return i;\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 while (NAME_SPACER.indexOf(s[pos]) === -1 && s[pos]) {\n pos++;\n }\n return { name: s.slice(start, pos), newPos: pos };\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) break;\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++) {\n if (s[i] === \"\\n\") {\n line++;\n column = 1;\n } else {\n column++;\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, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\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 '&gt;' in that context\n */\nexport function escapeXmlMinimalText(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/]]>/g, \"]]&gt;\");\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, \"&amp;\").replace(/</g, \"&lt;\");\n if (wrapper === '\"') {\n escaped = escaped.replace(/\"/g, \"&quot;\");\n } else {\n escaped = escaped.replace(/'/g, \"&apos;\");\n }\n return escaped;\n}\n\n/**\n * Unescape XML entities\n */\nexport function unescapeXml(text: string): string {\n return text\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/&amp;/g, \"&\");\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 * 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) return undefined;\n i = lt + 1;\n if (i >= len) return undefined;\n\n const ch = xmlContent[i];\n if (ch === \"!\") {\n // Handle DOCTYPE declarations specially - treat them as regular content\n // when they appear within tag content, not as XML declarations\n if (xmlContent.startsWith(\"!DOCTYPE\", i + 1)) {\n // For DOCTYPE within content, we need to find the closing >\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n continue;\n }\n if (xmlContent.startsWith(\"!--\", i + 1)) {\n const close = xmlContent.indexOf(\"-->\", i + 4);\n i = close === -1 ? len : close + 3;\n continue;\n }\n if (xmlContent.startsWith(\"![CDATA[\", i + 1)) {\n const close = xmlContent.indexOf(\"]]>\", i + 9);\n i = close === -1 ? len : close + 3;\n continue;\n }\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n continue;\n } else if (ch === \"?\") {\n const close = xmlContent.indexOf(\"?>\", i + 1);\n i = close === -1 ? len : close + 2;\n continue;\n } else if (ch === \"/\") {\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n depth = Math.max(0, depth - 1);\n continue;\n } else {\n let j = i;\n if (j < len && isNameStartChar(xmlContent[j])) {\n j++;\n while (j < len && isNameChar(xmlContent[j])) j++;\n }\n const name = xmlContent.slice(i, j);\n let k = j;\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 === \">\") break;\n if (c === \"/\" && xmlContent[k + 1] === \">\") {\n isSelfClosing = true;\n k++;\n break;\n }\n k++;\n }\n\n const tagEnd = k;\n if (name === target) {\n const contentStart =\n xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n\n if (isSelfClosing) {\n if (depth < bestDepth) {\n bestStart = contentStart;\n bestEnd = contentStart;\n bestDepth = depth;\n }\n } else {\n let pos = contentStart;\n let sameDepth = 1;\n\n while (pos < len) {\n const nextLt = xmlContent.indexOf(\"<\", pos);\n if (nextLt === -1) break;\n const nx = nextLt + 1;\n if (nx >= len) break;\n\n const h = xmlContent[nx];\n if (h === \"!\") {\n // Special handling for DOCTYPE and other declarations within content\n if (xmlContent.startsWith(\"!DOCTYPE\", nx + 1)) {\n const gt2 = xmlContent.indexOf(\">\", nx + 1);\n pos = gt2 === -1 ? len : gt2 + 1;\n continue;\n }\n if (xmlContent.startsWith(\"!--\", nx + 1)) {\n const close = xmlContent.indexOf(\"-->\", nx + 4);\n pos = close === -1 ? len : close + 3;\n continue;\n }\n if (xmlContent.startsWith(\"![CDATA[\", nx + 1)) {\n const close = xmlContent.indexOf(\"]]>\", nx + 9);\n pos = close === -1 ? len : close + 3;\n continue;\n }\n const gt2 = xmlContent.indexOf(\">\", nx + 1);\n pos = gt2 === -1 ? len : gt2 + 1;\n continue;\n } else if (h === \"?\") {\n const close = xmlContent.indexOf(\"?>\", nx + 1);\n pos = close === -1 ? len : close + 2;\n continue;\n } else if (h === \"/\") {\n let t = nx + 1;\n if (t < len && isNameStartChar(xmlContent[t])) {\n t++;\n while (t < len && isNameChar(xmlContent[t])) t++;\n }\n const endName = xmlContent.slice(nx + 1, t);\n const gt2 = xmlContent.indexOf(\">\", t);\n if (endName === target) {\n sameDepth--;\n if (sameDepth === 0) {\n if (depth < bestDepth) {\n bestStart = contentStart;\n bestEnd = nextLt;\n bestDepth = depth;\n }\n break;\n }\n }\n pos = gt2 === -1 ? len : gt2 + 1;\n continue;\n } else {\n let t = nx;\n if (t < len && isNameStartChar(xmlContent[t])) {\n t++;\n while (t < len && isNameChar(xmlContent[t])) t++;\n }\n let u = t;\n let isSelfClosingNested = false;\n while (u < len) {\n const cu = xmlContent[u];\n if (cu === '\"' || cu === \"'\") {\n u = skipQuoted(xmlContent, u);\n continue;\n }\n if (cu === \">\") break;\n if (cu === \"/\" && xmlContent[u + 1] === \">\") {\n isSelfClosingNested = true;\n u++;\n break;\n }\n u++;\n }\n const startName = xmlContent.slice(nx, t);\n if (startName === target && !isSelfClosingNested) {\n sameDepth++;\n }\n pos = xmlContent[u] === \">\" ? u + 1 : u + 1;\n continue;\n }\n }\n }\n }\n i = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n depth += isSelfClosing ? 0 : 1;\n continue;\n }\n }\n\n if (bestStart !== -1) {\n return xmlContent.slice(bestStart, bestEnd);\n }\n return undefined;\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) break;\n i = lt + 1;\n if (i >= len) break;\n\n const ch = xmlContent[i];\n if (ch === \"!\") {\n if (xmlContent.startsWith(\"!--\", i + 1)) {\n const close = xmlContent.indexOf(\"-->\", i + 4);\n i = close === -1 ? len : close + 3;\n continue;\n }\n if (xmlContent.startsWith(\"![CDATA[\", i + 1)) {\n const close = xmlContent.indexOf(\"]]>\", i + 9);\n i = close === -1 ? len : close + 3;\n continue;\n }\n // DOCTYPE or other declaration\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n continue;\n }\n if (ch === \"?\") {\n const close = xmlContent.indexOf(\"?>\", i + 1);\n i = close === -1 ? len : close + 2;\n continue;\n }\n if (ch === \"/\") {\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n continue;\n }\n\n // Opening tag\n let j = i;\n if (j < len && isNameStartChar(xmlContent[j])) {\n j++;\n while (j < len && isNameChar(xmlContent[j])) j++;\n }\n const name = xmlContent.slice(i, j);\n let k = j;\n let isSelfClosing = false;\n while (k < len) {\n const c = xmlContent[k];\n if (c === '\"' || c === \"'\") {\n k = skipQuoted(xmlContent, k);\n continue;\n }\n if (c === \">\") break;\n if (c === \"/\" && xmlContent[k + 1] === \">\") {\n isSelfClosing = true;\n k++;\n break;\n }\n k++;\n }\n const tagEnd = k;\n\n if (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 contentStart = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n if (isSelfClosing) {\n ranges.push({ start: contentStart, end: contentStart });\n i = contentStart; // continue after this position\n continue;\n }\n\n // Find matching close tag at same depth for this occurrence\n let pos = contentStart;\n let sameDepth = 1;\n while (pos < len) {\n const nextLt = xmlContent.indexOf(\"<\", pos);\n if (nextLt === -1) break;\n const nx = nextLt + 1;\n if (nx >= len) break;\n\n const h = xmlContent[nx];\n if (h === \"!\") {\n if (xmlContent.startsWith(\"!--\", nx + 1)) {\n const close = xmlContent.indexOf(\"-->\", nx + 4);\n pos = close === -1 ? len : close + 3;\n continue;\n }\n if (xmlContent.startsWith(\"![CDATA[\", nx + 1)) {\n const close = xmlContent.indexOf(\"]]>\", nx + 9);\n pos = close === -1 ? len : close + 3;\n continue;\n }\n const gt2 = xmlContent.indexOf(\">\", nx + 1);\n pos = gt2 === -1 ? len : gt2 + 1;\n continue;\n } else if (h === \"?\") {\n const close = xmlContent.indexOf(\"?>\", nx + 1);\n pos = close === -1 ? len : close + 2;\n continue;\n } else if (h === \"/\") {\n let t = nx + 1;\n if (t < len && isNameStartChar(xmlContent[t])) {\n t++;\n while (t < len && isNameChar(xmlContent[t])) t++;\n }\n const endName = xmlContent.slice(nx + 1, t);\n const gt2 = xmlContent.indexOf(\">\", t);\n if (endName === target) {\n sameDepth--;\n if (sameDepth === 0) {\n ranges.push({ start: contentStart, end: nextLt });\n // advance i to after this closing tag\n i = gt2 === -1 ? len : gt2 + 1;\n break;\n }\n }\n pos = gt2 === -1 ? len : gt2 + 1;\n continue;\n } else {\n let t = nx;\n if (t < len && isNameStartChar(xmlContent[t])) {\n t++;\n while (t < len && isNameChar(xmlContent[t])) t++;\n }\n let u = t;\n let isSelfClosingNested = false;\n while (u < len) {\n const cu = xmlContent[u];\n if (cu === '\"' || cu === \"'\") {\n u = skipQuoted(xmlContent, u);\n continue;\n }\n if (cu === \">\") break;\n if (cu === \"/\" && xmlContent[u + 1] === \">\") {\n isSelfClosingNested = true;\n u++;\n break;\n }\n u++;\n }\n const startName = xmlContent.slice(nx, t);\n if (startName === target && !isSelfClosingNested) {\n sameDepth++;\n }\n pos = xmlContent[u] === \">\" ? u + 1 : u + 1;\n continue;\n }\n }\n\n if (sameDepth !== 0) {\n // unmatched; stop scanning further to avoid infinite loops\n break;\n }\n }\n\n return ranges;\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) return undefined;\n i = lt + 1;\n if (i >= len) return undefined;\n\n const ch = xmlContent[i];\n if (ch === \"!\") {\n // Handle DOCTYPE declarations specially - treat them as regular content\n // when they appear within tag content, not as XML declarations\n if (xmlContent.startsWith(\"!DOCTYPE\", i + 1)) {\n // For DOCTYPE within content, we need to find the closing >\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n continue;\n }\n if (xmlContent.startsWith(\"!--\", i + 1)) {\n const close = xmlContent.indexOf(\"-->\", i + 4);\n i = close === -1 ? len : close + 3;\n continue;\n }\n if (xmlContent.startsWith(\"![CDATA[\", i + 1)) {\n const close = xmlContent.indexOf(\"]]>\", i + 9);\n i = close === -1 ? len : close + 3;\n continue;\n }\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n continue;\n } else if (ch === \"?\") {\n const close = xmlContent.indexOf(\"?>\", i + 1);\n i = close === -1 ? len : close + 2;\n continue;\n } else if (ch === \"/\") {\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n depth = Math.max(0, depth - 1);\n continue;\n } else {\n let j = i;\n if (j < len && isNameStartChar(xmlContent[j])) {\n j++;\n while (j < len && isNameChar(xmlContent[j])) j++;\n }\n const name = xmlContent.slice(i, j);\n let k = j;\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 === \">\") break;\n if (c === \"/\" && xmlContent[k + 1] === \">\") {\n isSelfClosing = true;\n k++;\n break;\n }\n k++;\n }\n\n const tagEnd = k;\n if (depth === 0 && name === target) {\n const contentStart =\n xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n if (isSelfClosing) return { start: contentStart, end: contentStart };\n\n let pos = contentStart;\n let sameDepth = 1;\n while (pos < len) {\n const nextLt = xmlContent.indexOf(\"<\", pos);\n if (nextLt === -1) break;\n const nx = nextLt + 1;\n if (nx >= len) break;\n\n const h = xmlContent[nx];\n if (h === \"!\") {\n // Special handling for DOCTYPE and other declarations within content\n if (xmlContent.startsWith(\"!DOCTYPE\", nx + 1)) {\n const gt2 = xmlContent.indexOf(\">\", nx + 1);\n pos = gt2 === -1 ? len : gt2 + 1;\n continue;\n }\n if (xmlContent.startsWith(\"!--\", nx + 1)) {\n const close = xmlContent.indexOf(\"-->\", nx + 4);\n pos = close === -1 ? len : close + 3;\n continue;\n }\n if (xmlContent.startsWith(\"![CDATA[\", nx + 1)) {\n const close = xmlContent.indexOf(\"]]>\", nx + 9);\n pos = close === -1 ? len : close + 3;\n continue;\n }\n const gt2 = xmlContent.indexOf(\">\", nx + 1);\n pos = gt2 === -1 ? len : gt2 + 1;\n continue;\n } else if (h === \"?\") {\n const close = xmlContent.indexOf(\"?>\", nx + 1);\n pos = close === -1 ? len : close + 2;\n continue;\n } else if (h === \"/\") {\n let t = nx + 1;\n if (t < len && isNameStartChar(xmlContent[t])) {\n t++;\n while (t < len && isNameChar(xmlContent[t])) t++;\n }\n const endName = xmlContent.slice(nx + 1, t);\n const gt2 = xmlContent.indexOf(\">\", t);\n if (endName === target) {\n sameDepth--;\n if (sameDepth === 0) {\n return { start: contentStart, end: nextLt };\n }\n }\n pos = gt2 === -1 ? len : gt2 + 1;\n continue;\n } else {\n let t = nx;\n if (t < len && isNameStartChar(xmlContent[t])) {\n t++;\n while (t < len && isNameChar(xmlContent[t])) t++;\n }\n const startName = xmlContent.slice(nx, t);\n let u = t;\n let isSelfClosingNested = false;\n while (u < len) {\n const cu = xmlContent[u];\n if (cu === '\"' || cu === \"'\") {\n u = skipQuoted(xmlContent, u);\n continue;\n }\n if (cu === \">\") break;\n if (cu === \"/\" && xmlContent[u + 1] === \">\") {\n isSelfClosingNested = true;\n u++;\n break;\n }\n u++;\n }\n // Track nested opening tags with the same name so we only end when\n // the matching top-level closing tag is reached\n if (startName === target && !isSelfClosingNested) {\n sameDepth++;\n }\n pos = xmlContent[u] === \">\" ? u + 1 : u + 1;\n continue;\n }\n }\n return undefined;\n }\n i = xmlContent[tagEnd] === \">\" ? tagEnd + 1 : tagEnd + 1;\n depth += isSelfClosing ? 0 : 1;\n continue;\n }\n }\n return undefined;\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: boolean = 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 const isExcluded = (pos: number): boolean => {\n if (!excludeRanges || excludeRanges.length === 0) return false;\n for (const r of excludeRanges) {\n if (pos >= r.start && pos < r.end) return true;\n }\n return false;\n };\n\n while (i < len) {\n const lt = xmlContent.indexOf(\"<\", i);\n if (lt === -1) break;\n i = lt + 1;\n if (i >= len) break;\n\n const ch = xmlContent[i];\n if (ch === \"!\") {\n if (xmlContent.startsWith(\"!--\", i + 1)) {\n const close = xmlContent.indexOf(\"-->\", i + 4);\n i = close === -1 ? len : close + 3;\n continue;\n }\n if (xmlContent.startsWith(\"![CDATA[\", i + 1)) {\n const close = xmlContent.indexOf(\"]]>\", i + 9);\n i = close === -1 ? len : close + 3;\n continue;\n }\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n continue;\n } else if (ch === \"?\") {\n const close = xmlContent.indexOf(\"?>\", i + 1);\n i = close === -1 ? len : close + 2;\n continue;\n } else if (ch === \"/\") {\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n continue;\n } else {\n let j = i;\n if (j < len && isNameStartChar(xmlContent[j])) {\n j++;\n while (j < len && isNameChar(xmlContent[j])) j++;\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 === \">\") break;\n if (c === \"/\" && xmlContent[k + 1] === \">\") {\n k++;\n break;\n }\n k++;\n }\n if (name === target && !isExcluded(lt)) {\n if (skipFirstLocal) {\n skipFirstLocal = false;\n } else {\n count++;\n }\n }\n i = k + 1;\n continue;\n }\n }\n\n return count;\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) break;\n i = lt + 1;\n if (i >= len) break;\n\n const ch = xmlContent[i];\n if (ch === \"!\") {\n // Handle DOCTYPE declarations specially - treat them as regular content\n // when they appear within tag content, not as XML declarations\n if (xmlContent.startsWith(\"!DOCTYPE\", i + 1)) {\n // For DOCTYPE within content, we need to find the closing >\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n continue;\n }\n if (xmlContent.startsWith(\"!--\", i + 1)) {\n const close = xmlContent.indexOf(\"-->\", i + 4);\n i = close === -1 ? len : close + 3;\n continue;\n }\n if (xmlContent.startsWith(\"![CDATA[\", i + 1)) {\n const close = xmlContent.indexOf(\"]]>\", i + 9);\n i = close === -1 ? len : close + 3;\n continue;\n }\n const gt = xmlContent.indexOf(\">\", i + 1);\n i = gt === -1 ? len : gt + 1;\n continue;\n } else if (ch === \"?\") {\n const close = xmlContent.indexOf(\"?>\", i + 1);\n i = close === -1 ? len : close + 2;\n continue;\n } else if (ch === \"/\") {\n // Closing tag\n i++;\n const { name, newPos } = parseName(xmlContent, i);\n if (name === target) depth--;\n i = xmlContent.indexOf(\">\", newPos);\n if (i === -1) break;\n i++;\n continue;\n }\n\n // Opening tag\n const { name, newPos } = parseName(xmlContent, i);\n i = newPos;\n\n // Skip attributes\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++;\n break;\n }\n k++;\n }\n\n if (name === target && depth === 0) {\n // Found a top-level occurrence\n const tagStart = lt;\n const isSelfClosing =\n xmlContent[k] === \"/\" || xmlContent.startsWith(\"/>\", k);\n\n if (isSelfClosing) {\n ranges.push({\n start: tagStart,\n end: k + (xmlContent[k] === \"/\" ? 2 : 1),\n });\n } else {\n // Find the closing tag\n depth++;\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) break;\n\n if (xmlContent[nextLt + 1] === \"/\") {\n const { name: closeName } = parseName(xmlContent, nextLt + 2);\n if (closeName === target) closeDepth--;\n } else if (\n xmlContent[nextLt + 1] !== \"!\" &&\n xmlContent[nextLt + 1] !== \"?\"\n ) {\n const { name: openName } = parseName(xmlContent, nextLt + 1);\n if (openName === target) closeDepth++;\n }\n\n j = xmlContent.indexOf(\">\", nextLt + 1);\n if (j === -1) break;\n j++;\n }\n\n if (closeDepth === 0) {\n ranges.push({ start: tagStart, end: j });\n }\n depth--;\n }\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) return \"\";\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 * Parse XML children recursively\n */\n public parseChildren(tagName?: string): (RXMLNode | string)[] {\n const children: (RXMLNode | string)[] = [];\n let consumedToEnd = false;\n\n while (this.xmlString[this.pos]) {\n if (this.xmlString.charCodeAt(this.pos) === CharCodes.OPEN_BRACKET) {\n if (this.xmlString.charCodeAt(this.pos + 1) === CharCodes.SLASH) {\n // Closing tag\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 // Mismatched closing tag - throw error with context\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) this.pos += 1;\n return children;\n } else if (\n this.xmlString.charCodeAt(this.pos + 1) === CharCodes.EXCLAMATION\n ) {\n // Comment, CDATA, or DOCTYPE\n const prevPos = this.pos;\n this.handleSpecialContent(children);\n // Check if handleSpecialContent consumed everything to the end\n if (\n this.pos >= this.xmlString.length &&\n prevPos < this.xmlString.length\n ) {\n consumedToEnd = true;\n }\n } else {\n // Regular element\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 } else {\n // Text content\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++;\n }\n }\n\n // Check for unclosed tags - if we've reached the end and still have a tagName, it's unclosed\n // But don't throw if special content (like unclosed CDATA) consumed everything to the end\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 return children;\n }\n\n /**\n * Parse a single XML node\n */\n public parseNode(): RXMLNode {\n this.pos++; // Skip opening <\n\n const { name: tagName, newPos } = parseName(this.xmlString, this.pos);\n this.pos = newPos;\n\n const attributes: Record<string, string | null> = {};\n let children: (RXMLNode | string)[] = [];\n\n // Parse attributes\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 // Skip whitespace\n if (\n c === CharCodes.SPACE ||\n c === CharCodes.TAB ||\n c === CharCodes.NEWLINE ||\n c === CharCodes.CARRIAGE_RETURN\n ) {\n this.pos++;\n continue;\n }\n\n if ((c > 64 && c < 91) || (c > 96 && c < 123)) {\n // Attribute name\n const { name: attrName, newPos: nameEnd } = parseName(\n this.xmlString,\n this.pos\n );\n this.pos = nameEnd;\n\n // Skip whitespace before =\n while (\n this.pos < this.xmlString.length &&\n (this.xmlString.charCodeAt(this.pos) === CharCodes.SPACE ||\n this.xmlString.charCodeAt(this.pos) === CharCodes.TAB ||\n this.xmlString.charCodeAt(this.pos) === CharCodes.NEWLINE ||\n this.xmlString.charCodeAt(this.pos) === CharCodes.CARRIAGE_RETURN)\n ) {\n this.pos++;\n }\n\n let value: string | null = null;\n if (\n this.pos < this.xmlString.length &&\n this.xmlString[this.pos] === \"=\"\n ) {\n this.pos++; // Skip =\n\n // Skip whitespace after =\n while (\n this.pos < this.xmlString.length &&\n (this.xmlString.charCodeAt(this.pos) === CharCodes.SPACE ||\n this.xmlString.charCodeAt(this.pos) === CharCodes.TAB ||\n this.xmlString.charCodeAt(this.pos) === CharCodes.NEWLINE ||\n this.xmlString.charCodeAt(this.pos) === CharCodes.CARRIAGE_RETURN)\n ) {\n this.pos++;\n }\n\n const code = this.xmlString.charCodeAt(this.pos);\n if (\n code === CharCodes.SINGLE_QUOTE ||\n code === CharCodes.DOUBLE_QUOTE\n ) {\n const { value: parsedValue, newPos: valueEnd } = parseString(\n this.xmlString,\n this.pos\n );\n value = parsedValue;\n this.pos = valueEnd;\n }\n }\n\n attributes[attrName] = value;\n } else {\n // Unknown character, skip it\n this.pos++;\n }\n }\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 if (!isSelfClosing) {\n if (tagName === \"script\") {\n // Special handling for script tags\n const start = this.pos + 1;\n this.pos = this.xmlString.indexOf(\"</script>\", this.pos);\n if (this.pos === -1) {\n // Unclosed script tag - extract content to end\n children = [this.xmlString.slice(start)];\n this.pos = this.xmlString.length;\n } else {\n children = [this.xmlString.slice(start, this.pos)];\n this.pos += 9;\n }\n } else if (tagName === \"style\") {\n // Special handling for style tags\n const start = this.pos + 1;\n this.pos = this.xmlString.indexOf(\"</style>\", this.pos);\n if (this.pos === -1) {\n // Unclosed style tag - extract content to end\n children = [this.xmlString.slice(start)];\n this.pos = this.xmlString.length;\n } else {\n children = [this.xmlString.slice(start, this.pos)];\n this.pos += 8;\n }\n } else if (this.options.noChildNodes?.indexOf(tagName) === -1) {\n // Parse children for non-self-closing tags\n this.pos++;\n children = this.parseChildren(tagName);\n } else {\n // Tag is in noChildNodes - handle based on whether it's a default HTML self-closing tag\n this.pos++;\n if ((DEFAULT_NO_CHILD_NODES as readonly string[]).includes(tagName)) {\n // HTML self-closing tags don't have closing tags\n // Position is already correct\n } else {\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 // If no closing tag found, leave position as is\n }\n }\n } else {\n this.pos++;\n }\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++;\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++;\n }\n\n children.push(this.xmlString.substring(startDoctype, this.pos));\n this.pos++;\n }\n\n /**\n * Get current position\n */\n public getPosition(): number {\n return this.pos;\n }\n\n /**\n * Set position\n */\n public 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 {\n RXMLCoercionError,\n RXMLDuplicateStringTagError,\n RXMLParseError,\n} from \"../errors/types\";\nimport { getSchemaType, unwrapJsonSchema } from \"../schema/base-coercion\";\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) return input;\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\") return unescapeXml(input);\n return input;\n}\n\n/**\n * Parse XML with schema-aware type coercion\n */\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) break;\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++;\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 && /\\s/.test(s[p])) p++;\n if (s[p] === \">\") fullEnd = p + 1;\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 (\n schemaProps &&\n !Object.prototype.hasOwnProperty.call(schemaProps, rootName)\n ) {\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 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\") set.add(k);\n }\n }\n }\n return set;\n };\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) continue;\n const range = findFirstTopLevelRange(actualXmlInner, other);\n if (range) excludeRanges.push(range);\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) ranges.push({ ...r, key });\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) rebuilt += actualXmlInner.slice(cursor, r.start);\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 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 = (val: unknown): unknown => {\n if (val == null) return val;\n if (typeof val === \"string\") {\n if (val.startsWith(\"__RXML_PLACEHOLDER_\")) {\n const orig = originalContentMap.get(val);\n return orig !== undefined ? orig : val;\n }\n return val;\n }\n if (Array.isArray(val)) return val.map(restorePlaceholdersDeep);\n if (typeof val === \"object\") {\n const obj = val as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n const restored = restorePlaceholdersDeep(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 return val;\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.prototype.hasOwnProperty.call(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 (\n v &&\n typeof v === \"object\" &&\n Object.prototype.hasOwnProperty.call(v, textNodeName)\n ) {\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.prototype.hasOwnProperty.call(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 } else {\n val = processArrayContent(v, propSchema, textNodeName);\n }\n } else if (\n v &&\n typeof v === \"object\" &&\n !Object.prototype.hasOwnProperty.call(v, textNodeName)\n ) {\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 const itemValue = obj.item;\n if (Array.isArray(itemValue)) {\n val = itemValue.map(item => {\n let currentVal: unknown = item;\n if (\n item &&\n typeof item === \"object\" &&\n Object.prototype.hasOwnProperty.call(item, textNodeName)\n ) {\n currentVal = (item as Record<string, unknown>)[textNodeName];\n }\n const trimmed =\n typeof currentVal === \"string\" ? currentVal.trim() : currentVal;\n\n // Auto-convert numeric strings\n if (\n typeof trimmed === \"string\" &&\n /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(trimmed)\n ) {\n const num = Number(trimmed);\n if (Number.isFinite(num)) return num;\n }\n return trimmed;\n });\n } else {\n const trimmed =\n typeof itemValue === \"string\" ? itemValue.trim() : itemValue;\n if (\n typeof trimmed === \"string\" &&\n /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/.test(trimmed)\n ) {\n const num = Number(trimmed);\n val = Number.isFinite(num) ? num : trimmed;\n } else {\n val = trimmed;\n }\n }\n } else {\n // Check for indexed tuple pattern (numeric keys)\n let isIndexedTuple = false;\n if (keys.length > 0 && keys.every(key => /^\\d+$/.test(key))) {\n const indices = keys.map(k => parseInt(k, 10)).sort((a, b) => a - b);\n isIndexedTuple =\n indices[0] === 0 && indices.every((val, idx) => val === 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.prototype.hasOwnProperty.call(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 (\n schemaProps &&\n !Object.prototype.hasOwnProperty.call(schemaProps, rootKey)\n ) {\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 (error instanceof RXMLParseError) {\n const isSimple = xmlString.split(\"<\").length < 6;\n\n // Re-throw errors for clearly invalid XML structures in simple cases\n // 1. Mismatched tags (like <item>content</wrong>)\n // 2. Unclosed tags at end of input (like <root><item>text)\n if (\n (error.message.includes(\"Unexpected close tag\") && isSimple) ||\n (error.message.includes(\"Unclosed tag\") && isSimple)\n ) {\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\n // For other types of malformed XML, try to be more tolerant and return partial results\n // This matches the expected behavior of being \"robust\" with malformed XML\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: (RXMLNode | string)[] = [];\n\n // Look for complete XML elements in the string\n const xmlPattern = /<([a-zA-Z_][\\w.-]*)[^>]*>.*?<\\/\\1>/gs;\n let match;\n\n while ((match = xmlPattern.exec(xmlString)) !== 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 // Skip this element if it can't be parsed\n continue;\n }\n }\n\n // If we found some valid elements, return them\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 * 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 children.forEach(child => {\n if (typeof child !== \"object\") {\n return;\n }\n\n if (!out[child.tagName]) {\n out[child.tagName] = [];\n }\n\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 (out[child.tagName] as unknown[]).push(nodeValue);\n });\n\n // Flatten single-item arrays\n for (const key in out) {\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 depth: number,\n path: string\n ) => boolean,\n depth = 0,\n path = \"\"\n): RXMLNode[] {\n const out: RXMLNode[] = [];\n\n children.forEach((child, 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 kids = filter(\n child.children,\n filterFn,\n depth + 1,\n (path ? path + \".\" : \"\") + i + \".\" + child.tagName\n );\n out.push(...kids);\n }\n });\n\n return out;\n}\n","/**\n * Streaming XML parser based on TXML's transformStream approach\n * Provides memory-efficient parsing for large XML documents\n */\n\nimport { Readable, Transform, type TransformCallback } from \"stream\";\n\nimport { RXMLStreamError } from \"../errors/types\";\nimport { XMLTokenizer } from \"./tokenizer\";\nimport type { ParseOptions, RXMLNode } from \"./types\";\n\n/**\n * Transform stream for parsing XML\n */\nexport class XMLTransformStream extends Transform {\n private buffer = \"\";\n private position: number;\n private readonly parseOptions: ParseOptions;\n private emittedCount = 0;\n private sawTagChar = false;\n\n constructor(offset?: number | string, parseOptions: ParseOptions = {}) {\n super({ readableObjectMode: true });\n\n if (typeof offset === \"string\") {\n this.position = offset.length;\n } else {\n this.position = offset || 0;\n }\n\n this.parseOptions = {\n keepComments: false,\n keepWhitespace: false,\n ...parseOptions,\n };\n }\n\n _transform(\n chunk: Buffer,\n encoding: BufferEncoding,\n callback: TransformCallback\n ): void {\n try {\n const incoming = chunk.toString();\n if (incoming.includes(\"<\")) this.sawTagChar = true;\n this.buffer += incoming;\n this.processBuffer();\n callback();\n } catch (error) {\n callback(new RXMLStreamError(\"Transform error\", error));\n }\n }\n\n _flush(callback: TransformCallback): void {\n try {\n // Process any remaining buffer content\n if (this.buffer.length > 0) {\n this.processBuffer(true);\n }\n // If we saw XML-like input but emitted nothing, surface a meaningful error\n if (this.sawTagChar && this.emittedCount === 0) {\n throw new RXMLStreamError(\n \"Flush error\",\n new Error(\"No XML elements could be parsed from stream\")\n );\n }\n callback();\n } catch (error) {\n callback(new RXMLStreamError(\"Flush error\", error));\n }\n }\n\n private processBuffer(isFlush = false): void {\n // Try to find and emit complete XML elements in the buffer\n while (this.buffer.length > 0) {\n // Find first '<'\n const openBracket = this.buffer.indexOf(\"<\");\n if (openBracket === -1) {\n // No tags at all\n if (isFlush) this.buffer = \"\";\n break;\n }\n\n // Trim leading non-XML text\n if (openBracket > 0) {\n this.buffer = this.buffer.slice(openBracket);\n }\n\n // Skip processing instructions, comments, CDATA\n if (\n this.buffer.startsWith(\"<?\") ||\n this.buffer.startsWith(\"<!--\") ||\n this.buffer.startsWith(\"<![CDATA[\")\n ) {\n const endMarkers: Record<string, string> = {\n \"<?\": \"?>\",\n \"<!--\": \"-->\",\n \"<![CDATA[\": \"]]>\",\n };\n let endMarker = \"\";\n for (const [start, end] of Object.entries(endMarkers)) {\n if (this.buffer.startsWith(start)) {\n endMarker = end;\n break;\n }\n }\n const endPos = endMarker ? this.buffer.indexOf(endMarker) : -1;\n if (endPos === -1) {\n if (!isFlush) break;\n // On flush, drop the incomplete special node\n this.buffer = \"\";\n break;\n }\n // Keep comment text as string node when requested\n if (this.parseOptions.keepComments && this.buffer.startsWith(\"<!--\")) {\n this.push(this.buffer.slice(0, endPos + endMarker.length));\n }\n this.buffer = this.buffer.slice(endPos + endMarker.length);\n continue;\n }\n\n // Skip stray closing tags\n if (this.buffer.startsWith(\"</\")) {\n const closeEnd = this.buffer.indexOf(\">\");\n if (closeEnd === -1) {\n if (!isFlush) break;\n this.buffer = \"\";\n break;\n }\n this.buffer = this.buffer.slice(closeEnd + 1);\n continue;\n }\n\n // Identify opening tag end and tag name (only proceed when we have the closing '>')\n const openTagEnd = this.buffer.indexOf(\">\");\n if (openTagEnd === -1) {\n if (!isFlush) break;\n // Incomplete open tag at flush; drop it\n this.buffer = \"\";\n break;\n }\n const openTagContent = this.buffer.slice(1, openTagEnd);\n const nameMatch = openTagContent.match(/^([a-zA-Z_][\\w.-]*)/);\n if (!nameMatch) {\n // Not a valid tag start, drop one char and continue\n this.buffer = this.buffer.slice(1);\n continue;\n }\n const tagName = nameMatch[1];\n\n // Handle self-closing immediately\n const isSelfClosing = this.buffer[openTagEnd - 1] === \"/\";\n if (isSelfClosing) {\n const elementEnd = openTagEnd + 1;\n const elementXml = this.buffer.slice(0, elementEnd);\n try {\n const tokenizer = new XMLTokenizer(elementXml, this.parseOptions);\n const node = tokenizer.parseNode();\n this.emitElementAndChildren(node);\n this.buffer = this.buffer.slice(elementEnd);\n continue;\n } catch {\n // Skip this malformed self-closing element\n this.buffer = this.buffer.slice(1);\n continue;\n }\n }\n\n // Find matching closing tag with depth handling\n let depth = 1;\n let searchStart = openTagEnd + 1;\n let elementEnd = -1;\n while (searchStart < this.buffer.length) {\n // Ensure the next opening match is an actual tag name boundary\n let nextOpen = this.buffer.indexOf(`<${tagName}`, searchStart);\n while (nextOpen !== -1) {\n const after = this.buffer[nextOpen + tagName.length + 1];\n if (after === undefined || after === \">\" || /\\s/.test(after)) break;\n nextOpen = this.buffer.indexOf(`<${tagName}`, nextOpen + 1);\n }\n\n // Find the next closing tag start (position of '<')\n const nextCloseStart = this.buffer.indexOf(`</${tagName}`, searchStart);\n if (nextCloseStart === -1) break;\n\n if (nextOpen !== -1 && nextOpen < nextCloseStart) {\n depth++;\n searchStart = nextOpen + 1;\n } else {\n depth--;\n // Advance past the actual closing tag allowing optional whitespace before '>'\n let p = nextCloseStart + 2 + tagName.length; // after </tagName\n while (p < this.buffer.length && /\\s/.test(this.buffer[p])) p++;\n if (this.buffer[p] !== \">\") break; // malformed/incomplete closing tag\n const closeAdvance = p + 1;\n searchStart = closeAdvance;\n if (depth === 0) {\n elementEnd = searchStart;\n break;\n }\n }\n }\n\n if (elementEnd === -1) {\n if (!isFlush) break;\n // At flush with incomplete element; drop leading '<' to prevent infinite loop\n this.buffer = this.buffer.slice(1);\n continue;\n }\n\n // We have a complete element; parse and emit\n const elementXml = this.buffer.slice(0, elementEnd);\n try {\n const tokenizer = new XMLTokenizer(elementXml, this.parseOptions);\n const node = tokenizer.parseNode();\n this.emitElementAndChildren(node);\n this.buffer = this.buffer.slice(elementEnd);\n } catch (e) {\n // Malformed complete element; surface as stream error\n this.emit(\"error\", new RXMLStreamError(\"Parse error\", e as Error));\n return;\n }\n }\n }\n\n /**\n * Emit an element and recursively emit its children as separate events\n */\n private emitElementAndChildren(node: RXMLNode | string): void {\n if (typeof node === \"string\") {\n // Emit comment nodes if requested\n if (this.parseOptions.keepComments && node.includes(\"<!--\")) {\n this.push(node);\n this.emittedCount++;\n }\n return;\n }\n\n // Emit the element itself\n this.push(node);\n this.emittedCount++;\n\n // Recursively emit children\n for (const child of node.children) {\n this.emitElementAndChildren(child);\n }\n }\n}\n\n/**\n * Create a transform stream for parsing XML\n */\nexport function createXMLStream(\n offset?: number | string,\n parseOptions?: ParseOptions\n): XMLTransformStream {\n return new XMLTransformStream(offset, parseOptions);\n}\n\n/**\n * Parse XML from a readable stream\n */\nexport async function parseFromStream(\n stream: Readable,\n offset?: number | string,\n parseOptions?: ParseOptions\n): Promise<(RXMLNode | string)[]> {\n return new Promise((resolve, reject) => {\n const results: (RXMLNode | string)[] = [];\n const transformStream = createXMLStream(offset, parseOptions);\n\n // Propagate source stream errors\n const onSourceError = (err: Error) => {\n transformStream.destroy(err);\n };\n stream.on(\"error\", onSourceError);\n\n transformStream.on(\"data\", (element: RXMLNode | string) => {\n results.push(element);\n });\n\n transformStream.on(\"end\", () => {\n stream.off(\"error\", onSourceError);\n resolve(results);\n });\n\n transformStream.on(\"error\", (error: Error) => {\n stream.off(\"error\", onSourceError);\n reject(new RXMLStreamError(\"Stream parsing failed\", error));\n });\n\n stream.pipe(transformStream);\n });\n}\n\n/**\n * Process XML stream with async iterator support\n */\nexport async function* processXMLStream(\n stream: Readable,\n offset?: number | string,\n parseOptions?: ParseOptions\n): AsyncGenerator<RXMLNode | string, void, unknown> {\n const transformStream = createXMLStream(offset, parseOptions);\n\n let ended = false;\n let error: Error | null = null;\n const queue: (RXMLNode | string)[] = [];\n let resolveNext: ((value: IteratorResult<RXMLNode | string>) => void) | null =\n null;\n\n // Ensure source stream errors are propagated and terminate iteration\n const onSourceError = (err: Error) => {\n error = err;\n transformStream.destroy(err);\n };\n stream.on(\"error\", onSourceError);\n\n transformStream.on(\"data\", (element: RXMLNode | string) => {\n if (resolveNext) {\n resolveNext({ value: element, done: false });\n resolveNext = null;\n } else {\n queue.push(element);\n }\n });\n\n transformStream.on(\"end\", () => {\n ended = true;\n if (resolveNext) {\n resolveNext({ value: undefined, done: true });\n resolveNext = null;\n }\n stream.off(\"error\", onSourceError);\n });\n\n transformStream.on(\"error\", (err: Error) => {\n error = err;\n if (resolveNext) {\n resolveNext({ value: undefined, done: true });\n resolveNext = null;\n }\n stream.off(\"error\", onSourceError);\n });\n\n stream.pipe(transformStream);\n\n while (true) {\n if (error) {\n throw new RXMLStreamError(\"Stream processing error\", error);\n }\n\n if (queue.length > 0) {\n yield queue.shift()!;\n continue;\n }\n\n if (ended) {\n break;\n }\n\n // Wait for next element\n const result = await new Promise<IteratorResult<RXMLNode | string>>(\n resolve => {\n resolveNext = resolve;\n }\n );\n\n if (result.done) {\n if (error) {\n throw new RXMLStreamError(\"Stream processing error\", error);\n }\n break;\n }\n\n yield result.value;\n }\n}\n\n/**\n * Find elements by ID in streaming fashion\n */\nexport async function* findElementByIdStream(\n stream: Readable,\n id: string,\n offset?: number | string,\n parseOptions?: ParseOptions\n): AsyncGenerator<RXMLNode, void, unknown> {\n for await (const element of processXMLStream(stream, offset, parseOptions)) {\n if (typeof element === \"object\" && element.attributes.id === id) {\n yield element;\n }\n }\n}\n\n/**\n * Find elements by class name in streaming fashion\n */\nexport async function* findElementsByClassStream(\n stream: Readable,\n className: string,\n offset?: number | string,\n parseOptions?: ParseOptions\n): AsyncGenerator<RXMLNode, void, unknown> {\n const classRegex = new RegExp(`\\\\b${className}\\\\b`);\n\n for await (const element of processXMLStream(stream, offset, parseOptions)) {\n if (\n typeof element === \"object\" &&\n element.attributes.class &&\n classRegex.test(element.attributes.class)\n ) {\n yield element;\n }\n }\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 minimalEscaping = options.minimalEscaping ?? false;\n const suppressEmptyNode = options.suppressEmptyNode ?? false;\n const strictBooleanAttributes = options.strictBooleanAttributes ?? false;\n\n let result = \"\";\n\n if (format) {\n result += '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n }\n\n result += stringifyValue(\n rootTag,\n obj,\n 0,\n format,\n suppressEmptyNode,\n minimalEscaping,\n strictBooleanAttributes\n );\n\n return result;\n } catch (error) {\n throw new RXMLStringifyError(\"Failed to stringify XML\", error);\n }\n}\n\n/**\n * Stringify a value to XML format\n */\nfunction stringifyValue(\n tagName: string,\n value: unknown,\n depth: number,\n format: boolean,\n suppressEmptyNode: boolean,\n minimalEscaping: boolean,\n strictBooleanAttributes: boolean\n): string {\n const indent = format ? \" \".repeat(depth) : \"\";\n const newline = format ? \"\\n\" : \"\";\n\n if (value === null || value === undefined) {\n if (suppressEmptyNode) return \"\";\n return `${indent}<${tagName}/>${newline}`;\n }\n\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n const content = minimalEscaping\n ? escapeXmlMinimalText(String(value))\n : escapeXml(String(value));\n if (content === \"\" && suppressEmptyNode) return \"\";\n return `${indent}<${tagName}>${content}</${tagName}>${newline}`;\n }\n\n if (Array.isArray(value)) {\n let result = \"\";\n for (const item of value) {\n result += stringifyValue(\n tagName,\n item,\n depth,\n format,\n suppressEmptyNode,\n minimalEscaping,\n strictBooleanAttributes\n );\n }\n return result;\n }\n\n if (typeof value === \"object\") {\n return stringifyObject(\n tagName,\n value as Record<string, unknown>,\n depth,\n format,\n suppressEmptyNode,\n minimalEscaping,\n strictBooleanAttributes\n );\n }\n\n // Fallback for other types\n const content = minimalEscaping\n ? escapeXmlMinimalText(String(value))\n : escapeXml(String(value));\n if (content === \"\" && suppressEmptyNode) return \"\";\n return `${indent}<${tagName}>${content}</${tagName}>${newline}`;\n}\n\n/**\n * Stringify an object to XML\n */\nfunction stringifyObject(\n tagName: string,\n obj: Record<string, unknown>,\n depth: number,\n format: boolean,\n suppressEmptyNode: boolean,\n minimalEscaping: boolean,\n strictBooleanAttributes: boolean\n): string {\n const indent = format ? \" \".repeat(depth) : \"\";\n const newline = format ? \"\\n\" : \"\";\n const childIndent = format ? \" \".repeat(depth + 1) : \"\";\n\n // Extract attributes (properties starting with @)\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 // Build opening tag with attributes\n let openTag = `<${tagName}`;\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n if (attrValue === null) {\n if (strictBooleanAttributes) {\n openTag += ` ${attrName}=\"${attrName}\"`;\n } else {\n openTag += ` ${attrName}`;\n }\n } else {\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 openTag += ` ${attrName}=\"${escaped}\"`;\n } else {\n const escaped = minimalEscaping\n ? escapeXmlMinimalAttr(valueStr, \"'\")\n : escapeXml(valueStr);\n openTag += ` ${attrName}='${escaped}'`;\n }\n }\n }\n\n // Check if we have any content\n const hasElements = Object.keys(elements).length > 0;\n const hasTextContent = textContent !== undefined && textContent !== \"\";\n\n if (!hasElements && !hasTextContent) {\n if (suppressEmptyNode) return \"\";\n return `${indent}${openTag}/>${newline}`;\n }\n\n openTag += \">\";\n\n // Handle text-only content\n if (!hasElements && hasTextContent && textContent) {\n // 2.4 Character Data and Markup: '<' and '&' MUST be escaped in content.\n // Minimal vs conservative controlled by option.\n const content = minimalEscaping\n ? escapeXmlMinimalText(textContent)\n : escapeXml(textContent);\n return `${indent}${openTag}${content}</${tagName}>${newline}`;\n }\n\n // Handle complex content\n let result = `${indent}${openTag}`;\n\n if (hasTextContent && textContent) {\n // See spec notes above (2.4, 4.6) for escaping rationale.\n const content = minimalEscaping\n ? escapeXmlMinimalText(textContent)\n : escapeXml(textContent);\n if (format) result += `${newline}${childIndent}${content}`;\n else result += content;\n }\n\n if (hasElements) {\n if (format) result += newline;\n\n for (const [elementName, elementValue] of Object.entries(elements)) {\n result += stringifyValue(\n elementName,\n elementValue,\n depth + 1,\n format,\n suppressEmptyNode,\n minimalEscaping,\n strictBooleanAttributes\n );\n }\n\n if (format) result += indent;\n }\n\n result += `</${tagName}>${newline}`;\n\n return result;\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\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 let result = `${indent}<${node.tagName}`;\n\n // Add attributes\n for (const [attrName, attrValue] of Object.entries(node.attributes)) {\n if (attrValue === null) {\n if (strictBooleanAttributes) {\n result += ` ${attrName}=\"${attrName}\"`;\n } else {\n result += ` ${attrName}`;\n }\n } else if (attrValue.indexOf('\"') === -1) {\n const escaped = minimalEscaping\n ? escapeXmlMinimalAttr(attrValue, '\"')\n : escapeXml(attrValue);\n result += ` ${attrName}=\"${escaped}\"`;\n } else {\n const escaped = minimalEscaping\n ? escapeXmlMinimalAttr(attrValue, \"'\")\n : escapeXml(attrValue);\n result += ` ${attrName}='${escaped}'`;\n }\n }\n\n // Handle processing instructions\n if (node.tagName[0] === \"?\") {\n result += \"?>\";\n return result + newline;\n }\n\n // Handle self-closing tags\n if (node.children.length === 0) {\n result += \"/>\";\n return result + newline;\n }\n\n result += \">\";\n\n // Handle children\n let hasElementChildren = false;\n for (const child of node.children) {\n if (typeof child === \"string\") {\n result += minimalEscaping\n ? escapeXmlMinimalText(child)\n : escapeXml(child);\n } else {\n if (!hasElementChildren && format) {\n result += newline;\n hasElementChildren = true;\n }\n result += stringifyNode(child, depth + 1, format, options);\n }\n }\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"],"mappings":"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","names":["result","gt","gt2","name","newPos","end","keys","k","val","elementEnd","elementXml","content"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors/types.ts","../src/core/types.ts","../src/utils/helpers.ts","../src/builders/stringify.ts","../src/schema/base-coercion.ts","../src/schema/coercion.ts","../src/schema/extraction.ts","../src/core/tokenizer.ts","../src/core/parser.ts","../src/core/stream.ts"],"sourcesContent":["// biome-ignore lint/performance/noBarrelFile: Package entrypoint - must re-export for public API\nexport {\n stringify,\n stringifyNode,\n stringifyNodes,\n toContentString,\n} from \"./builders/stringify\";\nexport {\n filter,\n parse,\n parseNode,\n parseWithoutSchema,\n simplify,\n} from \"./core/parser\";\nexport {\n createXMLStream,\n findElementByIdStream,\n findElementsByClassStream,\n parseFromStream,\n processXMLStream,\n XMLTransformStream,\n} from \"./core/stream\";\nexport { XMLTokenizer } from \"./core/tokenizer\";\n// Types\nexport type { ParseOptions, RXMLNode, StringifyOptions } from \"./core/types\";\n// Errors\nexport {\n RXMLCoercionError,\n RXMLDuplicateStringTagError,\n RXMLParseError,\n RXMLStreamError,\n RXMLStringifyError,\n} from \"./errors/types\";\n// Schema integration\nexport {\n coerceBySchema,\n getSchemaType,\n unwrapJsonSchema,\n} from \"./schema/base-coercion\";\nexport {\n coerceDomBySchema,\n domToObject,\n getPropertySchema,\n getStringTypedProperties,\n processArrayContent,\n processIndexedTuple,\n} from \"./schema/coercion\";\nexport {\n countTagOccurrences,\n extractRawInner,\n findAllTopLevelRanges,\n findFirstTopLevelRange,\n} from \"./schema/extraction\";\n// Utils\nexport { unescapeXml } from \"./utils/helpers\";\n\n// Compatibility\nexport interface Options {\n textNodeName?: string;\n throwOnDuplicateStringTags?: boolean;\n onError?: (message: string, context?: Record<string, unknown>) => void;\n}\n","/**\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 /** 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 * When true, 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\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, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\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 '&gt;' in that context\n */\nexport function escapeXmlMinimalText(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/]]>/g, \"]]&gt;\");\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, \"&amp;\").replace(/</g, \"&lt;\");\n if (wrapper === '\"') {\n escaped = escaped.replace(/\"/g, \"&quot;\");\n } else {\n escaped = escaped.replace(/'/g, \"&apos;\");\n }\n return escaped;\n}\n\n/**\n * Unescape XML entities\n */\nexport function unescapeXml(text: string): string {\n return text\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/&amp;/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 minimalEscaping = options.minimalEscaping ?? false;\n const suppressEmptyNode = options.suppressEmptyNode ?? false;\n const strictBooleanAttributes = options.strictBooleanAttributes ?? false;\n\n let result = \"\";\n\n if (format) {\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 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","// Regex constants for performance\nconst NUMERIC_REGEX = /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/;\nconst EMPTY_OBJECT_REGEX = /^\\{\\s*\\}$/s;\nconst NEWLINE_SPLIT_REGEX = /\\n+/;\nconst COMMA_SPLIT_REGEX = /,\\s*/;\nconst DIGIT_KEY_REGEX = /^\\d+$/;\n\nexport function unwrapJsonSchema(schema: unknown): unknown {\n if (!schema || typeof schema !== \"object\") {\n return schema;\n }\n const s = schema as Record<string, unknown>;\n if (s.jsonSchema && typeof s.jsonSchema === \"object\") {\n return unwrapJsonSchema(s.jsonSchema);\n }\n return schema;\n}\n\nexport function getSchemaType(schema: unknown): string | undefined {\n const unwrapped = unwrapJsonSchema(schema);\n if (!unwrapped || typeof unwrapped !== \"object\") {\n return;\n }\n const t: unknown = (unwrapped as Record<string, unknown>).type;\n if (typeof t === \"string\") {\n return t;\n }\n if (Array.isArray(t)) {\n const preferred = [\n \"object\",\n \"array\",\n \"boolean\",\n \"number\",\n \"integer\",\n \"string\",\n ];\n for (const p of preferred) {\n if (t.includes(p)) {\n return p;\n }\n }\n }\n const s = unwrapped as Record<string, unknown>;\n if (s && typeof s === \"object\" && (s.properties || s.additionalProperties)) {\n return \"object\";\n }\n if (\n s &&\n typeof s === \"object\" &&\n (s.items || (s as Record<string, unknown>).prefixItems)\n ) {\n return \"array\";\n }\n return;\n}\n\n/**\n * Coerce string value without schema information\n */\nfunction coerceStringWithoutSchema(value: string): unknown {\n const s = value.trim();\n const lower = s.toLowerCase();\n if (lower === \"true\") {\n return true;\n }\n if (lower === \"false\") {\n return false;\n }\n if (NUMERIC_REGEX.test(s)) {\n const num = Number(s);\n if (Number.isFinite(num)) {\n return num;\n }\n }\n\n // Fallback: try parsing JSON-like strings when no schema info\n if (\n (s.startsWith(\"{\") && s.endsWith(\"}\")) ||\n (s.startsWith(\"[\") && s.endsWith(\"]\"))\n ) {\n try {\n const parsed = JSON.parse(s);\n return coerceBySchema(parsed, undefined);\n } catch {\n // If parsing fails, return original value\n }\n }\n return value;\n}\n\n/**\n * Coerce string to object using schema\n */\nfunction coerceStringToObject(\n s: string,\n unwrapped: Record<string, unknown>\n): unknown {\n try {\n let normalized = s.replace(/'/g, '\"');\n normalized = normalized.replace(EMPTY_OBJECT_REGEX, \"{}\");\n\n const obj = JSON.parse(normalized);\n if (obj && typeof obj === \"object\" && !Array.isArray(obj)) {\n const props = unwrapped.properties as Record<string, unknown> | undefined;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj as Record<string, unknown>)) {\n const propSchema = props ? (props[k] as unknown) : undefined;\n out[k] =\n typeof propSchema === \"boolean\" ? v : coerceBySchema(v, propSchema);\n }\n return out;\n }\n } catch {\n // fallthrough\n }\n return null;\n}\n\n/**\n * Coerce string to array using schema\n */\nfunction coerceStringToArray(\n s: string,\n unwrapped: Record<string, unknown>\n): unknown {\n const prefixItems = Array.isArray(unwrapped.prefixItems)\n ? (unwrapped.prefixItems as unknown[])\n : undefined;\n const itemsSchema = unwrapped.items as unknown;\n\n try {\n const normalized = s.replace(/'/g, '\"');\n const arr = JSON.parse(normalized);\n if (Array.isArray(arr)) {\n if (prefixItems && arr.length === prefixItems.length) {\n return arr.map((v, i) => coerceBySchema(v, prefixItems[i]));\n }\n return arr.map((v) => coerceBySchema(v, itemsSchema));\n }\n } catch {\n const csv = s.includes(\"\\n\")\n ? s.split(NEWLINE_SPLIT_REGEX)\n : s.split(COMMA_SPLIT_REGEX);\n const trimmed = csv.map((x) => x.trim()).filter((x) => x.length > 0);\n if (prefixItems && trimmed.length === prefixItems.length) {\n return trimmed.map((x, i) => coerceBySchema(x, prefixItems[i]));\n }\n return trimmed.map((x) => coerceBySchema(x, itemsSchema));\n }\n return null;\n}\n\n/**\n * Coerce object to object using schema\n */\nfunction coerceObjectToObject(\n value: Record<string, unknown>,\n unwrapped: Record<string, unknown>\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const props = unwrapped.properties as Record<string, unknown> | undefined;\n for (const [k, v] of Object.entries(value)) {\n const propSchema = props ? (props[k] as unknown) : undefined;\n out[k] =\n typeof propSchema === \"boolean\" ? v : coerceBySchema(v, propSchema);\n }\n return out;\n}\n\n/**\n * Coerce array to array using schema\n */\nfunction coerceArrayToArray(\n value: unknown[],\n prefixItems: unknown[] | undefined,\n itemsSchema: unknown\n): unknown[] {\n if (prefixItems && value.length === prefixItems.length) {\n return value.map((v, i) => coerceBySchema(v, prefixItems[i]));\n }\n return value.map((v) => coerceBySchema(v, itemsSchema));\n}\n\n/**\n * Coerce object to array using schema\n */\nfunction coerceObjectToArray(\n maybe: Record<string, unknown>,\n prefixItems: unknown[] | undefined,\n itemsSchema: unknown\n): unknown {\n if (Object.hasOwn(maybe, \"item\")) {\n const items = maybe.item as unknown;\n const arr = Array.isArray(items) ? items : [items];\n return coerceArrayToArray(arr, prefixItems, itemsSchema);\n }\n\n const keys = Object.keys(maybe);\n\n // Check for single field that contains an array (common XML pattern)\n if (keys.length === 1) {\n const singleValue = maybe[keys[0]];\n if (Array.isArray(singleValue)) {\n return singleValue.map((v) => coerceBySchema(v, itemsSchema));\n }\n }\n\n // Check for numeric keys (traditional tuple handling)\n if (keys.length > 0 && keys.every((k) => DIGIT_KEY_REGEX.test(k))) {\n const arr = keys.sort((a, b) => Number(a) - Number(b)).map((k) => maybe[k]);\n return coerceArrayToArray(arr, prefixItems, itemsSchema);\n }\n\n return null;\n}\n\n/**\n * Coerce primitive to array using schema\n */\nfunction coercePrimitiveToArray(\n value: unknown,\n prefixItems: unknown[] | undefined,\n itemsSchema: unknown\n): unknown[] {\n if (prefixItems && prefixItems.length > 0) {\n return [coerceBySchema(value, prefixItems[0])];\n }\n return [coerceBySchema(value, itemsSchema)];\n}\n\n/**\n * Coerce string to primitive type using schema\n */\nfunction coerceStringToPrimitive(\n s: string,\n schemaType: string | undefined\n): unknown {\n if (schemaType === \"boolean\") {\n const lower = s.toLowerCase();\n if (lower === \"true\") {\n return true;\n }\n if (lower === \"false\") {\n return false;\n }\n }\n if (\n (schemaType === \"number\" || schemaType === \"integer\") &&\n NUMERIC_REGEX.test(s)\n ) {\n const num = Number(s);\n if (Number.isFinite(num)) {\n return num;\n }\n }\n return null;\n}\n\nfunction coerceStringValue(\n value: string,\n schemaType: string | undefined,\n u: Record<string, unknown>\n): unknown {\n const s = value.trim();\n\n if (schemaType === \"object\") {\n const result = coerceStringToObject(s, u);\n if (result !== null) {\n return result;\n }\n }\n\n if (schemaType === \"array\") {\n const result = coerceStringToArray(s, u);\n if (result !== null) {\n return result;\n }\n }\n\n const primitiveResult = coerceStringToPrimitive(s, schemaType);\n if (primitiveResult !== null) {\n return primitiveResult;\n }\n\n return value;\n}\n\nfunction coerceArrayValue(\n value: unknown,\n prefixItems: unknown[] | undefined,\n itemsSchema: unknown\n): unknown {\n if (Array.isArray(value)) {\n return coerceArrayToArray(value, prefixItems, itemsSchema);\n }\n\n if (value && typeof value === \"object\") {\n const result = coerceObjectToArray(\n value as Record<string, unknown>,\n prefixItems,\n itemsSchema\n );\n if (result !== null) {\n return result;\n }\n }\n\n if (\n value == null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return coercePrimitiveToArray(value, prefixItems, itemsSchema);\n }\n\n return value;\n}\n\nexport function coerceBySchema(value: unknown, schema?: unknown): unknown {\n const unwrapped = unwrapJsonSchema(schema);\n if (!unwrapped || typeof unwrapped !== \"object\") {\n if (typeof value === \"string\") {\n return coerceStringWithoutSchema(value);\n }\n return value;\n }\n\n const schemaType = getSchemaType(unwrapped);\n const u = unwrapped as Record<string, unknown>;\n\n // Handle string values\n if (typeof value === \"string\") {\n return coerceStringValue(value, schemaType, u);\n }\n\n // Handle object to object coercion\n if (\n schemaType === \"object\" &&\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value)\n ) {\n return coerceObjectToObject(value as Record<string, unknown>, u);\n }\n\n // Handle array coercion\n if (schemaType === \"array\") {\n const prefixItems = Array.isArray(u.prefixItems)\n ? (u.prefixItems as unknown[])\n : undefined;\n const itemsSchema = u.items as unknown;\n\n return coerceArrayValue(value, prefixItems, itemsSchema);\n }\n\n return value;\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 type { RXMLNode } from \"../core/types\";\nimport { RXMLCoercionError } from \"../errors/types\";\nimport {\n coerceBySchema as baseCoerceBySchema,\n getSchemaType,\n unwrapJsonSchema,\n} from \"./base-coercion\";\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 {\n RXMLCoercionError,\n RXMLDuplicateStringTagError,\n RXMLParseError,\n} from \"../errors/types\";\nimport { getSchemaType, unwrapJsonSchema } from \"../schema/base-coercion\";\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 * Streaming XML parser based on TXML's transformStream approach\n * Provides memory-efficient parsing for large XML documents\n */\n\nimport { type Readable, Transform, type TransformCallback } from \"node:stream\";\n\nimport { RXMLStreamError } from \"../errors/types\";\nimport { XMLTokenizer } from \"./tokenizer\";\nimport type { ParseOptions, RXMLNode } from \"./types\";\n\n// Regex patterns used at module level for performance\nconst TAG_NAME_REGEX = /^([a-zA-Z_][\\w.-]*)/;\nconst WHITESPACE_REGEX = /\\s/;\n\n/**\n * Transform stream for parsing XML\n */\nexport class XMLTransformStream extends Transform {\n private buffer = \"\";\n private readonly parseOptions: ParseOptions;\n private emittedCount = 0;\n private sawTagChar = false;\n\n constructor(_offset?: number | string, parseOptions: ParseOptions = {}) {\n super({ readableObjectMode: true });\n\n this.parseOptions = {\n keepComments: false,\n keepWhitespace: false,\n ...parseOptions,\n };\n }\n\n _transform(\n chunk: Buffer,\n _encoding: BufferEncoding,\n callback: TransformCallback\n ): void {\n try {\n const incoming = chunk.toString();\n if (incoming.includes(\"<\")) {\n this.sawTagChar = true;\n }\n this.buffer += incoming;\n this.processBuffer();\n callback();\n } catch (error) {\n callback(new RXMLStreamError(\"Transform error\", error));\n }\n }\n\n _flush(callback: TransformCallback): void {\n try {\n // Process any remaining buffer content\n if (this.buffer.length > 0) {\n this.processBuffer(true);\n }\n // If we saw XML-like input but emitted nothing, surface a meaningful error\n if (this.sawTagChar && this.emittedCount === 0) {\n throw new RXMLStreamError(\n \"Flush error\",\n new Error(\"No XML elements could be parsed from stream\")\n );\n }\n callback();\n } catch (error) {\n callback(new RXMLStreamError(\"Flush error\", error));\n }\n }\n\n private processBuffer(isFlush = false): void {\n // Try to find and emit complete XML elements in the buffer\n while (this.buffer.length > 0) {\n if (!this.trimToNextTag(isFlush)) {\n break;\n }\n\n if (this.tryProcessSpecialNode(isFlush)) {\n continue;\n }\n\n if (this.trySkipStrayClosingTag(isFlush)) {\n continue;\n }\n\n const tagInfo = this.extractTagInfo(isFlush);\n if (!tagInfo) {\n break;\n }\n\n if (this.tryProcessSelfClosingTag(tagInfo)) {\n continue;\n }\n\n if (!this.tryProcessRegularElement(tagInfo, isFlush)) {\n break;\n }\n }\n }\n\n private trimToNextTag(isFlush: boolean): boolean {\n const openBracket = this.buffer.indexOf(\"<\");\n if (openBracket === -1) {\n if (isFlush) {\n this.buffer = \"\";\n }\n return false;\n }\n\n if (openBracket > 0) {\n this.buffer = this.buffer.slice(openBracket);\n }\n return true;\n }\n\n private tryProcessSpecialNode(isFlush: boolean): boolean {\n if (\n !(\n this.buffer.startsWith(\"<?\") ||\n this.buffer.startsWith(\"<!--\") ||\n this.buffer.startsWith(\"<![CDATA[\")\n )\n ) {\n return false;\n }\n\n const endMarkers: Record<string, string> = {\n \"<?\": \"?>\",\n \"<!--\": \"-->\",\n \"<![CDATA[\": \"]]>\",\n };\n\n let endMarker = \"\";\n for (const [start, end] of Object.entries(endMarkers)) {\n if (this.buffer.startsWith(start)) {\n endMarker = end;\n break;\n }\n }\n\n const endPos = endMarker ? this.buffer.indexOf(endMarker) : -1;\n if (endPos === -1) {\n if (isFlush) {\n this.buffer = \"\";\n }\n return false; // Wait for more data\n }\n\n if (this.parseOptions.keepComments && this.buffer.startsWith(\"<!--\")) {\n this.push(this.buffer.slice(0, endPos + endMarker.length));\n }\n this.buffer = this.buffer.slice(endPos + endMarker.length);\n return true;\n }\n\n private trySkipStrayClosingTag(isFlush: boolean): boolean {\n if (!this.buffer.startsWith(\"</\")) {\n return false;\n }\n\n const closeEnd = this.buffer.indexOf(\">\");\n if (closeEnd === -1) {\n if (isFlush) {\n this.buffer = \"\";\n }\n return true;\n }\n\n this.buffer = this.buffer.slice(closeEnd + 1);\n return true;\n }\n\n private extractTagInfo(\n isFlush: boolean\n ): { openTagEnd: number; tagName: string } | null {\n const openTagEnd = this.buffer.indexOf(\">\");\n if (openTagEnd === -1) {\n if (isFlush) {\n this.buffer = \"\";\n }\n return null;\n }\n\n const openTagContent = this.buffer.slice(1, openTagEnd);\n const nameMatch = openTagContent.match(TAG_NAME_REGEX);\n if (!nameMatch) {\n this.buffer = this.buffer.slice(1);\n return null;\n }\n\n return { openTagEnd, tagName: nameMatch[1] };\n }\n\n private tryProcessSelfClosingTag(tagInfo: {\n openTagEnd: number;\n tagName: string;\n }): boolean {\n const isSelfClosing = this.buffer[tagInfo.openTagEnd - 1] === \"/\";\n if (!isSelfClosing) {\n return false;\n }\n\n const elementEnd = tagInfo.openTagEnd + 1;\n const elementXml = this.buffer.slice(0, elementEnd);\n try {\n const tokenizer = new XMLTokenizer(elementXml, this.parseOptions);\n const node = tokenizer.parseNode();\n this.emitElementAndChildren(node);\n this.buffer = this.buffer.slice(elementEnd);\n return true;\n } catch {\n this.buffer = this.buffer.slice(1);\n return true;\n }\n }\n\n private tryProcessRegularElement(\n tagInfo: { openTagEnd: number; tagName: string },\n isFlush: boolean\n ): boolean {\n const elementEnd = this.findMatchingClosingTag(\n tagInfo.tagName,\n tagInfo.openTagEnd\n );\n\n if (elementEnd === -1) {\n if (isFlush) {\n this.buffer = this.buffer.slice(1);\n return true;\n }\n return false;\n }\n\n const elementXml = this.buffer.slice(0, elementEnd);\n try {\n const tokenizer = new XMLTokenizer(elementXml, this.parseOptions);\n const node = tokenizer.parseNode();\n this.emitElementAndChildren(node);\n this.buffer = this.buffer.slice(elementEnd);\n return true;\n } catch (e) {\n this.emit(\"error\", new RXMLStreamError(\"Parse error\", e as Error));\n return false;\n }\n }\n\n private findMatchingClosingTag(tagName: string, openTagEnd: number): number {\n let depth = 1;\n let searchStart = openTagEnd + 1;\n\n while (searchStart < this.buffer.length) {\n const nextOpen = this.findNextOpeningTag(tagName, searchStart);\n const nextCloseStart = this.buffer.indexOf(`</${tagName}`, searchStart);\n\n if (nextCloseStart === -1) {\n return -1;\n }\n\n if (nextOpen !== -1 && nextOpen < nextCloseStart) {\n depth += 1;\n searchStart = nextOpen + 1;\n } else {\n depth -= 1;\n const closeAdvance = this.advancePastClosingTag(\n tagName,\n nextCloseStart\n );\n if (closeAdvance === -1) {\n return -1;\n }\n searchStart = closeAdvance;\n if (depth === 0) {\n return searchStart;\n }\n }\n }\n\n return -1;\n }\n\n private findNextOpeningTag(tagName: string, searchStart: number): number {\n let nextOpen = this.buffer.indexOf(`<${tagName}`, searchStart);\n while (nextOpen !== -1) {\n const after = this.buffer[nextOpen + tagName.length + 1];\n if (\n after === undefined ||\n after === \">\" ||\n WHITESPACE_REGEX.test(after)\n ) {\n break;\n }\n nextOpen = this.buffer.indexOf(`<${tagName}`, nextOpen + 1);\n }\n return nextOpen;\n }\n\n private advancePastClosingTag(\n tagName: string,\n nextCloseStart: number\n ): number {\n let p = nextCloseStart + 2 + tagName.length;\n while (p < this.buffer.length && WHITESPACE_REGEX.test(this.buffer[p])) {\n p += 1;\n }\n if (this.buffer[p] !== \">\") {\n return -1;\n }\n return p + 1;\n }\n\n /**\n * Emit an element and recursively emit its children as separate events\n */\n private emitElementAndChildren(node: RXMLNode | string): void {\n if (typeof node === \"string\") {\n // Emit comment nodes if requested\n if (this.parseOptions.keepComments && node.includes(\"<!--\")) {\n this.push(node);\n this.emittedCount += 1;\n }\n return;\n }\n\n // Emit the element itself\n this.push(node);\n this.emittedCount += 1;\n\n // Recursively emit children\n for (const child of node.children) {\n this.emitElementAndChildren(child);\n }\n }\n}\n\n/**\n * Create a transform stream for parsing XML\n */\nexport function createXMLStream(\n offset?: number | string,\n parseOptions?: ParseOptions\n): XMLTransformStream {\n return new XMLTransformStream(offset, parseOptions);\n}\n\n/**\n * Parse XML from a readable stream\n */\nexport function parseFromStream(\n stream: Readable,\n offset?: number | string,\n parseOptions?: ParseOptions\n): Promise<(RXMLNode | string)[]> {\n return new Promise((resolve, reject) => {\n const results: (RXMLNode | string)[] = [];\n const transformStream = createXMLStream(offset, parseOptions);\n\n // Propagate source stream errors\n const onSourceError = (err: Error) => {\n transformStream.destroy(err);\n };\n stream.on(\"error\", onSourceError);\n\n transformStream.on(\"data\", (element: RXMLNode | string) => {\n results.push(element);\n });\n\n transformStream.on(\"end\", () => {\n stream.off(\"error\", onSourceError);\n resolve(results);\n });\n\n transformStream.on(\"error\", (error: Error) => {\n stream.off(\"error\", onSourceError);\n reject(new RXMLStreamError(\"Stream parsing failed\", error));\n });\n\n stream.pipe(transformStream);\n });\n}\n\n/**\n * Process XML stream with async iterator support\n */\nexport async function* processXMLStream(\n stream: Readable,\n offset?: number | string,\n parseOptions?: ParseOptions\n): AsyncGenerator<RXMLNode | string, void, unknown> {\n const transformStream = createXMLStream(offset, parseOptions);\n\n let ended = false;\n let error: Error | null = null;\n const queue: (RXMLNode | string)[] = [];\n let resolveNext: ((value: IteratorResult<RXMLNode | string>) => void) | null =\n null;\n\n // Ensure source stream errors are propagated and terminate iteration\n const onSourceError = (err: Error) => {\n error = err;\n transformStream.destroy(err);\n };\n stream.on(\"error\", onSourceError);\n\n transformStream.on(\"data\", (element: RXMLNode | string) => {\n if (resolveNext) {\n resolveNext({ value: element, done: false });\n resolveNext = null;\n } else {\n queue.push(element);\n }\n });\n\n transformStream.on(\"end\", () => {\n ended = true;\n if (resolveNext) {\n resolveNext({ value: undefined, done: true });\n resolveNext = null;\n }\n stream.off(\"error\", onSourceError);\n });\n\n transformStream.on(\"error\", (err: Error) => {\n error = err;\n if (resolveNext) {\n resolveNext({ value: undefined, done: true });\n resolveNext = null;\n }\n stream.off(\"error\", onSourceError);\n });\n\n stream.pipe(transformStream);\n\n while (true) {\n if (error) {\n throw new RXMLStreamError(\"Stream processing error\", error);\n }\n\n if (queue.length > 0) {\n const item = queue.shift();\n if (item !== undefined) {\n yield item;\n }\n continue;\n }\n\n if (ended) {\n break;\n }\n\n // Wait for next element\n const result = await new Promise<IteratorResult<RXMLNode | string>>(\n (resolve) => {\n resolveNext = resolve;\n }\n );\n\n if (result.done) {\n if (error) {\n throw new RXMLStreamError(\"Stream processing error\", error);\n }\n break;\n }\n\n yield result.value;\n }\n}\n\n/**\n * Find elements by ID in streaming fashion\n */\nexport async function* findElementByIdStream(\n stream: Readable,\n id: string,\n offset?: number | string,\n parseOptions?: ParseOptions\n): AsyncGenerator<RXMLNode, void, unknown> {\n for await (const element of processXMLStream(stream, offset, parseOptions)) {\n if (typeof element === \"object\" && element.attributes.id === id) {\n yield element;\n }\n }\n}\n\n/**\n * Find elements by class name in streaming fashion\n */\nexport async function* findElementsByClassStream(\n stream: Readable,\n className: string,\n offset?: number | string,\n parseOptions?: ParseOptions\n): AsyncGenerator<RXMLNode, void, unknown> {\n const classRegex = new RegExp(`\\\\b${className}\\\\b`);\n\n for await (const element of processXMLStream(stream, offset, parseOptions)) {\n if (\n typeof element === \"object\" &&\n element.attributes.class &&\n classRegex.test(element.attributes.class)\n ) {\n yield element;\n }\n }\n}\n"],"mappings":"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","names":["escaped","result","children","DIGIT_KEY_REGEX","end","keys","WHITESPACE_REGEX"]}