{"version":3,"sources":["../../../src/schema/types/common-type.ts"],"sourcesContent":["import Definitions                    from '../../core/definitions'\r\nimport ErrorCodes                     from '../../errors/io-error-codes'\r\nimport InternetObjectValidationError  from '../../errors/io-validation-error'\r\nimport ErrorArgs                      from '../../errors/error-args'\r\nimport Node                           from '../../parser/nodes/nodes'\r\nimport TokenNode                      from '../../parser/nodes/tokens'\r\nimport TokenType                      from '../../parser/tokenizer/token-types'\r\nimport MemberDef                      from './memberdef'\r\n\r\ntype CommonTypeCheckResult = {\r\n  value:    any,\r\n  changed:  boolean\r\n}\r\n\r\ntype EqualityComparator = (value: any, choice: any) => boolean\r\n\r\n/**\r\n * Performs the common validations required before serialization and deserialization\r\n * @param memberDef The memberDef object\r\n * @param value The value which needs to be validated\r\n * @param node The node object, required for tracing line and column when parsing raw internet object code!\r\n * @param defs Optional definitions for resolving references\r\n * @param equalityComparator Optional callback for type-specific equality comparison in choices validation\r\n *\r\n * @internal\r\n */\r\nfunction doCommonTypeCheck(memberDef: MemberDef, value: any, node?: Node, defs?: Definitions, equalityComparator?: EqualityComparator): CommonTypeCheckResult {\r\n  const isUndefined = value === undefined || value instanceof TokenNode &&  value.type === TokenType.UNDEFINED\r\n  const isNull = node instanceof TokenNode ? node.value === null : value === null\r\n\r\n  // Check for undefined\r\n  if (isUndefined) {\r\n    if (memberDef.default !== undefined) {\r\n      // Two-stage dereferencing: defs passed for schema compilation runtime,\r\n      // but variables already resolved in processObject for data processing runtime\r\n      return { value:_default(memberDef.default, defs), changed: true }\r\n    }\r\n    if (memberDef.optional) return { value: undefined, changed: true }\r\n    throw new InternetObjectValidationError(..._valueRequired(memberDef, node))\r\n  }\r\n\r\n  // Check for null\r\n  if (isNull) {\r\n    if (memberDef.null) return { value: null, changed: true }\r\n    const msg = `Null is not allowed for ${memberDef.path}`\r\n    throw new InternetObjectValidationError(ErrorCodes.nullNotAllowed, msg, node)\r\n  }\r\n\r\n  value = (typeof value === 'object' && value.toValue) ? value.toValue(defs) : value\r\n\r\n  // Validate choices\r\n  if (memberDef.choices !== undefined) {\r\n    let val = value instanceof TokenNode ? value.value : value\r\n    let found = false\r\n    for (let choice of memberDef.choices) {\r\n      if (typeof choice === 'string' && choice[0] === '@') {\r\n        choice = defs?.getV(choice)\r\n        choice = (choice as any) instanceof TokenNode ? choice.value : choice\r\n      }\r\n\r\n      // Use custom equality comparator if provided, otherwise use simple equality\r\n      const isEqual = equalityComparator ? equalityComparator(val, choice) : val === choice\r\n      if (isEqual) {\r\n        found = true\r\n        break\r\n      }\r\n    }\r\n\r\n    if (!found) {\r\n      throw new InternetObjectValidationError(..._invlalidChoice(memberDef, value, node))\r\n    }\r\n  }\r\n\r\n  // If everything is okay, return same data\r\n  return { value: value, changed: false }\r\n}\r\n\r\n/**\r\n * Processes default values with two-stage variable dereferencing:\r\n * 1. Schema compilation runtime: Resolves variables when validating MemberDef constraints\r\n * 2. Data processing runtime: Variables already resolved by _resolveMemberDefVariables in processObject\r\n *\r\n * Also handles TokenNode unwrapping and string literal conversions (N, T, F).\r\n */\r\nfunction _default(value: any, defs?: Definitions) {\r\n  // Unwrap TokenNode and resolve variables if present\r\n  if (value instanceof TokenNode) {\r\n    // If it's a variable/schema reference, resolve it (schema compilation runtime)\r\n    if (typeof value.value === 'string' && value.value.startsWith('@') && defs) {\r\n      value = defs.getV(value)\r\n      // Unwrap TokenNode if getV returned one\r\n      value = (value as any) instanceof TokenNode ? value.value : value\r\n    } else {\r\n      value = value.value\r\n    }\r\n  }\r\n\r\n  // Resolve variable references in plain strings (data processing runtime fallback)\r\n  if (typeof value === 'string' && value.startsWith('@') && defs) {\r\n    value = defs.getV(value)\r\n    // Unwrap TokenNode if getV returned one\r\n    value = (value as any) instanceof TokenNode ? value.value : value\r\n  }\r\n\r\n  // Convert string literals\r\n  if (typeof value === 'string') {\r\n    if (value === 'N') return null\r\n    if (value === 'T' || value === 'true') return true\r\n    if (value === 'F' || value === 'false') return false\r\n  }\r\n\r\n  return value\r\n}function _valueRequired(memberDef: MemberDef, node?: Node): ErrorArgs {\r\n  const msg = `Value is required for ${memberDef.path}`\r\n  return [ErrorCodes.valueRequired, msg , node]\r\n}\r\n\r\nfunction _nullNotAllowed(memberDef: MemberDef, node?: Node): ErrorArgs {\r\n  return [ErrorCodes.nullNotAllowed, `${memberDef.path} does not support null.`, node]\r\n}\r\n\r\n// Return an invalid choice error parameters\r\nfunction _invlalidChoice(memberDef: MemberDef, value: any, node?: Node): ErrorArgs {\r\n  if (!memberDef.choices) throw Error('Choices not checked during NumberDef implementation.')\r\n  value = value.toValue\r\n            ? value.toValue()\r\n            : value.toObject\r\n              ? value.toObject()\r\n              : value\r\n  value = JSON.stringify(value)\r\n  let msg = `The value of \"${memberDef.path}\" must be one of the [${memberDef.choices.join(\r\n    ', '\r\n  )}]. Currently it is ${value}.`\r\n  if (memberDef.choices.length === 1) {\r\n    msg = `The value of \"${memberDef.path}\" must be '${memberDef.choices[0]}'. Currently it is ${value}.`\r\n  }\r\n\r\n  return [ErrorCodes.invalidChoice, msg, node]\r\n}\r\n\r\nexport default doCommonTypeCheck\r\n"],"mappings":"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","names":["TokenNode","TokenType","InternetObjectValidationError","ErrorCodes"]}