{"version":3,"sources":["../src/core/types.ts","../src/utils/string.ts","../src/core/encoder.ts","../src/core/decoder.ts","../src/json.ts"],"names":["ToonError","message","line","column","ToonEncodeError","ToonDecodeError","needsQuoting","str","delimiter","needsQuotingInArray","needsQuotingAsKey","escapeString","unescapeString","lineIndex","result","i","next","quoteString","inArray","quoteKey","key","parseString","trimmed","content","parseKey","escaped","char","match","encode","value","options","indent","keyFolding","flattenDepth","encodeRootArray","encodeValue","encodePrimitive","getDelimiterInBracket","isPrimitiveArray","arr","item","isUniformObjectArray","firstKeys","keys","k","containsOnlyPrimitives","obj","val","tryFoldPath","currentKey","currentVal","segmentCount","nextKey","delimInBracket","items","objs","keyDelim","keyStr","lines","values","encoded","encodeListItem","encodeInlineArray","depth","indentStr","quotedKey","encodeTabular","keysStr","valueStr","encodeListArray","prefix","nested","first","fieldParts","encodeObjectField","firstLine","dedented","fieldLines","folded","foldedKey","finalVal","keySet","collisionKeys","useKeyFolding","fieldStr","validateIndentation","leadingWhitespace","indentLevel","shouldExpandKey","wasQuoted","part","expandPaths","metadata","parts","setNestedValue","existing","existingType","newType","rest","decode","toon","opts","nonEmptyLines","l","keyResult","parsePrimitive","parseRootArray","parseLines","num","getIndentLevel","detectDelimiter","bracketContent","parseInlineArray","bracketMatch","countStr","count","splitByDelimiter","parsed","v","current","inQuotes","parseTabular","header","startIndex","parseRow","j","_expectedCount","inlineMatch","tabularMatch","nextLine","arrayMatch","nextLineIndex","baseIndent","parseListFormat","itemContent","parseArray","colonMatch","nestedStart","nextContent","nextKeyResult","nextRest","nextColonMatch","nextValueStr","nextIndent","listResult","keyMetadata","json"],"mappings":"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","file":"json.cjs","sourcesContent":["/**\n * TOON value types\n */\nexport type ToonPrimitive = string | number | boolean | null;\nexport type ToonValue = ToonPrimitive | ToonObject | ToonArray | ToonValue[];\n\nexport interface ToonObject {\n  [key: string]: ToonValue;\n}\n\nexport type ToonArray = ToonValue[];\n\n/**\n * Encoder options\n */\nexport interface EncodeOptions {\n  /**\n   * Enable strict validation during encoding\n   */\n  strict?: boolean;\n  /**\n   * Indentation (default: 2)\n   * - number: Number of spaces\n   * - string: Custom indentation string\n   */\n  indent?: number | string;\n  /**\n   * Array delimiter (default: comma)\n   * - ',' - Comma delimiter (default)\n   * - '\\t' - Tab delimiter\n   * - '|' - Pipe delimiter\n   */\n  delimiter?: ',' | '\\t' | '|';\n  /**\n   * Key folding mode (default: none)\n   * - false/undefined: No key folding\n   * - 'safe': Fold single-key chains into dotted paths\n   */\n  keyFolding?: false | 'safe';\n  /**\n   * Maximum depth for key folding (default: Infinity when keyFolding is 'safe')\n   * - 0: No folding\n   * - n: Fold up to n levels\n   */\n  flattenDepth?: number;\n}\n\n/**\n * Decoder options\n */\nexport interface DecodeOptions {\n  /**\n   * Enable strict validation during decoding\n   */\n  strict?: boolean;\n  /**\n   * Indentation size (default: 2)\n   */\n  indent?: number;\n  /**\n   * Path expansion mode (default: 'off')\n   * - 'off': Keep dotted keys literal\n   * - 'safe': Expand identifier-only dotted keys\n   */\n  expandPaths?: 'off' | 'safe';\n}\n\n/**\n * Errors\n */\nexport class ToonError extends Error {\n  constructor(\n    message: string,\n    public line?: number,\n    public column?: number\n  ) {\n    super(message);\n    this.name = 'ToonError';\n  }\n}\n\nexport class ToonEncodeError extends ToonError {\n  constructor(message: string) {\n    super(message);\n    this.name = 'ToonEncodeError';\n  }\n}\n\nexport class ToonDecodeError extends ToonError {\n  constructor(message: string, line?: number, column?: number) {\n    super(message, line, column);\n    this.name = 'ToonDecodeError';\n  }\n}\n","/**\n * Check if string needs quoting in TOON format\n * @param str String to check\n * @param delimiter Active delimiter (affects whether commas need quoting)\n */\nexport function needsQuoting(\n  str: string,\n  delimiter: ',' | '\\t' | '|' = ','\n): boolean {\n  // Empty strings need quotes\n  if (str.length === 0) return true;\n\n  // Keywords need quotes\n  if (str === 'true' || str === 'false' || str === 'null') return true;\n\n  // Numbers need quotes (including scientific notation)\n  if (/^-?\\d+(\\.\\d+)?(e[+-]?\\d+)?$/i.test(str)) return true;\n\n  // Leading zeros (non-numeric) need quotes\n  if (/^0\\d/.test(str)) return true;\n\n  // TOON syntax characters need quotes\n  if (/^[[\\]{}]/.test(str) || str.includes('[') || str.includes('{')) {\n    return true;\n  }\n\n  // List item marker needs quotes\n  if (str === '-' || /^-\\s/.test(str)) return true;\n\n  // Control characters need quotes\n  if (/[\\n\\r\\t\\\\\"]/.test(str)) return true;\n\n  // Whitespace-only strings need quotes\n  if (/^\\s+$/.test(str)) return true;\n\n  // Leading or trailing whitespace needs quotes\n  if (str !== str.trim()) return true;\n\n  // Safe string pattern: letters, numbers, underscore, spaces, unicode\n  // When delimiter is not comma, commas are also safe\n  const safePattern =\n    delimiter === ',' ? /^[\\w\\s\\u0080-\\uFFFF]+$/ : /^[\\w\\s,\\u0080-\\uFFFF]+$/;\n\n  return !safePattern.test(str);\n}\n\n/**\n * Check if string needs quoting specifically in array context\n * (stricter rules based on active delimiter)\n */\nexport function needsQuotingInArray(\n  str: string,\n  delimiter: ',' | '\\t' | '|' = ','\n): boolean {\n  if (needsQuoting(str, delimiter)) return true;\n\n  // Strings containing the active delimiter need quotes\n  if (str.includes(delimiter)) return true;\n\n  // Colons always need quotes in arrays\n  if (str.includes(':')) return true;\n\n  return false;\n}\n\n/**\n * Check if string needs quoting as object key\n */\nexport function needsQuotingAsKey(str: string): boolean {\n  // Empty string needs quotes\n  if (str.length === 0) return true;\n\n  // Numeric keys need quotes\n  if (/^\\d+$/.test(str)) return true;\n\n  // Keys starting with hyphen need quotes\n  if (str.startsWith('-')) return true;\n\n  // Keys containing hyphens need quotes (ambiguous with paths)\n  if (str.includes('-')) return true;\n\n  // Keys with special characters need quotes\n  if (\n    str.includes(':') ||\n    str.includes(',') ||\n    str.includes(' ') ||\n    str.includes('[') ||\n    str.includes(']') ||\n    str.includes('{') ||\n    str.includes('}') ||\n    str.includes('\\n') ||\n    str.includes('\\t') ||\n    str.includes('\\r') ||\n    str.includes('\"')\n  ) {\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * Escape special characters in string for TOON\n */\nexport function escapeString(str: string): string {\n  return str\n    .replace(/\\\\/g, '\\\\\\\\')\n    .replace(/\"/g, '\\\\\"')\n    .replace(/\\n/g, '\\\\n')\n    .replace(/\\r/g, '\\\\r')\n    .replace(/\\t/g, '\\\\t');\n}\n\n/**\n * Unescape TOON string with validation\n */\nexport function unescapeString(str: string, lineIndex?: number): string {\n  let result = '';\n  let i = 0;\n\n  while (i < str.length) {\n    if (str[i] === '\\\\' && i + 1 < str.length) {\n      const next = str[i + 1];\n      if (next === 'n') {\n        result += '\\n';\n        i += 2;\n      } else if (next === 'r') {\n        result += '\\r';\n        i += 2;\n      } else if (next === 't') {\n        result += '\\t';\n        i += 2;\n      } else if (next === '\"') {\n        result += '\"';\n        i += 2;\n      } else if (next === '\\\\') {\n        result += '\\\\';\n        i += 2;\n      } else {\n        // Invalid escape sequence\n        if (lineIndex !== undefined) {\n          throw new Error(\n            `Invalid escape sequence: \\\\${next} at line ${lineIndex + 1}`\n          );\n        }\n        // Fallback: keep as is\n        result += str[i];\n        i++;\n      }\n    } else {\n      result += str[i];\n      i++;\n    }\n  }\n\n  return result;\n}\n\n/**\n * Quote string if needed for TOON\n */\nexport function quoteString(\n  str: string,\n  inArray = false,\n  delimiter: ',' | '\\t' | '|' = ','\n): string {\n  const needs = inArray\n    ? needsQuotingInArray(str, delimiter)\n    : needsQuoting(str, delimiter);\n  if (needs) {\n    return `\"${escapeString(str)}\"`;\n  }\n  return str;\n}\n\n/**\n * Quote key if needed\n */\nexport function quoteKey(key: string): string {\n  if (needsQuotingAsKey(key)) {\n    return `\"${escapeString(key)}\"`;\n  }\n  return key;\n}\n\n/**\n * Parse quoted or unquoted string from TOON\n */\nexport function parseString(str: string, lineIndex?: number): string {\n  const trimmed = str.trim();\n\n  // Check if quoted\n  if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n    const content = trimmed.slice(1, -1);\n    return unescapeString(content, lineIndex);\n  }\n\n  return trimmed;\n}\n\n/**\n * Parse key (handles both quoted and unquoted keys)\n * Returns the key string, remaining text, and whether it was quoted\n */\nexport function parseKey(\n  str: string\n): { key: string; rest: string; wasQuoted?: boolean } | null {\n  const trimmed = str.trim();\n\n  // Section: Handle quoted keys\n  if (trimmed.startsWith('\"')) {\n    let i = 1;\n    let escaped = false;\n    let key = '';\n\n    while (i < trimmed.length) {\n      const char = trimmed[i];\n\n      if (escaped) {\n        // Keep the backslash for unescapeString to process\n        key += '\\\\' + char;\n        escaped = false;\n        i++;\n        continue;\n      }\n\n      if (char === '\\\\') {\n        escaped = true;\n        i++;\n        continue;\n      }\n\n      if (char === '\"') {\n        // Found closing quote\n        return {\n          key: unescapeString(key, 0),\n          rest: trimmed.slice(i + 1),\n          wasQuoted: true,\n        };\n      }\n\n      key += char;\n      i++;\n    }\n\n    // Unclosed quote\n    return null;\n  }\n\n  // Section: Handle unquoted keys\n  // Match word chars, dots, and hyphens, but stop at brackets or colon\n  const match = trimmed.match(/^([\\w.-]+?)(\\[.*|:\\s*.*|$)/);\n  if (match && match[1]) {\n    return {\n      key: match[1],\n      rest: match[2],\n      wasQuoted: false,\n    };\n  }\n\n  return null;\n}\n","import type { EncodeOptions, ToonValue } from './types.js';\nimport { ToonEncodeError } from './types.js';\nimport { quoteString, quoteKey, needsQuotingAsKey } from '../utils/string.js';\n\n/**\n * Encode a value to TOON format\n */\nexport function encode(value: ToonValue, options: EncodeOptions = {}): string {\n  const indent =\n    typeof options.indent === 'number'\n      ? ' '.repeat(options.indent)\n      : (options.indent ?? '  ');\n  const delimiter = options.delimiter ?? ',';\n  const keyFolding = options.keyFolding ?? false;\n  const flattenDepth =\n    options.flattenDepth ?? (keyFolding === 'safe' ? Infinity : 0);\n\n  // Section: Handle root-level arrays\n  if (Array.isArray(value)) {\n    return encodeRootArray(value, indent, delimiter);\n  }\n\n  return encodeValue(value, 0, indent, delimiter, keyFolding, flattenDepth);\n}\n\n/**\n * Encode primitive values\n */\nfunction encodePrimitive(\n  value: unknown,\n  inArray = false,\n  delimiter: ',' | '\\t' | '|' = ','\n): string {\n  if (value === null) return 'null';\n  if (typeof value === 'boolean') return value.toString();\n  if (typeof value === 'number') {\n    if (Object.is(value, -0)) return '0';\n    return value.toString();\n  }\n  if (typeof value === 'string') return quoteString(value, inArray, delimiter);\n\n  throw new ToonEncodeError(`Unsupported primitive type: ${typeof value}`);\n}\n\n/**\n * Get delimiter string for array brackets\n */\nfunction getDelimiterInBracket(delimiter: ',' | '\\t' | '|'): string {\n  return delimiter === ',' ? '' : delimiter;\n}\n\n/**\n * Check if all items are primitives\n */\nfunction isPrimitiveArray(arr: unknown[]): boolean {\n  return arr.every(\n    (item) =>\n      item === null ||\n      typeof item === 'boolean' ||\n      typeof item === 'number' ||\n      typeof item === 'string'\n  );\n}\n\n/**\n * Check if array contains only objects with same keys\n */\nfunction isUniformObjectArray(arr: unknown[]): boolean {\n  if (arr.length === 0) return false;\n\n  if (\n    !arr.every(\n      (item) =>\n        item !== null && typeof item === 'object' && !Array.isArray(item)\n    )\n  ) {\n    return false;\n  }\n\n  const firstKeys = Object.keys(arr[0] as object).sort();\n  return arr.every((item) => {\n    const keys = Object.keys(item as object).sort();\n    return (\n      keys.length === firstKeys.length &&\n      keys.every((k, i) => k === firstKeys[i])\n    );\n  });\n}\n\n/**\n * Check if objects only contain primitives\n */\nfunction containsOnlyPrimitives(obj: Record<string, unknown>): boolean {\n  return Object.values(obj).every(\n    (val) =>\n      val === null ||\n      typeof val === 'boolean' ||\n      typeof val === 'number' ||\n      typeof val === 'string'\n  );\n}\n\n/**\n * Try to fold a key path (for key folding feature)\n * Returns [foldedKey, finalValue] or null if can't fold\n * flattenDepth represents max segments in output (e.g., a.b = 2)\n */\nfunction tryFoldPath(\n  key: string,\n  val: unknown,\n  keyFolding: false | 'safe',\n  flattenDepth: number\n): [string, unknown] | null {\n  if (!keyFolding || keyFolding !== 'safe') return null;\n  if (flattenDepth <= 1) return null; // Need at least 2 segments to fold\n\n  // Can't fold if current key needs quoting\n  if (needsQuotingAsKey(key)) return null;\n\n  let currentKey = key;\n  let currentVal = val;\n  let segmentCount = 1; // Start with 1 (the initial key)\n\n  // Walk down single-key objects\n  while (\n    currentVal !== null &&\n    typeof currentVal === 'object' &&\n    !Array.isArray(currentVal)\n  ) {\n    const obj = currentVal as Record<string, unknown>;\n    const keys = Object.keys(obj);\n\n    // Only fold if exactly one key\n    if (keys.length !== 1) break;\n\n    const nextKey = keys[0];\n\n    // Can't fold if key needs quoting\n    if (needsQuotingAsKey(nextKey)) break;\n\n    // Check if adding next segment would exceed limit\n    if (segmentCount >= flattenDepth) break;\n\n    currentKey = `${currentKey}.${nextKey}`;\n    currentVal = obj[nextKey];\n    segmentCount++;\n  }\n\n  // Only return folded path if we actually folded something\n  if (currentKey === key) return null;\n\n  return [currentKey, currentVal];\n}\n\n/**\n * Encode root-level array\n */\nfunction encodeRootArray(\n  arr: unknown[],\n  indent: string,\n  delimiter: ',' | '\\t' | '|'\n): string {\n  const delimInBracket = getDelimiterInBracket(delimiter);\n\n  if (arr.length === 0) return `[0${delimInBracket}]:`;\n\n  // Section: Primitive array - inline format\n  if (isPrimitiveArray(arr)) {\n    const items = arr.map((item) => encodePrimitive(item, true, delimiter));\n    return `[${arr.length}${delimInBracket}]: ${items.join(delimiter)}`;\n  }\n\n  // Section: Uniform object array - tabular format\n  if (isUniformObjectArray(arr)) {\n    const objs = arr as Record<string, unknown>[];\n    if (objs.every((obj) => containsOnlyPrimitives(obj))) {\n      const keys = Object.keys(objs[0]);\n      const keyDelim = delimiter === ',' ? ',' : delimiter;\n      const keyStr = keys.map((k) => quoteKey(k)).join(keyDelim);\n      const lines: string[] = [`[${arr.length}${delimInBracket}]{${keyStr}}:`];\n\n      for (const obj of objs) {\n        const values = keys.map((k) =>\n          encodePrimitive(obj[k], true, delimiter)\n        );\n        lines.push(`${indent}${values.join(delimiter)}`);\n      }\n\n      return lines.join('\\n');\n    }\n  }\n\n  // Section: Mixed array - list format with hyphens\n  const lines: string[] = [`[${arr.length}${delimInBracket}]:`];\n  for (const item of arr) {\n    const encoded = encodeListItem(item, 1, indent, delimiter);\n    lines.push(encoded);\n  }\n\n  return lines.join('\\n');\n}\n\n/**\n * Encode array in inline format (primitives only)\n */\nfunction encodeInlineArray(\n  key: string,\n  arr: unknown[],\n  depth: number,\n  indent: string,\n  delimiter: ',' | '\\t' | '|'\n): string {\n  const indentStr = indent.repeat(depth);\n  const delimInBracket = getDelimiterInBracket(delimiter);\n  const quotedKey = quoteKey(key);\n\n  if (arr.length === 0) {\n    return `${indentStr}${quotedKey}[0${delimInBracket}]:`;\n  }\n\n  const items = arr.map((item) => encodePrimitive(item, true, delimiter));\n  return (\n    `${indentStr}${quotedKey}[${arr.length}${delimInBracket}]: ` +\n    `${items.join(delimiter)}`\n  );\n}\n\n/**\n * Encode array in tabular format\n */\nfunction encodeTabular(\n  key: string,\n  arr: Record<string, unknown>[],\n  depth: number,\n  indent: string,\n  delimiter: ',' | '\\t' | '|'\n): string {\n  const indentStr = indent.repeat(depth);\n  const delimInBracket = getDelimiterInBracket(delimiter);\n  const quotedKey = quoteKey(key);\n\n  if (arr.length === 0) return `${indentStr}${quotedKey}[0${delimInBracket}]:`;\n\n  const keys = Object.keys(arr[0]);\n  const keyDelim = delimiter === ',' ? ',' : delimiter;\n  const keysStr = keys.map((k) => quoteKey(k)).join(keyDelim);\n  const lines: string[] = [\n    `${indentStr}${quotedKey}[${arr.length}${delimInBracket}]{${keysStr}}:`,\n  ];\n\n  for (const item of arr) {\n    const values = keys.map((k) => encodePrimitive(item[k], true, delimiter));\n    const valueStr = values.join(delimiter);\n    lines.push(`${indent.repeat(depth + 1)}${valueStr}`);\n  }\n\n  return lines.join('\\n');\n}\n\n/**\n * Encode array in list format (with hyphens)\n */\nfunction encodeListArray(\n  key: string,\n  arr: unknown[],\n  depth: number,\n  indent: string,\n  delimiter: ',' | '\\t' | '|'\n): string {\n  const indentStr = indent.repeat(depth);\n  const delimInBracket = getDelimiterInBracket(delimiter);\n  const quotedKey = quoteKey(key);\n  const lines: string[] = [\n    `${indentStr}${quotedKey}[${arr.length}${delimInBracket}]:`,\n  ];\n\n  for (const item of arr) {\n    const encoded = encodeListItem(item, depth + 1, indent, delimiter);\n    lines.push(encoded);\n  }\n\n  return lines.join('\\n');\n}\n\n/**\n * Encode a single list item (with hyphen prefix)\n */\nfunction encodeListItem(\n  item: unknown,\n  depth: number,\n  indent: string,\n  delimiter: ',' | '\\t' | '|'\n): string {\n  const indentStr = indent.repeat(depth);\n  const prefix = `${indentStr}- `;\n\n  // Section: Primitive - inline after hyphen\n  if (\n    item === null ||\n    typeof item === 'boolean' ||\n    typeof item === 'number' ||\n    typeof item === 'string'\n  ) {\n    return `${prefix}${encodePrimitive(item, false, delimiter)}`;\n  }\n\n  // Section: Array - format based on content\n  if (Array.isArray(item)) {\n    const delimInBracket = getDelimiterInBracket(delimiter);\n\n    if (item.length === 0) {\n      return `${prefix}[0${delimInBracket}]:`;\n    }\n\n    // Primitive array - inline\n    if (isPrimitiveArray(item)) {\n      const items = item.map((i) => encodePrimitive(i, true, delimiter));\n      return (\n        `${prefix}[${item.length}${delimInBracket}]: ` +\n        `${items.join(delimiter)}`\n      );\n    }\n\n    // Nested arrays or mixed - continue list format\n    const lines: string[] = [`${prefix}[${item.length}${delimInBracket}]:`];\n    for (const nested of item) {\n      const encoded = encodeListItem(nested, depth + 1, indent, delimiter);\n      lines.push(encoded);\n    }\n    return lines.join('\\n');\n  }\n\n  // Section: Object - encode fields\n  if (typeof item === 'object' && item !== null) {\n    const obj = item as Record<string, unknown>;\n    const keys = Object.keys(obj);\n\n    if (keys.length === 0) {\n      return `${prefix}{}`;\n    }\n\n    const lines: string[] = [];\n    let first = true;\n\n    for (const key of keys) {\n      const val = obj[key];\n\n      if (first) {\n        // First field on hyphen line\n        const fieldLines = encodeObjectField(\n          key,\n          val,\n          depth + 1,\n          indent,\n          delimiter,\n          false,\n          0\n        );\n        // Split into lines, dedent continuation lines by one level\n        const fieldParts = fieldLines.split('\\n');\n        const firstLine = fieldParts[0].trimStart();\n        lines.push(`${prefix}${firstLine}`);\n\n        // Add continuation lines with reduced indentation\n        for (let i = 1; i < fieldParts.length; i++) {\n          // Remove one level of indentation from continuation lines\n          const line = fieldParts[i];\n          const dedented = line.startsWith(indent)\n            ? line.slice(indent.length)\n            : line;\n          lines.push(dedented);\n        }\n        first = false;\n      } else {\n        // Subsequent fields indented\n        const fieldLines = encodeObjectField(\n          key,\n          val,\n          depth + 1,\n          indent,\n          delimiter,\n          false,\n          0\n        );\n        lines.push(fieldLines);\n      }\n    }\n\n    return lines.join('\\n');\n  }\n\n  throw new ToonEncodeError(`Unsupported list item type: ${typeof item}`);\n}\n\n/**\n * Encode an object field\n */\nfunction encodeObjectField(\n  key: string,\n  val: unknown,\n  depth: number,\n  indent: string,\n  delimiter: ',' | '\\t' | '|',\n  keyFolding: false | 'safe',\n  flattenDepth: number\n): string {\n  const indentStr = indent.repeat(depth);\n\n  // Section: Try key folding first\n  if (keyFolding) {\n    const folded = tryFoldPath(key, val, keyFolding, flattenDepth);\n    if (folded) {\n      const [foldedKey, finalVal] = folded;\n      // Recursively encode with the folded key and final value\n      return encodeObjectField(\n        foldedKey,\n        finalVal,\n        depth,\n        indent,\n        delimiter,\n        false,\n        0\n      );\n    }\n  }\n\n  // Section: Primitive value\n  if (\n    val === null ||\n    typeof val === 'boolean' ||\n    typeof val === 'number' ||\n    typeof val === 'string'\n  ) {\n    return (\n      `${indentStr}${quoteKey(key)}: ` +\n      `${encodePrimitive(val, false, delimiter)}`\n    );\n  }\n\n  // Section: Array\n  if (Array.isArray(val)) {\n    if (val.length === 0) {\n      const delimInBracket = getDelimiterInBracket(delimiter);\n      return `${indentStr}${quoteKey(key)}[0${delimInBracket}]:`;\n    }\n\n    // Primitive array - inline\n    if (isPrimitiveArray(val)) {\n      return encodeInlineArray(key, val, depth, indent, delimiter);\n    }\n\n    // Uniform object array with only primitives - tabular\n    if (isUniformObjectArray(val)) {\n      const objs = val as Record<string, unknown>[];\n      if (objs.every((obj) => containsOnlyPrimitives(obj))) {\n        return encodeTabular(key, objs, depth, indent, delimiter);\n      }\n    }\n\n    // Mixed or nested - list format\n    return encodeListArray(key, val, depth, indent, delimiter);\n  }\n\n  // Section: Nested object\n  if (typeof val === 'object' && val !== null) {\n    const nested = encodeValue(\n      val as ToonValue,\n      depth + 1,\n      indent,\n      delimiter,\n      keyFolding,\n      flattenDepth\n    );\n    if (nested === '') {\n      // Empty object - just key with colon\n      return `${indentStr}${quoteKey(key)}:`;\n    }\n    const lines: string[] = [`${indentStr}${quoteKey(key)}:`, nested];\n    return lines.join('\\n');\n  }\n\n  throw new ToonEncodeError(`Unsupported field type: ${typeof val}`);\n}\n\n/**\n * Encode a value at a given depth\n */\nfunction encodeValue(\n  value: ToonValue,\n  depth: number,\n  indent: string,\n  delimiter: ',' | '\\t' | '|',\n  keyFolding: false | 'safe',\n  flattenDepth: number\n): string {\n  // Section: Handle primitives\n  if (\n    value === null ||\n    typeof value === 'boolean' ||\n    typeof value === 'number' ||\n    typeof value === 'string'\n  ) {\n    return encodePrimitive(value, false, delimiter);\n  }\n\n  // Section: Handle objects\n  if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n    const obj = value as Record<string, unknown>;\n    const keys = Object.keys(obj);\n\n    if (keys.length === 0) return '';\n\n    // Section: Detect folding collisions if key folding is enabled\n    const keySet = new Set(keys);\n    const collisionKeys = new Set<string>();\n\n    if (keyFolding && keyFolding === 'safe') {\n      for (const key of keys) {\n        const val = obj[key];\n        const folded = tryFoldPath(key, val, keyFolding, flattenDepth);\n        if (folded) {\n          const [foldedKey] = folded;\n          // Check if folded key collides with any sibling key\n          if (keySet.has(foldedKey) && foldedKey !== key) {\n            collisionKeys.add(key);\n          }\n        }\n      }\n    }\n\n    const lines: string[] = [];\n\n    for (const key of keys) {\n      const val = obj[key];\n      // Disable folding for this key if it has a collision\n      const useKeyFolding = collisionKeys.has(key) ? false : keyFolding;\n      const fieldStr = encodeObjectField(\n        key,\n        val,\n        depth,\n        indent,\n        delimiter,\n        useKeyFolding,\n        flattenDepth\n      );\n      lines.push(fieldStr);\n    }\n\n    return lines.join('\\n');\n  }\n\n  throw new ToonEncodeError(`Unsupported value type: ${typeof value}`);\n}\n","import type { DecodeOptions, ToonValue } from './types.js';\nimport { ToonDecodeError } from './types.js';\nimport { parseString, parseKey } from '../utils/string.js';\n\n/**\n * Validate indentation in strict mode\n */\nfunction validateIndentation(lines: string[], indent: number): void {\n  for (let i = 0; i < lines.length; i++) {\n    const line = lines[i];\n\n    // Skip empty lines\n    if (line.trim() === '') continue;\n\n    // Check for tabs in indentation\n    const leadingWhitespace = line.match(/^(\\s*)/)?.[1] || '';\n    if (leadingWhitespace.includes('\\t')) {\n      throw new ToonDecodeError(\n        'Tab characters not allowed in indentation in strict mode',\n        i + 1\n      );\n    }\n\n    // Check if indentation is multiple of indent size\n    const indentLevel = leadingWhitespace.length;\n    if (indentLevel > 0 && indentLevel % indent !== 0) {\n      throw new ToonDecodeError(\n        `Invalid indentation: expected multiple of ${indent}, ` +\n          `got ${indentLevel}`,\n        i + 1\n      );\n    }\n  }\n}\n\n/**\n * Check if key should be expanded\n * - Must have expandPaths='safe'\n * - Must contain dots\n * - Must not have been originally quoted\n * - All parts must be valid identifiers (no hyphens, etc.)\n */\nfunction shouldExpandKey(\n  key: string,\n  wasQuoted: boolean,\n  options: DecodeOptions\n): boolean {\n  if (options.expandPaths !== 'safe') return false;\n  if (wasQuoted) return false;\n  if (!key.includes('.')) return false;\n\n  // Check all parts are valid identifiers (alphanumeric + underscore)\n  const parts = key.split('.');\n  return parts.every((part) => /^[a-zA-Z_]\\w*$/.test(part));\n}\n\n/**\n * Expand dotted keys to nested objects\n * metadata contains wasQuoted info for each key\n */\nfunction expandPaths(\n  obj: Record<string, ToonValue>,\n  metadata: Map<string, boolean>,\n  options: DecodeOptions\n): Record<string, ToonValue> {\n  const result: Record<string, ToonValue> = {};\n\n  for (const [key, value] of Object.entries(obj)) {\n    const wasQuoted = metadata.get(key) ?? false;\n    if (shouldExpandKey(key, wasQuoted, options)) {\n      // Expand dotted key\n      const parts = key.split('.');\n      setNestedValue(result, parts, value, options);\n    } else {\n      // Use setNestedValue for non-dotted keys too for conflict detection\n      setNestedValue(result, [key], value, options);\n    }\n  }\n\n  return result;\n}\n\n/**\n * Set nested value with conflict detection\n */\nfunction setNestedValue(\n  obj: Record<string, ToonValue>,\n  parts: string[],\n  value: ToonValue,\n  options: DecodeOptions\n): void {\n  if (parts.length === 0) return;\n\n  if (parts.length === 1) {\n    const key = parts[0];\n    const existing = obj[key];\n\n    // Check for conflicts\n    if (existing !== undefined) {\n      const existingType = Array.isArray(existing)\n        ? 'array'\n        : typeof existing === 'object' && existing !== null\n          ? 'object'\n          : 'primitive';\n      const newType = Array.isArray(value)\n        ? 'array'\n        : typeof value === 'object' && value !== null\n          ? 'object'\n          : 'primitive';\n\n      if (existingType !== newType) {\n        if (options.strict) {\n          throw new ToonDecodeError(\n            `Path expansion conflict: cannot merge ${newType} ` +\n              `with ${existingType}`,\n            0\n          );\n        }\n        // LWW: overwrite\n        obj[key] = value;\n        return;\n      }\n\n      // Deep merge objects\n      if (\n        existingType === 'object' &&\n        newType === 'object' &&\n        !Array.isArray(existing) &&\n        !Array.isArray(value)\n      ) {\n        obj[key] = {\n          ...(existing as Record<string, ToonValue>),\n          ...(value as Record<string, ToonValue>),\n        };\n        return;\n      }\n    }\n\n    obj[key] = value;\n    return;\n  }\n\n  const first = parts[0];\n  const rest = parts.slice(1);\n\n  if (obj[first] === undefined) {\n    obj[first] = {};\n  } else if (typeof obj[first] !== 'object' || Array.isArray(obj[first])) {\n    // Conflict detected\n    if (options.strict) {\n      throw new ToonDecodeError(\n        'Path expansion conflict: cannot create nested object',\n        0\n      );\n    }\n    // LWW: overwrite with object\n    obj[first] = {};\n  }\n\n  setNestedValue(obj[first] as Record<string, ToonValue>, rest, value, options);\n}\n\n/**\n * Decode TOON format to value\n */\nexport function decode(toon: string, options: DecodeOptions = {}): ToonValue {\n  // Section: Normalize options\n  const opts: DecodeOptions = {\n    strict: options.strict ?? false,\n    indent: options.indent ?? 2,\n    expandPaths: options.expandPaths ?? 'off',\n  };\n\n  // Section: Handle empty document\n  if (toon.trim() === '') return {};\n\n  const lines = toon.split('\\n');\n\n  // Section: Validate indentation in strict mode\n  if (opts.strict) {\n    validateIndentation(lines, opts.indent!);\n  }\n\n  // Section: Check for root-level primitive (single non-empty line)\n  const nonEmptyLines = lines.filter((l) => l.trim() !== '');\n  if (nonEmptyLines.length === 1) {\n    const line = nonEmptyLines[0].trim();\n    // Check if it's a complete quoted string (primitive)\n    if (line.startsWith('\"') && line.endsWith('\"') && line.length > 1) {\n      // Make sure it's not a key-value like \"key\": value\n      const keyResult = parseKey(line);\n      if (!keyResult || !keyResult.rest.trim().startsWith(':')) {\n        return parsePrimitive(nonEmptyLines[0], 0);\n      }\n    }\n    // If doesn't contain colon, it's a primitive\n    if (!line.includes(':')) {\n      return parsePrimitive(nonEmptyLines[0], 0);\n    }\n  }\n\n  // Section: Check for multiple primitives at root in strict mode\n  if (opts.strict && nonEmptyLines.length > 1) {\n    const allPrimitives = nonEmptyLines.every(\n      (line) => !line.includes(':') && !line.startsWith('[')\n    );\n    if (allPrimitives) {\n      throw new ToonDecodeError(\n        'Multiple primitives at root not allowed in strict mode',\n        1\n      );\n    }\n  }\n\n  // Section: Check for root array (starts with [)\n  const firstLine = nonEmptyLines[0];\n  if (firstLine.trim().startsWith('[')) {\n    const parsed = parseRootArray(firstLine.trim(), lines, 0, opts, 0);\n    return parsed.value;\n  }\n\n  const result = parseLines(lines, 0, opts);\n\n  // Section: Apply path expansion if enabled\n  if (\n    opts.expandPaths === 'safe' &&\n    typeof result.value === 'object' &&\n    result.value !== null &&\n    !Array.isArray(result.value)\n  ) {\n    const metadata = result.keyMetadata || new Map();\n    return expandPaths(\n      result.value as Record<string, ToonValue>,\n      metadata,\n      opts\n    );\n  }\n\n  return result.value;\n}\n\ninterface ParseResult {\n  value: ToonValue;\n  linesConsumed: number;\n  keyMetadata?: Map<string, boolean>;\n}\n\n/**\n * Parse primitive value from string\n */\nfunction parsePrimitive(str: string, lineIndex: number): ToonValue {\n  const trimmed = str.trim();\n\n  // Section: Handle quoted strings\n  if (trimmed.startsWith('\"')) {\n    if (!trimmed.endsWith('\"') || trimmed.length < 2) {\n      throw new ToonDecodeError('Unterminated string', lineIndex + 1);\n    }\n    return parseString(trimmed, lineIndex);\n  }\n\n  // Section: Handle keywords\n  if (trimmed === 'true') return true;\n  if (trimmed === 'false') return false;\n  if (trimmed === 'null') return null;\n\n  // Section: Handle numbers (including scientific notation)\n  // Don't parse numbers with leading zeros (except 0 itself and 0.x)\n  if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(trimmed)) {\n    // Check for leading zero (but allow 0, 0.x, -0, -0.x)\n    if (/^-?0\\d/.test(trimmed)) {\n      // Leading zero - treat as string\n      return trimmed;\n    }\n    const num = Number(trimmed);\n    // Normalize negative zero to positive zero\n    return Object.is(num, -0) ? 0 : num;\n  }\n\n  // Section: Unquoted string\n  return trimmed;\n}\n\n/**\n * Get indentation level\n */\nfunction getIndentLevel(line: string): number {\n  const match = line.match(/^(\\s*)/);\n  if (!match) return 0;\n  return match[1].length;\n}\n\n/**\n * Detect delimiter from bracket notation\n * [3] → ','\n * [3\\t] → '\\t'\n * [3|] → '|'\n */\nfunction detectDelimiter(bracketContent: string): ',' | '\\t' | '|' {\n  if (bracketContent.includes('\\t')) return '\\t';\n  if (bracketContent.includes('|')) return '|';\n  return ',';\n}\n\n/**\n * Parse inline array: key[count<delim>]: val<delim>val<delim>val\n */\nfunction parseInlineArray(\n  line: string,\n  lineIndex: number\n): { key: string; values: ToonValue[]; delimiter: ',' | '\\t' | '|' } {\n  // Parse key (quoted or unquoted)\n  const keyResult = parseKey(line);\n  if (!keyResult) {\n    throw new ToonDecodeError('Invalid array key', lineIndex);\n  }\n\n  const { key, rest } = keyResult;\n\n  // Parse bracket notation [count<delim>]:\n  const bracketMatch = rest.match(/^\\[([^\\]]+)\\]:(.*)$/);\n  if (!bracketMatch) {\n    throw new ToonDecodeError('Invalid inline array format', lineIndex);\n  }\n\n  const bracketContent = bracketMatch[1];\n  const valueStr = bracketMatch[2].trimStart();\n  const delimiter = detectDelimiter(bracketContent);\n\n  // Parse count\n  const countStr = bracketContent.replace(/[\\t|]/g, '');\n  const count = parseInt(countStr, 10);\n\n  // Handle empty array\n  if (count === 0) {\n    return { key, values: [], delimiter };\n  }\n\n  // Parse values by splitting on delimiter (respecting quotes)\n  const values = splitByDelimiter(valueStr, delimiter);\n\n  if (values.length !== count) {\n    throw new ToonDecodeError(\n      `Array count mismatch: expected ${count}, got ${values.length}`,\n      lineIndex\n    );\n  }\n\n  // Parse each value as primitive\n  const parsed = values.map((v) => parsePrimitive(v, lineIndex));\n\n  return { key, values: parsed, delimiter };\n}\n\n/**\n * Split string by delimiter, respecting quoted strings\n */\nfunction splitByDelimiter(str: string, delimiter: ',' | '\\t' | '|'): string[] {\n  const values: string[] = [];\n  let current = '';\n  let inQuotes = false;\n  let escaped = false;\n\n  for (let i = 0; i < str.length; i++) {\n    const char = str[i];\n\n    if (escaped) {\n      current += char;\n      escaped = false;\n      continue;\n    }\n\n    if (char === '\\\\') {\n      current += char;\n      escaped = true;\n      continue;\n    }\n\n    if (char === '\"') {\n      current += char;\n      inQuotes = !inQuotes;\n      continue;\n    }\n\n    if (char === delimiter && !inQuotes) {\n      values.push(current.trim());\n      current = '';\n      continue;\n    }\n\n    current += char;\n  }\n\n  values.push(current.trim());\n  return values;\n}\n\n/**\n * Parse tabular array\n */\nfunction parseTabular(\n  header: string,\n  lines: string[],\n  startIndex: number,\n  options: DecodeOptions,\n  depth: number = 0\n): ParseResult {\n  void depth; // Not used in tabular format (maintains API consistency)\n\n  // Parse key first (quoted or unquoted)\n  const keyResult = parseKey(header);\n  if (!keyResult) {\n    throw new ToonDecodeError('Invalid tabular array key', startIndex);\n  }\n\n  const { rest } = keyResult;\n\n  // Parse header: [count<delim>]{field1<delim>field2}:\n  const match = rest.match(/^\\[([^\\]]+)\\]\\{([^}]+)\\}:\\s*$/);\n  if (!match) {\n    throw new ToonDecodeError('Invalid tabular array header', startIndex);\n  }\n\n  const bracketContent = match[1];\n  const keysStr = match[2];\n  const delimiter = detectDelimiter(bracketContent);\n\n  // Parse count\n  const countStr = bracketContent.replace(/[\\t|]/g, '');\n  const count = parseInt(countStr, 10);\n\n  // Parse keys (split by delimiter, handle quoted keys)\n  const keys = splitByDelimiter(keysStr, delimiter).map((k) => parseString(k));\n\n  const result: Record<string, ToonValue>[] = [];\n  let lineIndex = startIndex + 1;\n\n  // Parse rows\n  for (let i = 0; i < count; i++) {\n    // Skip blank lines\n    while (lineIndex < lines.length && lines[lineIndex].trim() === '') {\n      // Strict mode: blank lines inside arrays not allowed\n      if (options.strict && i > 0 && i < count) {\n        throw new ToonDecodeError(\n          'Blank lines not allowed inside arrays in strict mode',\n          lineIndex + 1\n        );\n      }\n      lineIndex++;\n    }\n\n    if (lineIndex >= lines.length) {\n      throw new ToonDecodeError(`Expected ${count} rows, got ${i}`, lineIndex);\n    }\n\n    const line = lines[lineIndex];\n    const values = parseRow(line, keys.length, delimiter);\n\n    if (values.length !== keys.length) {\n      throw new ToonDecodeError(\n        `Row has ${values.length} values, expected ${keys.length}`,\n        lineIndex\n      );\n    }\n\n    const obj: Record<string, ToonValue> = {};\n    for (let j = 0; j < keys.length; j++) {\n      obj[keys[j]] = parsePrimitive(values[j], lineIndex);\n    }\n    result.push(obj);\n\n    lineIndex++;\n  }\n\n  // Section: Validate final count\n  if (result.length !== count) {\n    throw new ToonDecodeError(\n      `Tabular array length mismatch: expected ${count} rows, ` +\n        `got ${result.length}`,\n      startIndex\n    );\n  }\n\n  return {\n    value: result,\n    linesConsumed: lineIndex - startIndex,\n  };\n}\n\n/**\n * Parse row with delimiter\n */\nfunction parseRow(\n  line: string,\n  _expectedCount: number,\n  delimiter: ',' | '\\t' | '|' = ','\n): string[] {\n  const trimmed = line.trim();\n  return splitByDelimiter(trimmed, delimiter);\n}\n\n/**\n * Parse root-level array\n */\nfunction parseRootArray(\n  header: string,\n  lines: string[],\n  startIndex: number,\n  options: DecodeOptions,\n  depth: number = 0\n): ParseResult {\n  // Section: Handle inline root array [count<delim>]: val,val,val\n  const inlineMatch = header.match(/^\\[([^\\]]+)\\]:(.+)$/);\n  if (inlineMatch) {\n    const bracketContent = inlineMatch[1];\n    const valueStr = inlineMatch[2].trimStart();\n    const delimiter = detectDelimiter(bracketContent);\n    const countStr = bracketContent.replace(/[\\t|]/g, '');\n    const count = parseInt(countStr, 10);\n\n    if (count === 0) {\n      return { value: [], linesConsumed: 1 };\n    }\n\n    const values = splitByDelimiter(valueStr, delimiter);\n    if (values.length !== count) {\n      throw new ToonDecodeError(\n        `Array count mismatch: expected ${count}, got ${values.length}`,\n        startIndex\n      );\n    }\n\n    return {\n      value: values.map((v) => parsePrimitive(v, startIndex)),\n      linesConsumed: 1,\n    };\n  }\n\n  // Section: Handle tabular root array [count<delim>]{fields}:\n  const tabularMatch = header.match(/^\\[([^\\]]+)\\]\\{([^}]+)\\}:\\s*$/);\n  if (tabularMatch) {\n    const bracketContent = tabularMatch[1];\n    const keysStr = tabularMatch[2];\n    const delimiter = detectDelimiter(bracketContent);\n    const countStr = bracketContent.replace(/[\\t|]/g, '');\n    const count = parseInt(countStr, 10);\n\n    const keys = splitByDelimiter(keysStr, delimiter).map((k) =>\n      parseString(k)\n    );\n\n    const result: Record<string, ToonValue>[] = [];\n    let lineIndex = startIndex + 1;\n\n    for (let i = 0; i < count; i++) {\n      if (lineIndex >= lines.length) {\n        throw new ToonDecodeError(\n          `Expected ${count} rows, got ${i}`,\n          lineIndex\n        );\n      }\n\n      const line = lines[lineIndex];\n      const values = parseRow(line, keys.length, delimiter);\n\n      if (values.length !== keys.length) {\n        throw new ToonDecodeError(\n          `Row has ${values.length} values, expected ${keys.length}`,\n          lineIndex\n        );\n      }\n\n      const obj: Record<string, ToonValue> = {};\n      for (let j = 0; j < keys.length; j++) {\n        obj[keys[j]] = parsePrimitive(values[j], lineIndex);\n      }\n      result.push(obj);\n\n      lineIndex++;\n    }\n\n    // Section: Validate no extra rows\n    if (lineIndex < lines.length) {\n      const nextLine = lines[lineIndex];\n      if (nextLine.trim() !== '' && getIndentLevel(nextLine) > 0) {\n        throw new ToonDecodeError(\n          `Tabular array has more rows than declared count ${count}`,\n          lineIndex\n        );\n      }\n    }\n\n    return {\n      value: result,\n      linesConsumed: lineIndex - startIndex,\n    };\n  }\n\n  // Section: Handle multiline root array [count<delim>]:\n  const arrayMatch = header.match(/^\\[([^\\]]+)\\]:\\s*$/);\n  if (arrayMatch) {\n    const bracketContent = arrayMatch[1];\n    const countStr = bracketContent.replace(/[\\t|]/g, '');\n    const count = parseInt(countStr, 10);\n\n    if (count === 0) {\n      return { value: [], linesConsumed: 1 };\n    }\n\n    // Check if list format\n    const nextLineIndex = startIndex + 1;\n    if (nextLineIndex < lines.length) {\n      const nextLine = lines[nextLineIndex];\n      const baseIndent = getIndentLevel(nextLine);\n      const content = nextLine.trim();\n\n      if (content.startsWith('- ') || content === '-') {\n        return parseListFormat(\n          lines,\n          nextLineIndex,\n          count,\n          baseIndent,\n          options,\n          depth\n        );\n      }\n    }\n\n    // Regular primitive array\n    const result: ToonValue[] = [];\n    let lineIndex = startIndex + 1;\n    const baseIndent = getIndentLevel(lines[lineIndex]);\n\n    while (result.length < count && lineIndex < lines.length) {\n      const line = lines[lineIndex];\n      if (line.trim() === '') {\n        // Strict mode: blank lines inside arrays not allowed\n        if (options.strict && result.length > 0 && result.length < count) {\n          throw new ToonDecodeError(\n            'Blank lines not allowed inside arrays in strict mode',\n            lineIndex + 1\n          );\n        }\n        lineIndex++;\n        continue;\n      }\n\n      const indent = getIndentLevel(line);\n      if (indent < baseIndent) break;\n\n      const value = parsePrimitive(line, lineIndex);\n      result.push(value);\n      lineIndex++;\n    }\n\n    return {\n      value: result,\n      linesConsumed: lineIndex - startIndex,\n    };\n  }\n\n  throw new ToonDecodeError('Invalid root array format', startIndex);\n}\n\n/**\n * Parse list format array (with hyphens)\n */\nfunction parseListFormat(\n  lines: string[],\n  startIndex: number,\n  count: number,\n  baseIndent: number,\n  options: DecodeOptions,\n  depth: number = 0\n): ParseResult {\n  const result: ToonValue[] = [];\n  let lineIndex = startIndex;\n\n  while (result.length < count && lineIndex < lines.length) {\n    const line = lines[lineIndex];\n\n    // Check for blank lines\n    if (line.trim() === '') {\n      // In strict mode, blank lines inside arrays are not allowed\n      if (options.strict && result.length > 0 && result.length < count) {\n        throw new ToonDecodeError(\n          'Blank lines not allowed inside arrays in strict mode',\n          lineIndex + 1\n        );\n      }\n      lineIndex++;\n      continue;\n    }\n\n    const indent = getIndentLevel(line);\n    const content = line.trim();\n\n    // Check for list item marker\n    if (indent === baseIndent && content.startsWith('- ')) {\n      const itemContent = content.slice(2).trim();\n\n      // Section: Handle empty list item\n      if (itemContent === '') {\n        result.push({});\n        lineIndex++;\n        continue;\n      }\n\n      // Section: Handle inline array as list item\n      if (itemContent.match(/^\\[[^\\]]+\\]:/)) {\n        const parsed = parseRootArray(\n          itemContent,\n          lines,\n          lineIndex,\n          options,\n          depth\n        );\n        result.push(parsed.value);\n        lineIndex += parsed.linesConsumed;\n        continue;\n      }\n\n      // Section: Handle object with first field on hyphen line\n      if (itemContent.includes(':')) {\n        const obj: Record<string, ToonValue> = {};\n\n        // Section: Check if first field is an inline array\n        if (itemContent.match(/^(\"([^\"\\\\]|\\\\.)*\"|\\w+)\\[[^\\]]+\\]:\\s*\\S+/)) {\n          const parsed = parseInlineArray(itemContent, lineIndex);\n          obj[parsed.key] = parsed.values;\n          lineIndex++;\n        }\n        // Section: Check if first field is tabular array\n        else if (\n          itemContent.match(/^(\"([^\"\\\\]|\\\\.)*\"|\\w+)\\[[^\\]]+\\]\\{[^}]+\\}:\\s*$/)\n        ) {\n          const keyResult = parseKey(itemContent);\n          if (keyResult) {\n            const parsed = parseTabular(\n              itemContent,\n              lines,\n              lineIndex,\n              options,\n              depth\n            );\n            obj[keyResult.key] = parsed.value;\n            lineIndex += parsed.linesConsumed;\n          } else {\n            lineIndex++;\n          }\n        }\n        // Section: Check if first field is multiline array\n        else if (itemContent.match(/^(\"([^\"\\\\]|\\\\.)*\"|\\w+)\\[[^\\]]+\\]:\\s*$/)) {\n          const keyResult = parseKey(itemContent);\n          if (keyResult) {\n            const parsed = parseArray(\n              itemContent,\n              lines,\n              lineIndex,\n              options,\n              depth\n            );\n            obj[keyResult.key] = parsed.value;\n            lineIndex += parsed.linesConsumed;\n          } else {\n            lineIndex++;\n          }\n        }\n        // Section: Regular key-value field\n        else {\n          const keyResult = parseKey(itemContent);\n          if (keyResult) {\n            const { key, rest } = keyResult;\n            const colonMatch = rest.match(/^:(.*)$/);\n\n            if (colonMatch) {\n              const valueStr = colonMatch[1].trim();\n\n              if (valueStr === '') {\n                // First field has nested value\n                const nestedStart = lineIndex + 1;\n                const nested = parseLines(\n                  lines,\n                  nestedStart,\n                  options,\n                  depth + 1\n                );\n                obj[key] = nested.value;\n                lineIndex = nestedStart + nested.linesConsumed;\n              } else {\n                // First field has inline value\n                obj[key] = parsePrimitive(valueStr, lineIndex);\n                lineIndex++;\n              }\n            } else {\n              lineIndex++;\n            }\n          } else {\n            lineIndex++;\n          }\n        }\n\n        // Parse additional fields at deeper indent\n        while (lineIndex < lines.length) {\n          const nextLine = lines[lineIndex];\n          if (nextLine.trim() === '') {\n            lineIndex++;\n            continue;\n          }\n\n          const nextIndent = getIndentLevel(nextLine);\n          if (nextIndent <= baseIndent) break;\n\n          const nextContent = nextLine.trim();\n\n          // Section: Check if field is inline array\n          if (nextContent.match(/^(\"([^\"\\\\]|\\\\.)*\"|\\w+)\\[[^\\]]+\\]:\\s*\\S+/)) {\n            const parsed = parseInlineArray(nextContent, lineIndex);\n            obj[parsed.key] = parsed.values;\n            lineIndex++;\n            continue;\n          }\n\n          // Section: Check if field is tabular array\n          if (\n            nextContent.match(/^(\"([^\"\\\\]|\\\\.)*\"|\\w+)\\[[^\\]]+\\]\\{[^}]+\\}:\\s*$/)\n          ) {\n            const keyResult = parseKey(nextContent);\n            if (keyResult) {\n              const parsed = parseTabular(\n                nextContent,\n                lines,\n                lineIndex,\n                options,\n                depth\n              );\n              obj[keyResult.key] = parsed.value;\n              lineIndex += parsed.linesConsumed;\n            } else {\n              break;\n            }\n            continue;\n          }\n\n          // Section: Check if field is multiline array\n          if (nextContent.match(/^(\"([^\"\\\\]|\\\\.)*\"|\\w+)\\[[^\\]]+\\]:\\s*$/)) {\n            const keyResult = parseKey(nextContent);\n            if (keyResult) {\n              const parsed = parseArray(\n                nextContent,\n                lines,\n                lineIndex,\n                options,\n                depth\n              );\n              obj[keyResult.key] = parsed.value;\n              lineIndex += parsed.linesConsumed;\n            } else {\n              break;\n            }\n            continue;\n          }\n\n          // Section: Regular key-value field\n          const nextKeyResult = parseKey(nextContent);\n          if (!nextKeyResult) break;\n\n          const { key: nextKey, rest: nextRest } = nextKeyResult;\n          const nextColonMatch = nextRest.match(/^:(.*)$/);\n          if (!nextColonMatch) break;\n\n          const nextValueStr = nextColonMatch[1].trim();\n          if (nextValueStr === '') {\n            const nestedStart = lineIndex + 1;\n            const nested = parseLines(lines, nestedStart, options, depth + 1);\n            obj[nextKey] = nested.value;\n            lineIndex = nestedStart + nested.linesConsumed;\n          } else {\n            obj[nextKey] = parsePrimitive(nextValueStr, lineIndex);\n            lineIndex++;\n          }\n        }\n\n        result.push(obj);\n        continue;\n      }\n\n      // Section: Handle primitive value\n      result.push(parsePrimitive(itemContent, lineIndex));\n      lineIndex++;\n      continue;\n    }\n\n    // Handle hyphen alone on line\n    if (indent === baseIndent && content === '-') {\n      result.push({});\n      lineIndex++;\n      continue;\n    }\n\n    // Unexpected content\n    lineIndex++;\n  }\n\n  // Section: Validate final count\n  if (result.length !== count) {\n    throw new ToonDecodeError(\n      `Array length mismatch: expected ${count}, got ${result.length}`,\n      startIndex\n    );\n  }\n\n  // Section: Check for extra items beyond count\n  if (lineIndex < lines.length) {\n    const nextLine = lines[lineIndex];\n    const nextIndent = getIndentLevel(nextLine);\n    const nextContent = nextLine.trim();\n    if (\n      nextIndent === baseIndent &&\n      (nextContent.startsWith('- ') || nextContent === '-')\n    ) {\n      throw new ToonDecodeError(\n        `Array length mismatch: expected ${count}, but found more items`,\n        lineIndex + 1\n      );\n    }\n  }\n\n  return {\n    value: result,\n    linesConsumed: lineIndex - startIndex,\n  };\n}\n\n/**\n * Parse array declaration\n */\nfunction parseArray(\n  header: string,\n  lines: string[],\n  startIndex: number,\n  options: DecodeOptions,\n  depth: number = 0\n): ParseResult {\n  // Check if tabular format\n  if (header.includes('{')) {\n    return parseTabular(header, lines, startIndex, options, depth);\n  }\n\n  // Parse key and bracket notation\n  const keyResult = parseKey(header);\n  if (!keyResult) {\n    throw new ToonDecodeError('Invalid array header', startIndex);\n  }\n\n  const { rest } = keyResult;\n  const bracketMatch = rest.match(/^\\[([^\\]]+)\\]:\\s*$/);\n  if (!bracketMatch) {\n    throw new ToonDecodeError('Invalid array header format', startIndex);\n  }\n\n  const bracketContent = bracketMatch[1];\n  const countStr = bracketContent.replace(/[\\t|]/g, '');\n  const count = parseInt(countStr, 10);\n\n  if (count === 0) {\n    return { value: [], linesConsumed: 1 };\n  }\n\n  // Check if next line uses list format (starts with hyphen)\n  const nextLineIndex = startIndex + 1;\n  if (nextLineIndex < lines.length) {\n    const nextLine = lines[nextLineIndex];\n    const baseIndent = getIndentLevel(nextLine);\n    const content = nextLine.trim();\n\n    if (content.startsWith('- ') || content === '-') {\n      const listResult = parseListFormat(\n        lines,\n        nextLineIndex,\n        count,\n        baseIndent,\n        options,\n        depth\n      );\n      // Adjust linesConsumed to include header line\n      return {\n        value: listResult.value,\n        linesConsumed: listResult.linesConsumed + 1,\n      };\n    }\n  }\n\n  // Regular primitive array\n  const result: ToonValue[] = [];\n  let lineIndex = startIndex + 1;\n  const baseIndent = getIndentLevel(lines[lineIndex]);\n\n  while (result.length < count && lineIndex < lines.length) {\n    const line = lines[lineIndex];\n    if (line.trim() === '') {\n      // Strict mode: blank lines inside arrays not allowed\n      if (options.strict && result.length > 0 && result.length < count) {\n        throw new ToonDecodeError(\n          'Blank lines not allowed inside arrays in strict mode',\n          lineIndex + 1\n        );\n      }\n      lineIndex++;\n      continue;\n    }\n\n    const indent = getIndentLevel(line);\n    if (indent < baseIndent) break;\n\n    const value = parsePrimitive(line, lineIndex);\n    result.push(value);\n    lineIndex++;\n  }\n\n  return {\n    value: result,\n    linesConsumed: lineIndex - startIndex,\n  };\n}\n\n/**\n * Parse lines into value\n */\nfunction parseLines(\n  lines: string[],\n  startIndex: number,\n  options: DecodeOptions,\n  depth: number = 0\n): ParseResult {\n  let lineIndex = startIndex;\n  const result: Record<string, ToonValue> = {};\n  const keyMetadata = new Map<string, boolean>();\n\n  // Section: Find base indentation\n  let baseIndent = -1;\n  for (let i = startIndex; i < lines.length; i++) {\n    if (lines[i].trim() !== '') {\n      baseIndent = getIndentLevel(lines[i]);\n      break;\n    }\n  }\n\n  if (baseIndent === -1) {\n    return { value: null, linesConsumed: 0 };\n  }\n\n  while (lineIndex < lines.length) {\n    const line = lines[lineIndex];\n\n    // Skip blank lines\n    if (line.trim() === '') {\n      lineIndex++;\n      continue;\n    }\n\n    const indent = getIndentLevel(line);\n\n    // End of current object\n    if (indent < baseIndent && lineIndex > startIndex) {\n      break;\n    }\n\n    // Only process lines at current indent level\n    if (indent !== baseIndent) {\n      lineIndex++;\n      continue;\n    }\n\n    const content = line.trim();\n\n    // Section: Handle inline arrays (with values after colon)\n    if (content.match(/^(\"([^\"\\\\]|\\\\.)*\"|[\\w.-]+)\\[[^\\]]+\\]:\\s*\\S+/)) {\n      const parsed = parseInlineArray(content, lineIndex);\n      const keyResult = parseKey(content);\n      if (keyResult) {\n        keyMetadata.set(parsed.key, keyResult.wasQuoted ?? false);\n      }\n      result[parsed.key] = parsed.values;\n      lineIndex++;\n      continue;\n    }\n\n    // Section: Handle tabular arrays\n    if (content.match(/^(\"([^\"\\\\]|\\\\.)*\"|[\\w.-]+)\\[[^\\]]+\\]\\{[^}]+\\}:\\s*$/)) {\n      const parsed = parseTabular(content, lines, lineIndex, options, depth);\n      const keyResult = parseKey(content);\n      if (keyResult) {\n        keyMetadata.set(keyResult.key, keyResult.wasQuoted ?? false);\n        result[keyResult.key] = parsed.value;\n      }\n      lineIndex += parsed.linesConsumed;\n      continue;\n    }\n\n    // Section: Handle arrays (multiline)\n    if (content.match(/^(\"([^\"\\\\]|\\\\.)*\"|[\\w.-]+)\\[[^\\]]+\\]:\\s*$/)) {\n      const parsed = parseArray(content, lines, lineIndex, options, depth);\n      const keyResult = parseKey(content);\n      if (keyResult) {\n        keyMetadata.set(keyResult.key, keyResult.wasQuoted ?? false);\n        result[keyResult.key] = parsed.value;\n      }\n      lineIndex += parsed.linesConsumed;\n      continue;\n    }\n\n    // Section: Handle key: value\n    if (content.includes(':')) {\n      const keyResult = parseKey(content);\n      if (!keyResult) {\n        lineIndex++;\n        continue;\n      }\n\n      const { key, rest } = keyResult;\n      const colonMatch = rest.match(/^:(.*)$/);\n      if (!colonMatch) {\n        throw new ToonDecodeError(\n          'Missing colon in key-value context',\n          lineIndex + 1\n        );\n      }\n\n      const valueStr = colonMatch[1].trim();\n\n      // Track if key was quoted\n      keyMetadata.set(key, keyResult.wasQuoted ?? false);\n\n      if (valueStr === '') {\n        // Nested object or empty object\n        const nestedStart = lineIndex + 1;\n        const nested = parseLines(lines, nestedStart, options, depth + 1);\n        // If nested returned null, it's an empty object\n        result[key] = nested.value === null ? {} : nested.value;\n        lineIndex = nestedStart + nested.linesConsumed;\n      } else {\n        // Primitive value\n        result[key] = parsePrimitive(valueStr, lineIndex);\n        lineIndex++;\n      }\n      continue;\n    }\n\n    // Standalone value - error in nested context\n    if (depth > 0) {\n      throw new ToonDecodeError(\n        'Missing colon in key-value context',\n        lineIndex + 1\n      );\n    }\n\n    lineIndex++;\n  }\n\n  // Section: Return result\n  const keys = Object.keys(result);\n  if (keys.length === 0) {\n    return { value: null, linesConsumed: lineIndex - startIndex };\n  }\n\n  return {\n    value: result,\n    linesConsumed: lineIndex - startIndex,\n    keyMetadata,\n  };\n}\n","/**\n * JSON <-> TOON converter\n */\nimport { encode as encodeCore } from './core/encoder.js';\nimport { decode as decodeCore } from './core/decoder.js';\nimport type { EncodeOptions, DecodeOptions } from './core/types.js';\n\n/**\n * Encode JSON string to TOON format\n */\nexport function encode(json: string, options?: EncodeOptions): string {\n  const obj = JSON.parse(json);\n  return encodeCore(obj, options);\n}\n\n/**\n * Decode TOON format to JSON string\n */\nexport function decode(toon: string, options?: DecodeOptions): string {\n  const obj = decodeCore(toon, options);\n  return JSON.stringify(obj);\n}\n"]}