{"version":3,"sources":["../../../src/schema/types/number.ts"],"sourcesContent":["import Decimal from '../../core/decimal/decimal'\r\nimport Definitions from '../../core/definitions'\r\nimport InternetObjectError from '../../errors/io-error'\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 Schema from '../../schema/schema'\r\nimport TypeDef from '../../schema/typedef'\r\nimport doCommonTypeCheck from './common-type'\r\nimport MemberDef from './memberdef'\r\nimport { NUMBER_TYPES, NUMBER_MAP, throwError } from './common-number'\r\nimport BigIntDef from './bigint'\r\nimport DecimalDef from './decimal'\r\n\r\nconst numberSchema = new Schema(\r\n  \"number\",\r\n  { type:       { type: \"string\", optional: false, null: false, choices: NUMBER_TYPES } },\r\n  { default:    { type: \"number\", optional: true,  null: false  } },\r\n  { choices:    { type: \"array\",  optional: true,  null: false, of: { type: \"number\" } } },\r\n  { min:        { type: \"number\", optional: true,  null: false } },\r\n  { max:        { type: \"number\", optional: true,  null: false } },\r\n  { multipleOf: { type: \"number\", optional: true,  null: false } },\r\n  { format:     { type: \"string\", optional: true, null: false, choices: [\"decimal\", \"hex\", \"octal\", \"binary\", \"scientific\"] } },\r\n  { optional:   { type: \"bool\",   optional: true } },\r\n  { null:       { type: \"bool\",   optional: true } },\r\n)\r\n\r\n/**\r\n * Represents the various number related data types in Internet Object.\r\n * Delegates to specialized types (BigIntDef, DecimalDef) when appropriate.\r\n *\r\n * @internal\r\n */\r\nclass NumberDef implements TypeDef {\r\n  private _type: string\r\n  private _delegateTypeDef?: TypeDef\r\n\r\n  get type(): string { return this._type }\r\n  get schema(): Schema {\r\n    if (this._delegateTypeDef) {\r\n      return this._delegateTypeDef.schema\r\n    }\r\n    return numberSchema\r\n  }\r\n\r\n  constructor(type: string = 'number') {\r\n    this._type = type\r\n\r\n    // Delegate to specialized type definitions\r\n    if (type === 'bigint') {\r\n      this._delegateTypeDef = new BigIntDef()\r\n    } else if (type === 'decimal') {\r\n      this._delegateTypeDef = new DecimalDef()\r\n    }\r\n  }\r\n\r\n  parse(node: Node, memberDef: MemberDef, defs?: Definitions): number | bigint | Decimal {\r\n    // Delegate to specialized type if available\r\n    if (this._delegateTypeDef) {\r\n      return this._delegateTypeDef.parse(node, memberDef, defs)\r\n    }\r\n\r\n    // Handle standard number types\r\n    const valueNode = defs?.getV(node) || node\r\n    const rawValue = typeof (valueNode as any)?.toValue === 'function' ? (valueNode as any).toValue(defs) : valueNode\r\n    let { value, changed } = doCommonTypeCheck(memberDef, valueNode, node, defs)\r\n    if (changed) return value\r\n\r\n    value = this.validateInteger(memberDef, value, node)\r\n\r\n    return value\r\n  }\r\n\r\n  /** Load: JS Value → Validated JS Value */\r\n  load(value: any, memberDef: MemberDef, defs?: Definitions): number | bigint | Decimal {\r\n    // Delegate to specialized type if available\r\n    if (this._delegateTypeDef && 'load' in this._delegateTypeDef) {\r\n      return (this._delegateTypeDef as any).load(value, memberDef, defs)\r\n    }\r\n\r\n    const { value: checkedValue, changed } = doCommonTypeCheck(memberDef, value, undefined, defs)\r\n    if (changed) return checkedValue\r\n\r\n    const validated = this.validateInteger(memberDef, value)\r\n    return validated\r\n  }\r\n\r\n  stringify(value: any, memberDef: MemberDef, defs?: Definitions): string {\r\n    // Handle null/undefined first\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 ''\r\n    }\r\n\r\n    // Delegate to specialized type if available\r\n    if (this._delegateTypeDef && 'stringify' in this._delegateTypeDef) {\r\n      return (this._delegateTypeDef as any).stringify(checkedValue, memberDef, defs)\r\n    }\r\n\r\n    // Handle standard number types\r\n    if (memberDef.format === 'scientific') { return checkedValue.toExponential() }\r\n    if (memberDef.format === 'hex') { return checkedValue.toString(16) }\r\n    if (memberDef.format === 'octal') { return checkedValue.toString(8) }\r\n    if (memberDef.format === 'binary') { return checkedValue.toString(2) }\r\n\r\n    return checkedValue.toString()\r\n  }\r\n\r\n  /**\r\n   * Validates integer and float types\r\n   */\r\n  validateInteger(memberDef: MemberDef, value: any, node?: Node): number {\r\n    const valueType = typeof value === \"bigint\" ? \"bigint\" : NUMBER_MAP[typeof value] ? \"number\" : \"\"\r\n\r\n    if (valueType === \"\") {\r\n      throw new ValidationError(\r\n        ErrorCodes.invalidType,\r\n        `Expecting a value of type '${memberDef.type}' for '${memberDef.path}'`,\r\n        node\r\n      )\r\n    }\r\n\r\n    if (valueType !== \"number\") {\r\n      throw new ValidationError(\r\n        `not-a-${memberDef.type}`,\r\n        `Invalid value encountered for '${memberDef.path}'`,\r\n        node\r\n      )\r\n    }\r\n\r\n    // Get type-specific bounds\r\n    const { min: typeBoundMin, max: typeBoundMax } = this.getTypeBounds(this._type)\r\n\r\n    // Use memberDef.min/max if available, otherwise use type bounds\r\n    const effectiveMin = memberDef.min !== undefined && memberDef.min !== null ? memberDef.min : typeBoundMin\r\n    const effectiveMax = memberDef.max !== undefined && memberDef.max !== null ? memberDef.max : typeBoundMax\r\n\r\n    if ((effectiveMin !== null && value < effectiveMin) || (effectiveMax !== null && value > effectiveMax)) {\r\n      throwError(ErrorCodes.invalidRange, memberDef.path!, value, node)\r\n    }\r\n\r\n    // Validate multipleOf constraint\r\n    if (memberDef.multipleOf !== undefined && memberDef.multipleOf !== null) {\r\n      if (value % memberDef.multipleOf !== 0) {\r\n        throw new ValidationError(\r\n          ErrorCodes.invalidValue,\r\n          `The value ${value} for '${memberDef.path}' must be a multiple of ${memberDef.multipleOf}`,\r\n          node\r\n        )\r\n      }\r\n    }\r\n\r\n    return value\r\n  }\r\n\r\n  /**\r\n   * Get min/max bounds for a specific number type\r\n   */\r\n  private getTypeBounds(type: string): { min: number | null, max: number | null } {\r\n    switch (type) {\r\n      case 'uint':\r\n        return { min: 0, max: null }\r\n      case 'int8':\r\n        return { min: -(2 ** 7), max: 2 ** 7 - 1 }\r\n      case 'uint8':\r\n        return { min: 0, max: 2 ** 8 - 1 }\r\n      case 'int16':\r\n        return { min: -(2 ** 15), max: 2 ** 15 - 1 }\r\n      case 'uint16':\r\n        return { min: 0, max: 2 ** 16 - 1 }\r\n      case 'int32':\r\n        return { min: -(2 ** 31), max: 2 ** 31 - 1 }\r\n      case 'uint32':\r\n        return { min: 0, max: 2 ** 32 - 1 }\r\n      case 'uint64':\r\n      case 'int64':\r\n      case 'float32':\r\n      case 'float64':\r\n        throw new InternetObjectError(ErrorCodes.unsupportedNumberType, `The number type '${type}' is not supported.`)\r\n      default:\r\n        return { min: null, max: null }\r\n    }\r\n  }\r\n\r\n  static get types() {\r\n    return NUMBER_TYPES\r\n  }\r\n}\r\n\r\nexport default NumberDef\r\n"],"mappings":"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","names":["import_decimal","Schema","BigIntDef","DecimalDef","doCommonTypeCheck","ValidationError","ErrorCodes","InternetObjectError"]}