{"version":3,"sources":["../../src/facade/load-document.ts"],"sourcesContent":["import Document from '../core/document';\r\nimport Header from '../core/header';\r\nimport Section from '../core/section';\r\nimport SectionCollection from '../core/section-collection';\r\nimport Definitions from '../core/definitions';\r\nimport InternetObject from '../core/internet-object';\r\nimport Collection from '../core/collection';\r\nimport Schema from '../schema/schema';\r\nimport { loadObject, loadCollection } from '../schema/load-processor';\r\nimport { compileSchema } from '../schema';\r\n\r\n/**\r\n * Options for loading documents\r\n */\r\nexport interface LoadDocumentOptions {\r\n  /**\r\n   * Schema to use for all sections (if not specified per section)\r\n   */\r\n  defaultSchema?: string | Schema;\r\n\r\n  /**\r\n   * Schema mapping for named sections\r\n   * Example: { users: userSchema, products: productSchema }\r\n   */\r\n  sectionSchemas?: { [sectionName: string]: string | Schema };\r\n\r\n  /**\r\n   * External definitions to merge with document definitions\r\n   */\r\n  definitions?: Definitions;\r\n\r\n  /**\r\n   * Collect validation errors instead of throwing\r\n   */\r\n  errorCollector?: Error[];\r\n\r\n  /**\r\n   * Strict mode - throw on first error\r\n   * Default: false (collect all errors)\r\n   */\r\n  strict?: boolean;\r\n}\r\n\r\n/**\r\n * Document data structure for loading\r\n */\r\nexport interface DocumentData {\r\n  /**\r\n   * Header definitions (variables, schemas, etc.)\r\n   */\r\n  header?: {\r\n    definitions?: { [key: string]: any };\r\n    schema?: string | Schema;\r\n  };\r\n\r\n  /**\r\n   * Data sections - can be:\r\n   * - Single unnamed section (data directly)\r\n   * - Named sections ({ sectionName: data })\r\n   */\r\n  data?: any;\r\n\r\n  /**\r\n   * Alternative: explicitly named sections\r\n   */\r\n  sections?: { [name: string]: any };\r\n}\r\n\r\n/**\r\n * Load and validate a complete IODocument from plain JavaScript data.\r\n *\r\n * This function creates a full IODocument structure with header (definitions, schema)\r\n * and data sections, validating all data according to the provided schemas.\r\n *\r\n * @param data - Document data with header and sections\r\n * @param options - Loading options (schemas, definitions, error handling)\r\n * @returns Validated IODocument\r\n * @throws ValidationError if data doesn't conform to schemas (in strict mode)\r\n *\r\n * @example\r\n * ```typescript\r\n * // Load document with single section\r\n * const docData = {\r\n *   header: {\r\n *     definitions: { appName: 'MyApp', version: '1.0' }\r\n *   },\r\n *   data: [\r\n *     { name: 'Alice', age: 28 },\r\n *     { name: 'Bob', age: 35 }\r\n *   ]\r\n * };\r\n * const doc = loadDocument(docData, {\r\n *   defaultSchema: '{ name: string, age: number }'\r\n * });\r\n *\r\n * // Load document with multiple named sections\r\n * const docData = {\r\n *   header: {\r\n *     schema: userSchema\r\n *   },\r\n *   sections: {\r\n *     users: [{ name: 'Alice' }, { name: 'Bob' }],\r\n *     admins: [{ name: 'Admin' }]\r\n *   }\r\n * };\r\n * const doc = loadDocument(docData, {\r\n *   sectionSchemas: {\r\n *     users: userSchema,\r\n *     admins: adminSchema\r\n *   }\r\n * });\r\n *\r\n * // Load with error collection\r\n * const errors: Error[] = [];\r\n * const doc = loadDocument(docData, {\r\n *   defaultSchema: schema,\r\n *   errorCollector: errors,\r\n *   strict: false\r\n * });\r\n * console.log(`Loaded with ${errors.length} errors`);\r\n * ```\r\n */\r\nexport function loadDocument(\r\n  data: DocumentData,\r\n  options: LoadDocumentOptions = {}\r\n): Document {\r\n  const errors: Error[] = [];\r\n  const errorCollector = options.errorCollector || errors;\r\n\r\n  // Create header with definitions\r\n  const header = new Header();\r\n\r\n  // Process header definitions\r\n  if (data.header?.definitions) {\r\n    for (const [key, value] of Object.entries(data.header.definitions)) {\r\n      const isSchema = key.startsWith('$');\r\n      const isVariable = key.startsWith('@');\r\n\r\n      // If it's a schema string, compile it\r\n      if (isSchema && typeof value === 'string') {\r\n        try {\r\n          const schema = compileSchema(key, value);\r\n          header.definitions.push(key, schema, true, false);\r\n        } catch (error) {\r\n          if (options.strict) throw error;\r\n          if (error instanceof Error) errorCollector.push(error);\r\n        }\r\n      } else {\r\n        header.definitions.push(key, value, isSchema, isVariable);\r\n      }\r\n    }\r\n  }\r\n\r\n  // Merge external definitions if provided\r\n  if (options.definitions) {\r\n    header.definitions.merge(options.definitions, false);\r\n  }\r\n\r\n  // Set default schema from header or options\r\n  if (data.header?.schema) {\r\n    const schema = resolveSchema(data.header.schema, header.definitions);\r\n    if (schema) {\r\n      header.schema = schema;\r\n      header.definitions.push('$schema', schema, true, false);\r\n    }\r\n  } else if (options.defaultSchema) {\r\n    const schema = resolveSchema(options.defaultSchema, header.definitions);\r\n    if (schema) {\r\n      header.schema = schema;\r\n    }\r\n  }\r\n\r\n  // Create sections collection\r\n  const sections = new SectionCollection();\r\n\r\n  // Determine if we have single unnamed section or multiple named sections\r\n  const sectionsData = data.sections || (data.data !== undefined ? { '': data.data } : {});\r\n\r\n  // Process each section\r\n  for (const [sectionName, sectionData] of Object.entries(sectionsData)) {\r\n    try {\r\n      // Determine schema for this section\r\n      let sectionSchema: Schema | undefined;\r\n\r\n      // 1. Try section-specific schema from options\r\n      if (options.sectionSchemas?.[sectionName]) {\r\n        sectionSchema = resolveSchema(options.sectionSchemas[sectionName], header.definitions);\r\n      }\r\n\r\n      // 2. Fall back to default schema\r\n      if (!sectionSchema && header.schema) {\r\n        sectionSchema = header.schema;\r\n      }\r\n\r\n      // 3. Try to infer from section name if it's a schema reference\r\n      if (!sectionSchema && sectionName && sectionName.startsWith('$')) {\r\n        sectionSchema = header.definitions.getV(sectionName);\r\n      }\r\n\r\n      if (!sectionSchema) {\r\n        const error = new Error(`No schema found for section '${sectionName || 'unnamed'}'`);\r\n        if (options.strict) throw error;\r\n        errorCollector.push(error);\r\n        continue;\r\n      }\r\n\r\n      // Load section data\r\n      let loadedData: InternetObject | Collection<InternetObject>;\r\n\r\n      if (Array.isArray(sectionData)) {\r\n        loadedData = loadCollection(sectionData, sectionSchema, header.definitions, errorCollector);\r\n      } else {\r\n        loadedData = loadObject(sectionData, sectionSchema, header.definitions);\r\n      }\r\n\r\n      const section = new Section(\r\n        loadedData,\r\n        sectionName || undefined,\r\n        sectionSchema.name\r\n      );\r\n      sections.push(section);\r\n\r\n    } catch (error) {\r\n      if (options.strict) throw error;\r\n      if (error instanceof Error) errorCollector.push(error);\r\n    }\r\n  }\r\n\r\n  // Create and return document\r\n  const doc = new Document(header, sections, errors);\r\n  return doc;\r\n}\r\n\r\n/**\r\n * Helper function to resolve schema from string or Schema object\r\n */\r\nfunction resolveSchema(\r\n  schema: string | Schema,\r\n  defs: Definitions\r\n): Schema | undefined {\r\n  if (schema instanceof Schema) {\r\n    return schema;\r\n  }\r\n\r\n  if (typeof schema === 'string') {\r\n    // Check if it's a schema reference\r\n    if (/^[$@][a-zA-Z_$][a-zA-Z0-9_$]*$/.test(schema)) {\r\n      const resolved = defs.getV(schema);\r\n      if (resolved instanceof Schema) {\r\n        return resolved;\r\n      }\r\n    } else {\r\n      // Try to compile as IO text\r\n      try {\r\n        return compileSchema('_temp', schema);\r\n      } catch (error) {\r\n        // If compilation fails, return undefined\r\n        return undefined;\r\n      }\r\n    }\r\n  }\r\n\r\n  return undefined;\r\n}\r\n"],"mappings":"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","names":["import_schema","Header","SectionCollection","Section","Document","Schema"]}