@plyaz/config 1.8.11 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/encryption.d.ts +64 -0
- package/dist/api/encryption.d.ts.map +1 -0
- package/dist/api/index.cjs +1 -1
- package/dist/api/index.cjs.map +1 -1
- package/dist/api/index.d.ts +1 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.mjs +1 -1
- package/dist/api/index.mjs.map +1 -1
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +3 -3
- package/dist/index.mjs.map +1 -1
- package/dist/providers/index.cjs.map +1 -1
- package/dist/providers/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Encryption Constants
|
|
3
|
+
*
|
|
4
|
+
* Centralized constants for API encryption configuration.
|
|
5
|
+
* Uses Web Crypto API compatible algorithms.
|
|
6
|
+
*
|
|
7
|
+
* @module config/api/encryption
|
|
8
|
+
*/
|
|
9
|
+
import type { EncryptionAlgorithm, KeyFormat, EncryptionKey, EncryptionConfig } from '@plyaz/types/api';
|
|
10
|
+
/**
|
|
11
|
+
* Default encryption configuration values for API clients
|
|
12
|
+
*/
|
|
13
|
+
export declare const API_ENCRYPTION_DEFAULTS: {
|
|
14
|
+
/** Default algorithm - AES-GCM is recommended for Web Crypto API */
|
|
15
|
+
readonly ALGORITHM: EncryptionAlgorithm;
|
|
16
|
+
/** Default key format */
|
|
17
|
+
readonly KEY_FORMAT: KeyFormat;
|
|
18
|
+
/** Default key ID for frontend clients */
|
|
19
|
+
readonly FRONTEND_KEY_ID: "frontend-key";
|
|
20
|
+
/** Default key ID for backend clients */
|
|
21
|
+
readonly BACKEND_KEY_ID: "backend-key";
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Create a default encryption key configuration
|
|
25
|
+
*
|
|
26
|
+
* @param key - The encryption key (base64 encoded)
|
|
27
|
+
* @param options - Optional overrides
|
|
28
|
+
* @returns EncryptionKey configuration
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* const encryptionKey = createDefaultEncryptionKey(process.env.API_ENCRYPTION_KEY!);
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function createDefaultEncryptionKey(key: string, options?: {
|
|
36
|
+
id?: string;
|
|
37
|
+
format?: KeyFormat;
|
|
38
|
+
algorithm?: EncryptionAlgorithm;
|
|
39
|
+
}): EncryptionKey;
|
|
40
|
+
/**
|
|
41
|
+
* Create the full encryption configuration for API clients
|
|
42
|
+
*
|
|
43
|
+
* @param key - The encryption key (base64 encoded)
|
|
44
|
+
* @param options - Optional overrides for key and config
|
|
45
|
+
* @returns Full EncryptionConfig ready for use
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```ts
|
|
49
|
+
* // Basic usage
|
|
50
|
+
* const encryptionConfig = createEncryptionConfig(process.env.API_ENCRYPTION_KEY!);
|
|
51
|
+
*
|
|
52
|
+
* // With overrides
|
|
53
|
+
* const encryptionConfig = createEncryptionConfig(key, {
|
|
54
|
+
* algorithm: 'AES-CBC',
|
|
55
|
+
* keyId: 'custom-key-id',
|
|
56
|
+
* });
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export declare function createEncryptionConfig(key: string, options?: {
|
|
60
|
+
algorithm?: EncryptionAlgorithm;
|
|
61
|
+
keyId?: string;
|
|
62
|
+
keyFormat?: KeyFormat;
|
|
63
|
+
}): EncryptionConfig;
|
|
64
|
+
//# sourceMappingURL=encryption.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../../src/api/encryption.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,mBAAmB,EACnB,SAAS,EACT,aAAa,EACb,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,eAAO,MAAM,uBAAuB;IAClC,oEAAoE;wBAC5C,mBAAmB;IAE3C,yBAAyB;yBACD,SAAS;IAEjC,0CAA0C;;IAG1C,yCAAyC;;CAEjC,CAAC;AAEX;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IACR,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,mBAAmB,CAAC;CACjC,GACA,aAAa,CAOf;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,GACA,gBAAgB,CAUlB"}
|
package/dist/api/index.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
'use strict';// @plyaz package - Built with tsup
|
|
2
|
-
var e={US:"US",CA:"CA",MX:"MX",BR:"BR",AR:"AR",CL:"CL",CO:"CO",PE:"PE",VE:"VE",GB:"GB",FR:"FR",DE:"DE",IT:"IT",ES:"ES",PT:"PT",NL:"NL",CH:"CH",SE:"SE",NO:"NO",FI:"FI",PL:"PL",GR:"GR",UA:"UA",RU:"RU",CN:"CN",JP:"JP",KR:"KR",IN:"IN",PK:"PK",BD:"BD",TH:"TH",VN:"VN",MY:"MY",SG:"SG",ID:"ID",PH:"PH",SA:"SA",AE:"AE",QA:"QA",KW:"KW",IQ:"IQ",IR:"IR",IL:"IL",TR:"TR",EG:"EG",MA:"MA",ET:"ET",KE:"KE",TZ:"TZ",ZA:"ZA",NG:"NG",GH:"GH",SN:"SN",AU:"AU",NZ:"NZ",PG:"PG",FJ:"FJ",AQ:"AQ"};var
|
|
2
|
+
var i=Object.defineProperty;var t=(n,r)=>i(n,"name",{value:r,configurable:true});var a={ALGORITHM:"AES-GCM",KEY_FORMAT:"base64",FRONTEND_KEY_ID:"frontend-key",BACKEND_KEY_ID:"backend-key"};function E(n,r){return {id:r?.id??a.FRONTEND_KEY_ID,key:n,format:r?.format??a.KEY_FORMAT,algorithm:r?.algorithm??a.ALGORITHM}}t(E,"createDefaultEncryptionKey");function g(n,r){return {enabled:true,algorithm:r?.algorithm??a.ALGORITHM,key:E(n,{id:r?.keyId,format:r?.keyFormat,algorithm:r?.algorithm})}}t(g,"createEncryptionConfig");var e={US:"US",CA:"CA",MX:"MX",BR:"BR",AR:"AR",CL:"CL",CO:"CO",PE:"PE",VE:"VE",GB:"GB",FR:"FR",DE:"DE",IT:"IT",ES:"ES",PT:"PT",NL:"NL",CH:"CH",SE:"SE",NO:"NO",FI:"FI",PL:"PL",GR:"GR",UA:"UA",RU:"RU",CN:"CN",JP:"JP",KR:"KR",IN:"IN",PK:"PK",BD:"BD",TH:"TH",VN:"VN",MY:"MY",SG:"SG",ID:"ID",PH:"PH",SA:"SA",AE:"AE",QA:"QA",KW:"KW",IQ:"IQ",IR:"IR",IL:"IL",TR:"TR",EG:"EG",MA:"MA",ET:"ET",KE:"KE",TZ:"TZ",ZA:"ZA",NG:"NG",GH:"GH",SN:"SN",AU:"AU",NZ:"NZ",PG:"PG",FJ:"FJ",AQ:"AQ"};var u=7,A=6,o={SECOND:1e3,THIRTY_SECONDS:3e4,TWO_MINUTES:12e4},c={[e.US]:["America/New_York","America/Chicago","America/Denver","America/Los_Angeles","America/Anchorage","Pacific/Honolulu"],[e.CA]:["America/Toronto","America/Vancouver","America/Edmonton","America/Halifax","America/St_Johns"],[e.MX]:["America/Mexico_City","America/Monterrey","America/Tijuana"],[e.BR]:["America/Sao_Paulo","America/Manaus","America/Fortaleza"],[e.AR]:["America/Argentina/Buenos_Aires"],[e.CL]:["America/Santiago"],[e.CO]:["America/Bogota"],[e.PE]:["America/Lima"],[e.VE]:["America/Caracas"],[e.GB]:["Europe/London"],[e.FR]:["Europe/Paris"],[e.DE]:["Europe/Berlin"],[e.IT]:["Europe/Rome"],[e.ES]:["Europe/Madrid"],[e.PT]:["Europe/Lisbon"],[e.NL]:["Europe/Amsterdam"],[e.SE]:["Europe/Stockholm"],[e.PL]:["Europe/Warsaw"],[e.FI]:["Europe/Helsinki"],[e.NO]:["Europe/Oslo"],[e.CH]:["Europe/Zurich"],[e.RU]:["Europe/Moscow","Asia/Yekaterinburg","Asia/Irkutsk","Asia/Vladivostok"],[e.UA]:["Europe/Kyiv"],[e.GR]:["Europe/Athens"],[e.TR]:["Europe/Istanbul"],[e.CN]:["Asia/Shanghai","Asia/Urumqi"],[e.JP]:["Asia/Tokyo"],[e.KR]:["Asia/Seoul"],[e.IN]:["Asia/Kolkata"],[e.PK]:["Asia/Karachi"],[e.BD]:["Asia/Dhaka"],[e.TH]:["Asia/Bangkok"],[e.VN]:["Asia/Ho_Chi_Minh"],[e.MY]:["Asia/Kuala_Lumpur"],[e.SG]:["Asia/Singapore"],[e.ID]:["Asia/Jakarta","Asia/Makassar","Asia/Jayapura"],[e.PH]:["Asia/Manila"],[e.AE]:["Asia/Dubai"],[e.SA]:["Asia/Riyadh"],[e.IR]:["Asia/Tehran"],[e.IQ]:["Asia/Baghdad"],[e.IL]:["Asia/Jerusalem"],[e.QA]:["Asia/Qatar"],[e.KW]:["Asia/Kuwait"],[e.EG]:["Africa/Cairo"],[e.NG]:["Africa/Lagos"],[e.ZA]:["Africa/Johannesburg"],[e.KE]:["Africa/Nairobi"],[e.MA]:["Africa/Casablanca"],[e.GH]:["Africa/Accra"],[e.ET]:["Africa/Addis_Ababa"],[e.TZ]:["Africa/Dar_es_Salaam"],[e.SN]:["Africa/Dakar"],[e.AU]:["Australia/Sydney","Australia/Melbourne","Australia/Perth","Australia/Brisbane"],[e.NZ]:["Pacific/Auckland"],[e.FJ]:["Pacific/Fiji"],[e.PG]:["Pacific/Port_Moresby"],[e.AQ]:["Antarctica/McMurdo","Antarctica/Palmer","Antarctica/Casey"]};Array.from(new Set(Object.values(c).flat()));Array.from({length:u},(n,r)=>r);Array.from({length:A},(n,r)=>r);var X={timeout:o.THIRTY_SECONDS,unifiedStrategy:"interactive",revalidationStrategy:"balanced",strategy:"softFail",headers:{presets:["json"],autoDetectNetwork:true,requestClientHints:false},enrichedHeaders:{enabled:true,preset:"standard",includeDevice:false,includeNetwork:true,includePlatform:true,includeCompliance:true,respectDoNotTrack:true,autoDetectRegion:true,regionalPreset:"global",useTimezone:true},networkAware:{enabled:true,adaptConfig:true,requestClientHints:false},tracking:{enabled:true,operations:true,events:true,performanceMode:"minimal",queueStrategy:"batch",eventStrategy:"queued",telemetry:true},retryStrategy:"aggressive",encryption:{enabled:true,algorithm:"AES-GCM",autoDecrypt:true,target:["all"],key:void 0,fields:["*.email","*.ssn","*.taxId","*.nationalId","*.passport","*.driverLicense","*.governmentId","*.phone","*.phoneNumber","*.mobile","*.telephone","*.address.street","*.address.line1","*.address.line2","*.postalCode","*.zipCode","*.cardNumber","*.creditCard","*.debitCard","*.cvv","*.cvc","*.iban","*.accountNumber","*.routingNumber","*.swiftCode","*.sortCode","*.password","*.apiKey","*.secret","*.token","*.accessToken","*.refreshToken","*.privateKey","*.secretKey","*.wallet","*.walletAddress","*.mnemonic","*.seedPhrase","*.privateKeyHex","*.medicalRecord","*.medicalRecordNumber","*.healthInfo","*.diagnosis","*.prescription","*.healthInsurance","*.fingerprint","*.faceId","*.biometric","*.birthDate","*.dateOfBirth","*.dob","*.ipAddress","*.ip"]}},x={timeout:o.THIRTY_SECONDS,unifiedStrategy:"interactive",revalidationStrategy:"balanced",strategy:"softFail",headers:{presets:["json"],autoDetectNetwork:true,requestClientHints:false},enrichedHeaders:{enabled:true,preset:"standard",includeDevice:true,includeNetwork:true,includePlatform:true,includeCompliance:true,respectDoNotTrack:true,autoDetectRegion:true,regionalPreset:"global",useTimezone:true},networkAware:{enabled:true,adaptConfig:true,requestClientHints:false},tracking:{enabled:true,operations:true,events:true,performanceMode:"full",queueStrategy:"batch",eventStrategy:"queued",telemetry:true},retryStrategy:"aggressive",encryption:{enabled:true,algorithm:"AES-GCM",autoDecrypt:true,target:["all"],key:void 0,fields:["*.email","*.ssn","*.taxId","*.nationalId","*.passport","*.driverLicense","*.governmentId","*.phone","*.phoneNumber","*.mobile","*.telephone","*.address.street","*.address.line1","*.address.line2","*.postalCode","*.zipCode","*.cardNumber","*.creditCard","*.debitCard","*.cvv","*.cvc","*.iban","*.accountNumber","*.routingNumber","*.swiftCode","*.sortCode","*.password","*.apiKey","*.secret","*.token","*.accessToken","*.refreshToken","*.privateKey","*.secretKey","*.wallet","*.walletAddress","*.mnemonic","*.seedPhrase","*.privateKeyHex","*.medicalRecord","*.medicalRecordNumber","*.healthInfo","*.diagnosis","*.prescription","*.healthInsurance","*.fingerprint","*.faceId","*.biometric","*.birthDate","*.dateOfBirth","*.dob","*.ipAddress","*.ip"]}},W={timeout:o.TWO_MINUTES,unifiedStrategy:"interactive",revalidationStrategy:"balanced",strategy:"softFail",headers:{presets:["json"],autoDetectNetwork:true,requestClientHints:true},enrichedHeaders:{enabled:true,preset:"full",includeDevice:true,includeNetwork:true,includePlatform:true,includeCompliance:true,includePerformance:true,respectDoNotTrack:false,autoDetectRegion:true,regionalPreset:"global",useTimezone:true},networkAware:{enabled:false,adaptConfig:false,requestClientHints:false},tracking:{enabled:true,operations:true,events:true,performanceMode:"full",queueStrategy:"immediate",eventStrategy:"immediate",telemetry:false},retryStrategy:"conservative",encryption:{enabled:false,algorithm:"AES-GCM",autoDecrypt:true,target:["all"],key:void 0,fields:["*.email","*.ssn","*.taxId","*.nationalId","*.passport","*.driverLicense","*.governmentId","*.phone","*.phoneNumber","*.mobile","*.telephone","*.address.street","*.address.line1","*.address.line2","*.postalCode","*.zipCode","*.cardNumber","*.creditCard","*.debitCard","*.cvv","*.cvc","*.iban","*.accountNumber","*.routingNumber","*.swiftCode","*.sortCode","*.password","*.apiKey","*.secret","*.token","*.accessToken","*.refreshToken","*.privateKey","*.secretKey","*.wallet","*.walletAddress","*.mnemonic","*.seedPhrase","*.privateKeyHex","*.medicalRecord","*.medicalRecordNumber","*.healthInfo","*.diagnosis","*.prescription","*.healthInsurance","*.fingerprint","*.faceId","*.biometric","*.birthDate","*.dateOfBirth","*.dob","*.ipAddress","*.ip"]}};var J={baseURL:"",timeout:o.THIRTY_SECONDS,retry:{attempts:3,delay:o.SECOND,maxDelay:o.THIRTY_SECONDS,backoff:1.5},cache:{ttl:60,stale:300},headers:{"Content-Type":"application/json",Accept:"application/json"},strategy:"softFail"},w={enrichedHeaders:{enabled:true,preset:"standard"}};exports.API_ENCRYPTION_DEFAULTS=a;exports.DEFAULT_API_CLIENT_OPTIONS=w;exports.DEFAULT_API_CONFIG=J;exports.DEVELOPMENT_CONFIG=W;exports.PRODUCTION_CONFIG=X;exports.STAGING_CONFIG=x;exports.createDefaultEncryptionKey=E;exports.createEncryptionConfig=g;//# sourceMappingURL=index.cjs.map
|
|
3
3
|
//# sourceMappingURL=index.cjs.map
|
package/dist/api/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/locale/countries.ts","../../src/time/constants.ts","../../src/api/environments.ts","../../src/api/package/defaults.ts"],"names":["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 * 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"]}
|
|
1
|
+
{"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"]}
|
package/dist/api/index.d.ts
CHANGED
package/dist/api/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC"}
|
package/dist/api/index.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// @plyaz package - Built with tsup
|
|
2
|
-
var e={US:"US",CA:"CA",MX:"MX",BR:"BR",AR:"AR",CL:"CL",CO:"CO",PE:"PE",VE:"VE",GB:"GB",FR:"FR",DE:"DE",IT:"IT",ES:"ES",PT:"PT",NL:"NL",CH:"CH",SE:"SE",NO:"NO",FI:"FI",PL:"PL",GR:"GR",UA:"UA",RU:"RU",CN:"CN",JP:"JP",KR:"KR",IN:"IN",PK:"PK",BD:"BD",TH:"TH",VN:"VN",MY:"MY",SG:"SG",ID:"ID",PH:"PH",SA:"SA",AE:"AE",QA:"QA",KW:"KW",IQ:"IQ",IR:"IR",IL:"IL",TR:"TR",EG:"EG",MA:"MA",ET:"ET",KE:"KE",TZ:"TZ",ZA:"ZA",NG:"NG",GH:"GH",SN:"SN",AU:"AU",NZ:"NZ",PG:"PG",FJ:"FJ",AQ:"AQ"};var
|
|
2
|
+
var i=Object.defineProperty;var t=(n,r)=>i(n,"name",{value:r,configurable:true});var a={ALGORITHM:"AES-GCM",KEY_FORMAT:"base64",FRONTEND_KEY_ID:"frontend-key",BACKEND_KEY_ID:"backend-key"};function E(n,r){return {id:r?.id??a.FRONTEND_KEY_ID,key:n,format:r?.format??a.KEY_FORMAT,algorithm:r?.algorithm??a.ALGORITHM}}t(E,"createDefaultEncryptionKey");function g(n,r){return {enabled:true,algorithm:r?.algorithm??a.ALGORITHM,key:E(n,{id:r?.keyId,format:r?.keyFormat,algorithm:r?.algorithm})}}t(g,"createEncryptionConfig");var e={US:"US",CA:"CA",MX:"MX",BR:"BR",AR:"AR",CL:"CL",CO:"CO",PE:"PE",VE:"VE",GB:"GB",FR:"FR",DE:"DE",IT:"IT",ES:"ES",PT:"PT",NL:"NL",CH:"CH",SE:"SE",NO:"NO",FI:"FI",PL:"PL",GR:"GR",UA:"UA",RU:"RU",CN:"CN",JP:"JP",KR:"KR",IN:"IN",PK:"PK",BD:"BD",TH:"TH",VN:"VN",MY:"MY",SG:"SG",ID:"ID",PH:"PH",SA:"SA",AE:"AE",QA:"QA",KW:"KW",IQ:"IQ",IR:"IR",IL:"IL",TR:"TR",EG:"EG",MA:"MA",ET:"ET",KE:"KE",TZ:"TZ",ZA:"ZA",NG:"NG",GH:"GH",SN:"SN",AU:"AU",NZ:"NZ",PG:"PG",FJ:"FJ",AQ:"AQ"};var u=7,A=6,o={SECOND:1e3,THIRTY_SECONDS:3e4,TWO_MINUTES:12e4},c={[e.US]:["America/New_York","America/Chicago","America/Denver","America/Los_Angeles","America/Anchorage","Pacific/Honolulu"],[e.CA]:["America/Toronto","America/Vancouver","America/Edmonton","America/Halifax","America/St_Johns"],[e.MX]:["America/Mexico_City","America/Monterrey","America/Tijuana"],[e.BR]:["America/Sao_Paulo","America/Manaus","America/Fortaleza"],[e.AR]:["America/Argentina/Buenos_Aires"],[e.CL]:["America/Santiago"],[e.CO]:["America/Bogota"],[e.PE]:["America/Lima"],[e.VE]:["America/Caracas"],[e.GB]:["Europe/London"],[e.FR]:["Europe/Paris"],[e.DE]:["Europe/Berlin"],[e.IT]:["Europe/Rome"],[e.ES]:["Europe/Madrid"],[e.PT]:["Europe/Lisbon"],[e.NL]:["Europe/Amsterdam"],[e.SE]:["Europe/Stockholm"],[e.PL]:["Europe/Warsaw"],[e.FI]:["Europe/Helsinki"],[e.NO]:["Europe/Oslo"],[e.CH]:["Europe/Zurich"],[e.RU]:["Europe/Moscow","Asia/Yekaterinburg","Asia/Irkutsk","Asia/Vladivostok"],[e.UA]:["Europe/Kyiv"],[e.GR]:["Europe/Athens"],[e.TR]:["Europe/Istanbul"],[e.CN]:["Asia/Shanghai","Asia/Urumqi"],[e.JP]:["Asia/Tokyo"],[e.KR]:["Asia/Seoul"],[e.IN]:["Asia/Kolkata"],[e.PK]:["Asia/Karachi"],[e.BD]:["Asia/Dhaka"],[e.TH]:["Asia/Bangkok"],[e.VN]:["Asia/Ho_Chi_Minh"],[e.MY]:["Asia/Kuala_Lumpur"],[e.SG]:["Asia/Singapore"],[e.ID]:["Asia/Jakarta","Asia/Makassar","Asia/Jayapura"],[e.PH]:["Asia/Manila"],[e.AE]:["Asia/Dubai"],[e.SA]:["Asia/Riyadh"],[e.IR]:["Asia/Tehran"],[e.IQ]:["Asia/Baghdad"],[e.IL]:["Asia/Jerusalem"],[e.QA]:["Asia/Qatar"],[e.KW]:["Asia/Kuwait"],[e.EG]:["Africa/Cairo"],[e.NG]:["Africa/Lagos"],[e.ZA]:["Africa/Johannesburg"],[e.KE]:["Africa/Nairobi"],[e.MA]:["Africa/Casablanca"],[e.GH]:["Africa/Accra"],[e.ET]:["Africa/Addis_Ababa"],[e.TZ]:["Africa/Dar_es_Salaam"],[e.SN]:["Africa/Dakar"],[e.AU]:["Australia/Sydney","Australia/Melbourne","Australia/Perth","Australia/Brisbane"],[e.NZ]:["Pacific/Auckland"],[e.FJ]:["Pacific/Fiji"],[e.PG]:["Pacific/Port_Moresby"],[e.AQ]:["Antarctica/McMurdo","Antarctica/Palmer","Antarctica/Casey"]};Array.from(new Set(Object.values(c).flat()));Array.from({length:u},(n,r)=>r);Array.from({length:A},(n,r)=>r);var X={timeout:o.THIRTY_SECONDS,unifiedStrategy:"interactive",revalidationStrategy:"balanced",strategy:"softFail",headers:{presets:["json"],autoDetectNetwork:true,requestClientHints:false},enrichedHeaders:{enabled:true,preset:"standard",includeDevice:false,includeNetwork:true,includePlatform:true,includeCompliance:true,respectDoNotTrack:true,autoDetectRegion:true,regionalPreset:"global",useTimezone:true},networkAware:{enabled:true,adaptConfig:true,requestClientHints:false},tracking:{enabled:true,operations:true,events:true,performanceMode:"minimal",queueStrategy:"batch",eventStrategy:"queued",telemetry:true},retryStrategy:"aggressive",encryption:{enabled:true,algorithm:"AES-GCM",autoDecrypt:true,target:["all"],key:void 0,fields:["*.email","*.ssn","*.taxId","*.nationalId","*.passport","*.driverLicense","*.governmentId","*.phone","*.phoneNumber","*.mobile","*.telephone","*.address.street","*.address.line1","*.address.line2","*.postalCode","*.zipCode","*.cardNumber","*.creditCard","*.debitCard","*.cvv","*.cvc","*.iban","*.accountNumber","*.routingNumber","*.swiftCode","*.sortCode","*.password","*.apiKey","*.secret","*.token","*.accessToken","*.refreshToken","*.privateKey","*.secretKey","*.wallet","*.walletAddress","*.mnemonic","*.seedPhrase","*.privateKeyHex","*.medicalRecord","*.medicalRecordNumber","*.healthInfo","*.diagnosis","*.prescription","*.healthInsurance","*.fingerprint","*.faceId","*.biometric","*.birthDate","*.dateOfBirth","*.dob","*.ipAddress","*.ip"]}},x={timeout:o.THIRTY_SECONDS,unifiedStrategy:"interactive",revalidationStrategy:"balanced",strategy:"softFail",headers:{presets:["json"],autoDetectNetwork:true,requestClientHints:false},enrichedHeaders:{enabled:true,preset:"standard",includeDevice:true,includeNetwork:true,includePlatform:true,includeCompliance:true,respectDoNotTrack:true,autoDetectRegion:true,regionalPreset:"global",useTimezone:true},networkAware:{enabled:true,adaptConfig:true,requestClientHints:false},tracking:{enabled:true,operations:true,events:true,performanceMode:"full",queueStrategy:"batch",eventStrategy:"queued",telemetry:true},retryStrategy:"aggressive",encryption:{enabled:true,algorithm:"AES-GCM",autoDecrypt:true,target:["all"],key:void 0,fields:["*.email","*.ssn","*.taxId","*.nationalId","*.passport","*.driverLicense","*.governmentId","*.phone","*.phoneNumber","*.mobile","*.telephone","*.address.street","*.address.line1","*.address.line2","*.postalCode","*.zipCode","*.cardNumber","*.creditCard","*.debitCard","*.cvv","*.cvc","*.iban","*.accountNumber","*.routingNumber","*.swiftCode","*.sortCode","*.password","*.apiKey","*.secret","*.token","*.accessToken","*.refreshToken","*.privateKey","*.secretKey","*.wallet","*.walletAddress","*.mnemonic","*.seedPhrase","*.privateKeyHex","*.medicalRecord","*.medicalRecordNumber","*.healthInfo","*.diagnosis","*.prescription","*.healthInsurance","*.fingerprint","*.faceId","*.biometric","*.birthDate","*.dateOfBirth","*.dob","*.ipAddress","*.ip"]}},W={timeout:o.TWO_MINUTES,unifiedStrategy:"interactive",revalidationStrategy:"balanced",strategy:"softFail",headers:{presets:["json"],autoDetectNetwork:true,requestClientHints:true},enrichedHeaders:{enabled:true,preset:"full",includeDevice:true,includeNetwork:true,includePlatform:true,includeCompliance:true,includePerformance:true,respectDoNotTrack:false,autoDetectRegion:true,regionalPreset:"global",useTimezone:true},networkAware:{enabled:false,adaptConfig:false,requestClientHints:false},tracking:{enabled:true,operations:true,events:true,performanceMode:"full",queueStrategy:"immediate",eventStrategy:"immediate",telemetry:false},retryStrategy:"conservative",encryption:{enabled:false,algorithm:"AES-GCM",autoDecrypt:true,target:["all"],key:void 0,fields:["*.email","*.ssn","*.taxId","*.nationalId","*.passport","*.driverLicense","*.governmentId","*.phone","*.phoneNumber","*.mobile","*.telephone","*.address.street","*.address.line1","*.address.line2","*.postalCode","*.zipCode","*.cardNumber","*.creditCard","*.debitCard","*.cvv","*.cvc","*.iban","*.accountNumber","*.routingNumber","*.swiftCode","*.sortCode","*.password","*.apiKey","*.secret","*.token","*.accessToken","*.refreshToken","*.privateKey","*.secretKey","*.wallet","*.walletAddress","*.mnemonic","*.seedPhrase","*.privateKeyHex","*.medicalRecord","*.medicalRecordNumber","*.healthInfo","*.diagnosis","*.prescription","*.healthInsurance","*.fingerprint","*.faceId","*.biometric","*.birthDate","*.dateOfBirth","*.dob","*.ipAddress","*.ip"]}};var J={baseURL:"",timeout:o.THIRTY_SECONDS,retry:{attempts:3,delay:o.SECOND,maxDelay:o.THIRTY_SECONDS,backoff:1.5},cache:{ttl:60,stale:300},headers:{"Content-Type":"application/json",Accept:"application/json"},strategy:"softFail"},w={enrichedHeaders:{enabled:true,preset:"standard"}};export{a as API_ENCRYPTION_DEFAULTS,w as DEFAULT_API_CLIENT_OPTIONS,J as DEFAULT_API_CONFIG,W as DEVELOPMENT_CONFIG,X as PRODUCTION_CONFIG,x as STAGING_CONFIG,E as createDefaultEncryptionKey,g as createEncryptionConfig};//# sourceMappingURL=index.mjs.map
|
|
3
3
|
//# sourceMappingURL=index.mjs.map
|