{"version":3,"sources":["../../src/schema/load-processor.ts"],"sourcesContent":["import Collection from '../core/collection';\r\nimport Definitions from '../core/definitions';\r\nimport InternetObject from '../core/internet-object';\r\nimport ErrorCodes from '../errors/io-error-codes';\r\nimport IOError from '../errors/io-error';\r\nimport ValidationError from '../errors/io-validation-error';\r\nimport Schema from './schema';\r\nimport MemberDef from './types/memberdef';\r\nimport TypedefRegistry from './typedef-registry';\r\nimport TokenNode from '../parser/nodes/tokens';\r\n\r\n/**\r\n * Resolves variable references in memberDef fields like default, min, max, choices.\r\n * Variables are strings starting with @ that reference definitions.\r\n */\r\nfunction _resolveMemberDefVariables(memberDef: MemberDef, defs?: Definitions): MemberDef {\r\n  if (!memberDef || !defs) return memberDef;\r\n\r\n  const resolved = { ...memberDef };\r\n\r\n  // Resolve default value if it's a variable reference\r\n  if (typeof resolved.default === 'string' && resolved.default.startsWith('@')) {\r\n    resolved.default = defs.getV(resolved.default);\r\n    // Unwrap TokenNode if needed\r\n    if (resolved.default instanceof TokenNode) {\r\n      resolved.default = resolved.default.value;\r\n    }\r\n  }\r\n\r\n  // Resolve choices if they contain variable references\r\n  if (Array.isArray(resolved.choices)) {\r\n    resolved.choices = resolved.choices.map(choice => {\r\n      if (typeof choice === 'string' && choice.startsWith('@')) {\r\n        let resolved = defs.getV(choice);\r\n        return resolved instanceof TokenNode ? resolved.value : resolved;\r\n      }\r\n      return choice;\r\n    });\r\n  }\r\n\r\n  // Resolve min/max if they're variable references\r\n  if (typeof resolved.min === 'string' && resolved.min.startsWith('@')) {\r\n    resolved.min = defs.getV(resolved.min);\r\n    if (resolved.min instanceof TokenNode) {\r\n      resolved.min = resolved.min.value;\r\n    }\r\n  }\r\n  if (typeof resolved.max === 'string' && resolved.max.startsWith('@')) {\r\n    resolved.max = defs.getV(resolved.max);\r\n    if (resolved.max instanceof TokenNode) {\r\n      resolved.max = resolved.max.value;\r\n    }\r\n  }\r\n\r\n  return resolved;\r\n}\r\n\r\n/**\r\n * Loads and validates a plain JavaScript object according to schema.\r\n * Uses TypeDef.load() methods to validate each field.\r\n *\r\n * @param data - Plain JavaScript object to validate\r\n * @param schema - Schema to validate against (or schema name if defs provided)\r\n * @param defs - Optional definitions for variable resolution and schema lookup\r\n * @returns InternetObject with validated data\r\n * @throws ValidationError if data doesn't conform to schema\r\n *\r\n * @example\r\n * ```typescript\r\n * const schema = compileSchema('person', '{ name: string, age: number }')\r\n * const data = { name: 'Alice', age: 28 }\r\n * const obj = loadObject(data, schema)\r\n * ```\r\n */\r\nexport function loadObject(\r\n  data: any,\r\n  schema: Schema | string,\r\n  defs?: Definitions\r\n): InternetObject {\r\n  // Resolve schema if it's a string reference\r\n  if (typeof schema === 'string') {\r\n    if (!defs) {\r\n      throw new IOError(ErrorCodes.definitionsRequired, `Schema reference '${schema}' requires definitions`);\r\n    }\r\n    const resolvedSchema = defs.getV(schema);\r\n    if (!(resolvedSchema instanceof Schema)) {\r\n      throw new IOError(ErrorCodes.schemaNotFound, `Schema '${schema}' not found or invalid`);\r\n    }\r\n    schema = resolvedSchema;\r\n  }\r\n\r\n  // Type check\r\n  if (typeof data !== 'object' || data === null || Array.isArray(data)) {\r\n    throw new ValidationError(\r\n      ErrorCodes.invalidObject,\r\n      `Expecting an object value but found ${Array.isArray(data) ? 'array' : typeof data}`\r\n    );\r\n  }\r\n\r\n  return _loadObject(data, schema, defs);\r\n}\r\n\r\n/**\r\n * Internal helper to loadObject an object with resolved schema\r\n */\r\nfunction _loadObject(data: any, schema: Schema, defs?: Definitions): InternetObject {\r\n  const result = new InternetObject();\r\n  const processedNames = new Set<string>();\r\n\r\n  // Process schema-defined members\r\n  for (const name of schema.names) {\r\n    const memberDef = _resolveMemberDefVariables(schema.defs[name], defs);\r\n    const value = data[name];\r\n\r\n    const typeDef = TypedefRegistry.get(memberDef.type);\r\n    if (!typeDef) {\r\n      throw new IOError(ErrorCodes.invalidType, `Type '${memberDef.type}' is not registered.`);\r\n    }\r\n\r\n    // Use loadObject() method if available\r\n    if ('load' in typeDef && typeDef.load) {\r\n      try {\r\n        const loadedValue = typeDef.load(value, memberDef, defs);\r\n        if (loadedValue !== undefined) {\r\n          result.set(name, loadedValue);\r\n        }\r\n      } catch (error) {\r\n        // Add context to validation errors\r\n        if (error instanceof ValidationError) {\r\n          // Enhance error message with field name if not already present\r\n          if (!error.message.includes(name)) {\r\n            error.message = `Error in field '${name}': ${error.message}`;\r\n          }\r\n        }\r\n        throw error;\r\n      }\r\n    } else {\r\n      // Fallback for types without loadObject() - use value as-is if present\r\n      if (value !== undefined) {\r\n        result.set(name, value);\r\n      } else if (memberDef.default !== undefined) {\r\n        result.set(name, memberDef.default);\r\n      } else if (!memberDef.optional) {\r\n        throw new ValidationError(\r\n          ErrorCodes.valueRequired,\r\n          `Value required for field '${name}'`\r\n        );\r\n      }\r\n    }\r\n\r\n    processedNames.add(name);\r\n  }\r\n\r\n  // Handle additional properties if schema is open\r\n  if (schema.open) {\r\n    for (const key in data) {\r\n      if (!processedNames.has(key)) {\r\n        let memberDef: MemberDef;\r\n\r\n        // Use schema.open constraints if it's a MemberDef, otherwise type 'any'\r\n        if (typeof schema.open === 'object' && schema.open.type) {\r\n          memberDef = { ...schema.open, path: key };\r\n        } else {\r\n          memberDef = { type: 'any', path: key };\r\n        }\r\n\r\n        const typeDef = TypedefRegistry.get(memberDef.type);\r\n        if (typeDef && 'load' in typeDef && typeDef.load) {\r\n          const loadedValue = typeDef.load(data[key], memberDef, defs);\r\n          if (loadedValue !== undefined) {\r\n            result.set(key, loadedValue);\r\n          }\r\n        } else {\r\n          result.set(key, data[key]);\r\n        }\r\n      }\r\n    }\r\n  } else {\r\n    // Check for unexpected properties in closed schemas\r\n    for (const key in data) {\r\n      if (!processedNames.has(key)) {\r\n        throw new ValidationError(\r\n          ErrorCodes.unknownMember,\r\n          `The ${schema.name ? `${schema.name} ` : ''}schema does not define a member named '${key}'.`\r\n        );\r\n      }\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n/**\r\n * Loads and validates an array of JavaScript objects as a collection.\r\n * Collects validation errors for individual items while continuing to process the rest.\r\n *\r\n * @param dataArray - Array of plain JavaScript objects to validate\r\n * @param schema - Schema to validate each item against\r\n * @param defs - Optional definitions for variable resolution\r\n * @param errorCollector - Optional array to collect validation errors\r\n * @returns Collection with validated InternetObjects and error objects\r\n *\r\n * @example\r\n * ```typescript\r\n * const schema = compileSchema('person', '{ name: string, age: number }')\r\n * const data = [\r\n *   { name: 'Alice', age: 28 },\r\n *   { name: 'Bob', age: 'invalid' }  // Will create error object\r\n * ]\r\n * const errors: Error[] = []\r\n * const collection = loadCollection(data, schema, undefined, errors)\r\n * // collection[0] is valid InternetObject\r\n * // collection[1] is error object with collectionIndex: 1\r\n * // errors[0] contains the validation error details\r\n * ```\r\n */\r\nexport function loadCollection(\r\n  dataArray: any[],\r\n  schema: Schema | string,\r\n  defs?: Definitions,\r\n  errorCollector?: Error[]\r\n): Collection<InternetObject> {\r\n  // Resolve schema if it's a string reference\r\n  if (typeof schema === 'string') {\r\n    if (!defs) {\r\n      throw new IOError(ErrorCodes.definitionsRequired, `Schema reference '${schema}' requires definitions`);\r\n    }\r\n    const resolvedSchema = defs.getV(schema);\r\n    if (!(resolvedSchema instanceof Schema)) {\r\n      throw new IOError(ErrorCodes.schemaNotFound, `Schema '${schema}' not found or invalid`);\r\n    }\r\n    schema = resolvedSchema;\r\n  }\r\n\r\n  // Type check\r\n  if (!Array.isArray(dataArray)) {\r\n    throw new ValidationError(\r\n      ErrorCodes.notAnArray,\r\n      `Expecting an array but found ${typeof dataArray}`\r\n    );\r\n  }\r\n\r\n  const collection = new Collection<InternetObject>();\r\n\r\n  for (let i = 0; i < dataArray.length; i++) {\r\n    try {\r\n      const item = loadObject(dataArray[i], schema, defs);\r\n      collection.push(item);\r\n    } catch (error) {\r\n      if (error instanceof Error) {\r\n        // Attach collectionIndex for boundary context\r\n        (error as any).collectionIndex = i;\r\n\r\n        // Add to error collector if provided\r\n        if (errorCollector) {\r\n          errorCollector.push(error);\r\n        }\r\n\r\n        // Add to collection's internal error list\r\n        collection.errors.push(error);\r\n\r\n        // Create error object to maintain collection structure\r\n        // This allows downstream code to know which items failed\r\n        const errorObj = {\r\n          __error: true,\r\n          category: error instanceof ValidationError ? 'validation' : 'runtime',\r\n          message: error.message,\r\n          collectionIndex: i\r\n        };\r\n\r\n        collection.push(errorObj as any);\r\n      } else {\r\n        // Re-throw non-Error exceptions\r\n        throw error;\r\n      }\r\n    }\r\n  }\r\n\r\n  return collection;\r\n}\r\n"],"mappings":"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","names":["TokenNode","resolved","IOError","ErrorCodes","Schema","ValidationError","InternetObject","TypedefRegistry","Collection"]}