{"version":3,"file":"guardUtils.mjs","sources":["../../../src/lib/utils/guardUtils.ts"],"sourcesContent":["/**\n * @file Guard Utilities\n * @description Type guards and validation utilities\n */\n\n/**\n * Check if value is defined (not null or undefined)\n */\nexport function isDefined<T>(value: T | null | undefined): value is T {\n  return value !== null && value !== undefined;\n}\n\n/**\n * Check if value is null or undefined\n */\nexport function isNullish(value: unknown): value is null | undefined {\n  return value === null || value === undefined;\n}\n\n/**\n * Check if value is a string\n */\nexport function isString(value: unknown): value is string {\n  return typeof value === 'string';\n}\n\n/**\n * Check if value is a non-empty string\n */\nexport function isNonEmptyString(value: unknown): value is string {\n  return typeof value === 'string' && value.trim().length > 0;\n}\n\n/**\n * Check if value is a number\n */\nexport function isNumber(value: unknown): value is number {\n  return typeof value === 'number' && !isNaN(value);\n}\n\n/**\n * Check if value is a finite number\n */\nexport function isFiniteNumber(value: unknown): value is number {\n  return typeof value === 'number' && isFinite(value);\n}\n\n/**\n * Check if value is a boolean\n */\nexport function isBoolean(value: unknown): value is boolean {\n  return typeof value === 'boolean';\n}\n\n/**\n * Check if value is a function\n */\nexport function isFunction(value: unknown): value is (...args: unknown[]) => unknown {\n  return typeof value === 'function';\n}\n\n/**\n * Check if value is an object (not null, not array)\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Check if value is an array\n */\nexport function isArray<T = unknown>(value: unknown): value is T[] {\n  return Array.isArray(value);\n}\n\n/**\n * Check if value is a non-empty array\n */\nexport function isNonEmptyArray<T = unknown>(value: unknown): value is T[] {\n  return Array.isArray(value) && value.length > 0;\n}\n\n/**\n * Check if value is a Date\n */\nexport function isDate(value: unknown): value is Date {\n  return value instanceof Date && !isNaN(value.getTime());\n}\n\n/**\n * Check if value is a valid date string\n */\nexport function isDateString(value: unknown): value is string {\n  if (!isString(value)) return false;\n  const date = new Date(value);\n  return !isNaN(date.getTime());\n}\n\n/**\n * Check if value is a Promise\n */\nexport function isPromise<T = unknown>(value: unknown): value is Promise<T> {\n  return (\n    value instanceof Promise ||\n    (isObject(value) && isFunction(value.then) && isFunction(value.catch))\n  );\n}\n\n/**\n * Check if value matches a type guard\n */\nexport function assert<T>(\n  value: unknown,\n  guard: (value: unknown) => value is T,\n  message?: string\n): asserts value is T {\n  if (!guard(value)) {\n    throw new TypeError(message ?? 'Type assertion failed');\n  }\n}\n\n/**\n * Check if value is one of allowed values\n */\nexport function isOneOf<T>(value: unknown, allowedValues: readonly T[]): value is T {\n  return allowedValues.includes(value as T);\n}\n\n/**\n * Check if object has key\n */\nexport function hasKey<K extends string>(obj: unknown, key: K): obj is Record<K, unknown> {\n  return isObject(obj) && key in obj;\n}\n\n/**\n * Check if object has all required keys\n */\nexport function hasKeys<K extends string>(\n  obj: unknown,\n  keys: readonly K[]\n): obj is Record<K, unknown> {\n  return isObject(obj) && keys.every((key) => key in obj);\n}\n\n/**\n * Check if value is an Error\n */\nexport function isError(value: unknown): value is Error {\n  return value instanceof Error;\n}\n\n/**\n * Check if value is a valid email\n */\nexport function isEmail(value: unknown): value is string {\n  if (!isString(value)) return false;\n  const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n  return emailRegex.test(value);\n}\n\n/**\n * Check if value is a valid URL\n */\nexport function isUrl(value: unknown): value is string {\n  if (!isString(value)) return false;\n  try {\n    new URL(value);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Check if value is a valid UUID\n */\nexport function isUuid(value: unknown): value is string {\n  if (!isString(value)) return false;\n  const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n  return uuidRegex.test(value);\n}\n\n/**\n * Narrow type or return undefined\n */\nexport function narrow<T>(value: unknown, guard: (value: unknown) => value is T): T | undefined {\n  return guard(value) ? value : undefined;\n}\n\n/**\n * Narrow type or return default\n */\nexport function narrowOr<T>(\n  value: unknown,\n  guard: (value: unknown) => value is T,\n  defaultValue: T\n): T {\n  return guard(value) ? value : defaultValue;\n}\n\n/**\n * Create a type guard for object shape\n */\nexport function createShapeGuard<T extends Record<string, unknown>>(shape: {\n  [K in keyof T]: (value: unknown) => value is T[K];\n}): (value: unknown) => value is T {\n  return (value: unknown): value is T => {\n    if (!isObject(value)) return false;\n\n    for (const key of Object.keys(shape) as (keyof T)[]) {\n      if (!(key in value) || !shape[key](value[key as string])) {\n        return false;\n      }\n    }\n\n    return true;\n  };\n}\n\n/**\n * Safe JSON parse with type guard\n */\nexport function safeJsonParse<T>(\n  json: string,\n  guard: (value: unknown) => value is T\n): T | undefined {\n  try {\n    const parsed: unknown = JSON.parse(json);\n    return guard(parsed) ? parsed : undefined;\n  } catch {\n    return undefined;\n  }\n}\n"],"names":["isDefined","value","isNullish","isString","isNonEmptyString","isNumber","isFiniteNumber","isBoolean","isFunction","isObject","isArray","isNonEmptyArray","isDate","isDateString","date","isPromise","assert","guard","message","isOneOf","allowedValues","hasKey","obj","key","hasKeys","keys","isError","isEmail","isUrl","isUuid","narrow","narrowOr","defaultValue","createShapeGuard","shape","safeJsonParse","json","parsed"],"mappings":"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"}