{"version":3,"sources":["../../src/utils/common/hash.ts","../../src/utils/common/id.ts","../../src/utils/common/values.ts","../../src/utils/common/object.ts","../../src/utils/common/typeGuards.ts","../../src/utils/common/time.ts","../../src/utils/common/validation.ts","../../src/utils/featureFlags/context.ts","../../src/utils/featureFlags/conditions.ts","../../src/utils/runtime.ts","../../src/utils/files.ts","../../src/utils/mapperUtils.ts","../../src/utils/hmr-singleton.ts"],"names":["MATH_CONSTANTS"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Hash Utilities\n *\n * Common hashing functions for consistent data distribution and rollouts.\n *\n * @fileoverview Hash utility functions\n * @version 1.0.0\n */\n\nimport { MATH_CONSTANTS, FNV_CONSTANTS, HASH_SEED_CONSTANTS } from '@plyaz/config';\n\n/**\n * Optimized string hashing function for consistent distribution.\n * Uses FNV-1a hash algorithm for better distribution and performance.\n * FNV-1a provides excellent avalanche properties and is faster than\n * polynomial rolling hash for short to medium strings.\n *\n * @param str - String to hash\n * @returns Positive hash value\n *\n * @example\n * ```typescript\n * const hash = hashString('user123:AUTH_GOOGLE');\n * const bucket = hash % 100; // 0-99\n * ```\n *\n * @remarks\n * FNV-1a algorithm benefits:\n * - Excellent distribution for hash tables\n * - Fast computation with minimal operations\n * - Good avalanche effect (small input changes create large output changes)\n * - Consistent timing reduces timing attack vulnerabilities\n */\nexport function hashString(str: string): number {\n  // Handle empty string edge case early\n  if (str.length === 0) return 0;\n\n  // Use FNV-1a constants from config\n  let hash: number = FNV_CONSTANTS.FNV_32_OFFSET;\n\n  // Process string with FNV-1a algorithm\n  // Using charCodeAt is faster than alternatives and handles Unicode correctly\n  for (let i = 0; i < str.length; i++) {\n    // XOR with byte value then multiply by prime\n    // This order (XOR first) is what makes it FNV-1a vs FNV-1\n    hash ^= str.charCodeAt(i);\n    hash = Math.imul(hash, FNV_CONSTANTS.FNV_32_PRIME) >>> 0; // Ensure 32-bit unsigned\n  }\n\n  // Ensure positive value using >>> 0 for unsigned 32-bit conversion\n  // This is more efficient than Math.abs() and handles edge cases better\n  return hash >>> 0;\n}\n\n/**\n * Determines if a user should be included in a rollout based on percentage.\n * Uses consistent hashing to ensure the same user always gets the same result.\n *\n * @param identifier - Unique identifier for consistency (e.g., userId, flagKey)\n * @param percentage - Rollout percentage (0-100)\n * @returns true if identifier should be included in rollout\n *\n * @example\n * ```typescript\n * const shouldInclude = isInRollout('user123:AUTH_GOOGLE', 25); // 25% rollout\n * ```\n */\nexport function isInRollout(identifier: string, percentage: number): boolean {\n  if (percentage >= MATH_CONSTANTS.PERCENTAGE_MAX) return true;\n  if (percentage <= 0) return false;\n\n  const hash = hashString(identifier);\n  return hash % MATH_CONSTANTS.PERCENTAGE_MAX < percentage;\n}\n\n/**\n * Creates a consistent rollout identifier for a user and feature.\n *\n * @param featureKey - Feature or flag key\n * @param userId - User identifier (defaults to 'anonymous')\n * @returns Consistent identifier for rollout calculations\n *\n * @example\n * ```typescript\n * const identifier = createRolloutIdentifier('AUTH_GOOGLE', 'user123');\n * const inRollout = isInRollout(identifier, 50);\n * ```\n */\nexport function createRolloutIdentifier(featureKey: string, userId?: string): string {\n  const trimmedUserId = userId?.trim();\n  const effectiveUserId = trimmedUserId && trimmedUserId.length > 0 ? trimmedUserId : 'anonymous';\n  return `${featureKey}:${effectiveUserId}`;\n}\n\n/**\n * Hash-based utilities for consistent data operations.\n */\nexport const HashUtils = {\n  /**\n   * Generates a hash-based bucket for load balancing or distribution.\n   *\n   * @param identifier - Unique identifier\n   * @param bucketCount - Number of buckets (default: 10)\n   * @returns Bucket number (0 to bucketCount-1)\n   */\n  getBucket: (identifier: string, bucketCount: number = 10): number => {\n    return hashString(identifier) % bucketCount;\n  },\n\n  /**\n   * Checks if an identifier falls within a specific bucket range.\n   *\n   * @param identifier - Unique identifier\n   * @param startBucket - Starting bucket (inclusive)\n   * @param endBucket - Ending bucket (inclusive)\n   * @param totalBuckets - Total number of buckets (default: 100)\n   * @returns true if identifier is in the bucket range\n   */\n  isInBucketRange: (\n    identifier: string,\n    startBucket: number,\n    endBucket: number,\n    totalBuckets: number = MATH_CONSTANTS.PERCENTAGE_MAX\n  ): boolean => {\n    const bucket = hashString(identifier) % totalBuckets;\n    return bucket >= startBucket && bucket <= endBucket;\n  },\n\n  /**\n   * Creates a deterministic random seed from a string.\n   * Uses the improved hash function and ensures the seed is within\n   * the safe range for JavaScript's Math.random seeding.\n   *\n   * @param str - String to convert to seed\n   * @returns Deterministic seed value (0 to 2^31-1)\n   */\n  createSeed: (str: string): number => {\n    // Use constant from config for consistency\n    return hashString(str) % HASH_SEED_CONSTANTS.MAX_SAFE_SEED;\n  },\n} as const;\n","/**\n * ID Generation Utilities\n *\n * Provides consistent ID generation across the application.\n * Uses globalThis.crypto when available, with a fallback for environments without it.\n *\n * @fileoverview ID generation utility functions\n */\n\n// Constants for ID generation\nconst RANDOM_ID_RADIX = 36;\nconst RANDOM_ID_SLICE_START = 2;\nconst SHORT_ID_LENGTH = 8;\nconst HEX_RADIX = 16;\nconst HEX_SLICE_START = 2;\nconst HEX_SLICE_END = 18;\nconst SPAN_ID_LENGTH = 16;\n\n/**\n * Generate a UUID v4 string.\n * Uses crypto.randomUUID when available, otherwise falls back to a timestamp-based ID.\n *\n * @returns A UUID v4 string or fallback ID\n *\n * @example\n * ```typescript\n * const id = generateId();\n * // => 'a1b2c3d4-e5f6-7890-abcd-ef1234567890' (crypto available)\n * // => '1701475200000-x7k9m2' (fallback)\n * ```\n */\nexport function generateId(): string {\n  const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n  if (cryptoApi?.randomUUID) {\n    return cryptoApi.randomUUID();\n  }\n  return `${Date.now()}-${Math.random().toString(RANDOM_ID_RADIX).slice(RANDOM_ID_SLICE_START)}`;\n}\n\n/**\n * Generate a short random ID (8 characters).\n * Useful for correlation IDs, short references, etc.\n *\n * @returns A short random string\n *\n * @example\n * ```typescript\n * const shortId = generateShortId();\n * // => 'x7k9m2ab'\n * ```\n */\nexport function generateShortId(): string {\n  const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n  if (cryptoApi?.randomUUID) {\n    return cryptoApi.randomUUID().replace(/-/g, '').slice(0, SHORT_ID_LENGTH);\n  }\n  return Math.random()\n    .toString(RANDOM_ID_RADIX)\n    .slice(RANDOM_ID_SLICE_START, RANDOM_ID_SLICE_START + SHORT_ID_LENGTH);\n}\n\n/**\n * Generate a correlation ID for tracing.\n * Format: timestamp-randomString\n *\n * @returns A correlation ID string\n *\n * @example\n * ```typescript\n * const correlationId = generateCorrelationId();\n * // => '1701475200000-x7k9m2'\n * ```\n */\nexport function generateCorrelationId(): string {\n  return `${Date.now()}-${generateShortId()}`;\n}\n\n/**\n * Generate a trace ID for distributed tracing (32 hex characters / 128 bits).\n *\n * @returns A 32-character hex string\n *\n * @example\n * ```typescript\n * const traceId = generateTraceId();\n * // => 'a1b2c3d4e5f67890abcdef1234567890'\n * ```\n */\nexport function generateTraceId(): string {\n  const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n  if (cryptoApi?.randomUUID) {\n    // Use two UUIDs without dashes to get 64 hex chars, take first 32\n    return cryptoApi.randomUUID().replace(/-/g, '');\n  }\n  // Fallback: concatenate two random hex strings\n  return (\n    Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END) +\n    Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END)\n  );\n}\n\n/**\n * Generate a span ID for distributed tracing (16 hex characters / 64 bits).\n *\n * @returns A 16-character hex string\n *\n * @example\n * ```typescript\n * const spanId = generateSpanId();\n * // => 'a1b2c3d4e5f67890'\n * ```\n */\nexport function generateSpanId(): string {\n  const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n  if (cryptoApi?.randomUUID) {\n    // Use UUID without dashes, take first 16 chars\n    return cryptoApi.randomUUID().replace(/-/g, '').substring(0, SPAN_ID_LENGTH);\n  }\n  // Fallback: random hex string\n  return Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END);\n}\n\n/**\n * UUID v4 regex pattern.\n * Matches standard UUID format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n */\nconst UUID_REGEX = /^[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\n/**\n * Check if a string is a valid UUID v4.\n *\n * @param value - The string to check\n * @returns true if the string is a valid UUID\n *\n * @example\n * ```typescript\n * isValidUUID('a1b2c3d4-e5f6-4890-abcd-ef1234567890'); // true\n * isValidUUID('not-a-uuid'); // false\n * isValidUUID('bulk-upload-123456'); // false\n * ```\n */\nexport function isValidUUID(value: string | null | undefined): boolean {\n  if (!value) return false;\n  return UUID_REGEX.test(value);\n}\n\n/**\n * ID generation utilities object for convenient access.\n */\nexport const IdUtils = {\n  generate: generateId,\n  generateShort: generateShortId,\n  generateCorrelation: generateCorrelationId,\n  generateTraceId,\n  generateSpanId,\n  isValidUUID,\n} as const;\n","/* eslint-disable complexity */\n/**\n * Value Utilities\n *\n * Common utility functions for working with different value types.\n *\n * @fileoverview Value manipulation utilities\n * @version 1.0.0\n */\n\nimport { MATH_CONSTANTS } from '@plyaz/config';\n\n/**\n * Determines if a value should be considered 'truthy' for feature flags.\n * More strict than JavaScript's built-in truthiness.\n *\n * @param value - The value to check\n * @returns true if the value is considered enabled/truthy\n *\n * @example\n * ```typescript\n * isTruthy(true)        // true\n * isTruthy('enabled')   // true\n * isTruthy('')          // false\n * isTruthy('false')     // false\n * isTruthy(0)           // false\n * isTruthy(42)          // true\n * isTruthy({})          // false\n * ```\n */\n// Helper function to check if a string is falsy\nfunction isStringFalsy(value: string): boolean {\n  if (value === '') return true;\n  const lower = value.toLowerCase().trim();\n  return ['false', 'no', '0', 'off', 'disabled'].includes(lower);\n}\n\n// Helper function to check if an object is truthy\nfunction isObjectTruthy(value: object): boolean {\n  if (Array.isArray(value)) return value.length > 0;\n  if (value instanceof Map || value instanceof Set) return value.size > 0;\n  if (value.constructor === Object) return Object.keys(value).length > 0;\n  return true; // All other objects (Date, RegExp, etc) are truthy\n}\n\nexport function isTruthy(value: unknown): boolean {\n  if (value === null || value === undefined) return false;\n\n  switch (typeof value) {\n    case 'boolean':\n      return value;\n    case 'string':\n      return !isStringFalsy(value);\n    case 'number':\n      return value !== 0 && !isNaN(value);\n    case 'function':\n    case 'symbol':\n      return true;\n    case 'object':\n      return isObjectTruthy(value);\n    default:\n      return false;\n  }\n}\n\n/**\n * Safely converts a value to a boolean with feature flag semantics.\n *\n * @param value - Value to convert\n * @param defaultValue - Default if conversion fails (default: false)\n * @returns Boolean representation\n *\n * @example\n * ```typescript\n * toBoolean('true')     // true\n * toBoolean('yes')      // true\n * toBoolean('1')        // true\n * toBoolean('false')    // false\n * toBoolean('no')       // false\n * toBoolean('0')        // false\n * ```\n */\n// Helper function to parse string to boolean\nfunction parseStringToBoolean(value: string, defaultValue: boolean): boolean {\n  const lower = value.toLowerCase();\n  if (['true', 'yes', '1', 'on', 'enabled'].includes(lower)) return true;\n  if (['false', 'no', '0', 'off', 'disabled'].includes(lower)) return false;\n  return defaultValue;\n}\n\nexport function toBoolean(value: unknown, defaultValue: boolean = false): boolean {\n  if (value === null || value === undefined) return false;\n\n  switch (typeof value) {\n    case 'boolean':\n      return value;\n    case 'string':\n      return parseStringToBoolean(value, defaultValue);\n    case 'number':\n      return value !== 0 && !isNaN(value);\n    case 'object':\n    case 'function':\n      return true;\n    default:\n      return defaultValue;\n  }\n}\n\n/**\n * Safely converts a value to a number.\n * Handles bigint, string, and number types.\n *\n * @param value - Value to convert (bigint, number, or string)\n * @param defaultValue - Default if conversion fails (default: 0)\n * @returns Number representation\n *\n * @example\n * ```typescript\n * toNumber(42)              // 42\n * toNumber(BigInt(100))     // 100\n * toNumber('123')           // 123\n * toNumber('invalid')       // 0 (default)\n * toNumber('invalid', -1)   // -1 (custom default)\n * ```\n */\nexport function toNumber(\n  value: bigint | number | string | unknown,\n  defaultValue: number = 0\n): number {\n  if (value === null || value === undefined) return defaultValue;\n\n  if (typeof value === 'bigint') return Number(value);\n  if (typeof value === 'number') return isNaN(value) ? defaultValue : value;\n  if (typeof value === 'string') {\n    const parsed = Number.parseFloat(value);\n    return isNaN(parsed) ? defaultValue : parsed;\n  }\n\n  return defaultValue;\n}\n\n/**\n * Value validation and conversion utilities.\n */\nexport const ValueUtils = {\n  /**\n   * Checks if a value is a valid percentage (0-100).\n   *\n   * @param value - Value to check\n   * @returns true if valid percentage\n   */\n  isValidPercentage: (value: unknown): boolean => {\n    if (typeof value !== 'number') return false;\n    return !isNaN(value) && isFinite(value) && value >= 0 && value <= MATH_CONSTANTS.PERCENTAGE_MAX;\n  },\n\n  /**\n   * Clamps a number to a specific range.\n   *\n   * @param value - Value to clamp\n   * @param min - Minimum value\n   * @param max - Maximum value\n   * @returns Clamped value\n   */\n  clamp: (value: number, min: number, max: number): number => {\n    return Math.min(Math.max(value, min), max);\n  },\n\n  /**\n   * Checks if a value is empty (null, undefined, empty string, empty array).\n   *\n   * @param value - Value to check\n   * @returns true if empty\n   */\n  isEmpty: (value: unknown): boolean => {\n    if (value === null || value === undefined) return true;\n    if (typeof value === 'string') return value.trim() === '';\n    if (Array.isArray(value)) return value.length === 0;\n    if (typeof value === 'object') return Object.keys(value).length === 0;\n    return false;\n  },\n\n  /**\n   * Safely gets a nested property from an object.\n   *\n   * @param obj - Object to query\n   * @param path - Dot-separated path (e.g., 'user.profile.name')\n   * @param defaultValue - Default if path doesn't exist\n   * @returns Property value or default\n   */\n  getNestedProperty: (obj: unknown, path: string, defaultValue?: unknown): unknown => {\n    if (!obj || typeof obj !== 'object') return defaultValue;\n\n    const keys = path.split('.');\n    let current: unknown = obj;\n\n    for (const key of keys) {\n      if (current == null || typeof current !== 'object') return defaultValue;\n      current = (current as Record<string, unknown>)[key];\n      if (current === undefined) return defaultValue;\n    }\n\n    return current;\n  },\n} as const;\n","/**\n * Object Utilities\n *\n * Provides utilities for working with nested object paths and property access.\n *\n * @fileoverview Object manipulation utilities\n */\n\n/**\n * Sets a value at a nested path in an object, creating intermediate objects as needed.\n *\n * @param obj - The target object to modify\n * @param path - Dot-separated path to the property (e.g., 'user.profile.name')\n * @param value - The value to set at the path\n *\n * @example\n * ```typescript\n * const obj = { user: { id: 1 } };\n * setNestedProperty(obj, 'user.profile.name', 'John');\n * // Result: { user: { id: 1, profile: { name: 'John' } } }\n * ```\n */\nexport function setNestedProperty(\n  obj: Record<string, unknown>,\n  path: string,\n  value: unknown\n): void {\n  const keys = path.split('.');\n  let current: Record<string, unknown> = obj;\n\n  // Navigate to the parent object, creating intermediate objects as needed\n  for (let i = 0; i < keys.length - 1; i++) {\n    const key = keys[i];\n    if (!(key in current) || typeof current[key] !== 'object' || current[key] === null) {\n      current[key] = {};\n    }\n    current = current[key] as Record<string, unknown>;\n  }\n\n  // Set the final property\n  const finalKey = keys[keys.length - 1];\n  current[finalKey] = value;\n}\n\n/**\n * Gets a value at a nested path in an object.\n *\n * @param obj - The source object to read from\n * @param path - Dot-separated path to the property (e.g., 'user.profile.name')\n * @param defaultValue - Optional default value if the path doesn't exist\n * @returns The value at the path, or defaultValue if not found\n *\n * @example\n * ```typescript\n * const obj = { user: { profile: { name: 'John' } } };\n * getNestedProperty(obj, 'user.profile.name'); // 'John'\n * getNestedProperty(obj, 'user.settings.theme', 'dark'); // 'dark' (default)\n * ```\n */\nexport function getNestedProperty<T = unknown>(\n  obj: Record<string, unknown>,\n  path: string,\n  defaultValue?: T\n): T | undefined {\n  const keys = path.split('.');\n  let current: unknown = obj;\n\n  // Navigate through the path\n  for (const key of keys) {\n    if (current === null || current === undefined || typeof current !== 'object') {\n      return defaultValue;\n    }\n    current = (current as Record<string, unknown>)[key];\n  }\n\n  return current !== undefined ? (current as T) : defaultValue;\n}\n\n/**\n * Checks if a nested path exists in an object.\n *\n * @param obj - The object to check\n * @param path - Dot-separated path to check (e.g., 'user.profile.name')\n * @returns True if the path exists and is not undefined\n *\n * @example\n * ```typescript\n * const obj = { user: { profile: { name: 'John' } } };\n * hasNestedProperty(obj, 'user.profile.name'); // true\n * hasNestedProperty(obj, 'user.settings.theme'); // false\n * ```\n */\nexport function hasNestedProperty(obj: Record<string, unknown>, path: string): boolean {\n  const keys = path.split('.');\n  let current: unknown = obj;\n\n  for (const key of keys) {\n    if (current === null || current === undefined || typeof current !== 'object') {\n      return false;\n    }\n    if (!(key in (current as Record<string, unknown>))) {\n      return false;\n    }\n    current = (current as Record<string, unknown>)[key];\n  }\n\n  return current !== undefined;\n}\n\n/**\n * Object utilities namespace for convenient grouped access.\n *\n * @example\n * ```typescript\n * import { ObjectUtils } from '@plyaz/core/utils';\n *\n * ObjectUtils.setNestedProperty(obj, 'user.name', 'John');\n * const name = ObjectUtils.getNestedProperty(obj, 'user.name');\n * ```\n */\nexport const ObjectUtils = {\n  setNestedProperty,\n  getNestedProperty,\n  hasNestedProperty,\n} as const;\n","/**\n * Type Guards Utilities\n *\n * Common type guard functions for runtime type checking.\n */\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Generic Type Guards\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Check if value is a non-null object\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null;\n}\n\n/**\n * Check if object has a specific property\n */\nexport function hasProperty<K extends string>(obj: unknown, key: K): obj is Record<K, unknown> {\n  return isObject(obj) && key in obj;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Type Guard Utilities Class\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Type guard utilities grouped in a class for namespaced access\n */\nexport const TypeGuardUtils = {\n  isObject,\n  hasProperty,\n} as const;\n","/**\n * Time Utilities\n *\n * Utility functions for time-related operations.\n */\n\nimport { TIME_CONSTANTS } from '@plyaz/config/time';\n\n/**\n * Check if current time is within quiet hours.\n *\n * @param quietHoursStart - Start time in HH:MM format\n * @param quietHoursEnd - End time in HH:MM format\n * @param timezone - Timezone string (default: 'UTC')\n * @returns true if currently in quiet hours\n *\n * @example\n * ```typescript\n * // Check if 22:00 - 08:00 quiet hours are active\n * const inQuietHours = isInQuietHours('22:00', '08:00', 'America/New_York');\n * ```\n */\nexport function isInQuietHours(\n  quietHoursStart: string | null | undefined,\n  quietHoursEnd: string | null | undefined,\n  timezone: string = 'UTC'\n): boolean {\n  if (!quietHoursStart || !quietHoursEnd) return false;\n\n  try {\n    const now = new Date();\n    const formatter = new Intl.DateTimeFormat('en-US', {\n      timeZone: timezone,\n      hour: '2-digit',\n      minute: '2-digit',\n      hour12: false,\n    });\n    const parts = formatter.formatToParts(now);\n    const hour = Number.parseInt(parts.find(p => p.type === 'hour')?.value ?? '0', 10);\n    const minute = Number.parseInt(parts.find(p => p.type === 'minute')?.value ?? '0', 10);\n    const currentMinutes = hour * TIME_CONSTANTS.MINUTES_PER_HOUR + minute;\n\n    const [startHour, startMinute] = quietHoursStart.split(':').map(Number);\n    const [endHour, endMinute] = quietHoursEnd.split(':').map(Number);\n    const startMinutes = startHour * TIME_CONSTANTS.MINUTES_PER_HOUR + startMinute;\n    const endMinutes = endHour * TIME_CONSTANTS.MINUTES_PER_HOUR + endMinute;\n\n    // Handle overnight quiet hours (e.g., 22:00 - 08:00)\n    if (startMinutes > endMinutes) {\n      return currentMinutes >= startMinutes || currentMinutes < endMinutes;\n    }\n    return currentMinutes >= startMinutes && currentMinutes < endMinutes;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Check if a campaign is expired based on start date and duration\n */\nexport function isCampaignExpired(\n  startDate: Date | undefined,\n  duration: number | undefined\n): boolean {\n  if (!startDate || !duration) return false;\n  const endDate = new Date(startDate.getTime() + duration * TIME_CONSTANTS.DAY);\n  return new Date() > endDate;\n}\n\n/**\n * Calculate remaining days for a campaign\n */\nexport function getCampaignDaysRemaining(\n  startDate: Date | undefined,\n  duration: number | undefined\n): number {\n  if (!startDate || !duration) return 0;\n  const endDate = new Date(startDate.getTime() + duration * TIME_CONSTANTS.DAY);\n  const now = new Date();\n  const diffTime = endDate.getTime() - now.getTime();\n  return Math.max(0, Math.ceil(diffTime / TIME_CONSTANTS.DAY));\n}\n\n/** Time utilities namespace */\nexport const TimeUtils = {\n  isInQuietHours,\n  isCampaignExpired,\n  getCampaignDaysRemaining,\n} as const;\n","/**\n * Validation Utility Functions\n */\n\nimport { FEATURE_FLAG_PROVIDERS } from '@plyaz/types';\n\n/**\n * Type guard to check if value is string\n */\nexport const isString = (value: unknown): value is string => typeof value === 'string';\n\n/**\n * Type guard to check if value is defined (not undefined)\n */\nexport const isDefined = <T>(value: T | undefined): value is T => value !== undefined;\n\n/**\n * Type guard to check if value is number\n */\nexport const isNumber = (value: unknown): value is number => typeof value === 'number';\n\n/**\n * Helper function to get all valid provider types as array\n */\nexport const getValidProviders = (): string[] => Object.values(FEATURE_FLAG_PROVIDERS);\n","/**\n * Feature Flag Context Utilities\n *\n * Utilities for building, validating, and manipulating feature flag contexts.\n *\n * @fileoverview Feature flag context utilities\n * @version 1.0.0\n */\n\nimport type { FeatureFlagContext } from '@plyaz/types';\nimport { ISO_STANDARDS } from '@plyaz/config';\n\n/**\n * Builder class for creating feature flag evaluation contexts.\n * Provides a fluent interface for setting context properties.\n *\n * @class FeatureFlagContextBuilder\n *\n * @example\n * ```typescript\n * const context = new FeatureFlagContextBuilder()\n *   .setUserId('user123')\n *   .setUserRole('premium')\n *   .setEnvironment('production')\n *   .setPlatform('web')\n *   .setCustom({ subscription: 'premium', betaTester: true })\n *   .build();\n * ```\n */\nexport class FeatureFlagContextBuilder {\n  private context: Partial<FeatureFlagContext> = {};\n\n  /**\n   * Sets the user ID in the context.\n   *\n   * @param userId - User identifier\n   * @returns Builder instance for chaining\n   */\n  setUserId(userId: string): this {\n    this.context.userId = userId;\n    return this;\n  }\n\n  /**\n   * Sets the user email in the context.\n   *\n   * @param userEmail - User email address\n   * @returns Builder instance for chaining\n   */\n  setUserEmail(userEmail: string): this {\n    this.context.userEmail = userEmail;\n    return this;\n  }\n\n  /**\n   * Sets the user role in the context.\n   *\n   * @param userRole - User role or permission level\n   * @returns Builder instance for chaining\n   */\n  setUserRole(userRole: string): this {\n    this.context.userRole = userRole;\n    return this;\n  }\n\n  /**\n   * Sets the country in the context.\n   *\n   * @param country - Country code (ISO 3166-1 alpha-2)\n   * @returns Builder instance for chaining\n   */\n  setCountry(country: string): this {\n    this.context.country = country;\n    return this;\n  }\n\n  /**\n   * Sets the platform in the context.\n   *\n   * @param platform - Platform type\n   * @returns Builder instance for chaining\n   */\n  setPlatform(platform: 'web' | 'mobile' | 'desktop'): this {\n    this.context.platform = platform;\n    return this;\n  }\n\n  /**\n   * Sets the version in the context.\n   *\n   * @param version - Application version\n   * @returns Builder instance for chaining\n   */\n  setVersion(version: string): this {\n    this.context.version = version;\n    return this;\n  }\n\n  /**\n   * Sets the environment in the context.\n   *\n   * @param environment - Current environment\n   * @returns Builder instance for chaining\n   */\n  setEnvironment(environment: 'development' | 'staging' | 'production'): this {\n    this.context.environment = environment;\n    return this;\n  }\n\n  /**\n   * Sets custom context data.\n   *\n   * @param custom - Custom context properties\n   * @returns Builder instance for chaining\n   */\n  setCustom(custom: Record<string, unknown>): this {\n    this.context.custom = { ...this.context.custom, ...custom };\n    return this;\n  }\n\n  /**\n   * Adds a single custom property to the context.\n   *\n   * @param key - Custom property key\n   * @param value - Custom property value\n   * @returns Builder instance for chaining\n   */\n  addCustomProperty(key: string, value: unknown): this {\n    this.context.custom ??= {};\n    this.context.custom[key] = value;\n    return this;\n  }\n\n  /**\n   * Builds the final context object.\n   * Validates required fields and returns the context.\n   *\n   * @returns Complete feature flag context\n   * @throws Error if required environment is not set\n   */\n  build(): FeatureFlagContext {\n    return {\n      environment: this.context.environment ?? 'development',\n      userId: this.context.userId,\n      userEmail: this.context.userEmail,\n      userRole: this.context.userRole,\n      country: this.context.country,\n      platform: this.context.platform,\n      version: this.context.version,\n      custom: this.context.custom,\n    } satisfies FeatureFlagContext;\n  }\n\n  /**\n   * Clears all context data and resets the builder.\n   *\n   * @returns Builder instance for chaining\n   */\n  clear(): this {\n    this.context = {};\n    return this;\n  }\n\n  /**\n   * Creates a copy of the current builder state.\n   *\n   * @returns New builder instance with copied context\n   */\n  clone(): FeatureFlagContextBuilder {\n    const cloned = new FeatureFlagContextBuilder();\n    cloned.context = { ...this.context };\n    if (this.context.custom) {\n      cloned.context.custom = { ...this.context.custom };\n    }\n    return cloned;\n  }\n}\n\n/**\n * Context utilities for common scenarios.\n */\nexport const ContextUtils = {\n  /**\n   * Creates a basic context for anonymous users using the builder.\n   *\n   * @param environment - Target environment\n   * @param platform - User platform\n   * @returns Basic anonymous context\n   */\n  createAnonymousContext(\n    environment: 'development' | 'staging' | 'production',\n    platform: 'web' | 'mobile' | 'desktop' = 'web'\n  ): FeatureFlagContext {\n    return new FeatureFlagContextBuilder()\n      .setEnvironment(environment)\n      .setPlatform(platform)\n      .build();\n  },\n\n  /**\n   * Creates a context for authenticated users using the builder.\n   *\n   * @param params - User context parameters\n   * @returns User context\n   */\n  createUserContext(params: {\n    userId: string;\n    environment: 'development' | 'staging' | 'production';\n    userEmail?: string;\n    userRole?: string;\n    platform?: 'web' | 'mobile' | 'desktop';\n    country?: string;\n    version?: string;\n    custom?: Record<string, unknown>;\n  }): FeatureFlagContext {\n    const builder = new FeatureFlagContextBuilder()\n      .setUserId(params.userId)\n      .setEnvironment(params.environment);\n\n    if (params.userEmail) builder.setUserEmail(params.userEmail);\n    if (params.userRole) builder.setUserRole(params.userRole);\n    if (params.platform) builder.setPlatform(params.platform);\n    if (params.country) builder.setCountry(params.country);\n    if (params.version) builder.setVersion(params.version);\n    if (params.custom) builder.setCustom(params.custom);\n\n    return builder.build();\n  },\n\n  /**\n   * Creates a testing context with minimal required fields.\n   *\n   * @param overrides - Optional context overrides\n   * @returns Testing context\n   */\n  createTestingContext(overrides: Partial<FeatureFlagContext> = {}): FeatureFlagContext {\n    return {\n      environment: 'development',\n      platform: 'web',\n      ...overrides,\n    };\n  },\n\n  /**\n   * Validates if a context object is complete and valid.\n   *\n   * @param context - Context to validate\n   * @returns Validation result\n   */\n  validateContext(context: Partial<FeatureFlagContext>): {\n    isValid: boolean;\n    errors: string[];\n  } {\n    const errors: string[] = [];\n\n    if (!context.environment) {\n      errors.push('Environment is required');\n    } else if (!['development', 'staging', 'production'].includes(context.environment)) {\n      errors.push('Environment must be development, staging, or production');\n    }\n\n    if (context.platform && !['web', 'mobile', 'desktop'].includes(context.platform)) {\n      errors.push('Platform must be web, mobile, or desktop');\n    }\n\n    if (context.country && context.country.length !== ISO_STANDARDS.ISO_COUNTRY_CODE_LENGTH) {\n      errors.push('Country must be a 2-letter ISO country code');\n    }\n\n    return {\n      isValid: errors.length === 0,\n      errors,\n    };\n  },\n\n  /**\n   * Merges multiple context objects, with later contexts taking precedence.\n   *\n   * @param contexts - Array of contexts to merge\n   * @returns Merged context\n   */\n  mergeContexts(...contexts: Partial<FeatureFlagContext>[]): FeatureFlagContext {\n    const merged = contexts.reduce((acc, context) => {\n      const result = {\n        ...acc,\n        ...context,\n      };\n\n      // Only merge custom if either has it\n      if (acc.custom || context.custom) {\n        result.custom = {\n          ...acc.custom,\n          ...context.custom,\n        };\n      }\n\n      return result;\n    }, {} as Partial<FeatureFlagContext>);\n\n    merged.environment ??= 'development';\n\n    return merged as FeatureFlagContext;\n  },\n\n  /**\n   * Extracts a specific field value from a context.\n   *\n   * @param field - Field name to extract\n   * @param context - Context object\n   * @returns Field value or undefined\n   */\n  getContextValue(field: string, context: FeatureFlagContext): unknown {\n    const standardFields = {\n      userId: (ctx: FeatureFlagContext) => ctx.userId,\n      userEmail: (ctx: FeatureFlagContext) => ctx.userEmail,\n      userRole: (ctx: FeatureFlagContext) => ctx.userRole,\n      country: (ctx: FeatureFlagContext) => ctx.country,\n      platform: (ctx: FeatureFlagContext) => ctx.platform,\n      version: (ctx: FeatureFlagContext) => ctx.version,\n      environment: (ctx: FeatureFlagContext) => ctx.environment,\n      custom: (ctx: FeatureFlagContext) => ctx.custom,\n    };\n\n    if (field in standardFields) {\n      return standardFields[field as keyof typeof standardFields](context);\n    }\n\n    return context.custom?.[field];\n  },\n\n  /**\n   * Creates a context fingerprint for caching and consistency.\n   *\n   * @param context - Context to fingerprint\n   * @returns String fingerprint\n   */\n  createFingerprint(context: FeatureFlagContext): string {\n    const relevant = {\n      userId: context.userId,\n      userRole: context.userRole,\n      environment: context.environment,\n      platform: context.platform,\n      country: context.country,\n      version: context.version,\n      custom: context.custom,\n    };\n\n    // Filter out undefined values and sort keys for consistency\n    const filtered = Object.entries(relevant)\n      .filter(([, value]) => value !== undefined)\n      .sort(([a], [b]) => a.localeCompare(b))\n      .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {});\n\n    return JSON.stringify(filtered);\n  },\n\n  /**\n   * Sanitizes a context by removing sensitive information.\n   *\n   * @param context - Context to sanitize\n   * @param sensitiveFields - Fields to remove (default: ['userEmail'])\n   * @returns Sanitized context\n   */\n  sanitizeContext(\n    context: FeatureFlagContext,\n    sensitiveFields: string[] = ['userEmail']\n  ): FeatureFlagContext {\n    const sanitized = { ...context };\n\n    // Deep copy custom object if it exists\n    if (context.custom) {\n      sanitized.custom = { ...context.custom };\n    }\n\n    for (const field of sensitiveFields) {\n      if (field in sanitized) {\n        delete (sanitized as Record<string, unknown>)[field];\n      }\n      if (sanitized.custom && field in sanitized.custom) {\n        delete sanitized.custom[field];\n      }\n    }\n\n    return sanitized;\n  },\n} as const;\n\n/**\n * Utility for creating feature flag context for backend applications.\n *\n * @param params - Context parameters\n * @returns Backend-optimized feature flag context\n */\nexport function createBackendContext(params: {\n  userId?: string;\n  userEmail?: string;\n  environment: 'development' | 'staging' | 'production';\n  userRole?: string;\n  platform?: 'api' | 'worker' | 'cron';\n  country?: string;\n  version?: string;\n  custom?: Record<string, unknown>;\n}): {\n  environment: 'development' | 'staging' | 'production';\n  userId?: string;\n  userEmail?: string;\n  userRole?: string;\n  platform: 'api' | 'worker' | 'cron';\n  country?: string;\n  version?: string;\n  custom?: Record<string, unknown>;\n} {\n  return {\n    environment: params.environment,\n    userId: params.userId,\n    userEmail: params.userEmail,\n    userRole: params.userRole,\n    platform: params.platform ?? 'api',\n    country: params.country,\n    version: params.version,\n    custom: params.custom,\n  };\n}\n\n/**\n * Utility for creating feature flag context for frontend applications.\n *\n * @param params - Context parameters\n * @returns Frontend-optimized feature flag context\n */\nexport function createFrontendContext(params: {\n  userId?: string;\n  userEmail?: string;\n  environment: 'development' | 'staging' | 'production';\n  userRole?: string;\n  platform?: 'web' | 'mobile' | 'desktop';\n  country?: string;\n  version?: string;\n  custom?: Record<string, unknown>;\n}): {\n  environment: 'development' | 'staging' | 'production';\n  userId?: string;\n  userEmail?: string;\n  userRole?: string;\n  platform: 'web' | 'mobile' | 'desktop';\n  country?: string;\n  version?: string;\n  custom?: Record<string, unknown>;\n} {\n  return {\n    environment: params.environment,\n    userId: params.userId,\n    userEmail: params.userEmail,\n    userRole: params.userRole,\n    platform: params.platform ?? 'web',\n    country: params.country,\n    version: params.version,\n    custom: params.custom,\n  };\n}\n","/**\n * Feature Flag Condition Utilities\n *\n * Utilities for evaluating feature flag conditions and rules.\n *\n * @fileoverview Condition evaluation utilities\n * @version 1.0.0\n */\n\nimport type { FeatureFlagCondition } from '@plyaz/types';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\n\n/**\n * Evaluates condition operator against context value.\n *\n * @param condition - The condition to evaluate\n * @param contextValue - The context value to check against\n * @returns true if the condition matches\n */\nexport function evaluateConditionOperator(\n  condition: FeatureFlagCondition,\n  contextValue: unknown\n): boolean {\n  const { operator } = condition;\n\n  if (isEqualityOperator(operator)) {\n    return evaluateEqualityOperator(operator, contextValue, condition.value);\n  }\n\n  if (isStringOperator(operator)) {\n    return evaluateStringOperator(operator, contextValue, condition.value);\n  }\n\n  if (isArrayOperator(operator)) {\n    return evaluateArrayOperator(operator, condition.value, contextValue);\n  }\n\n  if (isNumericOperator(operator)) {\n    return evaluateNumericOperator(operator, contextValue, condition.value);\n  }\n\n  return false;\n}\n\n/**\n * Checks if operator is equality-based.\n *\n * @param operator - The operator to check\n * @returns true if equality operator\n */\nexport function isEqualityOperator(operator: string): boolean {\n  return operator === 'equals' || operator === 'not_equals';\n}\n\n/**\n * Checks if operator is string-based.\n *\n * @param operator - The operator to check\n * @returns true if string operator\n */\nexport function isStringOperator(operator: string): boolean {\n  return operator === 'contains' || operator === 'not_contains';\n}\n\n/**\n * Checks if operator is array-based.\n *\n * @param operator - The operator to check\n * @returns true if array operator\n */\nexport function isArrayOperator(operator: string): boolean {\n  return operator === 'in' || operator === 'not_in';\n}\n\n/**\n * Checks if operator is numeric-based.\n *\n * @param operator - The operator to check\n * @returns true if numeric operator\n */\nexport function isNumericOperator(operator: string): boolean {\n  return operator === 'greater_than' || operator === 'less_than';\n}\n\n/**\n * Evaluates equality operators.\n *\n * @param operator - equals or not_equals\n * @param contextValue - Value from context\n * @param conditionValue - Value from condition\n * @returns Evaluation result\n */\nexport function evaluateEqualityOperator(\n  operator: string,\n  contextValue: unknown,\n  conditionValue: unknown\n): boolean {\n  const isEqual = contextValue === conditionValue;\n  return operator === 'equals' ? isEqual : !isEqual;\n}\n\n/**\n * Evaluates string operators.\n *\n * @param operator - contains or not_contains\n * @param contextValue - Value from context\n * @param conditionValue - Value from condition\n * @returns Evaluation result\n */\nexport function evaluateStringOperator(\n  operator: string,\n  contextValue: unknown,\n  conditionValue: unknown\n): boolean {\n  // Handle string contains\n  if (typeof contextValue === 'string' && typeof conditionValue === 'string') {\n    const contains = contextValue.includes(conditionValue);\n    return operator === 'contains' ? contains : !contains;\n  }\n\n  // Handle array contains\n  if (Array.isArray(contextValue) && typeof conditionValue === 'string') {\n    const contains = contextValue.includes(conditionValue);\n    return operator === 'contains' ? contains : !contains;\n  }\n\n  // For not_contains, if neither string nor array match, return true\n  return operator === 'not_contains';\n}\n\n/**\n * Evaluates array operators.\n *\n * @param operator - in or not_in\n * @param conditionValue - Array value from condition\n * @param contextValue - Value from context\n * @returns Evaluation result\n */\nexport function evaluateArrayOperator(\n  operator: string,\n  conditionValue: unknown,\n  contextValue: unknown\n): boolean {\n  if (!Array.isArray(conditionValue)) {\n    // For not_in operator, if condition value is not an array, return true\n    return operator === 'not_in';\n  }\n\n  const isIncluded = conditionValue.includes(contextValue);\n  return operator === 'in' ? isIncluded : !isIncluded;\n}\n\n/**\n * Evaluates numeric operators.\n *\n * @param operator - greater_than or less_than\n * @param contextValue - Value from context\n * @param conditionValue - Value from condition\n * @returns Evaluation result\n */\nfunction compareValues<T>(operator: string, left: T, right: T): boolean {\n  switch (operator) {\n    case 'greater_than':\n      return left > right;\n    case 'less_than':\n      return left < right;\n    default:\n      return false;\n  }\n}\n\nexport function evaluateNumericOperator(\n  operator: string,\n  contextValue: unknown,\n  conditionValue: unknown\n): boolean {\n  // Try numeric comparison first\n  const contextNum = Number(contextValue);\n  const conditionNum = Number(conditionValue);\n\n  if (!isNaN(contextNum) && !isNaN(conditionNum)) {\n    return compareValues(operator, contextNum, conditionNum);\n  }\n\n  // Fall back to string comparison for non-numeric values\n  if (typeof contextValue === 'string' && typeof conditionValue === 'string') {\n    return compareValues(operator, contextValue, conditionValue);\n  }\n\n  return false;\n}\n\n/**\n * Condition evaluation utilities.\n */\nexport const ConditionUtils = {\n  /**\n   * Evaluates multiple conditions with AND logic.\n   *\n   * @param conditions - Array of conditions\n   * @param contextValue - Context value getter function\n   * @returns true if all conditions match\n   */\n  evaluateConditionsAnd: (\n    conditions: FeatureFlagCondition[],\n    contextValue: (field: string) => unknown\n  ): boolean => {\n    if (conditions.length === 0) return true;\n\n    return conditions.every(condition => {\n      const value = contextValue(condition.field);\n      if (value === undefined) return false;\n      return evaluateConditionOperator(condition, value);\n    });\n  },\n\n  /**\n   * Evaluates multiple conditions with OR logic.\n   *\n   * @param conditions - Array of conditions\n   * @param contextValue - Context value getter function\n   * @returns true if any condition matches\n   */\n  evaluateConditionsOr: (\n    conditions: FeatureFlagCondition[],\n    contextValue: (field: string) => unknown\n  ): boolean => {\n    if (conditions.length === 0) return true;\n\n    return conditions.some(condition => {\n      const value = contextValue(condition.field);\n      if (value === undefined) return false;\n      return evaluateConditionOperator(condition, value);\n    });\n  },\n\n  /**\n   * Validates a condition structure.\n   *\n   * @param condition - Condition to validate\n   * @returns Validation result\n   */\n  validateCondition: (\n    condition: Partial<FeatureFlagCondition>\n  ): {\n    isValid: boolean;\n    errors: string[];\n  } => {\n    const errors: string[] = [];\n\n    if (!condition.field) {\n      errors.push('Field is required');\n    }\n\n    if (!condition.operator) {\n      errors.push('Operator is required');\n    } else {\n      const validOperators = [\n        'equals',\n        'not_equals',\n        'contains',\n        'not_contains',\n        'in',\n        'not_in',\n        'greater_than',\n        'less_than',\n      ];\n      if (!validOperators.includes(condition.operator)) {\n        errors.push(`Invalid operator: ${condition.operator}`);\n      }\n    }\n\n    if (condition.value === undefined) {\n      errors.push('Value is required');\n    }\n\n    return {\n      isValid: errors.length === 0,\n      errors,\n    };\n  },\n\n  /**\n   * Creates a condition object with validation.\n   *\n   * @param field - Context field to evaluate\n   * @param operator - Comparison operator\n   * @param value - Value to compare against\n   * @returns Valid condition object\n   */\n  createCondition: (\n    field: string,\n    operator: FeatureFlagCondition['operator'],\n    value: FeatureFlagCondition['value']\n  ): FeatureFlagCondition => {\n    const condition = { field, operator, value } as FeatureFlagCondition;\n    const validation = ConditionUtils.validateCondition(condition);\n\n    if (!validation.isValid) {\n      throw new CorePackageError(\n        `Invalid condition: ${validation.errors.join(', ')}`,\n        ERROR_CODES.VALIDATION_ERROR\n      );\n    }\n\n    return condition;\n  },\n} as const;\n","/**\n * Runtime Detection Utilities\n *\n * Utilities for detecting the current JavaScript runtime environment.\n */\n\nimport type { CoreRuntimeEnvironment } from '@plyaz/types/core';\nimport { PackageLogger } from '@plyaz/logger';\n\n// Type-safe access to alternative runtime globals\nconst getGlobalProperty = (key: string): unknown => {\n  return (globalThis as Record<string, unknown>)[key];\n};\n\nconst logger = new PackageLogger({ packageName: 'core', service: 'Runtime' });\n\n/**\n * Check if a module is available via require.resolve\n */\nfunction isModuleAvailable(moduleName: string): boolean {\n  const nodeRequire = globalThis.require;\n  if (!nodeRequire) return false;\n\n  const resolveModule = nodeRequire.resolve;\n  if (!resolveModule) return false;\n\n  try {\n    resolveModule(moduleName);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/** Check for alternative runtimes (Deno, Bun) */\nfunction detectAltRuntime(): CoreRuntimeEnvironment | null {\n  if (typeof getGlobalProperty('Deno') !== 'undefined') return 'deno';\n  if (typeof getGlobalProperty('Bun') !== 'undefined') return 'bun';\n  return null;\n}\n\n/** Check for edge runtime */\nfunction detectEdgeRuntime(): CoreRuntimeEnvironment | null {\n  if (typeof getGlobalProperty('EdgeRuntime') !== 'undefined') return 'edge';\n  const isEdgeLike =\n    typeof globalThis.caches !== 'undefined' &&\n    typeof globalThis.Request !== 'undefined' &&\n    typeof process === 'undefined';\n  return isEdgeLike ? 'edge' : null;\n}\n\n/** Check for browser environment */\nfunction detectBrowser(): CoreRuntimeEnvironment | null {\n  if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n    return 'browser';\n  }\n  return null;\n}\n\n/** Check for Node.js framework */\nfunction detectNodeFramework(): CoreRuntimeEnvironment {\n  // Check for Nuxt (SSR)\n  if (process.env.__NUXT__ || process.env.NUXT_APP) return 'nuxt';\n  // Check for Next.js (SSR)\n  if (process.env.__NEXT_PRIVATE_ORIGIN || process.env.NEXT_RUNTIME) return 'nextjs';\n  // Check for NestJS via module detection\n  if (isModuleAvailable('@nestjs/core')) return 'nestjs';\n  // Check for Express via module detection\n  if (isModuleAvailable('express')) return 'express';\n  return 'node';\n}\n\n/**\n * Detect the current runtime environment\n */\nexport function detectRuntime(): CoreRuntimeEnvironment {\n  // Check alternative runtimes first\n  const altRuntime = detectAltRuntime();\n  if (altRuntime) return altRuntime;\n\n  // Check for edge runtime\n  const edgeRuntime = detectEdgeRuntime();\n  if (edgeRuntime) return edgeRuntime;\n\n  // Check for browser\n  const browser = detectBrowser();\n  if (browser) return browser;\n\n  // Server-side detection (Node.js based)\n  if (typeof process !== 'undefined' && process.versions?.node) {\n    return detectNodeFramework();\n  }\n\n  return 'unknown';\n}\n\n/**\n * Load environment variables from a .env file\n */\nexport async function loadEnvFile(envPath: string, verbose?: boolean): Promise<void> {\n  try {\n    const dotenv = await import('dotenv');\n    const result = dotenv.config({ path: envPath });\n\n    if (result.error) {\n      logger.warn(`Failed to load env file: ${result.error.message}`);\n    } else if (verbose) {\n      logger.info(`Loaded env from: ${envPath}`);\n    }\n  } catch {\n    logger.warn('dotenv not available, skipping .env file loading');\n  }\n}\n","/**\n * ============================================================================\n * FILE OPERATION UTILITIES\n * ============================================================================\n *\n * Framework-agnostic utilities for common file operations:\n * - Base64 encoding/decoding\n * - Blob creation and download triggering\n * - File key parsing\n * - Filename generation\n *\n * These utilities work in both browser and Node.js environments.\n */\n\nimport {\n  MIME_TYPE_EXTENSIONS,\n  FILE_SIZE_UNITS,\n  FILE_SIZE_MULTIPLIERS,\n  type ParsedFileKey,\n} from '@plyaz/types/core';\n\n// File key path segment counts\nconst FILE_KEY_FULL_PATH_SEGMENTS = 4;\nconst FILE_KEY_THREE_SEGMENTS = 3;\nconst FILE_KEY_TWO_SEGMENTS = 2;\nconst MIME_TYPE_PARTS = 2;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// BASE64 CONVERSION\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Convert a File to base64 string (browser only).\n *\n * @param file - The File object to convert\n * @returns Promise resolving to base64 encoded string (without data URL prefix)\n *\n * @example\n * ```typescript\n * const base64 = await fileToBase64(file);\n * // Use for API upload\n * ```\n */\nexport function fileToBase64(file: File): Promise<string> {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    reader.onload = () => {\n      const result = reader.result as string;\n      // Remove data URL prefix (e.g., \"data:application/pdf;base64,\")\n      const base64 = result.split(',')[1] || result;\n      resolve(base64);\n    };\n    reader.onerror = () => reject(reader.error);\n    reader.readAsDataURL(file);\n  });\n}\n\n/**\n * Convert a base64 string to a Blob (browser only).\n *\n * @param base64 - The base64 encoded string\n * @param mimeType - The MIME type for the blob (default: 'application/octet-stream')\n * @returns A Blob containing the decoded data\n *\n * @example\n * ```typescript\n * const blob = base64ToBlob(downloadResult.buffer, 'application/pdf');\n * downloadBlob(blob, 'document.pdf');\n * ```\n */\nexport function base64ToBlob(base64: string, mimeType = 'application/octet-stream'): Blob {\n  const binary = atob(base64);\n  const bytes = new Uint8Array(binary.length);\n  for (let i = 0; i < binary.length; i++) {\n    bytes[i] = binary.charCodeAt(i);\n  }\n  return new Blob([bytes], { type: mimeType });\n}\n\n/**\n * Convert a base64 string to a Buffer (Node.js only).\n *\n * @param base64 - The base64 encoded string\n * @returns A Buffer containing the decoded data\n *\n * @example\n * ```typescript\n * const buffer = base64ToBuffer(encodedData);\n * fs.writeFileSync('output.pdf', buffer);\n * ```\n */\nexport function base64ToBuffer(base64: string): Buffer {\n  return Buffer.from(base64, 'base64');\n}\n\n/**\n * Convert a Buffer or Uint8Array to a base64 string.\n *\n * @param data - The binary data to encode\n * @returns The base64 encoded string\n *\n * @example\n * ```typescript\n * const base64 = bufferToBase64(fileBuffer);\n * ```\n */\nexport function bufferToBase64(data: Buffer | Uint8Array): string {\n  if (Buffer.isBuffer(data)) {\n    return data.toString('base64');\n  }\n  return Buffer.from(data).toString('base64');\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// BROWSER DOWNLOAD\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Trigger a browser download of a Blob.\n *\n * Creates a temporary anchor element to trigger the download,\n * then cleans up the object URL.\n *\n * @param blob - The Blob to download\n * @param filename - The filename to save as\n *\n * @example\n * ```typescript\n * const blob = base64ToBlob(data, 'application/pdf');\n * downloadBlob(blob, 'invoice.pdf');\n * ```\n */\nexport function downloadBlob(blob: Blob, filename: string): void {\n  // Browser-only function - check if we're in a browser environment\n  const win = globalThis as typeof globalThis & { document?: Document };\n  if (!win.document) return;\n\n  const url = URL.createObjectURL(blob);\n  const a = win.document.createElement('a');\n  a.href = url;\n  a.download = filename;\n  win.document.body.appendChild(a);\n  a.click();\n  win.document.body.removeChild(a);\n  URL.revokeObjectURL(url);\n}\n\n/**\n * Download a base64-encoded file in the browser.\n * Combines base64ToBlob and downloadBlob for convenience.\n *\n * @param base64 - The base64 encoded data\n * @param filename - The filename to save as\n * @param mimeType - The MIME type (default: 'application/octet-stream')\n *\n * @example\n * ```typescript\n * downloadBase64(response.data, 'report.pdf', 'application/pdf');\n * ```\n */\nexport function downloadBase64(\n  base64: string,\n  filename: string,\n  mimeType = 'application/octet-stream'\n): void {\n  const blob = base64ToBlob(base64, mimeType);\n  downloadBlob(blob, filename);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FILE KEY PARSING\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Parse a storage file key into its components.\n *\n * Supports various key formats:\n * - `entityType/entityId/category/filename`\n * - `entityType/entityId/filename`\n * - `category/filename`\n * - `filename`\n *\n * @param key - The storage key to parse\n * @returns Parsed components\n *\n * @example\n * ```typescript\n * const parsed = parseFileKey('user/123/documents/invoice.pdf');\n * // { entityType: 'user', entityId: '123', category: 'documents', filename: 'invoice.pdf' }\n * ```\n */\nexport function parseFileKey(key: string): ParsedFileKey {\n  const parts = key.split('/');\n  const result: ParsedFileKey = { raw: key };\n\n  if (parts.length >= FILE_KEY_FULL_PATH_SEGMENTS) {\n    // Full path: entityType/entityId/category/filename\n    result.entityType = parts[0];\n    result.entityId = parts[1];\n    result.category = parts[2];\n    result.filename = parts.slice(FILE_KEY_THREE_SEGMENTS).join('/');\n  } else if (parts.length === FILE_KEY_THREE_SEGMENTS) {\n    // entityType/entityId/filename or category/subcategory/filename\n    result.entityType = parts[0];\n    result.entityId = parts[1];\n    result.filename = parts[FILE_KEY_TWO_SEGMENTS];\n  } else if (parts.length === FILE_KEY_TWO_SEGMENTS) {\n    // category/filename\n    result.category = parts[0];\n    result.filename = parts[1];\n  } else {\n    // Just filename\n    result.filename = parts[0];\n  }\n\n  return result;\n}\n\n/**\n * Extract just the filename from a file key or path.\n *\n * @param key - The file key or path\n * @returns The filename portion\n *\n * @example\n * ```typescript\n * getFilenameFromKey('user/123/docs/invoice.pdf'); // 'invoice.pdf'\n * ```\n */\nexport function getFilenameFromKey(key: string): string {\n  return key.split('/').pop() ?? key;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FILENAME GENERATION\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generate a filename from a template ID and output format.\n *\n * @param templateId - The template ID (may include path separators)\n * @param outputFormat - The desired output format (e.g., 'pdf', 'docx')\n * @returns A generated filename\n *\n * @example\n * ```typescript\n * generateFilename('invoices/default', 'pdf');\n * // 'default.pdf'\n * ```\n */\nexport function generateFilename(templateId: string, outputFormat: string): string {\n  const baseName = templateId.split('/').pop() ?? 'document';\n  return `${baseName}.${outputFormat}`;\n}\n\n/**\n * Generate a unique filename with timestamp.\n *\n * @param prefix - Filename prefix (default: 'file')\n * @param extension - File extension (default: 'bin')\n * @returns A unique filename\n *\n * @example\n * ```typescript\n * generateUniqueFilename('download', 'pdf');\n * // 'download-1704067200000.pdf'\n * ```\n */\nexport function generateUniqueFilename(prefix = 'file', extension = 'bin'): string {\n  return `${prefix}-${Date.now()}.${extension}`;\n}\n\n/**\n * Infer file extension from MIME type.\n *\n * @param mimeType - The MIME type\n * @returns The inferred extension (without dot)\n *\n * @example\n * ```typescript\n * inferExtensionFromMimeType('application/pdf'); // 'pdf'\n * inferExtensionFromMimeType('image/png'); // 'png'\n * ```\n */\nexport function inferExtensionFromMimeType(mimeType: string): string {\n  // Check exact match first using shared constants\n  if (MIME_TYPE_EXTENSIONS[mimeType]) {\n    return MIME_TYPE_EXTENSIONS[mimeType];\n  }\n\n  // Fallback: try to extract from mime type (e.g., 'image/png' -> 'png')\n  const parts = mimeType.split('/');\n  if (parts.length === MIME_TYPE_PARTS) {\n    return parts[1].split(';')[0].trim();\n  }\n\n  return 'bin';\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FILE SIZE FORMATTING\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Format file size in human-readable format.\n *\n * @param bytes - Size in bytes\n * @param decimals - Number of decimal places (default: 2)\n * @returns Formatted size string\n *\n * @example\n * ```typescript\n * formatFileSize(1024); // '1 KB'\n * formatFileSize(1536000); // '1.46 MB'\n * ```\n */\nexport function formatFileSize(bytes: number, decimals = 2): string {\n  if (bytes === 0) return '0 Bytes';\n\n  const k = 1024;\n  const dm = decimals < 0 ? 0 : decimals;\n\n  const i = Math.floor(Math.log(bytes) / Math.log(k));\n  const size = Number.parseFloat((bytes / Math.pow(k, i)).toFixed(dm));\n\n  return `${size} ${FILE_SIZE_UNITS[i]}`;\n}\n\n/**\n * Parse a human-readable file size to bytes.\n *\n * @param sizeString - Size string (e.g., '1.5 MB', '100KB')\n * @returns Size in bytes\n *\n * @example\n * ```typescript\n * parseFileSize('1.5 MB'); // 1572864\n * parseFileSize('100KB'); // 102400\n * ```\n */\nexport function parseFileSize(sizeString: string): number {\n  const match = sizeString.trim().match(/^([\\d.]+)\\s*([A-Z]+)$/i);\n  if (!match) {\n    return Number.parseInt(sizeString, 10) || 0;\n  }\n\n  const value = Number.parseFloat(match[1]);\n  const unit = match[2].toUpperCase();\n\n  return Math.round(value * (FILE_SIZE_MULTIPLIERS[unit] ?? 1));\n}\n","/**\n * Mapper Utility Functions\n *\n * Common utilities for data transformation in mappers.\n */\n\n/**\n * Convert snake_case to camelCase\n */\nexport function snakeToCamel(str: string): string {\n  return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * Convert camelCase to snake_case\n */\nexport function camelToSnake(str: string): string {\n  return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Parse ISO date string to Date object\n */\nexport function parseDate(dateString: string | null | undefined): Date | null {\n  if (!dateString) return null;\n  const date = new Date(dateString);\n  return isNaN(date.getTime()) ? null : date;\n}\n\n/**\n * Format Date to ISO string for API\n */\nexport function formatDate(date: Date | null | undefined): string | null {\n  return date?.toISOString() ?? null;\n}\n\n/**\n * Trim string if defined\n */\nexport function trimString(str: string | undefined): string | undefined {\n  return str?.trim();\n}\n\n/**\n * Pick only defined values from object (for PATCH requests)\n */\nexport function pickDefined<T extends Record<string, unknown>>(obj: T): Partial<T> {\n  const result: Partial<T> = {};\n  for (const [key, value] of Object.entries(obj)) {\n    if (value !== undefined) {\n      (result as Record<string, unknown>)[key] = value;\n    }\n  }\n  return result;\n}\n\n/**\n * Convert object keys from snake_case to camelCase\n */\nexport function keysToCamel<T extends Record<string, unknown>>(obj: T): Record<string, unknown> {\n  const result: Record<string, unknown> = {};\n  for (const [key, value] of Object.entries(obj)) {\n    result[snakeToCamel(key)] = value;\n  }\n  return result;\n}\n\n/**\n * Convert object keys from camelCase to snake_case\n */\nexport function keysToSnake<T extends Record<string, unknown>>(obj: T): Record<string, unknown> {\n  const result: Record<string, unknown> = {};\n  for (const [key, value] of Object.entries(obj)) {\n    result[camelToSnake(key)] = value;\n  }\n  return result;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Nullable/Optional Conversion Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Map nullable DB field to optional response field.\n * Converts null/undefined to undefined for API responses.\n */\nexport function toOptional<T>(value: T | null | undefined): T | undefined {\n  return value ?? undefined;\n}\n\n/**\n * Map optional entity value to nullable DB field.\n * Converts undefined to null for database storage.\n */\nexport function toNullable<T>(value: T | undefined): T | null {\n  return value ?? null;\n}\n\n/**\n * Map optional Date to nullable ISO string for DB storage.\n * Converts Date to ISO string, undefined to null.\n */\nexport function dateToNullable(value: Date | undefined): string | null {\n  return value?.toISOString() ?? null;\n}\n\n/**\n * Get field value from object supporting both snake_case and camelCase keys.\n * Useful for mappers that need to handle responses in either format.\n * Prefers camelCase if both exist.\n */\nexport function getField<T>(\n  data: Record<string, unknown>,\n  snakeKey: string,\n  camelKey: string\n): T | undefined {\n  return (data[camelKey] ?? data[snakeKey]) as T | undefined;\n}\n\n/**\n * Parse date from either string or Date, handling both formats.\n * Returns undefined for invalid dates.\n */\nexport function parseDateSafe(value: unknown): Date | undefined {\n  if (!value) return undefined;\n  if (value instanceof Date) return isNaN(value.getTime()) ? undefined : value;\n  const date = new Date(value as string);\n  return isNaN(date.getTime()) ? undefined : date;\n}\n","/**\n * HMR-Safe Singleton Helper\n *\n * Creates singletons that persist across Next.js Hot Module Replacement (HMR).\n * Uses globalThis to store state so it survives code reloads in development.\n *\n * @example Core initialization\n * ```typescript\n * import { createHmrSafeSingleton } from '@plyaz/core/utils';\n * import { Core, backendConfig } from '@plyaz/core/backend';\n *\n * export const getServerCore = createHmrSafeSingleton('core', async () => {\n *   await Core.initialize(backendConfig);\n *   return Core;\n * });\n *\n * // Usage in API routes\n * export async function GET() {\n *   const core = await getServerCore();\n *   // core.db, core.cache, etc.\n * }\n * ```\n *\n * @example Database connection\n * ```typescript\n * import { createHmrSafeSingleton } from '@plyaz/core/utils';\n * import { drizzle } from 'drizzle-orm/postgres-js';\n * import postgres from 'postgres';\n *\n * export const getDb = createHmrSafeSingleton('db', async () => {\n *   const client = postgres(process.env.DATABASE_URL);\n *   return drizzle(client);\n * });\n * ```\n *\n * @example Cache client\n * ```typescript\n * import { createHmrSafeSingleton } from '@plyaz/core/utils';\n * import Redis from 'ioredis';\n *\n * export const getRedis = createHmrSafeSingleton('redis', async () => {\n *   return new Redis(process.env.REDIS_URL);\n * });\n * ```\n */\n\nimport type { HmrSingletonOptions, HmrSingletonAccessor } from '@plyaz/types/core';\n\n// Re-export types for convenience\nexport type { HmrSingletonOptions, HmrSingletonAccessor } from '@plyaz/types/core';\n\n// Global storage key prefix\nconst GLOBAL_PREFIX = '__plyaz_hmr_singleton__';\n\n/**\n * Type guard to check if an object has a reset method\n */\nfunction hasResetMethod(obj: unknown): obj is { reset: () => Promise<void> } {\n  return (\n    typeof obj === 'object' &&\n    obj !== null &&\n    'reset' in obj &&\n    typeof (obj as Record<string, unknown>).reset === 'function'\n  );\n}\n\n/**\n * Create an HMR-safe singleton accessor.\n *\n * The singleton will persist across Next.js Hot Module Replacement in development,\n * preventing re-initialization on every code change.\n *\n * @param key - Unique key for this singleton (e.g., 'core', 'db', 'redis')\n * @param initializer - Async function that creates the singleton instance\n * @param options - Optional callbacks for lifecycle events\n * @returns Accessor function and utilities\n *\n * @example\n * ```typescript\n * import { createHmrSafeSingleton } from '@plyaz/core/utils';\n *\n * const getCore = createHmrSafeSingleton('core', async () => {\n *   await Core.initialize(config);\n *   return Core;\n * });\n *\n * // In your API route or server component:\n * const core = await getCore();\n *\n * // Check if initialized:\n * if (getCore.isInitialized()) {\n *   // Already initialized\n * }\n *\n * // Reset (for testing):\n * await getCore.reset();\n * ```\n */\nexport function createHmrSafeSingleton<T>(\n  key: string,\n  initializer: () => Promise<T>,\n  options: HmrSingletonOptions = {}\n): HmrSingletonAccessor<T> {\n  const { onInitialized, onError, onReset } = options;\n\n  // Create unique global keys\n  const instanceKey = `${GLOBAL_PREFIX}${key}_instance`;\n  const promiseKey = `${GLOBAL_PREFIX}${key}_promise`;\n  const initializedKey = `${GLOBAL_PREFIX}${key}_initialized`;\n\n  // Type-safe global access\n  const g = globalThis as unknown as Record<string, unknown>;\n\n  // Helper functions for state management\n  function getInstance(): T | undefined {\n    return g[instanceKey] as T | undefined;\n  }\n\n  function setInstance(instance: T): void {\n    g[instanceKey] = instance;\n  }\n\n  function clearInstance(): void {\n    delete g[instanceKey];\n  }\n\n  function getPromise(): Promise<T> | undefined {\n    return g[promiseKey] as Promise<T> | undefined;\n  }\n\n  function setPromise(promise: Promise<T> | null): void {\n    if (promise === null) {\n      delete g[promiseKey];\n    } else {\n      g[promiseKey] = promise;\n    }\n  }\n\n  function isInit(): boolean {\n    return g[initializedKey] === true;\n  }\n\n  function setInit(value: boolean): void {\n    g[initializedKey] = value;\n  }\n\n  /**\n   * Get the singleton instance, initializing if necessary\n   */\n  async function accessor(): Promise<T> {\n    // Already initialized - return cached instance\n    if (isInit()) {\n      const instance = getInstance();\n      if (instance !== undefined) {\n        return instance;\n      }\n    }\n\n    // Initialization in progress - wait for it\n    const existingPromise = getPromise();\n    if (existingPromise) {\n      return existingPromise;\n    }\n\n    // Start initialization\n    const initPromise = (async () => {\n      try {\n        const instance = await initializer();\n        setInstance(instance);\n        setInit(true);\n        onInitialized?.();\n        return instance;\n      } catch (err) {\n        // Reset on failure so next call can retry\n        setPromise(null);\n        const error = err instanceof Error ? err : new Error(String(err));\n        onError?.(error);\n        throw error;\n      }\n    })();\n\n    setPromise(initPromise);\n    return initPromise;\n  }\n\n  /**\n   * Check if the singleton is initialized\n   */\n  accessor.isInitialized = (): boolean => isInit();\n\n  /**\n   * Reset the singleton (for testing or cleanup)\n   */\n  accessor.reset = async (): Promise<void> => {\n    if (isInit()) {\n      // Call cleanup if the instance has a reset method\n      const instance = getInstance();\n      if (hasResetMethod(instance)) {\n        await instance.reset();\n      }\n\n      clearInstance();\n      setInit(false);\n      setPromise(null);\n      onReset?.();\n    }\n  };\n\n  return accessor;\n}\n"]}