{"version":3,"sources":["../src/utils/storage.ts","../src/analytics.ts"],"names":["CACHE_STORAGE_EVENTS","CACHE_STORAGE_PAGES","cacheEventToStorage","eventName","properties","existingCache","events","err","cachePageViewToStorage","pageName","pages","getCachedEvents","storedEventsString","getCachedPageViews","storedPagesString","clearCachedEvents","clearCachedPageViews","createAnalyticsInstance","_options","_debug","log","createLogger","_growthbook","_rudderstack","_posthog","core_data","tracking_config","offline_event_cache","_pending_identify_calls","_storage_cache_processed","processStorageCache","storedEvents","event","cleaned_properties","cleanObject","storedPages","page","getId","onSdkLoaded","userId","traits","initialise","growthbookKey","growthbookDecryptionKey","rudderstackKey","app_version","growthbookOptions","posthogOptions","debug","_a","_b","country","getCountry","RudderStack","attrs","anonymousId","isUUID","anonId","Growthbook","interval","getFeatureValue","Posthog","setAttributes","attributes","user_id","rest","user_identity","config","v","getFeatureState","id","defaultValue","getGrowthbookStatus","isFeatureOn","key","setUrl","href","AnalyticsInstance","stored_user_id","sanitizePII","t","email","safe","isInternalEmail","hasProviderStructure","rudderstackTraits","posthogTraits","rudderstack","posthog","sharedTraits","call","language","country_of_residence","analytics_data","final_payload","hasRudderstackInitialized","cache","cleaned_cache_payload","cleaned_payload","posthog_payload","flattenObject","current_page","platform","callback","Analytics"],"mappings":";AAAO,IAAMA,EAAuB,yBAAA,CACvBC,CAAAA,CAAsB,8BActBC,CAAAA,CAAsB,CAACC,EAAmBC,CAAAA,GAA8C,CACjG,GAAI,CACA,IAAMC,CAAAA,CAAgB,YAAA,CAAa,QAAQL,CAAoB,CAAA,CACzDM,EAAwBD,CAAAA,CAAgB,IAAA,CAAK,KAAA,CAAMA,CAAa,EAAI,EAAC,CAC3EC,EAAO,IAAA,CAAK,CAAE,KAAMH,CAAAA,CAAW,UAAA,CAAAC,CAAAA,CAAY,SAAA,CAAW,KAAK,GAAA,EAAM,CAAC,CAAA,CAClE,YAAA,CAAa,QAAQJ,CAAAA,CAAsB,IAAA,CAAK,SAAA,CAAUM,CAAM,CAAC,EACrE,CAAA,MAASC,EAAK,CACV,OAAA,CAAQ,KAAK,kCAAA,CAAoCA,CAAG,EACxD,CACJ,EAEaC,CAAAA,CAAyB,CAACC,EAAkBL,CAAAA,GAA+C,CACpG,GAAI,CACA,IAAMC,CAAAA,CAAgB,YAAA,CAAa,QAAQJ,CAAmB,CAAA,CACxDS,EAA0BL,CAAAA,CAAgB,IAAA,CAAK,MAAMA,CAAa,CAAA,CAAI,EAAC,CAC7EK,CAAAA,CAAM,KAAK,CAAE,IAAA,CAAMD,EAAU,UAAA,CAAAL,CAAAA,CAAY,UAAW,IAAA,CAAK,GAAA,EAAM,CAAC,EAChE,YAAA,CAAa,OAAA,CAAQH,EAAqB,IAAA,CAAK,SAAA,CAAUS,CAAK,CAAC,EACnE,CAAA,MAASH,CAAAA,CAAK,CACV,OAAA,CAAQ,IAAA,CAAK,uCAAwCA,CAAG,EAC5D,CACJ,CAAA,CAEaI,CAAAA,CAAkB,IAAqB,CAChD,GAAI,CACA,IAAMC,EAAqB,YAAA,CAAa,OAAA,CAAQZ,CAAoB,CAAA,CACpE,GAAIY,EAAoB,CACpB,IAAMN,EAAS,IAAA,CAAK,KAAA,CAAMM,CAAkB,CAAA,CAC5C,OAAO,MAAM,OAAA,CAAQN,CAAM,CAAA,CAAIA,CAAAA,CAAS,EAC5C,CACJ,OAASC,CAAAA,CAAK,CACV,QAAQ,IAAA,CAAK,wCAAA,CAA0CA,CAAG,EAC9D,CACA,OAAO,EACX,CAAA,CAEaM,CAAAA,CAAqB,IAAwB,CACtD,GAAI,CACA,IAAMC,EAAoB,YAAA,CAAa,OAAA,CAAQb,CAAmB,CAAA,CAClE,GAAIa,EAAmB,CACnB,IAAMJ,EAAQ,IAAA,CAAK,KAAA,CAAMI,CAAiB,CAAA,CAC1C,OAAO,MAAM,OAAA,CAAQJ,CAAK,EAAIA,CAAAA,CAAQ,EAC1C,CACJ,OAASH,CAAAA,CAAK,CACV,QAAQ,IAAA,CAAK,uCAAA,CAAyCA,CAAG,EAC7D,CACA,OAAO,EACX,CAAA,CAEaQ,CAAAA,CAAoB,IAAY,CACzC,GAAI,CACA,YAAA,CAAa,UAAA,CAAWf,CAAoB,EAChD,OAASO,CAAAA,CAAK,CACV,QAAQ,IAAA,CAAK,0CAAA,CAA4CA,CAAG,EAChE,CACJ,CAAA,CAEaS,CAAAA,CAAuB,IAAY,CAC5C,GAAI,CACA,YAAA,CAAa,UAAA,CAAWf,CAAmB,EAC/C,CAAA,MAASM,CAAAA,CAAK,CACV,QAAQ,IAAA,CAAK,8CAAA,CAAgDA,CAAG,EACpE,CACJ,ECGO,SAASU,CAAAA,CAAwBC,CAAAA,CAAoB,CACxD,IAAIC,CAAAA,CAA4B,KAAA,CAE1BC,CAAAA,CAAMC,EAAa,EAAA,CAAI,IAAMF,CAAM,CAAA,CAErCG,IACAC,CAAAA,CACAC,CAAAA,CACAC,EAAiC,EAAC,CAClCC,EAA8C,EAAC,CAC/CC,EAA8E,EAAC,CAC/EC,IAAmF,EAAC,CACpFC,EAA2B,KAAA,CAEzBC,CAAAA,CAAsB,IAAM,CAC9B,GAAI,CAAAD,CAAAA,EACCN,GAAc,eAAA,CAEnB,CAAAM,EAA2B,IAAA,CAE3B,GAAI,CACA,IAAME,CAAAA,CAAepB,CAAAA,EAAgB,CACjCoB,EAAa,MAAA,CAAS,CAAA,GACtBX,EAAI,CAAA,gCAAA,EAAmCW,CAAAA,CAAa,MAAM,CAAA,gBAAA,CAAA,CAAoBA,CAAY,CAAA,CAC1FA,CAAAA,CAAa,QAAQC,CAAAA,EAAS,CAC1B,IAAMC,CAAAA,CAAqBC,GAAAA,CAAYF,EAAM,UAAU,CAAA,CACvDT,GAAc,KAAA,CAAMS,CAAAA,CAAM,KAAMC,CAAkB,EACtD,CAAC,CAAA,CACDlB,CAAAA,IAGJ,IAAMoB,CAAAA,CAActB,CAAAA,EAAmB,CACnCsB,EAAY,MAAA,CAAS,CAAA,GACrBf,EAAI,CAAA,gCAAA,EAAmCe,CAAAA,CAAY,MAAM,CAAA,oBAAA,CAAA,CAAwBA,CAAW,CAAA,CAC5FA,CAAAA,CAAY,QAAQC,CAAAA,EAAQ,CACxBb,GAAc,QAAA,CAASa,CAAAA,CAAK,KAAM,WAAA,CAAaC,CAAAA,EAAM,CAAGD,CAAAA,CAAK,UAAU,EAC3E,CAAC,EACDpB,CAAAA,EAAqB,EAE7B,OAAST,CAAAA,CAAK,CACV,QAAQ,IAAA,CAAK,4CAAA,CAA8CA,CAAG,EAClE,CAAA,CACJ,EAEM+B,CAAAA,CAAc,IAAM,CACtBlB,CAAAA,CAAI,sCAAsC,CAAA,CAC1CU,CAAAA,GAEIF,GAAAA,CAAwB,MAAA,CAAS,GACjCR,CAAAA,CAAI,CAAA,uBAAA,EAA0BQ,IAAwB,MAAM,CAAA,yBAAA,CAA2B,CAAA,CAE3FA,GAAAA,CAAwB,QAAQ,CAAC,CAAE,OAAAW,CAAAA,CAAQ,MAAA,CAAAC,CAAO,CAAA,GAAM,CAChDD,CAAAA,EACAhB,CAAAA,EAAc,cAAcgB,CAAAA,CAAQC,CAAM,EAElD,CAAC,CAAA,CACDZ,IAA0B,GAC9B,CAAA,CAiCMa,CAAAA,CAAa,MAAO,CACtB,aAAA,CAAAC,EACA,uBAAA,CAAAC,CAAAA,CACA,eAAAC,GAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,iBAAA,CAAAC,EACA,cAAA,CAAAC,CAAAA,CACA,MAAAC,CACJ,CAAA,GAAe,CAlLnB,IAAAC,CAAAA,CAAAC,GAAAA,CAmLYF,CAAAA,GAAU,SAAW7B,CAAAA,CAAS6B,CAAAA,CAAAA,CAElC5B,EAAI,gDAAA,CAAkD,CAClD,YAAa,CAAC,CAACwB,GAAAA,CACf,UAAA,CAAY,CAAC,CAACF,CAAAA,CACd,QAAS,CAAC,CAACK,CACf,CAAC,CAAA,CAED,GAAI,CAEA,IAAMI,EAAUL,CAAAA,EAAmB,UAAA,EAAY,UAAYJ,CAAAA,CAAgB,MAAMU,GAAW,CAAI,KAAA,CAAA,CAAA,CAOhG,GALIR,GAAAA,GACAxB,EAAI,uCAAuC,CAAA,CAC3CG,EAAe8B,CAAAA,CAAY,sBAAA,CAAuBT,IAAgBN,CAAAA,CAAanB,CAAAA,CAAQ0B,CAAW,CAAA,CAAA,CAGlGC,GAAmB,UAAA,EAAc,MAAA,CAAO,KAAKA,CAAAA,CAAkB,UAAU,EAAE,MAAA,CAAS,CAAA,CAAG,CACvF,IAAMQ,EAAQR,CAAAA,CAAkB,UAAA,CAC1BS,EAAchC,CAAAA,EAAc,cAAA,GAElCE,CAAAA,CAAY,CACR,GAAGA,CAAAA,CACH,OAAA,CAAA0B,EACA,GAAIG,CAAAA,CAAM,eAAiB,CAAE,aAAA,CAAeA,EAAM,aAAc,CAAA,CAChE,GAAIA,CAAAA,CAAM,cAAgB,CAAE,YAAA,CAAcA,EAAM,YAAa,CAAA,CAC7D,GAAIA,CAAAA,CAAM,MAAA,EAAU,CAAE,MAAA,CAAQA,EAAM,MAAO,CAAA,CAC3C,GAAIA,CAAAA,CAAM,iBAAA,EAAqB,CAAE,iBAAA,CAAmBA,CAAAA,CAAM,iBAAkB,CAAA,CAC5E,GAAIA,CAAAA,CAAM,WAAA,EAAe,CAAE,WAAA,CAAaA,CAAAA,CAAM,WAAY,CAAA,CAC1D,GAAIA,EAAM,GAAA,EAAO,CAAE,IAAKA,CAAAA,CAAM,GAAI,EAClC,GAAIA,CAAAA,CAAM,YAAc,CAAE,UAAA,CAAYA,CAAAA,CAAM,UAAW,EACvD,GAAIA,CAAAA,CAAM,cAAgB,CAAE,YAAA,CAAcA,EAAM,YAAa,CAAA,CAC7D,GAAIA,CAAAA,CAAM,aAAe,CAAE,WAAA,CAAaA,EAAM,WAAY,CAAA,CAC1D,GAAIA,CAAAA,CAAM,gBAAA,EAAoB,CAAE,gBAAA,CAAkBA,EAAM,gBAAiB,CAAA,CACzE,GAAIA,CAAAA,CAAM,gBAAA,EAAoB,CAAE,gBAAA,CAAkBA,CAAAA,CAAM,gBAAiB,CAAA,CACzE,GAAIA,CAAAA,CAAM,YAAA,EAAgB,CAAE,YAAA,CAAcA,CAAAA,CAAM,YAAa,CAAA,CAC7D,QAAA,CAAU,CAAC,CAACA,EAAM,QAAA,CAClB,GAAIA,EAAM,OAAA,EAAW,CAACE,EAAOF,CAAAA,CAAM,OAAO,CAAA,EAAK,CAAE,QAASA,CAAAA,CAAM,OAAQ,EACxE,GAAIC,CAAAA,EAAe,CAAE,YAAA,CAAcA,CAAY,CACnD,EACJ,CAEAT,CAAAA,GAAAA,CAAAA,CAAsB,IACtBA,CAAAA,CAAkB,UAAA,GAAlBA,EAAkB,UAAA,CAAe,IACjC,IAAMW,CAAAA,CAASlC,GAAc,cAAA,EAAe,CAI5C,IAHA0B,CAAAA,CAAAH,CAAAA,CAAkB,YAAW,EAAA,GAA7BG,CAAAA,CAA6B,EAAA,CAAOQ,CAAAA,CAAAA,CAAAA,CACpCP,IAAAJ,CAAAA,CAAkB,UAAA,EAAW,UAA7BI,GAAAA,CAA6B,OAAA,CAAYC,GAErCT,CAAAA,CAAe,CACftB,CAAAA,CAAI,sCAAsC,EAE1C,GAAM,CAAE,WAAAsC,CAAW,CAAA,CAAI,MAAM,OAAO,kCAAwB,CAAA,CAC5DpC,GAAAA,CAAcoC,EAAW,qBAAA,CACrBhB,CAAAA,CACAC,EACAG,CAAAA,CACA3B,CACJ,EACAC,CAAAA,CAAI,qCAAqC,EAEzC,IAAMuC,CAAAA,CAAW,YAAY,IAAM,CAC3B,OAAO,IAAA,CAAKjC,CAAe,EAAE,MAAA,CAAS,CAAA,CAAG,aAAA,CAAciC,CAAQ,EAC9DjC,CAAAA,CAAkBkC,CAAAA,CAAgB,0BAA2B,EAAE,EACxE,CAAA,CAAG,GAAI,EACX,CAEA,GAAIb,CAAAA,CAAgB,CAChB3B,EAAI,mCAAmC,CAAA,CAEvC,GAAM,CAAE,OAAA,CAAAyC,CAAQ,CAAA,CAAI,MAAM,OAAO,+BAAqB,EACtDrC,CAAAA,CAAWqC,CAAAA,CAAQ,mBAAmB,CAAE,WAAA,CAAAhB,EAAa,GAAGE,CAAe,EAAG5B,CAAM,CAAA,CAChFC,EAAI,kCAAkC,EAC1C,CAEAA,CAAAA,CAAI,gDAAgD,EACxD,CAAA,MAASb,EAAK,CACV,OAAA,CAAQ,KAAK,iCAAA,CAAmCA,CAAG,EACvD,CACJ,CAAA,CAyBMuD,CAAAA,CAAiBC,CAAAA,EAAoC,CACvD3C,CAAAA,CAAI,qCAAA,CAAuC2C,CAAU,CAAA,CAErD,GAAM,CAAE,OAAA,CAAAC,CAAAA,CAAS,GAAGC,CAAK,EAAIF,CAAAA,CACvBG,CAAAA,CAAgBF,GAAW3B,CAAAA,EAAM,CAEvC,GAAIf,GAAAA,CAAa,CACb,IAAM6C,CAAAA,CAAgC,CAAE,GAAGF,CAAK,EAC5CD,CAAAA,EAAW,CAACR,EAAOQ,CAAO,CAAA,GAAGG,CAAAA,CAAO,OAAA,CAAUH,GAC9CE,CAAAA,GACAC,CAAAA,CAAO,GAAKD,CAAAA,CACZC,CAAAA,CAAO,QAAUD,CAAAA,CAAAA,CAErB9C,CAAAA,CAAI,iDAAA,CAAmD+C,CAAM,EAC7D7C,GAAAA,CAAY,aAAA,CAAc6C,CAAM,EACpC,CAEA1C,EAAY,CACR,GAAGA,CAAAA,CACH,GAAG,OAAO,WAAA,CAAY,MAAA,CAAO,QAAQwC,CAAI,CAAA,CAAE,OAAO,CAAC,EAAGG,CAAC,CAAA,GAAMA,IAAM,MAAS,CAAC,EAC7E,GAAIJ,CAAAA,GAAY,QAAa,CAACR,CAAAA,CAAOQ,CAAO,CAAA,EAAK,CAAE,OAAA,CAAAA,CAAQ,CAC/D,CAAA,CAEA5C,CAAAA,CAAI,oCAAqCK,CAAS,EACtD,CAAA,CAEM4C,CAAAA,CAAmBC,GAAehD,GAAAA,EAAa,eAAA,CAAgBgD,CAAE,CAAA,EAAG,gBAAA,EAAkB,KAEtFV,CAAAA,CAAkB,CACpBU,CAAAA,CACAC,CAAAA,GACCjD,KAAa,eAAA,CAAgBgD,CAAAA,CAAcC,CAAY,CAAA,CAEtDC,CAAAA,CAAsB,SAAY,MAAMlD,GAAAA,EAAa,WAAU,CAC/DmD,CAAAA,CAAeC,GAAgBpD,GAAAA,EAAa,IAAA,CAAKoD,CAAG,CAAA,CACpDC,CAAAA,CAAUC,GAAiBtD,GAAAA,EAAa,MAAA,CAAOsD,CAAI,CAAA,CAEnDvC,EAAQ,IAAM,CAChB,IAAME,CAAAA,CAAShB,CAAAA,EAAc,WAAU,EAAK,EAAA,CAC5C,OAAOgB,CAAAA,EAAU,CAACiB,CAAAA,CAAOjB,CAAM,EAAIA,CAAAA,CAAS,EAChD,EA8RMsC,CAAAA,CAAoB,CACtB,UAAA,CAAApC,CAAAA,CACA,cAAAqB,CAAAA,CACA,aAAA,CA5NkB,CAACE,CAAAA,CAAkBxB,CAAAA,GAAiC,CACtE,IAAMsC,CAAAA,CAAiBd,GAAW3B,CAAAA,EAAM,CACxC,GAAI,CAACyC,CAAAA,CAAgB,CACjB1D,CAAAA,CAAI,qDAAgD,EACpD,MACJ,CAEAA,CAAAA,CAAI,wBAAA,CAA0B,CAAE,OAAA,CAAS0D,CAAAA,CAAgB,OAAAtC,CAAO,CAAC,EAGjE,IAAMuC,CAAAA,CAAeC,CAAAA,EAA4B,CAC7C,GAAI,CAACA,CAAAA,CAAG,OAAOA,CAAAA,CACf,GAAM,CAAE,KAAA,CAAAC,CAAAA,CAAO,GAAGC,CAAK,EAAIF,CAAAA,CAC3B,OAAO,CAAE,GAAGE,CAAAA,CAAM,GAAID,CAAAA,EAAS,CAAE,WAAA,CAAaE,CAAAA,CAAgBF,CAAK,CAAE,CAAG,CAC5E,CAAA,CAGMG,CAAAA,CAAuB5C,GAAQ,WAAA,GAAgB,MAAA,EAAaA,CAAAA,EAAQ,OAAA,GAAY,OAClF6C,CAAAA,CAAmBC,CAAAA,CACvB,GAAIF,CAAAA,CAAsB,CAEtB,GAAM,CAAE,WAAA,CAAAG,CAAAA,CAAa,OAAA,CAAAC,EAAS,GAAGC,CAAa,EAAIjD,CAAAA,CAClD6C,CAAAA,CAAoBN,EAAY,CAAE,GAAGU,CAAAA,CAAc,GAAGF,CAAY,CAAC,CAAA,CACnED,EAAgBP,CAAAA,CAAY,CAAE,GAAGU,CAAAA,CAAc,GAAGD,CAAQ,CAAC,EAC/D,MACIH,CAAAA,CAAoBN,CAAAA,CAAYvC,CAAM,CAAA,CACtC8C,CAAAA,CAAgBP,EAAYvC,CAAM,CAAA,CAIlCjB,CAAAA,GACIA,CAAAA,CAAa,iBACbH,CAAAA,CAAI,8CAAA,CAAgD,CAChD,OAAA,CAAS0D,CAAAA,CACT,OAAQO,CACZ,CAAC,CAAA,CACD9D,CAAAA,CAAa,cAAcuD,CAAAA,CAAgBO,CAAiB,GAEvDzD,GAAAA,CAAwB,IAAA,CAAK8D,GAAQA,CAAAA,CAAK,MAAA,GAAWZ,CAAc,CAAA,GACpE1D,EAAI,0EAAA,CAAuE,CACvE,QAAS0D,CACb,CAAC,EACDlD,GAAAA,CAAwB,IAAA,CAAK,CAAE,MAAA,CAAQkD,CAAAA,CAAgB,OAAQO,CAAkB,CAAC,IAM1F7D,CAAAA,EAAU,eAAA,GACVJ,EAAI,0CAAA,CAA4C,CAAE,OAAA,CAAS0D,CAAAA,CAAgB,OAAQQ,CAAc,CAAC,EAClG9D,CAAAA,CAAS,aAAA,CAAcsD,EAAgBQ,CAAuC,CAAA,EAEtF,CAAA,CAyKI,wBAAA,CArE6B,CAAC,CAC9B,OAAA,CAAAtB,EACA,KAAA,CAAAiB,CAAAA,CACA,SAAAU,CAAAA,CACA,oBAAA,CAAAC,CACJ,CAAA,GAKY,CACRxE,CAAAA,CAAI,mCAAA,CAAqC,CAAE,OAAA,CAAA4C,CAAQ,CAAC,CAAA,CAChDxC,CAAAA,EAAU,iBACVJ,CAAAA,CAAI,qEAAA,CAAuE,CAAE,OAAA,CAAA4C,CAAQ,CAAC,CAAA,CACtFxC,CAAAA,CAAS,yBAAyB,CAAE,OAAA,CAAAwC,CAAAA,CAAS,KAAA,CAAAiB,EAAO,QAAA,CAAAU,CAAAA,CAAU,qBAAAC,CAAqB,CAAC,GAEpFxE,CAAAA,CAAI,mEAA8D,EAE1E,CAAA,CAoDI,gBAAAiD,CAAAA,CACA,eAAA,CAAAT,EACA,mBAAA,CAAAY,CAAAA,CACA,YAAAC,CAAAA,CACA,MAAA,CAAAE,CAAAA,CACA,KAAA,CAAAtC,EACA,cAAA,CAvSmB,IAAMd,GAAc,cAAA,EAAe,EAAK,GAwS3D,UAAA,CArJe,CAACS,CAAAA,CAAe6D,CAAAA,GAAwC,CACvE,IAAMtD,CAAAA,CAASF,GAAM,CAErBjB,CAAAA,CAAI,sBAAuB,CAAE,KAAA,CAAAY,CAAAA,CAAO,cAAA,CAAA6D,EAAgB,MAAA,CAAAtD,CAAAA,CAAQ,UAAAd,CAAU,CAAC,EAEvE,IAAMqE,CAAAA,CAAgB,CAClB,GAAGrE,EACH,GAAGoE,CAAAA,CACH,GAAItD,CAAAA,EAAU,CAACd,EAAU,OAAA,EAAW,CAAE,OAAA,CAASc,CAAO,CAC1D,CAAA,CAKA,GAHAnB,EAAI,4BAAA,CAA8B,CAAE,MAAAY,CAAAA,CAAO,aAAA,CAAA8D,CAAc,CAAC,CAAA,CAGtD,EADgB,EAAE9D,CAAAA,IAASN,IAAoBA,CAAAA,CAAgBM,CAAe,GAChE,CACdZ,CAAAA,CAAI,+DAAA,CAA4D,CAAE,MAAAY,CAAM,CAAC,EACzE,MACJ,CAGA,IAAM+D,CAAAA,CAA4BxE,CAAAA,EAAc,eAAA,CAChD,GAAI,CAAC,SAAA,CAAU,MAAA,EAAU,CAACwE,CAAAA,CACjBA,CAAAA,EAID3E,EAAI,qDAAA,CAAkD,CAAE,KAAA,CAAAY,CAAM,CAAC,CAAA,CAC/DL,CAAAA,CAAoB,KAAK,CAAE,KAAA,CAAAK,EAAO,OAAA,CAAS8D,CAAc,CAAC,CAAA,GAJ1D1E,CAAAA,CAAI,gFAA4E,CAAE,KAAA,CAAAY,CAAM,CAAC,CAAA,CACzF9B,EAAoB8B,CAAAA,CAAiB8D,CAAa,CAAA,CAAA,CAAA,KAKnD,CAECnE,EAAoB,MAAA,CAAS,CAAA,GAC7BP,EAAI,CAAA,sBAAA,EAAyBO,CAAAA,CAAoB,MAAM,CAAA,uCAAA,CAAyC,CAAA,CAChGA,CAAAA,CAAoB,OAAA,CAAQqE,GAAS,CACjC,IAAMC,EAAwB/D,GAAAA,CAAY8D,CAAAA,CAAM,OAAO,CAAA,CACvDzE,CAAAA,EAAc,KAAA,CAAMyE,CAAAA,CAAM,MAAOC,CAAqB,EAC1D,CAAC,CAAA,CACDtE,CAAAA,CAAsB,EAAC,CAAA,CAI3B,IAAMuE,EAAkBhE,GAAAA,CAAY4D,CAAa,EACjD1E,CAAAA,CAAI,2CAAA,CAA6C,CAAE,KAAA,CAAAY,CAAAA,CAAO,QAASkE,CAAgB,CAAC,CAAA,CACpF3E,CAAAA,EAAc,MAAMS,CAAAA,CAAOkE,CAAe,EAC9C,CAGA,GAAI1E,GAAU,eAAA,CAAiB,CAC3B,IAAM2E,CAAAA,CAAkBjE,IAAYkE,CAAAA,CAAcN,CAAa,CAAC,CAAA,CAChE1E,CAAAA,CAAI,wCAAyC,CAAE,KAAA,CAAAY,CAAAA,CAAO,OAAA,CAASmE,CAAgB,CAAC,CAAA,CAChF3E,EAAS,OAAA,CAAQQ,CAAAA,CAAiBmE,CAAe,EACrD,CACJ,CAAA,CAkGI,YAAA,CA1DiB,KAAO,CAAE,EAAA,CAAI7E,IAAa,QAAA,CAAUC,CAAAA,CAAc,QAASC,CAAS,CAAA,CAAA,CA2DrF,QAAA,CAvRa,CAAC6E,EAAsBC,CAAAA,CAAW,WAAA,CAAalG,IAAyC,CACrG,IAAMmC,EAASF,CAAAA,EAAM,CAErBjB,CAAAA,CAAI,mBAAA,CAAqB,CAAE,YAAA,CAAAiF,CAAAA,CAAc,SAAAC,CAAAA,CAAU,UAAA,CAAAlG,EAAY,MAAA,CAAAmC,CAAO,CAAC,CAAA,CAGnEhB,GAAc,eAAA,EACdH,CAAAA,CAAI,8CAA+C,CAAE,YAAA,CAAAiF,EAAc,QAAA,CAAAC,CAAS,CAAC,CAAA,CAC7E/E,CAAAA,CAAa,SAAS8E,CAAAA,CAAcC,CAAAA,CAAU/D,EAAQnC,CAAU,CAAA,GAEhEgB,EAAI,iFAAA,CAA8E,CAAE,YAAA,CAAAiF,CAAa,CAAC,CAAA,CAClG7F,CAAAA,CAAuB6F,EAAc,CAAE,QAAA,CAAAC,EAAU,GAAGlG,CAAW,CAAC,CAAA,EAKxE,EAwQI,KAAA,CAlLU,IAAM,CAChBgB,CAAAA,CAAI,iCAAiC,EAEjCG,CAAAA,EAAc,eAAA,GACdH,CAAAA,CAAI,+BAA+B,EACnCG,CAAAA,CAAa,KAAA,IAEbC,CAAAA,EAAU,eAAA,GACVJ,EAAI,2BAA2B,CAAA,CAC/BI,EAAS,KAAA,EAAM,EAEvB,EAwKI,uBAAA,CAvD6BkD,CAAAA,EAAqClD,GAAU,gBAAA,CAAiBkD,CAAG,EAwDhG,qBAAA,CAjD2BA,CAAAA,EAA8ClD,CAAAA,EAAU,cAAA,CAAekD,CAAG,CAAA,CAkDrG,4BAAA,CA3CAA,GAEAlD,CAAAA,EAAU,qBAAA,CAAsBkD,CAAG,CAAA,CA0CnC,kBAAA,CApCuB,IAAwClD,CAAAA,EAAU,aAAY,EAAK,GAqC1F,qBAAA,CA7BA+E,CAAAA,EACe/E,GAAU,cAAA,CAAe+E,CAAQ,CAAA,GAAM,IAAM,CAAC,CAAA,CAAA,CA6B7D,yBAAA,CAvB8B,IAAY/E,CAAAA,EAAU,kBAAA,EAwBxD,CAAA,CAEA,OAAI,OAAO,MAAA,CAAW,GAAA,GAClB,OAAO,iBAAA,CAAoBqD,CAAAA,CAAAA,CAGxBA,CACX,CAEO,IAAM2B,EAAYvF,CAAAA","file":"index.mjs","sourcesContent":["export const CACHE_STORAGE_EVENTS = 'cached_analytics_events'\nexport const CACHE_STORAGE_PAGES = 'cached_analytics_page_views'\n\nexport type CachedEvent = {\n    name: string\n    properties: Record<string, unknown>\n    timestamp: number\n}\n\nexport type CachedPageView = {\n    name: string\n    properties?: Record<string, unknown>\n    timestamp: number\n}\n\nexport const cacheEventToStorage = (eventName: string, properties: Record<string, unknown>): void => {\n    try {\n        const existingCache = localStorage.getItem(CACHE_STORAGE_EVENTS)\n        const events: CachedEvent[] = existingCache ? JSON.parse(existingCache) : []\n        events.push({ name: eventName, properties, timestamp: Date.now() })\n        localStorage.setItem(CACHE_STORAGE_EVENTS, JSON.stringify(events))\n    } catch (err) {\n        console.warn('Analytics: Failed to cache event', err)\n    }\n}\n\nexport const cachePageViewToStorage = (pageName: string, properties?: Record<string, unknown>): void => {\n    try {\n        const existingCache = localStorage.getItem(CACHE_STORAGE_PAGES)\n        const pages: CachedPageView[] = existingCache ? JSON.parse(existingCache) : []\n        pages.push({ name: pageName, properties, timestamp: Date.now() })\n        localStorage.setItem(CACHE_STORAGE_PAGES, JSON.stringify(pages))\n    } catch (err) {\n        console.warn('Analytics: Failed to cache page view', err)\n    }\n}\n\nexport const getCachedEvents = (): CachedEvent[] => {\n    try {\n        const storedEventsString = localStorage.getItem(CACHE_STORAGE_EVENTS)\n        if (storedEventsString) {\n            const events = JSON.parse(storedEventsString)\n            return Array.isArray(events) ? events : []\n        }\n    } catch (err) {\n        console.warn('Analytics: Failed to get cached events', err)\n    }\n    return []\n}\n\nexport const getCachedPageViews = (): CachedPageView[] => {\n    try {\n        const storedPagesString = localStorage.getItem(CACHE_STORAGE_PAGES)\n        if (storedPagesString) {\n            const pages = JSON.parse(storedPagesString)\n            return Array.isArray(pages) ? pages : []\n        }\n    } catch (err) {\n        console.warn('Analytics: Failed to get cached pages', err)\n    }\n    return []\n}\n\nexport const clearCachedEvents = (): void => {\n    try {\n        localStorage.removeItem(CACHE_STORAGE_EVENTS)\n    } catch (err) {\n        console.warn('Analytics: Failed to clear cached events', err)\n    }\n}\n\nexport const clearCachedPageViews = (): void => {\n    try {\n        localStorage.removeItem(CACHE_STORAGE_PAGES)\n    } catch (err) {\n        console.warn('Analytics: Failed to clear cached page views', err)\n    }\n}\n","import { RudderStack } from './providers/rudderstack'\nimport {\n    cacheEventToStorage,\n    cachePageViewToStorage,\n    getCachedEvents,\n    getCachedPageViews,\n    clearCachedEvents,\n    clearCachedPageViews,\n} from './utils/storage'\nimport { isUUID, getCountry, cleanObject, flattenObject, createLogger, isInternalEmail } from './utils/helpers'\n// Optional Growthbook types - only import if using Growthbook\nimport type { Growthbook, GrowthbookConfigs } from './providers/growthbook'\nimport type { TGrowthbookAttributes, TGrowthbookOptions } from './providers/growthbookTypes'\n\n// Optional Posthog types - only import if using Posthog\nimport type { Posthog } from './providers/posthog'\nimport type { TPosthogIdentifyTraits, TPosthogOptions } from './providers/posthogTypes'\n\ndeclare global {\n    interface Window {\n        AnalyticsInstance: ReturnType<typeof createAnalyticsInstance>\n    }\n}\n\n/**\n * Configuration options for initializing the analytics instance\n */\ntype Options = {\n    /** GrowthBook client API key for A/B testing and feature flags */\n    growthbookKey?: string\n    /** GrowthBook decryption key for encrypted feature payloads */\n    growthbookDecryptionKey?: string\n    /** RudderStack write key for event tracking */\n    rudderstackKey?: string\n    /** App version attached to every event sent to RudderStack and PostHog */\n    app_version?: string\n    /** Additional configuration options for GrowthBook */\n    growthbookOptions?: TGrowthbookOptions\n    /** PostHog configuration options including API keys and settings */\n    posthogOptions?: TPosthogOptions\n    /** Enable debug logging — logs all analytics calls prefixed with [ANALYTIC] */\n    debug?: boolean\n}\n\n/**\n * Creates a unified analytics instance that integrates RudderStack and GrowthBook.\n *\n * This function provides a centralized interface for:\n * - Event tracking across multiple analytics platforms\n * - A/B testing and feature flag management via GrowthBook\n * - Offline event caching with automatic replay\n *\n * @param {Options} _options - Optional initialization configuration\n * @returns {Object} Analytics instance with methods for tracking, identification, and feature management\n *\n * @example\n * ```typescript\n * const analytics = createAnalyticsInstance();\n *\n * // Initialize with providers\n * await analytics.initialise({\n *   rudderstackKey: 'YOUR_RS_KEY',\n *   growthbookKey: 'YOUR_GB_KEY',\n *   growthbookDecryptionKey: 'YOUR_GB_DECRYPT_KEY'\n * });\n *\n * // Set user attributes\n * analytics.setAttributes({\n *   user_id: 'user123',\n *   country: 'US',\n *   user_language: 'en'\n * });\n *\n * // Track events\n * analytics.trackEvent('button_clicked', { button_name: 'signup' });\n *\n * // Track page views\n * analytics.pageView('/dashboard', 'Deriv App');\n * ```\n */\nexport function createAnalyticsInstance(_options?: Options) {\n    let _debug = _options?.debug ?? false\n\n    const log = createLogger('', () => _debug)\n\n    let _growthbook: Growthbook | undefined,\n        _rudderstack: RudderStack,\n        _posthog: Posthog | undefined,\n        core_data: Record<string, any> = {},\n        tracking_config: { [key: string]: boolean } = {},\n        offline_event_cache: Array<{ event: string; payload: Record<string, any> }> = [],\n        _pending_identify_calls: Array<{ userId: string; traits?: Record<string, any> }> = [],\n        _storage_cache_processed = false\n\n    const processStorageCache = () => {\n        if (_storage_cache_processed) return\n        if (!_rudderstack?.has_initialized) return\n\n        _storage_cache_processed = true\n\n        try {\n            const storedEvents = getCachedEvents()\n            if (storedEvents.length > 0) {\n                log(`processStorageCache | replaying ${storedEvents.length} cached event(s)`, storedEvents)\n                storedEvents.forEach(event => {\n                    const cleaned_properties = cleanObject(event.properties)\n                    _rudderstack?.track(event.name, cleaned_properties)\n                })\n                clearCachedEvents()\n            }\n\n            const storedPages = getCachedPageViews()\n            if (storedPages.length > 0) {\n                log(`processStorageCache | replaying ${storedPages.length} cached page view(s)`, storedPages)\n                storedPages.forEach(page => {\n                    _rudderstack?.pageView(page.name, 'Deriv App', getId(), page.properties)\n                })\n                clearCachedPageViews()\n            }\n        } catch (err) {\n            console.warn('Analytics: Failed to process storage cache', err)\n        }\n    }\n\n    const onSdkLoaded = () => {\n        log('onSdkLoaded | RudderStack SDK loaded')\n        processStorageCache()\n\n        if (_pending_identify_calls.length > 0) {\n            log(`onSdkLoaded | flushing ${_pending_identify_calls.length} pending identify call(s)`)\n        }\n        _pending_identify_calls.forEach(({ userId, traits }) => {\n            if (userId) {\n                _rudderstack?.identifyEvent(userId, traits)\n            }\n        })\n        _pending_identify_calls = []\n    }\n\n    /**\n     * Initializes the analytics instance with specified provider configurations.\n     * This method should be called before tracking any events.\n     *\n     * Features:\n     * - Lazy-loads providers (GrowthBook, PostHog) only when configured\n     * - Automatically fetches user's country for GrowthBook targeting\n     * - Processes any cached events from previous sessions\n     * - Sets up event tracking callback for GrowthBook experiments\n     *\n     * @param {Options} options - Configuration options for analytics providers\n     * @returns {Promise<void>} Resolves when initialization is complete\n     *\n     * @example\n     * ```typescript\n     * await analytics.initialise({\n     *   rudderstackKey: 'YOUR_RS_KEY',\n     *   growthbookKey: 'YOUR_GB_KEY',\n     *   growthbookDecryptionKey: 'YOUR_GB_DECRYPT_KEY',\n     *   posthogOptions: {\n     *     apiKey: 'YOUR_POSTHOG_API_KEY',\n     *     config: {\n     *       session_recording: {\n     *         recordCrossOriginIframes: true,\n     *         minimumDurationMilliseconds: 30000\n     *       }\n     *     }\n     *   }\n     * });\n     * ```\n     */\n    const initialise = async ({\n        growthbookKey,\n        growthbookDecryptionKey,\n        rudderstackKey,\n        app_version,\n        growthbookOptions,\n        posthogOptions,\n        debug,\n    }: Options) => {\n        if (debug !== undefined) _debug = debug\n\n        log('initialise | starting analytics initialization', {\n            rudderstack: !!rudderstackKey,\n            growthbook: !!growthbookKey,\n            posthog: !!posthogOptions,\n        })\n\n        try {\n            // Only fetch country if GrowthBook is enabled and country not provided\n            const country = growthbookOptions?.attributes?.country || (growthbookKey ? await getCountry() : undefined)\n\n            if (rudderstackKey) {\n                log('initialise | initializing RudderStack')\n                _rudderstack = RudderStack.getRudderStackInstance(rudderstackKey, onSdkLoaded, _debug, app_version)\n            }\n\n            if (growthbookOptions?.attributes && Object.keys(growthbookOptions.attributes).length > 0) {\n                const attrs = growthbookOptions.attributes\n                const anonymousId = _rudderstack?.getAnonymousId()\n\n                core_data = {\n                    ...core_data,\n                    country,\n                    ...(attrs.user_language && { user_language: attrs.user_language }),\n                    ...(attrs.account_type && { account_type: attrs.account_type }),\n                    ...(attrs.app_id && { app_id: attrs.app_id }),\n                    ...(attrs.residence_country && { residence_country: attrs.residence_country }),\n                    ...(attrs.device_type && { device_type: attrs.device_type }),\n                    ...(attrs.url && { url: attrs.url }),\n                    ...(attrs.email_hash && { email_hash: attrs.email_hash }),\n                    ...(attrs.network_type && { network_type: attrs.network_type }),\n                    ...(attrs.network_rtt && { network_rtt: attrs.network_rtt }),\n                    ...(attrs.network_downlink && { network_downlink: attrs.network_downlink }),\n                    ...(attrs.account_currency && { account_currency: attrs.account_currency }),\n                    ...(attrs.account_mode && { account_mode: attrs.account_mode }),\n                    loggedIn: !!attrs.loggedIn,\n                    ...(attrs.user_id && !isUUID(attrs.user_id) && { user_id: attrs.user_id }),\n                    ...(anonymousId && { anonymous_id: anonymousId }),\n                }\n            }\n\n            growthbookOptions ??= {}\n            growthbookOptions.attributes ??= {}\n            const anonId = _rudderstack?.getAnonymousId()\n            growthbookOptions.attributes.id ??= anonId\n            growthbookOptions.attributes.country ??= country\n\n            if (growthbookKey) {\n                log('initialise | initializing GrowthBook')\n                // Dynamically import Growthbook only when needed\n                const { Growthbook } = await import('./providers/growthbook')\n                _growthbook = Growthbook.getGrowthBookInstance(\n                    growthbookKey,\n                    growthbookDecryptionKey,\n                    growthbookOptions,\n                    _debug\n                )\n                log('initialise | GrowthBook initialized')\n\n                const interval = setInterval(() => {\n                    if (Object.keys(tracking_config).length > 0) clearInterval(interval)\n                    else tracking_config = getFeatureValue('tracking-buttons-config', {}) as { [key: string]: boolean }\n                }, 1000)\n            }\n\n            if (posthogOptions) {\n                log('initialise | initializing PostHog')\n                // Dynamically import Posthog only when needed\n                const { Posthog } = await import('./providers/posthog')\n                _posthog = Posthog.getPosthogInstance({ app_version, ...posthogOptions }, _debug)\n                log('initialise | PostHog initialized')\n            }\n\n            log('initialise | analytics initialization complete')\n        } catch (err) {\n            console.warn('Analytics: Failed to initialize', err)\n        }\n    }\n\n    /**\n     * Sets user and context attributes for analytics tracking and targeting.\n     * These attributes are automatically included in all subsequent events.\n     *\n     * Attributes are used for:\n     * - Event enrichment (added to all tracked events)\n     * - GrowthBook targeting (feature flags and A/B tests)\n     * - User segmentation across analytics platforms\n     *\n     * @param {TCoreAttributes} attributes - User and context attributes\n     *\n     * @example\n     * ```typescript\n     * analytics.setAttributes({\n     *   user_id: 'CR123456',\n     *   country: 'US',\n     *   user_language: 'en',\n     *   device_type: 'desktop',\n     *   account_type: 'real',\n     *   loggedIn: true\n     * });\n     * ```\n     */\n    const setAttributes = (attributes: Record<string, any>) => {\n        log('setAttributes | received attributes', attributes)\n\n        const { user_id, ...rest } = attributes\n        const user_identity = user_id ?? getId()\n\n        if (_growthbook) {\n            const config: TGrowthbookAttributes = { ...rest }\n            if (user_id && !isUUID(user_id)) config.user_id = user_id\n            if (user_identity) {\n                config.id = user_identity\n                config.user_id = user_identity\n            }\n            log('setAttributes | called GrowthBook setAttributes', config)\n            _growthbook.setAttributes(config)\n        }\n\n        core_data = {\n            ...core_data,\n            ...Object.fromEntries(Object.entries(rest).filter(([, v]) => v !== undefined)),\n            ...(user_id !== undefined && !isUUID(user_id) && { user_id }),\n        }\n\n        log('setAttributes | updated core_data', core_data)\n    }\n\n    const getFeatureState = (id: string) => _growthbook?.getFeatureState(id)?.experimentResult?.name\n\n    const getFeatureValue = <K extends keyof GrowthbookConfigs, V extends GrowthbookConfigs[K]>(\n        id: K,\n        defaultValue: V\n    ) => _growthbook?.getFeatureValue(id as string, defaultValue)\n\n    const getGrowthbookStatus = async () => await _growthbook?.getStatus()\n    const isFeatureOn = (key: string) => _growthbook?.isOn(key)\n    const setUrl = (href: string) => _growthbook?.setUrl(href)\n\n    const getId = () => {\n        const userId = _rudderstack?.getUserId() || ''\n        return userId && !isUUID(userId) ? userId : ''\n    }\n\n    const getAnonymousId = () => _rudderstack?.getAnonymousId() || ''\n\n    /**\n     * Tracks a page view event.\n     *\n     * Features:\n     * - Automatically includes user ID if available\n     * - Caches page views when offline or provider not initialized\n     *\n     * @param {string} current_page - The current page URL or path\n     * @param {string} [platform='Deriv App'] - The platform name\n     * @param {Record<string, unknown>} [properties] - Additional page properties\n     *\n     * @example\n     * ```typescript\n     * analytics.pageView('/dashboard');\n     * analytics.pageView('/trade', 'Deriv Trader', { section: 'multipliers' });\n     * ```\n     */\n    const pageView = (current_page: string, platform = 'Deriv App', properties?: Record<string, unknown>) => {\n        const userId = getId()\n\n        log('pageView | called', { current_page, platform, properties, userId })\n\n        // Handle RudderStack pageView independently\n        if (_rudderstack?.has_initialized) {\n            log('pageView | sending page view to RudderStack', { current_page, platform })\n            _rudderstack.pageView(current_page, platform, userId, properties)\n        } else {\n            log('pageView | RudderStack not initialized — caching page view to localStorage', { current_page })\n            cachePageViewToStorage(current_page, { platform, ...properties })\n        }\n\n        // PostHog handles page views automatically via autocapture\n        // No need to manually send page views to PostHog\n    }\n\n    /**\n     * Identifies a user across analytics platforms.\n     * This method should be called after user login or when user identity is known.\n     *\n     * Features:\n     * - Queues identify calls if provider not yet initialized\n     * - Allows custom traits for each provider or shared traits for both\n     * - Identifies user in PostHog if configured\n     *\n     * @param {string} [user_id] - The user ID to identify. If not provided, uses stored user ID\n     * @param {Record<string, any>} [traits] - Optional traits to send to both providers, or provider-specific traits\n     *\n     * @example\n     * ```typescript\n     * // Simple identify\n     * analytics.identifyEvent('CR123456');\n     *\n     * // Identify with same traits for both providers\n     * analytics.identifyEvent('CR123456', {\n     *   language: 'en',\n     *   country_of_residence: 'US'\n     * });\n     *\n     * // Identify with provider-specific traits\n     * analytics.identifyEvent('CR123456', {\n     *   rudderstack: { language: 'en', custom_field: 'value' },\n     *   posthog: { language: 'en', country_of_residence: 'US' }\n     * });\n     * ```\n     */\n    const identifyEvent = (user_id?: string, traits?: Record<string, any>) => {\n        const stored_user_id = user_id || getId()\n        if (!stored_user_id) {\n            log('identifyEvent | skipped — no user_id available')\n            return\n        }\n\n        log('identifyEvent | called', { user_id: stored_user_id, traits })\n\n        // Strip PII: replace raw email with is_internal flag\n        const sanitizePII = (t?: Record<string, any>) => {\n            if (!t) return t\n            const { email, ...safe } = t\n            return { ...safe, ...(email && { is_internal: isInternalEmail(email) }) }\n        }\n\n        // Check if traits has provider-specific structure\n        const hasProviderStructure = traits?.rudderstack !== undefined || traits?.posthog !== undefined\n        let rudderstackTraits, posthogTraits\n        if (hasProviderStructure) {\n            // Merge shared top-level props with provider-specific ones (provider-specific wins on conflict)\n            const { rudderstack, posthog, ...sharedTraits } = traits as any\n            rudderstackTraits = sanitizePII({ ...sharedTraits, ...rudderstack })\n            posthogTraits = sanitizePII({ ...sharedTraits, ...posthog })\n        } else {\n            rudderstackTraits = sanitizePII(traits)\n            posthogTraits = sanitizePII(traits)\n        }\n\n        // Handle RudderStack identification independently\n        if (_rudderstack) {\n            if (_rudderstack.has_initialized) {\n                log('identifyEvent | calling RudderStack identify', {\n                    user_id: stored_user_id,\n                    traits: rudderstackTraits,\n                })\n                _rudderstack.identifyEvent(stored_user_id, rudderstackTraits)\n            } else {\n                if (!_pending_identify_calls.some(call => call.userId === stored_user_id)) {\n                    log('identifyEvent | RudderStack not initialized — queuing identify call', {\n                        user_id: stored_user_id,\n                    })\n                    _pending_identify_calls.push({ userId: stored_user_id, traits: rudderstackTraits })\n                }\n            }\n        }\n\n        // Handle PostHog identification independently\n        if (_posthog?.has_initialized) {\n            log('identifyEvent | calling PostHog identify', { user_id: stored_user_id, traits: posthogTraits })\n            _posthog.identifyEvent(stored_user_id, posthogTraits as TPosthogIdentifyTraits)\n        }\n    }\n\n    const reset = () => {\n        log('reset | resetting all providers')\n        // Reset each provider independently\n        if (_rudderstack?.has_initialized) {\n            log('reset | resetting RudderStack')\n            _rudderstack.reset()\n        }\n        if (_posthog?.has_initialized) {\n            log('reset | resetting PostHog')\n            _posthog.reset()\n        }\n    }\n\n    /**\n     * Tracks a custom event with associated data.\n     *\n     * Features:\n     * - Automatically enriches events with core attributes\n     * - RudderStack: Caches events when offline or not initialized\n     * - PostHog: Sends immediately if initialized (has built-in caching)\n     * - Respects feature flag configurations\n     * - Each provider works independently - one failing won't affect the other\n     *\n     * @param {string} event - The event name to track\n     * @param {Record<string, any>} analytics_data - The event data payload\n     */\n    const trackEvent = (event: string, analytics_data: Record<string, any>) => {\n        const userId = getId()\n\n        log('trackEvent | called', { event, analytics_data, userId, core_data })\n\n        const final_payload = {\n            ...core_data,\n            ...analytics_data,\n            ...(userId && !core_data.user_id && { user_id: userId }),\n        }\n\n        log('trackEvent | built payload', { event, final_payload })\n\n        const shouldTrack = !(event in tracking_config) || tracking_config[event as string]\n        if (!shouldTrack) {\n            log('trackEvent | skipped — event disabled by tracking_config', { event })\n            return\n        }\n\n        // Handle RudderStack independently\n        const hasRudderstackInitialized = _rudderstack?.has_initialized\n        if (!navigator.onLine || !hasRudderstackInitialized) {\n            if (!hasRudderstackInitialized) {\n                log('trackEvent | RudderStack not initialized — caching event to localStorage', { event })\n                cacheEventToStorage(event as string, final_payload)\n            } else {\n                log('trackEvent | offline — caching event to memory', { event })\n                offline_event_cache.push({ event, payload: final_payload })\n            }\n        } else {\n            // Send cached events to RudderStack\n            if (offline_event_cache.length > 0) {\n                log(`trackEvent | flushing ${offline_event_cache.length} offline cached event(s) to RudderStack`)\n                offline_event_cache.forEach(cache => {\n                    const cleaned_cache_payload = cleanObject(cache.payload)\n                    _rudderstack?.track(cache.event, cleaned_cache_payload)\n                })\n                offline_event_cache = []\n            }\n\n            // Send current event to RudderStack\n            const cleaned_payload = cleanObject(final_payload)\n            log('trackEvent | sending event to RudderStack', { event, payload: cleaned_payload })\n            _rudderstack?.track(event, cleaned_payload)\n        }\n\n        // Handle PostHog independently - send immediately if initialized\n        if (_posthog?.has_initialized) {\n            const posthog_payload = cleanObject(flattenObject(final_payload))\n            log('trackEvent | sending event to PostHog', { event, payload: posthog_payload })\n            _posthog.capture(event as string, posthog_payload)\n        }\n    }\n\n    /**\n     * Ensures client_id is set in PostHog stored person properties.\n     * Call this when the user ID is available and PostHog is loaded.\n     * Useful for backfilling client_id for users identified in previous sessions.\n     * No-op if client_id is already present or PostHog is not initialized.\n     *\n     * @param params.user_id - The user ID to use as client_id\n     * @param params.email - The user's email, used to determine is_internal\n     * @param params.language - The user's language (BCP 47 tag, e.g. \"en-GB\")\n     * @param params.country_of_residence - The user's country of residence\n     *\n     * @example\n     * ```typescript\n     * if (window.posthog?.__loaded && userId) {\n     *     analytics.backfillPersonProperties({ user_id: userId, email, language, country_of_residence })\n     * }\n     * ```\n     */\n    const backfillPersonProperties = ({\n        user_id,\n        email,\n        language,\n        country_of_residence,\n    }: {\n        user_id: string\n        email?: string\n        language?: string\n        country_of_residence?: string\n    }): void => {\n        log('backfillPersonProperties | called', { user_id })\n        if (_posthog?.has_initialized) {\n            log('backfillPersonProperties | backfilling person properties in PostHog', { user_id })\n            _posthog.backfillPersonProperties({ user_id, email, language, country_of_residence })\n        } else {\n            log('backfillPersonProperties | skipped — PostHog not initialized')\n        }\n    }\n\n    const getInstances = () => ({ ab: _growthbook, tracking: _rudderstack, posthog: _posthog })\n\n    /**\n     * Check whether a PostHog feature flag is enabled for the current user.\n     * Returns undefined if PostHog is not initialized.\n     */\n    const isPosthogFeatureEnabled = (key: string): boolean | undefined => _posthog?.isFeatureEnabled(key)\n\n    /**\n     * Get the value of a PostHog feature flag.\n     * Returns a string variant for multivariate flags, true/false for boolean flags,\n     * or undefined if the flag does not exist or PostHog is not initialized.\n     */\n    const getPosthogFeatureFlag = (key: string): string | boolean | undefined => _posthog?.getFeatureFlag(key)\n\n    /**\n     * Get the JSON payload attached to a PostHog feature flag.\n     * Returns undefined if the flag has no payload or PostHog is not initialized.\n     */\n    const getPosthogFeatureFlagPayload = (\n        key: string\n    ): string | number | boolean | null | Record<string, unknown> | unknown[] | undefined =>\n        _posthog?.getFeatureFlagPayload(key)\n\n    /**\n     * Get all currently active PostHog feature flags and their values.\n     * Returns an empty object if PostHog is not initialized.\n     */\n    const getPosthogAllFlags = (): Record<string, string | boolean> => _posthog?.getAllFlags() ?? {}\n\n    /**\n     * Subscribe to PostHog feature flag changes.\n     * The callback fires immediately with current flags and again whenever flags are reloaded.\n     * Returns an unsubscribe function — call it to stop listening.\n     */\n    const onPosthogFeatureFlags = (\n        callback: (flags: string[], variants: Record<string, string | boolean>) => void\n    ): (() => void) => _posthog?.onFeatureFlags(callback) ?? (() => {})\n\n    /**\n     * Force PostHog to reload feature flags from the server.\n     * Useful after attribute/identity changes that may affect flag targeting.\n     */\n    const reloadPosthogFeatureFlags = (): void => _posthog?.reloadFeatureFlags()\n\n    const AnalyticsInstance = {\n        initialise,\n        setAttributes,\n        identifyEvent,\n        backfillPersonProperties,\n        getFeatureState,\n        getFeatureValue,\n        getGrowthbookStatus,\n        isFeatureOn,\n        setUrl,\n        getId,\n        getAnonymousId,\n        trackEvent,\n        getInstances,\n        pageView,\n        reset,\n        isPosthogFeatureEnabled,\n        getPosthogFeatureFlag,\n        getPosthogFeatureFlagPayload,\n        getPosthogAllFlags,\n        onPosthogFeatureFlags,\n        reloadPosthogFeatureFlags,\n    }\n\n    if (typeof window !== 'undefined') {\n        window.AnalyticsInstance = AnalyticsInstance\n    }\n\n    return AnalyticsInstance\n}\n\nexport const Analytics = createAnalyticsInstance()\n"]}