{"version":3,"sources":["../../src/facade/load.ts"],"sourcesContent":["import Definitions from '../core/definitions';\r\nimport 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 InternetObject from '../core/internet-object';\r\nimport Collection from '../core/collection';\r\nimport Schema from '../schema/schema';\r\nimport { loadObject as processObject, loadCollection as processCollection } from '../schema/load-processor';\r\nimport IOError from '../errors/io-error';\r\nimport ErrorCodes from '../errors/io-error-codes';\r\n\r\n/**\r\n * Creates an InternetObject from plain data without schema validation.\r\n * Used for schema-less loading mode.\r\n */\r\nfunction createSchemalessObject(data: any): InternetObject {\r\n  if (typeof data !== 'object' || data === null || Array.isArray(data)) {\r\n    // For non-object values, wrap in IOObject with a value key\r\n    const obj = new InternetObject();\r\n    obj.push(data);\r\n    return obj;\r\n  }\r\n  return new InternetObject(data);\r\n}\r\n\r\n/**\r\n * Creates a Collection of InternetObjects from plain array data without schema validation.\r\n * Used for schema-less loading mode.\r\n */\r\nfunction createSchemalessCollection(dataArray: any[]): Collection<InternetObject> {\r\n  const collection = new Collection<InternetObject>();\r\n  for (const item of dataArray) {\r\n    collection.push(createSchemalessObject(item));\r\n  }\r\n  return collection;\r\n}\r\n\r\nexport interface LoadObjectOptions {\r\n  /**\r\n   * The name of the schema to use from definitions.\r\n   * If provided, the schema will be looked up by this name in the definitions.\r\n   * If not provided, uses `defs.defaultSchema` (`$schema`).\r\n   *\r\n   * @example\r\n   * ```typescript\r\n   * const defs = parseDefinitions('~ $User: { name, age }');\r\n   * const obj = loadObject(data, defs, { schemaName: '$User' });\r\n   * ```\r\n   */\r\n  schemaName?: string;\r\n\r\n  /**\r\n   * When true, throws on first validation error.\r\n   * When false (default), continues processing and collects errors.\r\n   * @default false\r\n   */\r\n  strict?: boolean;\r\n\r\n  /**\r\n   * Array to collect validation errors instead of throwing.\r\n   * Useful for processing collections where some items may be invalid.\r\n   */\r\n  errorCollector?: Error[];\r\n}\r\n\r\n/**\r\n * Load and validate plain JavaScript data according to an Internet Object schema.\r\n *\r\n * This is the high-level API for validating external data (from APIs, databases, etc.)\r\n * using Internet Object schemas. Unlike parse(), which processes IO text,\r\n * loadObject() validates plain JavaScript objects.\r\n *\r\n * @param data - Plain JavaScript object or array to validate\r\n * @param defs - Definitions object containing schemas\r\n * @param options - LoadObjectOptions (schemaName, strict, errorCollector)\r\n * @returns Validated InternetObject or Collection\r\n * @throws ValidationError if data doesn't conform to schema\r\n *\r\n * @example\r\n * ```typescript\r\n * // Schema-less (no validation, just wrap in InternetObject)\r\n * const obj = loadObject({ name: 'Alice', age: 28 });\r\n *\r\n * // Load with definitions (uses $schema as default)\r\n * const defs = parseDefinitions('~ $schema: { name: string, age: int }');\r\n * const obj = loadObject(data, defs);\r\n *\r\n * // Load with specific schema name from definitions\r\n * const defs = parseDefinitions('~ $User: { name, age }');\r\n * const obj = loadObject(data, defs, { schemaName: '$User' });\r\n * ```\r\n */\r\n// Overloads for loadObject\r\nexport function loadObject(data: object): InternetObject;\r\nexport function loadObject(data: object, defs: Definitions): InternetObject;\r\nexport function loadObject(data: object, options: LoadObjectOptions): InternetObject;\r\nexport function loadObject(data: object, defs: Definitions, options: LoadObjectOptions): InternetObject;\r\nexport function loadObject(\r\n  data: object,\r\n  defsOrOptions?: Definitions | LoadObjectOptions,\r\n  options?: LoadObjectOptions\r\n): InternetObject {\r\n  let resolvedSchema: Schema | undefined;\r\n  let definitions: Definitions | undefined;\r\n  let resolvedOptions: LoadObjectOptions | undefined;\r\n\r\n  // Parse arguments: handle (data), (data, defs), (data, options), (data, defs, options)\r\n  if (defsOrOptions instanceof Definitions) {\r\n    definitions = defsOrOptions;\r\n    resolvedOptions = options;\r\n  } else if (defsOrOptions && typeof defsOrOptions === 'object') {\r\n    // Second param is options\r\n    resolvedOptions = defsOrOptions as LoadObjectOptions;\r\n  }\r\n\r\n  // Resolve schema: by name from options, or default from definitions\r\n  if (definitions) {\r\n    if (resolvedOptions?.schemaName) {\r\n      resolvedSchema = definitions.get(resolvedOptions.schemaName) as Schema | undefined;\r\n      if (!resolvedSchema) {\r\n        throw new IOError(ErrorCodes.schemaNotFound, `Schema '${resolvedOptions.schemaName}' not found in definitions.`);\r\n      }\r\n    } else {\r\n      resolvedSchema = definitions.defaultSchema || undefined;\r\n    }\r\n  }\r\n\r\n  // Validate that data is an object, not an array\r\n  if (Array.isArray(data)) {\r\n    throw new IOError(ErrorCodes.expectedObject, `loadObject expects an object, not an array. Use loadCollection for arrays.`);\r\n  }\r\n\r\n  // Schema-less mode: if no schema, load without validation\r\n  if (!resolvedSchema) {\r\n    return createSchemalessObject(data);\r\n  }\r\n\r\n  return processObject(data, resolvedSchema, definitions);\r\n}\r\n\r\n/**\r\n * Options for loadCollection function (same as LoadOptions)\r\n */\r\nexport type LoadCollectionOptions = LoadOptions;\r\n\r\n/**\r\n * Load JS array (no Document wrapper).\r\n *\r\n * @param data - Array of plain JavaScript objects to validate\r\n * @param defs - Definitions object containing schemas\r\n * @param options - LoadCollectionOptions (schemaName, strict, errorCollector)\r\n * @returns Collection of validated InternetObjects\r\n *\r\n * @example\r\n * ```typescript\r\n * // Schema-less (no validation)\r\n * const col = loadCollection([{ name: 'Alice' }, { name: 'Bob' }]);\r\n *\r\n * // With definitions (validates each item against $schema)\r\n * const col = loadCollection(data, defs);\r\n *\r\n * // With specific schema from definitions\r\n * const col = loadCollection(users, defs, { schemaName: '$User' });\r\n * ```\r\n */\r\n// Overloads for loadCollection\r\nexport function loadCollection(data: any[]): Collection<InternetObject>;\r\nexport function loadCollection(data: any[], defs: Definitions): Collection<InternetObject>;\r\nexport function loadCollection(data: any[], options: LoadCollectionOptions): Collection<InternetObject>;\r\nexport function loadCollection(data: any[], defs: Definitions, options: LoadCollectionOptions): Collection<InternetObject>;\r\nexport function loadCollection(\r\n  data: any[],\r\n  defsOrOptions?: Definitions | LoadCollectionOptions,\r\n  options?: LoadCollectionOptions\r\n): Collection<InternetObject> {\r\n  let resolvedSchema: Schema | undefined;\r\n  let definitions: Definitions | undefined;\r\n  let resolvedOptions: LoadCollectionOptions | undefined;\r\n\r\n  // Parse arguments: handle (data), (data, defs), (data, options), (data, defs, options)\r\n  if (defsOrOptions instanceof Definitions) {\r\n    definitions = defsOrOptions;\r\n    resolvedOptions = options;\r\n  } else if (defsOrOptions && typeof defsOrOptions === 'object') {\r\n    // Second param is options\r\n    resolvedOptions = defsOrOptions as LoadCollectionOptions;\r\n  }\r\n\r\n  // Validate that data is an array\r\n  if (!Array.isArray(data)) {\r\n    throw new IOError(ErrorCodes.expectedArray, `loadCollection expects an array. Use loadObject for single objects.`);\r\n  }\r\n\r\n  // Resolve schema: by name from options, or default from definitions\r\n  if (definitions) {\r\n    if (resolvedOptions?.schemaName) {\r\n      resolvedSchema = definitions.get(resolvedOptions.schemaName) as Schema | undefined;\r\n      if (!resolvedSchema) {\r\n        throw new IOError(ErrorCodes.schemaNotFound, `Schema '${resolvedOptions.schemaName}' not found in definitions.`);\r\n      }\r\n    } else {\r\n      resolvedSchema = definitions.defaultSchema || undefined;\r\n    }\r\n  }\r\n\r\n  // Schema-less mode: if no schema, load without validation\r\n  if (!resolvedSchema) {\r\n    return createSchemalessCollection(data);\r\n  }\r\n\r\n  return processCollection(data, resolvedSchema, definitions, resolvedOptions?.errorCollector);\r\n}\r\n\r\n/**\r\n * Options for load function\r\n */\r\nexport interface LoadOptions {\r\n  /**\r\n   * The name of the schema to use from definitions.\r\n   * If provided, the schema will be looked up by this name in the definitions.\r\n   * If not provided, uses `defs.defaultSchema` (`$schema`).\r\n   *\r\n   * @example\r\n   * ```typescript\r\n   * const defs = parseDefinitions('~ $User: { name, age }');\r\n   * const doc = load(data, defs, { schemaName: '$User' });\r\n   * ```\r\n   */\r\n  schemaName?: string;\r\n\r\n  /**\r\n   * When true, throws on first validation error.\r\n   * When false (default), continues processing and collects errors.\r\n   * @default false\r\n   */\r\n  strict?: boolean;\r\n\r\n  /**\r\n   * Array to collect validation errors instead of throwing.\r\n   * Useful for processing collections where some items may be invalid.\r\n   */\r\n  errorCollector?: Error[];\r\n}\r\n\r\n/**\r\n * Load plain JavaScript data into a complete IODocument with header and sections.\r\n *\r\n * This function creates a full document structure that can be stringified with\r\n * schema definitions in the header. Use this when you need the complete IO format\r\n * with definitions output.\r\n *\r\n * @param data - Plain JavaScript object or array to load\r\n * @param defs - Definitions object containing schemas\r\n * @param options - LoadOptions (schemaName, strict, errorCollector)\r\n * @returns Complete IODocument with header containing definitions\r\n *\r\n * @example\r\n * ```typescript\r\n * // Schema-less (no validation)\r\n * const doc = load(data);\r\n *\r\n * // Load with definitions (uses $schema as default)\r\n * const defs = parseDefinitions('~ $schema: { name, age, address: $address }');\r\n * const doc = load(data, defs);\r\n *\r\n * // Load with specific schema name\r\n * const defs = parseDefinitions('~ $User: { name, age }');\r\n * const doc = load(data, defs, { schemaName: '$User' });\r\n * ```\r\n */\r\n// Overloads for load\r\nexport function load(data: any): Document;\r\nexport function load(data: any, defs: Definitions): Document;\r\nexport function load(data: any, options: LoadOptions): Document;\r\nexport function load(data: any, defs: Definitions, options: LoadOptions): Document;\r\nexport function load(\r\n  data: any,\r\n  defsOrOptions?: Definitions | LoadOptions,\r\n  options?: LoadOptions\r\n): Document {\r\n  let resolvedSchema: Schema | undefined;\r\n  let definitions: Definitions | undefined;\r\n  let resolvedOptions: LoadOptions | undefined;\r\n\r\n  // Parse arguments: handle (data), (data, defs), (data, options), (data, defs, options)\r\n  if (defsOrOptions instanceof Definitions) {\r\n    definitions = defsOrOptions;\r\n    resolvedOptions = options;\r\n  } else if (defsOrOptions && typeof defsOrOptions === 'object') {\r\n    // Second param is options\r\n    resolvedOptions = defsOrOptions as LoadOptions;\r\n  }\r\n\r\n  // Resolve schema: by name from options, or default from definitions\r\n  if (definitions) {\r\n    if (resolvedOptions?.schemaName) {\r\n      resolvedSchema = definitions.get(resolvedOptions.schemaName) as Schema | undefined;\r\n      if (!resolvedSchema) {\r\n        throw new IOError(ErrorCodes.schemaNotFound, `Schema '${resolvedOptions.schemaName}' not found in definitions.`);\r\n      }\r\n    } else {\r\n      resolvedSchema = definitions.defaultSchema || undefined;\r\n    }\r\n  }\r\n\r\n  // Create header with definitions (if available)\r\n  const header = new Header();\r\n  if (definitions) {\r\n    header.definitions.merge(definitions, true);\r\n  }\r\n  if (resolvedSchema) {\r\n    header.schema = resolvedSchema;\r\n  }\r\n\r\n  // Load the data\r\n  let loadedData: InternetObject | Collection<InternetObject>;\r\n  if (!resolvedSchema) {\r\n    // Schema-less mode: load without validation\r\n    if (Array.isArray(data)) {\r\n      loadedData = createSchemalessCollection(data);\r\n    } else {\r\n      loadedData = createSchemalessObject(data);\r\n    }\r\n  } else if (Array.isArray(data)) {\r\n    loadedData = processCollection(data, resolvedSchema, definitions, resolvedOptions?.errorCollector);\r\n  } else {\r\n    loadedData = processObject(data, resolvedSchema, definitions);\r\n  }\r\n\r\n  // Create section\r\n  const section = new Section(loadedData, undefined, '$schema');\r\n  const sections = new SectionCollection();\r\n  sections.push(section);\r\n\r\n  // Create and return document\r\n  return new Document(header, sections);\r\n}\r\n"],"mappings":"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","names":["InternetObject","Collection","Definitions","IOError","ErrorCodes","processObject","processCollection","Header","Section","SectionCollection","Document"]}