{"version":3,"sources":["../../../src/schema/types/datetime.ts"],"sourcesContent":["import Definitions            from '../../core/definitions';\r\nimport ErrorCodes             from '../../errors/io-error-codes';\r\nimport ValidationError        from '../../errors/io-validation-error';\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 TokenType              from '../../parser/tokenizer/token-types';\r\nimport * as dt                from '../../utils/datetime';\r\nimport doCommonTypeCheck      from './common-type';\r\nimport MemberDef              from './memberdef';\r\n\r\nconst DATETIME_TYPES = ['datetime', 'date', 'time']\r\n\r\nconst schema = new Schema(\r\n  \"datetime\",\r\n  { type:     { type: \"string\",   optional: false, null: false, choices: DATETIME_TYPES } },\r\n  { default:  { type: \"datetime\", optional: true,  null: false  } },\r\n  { choices:  { type: \"array\",    optional: true,  null: false, of: { type: \"datetime\" } } },\r\n  { min:      { type: \"datetime\", optional: true,  null: false } },\r\n  { max:      { type: \"datetime\", optional: true,  null: false } },\r\n  { optional: { type: \"bool\",     optional: true } },\r\n  { null:     { type: \"bool\",     optional: true } }\r\n)\r\n\r\nclass DateTimeDef implements TypeDef {\r\n  #type: string\r\n\r\n  public get type() { return this.#type }\r\n  public get schema() { return schema }\r\n\r\n  public constructor(type: string = 'datetime') { this.#type = type }\r\n\r\n  parse(node: Node, memberDef: MemberDef, defs?: Definitions): Date {\r\n    const valueNode = defs?.getV(node) || node\r\n    const { value, changed } = doCommonTypeCheck(memberDef, valueNode, node, defs, this.#dateTimeEqualityComparator)\r\n    if (changed) return value\r\n\r\n    if (valueNode.type !== TokenType.DATETIME) {\r\n      throw new ValidationError(ErrorCodes.invalidDateTime, `Expecting a ${memberDef.type.toUpperCase()} value for ${memberDef.path}, currently ${valueNode.value}, a ${valueNode.type} value`, node as TokenNode)\r\n    }\r\n\r\n    // Validate the value\r\n    this.#validate(value, memberDef, node, defs)\r\n\r\n    return value\r\n  }\r\n\r\n  load(value: any, memberDef: MemberDef, defs?: Definitions): Date {\r\n    const { value: checkedValue, changed } = doCommonTypeCheck(memberDef, value, undefined, defs, this.#dateTimeEqualityComparator)\r\n    if (changed) return checkedValue\r\n\r\n    // Type validation - must be a Date object\r\n    if (!(value instanceof Date)) {\r\n      throw new ValidationError(\r\n        ErrorCodes.invalidType,\r\n        `Expecting a Date object for '${memberDef.path}', got ${typeof value}`\r\n      )\r\n    }\r\n\r\n    // Validate constraints\r\n    this.#validate(value, memberDef, undefined, defs)\r\n\r\n    return value\r\n  }\r\n\r\n  public stringify(value: Date): string {\r\n    return dt.dateToIOString(value, this.#type as any)\r\n  }\r\n\r\n  #normalizeToDate = (v: any, defs?: Definitions): Date | undefined => {\r\n    if (!v) return undefined\r\n\r\n    // Already a Date instance (min/max from schema are already Date objects)\r\n    if (v instanceof Date) return v\r\n\r\n    if (typeof v === 'string') {\r\n      const d = new Date(v)\r\n      return isNaN(d.getTime()) ? undefined : d\r\n    }\r\n\r\n    // Resolve TokenNode to underlying value\r\n    if (v instanceof TokenNode) {\r\n      if (v.value instanceof Date) return v.value\r\n      // Try resolving through definitions\r\n      if (defs) {\r\n        const resolved = defs.getV(v)\r\n        if (resolved instanceof Date) return resolved\r\n        if (resolved instanceof TokenNode && resolved.value instanceof Date) return resolved.value\r\n      }\r\n    }\r\n\r\n    // If wrapper exposes toValue(defs)\r\n    if (typeof v === 'object' && typeof (v as any).toValue === 'function') {\r\n      const resolved = (v as any).toValue(defs)\r\n      return this.#normalizeToDate(resolved, defs)\r\n    }\r\n\r\n    return undefined\r\n  }\r\n\r\n  #dateTimeEqualityComparator = (value: any, choice: any): boolean => {\r\n    const valDate = value instanceof Date ? value : undefined\r\n    const choiceDate = this.#normalizeToDate(choice)\r\n\r\n    if (!valDate || !choiceDate) return false\r\n    return valDate.getTime() === choiceDate.getTime()\r\n  }\r\n\r\n  #validate(value:Date, memberDef: MemberDef, node?: Node, defs?: Definitions) {\r\n    const dateType:any = memberDef.type\r\n\r\n    if (memberDef.min) {\r\n      const min = this.#normalizeToDate(memberDef.min, defs)\r\n      if (min && value < min) {\r\n        throw new ValidationError(\r\n          ErrorCodes.outOfRange,\r\n          `Expecting the value ${memberDef.path ? `for '${memberDef.path}'` : ''} to be greater than or equal to '${dt.dateToSmartString(min, dateType)}'`,\r\n          node\r\n        )\r\n      }\r\n    }\r\n\r\n    if (memberDef.max) {\r\n      const max = this.#normalizeToDate(memberDef.max, defs)\r\n      if (max && value > max) {\r\n        throw new ValidationError(\r\n          ErrorCodes.outOfRange,\r\n          `Expecting the value ${memberDef.path ? `for '${memberDef.path}'` : ''} to be less than or equal to '${dt.dateToSmartString(max, dateType)}'`,\r\n          node\r\n        )\r\n      }\r\n    }\r\n  }\r\n\r\n  public static get types() { return DATETIME_TYPES }\r\n}\r\n\r\nexport default DateTimeDef\r\n"],"mappings":"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","names":["Schema","doCommonTypeCheck","TokenType","ValidationError","ErrorCodes","TokenNode"]}