{"version":3,"sources":["../../src/api/encryption.ts","../../src/locale/countries.ts","../../src/time/constants.ts","../../src/api/environments.ts","../../src/api/package/defaults.ts"],"names":["API_ENCRYPTION_DEFAULTS","createDefaultEncryptionKey","key","options","__name","createEncryptionConfig","COUNTRY_CODES","DAYS_IN_WEEK","EARLY_MORNING_HOURS","TIME_CONSTANTS","COUNTRY_TIMEZONES","_","i","PRODUCTION_CONFIG","STAGING_CONFIG","DEVELOPMENT_CONFIG","DEFAULT_API_CONFIG","DEFAULT_API_CLIENT_OPTIONS"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * API Encryption Constants\n *\n * Centralized constants for API encryption configuration.\n * Uses Web Crypto API compatible algorithms.\n *\n * @module config/api/encryption\n */\n\nimport type {\n  EncryptionAlgorithm,\n  KeyFormat,\n  EncryptionKey,\n  EncryptionConfig,\n} from '@plyaz/types/api';\n\n/**\n * Default encryption configuration values for API clients\n */\nexport const API_ENCRYPTION_DEFAULTS = {\n  /** Default algorithm - AES-GCM is recommended for Web Crypto API */\n  ALGORITHM: 'AES-GCM' as EncryptionAlgorithm,\n\n  /** Default key format */\n  KEY_FORMAT: 'base64' as KeyFormat,\n\n  /** Default key ID for frontend clients */\n  FRONTEND_KEY_ID: 'frontend-key',\n\n  /** Default key ID for backend clients */\n  BACKEND_KEY_ID: 'backend-key',\n} as const;\n\n/**\n * Create a default encryption key configuration\n *\n * @param key - The encryption key (base64 encoded)\n * @param options - Optional overrides\n * @returns EncryptionKey configuration\n *\n * @example\n * ```ts\n * const encryptionKey = createDefaultEncryptionKey(process.env.API_ENCRYPTION_KEY!);\n * ```\n */\nexport function createDefaultEncryptionKey(\n  key: string,\n  options?: {\n    id?: string;\n    format?: KeyFormat;\n    algorithm?: EncryptionAlgorithm;\n  }\n): EncryptionKey {\n  return {\n    id: options?.id ?? API_ENCRYPTION_DEFAULTS.FRONTEND_KEY_ID,\n    key,\n    format: options?.format ?? API_ENCRYPTION_DEFAULTS.KEY_FORMAT,\n    algorithm: options?.algorithm ?? API_ENCRYPTION_DEFAULTS.ALGORITHM,\n  };\n}\n\n/**\n * Create the full encryption configuration for API clients\n *\n * @param key - The encryption key (base64 encoded)\n * @param options - Optional overrides for key and config\n * @returns Full EncryptionConfig ready for use\n *\n * @example\n * ```ts\n * // Basic usage\n * const encryptionConfig = createEncryptionConfig(process.env.API_ENCRYPTION_KEY!);\n *\n * // With overrides\n * const encryptionConfig = createEncryptionConfig(key, {\n *   algorithm: 'AES-CBC',\n *   keyId: 'custom-key-id',\n * });\n * ```\n */\nexport function createEncryptionConfig(\n  key: string,\n  options?: {\n    algorithm?: EncryptionAlgorithm;\n    keyId?: string;\n    keyFormat?: KeyFormat;\n  }\n): EncryptionConfig {\n  return {\n    enabled: true,\n    algorithm: options?.algorithm ?? API_ENCRYPTION_DEFAULTS.ALGORITHM,\n    key: createDefaultEncryptionKey(key, {\n      id: options?.keyId,\n      format: options?.keyFormat,\n      algorithm: options?.algorithm,\n    }),\n  };\n}\n","/**\n * Country Constants\n *\n * ISO 3166-1 country codes and related data.\n *\n * @module locale/countries\n */\n\n/**\n * Common country codes (ISO 3166-1 alpha-2)\n */\nexport const COUNTRY_CODES = {\n  // Americas\n  US: 'US', // United States\n  CA: 'CA', // Canada\n  MX: 'MX', // Mexico\n  BR: 'BR', // Brazil\n  AR: 'AR', // Argentina\n  CL: 'CL', // Chile\n  CO: 'CO', // Colombia\n  PE: 'PE', // Peru\n  VE: 'VE', // Venezuela\n  EC: 'EC', // Ecuador\n  BO: 'BO', // Bolivia\n  PY: 'PY', // Paraguay\n  UY: 'UY', // Uruguay\n  GY: 'GY', // Guyana\n  SR: 'SR', // Suriname\n  GF: 'GF', // French Guiana\n  FK: 'FK', // Falkland Islands\n\n  // Caribbean\n  CU: 'CU', // Cuba\n  DO: 'DO', // Dominican Republic\n  HT: 'HT', // Haiti\n  JM: 'JM', // Jamaica\n  TT: 'TT', // Trinidad and Tobago\n  BB: 'BB', // Barbados\n  BS: 'BS', // Bahamas\n  PR: 'PR', // Puerto Rico\n\n  // Central America\n  GT: 'GT', // Guatemala\n  HN: 'HN', // Honduras\n  SV: 'SV', // El Salvador\n  NI: 'NI', // Nicaragua\n  CR: 'CR', // Costa Rica\n  PA: 'PA', // Panama\n  BZ: 'BZ', // Belize\n\n  // Europe\n  GB: 'GB', // United Kingdom\n  FR: 'FR', // France\n  DE: 'DE', // Germany\n  IT: 'IT', // Italy\n  ES: 'ES', // Spain\n  PT: 'PT', // Portugal\n  NL: 'NL', // Netherlands\n  BE: 'BE', // Belgium\n  LU: 'LU', // Luxembourg\n  CH: 'CH', // Switzerland\n  AT: 'AT', // Austria\n  IE: 'IE', // Ireland\n  DK: 'DK', // Denmark\n  SE: 'SE', // Sweden\n  NO: 'NO', // Norway\n  FI: 'FI', // Finland\n  IS: 'IS', // Iceland\n  PL: 'PL', // Poland\n  CZ: 'CZ', // Czech Republic\n  SK: 'SK', // Slovakia\n  HU: 'HU', // Hungary\n  RO: 'RO', // Romania\n  BG: 'BG', // Bulgaria\n  GR: 'GR', // Greece\n  HR: 'HR', // Croatia\n  SI: 'SI', // Slovenia\n  RS: 'RS', // Serbia\n  BA: 'BA', // Bosnia and Herzegovina\n  ME: 'ME', // Montenegro\n  MK: 'MK', // North Macedonia\n  AL: 'AL', // Albania\n  XK: 'XK', // Kosovo\n  EE: 'EE', // Estonia\n  LV: 'LV', // Latvia\n  LT: 'LT', // Lithuania\n  BY: 'BY', // Belarus\n  UA: 'UA', // Ukraine\n  MD: 'MD', // Moldova\n  RU: 'RU', // Russia\n  CY: 'CY', // Cyprus\n  MT: 'MT', // Malta\n  AD: 'AD', // Andorra\n  MC: 'MC', // Monaco\n  SM: 'SM', // San Marino\n  VA: 'VA', // Vatican City\n  LI: 'LI', // Liechtenstein\n\n  // Asia\n  CN: 'CN', // China\n  JP: 'JP', // Japan\n  KR: 'KR', // South Korea\n  KP: 'KP', // North Korea\n  TW: 'TW', // Taiwan\n  HK: 'HK', // Hong Kong\n  MO: 'MO', // Macao\n  IN: 'IN', // India\n  PK: 'PK', // Pakistan\n  BD: 'BD', // Bangladesh\n  LK: 'LK', // Sri Lanka\n  NP: 'NP', // Nepal\n  BT: 'BT', // Bhutan\n  MV: 'MV', // Maldives\n  AF: 'AF', // Afghanistan\n  TH: 'TH', // Thailand\n  VN: 'VN', // Vietnam\n  MY: 'MY', // Malaysia\n  SG: 'SG', // Singapore\n  ID: 'ID', // Indonesia\n  PH: 'PH', // Philippines\n  BN: 'BN', // Brunei\n  KH: 'KH', // Cambodia\n  LA: 'LA', // Laos\n  MM: 'MM', // Myanmar\n  TL: 'TL', // Timor-Leste\n  MN: 'MN', // Mongolia\n  KZ: 'KZ', // Kazakhstan\n  UZ: 'UZ', // Uzbekistan\n  TJ: 'TJ', // Tajikistan\n  KG: 'KG', // Kyrgyzstan\n  TM: 'TM', // Turkmenistan\n  AZ: 'AZ', // Azerbaijan\n  GE: 'GE', // Georgia\n  AM: 'AM', // Armenia\n\n  // Middle East\n  SA: 'SA', // Saudi Arabia\n  AE: 'AE', // United Arab Emirates\n  QA: 'QA', // Qatar\n  KW: 'KW', // Kuwait\n  BH: 'BH', // Bahrain\n  OM: 'OM', // Oman\n  YE: 'YE', // Yemen\n  JO: 'JO', // Jordan\n  LB: 'LB', // Lebanon\n  SY: 'SY', // Syria\n  IQ: 'IQ', // Iraq\n  IR: 'IR', // Iran\n  IL: 'IL', // Israel\n  PS: 'PS', // Palestine\n  TR: 'TR', // Turkey\n\n  // Africa\n  EG: 'EG', // Egypt\n  LY: 'LY', // Libya\n  TN: 'TN', // Tunisia\n  DZ: 'DZ', // Algeria\n  MA: 'MA', // Morocco\n  EH: 'EH', // Western Sahara\n  MR: 'MR', // Mauritania\n  ML: 'ML', // Mali\n  NE: 'NE', // Niger\n  TD: 'TD', // Chad\n  SD: 'SD', // Sudan\n  SS: 'SS', // South Sudan\n  ER: 'ER', // Eritrea\n  DJ: 'DJ', // Djibouti\n  SO: 'SO', // Somalia\n  ET: 'ET', // Ethiopia\n  KE: 'KE', // Kenya\n  UG: 'UG', // Uganda\n  RW: 'RW', // Rwanda\n  BI: 'BI', // Burundi\n  TZ: 'TZ', // Tanzania\n  MZ: 'MZ', // Mozambique\n  MW: 'MW', // Malawi\n  ZM: 'ZM', // Zambia\n  ZW: 'ZW', // Zimbabwe\n  BW: 'BW', // Botswana\n  NA: 'NA', // Namibia\n  ZA: 'ZA', // South Africa\n  LS: 'LS', // Lesotho\n  SZ: 'SZ', // Eswatini\n  AO: 'AO', // Angola\n  CD: 'CD', // Democratic Republic of the Congo\n  CG: 'CG', // Republic of the Congo\n  GA: 'GA', // Gabon\n  GQ: 'GQ', // Equatorial Guinea\n  CM: 'CM', // Cameroon\n  CF: 'CF', // Central African Republic\n  NG: 'NG', // Nigeria\n  BJ: 'BJ', // Benin\n  TG: 'TG', // Togo\n  GH: 'GH', // Ghana\n  BF: 'BF', // Burkina Faso\n  CI: 'CI', // Côte d'Ivoire\n  LR: 'LR', // Liberia\n  SL: 'SL', // Sierra Leone\n  GN: 'GN', // Guinea\n  GW: 'GW', // Guinea-Bissau\n  SN: 'SN', // Senegal\n  GM: 'GM', // Gambia\n  CV: 'CV', // Cape Verde\n  ST: 'ST', // São Tomé and Príncipe\n  MG: 'MG', // Madagascar\n  MU: 'MU', // Mauritius\n  SC: 'SC', // Seychelles\n  KM: 'KM', // Comoros\n  RE: 'RE', // Réunion\n\n  // Oceania\n  AU: 'AU', // Australia\n  NZ: 'NZ', // New Zealand\n  PG: 'PG', // Papua New Guinea\n  FJ: 'FJ', // Fiji\n  SB: 'SB', // Solomon Islands\n  VU: 'VU', // Vanuatu\n  NC: 'NC', // New Caledonia\n  PF: 'PF', // French Polynesia\n  WS: 'WS', // Samoa\n  TO: 'TO', // Tonga\n  TV: 'TV', // Tuvalu\n  NR: 'NR', // Nauru\n  KI: 'KI', // Kiribati\n  PW: 'PW', // Palau\n  MH: 'MH', // Marshall Islands\n  FM: 'FM', // Micronesia\n  GU: 'GU', // Guam\n  MP: 'MP', // Northern Mariana Islands\n  AS: 'AS', // American Samoa\n  CK: 'CK', // Cook Islands\n  NU: 'NU', // Niue\n  TK: 'TK', // Tokelau\n  WF: 'WF', // Wallis and Futuna\n  PN: 'PN', // Pitcairn Islands\n\n  // Antarctica\n  AQ: 'AQ', // Antarctica\n} as const;\n\n/**\n * MVP DEFINED SCOPE: Only include Europe (EU) and Brazil (BR).\n */\nexport const COUNTRY_CODES_SCOPED = {\n  // Brazil\n  BR: 'BR',\n  // Europe\n  GB: 'GB',\n  FR: 'FR',\n  DE: 'DE',\n  IT: 'IT',\n  ES: 'ES',\n  PT: 'PT',\n  NL: 'NL',\n  BE: 'BE',\n  LU: 'LU',\n  CH: 'CH',\n  AT: 'AT',\n  IE: 'IE',\n  DK: 'DK',\n  SE: 'SE',\n  NO: 'NO',\n  FI: 'FI',\n  IS: 'IS',\n  PL: 'PL',\n  CZ: 'CZ',\n  SK: 'SK',\n  HU: 'HU',\n  RO: 'RO',\n  BG: 'BG',\n  GR: 'GR',\n  HR: 'HR',\n  SI: 'SI',\n  RS: 'RS',\n  BA: 'BA',\n  ME: 'ME',\n  MK: 'MK',\n  AL: 'AL',\n  XK: 'XK',\n  EE: 'EE',\n  LV: 'LV',\n  LT: 'LT',\n  BY: 'BY',\n  UA: 'UA',\n  MD: 'MD',\n  RU: 'RU',\n  CY: 'CY',\n  MT: 'MT',\n  AD: 'AD',\n  MC: 'MC',\n  SM: 'SM',\n  VA: 'VA',\n  LI: 'LI',\n} as const;\n\n/**\n * MVP scoped country names\n */\nexport const COUNTRY_NAMES: { [key: string]: string } = {\n  // Brazil (BR)\n  BR: 'Brazil',\n\n  // European Union (EU) Member States\n  AT: 'Austria',\n  BE: 'Belgium',\n  BG: 'Bulgaria',\n  HR: 'Croatia',\n  CY: 'Cyprus',\n  CZ: 'Czechia', // Using the modern short name\n  DK: 'Denmark',\n  EE: 'Estonia',\n  FI: 'Finland',\n  FR: 'France',\n  DE: 'Germany',\n  GR: 'Greece',\n  HU: 'Hungary',\n  IE: 'Ireland',\n  IT: 'Italy',\n  LV: 'Latvia',\n  LT: 'Lithuania',\n  LU: 'Luxembourg',\n  MT: 'Malta',\n  NL: 'Netherlands',\n  PL: 'Poland',\n  PT: 'Portugal',\n  RO: 'Romania',\n  SK: 'Slovakia',\n  SI: 'Slovenia',\n  ES: 'Spain',\n  SE: 'Sweden',\n};\n\n/**\n * Country calling codes\n */\nexport const COUNTRY_CALLING_CODES = {\n  /**\n   * United States and Canada\n   */\n  '+1': ['US', 'CA'],\n  /**\n   * Egypt\n   */\n  '+20': ['EG'],\n  /**\n   * South Africa\n   */\n  '+27': ['ZA'],\n  /**\n   * Greece\n   */\n  '+30': ['GR'],\n  /**\n   * Netherlands\n   */\n  '+31': ['NL'],\n  /**\n   * Belgium\n   */\n  '+32': ['BE'],\n  /**\n   * France\n   */\n  '+33': ['FR'],\n  /**\n   * Spain\n   */\n  '+34': ['ES'],\n  /**\n   * Hungary\n   */\n  '+36': ['HU'],\n  /**\n   * Italy\n   */\n  '+39': ['IT'],\n  /**\n   * Romania\n   */\n  '+40': ['RO'],\n  /**\n   * Switzerland\n   */\n  '+41': ['CH'],\n  /**\n   * Austria\n   */\n  '+43': ['AT'],\n  /**\n   * United Kingdom\n   */\n  '+44': ['GB'],\n  /**\n   * Denmark\n   */\n  '+45': ['DK'],\n  /**\n   * Sweden\n   */\n  '+46': ['SE'],\n  /**\n   * Norway\n   */\n  '+47': ['NO'],\n  /**\n   * Poland\n   */\n  '+48': ['PL'],\n  /**\n   * Germany\n   */\n  '+49': ['DE'],\n  /**\n   * Peru\n   */\n  '+51': ['PE'],\n  /**\n   * Mexico\n   */\n  '+52': ['MX'],\n  /**\n   * Cuba\n   */\n  '+53': ['CU'],\n  /**\n   * Argentina\n   */\n  '+54': ['AR'],\n  /**\n   * Brazil\n   */\n  '+55': ['BR'],\n  /**\n   * Chile\n   */\n  '+56': ['CL'],\n  /**\n   * Colombia\n   */\n  '+57': ['CO'],\n  /**\n   * Venezuela\n   */\n  '+58': ['VE'],\n  /**\n   * Malaysia\n   */\n  '+60': ['MY'],\n  /**\n   * Australia\n   */\n  '+61': ['AU'],\n  /**\n   * Indonesia\n   */\n  '+62': ['ID'],\n  /**\n   * Philippines\n   */\n  '+63': ['PH'],\n  /**\n   * New Zealand\n   */\n  '+64': ['NZ'],\n  /**\n   * Singapore\n   */\n  '+65': ['SG'],\n  /**\n   * Thailand\n   */\n  '+66': ['TH'],\n  /**\n   * Russia and Kazakhstan\n   */\n  '+7': ['RU', 'KZ'],\n  /**\n   * Japan\n   */\n  '+81': ['JP'],\n  /**\n   * South Korea\n   */\n  '+82': ['KR'],\n  /**\n   * Vietnam\n   */\n  '+84': ['VN'],\n  /**\n   * China\n   */\n  '+86': ['CN'],\n  /**\n   * Turkey\n   */\n  '+90': ['TR'],\n  /**\n   * India\n   */\n  '+91': ['IN'],\n  /**\n   * Pakistan\n   */\n  '+92': ['PK'],\n  /**\n   * Afghanistan\n   */\n  '+93': ['AF'],\n  /**\n   * Sri Lanka\n   */\n  '+94': ['LK'],\n  /**\n   * Myanmar\n   */\n  '+95': ['MM'],\n  /**\n   * Iran\n   */\n  '+98': ['IR'],\n  /**\n   * Morocco\n   */\n  '+212': ['MA'],\n  /**\n   * Algeria\n   */\n  '+213': ['DZ'],\n  /**\n   * Tunisia\n   */\n  '+216': ['TN'],\n  /**\n   * Libya\n   */\n  '+218': ['LY'],\n  /**\n   * Gambia\n   */\n  '+220': ['GM'],\n  /**\n   * Senegal\n   */\n  '+221': ['SN'],\n  /**\n   * Mali\n   */\n  '+223': ['ML'],\n  /**\n   * Guinea\n   */\n  '+224': ['GN'],\n  /**\n   * Côte d'Ivoire\n   */\n  '+225': ['CI'],\n  /**\n   * Burkina Faso\n   */\n  '+226': ['BF'],\n  /**\n   * Niger\n   */\n  '+227': ['NE'],\n  /**\n   * Togo\n   */\n  '+228': ['TG'],\n  /**\n   * Benin\n   */\n  '+229': ['BJ'],\n  /**\n   * Mauritius\n   */\n  '+230': ['MU'],\n  /**\n   * Liberia\n   */\n  '+231': ['LR'],\n  /**\n   * Sierra Leone\n   */\n  '+232': ['SL'],\n  /**\n   * Ghana\n   */\n  '+233': ['GH'],\n  /**\n   * Nigeria\n   */\n  '+234': ['NG'],\n  /**\n   * Chad\n   */\n  '+235': ['TD'],\n  /**\n   * Central African Republic\n   */\n  '+236': ['CF'],\n  /**\n   * Cameroon\n   */\n  '+237': ['CM'],\n  /**\n   * Cape Verde\n   */\n  '+238': ['CV'],\n  /**\n   * São Tomé and Príncipe\n   */\n  '+239': ['ST'],\n  /**\n   * Equatorial Guinea\n   */\n  '+240': ['GQ'],\n  /**\n   * Gabon\n   */\n  '+241': ['GA'],\n  /**\n   * Congo\n   */\n  '+242': ['CG'],\n  /**\n   * Democratic Republic of the Congo\n   */\n  '+243': ['CD'],\n  /**\n   * Angola\n   */\n  '+244': ['AO'],\n  /**\n   * Guinea-Bissau\n   */\n  '+245': ['GW'],\n  /**\n   * Kenya\n   */\n  '+254': ['KE'],\n  /**\n   * Tanzania\n   */\n  '+255': ['TZ'],\n  /**\n   * Uganda\n   */\n  '+256': ['UG'],\n  /**\n   * Burundi\n   */\n  '+257': ['BI'],\n  /**\n   * Mozambique\n   */\n  '+258': ['MZ'],\n  /**\n   * Zambia\n   */\n  '+260': ['ZM'],\n  /**\n   * Madagascar\n   */\n  '+261': ['MG'],\n  /**\n   * Zimbabwe\n   */\n  '+263': ['ZW'],\n  /**\n   * Namibia\n   */\n  '+264': ['NA'],\n  /**\n   * Malawi\n   */\n  '+265': ['MW'],\n  /**\n   * Lesotho\n   */\n  '+266': ['LS'],\n  /**\n   * Botswana\n   */\n  '+267': ['BW'],\n  /**\n   * Eswatini\n   */\n  '+268': ['SZ'],\n  /**\n   * Seychelles\n   */\n  '+248': ['SC'],\n  /**\n   * Rwanda\n   */\n  '+250': ['RW'],\n  /**\n   * Ethiopia\n   */\n  '+251': ['ET'],\n  /**\n   * Somalia\n   */\n  '+252': ['SO'],\n  /**\n   * Djibouti\n   */\n  '+253': ['DJ'],\n  /**\n   * Hong Kong\n   */\n  '+852': ['HK'],\n  /**\n   * Macao\n   */\n  '+853': ['MO'],\n  /**\n   * Bangladesh\n   */\n  '+880': ['BD'],\n  /**\n   * Taiwan\n   */\n  '+886': ['TW'],\n  /**\n   * Maldives\n   */\n  '+960': ['MV'],\n  /**\n   * Lebanon\n   */\n  '+961': ['LB'],\n  /**\n   * Jordan\n   */\n  '+962': ['JO'],\n  /**\n   * Syria\n   */\n  '+963': ['SY'],\n  /**\n   * Iraq\n   */\n  '+964': ['IQ'],\n  /**\n   * Kuwait\n   */\n  '+965': ['KW'],\n  /**\n   * Saudi Arabia\n   */\n  '+966': ['SA'],\n  /**\n   * Yemen\n   */\n  '+967': ['YE'],\n  /**\n   * Oman\n   */\n  '+968': ['OM'],\n  /**\n   * Palestine\n   */\n  '+970': ['PS'],\n  /**\n   * United Arab Emirates\n   */\n  '+971': ['AE'],\n  /**\n   * Israel\n   */\n  '+972': ['IL'],\n  /**\n   * Bahrain\n   */\n  '+973': ['BH'],\n  /**\n   * Qatar\n   */\n  '+974': ['QA'],\n  /**\n   * Bhutan\n   */\n  '+975': ['BT'],\n  /**\n   * Mongolia\n   */\n  '+976': ['MN'],\n  /**\n   * Nepal\n   */\n  '+977': ['NP'],\n  /**\n   * Tajikistan\n   */\n  '+992': ['TJ'],\n  /**\n   * Turkmenistan\n   */\n  '+993': ['TM'],\n  /**\n   * Azerbaijan\n   */\n  '+994': ['AZ'],\n  /**\n   * Georgia\n   */\n  '+995': ['GE'],\n  /**\n   * Kyrgyzstan\n   */\n  '+996': ['KG'],\n  /**\n   * Uzbekistan\n   */\n  '+998': ['UZ'],\n} as const;\n\n/**\n * Regional groupings\n */\nexport const COUNTRY_REGIONS = {\n  /**\n   * European Union member states\n   */\n  EU: [\n    'AT',\n    'BE',\n    'BG',\n    'HR',\n    'CY',\n    'CZ',\n    'DK',\n    'EE',\n    'FI',\n    'FR',\n    'DE',\n    'GR',\n    'HU',\n    'IE',\n    'IT',\n    'LV',\n    'LT',\n    'LU',\n    'MT',\n    'NL',\n    'PL',\n    'PT',\n    'RO',\n    'SK',\n    'SI',\n    'ES',\n    'SE',\n  ],\n\n  /**\n   * North American countries\n   */\n  NORTH_AMERICA: ['US', 'CA', 'MX'],\n\n  /**\n   * South American countries\n   */\n  SOUTH_AMERICA: ['AR', 'BO', 'BR', 'CL', 'CO', 'EC', 'GF', 'GY', 'PY', 'PE', 'SR', 'UY', 'VE'],\n\n  /**\n   * G7 countries\n   */\n  G7: ['US', 'CA', 'GB', 'FR', 'DE', 'IT', 'JP'],\n\n  /**\n   * G20 countries\n   */\n  G20: [\n    'AR',\n    'AU',\n    'BR',\n    'CA',\n    'CN',\n    'FR',\n    'DE',\n    'IN',\n    'ID',\n    'IT',\n    'JP',\n    'KR',\n    'MX',\n    'RU',\n    'SA',\n    'ZA',\n    'TR',\n    'GB',\n    'US',\n  ],\n\n  /**\n   * ASEAN countries\n   */\n  ASEAN: ['BN', 'KH', 'ID', 'LA', 'MY', 'MM', 'PH', 'SG', 'TH', 'VN'],\n\n  /**\n   * BRICS countries\n   */\n  BRICS: ['BR', 'RU', 'IN', 'CN', 'ZA'],\n\n  /**\n   * OECD countries\n   */\n  OECD: [\n    'AU',\n    'AT',\n    'BE',\n    'CA',\n    'CL',\n    'CO',\n    'CR',\n    'CZ',\n    'DK',\n    'EE',\n    'FI',\n    'FR',\n    'DE',\n    'GR',\n    'HU',\n    'IS',\n    'IE',\n    'IL',\n    'IT',\n    'JP',\n    'KR',\n    'LV',\n    'LT',\n    'LU',\n    'MX',\n    'NL',\n    'NZ',\n    'NO',\n    'PL',\n    'PT',\n    'SK',\n    'SI',\n    'ES',\n    'SE',\n    'CH',\n    'TR',\n    'GB',\n    'US',\n  ],\n\n  /**\n   * Commonwealth countries\n   */\n  COMMONWEALTH: [\n    'AG',\n    'AU',\n    'BS',\n    'BD',\n    'BB',\n    'BZ',\n    'BW',\n    'BN',\n    'CM',\n    'CA',\n    'CY',\n    'DM',\n    'FJ',\n    'GM',\n    'GH',\n    'GD',\n    'GY',\n    'IN',\n    'JM',\n    'KE',\n    'KI',\n    'LS',\n    'MW',\n    'MY',\n    'MV',\n    'MT',\n    'MU',\n    'MZ',\n    'NA',\n    'NR',\n    'NZ',\n    'NG',\n    'PK',\n    'PG',\n    'RW',\n    'KN',\n    'LC',\n    'VC',\n    'WS',\n    'SC',\n    'SL',\n    'SG',\n    'SB',\n    'ZA',\n    'LK',\n    'SZ',\n    'TZ',\n    'TO',\n    'TT',\n    'TV',\n    'UG',\n    'GB',\n    'VU',\n    'ZM',\n  ],\n} as const;\n\n/**\n * Country code to region mapping for CDN headers\n */\nexport const COUNTRY_REGIONS_DETAILED: Record<string, { region: string; state?: string }> = {\n  // EU countries\n  DE: { region: 'eu' },\n  FR: { region: 'eu' },\n  IT: { region: 'eu' },\n  ES: { region: 'eu' },\n  NL: { region: 'eu' },\n  BE: { region: 'eu' },\n  AT: { region: 'eu' },\n  SE: { region: 'eu' },\n  DK: { region: 'eu' },\n  FI: { region: 'eu' },\n  NO: { region: 'eu' },\n  PL: { region: 'eu' },\n  CZ: { region: 'eu' },\n  HU: { region: 'eu' },\n  SK: { region: 'eu' },\n  SI: { region: 'eu' },\n  HR: { region: 'eu' },\n  BG: { region: 'eu' },\n  RO: { region: 'eu' },\n  GR: { region: 'eu' },\n  PT: { region: 'eu' },\n  IE: { region: 'eu' },\n  LU: { region: 'eu' },\n  MT: { region: 'eu' },\n  CY: { region: 'eu' },\n  EE: { region: 'eu' },\n  LV: { region: 'eu' },\n  LT: { region: 'eu' },\n  GB: { region: 'eu' },\n  IS: { region: 'eu' },\n  LI: { region: 'eu' },\n  CH: { region: 'eu' },\n\n  // US and states (would need more sophisticated detection for states)\n  US: { region: 'us' },\n  CA: { region: 'ca' }, // Canada as separate region\n\n  // China\n  CN: { region: 'cn' },\n  HK: { region: 'cn' },\n  MO: { region: 'cn' },\n\n  // Japan\n  JP: { region: 'jp' },\n\n  // Other Asian countries\n  KR: { region: 'global' }, // South Korea\n  TW: { region: 'global' }, // Taiwan\n  SG: { region: 'global' }, // Singapore\n  MY: { region: 'global' }, // Malaysia\n  TH: { region: 'global' }, // Thailand\n  IN: { region: 'global' }, // India\n  ID: { region: 'global' }, // Indonesia\n  PH: { region: 'global' }, // Philippines\n  VN: { region: 'global' }, // Vietnam\n\n  // Oceania\n  AU: { region: 'global' }, // Australia\n  NZ: { region: 'global' }, // New Zealand\n\n  // Americas (other than US/CA)\n  MX: { region: 'global' }, // Mexico\n  BR: { region: 'global' }, // Brazil\n  AR: { region: 'global' }, // Argentina\n  CL: { region: 'global' }, // Chile\n  CO: { region: 'global' }, // Colombia\n\n  // Middle East\n  AE: { region: 'global' }, // UAE\n  SA: { region: 'global' }, // Saudi Arabia\n  IL: { region: 'global' }, // Israel\n  TR: { region: 'global' }, // Turkey\n\n  // Africa\n  ZA: { region: 'global' }, // South Africa\n  EG: { region: 'global' }, // Egypt\n  NG: { region: 'global' }, // Nigeria\n  KE: { region: 'global' }, // Kenya\n\n  // Russia\n  RU: { region: 'global' }, // Russia\n\n  // Other countries default to global\n};\n\n/**\n * Type exports\n */\nexport type CountryCode = (typeof COUNTRY_CODES)[keyof typeof COUNTRY_CODES];\nexport type CountryCallingCode = keyof typeof COUNTRY_CALLING_CODES;\nexport type CountryRegion = keyof typeof COUNTRY_REGIONS;\nexport type CountryRegionDetailed =\n  (typeof COUNTRY_REGIONS_DETAILED)[keyof typeof COUNTRY_REGIONS_DETAILED];\n","/**\n * Time-related Constants\n *\n * Common time values and durations used throughout the application\n * for timeouts, delays, caching, and other time-based operations.\n *\n * @module time/constants\n */\n\nimport { type CountryCode } from '@plyaz/types';\nimport { COUNTRY_CODES } from '../locale';\n\nexport const DAYS_IN_WEEK = 7;\nexport const EARLY_MORNING_HOURS = 6;\n/**\n * Time conversion and duration constants\n */\nexport const TIME_CONSTANTS = {\n  // Time unit conversions (in milliseconds)\n  /**\n   * One millisecond in milliseconds\n   */\n  MILLISECOND: 1,\n\n  /**\n   * One second in milliseconds\n   */\n  SECOND: 1000,\n\n  /**\n   * One minute in milliseconds\n   */\n  MINUTE: 60000,\n\n  /**\n   * One hour in milliseconds\n   */\n  HOUR: 3600000,\n\n  /**\n   * One day in milliseconds\n   */\n  DAY: 86400000,\n\n  /**\n   * One week in milliseconds\n   */\n  WEEK: 604800000,\n\n  /**\n   * One month in milliseconds (30 days average)\n   */\n  MONTH: 2592000000,\n\n  /**\n   * One year in milliseconds (365 days)\n   */\n  YEAR: 31536000000,\n\n  // Time unit ratios\n  /**\n   * Number of milliseconds in one second\n   */\n  MILLISECONDS_PER_SECOND: 1000,\n\n  /**\n   * Number of seconds in one minute\n   */\n  SECONDS_PER_MINUTE: 60,\n\n  /**\n   * Number of minutes in one hour\n   */\n  MINUTES_PER_HOUR: 60,\n\n  /**\n   * Number of hours in one day\n   */\n  HOURS_PER_DAY: 24,\n\n  /**\n   * Number of days in one week\n   */\n  DAYS_PER_WEEK: 7,\n\n  /**\n   * Number of days in one month (average)\n   */\n  DAYS_PER_MONTH: 30,\n\n  /**\n   * Number of days in one year\n   */\n  DAYS_PER_YEAR: 365,\n\n  /**\n   * Number of weeks in one year\n   */\n  WEEKS_PER_YEAR: 52,\n\n  /**\n   * Number of months in one year\n   */\n  MONTHS_PER_YEAR: 12,\n\n  // Common durations in milliseconds\n  /**\n   * 100 milliseconds\n   */\n  HUNDRED_MS: 100,\n\n  /**\n   * 250 milliseconds\n   */\n  QUARTER_SECOND: 250,\n\n  /**\n   * 500 milliseconds (half second)\n   */\n  HALF_SECOND: 500,\n\n  /**\n   * 2 seconds in milliseconds\n   */\n  TWO_SECONDS: 2000,\n\n  /**\n   * 3 seconds in milliseconds\n   */\n  THREE_SECONDS: 3000,\n\n  /**\n   * 5 seconds in milliseconds\n   */\n  FIVE_SECONDS: 5000,\n\n  /**\n   * 10 seconds in milliseconds\n   */\n  TEN_SECONDS: 10000,\n\n  /**\n   * 30 seconds in milliseconds\n   */\n  THIRTY_SECONDS: 30000,\n\n  /**\n   * 2 minutes in milliseconds\n   */\n  TWO_MINUTES: 120000,\n\n  /**\n   * 5 minutes in milliseconds\n   */\n  FIVE_MINUTES: 300000,\n\n  /**\n   * 10 minutes in milliseconds\n   */\n  TEN_MINUTES: 600000,\n\n  /**\n   * 15 minutes in milliseconds\n   */\n  FIFTEEN_MINUTES: 900000,\n\n  /**\n   * 30 minutes in milliseconds\n   */\n  THIRTY_MINUTES: 1800000,\n\n  /**\n   * 1 hour in milliseconds\n   */\n  ONE_HOUR: 3600000,\n\n  /**\n   * 2 hours in milliseconds\n   */\n  TWO_HOURS: 7200000,\n\n  /**\n   * 6 hours in milliseconds\n   */\n  SIX_HOURS: 21600000,\n\n  /**\n   * 12 hours in milliseconds\n   */\n  TWELVE_HOURS: 43200000,\n\n  // Default values\n  /**\n   * Default timeout duration in milliseconds (5 seconds)\n   */\n  DEFAULT_TIMEOUT: 5000,\n\n  /**\n   * Default short timeout in milliseconds (1 second)\n   */\n  DEFAULT_SHORT_TIMEOUT: 1000,\n\n  /**\n   * Default long timeout in milliseconds (30 seconds)\n   */\n  DEFAULT_LONG_TIMEOUT: 30000,\n\n  /**\n   * Default retry delay in milliseconds (100ms)\n   */\n  DEFAULT_RETRY_DELAY: 100,\n\n  /**\n   * Default exponential backoff base delay in milliseconds (1 second)\n   */\n  DEFAULT_BACKOFF_BASE: 1000,\n\n  /**\n   * Default maximum backoff delay in milliseconds (30 seconds)\n   */\n  DEFAULT_MAX_BACKOFF: 30000,\n\n  /**\n   * Default number of retry attempts\n   */\n  DEFAULT_RETRY_ATTEMPTS: 3,\n\n  /**\n   * Default debounce delay in milliseconds (50ms)\n   */\n  DEFAULT_DEBOUNCE_DELAY: 50,\n\n  /**\n   * Default throttle delay in milliseconds (100ms)\n   */\n  DEFAULT_THROTTLE_DELAY: 100,\n\n  /**\n   * Default animation frame duration in milliseconds (~60fps)\n   */\n  DEFAULT_ANIMATION_FRAME: 16.67,\n\n  /**\n   * Default transition duration in milliseconds (300ms)\n   */\n  DEFAULT_TRANSITION_DURATION: 300,\n\n  /**\n   * Default cache time-to-live in seconds (5 minutes)\n   */\n  DEFAULT_CACHE_TTL: 300,\n\n  /**\n   * Default short cache TTL in seconds (1 minute)\n   */\n  DEFAULT_SHORT_CACHE_TTL: 60,\n\n  /**\n   * Default long cache TTL in seconds (1 hour)\n   */\n  DEFAULT_LONG_CACHE_TTL: 3600,\n\n  /**\n   * Default session timeout in milliseconds (30 minutes)\n   */\n  DEFAULT_SESSION_TIMEOUT: 1800000,\n\n  /**\n   * Default idle timeout in milliseconds (15 minutes)\n   */\n  DEFAULT_IDLE_TIMEOUT: 900000,\n\n  /**\n   * Default poll interval in milliseconds (5 seconds)\n   */\n  DEFAULT_POLL_INTERVAL: 5000,\n\n  /**\n   * Default heartbeat interval in milliseconds (30 seconds)\n   */\n  DEFAULT_HEARTBEAT_INTERVAL: 30000,\n\n  // Network and ports\n  /**\n   * Default port number for servers\n   */\n  DEFAULT_PORT: 3000,\n\n  /**\n   * Default HTTP port\n   */\n  HTTP_PORT: 80,\n\n  /**\n   * Default HTTPS port\n   */\n  HTTPS_PORT: 443,\n\n  /**\n   * Default WebSocket port\n   */\n  WEBSOCKET_PORT: 8080,\n\n  /**\n   * Default database port (PostgreSQL)\n   */\n  DATABASE_PORT: 5432,\n\n  /**\n   * Default Redis port\n   */\n  REDIS_PORT: 6379,\n\n  // WebSocket specific\n  /**\n   * WebSocket normal closure code\n   */\n  WEBSOCKET_CLOSE_NORMAL: 1000,\n\n  /**\n   * WebSocket going away code\n   */\n  WEBSOCKET_CLOSE_GOING_AWAY: 1001,\n\n  /**\n   * WebSocket protocol error code\n   */\n  WEBSOCKET_CLOSE_PROTOCOL_ERROR: 1002,\n\n  /**\n   * WebSocket unsupported data code\n   */\n  WEBSOCKET_CLOSE_UNSUPPORTED: 1003,\n\n  /**\n   * WebSocket abnormal closure code\n   */\n  WEBSOCKET_CLOSE_ABNORMAL: 1006,\n\n  /**\n   * WebSocket retry delay in milliseconds (500ms)\n   */\n  WEBSOCKET_RETRY_DELAY: 500,\n\n  /**\n   * WebSocket ping interval in milliseconds (30 seconds)\n   */\n  WEBSOCKET_PING_INTERVAL: 30000,\n\n  /**\n   * WebSocket reconnect delay in milliseconds (1 second)\n   */\n  WEBSOCKET_RECONNECT_DELAY: 1000,\n\n  /**\n   * WebSocket max reconnect delay in milliseconds (30 seconds)\n   */\n  WEBSOCKET_MAX_RECONNECT_DELAY: 30000,\n} as const;\n\n/**\n * Country → Time Zone Mapping\n * Based on IANA time zone database (https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)\n */\nexport const COUNTRY_TIMEZONES: Record<string, string[]> = {\n  // --- AMERICAS ---\n  [COUNTRY_CODES.US]: [\n    'America/New_York',\n    'America/Chicago',\n    'America/Denver',\n    'America/Los_Angeles',\n    'America/Anchorage',\n    'Pacific/Honolulu',\n  ],\n  [COUNTRY_CODES.CA]: [\n    'America/Toronto',\n    'America/Vancouver',\n    'America/Edmonton',\n    'America/Halifax',\n    'America/St_Johns',\n  ],\n  [COUNTRY_CODES.MX]: ['America/Mexico_City', 'America/Monterrey', 'America/Tijuana'],\n  [COUNTRY_CODES.BR]: ['America/Sao_Paulo', 'America/Manaus', 'America/Fortaleza'],\n  [COUNTRY_CODES.AR]: ['America/Argentina/Buenos_Aires'],\n  [COUNTRY_CODES.CL]: ['America/Santiago'],\n  [COUNTRY_CODES.CO]: ['America/Bogota'],\n  [COUNTRY_CODES.PE]: ['America/Lima'],\n  [COUNTRY_CODES.VE]: ['America/Caracas'],\n\n  // --- EUROPE ---\n  [COUNTRY_CODES.GB]: ['Europe/London'],\n  [COUNTRY_CODES.FR]: ['Europe/Paris'],\n  [COUNTRY_CODES.DE]: ['Europe/Berlin'],\n  [COUNTRY_CODES.IT]: ['Europe/Rome'],\n  [COUNTRY_CODES.ES]: ['Europe/Madrid'],\n  [COUNTRY_CODES.PT]: ['Europe/Lisbon'],\n  [COUNTRY_CODES.NL]: ['Europe/Amsterdam'],\n  [COUNTRY_CODES.SE]: ['Europe/Stockholm'],\n  [COUNTRY_CODES.PL]: ['Europe/Warsaw'],\n  [COUNTRY_CODES.FI]: ['Europe/Helsinki'],\n  [COUNTRY_CODES.NO]: ['Europe/Oslo'],\n  [COUNTRY_CODES.CH]: ['Europe/Zurich'],\n  [COUNTRY_CODES.RU]: ['Europe/Moscow', 'Asia/Yekaterinburg', 'Asia/Irkutsk', 'Asia/Vladivostok'],\n  [COUNTRY_CODES.UA]: ['Europe/Kyiv'],\n  [COUNTRY_CODES.GR]: ['Europe/Athens'],\n  [COUNTRY_CODES.TR]: ['Europe/Istanbul'],\n\n  // --- ASIA ---\n  [COUNTRY_CODES.CN]: ['Asia/Shanghai', 'Asia/Urumqi'],\n  [COUNTRY_CODES.JP]: ['Asia/Tokyo'],\n  [COUNTRY_CODES.KR]: ['Asia/Seoul'],\n  [COUNTRY_CODES.IN]: ['Asia/Kolkata'],\n  [COUNTRY_CODES.PK]: ['Asia/Karachi'],\n  [COUNTRY_CODES.BD]: ['Asia/Dhaka'],\n  [COUNTRY_CODES.TH]: ['Asia/Bangkok'],\n  [COUNTRY_CODES.VN]: ['Asia/Ho_Chi_Minh'],\n  [COUNTRY_CODES.MY]: ['Asia/Kuala_Lumpur'],\n  [COUNTRY_CODES.SG]: ['Asia/Singapore'],\n  [COUNTRY_CODES.ID]: [\n    'Asia/Jakarta',\n    'Asia/Makassar',\n    'Asia/Jayapura', // Indonesia has 3 time zones\n  ],\n  [COUNTRY_CODES.PH]: ['Asia/Manila'],\n  [COUNTRY_CODES.AE]: ['Asia/Dubai'],\n  [COUNTRY_CODES.SA]: ['Asia/Riyadh'],\n  [COUNTRY_CODES.IR]: ['Asia/Tehran'],\n  [COUNTRY_CODES.IQ]: ['Asia/Baghdad'],\n  [COUNTRY_CODES.IL]: ['Asia/Jerusalem'],\n  [COUNTRY_CODES.QA]: ['Asia/Qatar'],\n  [COUNTRY_CODES.KW]: ['Asia/Kuwait'],\n\n  // --- AFRICA ---\n  [COUNTRY_CODES.EG]: ['Africa/Cairo'],\n  [COUNTRY_CODES.NG]: ['Africa/Lagos'],\n  [COUNTRY_CODES.ZA]: ['Africa/Johannesburg'],\n  [COUNTRY_CODES.KE]: ['Africa/Nairobi'],\n  [COUNTRY_CODES.MA]: ['Africa/Casablanca'],\n  [COUNTRY_CODES.GH]: ['Africa/Accra'],\n  [COUNTRY_CODES.ET]: ['Africa/Addis_Ababa'],\n  [COUNTRY_CODES.TZ]: ['Africa/Dar_es_Salaam'],\n  [COUNTRY_CODES.SN]: ['Africa/Dakar'],\n\n  // --- OCEANIA ---\n  [COUNTRY_CODES.AU]: [\n    'Australia/Sydney',\n    'Australia/Melbourne',\n    'Australia/Perth',\n    'Australia/Brisbane',\n  ],\n  [COUNTRY_CODES.NZ]: ['Pacific/Auckland'],\n  [COUNTRY_CODES.FJ]: ['Pacific/Fiji'],\n  [COUNTRY_CODES.PG]: ['Pacific/Port_Moresby'],\n\n  // --- ANTARCTICA ---\n  [COUNTRY_CODES.AQ]: ['Antarctica/McMurdo', 'Antarctica/Palmer', 'Antarctica/Casey'],\n};\n\nexport const ALL_COUNTRY_TIMEZONES: string[] = Array.from(\n  new Set(Object.values(COUNTRY_TIMEZONES).flat())\n);\n\n/**\n * A single record describing the available time zones for a given country.\n */\nexport interface CountryTimezoneEntry {\n  countryCode: CountryCode;\n  timeZones: string[];\n}\n\n/**\n * Full mapping of all countries → time zones.\n */\nexport type CountryTimezones = Record<CountryCode, string[]>;\n\n/**\n * A flattened list of all unique IANA time zones supported globally.\n */\nexport type AllTimezones = string[];\n\nexport const DAYS_OF_WEEK = Array.from({ length: DAYS_IN_WEEK }, (_, i) => i);\nexport const HOURS_OF_DAY = Array.from({ length: EARLY_MORNING_HOURS }, (_, i) => i);\n\n/**\n * Type for time constant values\n */\nexport type TimeConstant = (typeof TIME_CONSTANTS)[keyof typeof TIME_CONSTANTS];\n","/**\n * API Client Environment Configurations\n *\n * Provides environment-specific default configurations for the API client service.\n * These configs are optimized for production, staging, and development environments.\n *\n * @module config/api/environments\n */\n\nimport type { ApiConfig, HeaderPresetName, EncryptionKey } from '@plyaz/types/api';\nimport { TIME_CONSTANTS } from '../time';\n\n/**\n * Production configuration for the API client service.\n * Optimized for reliability, security, and performance in production environments.\n *\n * Key Production Features:\n * - Encryption REQUIRED (enforced)\n * - Minimal headers (privacy-focused)\n * - Network adaptation enabled (auto-adjust to conditions)\n * - Balanced telemetry (monitoring without overhead)\n * - Aggressive retry strategy (5 attempts with exponential backoff)\n * - Uses retry PRESET strings instead of hardcoded values\n */\nexport const PRODUCTION_CONFIG: Partial<ApiConfig> = {\n  // Core settings\n  timeout: TIME_CONSTANTS.THIRTY_SECONDS,\n\n  // Unified strategy - includes cache, retry, performance strategies\n  // 'interactive' = standard cache + standard retry + balanced performance\n  unifiedStrategy: 'interactive',\n\n  // Revalidation strategy - NOT covered by unifiedStrategy\n  // Controls when to revalidate cached data (SWR pattern)\n  revalidationStrategy: 'balanced', // Revalidate on focus, network reconnect\n\n  // Error handling strategy - return {data, error} without throwing\n  strategy: 'softFail',\n\n  // Default JSON headers for most API interactions\n  headers: {\n    presets: ['json' as unknown as HeaderPresetName] as const, // Sets Accept and Content-Type to application/json\n    autoDetectNetwork: true,\n    requestClientHints: false,\n  },\n\n  // Enriched headers - minimal preset with GLOBAL compliance\n  // Adds ~5-7 headers: platform, app version, timezone, locale, network type\n  // Privacy-conscious: respects DNT, no device fingerprinting\n  // Global compliance: covers GDPR, CCPA, PIPL, APPI automatically\n  enrichedHeaders: {\n    enabled: true,\n    preset: 'standard', // standard context headers\n    includeDevice: false, // No device fingerprinting (privacy)\n    includeNetwork: true, // Network type (wifi/cellular/etc)\n    includePlatform: true, // Platform (web/ios/android)\n    includeCompliance: true, // Timezone, locale for regional compliance\n    respectDoNotTrack: true, // Honor DNT header (GDPR/CCPA)\n    autoDetectRegion: true, // Auto-detect region from timezone\n    regionalPreset: 'global', // Global compliance (GDPR+CCPA+PIPL+APPI)\n    useTimezone: true, // Use timezone for region detection\n  },\n\n  // Network awareness - monitoring enabled, WITH auto-adaptation\n  // Adjusts strategies based on network quality\n  networkAware: {\n    enabled: true, // Enable network quality monitoring\n    adaptConfig: true, // Auto-adjust strategies based on network\n    requestClientHints: false, // Don't request extra browser hints\n  },\n\n  // Tracking configuration - balanced for production (monitoring without overhead)\n  tracking: {\n    enabled: true,\n    operations: true,\n    events: true,\n    performanceMode: 'minimal', // Not 'full' - avoid overhead in prod\n    queueStrategy: 'batch',\n    eventStrategy: 'queued',\n    telemetry: true, // Send to monitoring in production\n  },\n\n  // Retry strategy - use preset instead of hardcoded values\n  retryStrategy: 'aggressive', // More retries for production reliability (5 attempts)\n  // Note: unifiedStrategy 'interactive' already includes 'standard' retry (3 attempts)\n  // This overrides it for production to be more aggressive\n\n  // Encryption - ENABLED by default for regulatory compliance (GDPR, CCPA, PIPL, etc.)\n  // Encrypts common sensitive fields automatically\n  // User MUST provide encryption key via init() - defaults don't include key\n  encryption: {\n    enabled: true,\n    algorithm: 'AES-GCM', // Industry standard, FIPS 140-2 compliant\n    autoDecrypt: true, // Auto-decrypt responses\n    target: ['all'], // Encrypt in request body and query params\n    // Key will be provided by user during initialization\n    key: undefined as unknown as EncryptionKey, // Placeholder - user must provide via apiConfig\n\n    // Common sensitive field patterns (uses glob matching)\n    // Covers: email, SSN, phone, card numbers, passwords, tokens, wallet addresses\n    fields: [\n      // Personal Identifiable Information (PII) - GDPR Art. 9\n      '*.email',\n      '*.ssn',\n      '*.taxId',\n      '*.nationalId',\n      '*.passport',\n      '*.driverLicense',\n      '*.governmentId',\n\n      // Contact Information - GDPR Art. 4(1)\n      '*.phone',\n      '*.phoneNumber',\n      '*.mobile',\n      '*.telephone',\n      '*.address.street',\n      '*.address.line1',\n      '*.address.line2',\n      '*.postalCode',\n      '*.zipCode',\n\n      // Financial Information - PCI-DSS Req 3.4\n      '*.cardNumber',\n      '*.creditCard',\n      '*.debitCard',\n      '*.cvv',\n      '*.cvc',\n      '*.iban',\n      '*.accountNumber',\n      '*.routingNumber',\n      '*.swiftCode',\n      '*.sortCode',\n\n      // Authentication Credentials - OWASP ASVS 2.1\n      '*.password',\n      '*.apiKey',\n      '*.secret',\n      '*.token',\n      '*.accessToken',\n      '*.refreshToken',\n      '*.privateKey',\n      '*.secretKey',\n\n      // Crypto/Blockchain - Web3 security\n      '*.wallet',\n      '*.walletAddress',\n      '*.mnemonic',\n      '*.seedPhrase',\n      '*.privateKeyHex',\n\n      // Health Information - HIPAA §164.312(a)(2)(iv)\n      '*.medicalRecord',\n      '*.medicalRecordNumber',\n      '*.healthInfo',\n      '*.diagnosis',\n      '*.prescription',\n      '*.healthInsurance',\n\n      // Biometric Data - GDPR Art. 9(1)\n      '*.fingerprint',\n      '*.faceId',\n      '*.biometric',\n\n      // Date of Birth - Age verification\n      '*.birthDate',\n      '*.dateOfBirth',\n      '*.dob',\n\n      // IP Addresses - GDPR considers PII\n      '*.ipAddress',\n      '*.ip',\n    ],\n\n    // Key provider - MUST be provided by user via init()\n    // Supports three patterns:\n    //\n    // 1. EncryptionKey object (with metadata):\n    //    key: {\n    //      id: 'prod-key-v1',\n    //      key: process.env.ENCRYPTION_KEY!,\n    //      algorithm: 'AES-GCM',\n    //      format: 'raw'\n    //    }\n    //\n    // 2. KeyProvider function (for key rotation):\n    //    key: async (context) => {\n    //      const keyId = await getActiveKeyId();\n    //      const key = await keyManagementService.getKey(keyId);\n    //      return { id: keyId, key, algorithm: 'AES-GCM' };\n    //    }\n    //\n    // 3. Simple string (auto-converted to EncryptionKey):\n    //    key: process.env.ENCRYPTION_KEY!\n    //\n    // NO default key - user provides via init()\n  },\n};\n\n/**\n * Staging configuration for the API client service.\n * ALIGNED with production for accurate pre-production testing.\n * Only differences: standard headers for debugging, full performance tracking.\n *\n * Key Staging Features:\n * - Encryption ENABLED (same as production)\n * - Standard headers (slightly more context for debugging than prod)\n * - Full performance tracking (catch issues before production)\n * - Same retry strategy as production (aggressive)\n * - Same network adaptation as production\n */\nexport const STAGING_CONFIG: Partial<ApiConfig> = {\n  // Core settings - SAME AS PRODUCTION\n  timeout: TIME_CONSTANTS.THIRTY_SECONDS,\n\n  // Unified strategy - SAME AS PRODUCTION\n  unifiedStrategy: 'interactive',\n\n  // Revalidation strategy - SAME AS PRODUCTION\n  revalidationStrategy: 'balanced',\n\n  // Error handling strategy - SAME AS PRODUCTION\n  strategy: 'softFail',\n\n  // Headers preset - SAME AS PRODUCTION\n  headers: {\n    presets: ['json' as unknown as HeaderPresetName] as const,\n    autoDetectNetwork: true,\n    requestClientHints: false, // Same as prod\n  },\n\n  // Enriched headers - SLIGHTLY MORE than prod for debugging\n  enrichedHeaders: {\n    enabled: true,\n    preset: 'standard', // One level up from prod's 'minimal'\n    includeDevice: true, // Include device info for debugging\n    includeNetwork: true,\n    includePlatform: true,\n    includeCompliance: true,\n    respectDoNotTrack: true, // Same as prod\n    autoDetectRegion: true,\n    regionalPreset: 'global', // Same as prod\n    useTimezone: true,\n  },\n\n  // Network awareness - SAME AS PRODUCTION\n  networkAware: {\n    enabled: true,\n    adaptConfig: true, // Same as prod\n    requestClientHints: false, // Same as prod\n  },\n\n  // Tracking configuration - FULL in staging (only difference from prod)\n  tracking: {\n    enabled: true,\n    operations: true,\n    events: true,\n    performanceMode: 'full', // Full tracking to catch issues (prod uses 'balanced')\n    queueStrategy: 'batch',\n    eventStrategy: 'queued',\n    telemetry: true, // Same as prod\n  },\n\n  // Retry strategy - SAME AS PRODUCTION\n  retryStrategy: 'aggressive', // Same aggressive retries as production\n  // Test production retry behavior in staging\n\n  // Encryption - SAME AS PRODUCTION (REQUIRED)\n  encryption: {\n    enabled: true, // REQUIRED in staging (same as prod)\n    algorithm: 'AES-GCM',\n    autoDecrypt: true,\n    target: ['all'],\n    key: undefined as unknown as EncryptionKey, // Placeholder - user must provide via apiConfig\n    fields: [\n      // Same 50+ fields as production\n      '*.email',\n      '*.ssn',\n      '*.taxId',\n      '*.nationalId',\n      '*.passport',\n      '*.driverLicense',\n      '*.governmentId',\n      '*.phone',\n      '*.phoneNumber',\n      '*.mobile',\n      '*.telephone',\n      '*.address.street',\n      '*.address.line1',\n      '*.address.line2',\n      '*.postalCode',\n      '*.zipCode',\n      '*.cardNumber',\n      '*.creditCard',\n      '*.debitCard',\n      '*.cvv',\n      '*.cvc',\n      '*.iban',\n      '*.accountNumber',\n      '*.routingNumber',\n      '*.swiftCode',\n      '*.sortCode',\n      '*.password',\n      '*.apiKey',\n      '*.secret',\n      '*.token',\n      '*.accessToken',\n      '*.refreshToken',\n      '*.privateKey',\n      '*.secretKey',\n      '*.wallet',\n      '*.walletAddress',\n      '*.mnemonic',\n      '*.seedPhrase',\n      '*.privateKeyHex',\n      '*.medicalRecord',\n      '*.medicalRecordNumber',\n      '*.healthInfo',\n      '*.diagnosis',\n      '*.prescription',\n      '*.healthInsurance',\n      '*.fingerprint',\n      '*.faceId',\n      '*.biometric',\n      '*.birthDate',\n      '*.dateOfBirth',\n      '*.dob',\n      '*.ipAddress',\n      '*.ip',\n    ],\n  },\n};\n\n/**\n * Development configuration for the API client service.\n * Optimized for debugging and fast feedback during development.\n *\n * Key Development Features:\n * - Encryption OPTIONAL (disable for easier debugging)\n * - Full headers (all context for debugging)\n * - No network adaptation (consistent behavior)\n * - Minimal retries (fail fast to see errors quickly)\n * - Full performance tracking (optimize during development)\n * - Longer timeout (allow for debugging/breakpoints)\n */\nexport const DEVELOPMENT_CONFIG: Partial<ApiConfig> = {\n  // Core settings - longer timeout for debugging\n  timeout: TIME_CONSTANTS.TWO_MINUTES,\n\n  // Unified strategy - interactive works well for dev\n  unifiedStrategy: 'interactive',\n\n  // Revalidation strategy\n  revalidationStrategy: 'balanced',\n\n  // Error handling strategy\n  strategy: 'softFail',\n\n  // Full headers preset for maximum debugging context\n  headers: {\n    presets: ['json' as unknown as HeaderPresetName] as const,\n    autoDetectNetwork: true,\n    requestClientHints: true,\n  },\n\n  // Enriched headers - FULL preset with all context\n  enrichedHeaders: {\n    enabled: true,\n    preset: 'full', // All possible headers for debugging\n    includeDevice: true, // Include everything\n    includeNetwork: true,\n    includePlatform: true,\n    includeCompliance: true,\n    includePerformance: true, // Performance hints\n    respectDoNotTrack: false, // Ignore DNT in dev\n    autoDetectRegion: true,\n    regionalPreset: 'global',\n    useTimezone: true,\n  },\n\n  // Network awareness - DISABLED (consistent behavior in dev)\n  networkAware: {\n    enabled: false, // Don't adapt config in dev\n    adaptConfig: false,\n    requestClientHints: false,\n  },\n\n  // Tracking configuration - FULL to see everything\n  tracking: {\n    enabled: true,\n    operations: true,\n    events: true,\n    performanceMode: 'full', // Track everything in dev\n    queueStrategy: 'immediate', // Process immediately (no batching)\n    eventStrategy: 'immediate', // Immediate events for debugging\n    telemetry: false, // Don't send to monitoring from dev\n  },\n\n  // Retry strategy - MINIMAL (fail fast to see errors)\n  retryStrategy: 'conservative', // Minimal retries (1 attempt) to see errors immediately\n  // Note: unifiedStrategy 'interactive' includes 'standard' retry (3 attempts)\n  // This overrides it for development to fail faster\n\n  // Encryption - DISABLED by default but with SAME fields as production\n  // This allows developers to test encryption locally when needed\n  encryption: {\n    enabled: false, // Disabled in dev by default (enable via apiConfig when testing)\n    algorithm: 'AES-GCM',\n    autoDecrypt: true,\n    target: ['all'],\n\n    // NO default key in development - encryption is disabled\n    // To test encryption locally, pass key via apiConfig:\n    //   encryption: {\n    //     enabled: true,\n    //     key: \"your-test-key\" // Auto-converted to EncryptionKey\n    //     // Or use EncryptionKey object:\n    //     // key: { id: \"test-1\", key: \"your-key\", algorithm: \"AES-GCM\" }\n    //   }\n    key: undefined as unknown as EncryptionKey, // Placeholder - encryption disabled in development\n\n    // Same 50+ fields as production for testing\n    fields: [\n      '*.email',\n      '*.ssn',\n      '*.taxId',\n      '*.nationalId',\n      '*.passport',\n      '*.driverLicense',\n      '*.governmentId',\n      '*.phone',\n      '*.phoneNumber',\n      '*.mobile',\n      '*.telephone',\n      '*.address.street',\n      '*.address.line1',\n      '*.address.line2',\n      '*.postalCode',\n      '*.zipCode',\n      '*.cardNumber',\n      '*.creditCard',\n      '*.debitCard',\n      '*.cvv',\n      '*.cvc',\n      '*.iban',\n      '*.accountNumber',\n      '*.routingNumber',\n      '*.swiftCode',\n      '*.sortCode',\n      '*.password',\n      '*.apiKey',\n      '*.secret',\n      '*.token',\n      '*.accessToken',\n      '*.refreshToken',\n      '*.privateKey',\n      '*.secretKey',\n      '*.wallet',\n      '*.walletAddress',\n      '*.mnemonic',\n      '*.seedPhrase',\n      '*.privateKeyHex',\n      '*.medicalRecord',\n      '*.medicalRecordNumber',\n      '*.healthInfo',\n      '*.diagnosis',\n      '*.prescription',\n      '*.healthInsurance',\n      '*.fingerprint',\n      '*.faceId',\n      '*.biometric',\n      '*.birthDate',\n      '*.dateOfBirth',\n      '*.dob',\n      '*.ipAddress',\n      '*.ip',\n    ],\n  },\n};\n","import type { ApiClientOptions, ApiConfig } from '@plyaz/types/api';\nimport { TIME_CONSTANTS } from '../../time/constants';\n\n/**\n * Default configuration for API clients\n *\n * These defaults provide sensible out-of-the-box behavior:\n * - 30 second timeout for requests\n * - 3 retry attempts with exponential backoff\n * - 60 second cache TTL with 5 minute stale time\n * - Standard JSON content-type headers\n * - Soft-fail error strategy (returns error without throwing)\n */\nexport const DEFAULT_API_CONFIG: ApiConfig = {\n  baseURL: '',\n  timeout: TIME_CONSTANTS.THIRTY_SECONDS,\n  retry: {\n    attempts: 3,\n    delay: TIME_CONSTANTS.SECOND,\n    maxDelay: TIME_CONSTANTS.THIRTY_SECONDS,\n    backoff: 1.5,\n  },\n  cache: {\n    ttl: 60,\n    stale: 300,\n  },\n  headers: {\n    'Content-Type': 'application/json',\n    Accept: 'application/json',\n  },\n  strategy: 'softFail',\n};\n\n/**\n * Default client options with global compliance enabled by default\n *\n * This ensures maximum privacy protection out of the box:\n * - Enriched headers enabled with standard preset\n * - Global compliance level (minimum data collection)\n */\nexport const DEFAULT_API_CLIENT_OPTIONS: Partial<ApiClientOptions> = {\n  enrichedHeaders: {\n    enabled: true,\n    preset: 'standard', // Uses 'global' compliance by default\n  },\n};\n"]}