{"version":3,"sources":["../../src/facade/stringify-document.ts"],"sourcesContent":["import Document from '../core/document';\r\nimport Definitions from '../core/definitions';\r\nimport InternetObject from '../core/internet-object';\r\nimport Collection from '../core/collection';\r\nimport Section from '../core/section';\r\nimport TypedefRegistry from '../schema/typedef-registry';\r\nimport MemberDef from '../schema/types/memberdef';\r\nimport { stringifyMemberDef } from '../schema/types/memberdef-stringify';\r\nimport { stringify, stringifyObject } from './stringify';\r\nimport { StringifyOptions } from './stringify';\r\nimport { IO_MARKERS, RESERVED_SECTION_NAMES, WILDCARD_KEY } from './serialization-constants';\r\nimport { formatRecord, formatCollection, createIndentString, FormatContext } from './io-formatter';\r\nimport { toObject } from './to-object';\r\n\r\n/**\r\n * Options for stringifying documents\r\n */\r\nexport interface StringifyDocumentOptions extends StringifyOptions {\r\n  /**\r\n   * Include header section with definitions\r\n   * Default: true (includes if header has definitions)\r\n   */\r\n  includeHeader?: boolean;\r\n\r\n  /**\r\n   * Include section names after '---' (e.g., '--- users')\r\n   * Default: true\r\n   */\r\n  includeSectionNames?: boolean;\r\n\r\n  /**\r\n   * Include only specific sections (by name)\r\n   * If not provided, includes all sections\r\n   */\r\n  sectionsFilter?: string[];\r\n\r\n  /**\r\n   * Format for definitions in header\r\n   * - 'io': Internet Object format (~ key: value)\r\n   * Default: 'io'\r\n   */\r\n  definitionsFormat?: 'io';\r\n}\r\n\r\n/**\r\n * Stringify a complete IODocument to Internet Object text format.\r\n *\r\n * This function serializes the entire document structure including:\r\n * - Header with definitions and schema\r\n * - All data sections\r\n * - Section separators and names\r\n *\r\n * @param doc - IODocument to stringify\r\n * @param options - Formatting and filtering options\r\n * @returns Internet Object text representation\r\n *\r\n * @example\r\n * ```typescript\r\n * // Stringify document with default options\r\n * const text = stringifyDocument(doc);\r\n * // Output:\r\n * // ~ appName: MyApp, ~ version: 1.0\r\n * // ---\r\n * // Alice, 28\r\n * // Bob, 35\r\n *\r\n * // Stringify with pretty printing\r\n * const text = stringifyDocument(doc, { indent: 2 });\r\n *\r\n * // Stringify specific sections only\r\n * const text = stringifyDocument(doc, {\r\n *   sectionsFilter: ['users', 'products']\r\n * });\r\n *\r\n * // Stringify without header\r\n * const text = stringifyDocument(doc, { includeHeader: false });\r\n * ```\r\n */\r\nexport function stringifyDocument(\r\n  doc: Document,\r\n  options: StringifyDocumentOptions = {}\r\n): string {\r\n  const parts: string[] = [];\r\n  const includeHeader = options.includeHeader ?? true;\r\n  const includeSectionNames = options.includeSectionNames ?? true;\r\n  const defFormat = options.definitionsFormat ?? 'io';\r\n\r\n  // Stringify header (includes definitions, schemas, variables)\r\n  if (includeHeader && doc.header) {\r\n    // Check if we're in schema-only mode (just $schema, no other definitions)\r\n    const isSchemaOnlyMode = doc.header.definitions?.defaultSchemaOnly ?? false;\r\n\r\n    if (isSchemaOnlyMode && doc.header.schema) {\r\n      // Schema-only mode: output bare schema line (backward compatible)\r\n      const schemaText = stringifySchema(doc.header.schema, { ...options, includeTypes: true });\r\n      if (schemaText) {\r\n        parts.push(schemaText);\r\n      }\r\n    } else if (doc.header.definitions && doc.header.definitions.length > 0) {\r\n      // Definitions mode: output all definitions (schemas, variables, metadata) in ~ format\r\n      const headerText = stringifyHeader(doc.header, defFormat, options);\r\n      if (headerText) {\r\n        parts.push(headerText);\r\n      }\r\n    } else if (doc.header.schema) {\r\n      // No definitions but has schema: output bare schema line\r\n      const schemaText = stringifySchema(doc.header.schema, { ...options, includeTypes: true });\r\n      if (schemaText) {\r\n        parts.push(schemaText);\r\n      }\r\n    }\r\n  }\r\n\r\n  // Stringify sections\r\n  if (doc.sections) {\r\n    const sectionCount = doc.sections.length;\r\n    const sectionsFilter = options.sectionsFilter;\r\n\r\n    for (let i = 0; i < sectionCount; i++) {\r\n      const section = doc.sections.get(i);\r\n      if (!section) continue;\r\n\r\n      // Apply section filter if provided\r\n      if (sectionsFilter && section.name) {\r\n        if (!sectionsFilter.includes(section.name)) {\r\n          continue;\r\n        }\r\n      }\r\n\r\n      // Add section separator with optional name and schema\r\n      // Note: Don't output schema reference for default schema ($schema) - it's implicit from header\r\n      const isDefaultSchema = section.schemaName === '$schema' || section.schemaName === 'schema';\r\n      const hasNamedSchema = section.schemaName && !isDefaultSchema;\r\n      // Treat reserved names as no name (parser defaults)\r\n      const hasRealName = section.name && !RESERVED_SECTION_NAMES.has(section.name);\r\n\r\n      // Determine if we need a section separator\r\n      // Skip --- when: no header, single section, no real name, no named schema\r\n      const needsSeparator = includeHeader || sectionCount > 1 || hasRealName || hasNamedSchema;\r\n\r\n      if (includeSectionNames && hasRealName) {\r\n        if (hasNamedSchema) {\r\n          // Include schema reference if section has a named schema\r\n          // Schema name might already start with $ - don't duplicate it\r\n          const schemaRef = section.schemaName!.startsWith('$') ? section.schemaName : `$${section.schemaName}`;\r\n          parts.push(`--- ${section.name}: ${schemaRef}`);\r\n        } else {\r\n          parts.push(`--- ${section.name}`);\r\n        }\r\n      } else if (hasNamedSchema) {\r\n        // No section name but has named schema - output schema only\r\n        const schemaRef = section.schemaName!.startsWith('$') ? section.schemaName : `$${section.schemaName}`;\r\n        parts.push(`--- ${schemaRef}`);\r\n      } else if (needsSeparator) {\r\n        // Output bare section separator only if needed\r\n        parts.push('---');\r\n      }\r\n      // else: skip separator entirely for data-only single section\r\n\r\n      // Stringify section data\r\n      // Always suppress type annotations inside data rows (positional output), regardless of includeTypes\r\n      const sectionText = stringifySection(section, doc.header.definitions, { ...options, includeTypes: false });\r\n      if (sectionText) {\r\n        parts.push(sectionText);\r\n      }\r\n    }\r\n  }\r\n\r\n  return parts.join('\\n');\r\n}\r\n\r\n/**\r\n * Stringify a schema to IO format\r\n */\r\nfunction stringifySchema(schema: any, options: StringifyOptions): string {\r\n  if (!schema || !schema.names || schema.names.length === 0) return '';\r\n\r\n  const includeTypes = options.includeTypes ?? false;\r\n  const parts: string[] = [];\r\n\r\n  for (const name of schema.names) {\r\n    const memberDef: MemberDef = schema.defs[name];\r\n    if (!memberDef) continue;\r\n\r\n    // Build field definition starting with the name\r\n    let fieldDef = name;\r\n\r\n    // Add optional marker (?) if the field is optional\r\n    if (memberDef.optional) {\r\n      fieldDef += '?';\r\n    }\r\n\r\n    // Add null marker (*) if the field is nullable\r\n    if (memberDef.null) {\r\n      fieldDef += '*';\r\n    }\r\n\r\n    // Delegate to stringifyMemberDef for type annotation\r\n    const typeAnnotation = stringifyMemberDef(memberDef, includeTypes);\r\n    if (typeAnnotation) {\r\n      fieldDef += `: ${typeAnnotation}`;\r\n    }\r\n\r\n    parts.push(fieldDef);\r\n  }\r\n\r\n  // Append wildcard open schema definition if present\r\n  if (schema.defs && schema.defs[WILDCARD_KEY]) {\r\n    const openDef: MemberDef = schema.defs[WILDCARD_KEY];\r\n    let wildcard = WILDCARD_KEY;\r\n    const typeAnnotation = stringifyMemberDef(openDef, includeTypes);\r\n    if (typeAnnotation) {\r\n      wildcard += `:${typeAnnotation}`;\r\n    }\r\n    parts.push(wildcard);\r\n  }\r\n\r\n  return parts.join(', ');\r\n}\r\n\r\n/**\r\n * Stringify document header with definitions\r\n */\r\nfunction stringifyHeader(\r\n  header: any,\r\n  format: 'io',\r\n  options: StringifyOptions\r\n): string {\r\n  if (!header.definitions) return '';\r\n\r\n  const defs = header.definitions;\r\n  const defParts: string[] = [];\r\n\r\n  // Iterate through all definitions: schemas, variables, and metadata\r\n  for (const [key, defValue] of defs.entries()) {\r\n    let formattedValue: string;\r\n\r\n    // Schema definitions: Format as ~ $schema: {name, age, address}\r\n    if (defValue.isSchema) {\r\n      const schemaValue = defValue.value;\r\n\r\n      // Handle schema alias (e.g., $user: $employee) - value is a TokenNode reference\r\n      if (schemaValue && typeof schemaValue === 'object' && 'value' in schemaValue && 'type' in schemaValue) {\r\n        // It's a TokenNode - check if it's a schema reference\r\n        if (typeof schemaValue.value === 'string' && schemaValue.value.startsWith('$')) {\r\n          formattedValue = schemaValue.value; // Output as $employee\r\n        } else {\r\n          // Non-reference TokenNode - try to stringify\r\n          const schemaText = stringifySchema(schemaValue, { ...options, includeTypes: true });\r\n          formattedValue = schemaText ? `{${schemaText}}` : '{}';\r\n        }\r\n      } else {\r\n        // It's a Schema instance - use stringifySchema to format the schema structure\r\n        const schemaText = stringifySchema(schemaValue, { ...options, includeTypes: true });\r\n        formattedValue = schemaText ? `{${schemaText}}` : '{}';\r\n      }\r\n    }\r\n    // Variables and regular definitions: Format as ~ key: value\r\n    else {\r\n      let value = defValue.value;\r\n      // If value is a TokenNode, extract its actual value\r\n      if (value && typeof value === 'object' && 'value' in value && 'type' in value) {\r\n        value = value.value;\r\n      }\r\n      formattedValue = stringifyHeaderValue(value);\r\n    }\r\n\r\n    defParts.push(`~ ${key}: ${formattedValue}`);\r\n  }\r\n\r\n  if (defParts.length === 0) return '';\r\n\r\n  return defParts.join('\\n');\r\n}\r\n\r\n/**\r\n * Stringify a section's data\r\n */\r\nfunction stringifySection(\r\n  section: Section,\r\n  defs: Definitions,\r\n  options: StringifyOptions\r\n): string {\r\n  const data = section.data;\r\n\r\n  if (!data) return '';\r\n\r\n  // Get schema for this section\r\n  const schemaName = section.schemaName;\r\n  const schema = schemaName ? defs.getV(schemaName) : defs.defaultSchema;\r\n\r\n  // Create formatting context\r\n  const indentStr = createIndentString(options.indent);\r\n  const ctx: FormatContext = {\r\n    indentStr,\r\n    level: 0,\r\n    defs,\r\n    isNested: false\r\n  };\r\n\r\n  // Collections should be serialized using IO '~' items for parser compatibility\r\n  if (data instanceof Collection) {\r\n    const lines: string[] = [];\r\n    for (const item of data) {\r\n      if (options.skipErrors && item && typeof item === 'object' && (item as any).__error === true) {\r\n        continue;\r\n      }\r\n      if (item instanceof InternetObject) {\r\n        // Use formatter for smart formatting\r\n        const line = formatRecord(item, schema, ctx);\r\n        lines.push(`~ ${line}`);\r\n      } else {\r\n        // Fallback for non-IO items\r\n        lines.push(`~ ${JSON.stringify(item)}`);\r\n      }\r\n    }\r\n    return lines.join('\\n');\r\n  }\r\n\r\n  // Single object/value: use formatter for smart formatting\r\n  if (data instanceof InternetObject) {\r\n    return formatRecord(data, schema, ctx);\r\n  }\r\n\r\n  return stringifyObject(data, schema, defs, options);\r\n}\r\n\r\n/**\r\n * Infer the Internet Object type from a JavaScript value.\r\n * Maps JS types to IO type names for TypedefRegistry lookup.\r\n * Only handles JSON-compatible types plus Date.\r\n *\r\n * @throws Error for non-serializable types (bigint, symbol, function, etc.)\r\n */\r\nfunction inferIOType(value: any): string {\r\n  // null/undefined\r\n  if (value === null || value === undefined) {\r\n    throw new Error(`Cannot serialize null/undefined values in header definitions`);\r\n  }\r\n\r\n  // JSON primitive types\r\n  if (typeof value === 'boolean') return 'bool';\r\n  if (typeof value === 'number') {\r\n    if (!Number.isFinite(value)) {\r\n      throw new Error(`Cannot serialize non-finite number: ${value}`);\r\n    }\r\n    return 'number';\r\n  }\r\n  if (typeof value === 'string') return 'string';\r\n\r\n  // Date/DateTime (IO extension to JSON)\r\n  if (value instanceof Date) return 'date';\r\n\r\n  // JSON array\r\n  if (Array.isArray(value)) return 'array';\r\n\r\n  // JSON object (plain objects only)\r\n  if (typeof value === 'object' && value.constructor === Object) return 'object';\r\n\r\n  // Non-serializable types\r\n  const type = typeof value;\r\n  if (type === 'bigint' || type === 'symbol' || type === 'function') {\r\n    throw new Error(`Cannot serialize type '${type}' in header definitions`);\r\n  }\r\n\r\n  // Unknown object types (class instances, etc.)\r\n  throw new Error(`Cannot serialize non-plain object of type '${value.constructor?.name || 'Unknown'}' in header definitions`);\r\n}\r\n\r\n/**\r\n * Stringify a header definition value using the type system.\r\n * Infers the IO type and delegates to the appropriate TypeDef.stringify().\r\n *\r\n * @throws Error for non-serializable types or unregistered types\r\n */\r\nfunction stringifyHeaderValue(value: any): string {\r\n  // Handle null/undefined - these are not allowed in header definitions\r\n  // Use empty string or default value if needed\r\n  if (value === null || value === undefined) {\r\n    throw new Error(`Header definition values cannot be null or undefined`);\r\n  }\r\n\r\n  // Infer the IO type from the JS value (throws for non-serializable types)\r\n  const ioType = inferIOType(value);\r\n\r\n  // Check if type is registered and get the TypeDef\r\n  if (!TypedefRegistry.isRegisteredType(ioType)) {\r\n    throw new Error(`Type '${ioType}' is not registered in TypedefRegistry`);\r\n  }\r\n\r\n  const typeDef = TypedefRegistry.get(ioType);\r\n\r\n  if (!typeDef || !('stringify' in typeDef) || typeof typeDef.stringify !== 'function') {\r\n    throw new Error(`TypeDef for '${ioType}' does not have a stringify method`);\r\n  }\r\n\r\n  // Create a minimal MemberDef for the TypeDef.stringify() call\r\n  const memberDef: MemberDef = {\r\n    type: ioType,\r\n    path: '',\r\n    optional: false,\r\n    null: false,\r\n    // Use auto format for strings - will quote when needed to preserve type\r\n    format: ioType === 'string' ? 'auto' : undefined,\r\n    escapeLines: false,\r\n    encloser: '\"'\r\n  } as any;\r\n\r\n  return (typeDef.stringify as any)(value, memberDef);\r\n}\r\n\r\n/**\r\n * Create document from plain JavaScript object\r\n * Alias for loadDocument for consistency\r\n *\r\n * @param data - Plain JavaScript object\r\n * @param options - Load options\r\n * @returns IODocument\r\n */\r\nexport { loadDocument as documentFromObject } from './load-document';\r\n"],"mappings":"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","names":["Collection","InternetObject","TypedefRegistry"]}