{"version":3,"sources":["../../src/facade/io-formatter.ts"],"sourcesContent":["/**\r\n * IO Formatter - Smart formatting for Internet Object output\r\n *\r\n * Formatting Rules:\r\n * 1. Simple objects (primitives only) stay inline: { a, b, c }\r\n * 2. Arrays of primitives stay inline: [ a, b, c ]\r\n * 3. Arrays of objects expand with one item per line\r\n * 4. Complex objects (with nested arrays of objects) may expand\r\n * 5. Line breaks happen BEFORE opening [ when array expands, NOT after closing }\r\n *\r\n * Key insight: After closing }, the next value continues on same line.\r\n * Line breaks only occur BEFORE [ when it needs to expand.\r\n *\r\n * @module io-formatter\r\n */\r\n\r\nimport Definitions from '../core/definitions';\r\nimport InternetObject from '../core/internet-object';\r\nimport Schema from '../schema/schema';\r\nimport MemberDef from '../schema/types/memberdef';\r\nimport TypedefRegistry from '../schema/typedef-registry';\r\nimport { IO_MARKERS } from './serialization-constants';\r\n\r\n/**\r\n * Formatting context passed through recursive calls\r\n */\r\nexport interface FormatContext {\r\n  /** Indentation string (e.g., '  ' for 2 spaces) */\r\n  indentStr: string;\r\n  /** Current indentation level */\r\n  level: number;\r\n  /** Definitions for variable/schema resolution */\r\n  defs?: Definitions;\r\n  /** Whether we're inside a nested structure (affects expansion decisions) */\r\n  isNested: boolean;\r\n}\r\n\r\n/**\r\n * Create indent string from options\r\n */\r\nexport function createIndentString(indent: number | string | undefined): string {\r\n  if (indent === undefined) return '';\r\n  if (typeof indent === 'number') return ' '.repeat(indent);\r\n  return indent;\r\n}\r\n\r\n/**\r\n * Get current indentation\r\n */\r\nfunction getIndent(ctx: FormatContext): string {\r\n  return ctx.indentStr.repeat(ctx.level);\r\n}\r\n\r\n/**\r\n * Check if a value is a primitive (not object or array)\r\n */\r\nfunction isPrimitive(val: any): boolean {\r\n  if (val === null || val === undefined) return true;\r\n  if (typeof val === 'boolean' || typeof val === 'number' || typeof val === 'string') return true;\r\n  if (val instanceof Date) return true;\r\n  return false;\r\n}\r\n\r\n/**\r\n * Check if an array contains only primitive values\r\n */\r\nfunction isArrayOfPrimitives(arr: any[]): boolean {\r\n  return arr.every(item => isPrimitive(item));\r\n}\r\n\r\n/**\r\n * Check if an array contains objects (should expand when formatted)\r\n */\r\nfunction isArrayOfObjects(arr: any[]): boolean {\r\n  return arr.some(item => {\r\n    if (item === null || item === undefined) return false;\r\n    if (typeof item === 'object' && !(item instanceof Date)) return true;\r\n    return false;\r\n  });\r\n}\r\n\r\n/**\r\n * Check if an object directly contains a nested object (not just primitives)\r\n * This is used to determine if an object should expand.\r\n * An object expands if it contains nested objects or arrays of objects.\r\n */\r\nfunction hasNestedStructure(obj: any): boolean {\r\n  if (obj === null || typeof obj !== 'object') return false;\r\n  if (obj instanceof Date) return false;\r\n  if (Array.isArray(obj)) return isArrayOfObjects(obj);\r\n\r\n  // Check all values - handle both InternetObject and plain objects\r\n  const entries = obj instanceof InternetObject ? obj.entries() : Object.entries(obj);\r\n  for (const [key, val] of entries) {\r\n    if (!key) continue;\r\n    // Check if this value is a non-primitive (object or array)\r\n    if (typeof val === 'object' && val !== null && !(val instanceof Date)) {\r\n      return true; // Has nested structure\r\n    }\r\n  }\r\n  return false;\r\n}\r\n\r\n/**\r\n * Check if an object is \"simple\" (contains only primitives, no nested structures)\r\n * Used for determining if inline formatting is appropriate\r\n */\r\nfunction isSimpleObject(obj: any): boolean {\r\n  return !hasNestedStructure(obj);\r\n}\r\n\r\n/**\r\n * Stringify a primitive value\r\n */\r\nfunction stringifyPrimitive(val: any, defs?: Definitions): string {\r\n  if (val === null) return IO_MARKERS.NULL;\r\n  if (val === undefined) return IO_MARKERS.NULL;\r\n\r\n  if (typeof val === 'boolean') {\r\n    return val ? IO_MARKERS.TRUE : IO_MARKERS.FALSE;\r\n  }\r\n\r\n  if (typeof val === 'number') {\r\n    return String(val);\r\n  }\r\n\r\n  if (typeof val === 'string') {\r\n    const stringDef = TypedefRegistry.get('string');\r\n    if (stringDef && 'stringify' in stringDef && typeof stringDef.stringify === 'function') {\r\n      const memberDef: MemberDef = {\r\n        type: 'string',\r\n        path: '',\r\n        optional: false,\r\n        null: false,\r\n        format: 'auto',\r\n        escapeLines: false,\r\n        encloser: '\"'\r\n      } as any;\r\n      return stringDef.stringify(val, memberDef) ?? val;\r\n    }\r\n    return val;\r\n  }\r\n\r\n  if (val instanceof Date) {\r\n    const dateDef = TypedefRegistry.get('datetime');\r\n    if (dateDef && 'stringify' in dateDef && typeof dateDef.stringify === 'function') {\r\n      return (dateDef.stringify as any)(val, { type: 'datetime' }) ?? val.toISOString();\r\n    }\r\n    // Fallback\r\n    return `dt'${val.toISOString()}'`;\r\n  }\r\n\r\n  return String(val);\r\n}\r\n\r\n/**\r\n * Format an array with smart expansion\r\n * - Arrays of primitives stay inline: [ a, b, c ]\r\n * - Arrays of objects expand with one item per line\r\n */\r\nfunction formatArray(arr: any[], ctx: FormatContext, schema?: Schema): string {\r\n  if (arr.length === 0) return '[]';\r\n\r\n  const isFormatted = ctx.indentStr.length > 0;\r\n  const shouldExpand = isFormatted && isArrayOfObjects(arr);\r\n\r\n  const parts: string[] = [];\r\n  for (const item of arr) {\r\n    if (shouldExpand && typeof item === 'object' && item !== null && !(item instanceof Date)) {\r\n      // For expanded arrays, format each object inline (wrapped in braces)\r\n      parts.push(formatNestedObject(item, { ...ctx, isNested: true, level: ctx.level + 1 }, schema));\r\n    } else {\r\n      parts.push(formatValue(item, { ...ctx, isNested: true }, schema));\r\n    }\r\n  }\r\n\r\n  if (shouldExpand) {\r\n    // Expand: each item on its own line\r\n    const innerIndent = getIndent({ ...ctx, level: ctx.level + 1 });\r\n    const closingIndent = getIndent(ctx);\r\n    return '[\\n' + parts.map(p => innerIndent + p).join(',\\n') + '\\n' + closingIndent + ']';\r\n  } else {\r\n    // Inline: add spaces inside brackets when formatted\r\n    if (isFormatted) {\r\n      return '[ ' + parts.join(', ') + ' ]';\r\n    }\r\n    return '[' + parts.join(', ') + ']';\r\n  }\r\n}\r\n\r\n/**\r\n * Format a nested object (always wrapped in braces, stays inline)\r\n * This is for objects inside arrays or as field values\r\n */\r\nfunction formatNestedObject(obj: any, ctx: FormatContext, schema?: Schema): string {\r\n  if (obj === null) return IO_MARKERS.NULL;\r\n  if (obj instanceof Date) return stringifyPrimitive(obj, ctx.defs);\r\n\r\n  const isFormatted = ctx.indentStr.length > 0;\r\n  const parts: string[] = [];\r\n\r\n  // Handle InternetObject\r\n  if (obj instanceof InternetObject) {\r\n    if (schema && schema.names && Array.isArray(schema.names)) {\r\n      for (const name of schema.names) {\r\n        if (!obj.has(name)) continue;\r\n        const val = obj.get(name);\r\n        if (val === undefined) continue;\r\n        const memberDef = schema.defs[name];\r\n        parts.push(formatValueWithMemberDef(val, memberDef, { ...ctx, isNested: true }));\r\n      }\r\n    } else {\r\n      for (const [key, val] of obj.entries()) {\r\n        if (!key || val === undefined) continue;\r\n        parts.push(formatValue(val, { ...ctx, isNested: true }));\r\n      }\r\n    }\r\n  } else {\r\n    // Plain object\r\n    for (const key in obj) {\r\n      if (!obj.hasOwnProperty(key)) continue;\r\n      const val = obj[key];\r\n      if (val === undefined) continue;\r\n      parts.push(formatValue(val, { ...ctx, isNested: true }));\r\n    }\r\n  }\r\n\r\n  // Nested objects always stay inline\r\n  if (isFormatted) {\r\n    return '{ ' + parts.join(', ') + ' }';\r\n  }\r\n  return '{' + parts.join(', ') + '}';\r\n}\r\n\r\n/**\r\n * Format an object at the field level (for complex objects that need expansion)\r\n * This handles the case where an object contains arrays of objects\r\n */\r\nfunction formatComplexObject(obj: any, ctx: FormatContext, schema?: Schema): string {\r\n  if (obj === null) return IO_MARKERS.NULL;\r\n\r\n  const isFormatted = ctx.indentStr.length > 0;\r\n  const parts: string[] = [];\r\n\r\n  // Handle InternetObject\r\n  if (obj instanceof InternetObject) {\r\n    if (schema && schema.names && Array.isArray(schema.names)) {\r\n      for (const name of schema.names) {\r\n        if (!obj.has(name)) continue;\r\n        const val = obj.get(name);\r\n        if (val === undefined) continue;\r\n        const memberDef = schema.defs[name];\r\n        parts.push(formatValueWithMemberDef(val, memberDef, { ...ctx, isNested: true, level: ctx.level + 1 }));\r\n      }\r\n    } else {\r\n      for (const [key, val] of obj.entries()) {\r\n        if (!key || val === undefined) continue;\r\n        parts.push(formatValue(val, { ...ctx, isNested: true, level: ctx.level + 1 }));\r\n      }\r\n    }\r\n  } else {\r\n    // Plain object\r\n    for (const key in obj) {\r\n      if (!obj.hasOwnProperty(key)) continue;\r\n      const val = obj[key];\r\n      if (val === undefined) continue;\r\n      parts.push(formatValue(val, { ...ctx, isNested: true, level: ctx.level + 1 }));\r\n    }\r\n  }\r\n\r\n  // Complex object: expand with content on indented line\r\n  if (isFormatted) {\r\n    const innerIndent = getIndent({ ...ctx, level: ctx.level + 1 });\r\n    const closingIndent = getIndent(ctx);\r\n    return '{\\n' + innerIndent + parts.join(', ') + '\\n' + closingIndent + '}';\r\n  }\r\n  return '{' + parts.join(', ') + '}';\r\n}\r\n\r\n/**\r\n * Format any value (for nested contexts)\r\n */\r\nfunction formatValue(val: any, ctx: FormatContext, schema?: Schema): string {\r\n  if (isPrimitive(val)) {\r\n    return stringifyPrimitive(val, ctx.defs);\r\n  }\r\n\r\n  if (Array.isArray(val)) {\r\n    return formatArray(val, ctx, schema);\r\n  }\r\n\r\n  // Object - format inline (nested objects stay inline)\r\n  return formatNestedObject(val, ctx, schema);\r\n}\r\n\r\n/**\r\n * Format a value using its MemberDef for type-aware stringification\r\n */\r\nfunction formatValueWithMemberDef(val: any, memberDef: MemberDef | undefined, ctx: FormatContext): string {\r\n  if (!memberDef) {\r\n    return formatValue(val, ctx);\r\n  }\r\n\r\n  // Handle null/undefined\r\n  if (val === null) return IO_MARKERS.NULL;\r\n  if (val === undefined) return '';\r\n\r\n  const typeDef = TypedefRegistry.get(memberDef.type);\r\n\r\n  // For object type with nested arrays of objects, we may need special handling\r\n  if (memberDef.type === 'object' && typeof val === 'object' && !Array.isArray(val) && !(val instanceof Date)) {\r\n    // Check if this object is simple or complex\r\n    const simple = isSimpleObject(val);\r\n    if (!simple && !ctx.isNested) {\r\n      return formatComplexObject(val, ctx, memberDef.schema);\r\n    }\r\n    return formatNestedObject(val, ctx, memberDef.schema);\r\n  }\r\n\r\n  // For array type\r\n  if (memberDef.type === 'array' && Array.isArray(val)) {\r\n    const itemSchema = memberDef.of instanceof Schema ? memberDef.of : undefined;\r\n    return formatArray(val, ctx, itemSchema);\r\n  }\r\n\r\n  // For other types, use the TypeDef's stringify method\r\n  if (typeDef && 'stringify' in typeDef && typeof typeDef.stringify === 'function') {\r\n    const result = typeDef.stringify(val, memberDef, ctx.defs);\r\n    return result ?? '';\r\n  }\r\n\r\n  return formatValue(val, ctx);\r\n}\r\n\r\n/**\r\n * Information about a formatted field part\r\n */\r\ninterface FieldPart {\r\n  /** The formatted string value */\r\n  value: string;\r\n  /** Whether this is an array that expands (arrays of objects) */\r\n  expandsArray: boolean;\r\n  /** Whether this is a complex object that expands */\r\n  expandsObject: boolean;\r\n}\r\n\r\n/**\r\n * Format a top-level record (row of data)\r\n * This is the main entry point for formatting a single record.\r\n *\r\n * The formatting logic follows these rules:\r\n * - Simple values and inline objects stay on the same line\r\n * - Line breaks happen BEFORE [ when an array of objects expands\r\n * - After } closes, the next value continues on the same line (no line break after })\r\n * - Complex objects (containing arrays of objects) expand with content indented\r\n */\r\nexport function formatRecord(\r\n  obj: InternetObject | any,\r\n  schema: Schema | undefined,\r\n  ctx: FormatContext\r\n): string {\r\n  const isFormatted = ctx.indentStr.length > 0;\r\n\r\n  // Build all parts first, tracking which need expansion\r\n  const parts: FieldPart[] = [];\r\n  const handled = new Set<string>();\r\n\r\n  // Helper to check if schema is valid\r\n  const hasValidSchema = schema && schema.names && Array.isArray(schema.names);\r\n\r\n  if (obj instanceof InternetObject) {\r\n    if (hasValidSchema) {\r\n      for (const name of schema!.names) {\r\n        const memberDef = schema!.defs[name];\r\n        const hasValue = obj.has(name);\r\n\r\n        if (hasValue) {\r\n          const val = obj.get(name);\r\n          if (val === undefined) {\r\n            // Explicit undefined - add empty placeholder\r\n            parts.push({ value: '', expandsArray: false, expandsObject: false });\r\n          } else {\r\n            // Check expansion needs\r\n            const expandsArray = isFormatted && Array.isArray(val) && isArrayOfObjects(val);\r\n            const expandsObject = isFormatted && !Array.isArray(val) &&\r\n              typeof val === 'object' && val !== null && !(val instanceof Date) && !isSimpleObject(val);\r\n\r\n            const formatted = formatValueWithMemberDef(val, memberDef, { ...ctx, isNested: false });\r\n            parts.push({ value: formatted, expandsArray, expandsObject });\r\n          }\r\n        } else {\r\n          // Missing optional member with no default: preserve positional placeholder\r\n          const md = memberDef as any;\r\n          if (md?.optional && md?.default === undefined) {\r\n            parts.push({ value: '', expandsArray: false, expandsObject: false });\r\n          }\r\n        }\r\n        handled.add(name);\r\n      }\r\n\r\n      // Trim trailing empty values (missing optional fields at the end)\r\n      while (parts.length > 0 && parts[parts.length - 1].value === '') {\r\n        parts.pop();\r\n      }\r\n\r\n      // Append any additional properties (wildcard or open schema extras)\r\n      for (const [key, val] of obj.entries()) {\r\n        if (!key) continue;\r\n        if (handled.has(key)) continue;\r\n\r\n        const memberDef = schema!.defs[key];\r\n        const expandsArray = isFormatted && Array.isArray(val) && isArrayOfObjects(val);\r\n        const expandsObject = isFormatted && !Array.isArray(val) &&\r\n          typeof val === 'object' && val !== null && !(val instanceof Date) && !isSimpleObject(val);\r\n\r\n        // Extra properties retain their key label\r\n        const formatted = memberDef\r\n          ? formatValueWithMemberDef(val, memberDef, { ...ctx, isNested: false })\r\n          : formatValue(val, { ...ctx, isNested: false });\r\n        parts.push({ value: `${key}: ${formatted}`, expandsArray, expandsObject });\r\n      }\r\n    } else {\r\n      for (const [key, val] of obj.entries()) {\r\n        if (!key || val === undefined) continue;\r\n\r\n        const expandsArray = isFormatted && Array.isArray(val) && isArrayOfObjects(val);\r\n        const expandsObject = isFormatted && !Array.isArray(val) &&\r\n          typeof val === 'object' && val !== null && !(val instanceof Date) && !isSimpleObject(val);\r\n\r\n        const formatted = formatValue(val, { ...ctx, isNested: false });\r\n        parts.push({ value: formatted, expandsArray, expandsObject });\r\n      }\r\n    }\r\n  } else if (typeof obj === 'object' && obj !== null) {\r\n    // Plain object\r\n    const keys = hasValidSchema ? schema!.names.filter(n => n in obj) : Object.keys(obj);\r\n    for (const key of keys) {\r\n      const val = obj[key];\r\n      if (val === undefined) continue;\r\n\r\n      const expandsArray = isFormatted && Array.isArray(val) && isArrayOfObjects(val);\r\n      const expandsObject = isFormatted && !Array.isArray(val) &&\r\n        typeof val === 'object' && val !== null && !(val instanceof Date) && !isSimpleObject(val);\r\n\r\n      const memberDef = hasValidSchema ? schema!.defs[key] : undefined;\r\n      const formatted = memberDef\r\n        ? formatValueWithMemberDef(val, memberDef, { ...ctx, isNested: false })\r\n        : formatValue(val, { ...ctx, isNested: false });\r\n      parts.push({ value: formatted, expandsArray, expandsObject });\r\n    }\r\n  }\r\n\r\n  if (!isFormatted || parts.length === 0) {\r\n    // Compact mode: just join with ', '\r\n    return parts.map(p => p.value).join(', ');\r\n  }\r\n\r\n  // Formatted mode: smart line breaks\r\n  // Key rule: Line breaks happen BEFORE [ (expanding arrays), NOT after }\r\n  // After a complex object closes with }, the next value stays on same line\r\n  const segments: string[] = [];\r\n  let currentSegment: string[] = [];\r\n\r\n  for (let i = 0; i < parts.length; i++) {\r\n    const part = parts[i];\r\n\r\n    if (part.expandsArray) {\r\n      // Array that expands - collect current segment, then add array\r\n      // The array content will have its own line breaks inside\r\n      if (currentSegment.length > 0) {\r\n        // Join current segment, add comma, then the expanding array on same line\r\n        segments.push(currentSegment.join(', ') + ', ' + part.value);\r\n        currentSegment = [];\r\n      } else {\r\n        segments.push(part.value);\r\n      }\r\n    } else if (part.expandsObject) {\r\n      // Complex object that expands\r\n      // Add to current, then flush (line break will be after this object closes)\r\n      currentSegment.push(part.value);\r\n      segments.push(currentSegment.join(', '));\r\n      currentSegment = [];\r\n    } else {\r\n      // Simple value - add to current segment\r\n      currentSegment.push(part.value);\r\n    }\r\n  }\r\n\r\n  // Flush remaining\r\n  if (currentSegment.length > 0) {\r\n    segments.push(currentSegment.join(', '));\r\n  }\r\n\r\n  // Join segments - each segment ends where a line break is appropriate\r\n  // But we want line breaks BEFORE expanding structures, not after closing }\r\n  // So we join with ', ' (comma continues on same line)\r\n  return segments.join(', ');\r\n}\r\n\r\n/**\r\n * Format a collection of records\r\n */\r\nexport function formatCollection(\r\n  items: any[],\r\n  schema: Schema | undefined,\r\n  ctx: FormatContext,\r\n  asTopLevel: boolean = true\r\n): string {\r\n  if (items.length === 0) return asTopLevel ? '' : '[]';\r\n\r\n  const parts: string[] = [];\r\n\r\n  for (const item of items) {\r\n    if (item instanceof InternetObject || (typeof item === 'object' && item !== null)) {\r\n      parts.push(formatRecord(item, schema, ctx));\r\n    } else {\r\n      parts.push(formatValue(item, ctx));\r\n    }\r\n  }\r\n\r\n  if (asTopLevel) {\r\n    // Top-level collection uses ~ prefix for each item\r\n    return parts.map(p => `~ ${p}`).join('\\n');\r\n  } else {\r\n    // Nested collection as array (shouldn't typically happen, but handle it)\r\n    const isFormatted = ctx.indentStr.length > 0;\r\n    if (isFormatted) {\r\n      const innerIndent = getIndent({ ...ctx, level: ctx.level + 1 });\r\n      const closingIndent = getIndent(ctx);\r\n      return '[\\n' + parts.map(p => innerIndent + '{ ' + p + ' }').join(',\\n') + '\\n' + closingIndent + ']';\r\n    }\r\n    return '[' + parts.map(p => '{' + p + '}').join(', ') + ']';\r\n  }\r\n}\r\n"],"mappings":"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","names":["InternetObject","TypedefRegistry","Schema"]}