{"version":3,"sources":["../../../src/schema/types/array.ts"],"sourcesContent":["import Definitions            from '../../core/definitions'\r\nimport assertNever            from '../../errors/asserts/asserts'\r\nimport ErrorCodes             from '../../errors/io-error-codes'\r\nimport ValidationError        from '../../errors/io-validation-error'\r\nimport ArrayNode              from '../../parser/nodes/array'\r\nimport Node                   from '../../parser/nodes/nodes'\r\nimport TokenNode              from '../../parser/nodes/tokens'\r\nimport Schema                 from '../../schema/schema'\r\nimport TypeDef                from '../../schema/typedef'\r\nimport TypedefRegistry        from '../../schema/typedef-registry'\r\nimport MemberDef              from './memberdef'\r\nimport doCommonTypeCheck      from './common-type'\r\n\r\nconst schema = new Schema(\r\n  \"array\",\r\n  { type:     { type: \"string\", optional: false, null: false, choices: [\"array\"] } },\r\n  { default:  { type: \"array\",  optional: true,  null: false } },\r\n  { of:       { type: \"any\",    optional: true,  null: false, __memberdef: true } },\r\n  { len:      { type: \"number\", optional: true,  null: false, min: 0 } },\r\n  { minLen:   { type: \"number\", optional: true,  null: false, min: 0 } },\r\n  { maxLen:   { type: \"number\", optional: true,  null: false, min: 0 } },\r\n)\r\n\r\nclass ArrayDef implements TypeDef {\r\n\r\n  public get type()   { return 'array' }\r\n  public get schema() { return schema }\r\n\r\n  public parse = (valueNode: Node, memberDef: MemberDef, defs?: Definitions): any => {\r\n    return _processNode(valueNode, memberDef, defs)\r\n  }\r\n\r\n  /**\r\n   * Load: Validates a JavaScript array against the schema\r\n   */\r\n  public load = (value: any, memberDef: MemberDef, defs?: Definitions): any[] => {\r\n    const { value: checkedValue, changed } = doCommonTypeCheck(memberDef, value, undefined, defs)\r\n    if (changed) return checkedValue\r\n\r\n    // Type check\r\n    if (!Array.isArray(value)) {\r\n      throw new ValidationError(\r\n        ErrorCodes.notAnArray,\r\n        `Expecting an array value for '${memberDef.path}' but found ${typeof value}`\r\n      )\r\n    }\r\n\r\n    // Determine the TypeDef for array items\r\n    let typeDef: TypeDef | undefined\r\n    let arrayMemberDef: MemberDef = { type: 'any' }\r\n\r\n    if (memberDef.of instanceof Schema) {\r\n      typeDef = TypedefRegistry.get('object')\r\n      arrayMemberDef.schema = memberDef.of\r\n      arrayMemberDef.path = memberDef.path\r\n    } else if (memberDef.of?.type) {\r\n      typeDef = TypedefRegistry.get(memberDef.of.type)\r\n      if (!typeDef) {\r\n        throw new ValidationError(\r\n          ErrorCodes.invalidType,\r\n          `Invalid type definition '${memberDef.of.type}'`\r\n        )\r\n      }\r\n      arrayMemberDef = { ...memberDef.of }\r\n      arrayMemberDef.path = memberDef.path\r\n    } else {\r\n      typeDef = TypedefRegistry.get('any')\r\n    }\r\n\r\n    // Load each item using the TypeDef.load() method\r\n    const result: any[] = []\r\n    for (let i = 0; i < value.length; i++) {\r\n      const item = value[i]\r\n      const itemPath = `${memberDef.path || 'array'}[${i}]`\r\n      const itemMemberDef = { ...arrayMemberDef, path: itemPath }\r\n\r\n      if (typeDef && 'load' in typeDef && typeof typeDef.load === 'function') {\r\n        result.push(typeDef.load(item, itemMemberDef, defs))\r\n      } else if (typeDef) {\r\n        // Fallback: no load method, just push the value\r\n        result.push(item)\r\n      } else {\r\n        result.push(item)\r\n      }\r\n    }\r\n\r\n    // Validate length constraints\r\n    _validateLength(result, memberDef)\r\n\r\n    return result\r\n  }\r\n\r\n  /**\r\n   * Stringify: Converts a JavaScript array to IO text format\r\n   * Returns undefined to signal \"skip this field\" (for missing optional values)\r\n   */\r\n  public stringify = (value: any, memberDef: MemberDef, defs?: Definitions): string | undefined => {\r\n    const { value: checkedValue, changed } = doCommonTypeCheck(memberDef, value, undefined, defs)\r\n    if (changed) {\r\n      if (checkedValue === null) return 'N'\r\n      if (checkedValue === undefined) return undefined  // Skip this field entirely\r\n      value = checkedValue\r\n    }\r\n\r\n    // Type check\r\n    if (!Array.isArray(value)) {\r\n      throw new ValidationError(\r\n        ErrorCodes.notAnArray,\r\n        `Expecting an array value for '${memberDef.path}' but found ${typeof value}`\r\n      )\r\n    }\r\n\r\n    // Validate length constraints before stringifying\r\n    _validateLength(value, memberDef)\r\n\r\n    // Determine the TypeDef for array items\r\n    let typeDef: TypeDef | undefined\r\n    let arrayMemberDef: MemberDef = { type: 'any' }\r\n\r\n    if (memberDef.of instanceof Schema) {\r\n      typeDef = TypedefRegistry.get('object')\r\n      arrayMemberDef.schema = memberDef.of\r\n      arrayMemberDef.path = memberDef.path\r\n    } else if (memberDef.of?.type) {\r\n      typeDef = TypedefRegistry.get(memberDef.of.type)\r\n      arrayMemberDef = { ...memberDef.of }\r\n      arrayMemberDef.path = memberDef.path\r\n    } else if (memberDef.schemaRef && defs) {\r\n      // Array has a schemaRef for its items (e.g., books: [$book])\r\n      typeDef = TypedefRegistry.get('object')\r\n      arrayMemberDef.type = 'object'\r\n      arrayMemberDef.schemaRef = memberDef.schemaRef\r\n      arrayMemberDef.path = memberDef.path\r\n    } else {\r\n      typeDef = TypedefRegistry.get('any')\r\n    }\r\n\r\n    // Stringify each item\r\n    const parts: string[] = []\r\n    for (let i = 0; i < value.length; i++) {\r\n      const item = value[i]\r\n      const itemPath = `${memberDef.path || 'array'}[${i}]`\r\n      const itemMemberDef = { ...arrayMemberDef, path: itemPath }\r\n\r\n      if (typeDef && 'stringify' in typeDef && typeof typeDef.stringify === 'function') {\r\n        const strValue = typeDef.stringify(item, itemMemberDef, defs)\r\n        parts.push(strValue ?? '')  // Array items shouldn't be undefined, but fallback to empty\r\n      } else {\r\n        // Fallback: use JSON.stringify for items without stringify method\r\n        parts.push(item === null ? 'N' : JSON.stringify(item))\r\n      }\r\n    }\r\n\r\n    return `[${parts.join(', ')}]`\r\n  }\r\n\r\n  public static get types() { return ['array'] }\r\n}\r\n\r\nfunction _processNode(node: Node, memberDef: MemberDef, defs?: Definitions) {\r\n  const valueNode = defs?.getV(node) || node\r\n  const { value, changed } = doCommonTypeCheck(memberDef, valueNode, node, defs)\r\n  if (changed) return value\r\n\r\n  if (valueNode instanceof ArrayNode === false) {\r\n    throw new ValidationError(ErrorCodes.notAnArray, `Expecting an array value for '${memberDef.path}'`, node)\r\n  }\r\n\r\n  // Find the right typeDef\r\n  let typeDef: TypeDef | undefined\r\n  let arrayMemberDef: MemberDef = {\r\n    type: 'any'\r\n  }\r\n\r\n  if (memberDef.of instanceof Schema) {\r\n    typeDef = TypedefRegistry.get('object')\r\n    arrayMemberDef.schema = memberDef.of\r\n    arrayMemberDef.path = memberDef.path\r\n  } else if (memberDef.of?.type) {\r\n    typeDef = TypedefRegistry.get(memberDef.of.type)\r\n    if (!typeDef) {\r\n      throw new ValidationError(ErrorCodes.invalidType, `Invalid type definition '${memberDef.of.type}'`, node)\r\n    }\r\n    arrayMemberDef = memberDef.of\r\n    arrayMemberDef.path = memberDef.path\r\n  } else if (typeof memberDef.of === 'string') {\r\n    assertNever(memberDef.of)\r\n  } else {\r\n    typeDef = TypedefRegistry.get('any')\r\n  }\r\n\r\n  const array: any = []\r\n  valueNode.children.forEach((item: any) => {\r\n    // If it is a definition\r\n    if (valueNode !== node) {\r\n      try {\r\n        array.push(typeDef?.parse(item, arrayMemberDef, defs))\r\n      } catch (err) {\r\n        // Before rethrowing the error, change the position of the error to\r\n        // the original node.\r\n        if (err instanceof ValidationError) {\r\n          err.positionRange = node\r\n        }\r\n        throw err\r\n      }\r\n    } else {\r\n      array.push(typeDef?.parse(item, arrayMemberDef, defs))\r\n    }\r\n  })\r\n\r\n  // Validate length constraints\r\n  _validateLength(array, memberDef, valueNode)\r\n\r\n  return array\r\n}\r\n\r\n/**\r\n * Validates array length constraints\r\n */\r\nfunction _validateLength(array: any[], memberDef: MemberDef, node?: Node): void {\r\n  const arrayLength = array.length\r\n\r\n  if (memberDef.len !== undefined && arrayLength !== memberDef.len) {\r\n    throw new ValidationError(\r\n      ErrorCodes.invalidLength,\r\n      `The \"${memberDef.path || 'array'}\" must have exactly ${memberDef.len} items, but has ${arrayLength}.`,\r\n      node\r\n    )\r\n  }\r\n\r\n  if (memberDef.minLen !== undefined && arrayLength < memberDef.minLen) {\r\n    throw new ValidationError(\r\n      ErrorCodes.outOfRange,\r\n      `The \"${memberDef.path || 'array'}\" must have at least ${memberDef.minLen} items, but has ${arrayLength}.`,\r\n      node\r\n    )\r\n  }\r\n\r\n  if (memberDef.maxLen !== undefined && arrayLength > memberDef.maxLen) {\r\n    throw new ValidationError(\r\n      ErrorCodes.outOfRange,\r\n      `The \"${memberDef.path || 'array'}\" must have at most ${memberDef.maxLen} items, but has ${arrayLength}.`,\r\n      node\r\n    )\r\n  }\r\n}\r\n\r\nexport default ArrayDef\r\n"],"mappings":"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","names":["Schema","doCommonTypeCheck","ValidationError","ErrorCodes","TypedefRegistry","ArrayNode","assertNever"]}