@deriv-com/analytics 1.38.8 → 1.38.9
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/README.md +38 -8
- package/dist/browser/analytics.bundle.global.js +12 -12
- package/dist/browser/analytics.bundle.global.js.map +1 -1
- package/dist/browser/analytics.esm.mjs +1 -7
- package/dist/browser/analytics.esm.mjs.map +1 -1
- package/dist/chunk-7CT4XR74.mjs +3 -0
- package/dist/chunk-7CT4XR74.mjs.map +1 -0
- package/dist/chunk-BVGYK54Z.js +4 -0
- package/dist/chunk-BVGYK54Z.js.map +1 -0
- package/dist/chunk-D2MKQCJB.mjs +3 -0
- package/dist/chunk-D2MKQCJB.mjs.map +1 -0
- package/dist/chunk-FE5YWK6A.js +3 -0
- package/dist/chunk-FE5YWK6A.js.map +1 -0
- package/dist/chunk-ID2GN2PS.mjs +4 -0
- package/dist/chunk-ID2GN2PS.mjs.map +1 -0
- package/dist/chunk-ILN7DKKL.js +3 -0
- package/dist/chunk-ILN7DKKL.js.map +1 -0
- package/dist/chunk-OB6HH25Z.mjs +9 -0
- package/dist/chunk-OB6HH25Z.mjs.map +1 -0
- package/dist/chunk-YGU4ZMIH.mjs +14 -0
- package/dist/chunk-YGU4ZMIH.mjs.map +1 -0
- package/dist/growthbook-3K6VUME4.mjs +3 -0
- package/dist/growthbook-3K6VUME4.mjs.map +1 -0
- package/dist/index.d.mts +9 -5
- package/dist/index.d.ts +9 -5
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -3
- package/dist/index.mjs.map +1 -1
- package/dist/metafile-cjs.json +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/metafile-iife.json +1 -1
- package/dist/posthog-ANAV4RFJ.mjs +6 -0
- package/dist/posthog-ANAV4RFJ.mjs.map +1 -0
- package/dist/{posthog-Df2P2mKj.d.mts → posthog-Ds4g1sJf.d.mts} +21 -7
- package/dist/{posthog-BXTVRi7y.d.ts → posthog-DvDj4azD.d.ts} +21 -7
- package/dist/providers/growthbook/index.d.mts +5 -3
- package/dist/providers/growthbook/index.d.ts +5 -3
- package/dist/providers/growthbook/index.js +2 -2
- package/dist/providers/growthbook/index.js.map +1 -1
- package/dist/providers/growthbook/index.mjs +2 -2
- package/dist/providers/growthbook/index.mjs.map +1 -1
- package/dist/providers/posthog/index.d.mts +1 -1
- package/dist/providers/posthog/index.d.ts +1 -1
- package/dist/providers/posthog/index.js +2 -2
- package/dist/providers/posthog/index.js.map +1 -1
- package/dist/providers/posthog/index.mjs +2 -2
- package/dist/providers/posthog/index.mjs.map +1 -1
- package/dist/providers/rudderstack/index.d.mts +5 -2
- package/dist/providers/rudderstack/index.d.ts +5 -2
- package/dist/providers/rudderstack/index.js +1 -1
- package/dist/providers/rudderstack/index.mjs +1 -1
- package/dist/utils/analytics-cache/index.d.mts +14 -5
- package/dist/utils/analytics-cache/index.d.ts +14 -5
- package/dist/utils/analytics-cache/index.js +1 -1
- package/dist/utils/analytics-cache/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-3LFZFQL4.mjs +0 -3
- package/dist/chunk-3LFZFQL4.mjs.map +0 -1
- package/dist/chunk-CAKVOFLO.js +0 -3
- package/dist/chunk-CAKVOFLO.js.map +0 -1
- package/dist/chunk-DNCZM4KN.mjs +0 -4
- package/dist/chunk-DNCZM4KN.mjs.map +0 -1
- package/dist/chunk-EMF3RT6E.mjs +0 -14
- package/dist/chunk-EMF3RT6E.mjs.map +0 -1
- package/dist/chunk-HQX3Z7PF.mjs +0 -3
- package/dist/chunk-HQX3Z7PF.mjs.map +0 -1
- package/dist/chunk-LKLVBL24.js +0 -3
- package/dist/chunk-LKLVBL24.js.map +0 -1
- package/dist/chunk-NOEKD4DT.js +0 -4
- package/dist/chunk-NOEKD4DT.js.map +0 -1
- package/dist/chunk-UDVSKE3Y.mjs +0 -3
- package/dist/chunk-UDVSKE3Y.mjs.map +0 -1
- package/dist/growthbook-NJGOOJH4.mjs +0 -3
- package/dist/growthbook-NJGOOJH4.mjs.map +0 -1
- package/dist/posthog-72HGN74H.mjs +0 -6
- package/dist/posthog-72HGN74H.mjs.map +0 -1
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/* @deriv-com/analytics - Browser ESM Bundle (RudderStack + PostHog) - Built with tsup */
|
|
2
|
+
import{a as y}from"./chunk-YGU4ZMIH.mjs";import{b as B,i as m}from"./chunk-OB6HH25Z.mjs";import{GrowthBook as A}from"@growthbook/growthbook";var i=class i{constructor(t,e,o={},n=!1){this.analytics=new y;this.isLoaded=!1;this.status=void 0;this.debug=!1;this.log=m("[GrowthBook]",()=>this.debug);this.setAttributes=({id:t,country:e,user_language:o,device_language:n,device_type:s,utm_source:r,utm_medium:a,utm_campaign:d,is_authorised:h,url:u,domain:w,utm_content:l,residence_country:f,loggedIn:c,network_type:g,network_downlink:k,user_id:b,anonymous_id:p,account_mode:G})=>{let v={...this.GrowthBook.getAttributes(),id:t,...b!==void 0&&{user_id:b},...p!==void 0&&{anonymous_id:p},...e!==void 0&&{country:e},...f!==void 0&&{residence_country:f},...o!==void 0&&{user_language:o},...n!==void 0&&{device_language:n},...s!==void 0&&{device_type:s},...r!==void 0&&{utm_source:r},...a!==void 0&&{utm_medium:a},...d!==void 0&&{utm_campaign:d},...h!==void 0&&{is_authorised:h},...u!==void 0&&{url:u},...w!==void 0&&{domain:w},...l!==void 0&&{utm_content:l},...c!==void 0&&{loggedIn:c},...g!==void 0&&{network_type:g},...k!==void 0&&{network_downlink:k},...G!==void 0&&{account_mode:G}};this.log("setAttributes | updating GrowthBook attributes",v),this.GrowthBook.setAttributes(v)};this.getFeatureValue=(t,e)=>{let o=this.GrowthBook.getFeatureValue(t,e);return this.log("getFeatureValue",{key:t,value:o,defaultValue:e}),o};this.getStatus=async()=>(await this.waitForIsLoaded(),{isLoaded:this.isLoaded,status:this.status});this.getFeatureState=t=>{let e=this.GrowthBook.evalFeature(t);return this.log("getFeatureState",{id:t,result:e}),e};this.setUrl=t=>{this.log("setUrl",{href:t}),this.GrowthBook.setURL(t)};this.isOn=t=>{let e=this.GrowthBook.isOn(t);return this.log("isOn",{key:t,result:e}),e};this.init=async()=>{this.log("init | initializing GrowthBook SDK");let t=await this.GrowthBook.init({timeout:2e3,streaming:!0}).catch(()=>{});this.status=t,this.isLoaded=!0,this.log("init | GrowthBook SDK loaded",{status:t})};this.destroy=()=>{this.GrowthBook.destroy(),this.isLoaded=!1,this.status=void 0};this.debug=n;let s=typeof window<"u"?window.location.hostname.includes("localhost"):!1;this.GrowthBook=new A({apiHost:B,clientKey:t,decryptionKey:e,antiFlicker:!1,navigateDelay:0,antiFlickerTimeout:3500,subscribeToChanges:!0,enableDevMode:s,trackingCallback:(r,a)=>{this.log("trackingCallback | experiment viewed",{experiment_id:r.key,variation_id:a.variationId}),typeof window<"u"&&window.dataLayer&&window.dataLayer.push({event:"experiment_viewed",event_category:"experiment",rudder_anonymous_id:this.analytics.getAnonymousId(),experiment_id:r.key,variation_id:a.variationId}),this.analytics.track("experiment_viewed",{experimentId:r.key,variationId:a.variationId})},...o}),this.init()}reapplyExperiment(t){let e=t??(typeof window<"u"?window.location.href:"");this.GrowthBook.setURL(e)}waitForIsLoaded(t=1e4){return new Promise((e,o)=>{let n=Date.now(),s=setInterval(()=>{this.isLoaded?(clearInterval(s),e()):Date.now()-n>=t&&(clearInterval(s),o(new Error("GrowthBook initialization timeout")))},100)})}};i.getGrowthBookInstance=(t,e,o,n=!1)=>i._instance?(typeof window<"u"&&console.warn&&console.warn("GrowthBook instance already exists. Ignoring new initialization parameters."),i._instance):(i._instance=new i(t,e??"",o,n),i._instance),i.resetInstance=()=>{i._instance&&(i._instance.destroy(),i._instance=void 0)};var I=i;export{I as Growthbook};
|
|
3
|
+
//# sourceMappingURL=growthbook-3K6VUME4.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/growthbook.ts"],"sourcesContent":["import { GrowthBook, InitResponse } from '@growthbook/growthbook'\nimport { RudderAnalytics } from '@rudderstack/analytics-js'\nimport {\n TGrowthbookAttributes,\n TGrowthbookOptions,\n GrowthbookConfigs,\n TGrowthbookCoreAttributes,\n} from './growthbookTypes'\nimport { growthbookApi } from '../utils/urls'\nimport { createLogger } from '../utils/helpers'\n\nexport class Growthbook {\n analytics = new RudderAnalytics()\n GrowthBook: GrowthBook<GrowthbookConfigs>\n private static _instance: Growthbook\n isLoaded = false\n status: void | InitResponse = undefined\n private debug = false\n private log = createLogger('[GrowthBook]', () => this.debug)\n\n // we have to pass settings due the specific framework implementation\n constructor(clientKey: string, decryptionKey: string, growthbookOptions: TGrowthbookOptions = {}, debug = false) {\n this.debug = debug\n const isLocalhost = typeof window !== 'undefined' ? window.location.hostname.includes('localhost') : false\n\n this.GrowthBook = new GrowthBook<GrowthbookConfigs>({\n apiHost: growthbookApi,\n clientKey,\n decryptionKey,\n antiFlicker: false,\n navigateDelay: 0,\n antiFlickerTimeout: 3500,\n subscribeToChanges: true,\n enableDevMode: isLocalhost,\n trackingCallback: (experiment, result) => {\n this.log('trackingCallback | experiment viewed', {\n experiment_id: experiment.key,\n variation_id: result.variationId,\n })\n if (typeof window !== 'undefined' && window.dataLayer) {\n window.dataLayer.push({\n event: 'experiment_viewed',\n event_category: 'experiment',\n rudder_anonymous_id: this.analytics.getAnonymousId(),\n experiment_id: experiment.key,\n variation_id: result.variationId,\n })\n }\n this.analytics.track('experiment_viewed', {\n experimentId: experiment.key,\n variationId: result.variationId,\n })\n },\n ...growthbookOptions,\n })\n this.init()\n }\n\n // for make instance by singleton\n public static getGrowthBookInstance = (\n clientKey: string,\n decryptionKey?: string,\n growthbookOptions?: TGrowthbookOptions,\n debug = false\n ) => {\n if (!Growthbook._instance) {\n Growthbook._instance = new Growthbook(clientKey, decryptionKey ?? '', growthbookOptions, debug)\n return Growthbook._instance\n }\n\n // Warn if trying to reinitialize with different parameters\n if (typeof window !== 'undefined' && console.warn) {\n console.warn('GrowthBook instance already exists. Ignoring new initialization parameters.')\n }\n\n return Growthbook._instance\n }\n\n reapplyExperiment(url?: string) {\n const currentUrl = url ?? (typeof window !== 'undefined' ? window.location.href : '')\n this.GrowthBook.setURL(currentUrl)\n }\n\n // Utility function to wait for isLoaded to become true\n private waitForIsLoaded(timeout = 10000): Promise<void> {\n return new Promise((resolve, reject) => {\n const startTime = Date.now()\n const checkInterval = setInterval(() => {\n if (this.isLoaded) {\n clearInterval(checkInterval)\n resolve()\n } else if (Date.now() - startTime >= timeout) {\n clearInterval(checkInterval)\n reject(new Error('GrowthBook initialization timeout'))\n }\n }, 100)\n })\n }\n\n setAttributes = ({\n id,\n country,\n user_language,\n device_language,\n device_type,\n utm_source,\n utm_medium,\n utm_campaign,\n is_authorised,\n url,\n domain,\n utm_content,\n residence_country,\n loggedIn,\n network_type,\n network_downlink,\n user_id,\n anonymous_id,\n account_mode,\n }: TGrowthbookAttributes) => {\n const currentAttributes = this.GrowthBook.getAttributes()\n const newAttributes = {\n ...currentAttributes,\n id,\n ...(user_id !== undefined && { user_id }),\n ...(anonymous_id !== undefined && { anonymous_id }),\n ...(country !== undefined && { country }),\n ...(residence_country !== undefined && { residence_country }),\n ...(user_language !== undefined && { user_language }),\n ...(device_language !== undefined && { device_language }),\n ...(device_type !== undefined && { device_type }),\n ...(utm_source !== undefined && { utm_source }),\n ...(utm_medium !== undefined && { utm_medium }),\n ...(utm_campaign !== undefined && { utm_campaign }),\n ...(is_authorised !== undefined && { is_authorised }),\n ...(url !== undefined && { url }),\n ...(domain !== undefined && { domain }),\n ...(utm_content !== undefined && { utm_content }),\n ...(loggedIn !== undefined && { loggedIn }),\n ...(network_type !== undefined && { network_type }),\n ...(network_downlink !== undefined && { network_downlink }),\n ...(account_mode !== undefined && { account_mode }),\n }\n this.log('setAttributes | updating GrowthBook attributes', newAttributes)\n this.GrowthBook.setAttributes(newAttributes)\n }\n getFeatureValue = <K extends keyof GrowthbookConfigs, V extends GrowthbookConfigs[K]>(key: K, defaultValue: V) => {\n const value = this.GrowthBook.getFeatureValue(key as string, defaultValue)\n this.log('getFeatureValue', { key, value, defaultValue })\n return value\n }\n getStatus = async (): Promise<{ isLoaded: boolean; status: void | InitResponse }> => {\n await this.waitForIsLoaded()\n\n return {\n isLoaded: this.isLoaded,\n status: this.status,\n }\n }\n getFeatureState = (id: string) => {\n const state = this.GrowthBook.evalFeature(id)\n this.log('getFeatureState', { id, result: state })\n return state\n }\n setUrl = (href: string) => {\n this.log('setUrl', { href })\n this.GrowthBook.setURL(href)\n }\n isOn = (key: string) => {\n const result = this.GrowthBook.isOn(key)\n this.log('isOn', { key, result })\n return result\n }\n\n init = async () => {\n this.log('init | initializing GrowthBook SDK')\n const status = await this.GrowthBook.init({ timeout: 2000, streaming: true }).catch(() => {\n // Silently handle initialization errors\n })\n\n this.status = status\n this.isLoaded = true\n this.log('init | GrowthBook SDK loaded', { status })\n }\n\n // Destroy the GrowthBook instance and reset singleton\n destroy = () => {\n this.GrowthBook.destroy()\n this.isLoaded = false\n this.status = undefined\n }\n\n // Reset the singleton instance (useful for testing)\n public static resetInstance = () => {\n if (Growthbook._instance) {\n Growthbook._instance.destroy()\n Growthbook._instance = undefined as any\n }\n }\n}\n\nexport type { GrowthbookConfigs, TGrowthbookAttributes, TGrowthbookOptions, TGrowthbookCoreAttributes }\n"],"mappings":"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","names":["GrowthBook","_Growthbook","clientKey","decryptionKey","growthbookOptions","debug","RudderAnalytics","createLogger","id","country","user_language","device_language","device_type","utm_source","utm_medium","utm_campaign","is_authorised","url","domain","utm_content","residence_country","loggedIn","network_type","network_downlink","user_id","anonymous_id","account_mode","newAttributes","key","defaultValue","value","state","href","result","status","isLocalhost","GrowthBook","growthbookApi","experiment","currentUrl","timeout","resolve","reject","startTime","checkInterval","Growthbook"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -3,7 +3,7 @@ import { RudderStack } from './providers/rudderstack/index.mjs';
|
|
|
3
3
|
import { T as TCoreAttributes, a as TAllEvents } from './types-DoMejCXv.mjs';
|
|
4
4
|
export { b as TEvents } from './types-DoMejCXv.mjs';
|
|
5
5
|
import { TGrowthbookOptions, GrowthbookConfigs, Growthbook } from './providers/growthbook/index.mjs';
|
|
6
|
-
import { T as TPosthogOptions, P as Posthog } from './posthog-
|
|
6
|
+
import { T as TPosthogOptions, P as Posthog } from './posthog-Ds4g1sJf.mjs';
|
|
7
7
|
export { cacheTrackEvents } from './utils/analytics-cache/index.mjs';
|
|
8
8
|
import '@rudderstack/analytics-js';
|
|
9
9
|
import 'posthog-js';
|
|
@@ -27,6 +27,8 @@ type Options = {
|
|
|
27
27
|
growthbookOptions?: TGrowthbookOptions;
|
|
28
28
|
/** PostHog configuration options including API keys and settings */
|
|
29
29
|
posthogOptions?: TPosthogOptions;
|
|
30
|
+
/** Enable debug logging — logs all analytics calls prefixed with [ANALYTIC] */
|
|
31
|
+
debug?: boolean;
|
|
30
32
|
};
|
|
31
33
|
/**
|
|
32
34
|
* Creates a unified analytics instance that integrates RudderStack and GrowthBook.
|
|
@@ -65,9 +67,10 @@ type Options = {
|
|
|
65
67
|
* ```
|
|
66
68
|
*/
|
|
67
69
|
declare function createAnalyticsInstance(_options?: Options): {
|
|
68
|
-
initialise: ({ growthbookKey, growthbookDecryptionKey, rudderstackKey, growthbookOptions, posthogOptions, }: Options) => Promise<void>;
|
|
70
|
+
initialise: ({ growthbookKey, growthbookDecryptionKey, rudderstackKey, growthbookOptions, posthogOptions, debug, }: Options) => Promise<void>;
|
|
69
71
|
setAttributes: ({ country, user_language, device_language, device_type, account_type, user_id, anonymous_id, app_id, utm_source, utm_medium, utm_campaign, is_authorised, residence_country, url, domain, geo_location, loggedIn, network_downlink, network_rtt, network_type, account_currency, account_mode, }: TCoreAttributes) => void;
|
|
70
72
|
identifyEvent: (user_id?: string, traits?: Record<string, any>) => void;
|
|
73
|
+
backfillPersonProperties: (user_id: string, email?: string) => void;
|
|
71
74
|
getFeatureState: (id: string) => string | undefined;
|
|
72
75
|
getFeatureValue: <K extends keyof GrowthbookConfigs, V extends GrowthbookConfigs[K]>(id: K, defaultValue: V) => _growthbook_growthbook.WidenPrimitives<V> | undefined;
|
|
73
76
|
getGrowthbookStatus: () => Promise<{
|
|
@@ -75,7 +78,7 @@ declare function createAnalyticsInstance(_options?: Options): {
|
|
|
75
78
|
status: void | _growthbook_growthbook.InitResponse;
|
|
76
79
|
} | undefined>;
|
|
77
80
|
isFeatureOn: (key: string) => boolean | undefined;
|
|
78
|
-
setUrl: (href: string) =>
|
|
81
|
+
setUrl: (href: string) => void | undefined;
|
|
79
82
|
getId: () => string;
|
|
80
83
|
getAnonymousId: () => string;
|
|
81
84
|
trackEvent: <T extends keyof TAllEvents>(event: T, analytics_data: TAllEvents[T]) => void;
|
|
@@ -88,9 +91,10 @@ declare function createAnalyticsInstance(_options?: Options): {
|
|
|
88
91
|
reset: () => void;
|
|
89
92
|
};
|
|
90
93
|
declare const Analytics: {
|
|
91
|
-
initialise: ({ growthbookKey, growthbookDecryptionKey, rudderstackKey, growthbookOptions, posthogOptions, }: Options) => Promise<void>;
|
|
94
|
+
initialise: ({ growthbookKey, growthbookDecryptionKey, rudderstackKey, growthbookOptions, posthogOptions, debug, }: Options) => Promise<void>;
|
|
92
95
|
setAttributes: ({ country, user_language, device_language, device_type, account_type, user_id, anonymous_id, app_id, utm_source, utm_medium, utm_campaign, is_authorised, residence_country, url, domain, geo_location, loggedIn, network_downlink, network_rtt, network_type, account_currency, account_mode, }: TCoreAttributes) => void;
|
|
93
96
|
identifyEvent: (user_id?: string, traits?: Record<string, any>) => void;
|
|
97
|
+
backfillPersonProperties: (user_id: string, email?: string) => void;
|
|
94
98
|
getFeatureState: (id: string) => string | undefined;
|
|
95
99
|
getFeatureValue: <K extends keyof GrowthbookConfigs, V extends GrowthbookConfigs[K]>(id: K, defaultValue: V) => _growthbook_growthbook.WidenPrimitives<V> | undefined;
|
|
96
100
|
getGrowthbookStatus: () => Promise<{
|
|
@@ -98,7 +102,7 @@ declare const Analytics: {
|
|
|
98
102
|
status: void | _growthbook_growthbook.InitResponse;
|
|
99
103
|
} | undefined>;
|
|
100
104
|
isFeatureOn: (key: string) => boolean | undefined;
|
|
101
|
-
setUrl: (href: string) =>
|
|
105
|
+
setUrl: (href: string) => void | undefined;
|
|
102
106
|
getId: () => string;
|
|
103
107
|
getAnonymousId: () => string;
|
|
104
108
|
trackEvent: <T extends keyof TAllEvents>(event: T, analytics_data: TAllEvents[T]) => void;
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { RudderStack } from './providers/rudderstack/index.js';
|
|
|
3
3
|
import { T as TCoreAttributes, a as TAllEvents } from './types-DoMejCXv.js';
|
|
4
4
|
export { b as TEvents } from './types-DoMejCXv.js';
|
|
5
5
|
import { TGrowthbookOptions, GrowthbookConfigs, Growthbook } from './providers/growthbook/index.js';
|
|
6
|
-
import { T as TPosthogOptions, P as Posthog } from './posthog-
|
|
6
|
+
import { T as TPosthogOptions, P as Posthog } from './posthog-DvDj4azD.js';
|
|
7
7
|
export { cacheTrackEvents } from './utils/analytics-cache/index.js';
|
|
8
8
|
import '@rudderstack/analytics-js';
|
|
9
9
|
import 'posthog-js';
|
|
@@ -27,6 +27,8 @@ type Options = {
|
|
|
27
27
|
growthbookOptions?: TGrowthbookOptions;
|
|
28
28
|
/** PostHog configuration options including API keys and settings */
|
|
29
29
|
posthogOptions?: TPosthogOptions;
|
|
30
|
+
/** Enable debug logging — logs all analytics calls prefixed with [ANALYTIC] */
|
|
31
|
+
debug?: boolean;
|
|
30
32
|
};
|
|
31
33
|
/**
|
|
32
34
|
* Creates a unified analytics instance that integrates RudderStack and GrowthBook.
|
|
@@ -65,9 +67,10 @@ type Options = {
|
|
|
65
67
|
* ```
|
|
66
68
|
*/
|
|
67
69
|
declare function createAnalyticsInstance(_options?: Options): {
|
|
68
|
-
initialise: ({ growthbookKey, growthbookDecryptionKey, rudderstackKey, growthbookOptions, posthogOptions, }: Options) => Promise<void>;
|
|
70
|
+
initialise: ({ growthbookKey, growthbookDecryptionKey, rudderstackKey, growthbookOptions, posthogOptions, debug, }: Options) => Promise<void>;
|
|
69
71
|
setAttributes: ({ country, user_language, device_language, device_type, account_type, user_id, anonymous_id, app_id, utm_source, utm_medium, utm_campaign, is_authorised, residence_country, url, domain, geo_location, loggedIn, network_downlink, network_rtt, network_type, account_currency, account_mode, }: TCoreAttributes) => void;
|
|
70
72
|
identifyEvent: (user_id?: string, traits?: Record<string, any>) => void;
|
|
73
|
+
backfillPersonProperties: (user_id: string, email?: string) => void;
|
|
71
74
|
getFeatureState: (id: string) => string | undefined;
|
|
72
75
|
getFeatureValue: <K extends keyof GrowthbookConfigs, V extends GrowthbookConfigs[K]>(id: K, defaultValue: V) => _growthbook_growthbook.WidenPrimitives<V> | undefined;
|
|
73
76
|
getGrowthbookStatus: () => Promise<{
|
|
@@ -75,7 +78,7 @@ declare function createAnalyticsInstance(_options?: Options): {
|
|
|
75
78
|
status: void | _growthbook_growthbook.InitResponse;
|
|
76
79
|
} | undefined>;
|
|
77
80
|
isFeatureOn: (key: string) => boolean | undefined;
|
|
78
|
-
setUrl: (href: string) =>
|
|
81
|
+
setUrl: (href: string) => void | undefined;
|
|
79
82
|
getId: () => string;
|
|
80
83
|
getAnonymousId: () => string;
|
|
81
84
|
trackEvent: <T extends keyof TAllEvents>(event: T, analytics_data: TAllEvents[T]) => void;
|
|
@@ -88,9 +91,10 @@ declare function createAnalyticsInstance(_options?: Options): {
|
|
|
88
91
|
reset: () => void;
|
|
89
92
|
};
|
|
90
93
|
declare const Analytics: {
|
|
91
|
-
initialise: ({ growthbookKey, growthbookDecryptionKey, rudderstackKey, growthbookOptions, posthogOptions, }: Options) => Promise<void>;
|
|
94
|
+
initialise: ({ growthbookKey, growthbookDecryptionKey, rudderstackKey, growthbookOptions, posthogOptions, debug, }: Options) => Promise<void>;
|
|
92
95
|
setAttributes: ({ country, user_language, device_language, device_type, account_type, user_id, anonymous_id, app_id, utm_source, utm_medium, utm_campaign, is_authorised, residence_country, url, domain, geo_location, loggedIn, network_downlink, network_rtt, network_type, account_currency, account_mode, }: TCoreAttributes) => void;
|
|
93
96
|
identifyEvent: (user_id?: string, traits?: Record<string, any>) => void;
|
|
97
|
+
backfillPersonProperties: (user_id: string, email?: string) => void;
|
|
94
98
|
getFeatureState: (id: string) => string | undefined;
|
|
95
99
|
getFeatureValue: <K extends keyof GrowthbookConfigs, V extends GrowthbookConfigs[K]>(id: K, defaultValue: V) => _growthbook_growthbook.WidenPrimitives<V> | undefined;
|
|
96
100
|
getGrowthbookStatus: () => Promise<{
|
|
@@ -98,7 +102,7 @@ declare const Analytics: {
|
|
|
98
102
|
status: void | _growthbook_growthbook.InitResponse;
|
|
99
103
|
} | undefined>;
|
|
100
104
|
isFeatureOn: (key: string) => boolean | undefined;
|
|
101
|
-
setUrl: (href: string) =>
|
|
105
|
+
setUrl: (href: string) => void | undefined;
|
|
102
106
|
getId: () => string;
|
|
103
107
|
getAnonymousId: () => string;
|
|
104
108
|
trackEvent: <T extends keyof TAllEvents>(event: T, analytics_data: TAllEvents[T]) => void;
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
'use strict';var
|
|
2
|
-
var
|
|
3
|
-
`).map(a=>a.split("=",2))).loc?.toLowerCase()||n||"":n||""}catch{return n||""}})(),b},k=n=>{if(n==null||typeof n!="object")return n;if(Array.isArray(n)){let t=n.map(k).filter(i=>i!=null);return t.length?t:void 0}let o={};return Object.entries(n).forEach(([t,i])=>{let a=k(i);a==null||a===""||typeof a=="object"&&!Array.isArray(a)&&Object.keys(a).length===0||Array.isArray(a)&&a.length===0||(o[t]=a);}),Object.keys(o).length?o:void 0},R=n=>{if(n==null||typeof n!="object"||Array.isArray(n))return n;let o={};return Object.entries(n).forEach(([t,i])=>{i&&typeof i=="object"&&!Array.isArray(i)?Object.assign(o,R(i)):o[t]=i;}),o};function ge(n){let o,t,i,a={},p={},v=[],C=[],G=false,Y=()=>{if(!G&&t?.has_initialized){G=true;try{let e=$();e.length>0&&(e.forEach(d=>{t?.track(d.name,d.properties);}),M());let c=q();c.length>0&&(c.forEach(d=>{t?.pageView(d.name,"Deriv App",h(),d.properties);}),Q());}catch(e){console.warn("Analytics: Failed to process cookie cache",e);}}},Z=()=>{Y(),C.forEach(({userId:e,traits:c})=>{e&&t?.identifyEvent(e,c);}),C=[];},ee=async({growthbookKey:e,growthbookDecryptionKey:c,rudderstackKey:d,growthbookOptions:s,posthogOptions:y})=>{var u,l;try{let f=s?.attributes?.country||(e?await X():void 0);if(d&&(t=chunkCAKVOFLO_js.a.getRudderStackInstance(d,Z)),s?.attributes&&Object.keys(s.attributes).length>0){let r=s.attributes,m=t?.getAnonymousId();a={...a,country:f,...r.user_language&&{user_language:r.user_language},...r.account_type&&{account_type:r.account_type},...r.app_id&&{app_id:r.app_id},...r.residence_country&&{residence_country:r.residence_country},...r.device_type&&{device_type:r.device_type},...r.url&&{url:r.url},...r.email_hash&&{email_hash:r.email_hash},...r.network_type&&{network_type:r.network_type},...r.network_rtt&&{network_rtt:r.network_rtt},...r.network_downlink&&{network_downlink:r.network_downlink},...r.account_currency&&{account_currency:r.account_currency},...r.account_mode&&{account_mode:r.account_mode},loggedIn:!!r.loggedIn,...r.user_id&&!w(r.user_id)&&{user_id:r.user_id},...m&&{anonymous_id:m}};}s??(s={}),s.attributes??(s.attributes={});let _=t?.getAnonymousId();if((u=s.attributes).id??(u.id=_),(l=s.attributes).country??(l.country=f),e){let{Growthbook:r}=await import('./providers/growthbook/index.js');o=r.getGrowthBookInstance(e,c,s);let m=setInterval(()=>{Object.keys(p).length>0?clearInterval(m):p=F("tracking-buttons-config",{});},1e3);}if(y){let{Posthog:r}=await import('./providers/posthog/index.js');i=r.getPosthogInstance(y);}}catch(f){console.warn("Analytics: Failed to initialize",f);}},te=({country:e,user_language:c,device_language:d,device_type:s,account_type:y,user_id:u,anonymous_id:l,app_id:f,utm_source:_,utm_medium:r,utm_campaign:m,is_authorised:le,residence_country:x,url:I,domain:fe,geo_location:D,loggedIn:P,network_downlink:N,network_rtt:j,network_type:J,account_currency:U,account_mode:K})=>{let O=u??h();if(o){let V={country:e,residence_country:x,user_language:c,device_language:d,device_type:s,utm_source:_,utm_medium:r,utm_campaign:m,is_authorised:le,url:I,domain:fe,loggedIn:P,...u&&!w(u)&&{user_id:u},anonymous_id:l};O&&(V.id=O,V.user_id=O),o.setAttributes(V);}a={...a,...e!==void 0&&{country:e},...D!==void 0&&{geo_location:D},...c!==void 0&&{user_language:c},...y!==void 0&&{account_type:y},...f!==void 0&&{app_id:f},...x!==void 0&&{residence_country:x},...s!==void 0&&{device_type:s},...I!==void 0&&{url:I},...P!==void 0&&{loggedIn:P},...N!==void 0&&{network_downlink:N},...j!==void 0&&{network_rtt:j},...J!==void 0&&{network_type:J},...u!==void 0&&!w(u)&&{user_id:u},...l!==void 0&&{anonymous_id:l},...U!==void 0&&{account_currency:U},...K!==void 0&&{account_mode:K}};},ne=e=>o?.getFeatureState(e)?.experimentResult?.name,F=(e,c)=>o?.getFeatureValue(e,c),oe=async()=>await o?.getStatus(),re=e=>o?.isOn(e),se=e=>o?.setUrl(e),h=()=>{let e=t?.getUserId()||"";return e&&!w(e)?e:""},ie=()=>t?.getAnonymousId()||"",ae=(e,c="Deriv App",d)=>{let s=h();t&&(t.has_initialized?t.pageView(e,c,s,d):W(e,{platform:c,...d}));},ce=(e,c)=>{let d=e||h();if(!d)return;let s=c?.rudderstack!==void 0||c?.posthog!==void 0,y=s?c?.rudderstack:c,u=s?c?.posthog:c;t&&(t.has_initialized?t.identifyEvent(d,y):C.some(l=>l.userId===d)||C.push({userId:d,traits:y})),i?.has_initialized&&i.identifyEvent(d,u);},de=()=>{t?.has_initialized&&t.reset(),i?.has_initialized&&i.reset();},ue=e=>"event_metadata"in e||"cta_information"in e||"error"in e,z={initialise:ee,setAttributes:te,identifyEvent:ce,getFeatureState:ne,getFeatureValue:F,getGrowthbookStatus:oe,isFeatureOn:re,setUrl:se,getId:h,getAnonymousId:ie,trackEvent:(e,c)=>{let d=h(),s={};if(ue(c)){let l=c;s={...l,event_metadata:{...a,...d&&!a.user_id&&{user_id:d},...l.event_metadata}};}else s={...a,...c,...d&&!a.user_id&&{user_id:d}};if(!(!(e in p)||p[e]))return;let u=t?.has_initialized;if(!navigator.onLine||!u)u?v.push({event:e,payload:s}):B(e,s);else {v.length>0&&(v.forEach(f=>{let _=k(f.payload);t?.track(f.event,_);}),v=[]);let l=k(s);t?.track(e,l);}if(i?.has_initialized){let l=R(s),f=k(l);i.capture(e,f);}},getInstances:()=>({ab:o,tracking:t,posthog:i}),pageView:ae,reset:de};return typeof window<"u"&&(window.AnalyticsInstance=z),z}var he=ge();Object.defineProperty(exports,"cacheTrackEvents",{enumerable:true,get:function(){return chunkLKLVBL24_js.a}});exports.Analytics=he;//# sourceMappingURL=index.js.map
|
|
1
|
+
'use strict';var chunkILN7DKKL_js=require('./chunk-ILN7DKKL.js'),chunkFE5YWK6A_js=require('./chunk-FE5YWK6A.js'),chunkBVGYK54Z_js=require('./chunk-BVGYK54Z.js'),k=require('js-cookie');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var k__default=/*#__PURE__*/_interopDefault(k);/* @deriv-com/analytics - NPM Package - Built with tsup */
|
|
2
|
+
var x="cached_analytics_events",R="cached_analytics_page_views",Q=(r,c)=>{try{let t=chunkBVGYK54Z_js.f(),f=k__default.default.get(x),a=f?JSON.parse(f):[];a.push({name:r,properties:c,timestamp:Date.now()});let g={expires:1};t&&(g.domain=t),k__default.default.set(x,JSON.stringify(a),g);}catch(t){console.warn("Analytics: Failed to cache event",t);}},X=(r,c)=>{try{let t=chunkBVGYK54Z_js.f(),f=k__default.default.get(R),a=f?JSON.parse(f):[];a.push({name:r,properties:c,timestamp:Date.now()});let g={expires:1};t&&(g.domain=t),k__default.default.set(R,JSON.stringify(a),g);}catch(t){console.warn("Analytics: Failed to cache page view",t);}},Y=()=>{try{let r=k__default.default.get(x);if(r){let c=JSON.parse(r);return Array.isArray(c)?c:[]}}catch(r){console.warn("Analytics: Failed to get cached events",r);}return []},Z=()=>{try{let r=k__default.default.get(R);if(r){let c=JSON.parse(r);return Array.isArray(c)?c:[]}}catch(r){console.warn("Analytics: Failed to get cached pages",r);}return []},ee=()=>{let r=chunkBVGYK54Z_js.f(),c=r?{domain:r}:{};k__default.default.remove(x,c);},te=()=>{let r=chunkBVGYK54Z_js.f(),c=r?{domain:r}:{};k__default.default.remove(R,c);};function he(r){let c=false,t=chunkBVGYK54Z_js.g("",()=>c),f,a,g,h={},_={},w=[],m=[],L=false,ie=()=>{if(!L&&a?.has_initialized){L=true;try{let e=Y();e.length>0&&(t(`processCookieCache | replaying ${e.length} cached event(s)`,e),e.forEach(o=>{a?.track(o.name,o.properties);}),ee());let i=Z();i.length>0&&(t(`processCookieCache | replaying ${i.length} cached page view(s)`,i),i.forEach(o=>{a?.pageView(o.name,"Deriv App",E(),o.properties);}),te());}catch(e){console.warn("Analytics: Failed to process cookie cache",e);}}},ne=()=>{t("onSdkLoaded | RudderStack SDK loaded"),ie(),m.length>0&&t(`onSdkLoaded | flushing ${m.length} pending identify call(s)`),m.forEach(({userId:e,traits:i})=>{e&&a?.identifyEvent(e,i);}),m=[];},oe=async({growthbookKey:e,growthbookDecryptionKey:i,rudderstackKey:o,growthbookOptions:s,posthogOptions:p,debug:d})=>{var l,u;d!==void 0&&(c=d),chunkFE5YWK6A_js.a.setDebug(c),t("initialise | starting analytics initialization",{rudderstack:!!o,growthbook:!!e,posthog:!!p});try{let y=s?.attributes?.country||(e?await chunkBVGYK54Z_js.j():void 0);if(o&&(t("initialise | initializing RudderStack"),a=chunkILN7DKKL_js.a.getRudderStackInstance(o,ne,c)),s?.attributes&&Object.keys(s.attributes).length>0){let n=s.attributes,v=a?.getAnonymousId();h={...h,country:y,...n.user_language&&{user_language:n.user_language},...n.account_type&&{account_type:n.account_type},...n.app_id&&{app_id:n.app_id},...n.residence_country&&{residence_country:n.residence_country},...n.device_type&&{device_type:n.device_type},...n.url&&{url:n.url},...n.email_hash&&{email_hash:n.email_hash},...n.network_type&&{network_type:n.network_type},...n.network_rtt&&{network_rtt:n.network_rtt},...n.network_downlink&&{network_downlink:n.network_downlink},...n.account_currency&&{account_currency:n.account_currency},...n.account_mode&&{account_mode:n.account_mode},loggedIn:!!n.loggedIn,...n.user_id&&!chunkBVGYK54Z_js.i(n.user_id)&&{user_id:n.user_id},...v&&{anonymous_id:v}};}s??(s={}),s.attributes??(s.attributes={});let P=a?.getAnonymousId();if((l=s.attributes).id??(l.id=P),(u=s.attributes).country??(u.country=y),e){t("initialise | initializing GrowthBook");let{Growthbook:n}=await import('./providers/growthbook/index.js');f=n.getGrowthBookInstance(e,i,s,c),t("initialise | GrowthBook initialized");let v=setInterval(()=>{Object.keys(_).length>0?clearInterval(v):_=U("tracking-buttons-config",{});},1e3);}if(p){t("initialise | initializing PostHog");let{Posthog:n}=await import('./providers/posthog/index.js');g=n.getPosthogInstance(p,c),t("initialise | PostHog initialized");}t("initialise | analytics initialization complete");}catch(y){console.warn("Analytics: Failed to initialize",y);}},se=({country:e,user_language:i,device_language:o,device_type:s,account_type:p,user_id:d,anonymous_id:l,app_id:u,utm_source:y,utm_medium:P,utm_campaign:n,is_authorised:v,residence_country:C,url:T,domain:B,geo_location:z,loggedIn:S,network_downlink:G,network_rtt:O,network_type:F,account_currency:D,account_mode:H})=>{let N=d??E();if(t("setAttributes | received attributes",{country:e,user_language:i,device_language:o,device_type:s,account_type:p,user_id:d,anonymous_id:l,app_id:u,utm_source:y,utm_medium:P,utm_campaign:n,is_authorised:v,residence_country:C,url:T,domain:B,geo_location:z,loggedIn:S,network_downlink:G,network_rtt:O,network_type:F,account_currency:D,account_mode:H}),f){let I={country:e,residence_country:C,user_language:i,device_language:o,device_type:s,utm_source:y,utm_medium:P,utm_campaign:n,is_authorised:v,url:T,domain:B,loggedIn:S,...d&&!chunkBVGYK54Z_js.i(d)&&{user_id:d},anonymous_id:l};N&&(I.id=N,I.user_id=N),t("setAttributes | called GrowthBook setAttributes",I),f.setAttributes(I);}h={...h,...e!==void 0&&{country:e},...z!==void 0&&{geo_location:z},...i!==void 0&&{user_language:i},...p!==void 0&&{account_type:p},...u!==void 0&&{app_id:u},...C!==void 0&&{residence_country:C},...s!==void 0&&{device_type:s},...T!==void 0&&{url:T},...S!==void 0&&{loggedIn:S},...G!==void 0&&{network_downlink:G},...O!==void 0&&{network_rtt:O},...F!==void 0&&{network_type:F},...d!==void 0&&!chunkBVGYK54Z_js.i(d)&&{user_id:d},...l!==void 0&&{anonymous_id:l},...D!==void 0&&{account_currency:D},...H!==void 0&&{account_mode:H}},t("setAttributes | updated core_data",h);},ae=e=>f?.getFeatureState(e)?.experimentResult?.name,U=(e,i)=>f?.getFeatureValue(e,i),re=async()=>await f?.getStatus(),ce=e=>f?.isOn(e),de=e=>f?.setUrl(e),E=()=>{let e=a?.getUserId()||"";return e&&!chunkBVGYK54Z_js.i(e)?e:""},le=()=>a?.getAnonymousId()||"",ge=(e,i="Deriv App",o)=>{let s=E();t("pageView | called",{current_page:e,platform:i,properties:o,userId:s}),a&&(a.has_initialized?(t("pageView | sending page view to RudderStack",{current_page:e,platform:i}),a.pageView(e,i,s,o)):(t("pageView | RudderStack not initialized \u2014 caching page view to cookie",{current_page:e}),X(e,{platform:i,...o})));},fe=(e,i)=>{let o=e||E();if(!o){t("identifyEvent | skipped \u2014 no user_id available");return}t("identifyEvent | called",{user_id:o,traits:i});let s=i?.rudderstack!==void 0||i?.posthog!==void 0,p=s?i?.rudderstack:i,d=s?i?.posthog:i;a&&(a.has_initialized?(t("identifyEvent | calling RudderStack identify",{user_id:o,traits:p}),a.identifyEvent(o,p)):m.some(l=>l.userId===o)||(t("identifyEvent | RudderStack not initialized \u2014 queuing identify call",{user_id:o}),m.push({userId:o,traits:p}))),g?.has_initialized&&d&&(t("identifyEvent | calling PostHog identify",{user_id:o,traits:d}),g.identifyEvent(o,d));},pe=()=>{t("reset | resetting all providers"),a?.has_initialized&&(t("reset | resetting RudderStack"),a.reset()),g?.has_initialized&&(t("reset | resetting PostHog"),g.reset());},ue=e=>"event_metadata"in e||"cta_information"in e||"error"in e,j={initialise:oe,setAttributes:se,identifyEvent:fe,backfillPersonProperties:(e,i)=>{t("backfillPersonProperties | called",{user_id:e}),g?.has_initialized?(t("backfillPersonProperties | backfilling person properties in PostHog",{user_id:e}),g.backfillPersonProperties(e,i)):t("backfillPersonProperties | skipped \u2014 PostHog not initialized");},getFeatureState:ae,getFeatureValue:U,getGrowthbookStatus:re,isFeatureOn:ce,setUrl:de,getId:E,getAnonymousId:le,trackEvent:(e,i)=>{let o=E(),s={};if(t("trackEvent | called",{event:e,analytics_data:i,userId:o,core_data:h}),ue(i)){let l=i;s={...l,event_metadata:{...h,...o&&!h.user_id&&{user_id:o},...l.event_metadata}},t("trackEvent | built V2 payload",{event:e,final_payload:s});}else s={...h,...i,...o&&!h.user_id&&{user_id:o}},t("trackEvent | built V1 payload",{event:e,final_payload:s});if(!(!(e in _)||_[e])){t("trackEvent | skipped \u2014 event disabled by tracking_config",{event:e});return}let d=a?.has_initialized;if(!navigator.onLine||!d)d?(t("trackEvent | offline \u2014 caching event to memory",{event:e}),w.push({event:e,payload:s})):(t("trackEvent | RudderStack not initialized \u2014 caching event to cookie",{event:e}),Q(e,s));else {w.length>0&&(t(`trackEvent | flushing ${w.length} offline cached event(s) to RudderStack`),w.forEach(u=>{let y=chunkBVGYK54Z_js.k(u.payload);a?.track(u.event,y);}),w=[]);let l=chunkBVGYK54Z_js.k(s);t("trackEvent | sending event to RudderStack",{event:e,payload:l}),a?.track(e,l);}if(g?.has_initialized){let l=chunkBVGYK54Z_js.l(s),u=chunkBVGYK54Z_js.k(l);t("trackEvent | sending event to PostHog",{event:e,payload:u}),g.capture(e,u);}},getInstances:()=>({ab:f,tracking:a,posthog:g}),pageView:ge,reset:pe};return typeof window<"u"&&(window.AnalyticsInstance=j),j}var ye=he();Object.defineProperty(exports,"cacheTrackEvents",{enumerable:true,get:function(){return chunkFE5YWK6A_js.a}});exports.Analytics=ye;//# sourceMappingURL=index.js.map
|
|
4
3
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/cookie.ts","../src/utils/helpers.ts","../src/analytics.ts"],"names":["CACHE_COOKIE_EVENTS","CACHE_COOKIE_PAGES","cacheEventToCookie","eventName","properties","domain","getAllowedDomain","existingCache","Cookies","events","cookieOptions","err","cachePageViewToCookie","pageName","pages","getCachedEvents","storedEventsString","getCachedPageViews","storedPagesString","clearCachedEvents","clearCachedPageViews","isUUID","str","countryPromise","getCountry","cookieCountry","response","cloudflareTrace","text","v","cleanObject","obj","cleanedArr","cleaned","key","value","flattenObject","flattened","createAnalyticsInstance","_options","_growthbook","_rudderstack","_posthog","core_data","tracking_config","offline_event_cache","_pending_identify_calls","_cookie_cache_processed","processCookieCache","storedEvents","event","storedPages","page","getId","onSdkLoaded","userId","traits","initialise","growthbookKey","growthbookDecryptionKey","rudderstackKey","growthbookOptions","posthogOptions","_a","_b","country","RudderStack","attrs","anonymousId","anonId","Growthbook","interval","getFeatureValue","Posthog","setAttributes","user_language","device_language","device_type","account_type","user_id","anonymous_id","app_id","utm_source","utm_medium","utm_campaign","is_authorised","residence_country","url","geo_location","loggedIn","network_downlink","network_rtt","network_type","account_currency","account_mode","user_identity","config","getFeatureState","id","defaultValue","getGrowthbookStatus","isFeatureOn","setUrl","href","getAnonymousId","pageView","current_page","platform","identifyEvent","stored_user_id","hasProviderStructure","rudderstackTraits","posthogTraits","call","reset","isV2Payload","payload","AnalyticsInstance","analytics_data","final_payload","v2_data","hasRudderstackInitialized","cache","cleaned_cache_payload","cleaned_payload","flattened_payload","cleaned_posthog_payload","Analytics"],"mappings":"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","file":"index.js","sourcesContent":["import Cookies from 'js-cookie'\nimport { getAllowedDomain } from './urls'\n\nexport const CACHE_COOKIE_EVENTS = 'cached_analytics_events'\nexport const CACHE_COOKIE_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 cacheEventToCookie = (eventName: string, properties: Record<string, unknown>): void => {\n try {\n const domain = getAllowedDomain()\n const existingCache = Cookies.get(CACHE_COOKIE_EVENTS)\n const events: CachedEvent[] = existingCache ? JSON.parse(existingCache) : []\n events.push({ name: eventName, properties, timestamp: Date.now() })\n const cookieOptions: Cookies.CookieAttributes = { expires: 1 }\n if (domain) cookieOptions.domain = domain\n Cookies.set(CACHE_COOKIE_EVENTS, JSON.stringify(events), cookieOptions)\n } catch (err) {\n console.warn('Analytics: Failed to cache event', err)\n }\n}\n\nexport const cachePageViewToCookie = (pageName: string, properties?: Record<string, unknown>): void => {\n try {\n const domain = getAllowedDomain()\n const existingCache = Cookies.get(CACHE_COOKIE_PAGES)\n const pages: CachedPageView[] = existingCache ? JSON.parse(existingCache) : []\n pages.push({ name: pageName, properties, timestamp: Date.now() })\n const cookieOptions: Cookies.CookieAttributes = { expires: 1 }\n if (domain) cookieOptions.domain = domain\n Cookies.set(CACHE_COOKIE_PAGES, JSON.stringify(pages), cookieOptions)\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 = Cookies.get(CACHE_COOKIE_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 = Cookies.get(CACHE_COOKIE_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 const domain = getAllowedDomain()\n const cookieOptions = domain ? { domain } : {}\n Cookies.remove(CACHE_COOKIE_EVENTS, cookieOptions)\n}\n\nexport const clearCachedPageViews = (): void => {\n const domain = getAllowedDomain()\n const cookieOptions = domain ? { domain } : {}\n Cookies.remove(CACHE_COOKIE_PAGES, cookieOptions)\n}\n","import Cookies from 'js-cookie'\nimport { cloudflareTrace } from './urls'\n\nexport const isUUID = (str: string): boolean => {\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n return uuidRegex.test(str)\n}\n\ntype TraceData = {\n loc?: string\n}\n\nlet countryPromise: Promise<string> | null = null\n\n/**\n * Fetches the country information based on Cloudflare's trace data or a fallback from cookies.\n * This function attempts to retrieve the country location by first fetching trace data from Cloudflare\n * and then falling back to the location stored in the cookies if the fetch fails.\n *\n * @returns {Promise<string>} A Promise that resolves to a string representing the country code in lowercase.\n * Returns an empty string if no country data is available or if an error occurs.\n *\n * @example\n * // Returns the country code in lowercase based on Cloudflare's trace data or cookies.\n * getCountry().then(country => console.log(country));\n */\nexport const getCountry = async (): Promise<string> => {\n if (countryPromise) return countryPromise\n\n const cookieCountry = JSON.parse(Cookies.get('website_status') || '{}')?.clients_country\n\n countryPromise = (async () => {\n try {\n const response = await fetch(cloudflareTrace).catch(() => null)\n if (!response) return cookieCountry || ''\n\n const text = await response.text().catch(() => '')\n if (!text) return cookieCountry || ''\n\n const data: TraceData = Object.fromEntries(text.split('\\n').map(v => v.split('=', 2)))\n return data.loc?.toLowerCase() || cookieCountry || ''\n } catch {\n return cookieCountry || ''\n }\n })()\n\n return countryPromise\n}\n\n/**\n * Recursively cleans an object by removing undefined, null, empty strings, empty objects, and empty arrays\n * Used to sanitize event properties before sending to analytics providers\n *\n * @param obj - The object to clean\n * @returns The cleaned object, or undefined if the result would be empty\n */\nexport const cleanObject = (obj: any): any => {\n if (obj == null || typeof obj !== 'object') return obj\n\n if (Array.isArray(obj)) {\n const cleanedArr = obj.map(cleanObject).filter(v => v !== undefined && v !== null)\n return cleanedArr.length ? cleanedArr : undefined\n }\n\n const cleaned: Record<string, any> = {}\n Object.entries(obj).forEach(([key, value]) => {\n const v = cleanObject(value)\n if (\n v === undefined ||\n v === null ||\n v === '' ||\n (typeof v === 'object' && !Array.isArray(v) && Object.keys(v).length === 0) ||\n (Array.isArray(v) && v.length === 0)\n ) {\n return\n }\n\n cleaned[key] = v\n })\n\n return Object.keys(cleaned).length ? cleaned : undefined\n}\n\n/**\n * Flattens a nested object structure into a single-level object\n * Lifts all nested properties to the top level without prefixing\n *\n * @param obj - The object to flatten\n * @returns A flattened object with all nested properties at the top level\n *\n * @example\n * flattenObject({ action: 'click', event_metadata: { version: 2, user_language: 'en' } })\n * // Returns: { action: 'click', version: 2, user_language: 'en' }\n *\n * flattenObject({ form_name: 'signup', cta_information: { cta_name: 'signup', section_name: 'header' } })\n * // Returns: { form_name: 'signup', cta_name: 'signup', section_name: 'header' }\n */\nexport const flattenObject = (obj: any): Record<string, any> => {\n if (obj == null || typeof obj !== 'object' || Array.isArray(obj)) {\n return obj\n }\n\n const flattened: Record<string, any> = {}\n\n Object.entries(obj).forEach(([key, value]) => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n // Recursively flatten nested objects and merge them at the top level\n Object.assign(flattened, flattenObject(value))\n } else {\n flattened[key] = value\n }\n })\n\n return flattened\n}\n","import { RudderStack } from './providers/rudderstack'\nimport type { TCoreAttributes, TAllEvents, TV2EventPayload } from './types'\nimport {\n cacheEventToCookie,\n cachePageViewToCookie,\n getCachedEvents,\n getCachedPageViews,\n clearCachedEvents,\n clearCachedPageViews,\n} from './utils/cookie'\nimport { isUUID, getCountry, cleanObject, flattenObject } from './utils/helpers'\n\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 { 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 /** Additional configuration options for GrowthBook */\n growthbookOptions?: TGrowthbookOptions\n /** PostHog configuration options including API keys and settings */\n posthogOptions?: TPosthogOptions\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 _growthbook: Growthbook | undefined,\n _rudderstack: RudderStack,\n _posthog: Posthog | undefined,\n core_data: Partial<TCoreAttributes> = {},\n tracking_config: { [key: string]: boolean } = {},\n offline_event_cache: Array<{ event: keyof TAllEvents; payload: TAllEvents[keyof TAllEvents] }> = [],\n _pending_identify_calls: Array<{ userId: string; traits?: Record<string, any> }> = [],\n _cookie_cache_processed = false\n\n const processCookieCache = () => {\n if (_cookie_cache_processed) return\n if (!_rudderstack?.has_initialized) return\n\n _cookie_cache_processed = true\n\n try {\n const storedEvents = getCachedEvents()\n if (storedEvents.length > 0) {\n storedEvents.forEach(event => {\n _rudderstack?.track(event.name as keyof TAllEvents, event.properties as any)\n })\n clearCachedEvents()\n }\n\n const storedPages = getCachedPageViews()\n if (storedPages.length > 0) {\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 cookie cache', err)\n }\n }\n\n const onSdkLoaded = () => {\n processCookieCache()\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 growthbookOptions,\n posthogOptions,\n }: Options) => {\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 _rudderstack = RudderStack.getRudderStackInstance(rudderstackKey, onSdkLoaded)\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 // Dynamically import Growthbook only when needed\n const { Growthbook } = await import('./providers/growthbook')\n _growthbook = Growthbook.getGrowthBookInstance(\n growthbookKey,\n growthbookDecryptionKey,\n growthbookOptions\n )\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 // Dynamically import Posthog only when needed\n const { Posthog } = await import('./providers/posthog')\n _posthog = Posthog.getPosthogInstance(posthogOptions)\n }\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 = ({\n country,\n user_language,\n device_language,\n device_type,\n account_type,\n user_id,\n anonymous_id,\n app_id,\n utm_source,\n utm_medium,\n utm_campaign,\n is_authorised,\n residence_country,\n url,\n domain,\n geo_location,\n loggedIn,\n network_downlink,\n network_rtt,\n network_type,\n account_currency,\n account_mode,\n }: TCoreAttributes) => {\n const user_identity = user_id ?? getId()\n\n if (_growthbook) {\n const config: TGrowthbookAttributes = {\n country,\n residence_country,\n user_language,\n device_language,\n device_type,\n utm_source,\n utm_medium,\n utm_campaign,\n is_authorised,\n url,\n domain,\n loggedIn,\n ...(user_id && !isUUID(user_id) && { user_id }),\n anonymous_id,\n }\n if (user_identity) {\n config.id = user_identity\n config.user_id = user_identity\n }\n _growthbook.setAttributes(config)\n }\n\n core_data = {\n ...core_data,\n ...(country !== undefined && { country }),\n ...(geo_location !== undefined && { geo_location }),\n ...(user_language !== undefined && { user_language }),\n ...(account_type !== undefined && { account_type }),\n ...(app_id !== undefined && { app_id }),\n ...(residence_country !== undefined && { residence_country }),\n ...(device_type !== undefined && { device_type }),\n ...(url !== undefined && { url }),\n ...(loggedIn !== undefined && { loggedIn }),\n ...(network_downlink !== undefined && { network_downlink }),\n ...(network_rtt !== undefined && { network_rtt }),\n ...(network_type !== undefined && { network_type }),\n ...(user_id !== undefined && !isUUID(user_id) && { user_id }),\n ...(anonymous_id !== undefined && { anonymous_id }),\n ...(account_currency !== undefined && { account_currency }),\n ...(account_mode !== undefined && { account_mode }),\n }\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 // Handle RudderStack pageView independently\n if (_rudderstack) {\n if (_rudderstack.has_initialized) {\n _rudderstack.pageView(current_page, platform, userId, properties)\n } else {\n cachePageViewToCookie(current_page, { platform, ...properties })\n }\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) return\n\n // Check if traits has provider-specific structure\n const hasProviderStructure = traits?.rudderstack !== undefined || traits?.posthog !== undefined\n const rudderstackTraits = hasProviderStructure ? traits?.rudderstack : traits\n const posthogTraits = hasProviderStructure ? traits?.posthog : traits\n\n // Handle RudderStack identification independently\n if (_rudderstack) {\n if (_rudderstack.has_initialized) {\n _rudderstack.identifyEvent(stored_user_id, rudderstackTraits)\n } else {\n if (!_pending_identify_calls.some(call => call.userId === stored_user_id)) {\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 _posthog.identifyEvent(stored_user_id, posthogTraits)\n }\n }\n\n const reset = () => {\n // Reset each provider independently\n if (_rudderstack?.has_initialized) {\n _rudderstack.reset()\n }\n if (_posthog?.has_initialized) {\n _posthog.reset()\n }\n }\n\n const isV2Payload = (payload: any): payload is TV2EventPayload => {\n return 'event_metadata' in payload || 'cta_information' in payload || 'error' in payload\n }\n\n /**\n * Tracks a custom event with associated data.\n *\n * Features:\n * - Automatically enriches events with core attributes\n * - Supports both V1 and V2 event payload formats\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 * @template T - The event name type from TAllEvents\n * @param {T} event - The event name to track\n * @param {TAllEvents[T]} analytics_data - The event data payload\n *\n * @example\n * ```typescript\n * // Simple event\n * analytics.trackEvent('button_clicked', { button_name: 'signup' });\n *\n * // V2 event with metadata\n * analytics.trackEvent('form_submitted', {\n * event_metadata: { form_name: 'registration' },\n * cta_information: { button_text: 'Create Account' }\n * });\n * ```\n */\n const trackEvent = <T extends keyof TAllEvents>(event: T, analytics_data: TAllEvents[T]) => {\n const userId = getId()\n let final_payload: any = {}\n\n if (isV2Payload(analytics_data)) {\n const v2_data = analytics_data as TV2EventPayload\n final_payload = {\n ...v2_data,\n event_metadata: {\n ...core_data,\n ...(userId && !core_data.user_id && { user_id: userId }),\n ...v2_data.event_metadata,\n },\n }\n } else {\n final_payload = {\n ...core_data,\n ...analytics_data,\n ...(userId && !core_data.user_id && { user_id: userId }),\n }\n }\n\n const shouldTrack = !(event in tracking_config) || tracking_config[event as string]\n if (!shouldTrack) return\n\n // Handle RudderStack independently\n const hasRudderstackInitialized = _rudderstack?.has_initialized\n if (!navigator.onLine || !hasRudderstackInitialized) {\n if (!hasRudderstackInitialized) {\n cacheEventToCookie(event as string, final_payload)\n } else {\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 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 _rudderstack?.track(event, cleaned_payload)\n }\n\n // Handle PostHog independently - send immediately if initialized\n if (_posthog?.has_initialized) {\n const flattened_payload = flattenObject(final_payload)\n const cleaned_posthog_payload = cleanObject(flattened_payload)\n _posthog.capture(event as string, cleaned_posthog_payload)\n }\n }\n\n const getInstances = () => ({ ab: _growthbook, tracking: _rudderstack, posthog: _posthog })\n\n const AnalyticsInstance = {\n initialise,\n setAttributes,\n identifyEvent,\n getFeatureState,\n getFeatureValue,\n getGrowthbookStatus,\n isFeatureOn,\n setUrl,\n getId,\n getAnonymousId,\n trackEvent,\n getInstances,\n pageView,\n reset,\n }\n\n if (typeof window !== 'undefined') {\n window.AnalyticsInstance = AnalyticsInstance\n }\n\n return AnalyticsInstance\n}\n\nexport const Analytics = createAnalyticsInstance()\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/cookie.ts","../src/analytics.ts"],"names":["CACHE_COOKIE_EVENTS","CACHE_COOKIE_PAGES","cacheEventToCookie","eventName","properties","domain","getAllowedDomain","existingCache","Cookies","events","cookieOptions","err","cachePageViewToCookie","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","_cookie_cache_processed","processCookieCache","storedEvents","event","storedPages","page","getId","onSdkLoaded","userId","traits","initialise","growthbookKey","growthbookDecryptionKey","rudderstackKey","growthbookOptions","posthogOptions","debug","_a","_b","cacheTrackEvents","country","getCountry","RudderStack","attrs","anonymousId","isUUID","anonId","Growthbook","interval","getFeatureValue","Posthog","setAttributes","user_language","device_language","device_type","account_type","user_id","anonymous_id","app_id","utm_source","utm_medium","utm_campaign","is_authorised","residence_country","url","geo_location","loggedIn","network_downlink","network_rtt","network_type","account_currency","account_mode","user_identity","config","getFeatureState","id","defaultValue","getGrowthbookStatus","isFeatureOn","key","setUrl","href","getAnonymousId","pageView","current_page","platform","identifyEvent","stored_user_id","hasProviderStructure","rudderstackTraits","posthogTraits","call","reset","isV2Payload","payload","AnalyticsInstance","email","analytics_data","final_payload","v2_data","hasRudderstackInitialized","cache","cleaned_cache_payload","cleanObject","cleaned_payload","flattened_payload","flattenObject","cleaned_posthog_payload","Analytics"],"mappings":"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","file":"index.js","sourcesContent":["import Cookies from 'js-cookie'\nimport { getAllowedDomain } from './urls'\n\nexport const CACHE_COOKIE_EVENTS = 'cached_analytics_events'\nexport const CACHE_COOKIE_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 cacheEventToCookie = (eventName: string, properties: Record<string, unknown>): void => {\n try {\n const domain = getAllowedDomain()\n const existingCache = Cookies.get(CACHE_COOKIE_EVENTS)\n const events: CachedEvent[] = existingCache ? JSON.parse(existingCache) : []\n events.push({ name: eventName, properties, timestamp: Date.now() })\n const cookieOptions: Cookies.CookieAttributes = { expires: 1 }\n if (domain) cookieOptions.domain = domain\n Cookies.set(CACHE_COOKIE_EVENTS, JSON.stringify(events), cookieOptions)\n } catch (err) {\n console.warn('Analytics: Failed to cache event', err)\n }\n}\n\nexport const cachePageViewToCookie = (pageName: string, properties?: Record<string, unknown>): void => {\n try {\n const domain = getAllowedDomain()\n const existingCache = Cookies.get(CACHE_COOKIE_PAGES)\n const pages: CachedPageView[] = existingCache ? JSON.parse(existingCache) : []\n pages.push({ name: pageName, properties, timestamp: Date.now() })\n const cookieOptions: Cookies.CookieAttributes = { expires: 1 }\n if (domain) cookieOptions.domain = domain\n Cookies.set(CACHE_COOKIE_PAGES, JSON.stringify(pages), cookieOptions)\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 = Cookies.get(CACHE_COOKIE_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 = Cookies.get(CACHE_COOKIE_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 const domain = getAllowedDomain()\n const cookieOptions = domain ? { domain } : {}\n Cookies.remove(CACHE_COOKIE_EVENTS, cookieOptions)\n}\n\nexport const clearCachedPageViews = (): void => {\n const domain = getAllowedDomain()\n const cookieOptions = domain ? { domain } : {}\n Cookies.remove(CACHE_COOKIE_PAGES, cookieOptions)\n}\n","import { RudderStack } from './providers/rudderstack'\nimport type { TCoreAttributes, TAllEvents, TV2EventPayload } from './types'\nimport {\n cacheEventToCookie,\n cachePageViewToCookie,\n getCachedEvents,\n getCachedPageViews,\n clearCachedEvents,\n clearCachedPageViews,\n} from './utils/cookie'\nimport { isUUID, getCountry, cleanObject, flattenObject, createLogger } from './utils/helpers'\nimport { cacheTrackEvents } from './utils/analytics-cache'\n\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 /** 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: Partial<TCoreAttributes> = {},\n tracking_config: { [key: string]: boolean } = {},\n offline_event_cache: Array<{ event: keyof TAllEvents; payload: TAllEvents[keyof TAllEvents] }> = [],\n _pending_identify_calls: Array<{ userId: string; traits?: Record<string, any> }> = [],\n _cookie_cache_processed = false\n\n const processCookieCache = () => {\n if (_cookie_cache_processed) return\n if (!_rudderstack?.has_initialized) return\n\n _cookie_cache_processed = true\n\n try {\n const storedEvents = getCachedEvents()\n if (storedEvents.length > 0) {\n log(`processCookieCache | replaying ${storedEvents.length} cached event(s)`, storedEvents)\n storedEvents.forEach(event => {\n _rudderstack?.track(event.name as keyof TAllEvents, event.properties as any)\n })\n clearCachedEvents()\n }\n\n const storedPages = getCachedPageViews()\n if (storedPages.length > 0) {\n log(`processCookieCache | 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 cookie cache', err)\n }\n }\n\n const onSdkLoaded = () => {\n log('onSdkLoaded | RudderStack SDK loaded')\n processCookieCache()\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 growthbookOptions,\n posthogOptions,\n debug,\n }: Options) => {\n if (debug !== undefined) _debug = debug\n cacheTrackEvents.setDebug(_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)\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(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 = ({\n country,\n user_language,\n device_language,\n device_type,\n account_type,\n user_id,\n anonymous_id,\n app_id,\n utm_source,\n utm_medium,\n utm_campaign,\n is_authorised,\n residence_country,\n url,\n domain,\n geo_location,\n loggedIn,\n network_downlink,\n network_rtt,\n network_type,\n account_currency,\n account_mode,\n }: TCoreAttributes) => {\n const user_identity = user_id ?? getId()\n\n log('setAttributes | received attributes', {\n country,\n user_language,\n device_language,\n device_type,\n account_type,\n user_id,\n anonymous_id,\n app_id,\n utm_source,\n utm_medium,\n utm_campaign,\n is_authorised,\n residence_country,\n url,\n domain,\n geo_location,\n loggedIn,\n network_downlink,\n network_rtt,\n network_type,\n account_currency,\n account_mode,\n })\n\n if (_growthbook) {\n const config: TGrowthbookAttributes = {\n country,\n residence_country,\n user_language,\n device_language,\n device_type,\n utm_source,\n utm_medium,\n utm_campaign,\n is_authorised,\n url,\n domain,\n loggedIn,\n ...(user_id && !isUUID(user_id) && { user_id }),\n anonymous_id,\n }\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 ...(country !== undefined && { country }),\n ...(geo_location !== undefined && { geo_location }),\n ...(user_language !== undefined && { user_language }),\n ...(account_type !== undefined && { account_type }),\n ...(app_id !== undefined && { app_id }),\n ...(residence_country !== undefined && { residence_country }),\n ...(device_type !== undefined && { device_type }),\n ...(url !== undefined && { url }),\n ...(loggedIn !== undefined && { loggedIn }),\n ...(network_downlink !== undefined && { network_downlink }),\n ...(network_rtt !== undefined && { network_rtt }),\n ...(network_type !== undefined && { network_type }),\n ...(user_id !== undefined && !isUUID(user_id) && { user_id }),\n ...(anonymous_id !== undefined && { anonymous_id }),\n ...(account_currency !== undefined && { account_currency }),\n ...(account_mode !== undefined && { account_mode }),\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) {\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 cookie', { current_page })\n cachePageViewToCookie(current_page, { platform, ...properties })\n }\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 // Check if traits has provider-specific structure\n const hasProviderStructure = traits?.rudderstack !== undefined || traits?.posthog !== undefined\n const rudderstackTraits = hasProviderStructure ? traits?.rudderstack : traits\n const posthogTraits = hasProviderStructure ? traits?.posthog : traits\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 && posthogTraits) {\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 const isV2Payload = (payload: any): payload is TV2EventPayload => {\n return 'event_metadata' in payload || 'cta_information' in payload || 'error' in payload\n }\n\n /**\n * Tracks a custom event with associated data.\n *\n * Features:\n * - Automatically enriches events with core attributes\n * - Supports both V1 and V2 event payload formats\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 * @template T - The event name type from TAllEvents\n * @param {T} event - The event name to track\n * @param {TAllEvents[T]} analytics_data - The event data payload\n *\n * @example\n * ```typescript\n * // Simple event\n * analytics.trackEvent('button_clicked', { button_name: 'signup' });\n *\n * // V2 event with metadata\n * analytics.trackEvent('form_submitted', {\n * event_metadata: { form_name: 'registration' },\n * cta_information: { button_text: 'Create Account' }\n * });\n * ```\n */\n const trackEvent = <T extends keyof TAllEvents>(event: T, analytics_data: TAllEvents[T]) => {\n const userId = getId()\n let final_payload: any = {}\n\n log('trackEvent | called', { event, analytics_data, userId, core_data })\n\n if (isV2Payload(analytics_data)) {\n const v2_data = analytics_data as TV2EventPayload\n final_payload = {\n ...v2_data,\n event_metadata: {\n ...core_data,\n ...(userId && !core_data.user_id && { user_id: userId }),\n ...v2_data.event_metadata,\n },\n }\n log('trackEvent | built V2 payload', { event, final_payload })\n } else {\n final_payload = {\n ...core_data,\n ...analytics_data,\n ...(userId && !core_data.user_id && { user_id: userId }),\n }\n log('trackEvent | built V1 payload', { event, final_payload })\n }\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 cookie', { event })\n cacheEventToCookie(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 flattened_payload = flattenObject(final_payload)\n const cleaned_posthog_payload = cleanObject(flattened_payload)\n log('trackEvent | sending event to PostHog', { event, payload: cleaned_posthog_payload })\n _posthog.capture(event as string, cleaned_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 user_id - The user ID to use as client_id\n *\n * @example\n * ```typescript\n * if (window.posthog?.__loaded && userId) {\n * analytics.backfillPersonProperties(userId, email)\n * }\n * ```\n */\n const backfillPersonProperties = (user_id: string, email?: string): 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)\n } else {\n log('backfillPersonProperties | skipped — PostHog not initialized')\n }\n }\n\n const getInstances = () => ({ ab: _growthbook, tracking: _rudderstack, posthog: _posthog })\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 }\n\n if (typeof window !== 'undefined') {\n window.AnalyticsInstance = AnalyticsInstance\n }\n\n return AnalyticsInstance\n}\n\nexport const Analytics = createAnalyticsInstance()\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import {a}from'./chunk-
|
|
2
|
-
var
|
|
3
|
-
`).map(a=>a.split("=",2))).loc?.toLowerCase()||n||"":n||""}catch{return n||""}})(),b},k=n=>{if(n==null||typeof n!="object")return n;if(Array.isArray(n)){let t=n.map(k).filter(i=>i!=null);return t.length?t:void 0}let o={};return Object.entries(n).forEach(([t,i])=>{let a=k(i);a==null||a===""||typeof a=="object"&&!Array.isArray(a)&&Object.keys(a).length===0||Array.isArray(a)&&a.length===0||(o[t]=a);}),Object.keys(o).length?o:void 0},S=n=>{if(n==null||typeof n!="object"||Array.isArray(n))return n;let o={};return Object.entries(n).forEach(([t,i])=>{i&&typeof i=="object"&&!Array.isArray(i)?Object.assign(o,S(i)):o[t]=i;}),o};function ye(n){let o,t,i,a$1={},p={},v=[],C=[],R=false,X=()=>{if(!R&&t?.has_initialized){R=true;try{let e=W();e.length>0&&(e.forEach(d=>{t?.track(d.name,d.properties);}),q());let c=$();c.length>0&&(c.forEach(d=>{t?.pageView(d.name,"Deriv App",h(),d.properties);}),M());}catch(e){console.warn("Analytics: Failed to process cookie cache",e);}}},Y=()=>{X(),C.forEach(({userId:e,traits:c})=>{e&&t?.identifyEvent(e,c);}),C=[];},Z=async({growthbookKey:e,growthbookDecryptionKey:c,rudderstackKey:d,growthbookOptions:s,posthogOptions:y})=>{var u,l;try{let f=s?.attributes?.country||(e?await Q():void 0);if(d&&(t=a.getRudderStackInstance(d,Y)),s?.attributes&&Object.keys(s.attributes).length>0){let r=s.attributes,m=t?.getAnonymousId();a$1={...a$1,country:f,...r.user_language&&{user_language:r.user_language},...r.account_type&&{account_type:r.account_type},...r.app_id&&{app_id:r.app_id},...r.residence_country&&{residence_country:r.residence_country},...r.device_type&&{device_type:r.device_type},...r.url&&{url:r.url},...r.email_hash&&{email_hash:r.email_hash},...r.network_type&&{network_type:r.network_type},...r.network_rtt&&{network_rtt:r.network_rtt},...r.network_downlink&&{network_downlink:r.network_downlink},...r.account_currency&&{account_currency:r.account_currency},...r.account_mode&&{account_mode:r.account_mode},loggedIn:!!r.loggedIn,...r.user_id&&!w(r.user_id)&&{user_id:r.user_id},...m&&{anonymous_id:m}};}s??(s={}),s.attributes??(s.attributes={});let _=t?.getAnonymousId();if((u=s.attributes).id??(u.id=_),(l=s.attributes).country??(l.country=f),e){let{Growthbook:r}=await import('./providers/growthbook/index.mjs');o=r.getGrowthBookInstance(e,c,s);let m=setInterval(()=>{Object.keys(p).length>0?clearInterval(m):p=G("tracking-buttons-config",{});},1e3);}if(y){let{Posthog:r}=await import('./providers/posthog/index.mjs');i=r.getPosthogInstance(y);}}catch(f){console.warn("Analytics: Failed to initialize",f);}},ee=({country:e,user_language:c,device_language:d,device_type:s,account_type:y,user_id:u,anonymous_id:l,app_id:f,utm_source:_,utm_medium:r,utm_campaign:m,is_authorised:ue,residence_country:x,url:I,domain:le,geo_location:z,loggedIn:P,network_downlink:D,network_rtt:N,network_type:j,account_currency:J,account_mode:U})=>{let O=u??h();if(o){let V={country:e,residence_country:x,user_language:c,device_language:d,device_type:s,utm_source:_,utm_medium:r,utm_campaign:m,is_authorised:ue,url:I,domain:le,loggedIn:P,...u&&!w(u)&&{user_id:u},anonymous_id:l};O&&(V.id=O,V.user_id=O),o.setAttributes(V);}a$1={...a$1,...e!==void 0&&{country:e},...z!==void 0&&{geo_location:z},...c!==void 0&&{user_language:c},...y!==void 0&&{account_type:y},...f!==void 0&&{app_id:f},...x!==void 0&&{residence_country:x},...s!==void 0&&{device_type:s},...I!==void 0&&{url:I},...P!==void 0&&{loggedIn:P},...D!==void 0&&{network_downlink:D},...N!==void 0&&{network_rtt:N},...j!==void 0&&{network_type:j},...u!==void 0&&!w(u)&&{user_id:u},...l!==void 0&&{anonymous_id:l},...J!==void 0&&{account_currency:J},...U!==void 0&&{account_mode:U}};},te=e=>o?.getFeatureState(e)?.experimentResult?.name,G=(e,c)=>o?.getFeatureValue(e,c),ne=async()=>await o?.getStatus(),oe=e=>o?.isOn(e),re=e=>o?.setUrl(e),h=()=>{let e=t?.getUserId()||"";return e&&!w(e)?e:""},se=()=>t?.getAnonymousId()||"",ie=(e,c="Deriv App",d)=>{let s=h();t&&(t.has_initialized?t.pageView(e,c,s,d):B(e,{platform:c,...d}));},ae=(e,c)=>{let d=e||h();if(!d)return;let s=c?.rudderstack!==void 0||c?.posthog!==void 0,y=s?c?.rudderstack:c,u=s?c?.posthog:c;t&&(t.has_initialized?t.identifyEvent(d,y):C.some(l=>l.userId===d)||C.push({userId:d,traits:y})),i?.has_initialized&&i.identifyEvent(d,u);},ce=()=>{t?.has_initialized&&t.reset(),i?.has_initialized&&i.reset();},de=e=>"event_metadata"in e||"cta_information"in e||"error"in e,F={initialise:Z,setAttributes:ee,identifyEvent:ae,getFeatureState:te,getFeatureValue:G,getGrowthbookStatus:ne,isFeatureOn:oe,setUrl:re,getId:h,getAnonymousId:se,trackEvent:(e,c)=>{let d=h(),s={};if(de(c)){let l=c;s={...l,event_metadata:{...a$1,...d&&!a$1.user_id&&{user_id:d},...l.event_metadata}};}else s={...a$1,...c,...d&&!a$1.user_id&&{user_id:d}};if(!(!(e in p)||p[e]))return;let u=t?.has_initialized;if(!navigator.onLine||!u)u?v.push({event:e,payload:s}):H(e,s);else {v.length>0&&(v.forEach(f=>{let _=k(f.payload);t?.track(f.event,_);}),v=[]);let l=k(s);t?.track(e,l);}if(i?.has_initialized){let l=S(s),f=k(l);i.capture(e,f);}},getInstances:()=>({ab:o,tracking:t,posthog:i}),pageView:ie,reset:ce};return typeof window<"u"&&(window.AnalyticsInstance=F),F}var ge=ye();export{ge as Analytics};//# sourceMappingURL=index.mjs.map
|
|
1
|
+
import {a as a$1}from'./chunk-D2MKQCJB.mjs';import {a}from'./chunk-7CT4XR74.mjs';export{a as cacheTrackEvents}from'./chunk-7CT4XR74.mjs';import {g,i,j,f,k as k$1,l}from'./chunk-ID2GN2PS.mjs';import k from'js-cookie';/* @deriv-com/analytics - NPM Package - Built with tsup */
|
|
2
|
+
var x="cached_analytics_events",R="cached_analytics_page_views",M=(r,c)=>{try{let t=f(),f$1=k.get(x),a=f$1?JSON.parse(f$1):[];a.push({name:r,properties:c,timestamp:Date.now()});let g={expires:1};t&&(g.domain=t),k.set(x,JSON.stringify(a),g);}catch(t){console.warn("Analytics: Failed to cache event",t);}},Q=(r,c)=>{try{let t=f(),f$1=k.get(R),a=f$1?JSON.parse(f$1):[];a.push({name:r,properties:c,timestamp:Date.now()});let g={expires:1};t&&(g.domain=t),k.set(R,JSON.stringify(a),g);}catch(t){console.warn("Analytics: Failed to cache page view",t);}},X=()=>{try{let r=k.get(x);if(r){let c=JSON.parse(r);return Array.isArray(c)?c:[]}}catch(r){console.warn("Analytics: Failed to get cached events",r);}return []},Y=()=>{try{let r=k.get(R);if(r){let c=JSON.parse(r);return Array.isArray(c)?c:[]}}catch(r){console.warn("Analytics: Failed to get cached pages",r);}return []},Z=()=>{let r=f(),c=r?{domain:r}:{};k.remove(x,c);},ee=()=>{let r=f(),c=r?{domain:r}:{};k.remove(R,c);};function ue(r){let c=false,t=g("",()=>c),f,a$2,g$1,h={},_={},w=[],m=[],L=false,te=()=>{if(!L&&a$2?.has_initialized){L=true;try{let e=X();e.length>0&&(t(`processCookieCache | replaying ${e.length} cached event(s)`,e),e.forEach(o=>{a$2?.track(o.name,o.properties);}),Z());let i=Y();i.length>0&&(t(`processCookieCache | replaying ${i.length} cached page view(s)`,i),i.forEach(o=>{a$2?.pageView(o.name,"Deriv App",E(),o.properties);}),ee());}catch(e){console.warn("Analytics: Failed to process cookie cache",e);}}},ie=()=>{t("onSdkLoaded | RudderStack SDK loaded"),te(),m.length>0&&t(`onSdkLoaded | flushing ${m.length} pending identify call(s)`),m.forEach(({userId:e,traits:i})=>{e&&a$2?.identifyEvent(e,i);}),m=[];},ne=async({growthbookKey:e,growthbookDecryptionKey:i$1,rudderstackKey:o,growthbookOptions:s,posthogOptions:p,debug:d})=>{var l,u;d!==void 0&&(c=d),a.setDebug(c),t("initialise | starting analytics initialization",{rudderstack:!!o,growthbook:!!e,posthog:!!p});try{let y=s?.attributes?.country||(e?await j():void 0);if(o&&(t("initialise | initializing RudderStack"),a$2=a$1.getRudderStackInstance(o,ie,c)),s?.attributes&&Object.keys(s.attributes).length>0){let n=s.attributes,v=a$2?.getAnonymousId();h={...h,country:y,...n.user_language&&{user_language:n.user_language},...n.account_type&&{account_type:n.account_type},...n.app_id&&{app_id:n.app_id},...n.residence_country&&{residence_country:n.residence_country},...n.device_type&&{device_type:n.device_type},...n.url&&{url:n.url},...n.email_hash&&{email_hash:n.email_hash},...n.network_type&&{network_type:n.network_type},...n.network_rtt&&{network_rtt:n.network_rtt},...n.network_downlink&&{network_downlink:n.network_downlink},...n.account_currency&&{account_currency:n.account_currency},...n.account_mode&&{account_mode:n.account_mode},loggedIn:!!n.loggedIn,...n.user_id&&!i(n.user_id)&&{user_id:n.user_id},...v&&{anonymous_id:v}};}s??(s={}),s.attributes??(s.attributes={});let P=a$2?.getAnonymousId();if((l=s.attributes).id??(l.id=P),(u=s.attributes).country??(u.country=y),e){t("initialise | initializing GrowthBook");let{Growthbook:n}=await import('./providers/growthbook/index.mjs');f=n.getGrowthBookInstance(e,i$1,s,c),t("initialise | GrowthBook initialized");let v=setInterval(()=>{Object.keys(_).length>0?clearInterval(v):_=U("tracking-buttons-config",{});},1e3);}if(p){t("initialise | initializing PostHog");let{Posthog:n}=await import('./providers/posthog/index.mjs');g$1=n.getPosthogInstance(p,c),t("initialise | PostHog initialized");}t("initialise | analytics initialization complete");}catch(y){console.warn("Analytics: Failed to initialize",y);}},oe=({country:e,user_language:i$1,device_language:o,device_type:s,account_type:p,user_id:d,anonymous_id:l,app_id:u,utm_source:y,utm_medium:P,utm_campaign:n,is_authorised:v,residence_country:C,url:T,domain:B,geo_location:z,loggedIn:S,network_downlink:G,network_rtt:O,network_type:F,account_currency:D,account_mode:H})=>{let N=d??E();if(t("setAttributes | received attributes",{country:e,user_language:i$1,device_language:o,device_type:s,account_type:p,user_id:d,anonymous_id:l,app_id:u,utm_source:y,utm_medium:P,utm_campaign:n,is_authorised:v,residence_country:C,url:T,domain:B,geo_location:z,loggedIn:S,network_downlink:G,network_rtt:O,network_type:F,account_currency:D,account_mode:H}),f){let I={country:e,residence_country:C,user_language:i$1,device_language:o,device_type:s,utm_source:y,utm_medium:P,utm_campaign:n,is_authorised:v,url:T,domain:B,loggedIn:S,...d&&!i(d)&&{user_id:d},anonymous_id:l};N&&(I.id=N,I.user_id=N),t("setAttributes | called GrowthBook setAttributes",I),f.setAttributes(I);}h={...h,...e!==void 0&&{country:e},...z!==void 0&&{geo_location:z},...i$1!==void 0&&{user_language:i$1},...p!==void 0&&{account_type:p},...u!==void 0&&{app_id:u},...C!==void 0&&{residence_country:C},...s!==void 0&&{device_type:s},...T!==void 0&&{url:T},...S!==void 0&&{loggedIn:S},...G!==void 0&&{network_downlink:G},...O!==void 0&&{network_rtt:O},...F!==void 0&&{network_type:F},...d!==void 0&&!i(d)&&{user_id:d},...l!==void 0&&{anonymous_id:l},...D!==void 0&&{account_currency:D},...H!==void 0&&{account_mode:H}},t("setAttributes | updated core_data",h);},se=e=>f?.getFeatureState(e)?.experimentResult?.name,U=(e,i)=>f?.getFeatureValue(e,i),ae=async()=>await f?.getStatus(),re=e=>f?.isOn(e),ce=e=>f?.setUrl(e),E=()=>{let e=a$2?.getUserId()||"";return e&&!i(e)?e:""},de=()=>a$2?.getAnonymousId()||"",le=(e,i="Deriv App",o)=>{let s=E();t("pageView | called",{current_page:e,platform:i,properties:o,userId:s}),a$2&&(a$2.has_initialized?(t("pageView | sending page view to RudderStack",{current_page:e,platform:i}),a$2.pageView(e,i,s,o)):(t("pageView | RudderStack not initialized \u2014 caching page view to cookie",{current_page:e}),Q(e,{platform:i,...o})));},ge=(e,i)=>{let o=e||E();if(!o){t("identifyEvent | skipped \u2014 no user_id available");return}t("identifyEvent | called",{user_id:o,traits:i});let s=i?.rudderstack!==void 0||i?.posthog!==void 0,p=s?i?.rudderstack:i,d=s?i?.posthog:i;a$2&&(a$2.has_initialized?(t("identifyEvent | calling RudderStack identify",{user_id:o,traits:p}),a$2.identifyEvent(o,p)):m.some(l=>l.userId===o)||(t("identifyEvent | RudderStack not initialized \u2014 queuing identify call",{user_id:o}),m.push({userId:o,traits:p}))),g$1?.has_initialized&&d&&(t("identifyEvent | calling PostHog identify",{user_id:o,traits:d}),g$1.identifyEvent(o,d));},fe=()=>{t("reset | resetting all providers"),a$2?.has_initialized&&(t("reset | resetting RudderStack"),a$2.reset()),g$1?.has_initialized&&(t("reset | resetting PostHog"),g$1.reset());},pe=e=>"event_metadata"in e||"cta_information"in e||"error"in e,j$1={initialise:ne,setAttributes:oe,identifyEvent:ge,backfillPersonProperties:(e,i)=>{t("backfillPersonProperties | called",{user_id:e}),g$1?.has_initialized?(t("backfillPersonProperties | backfilling person properties in PostHog",{user_id:e}),g$1.backfillPersonProperties(e,i)):t("backfillPersonProperties | skipped \u2014 PostHog not initialized");},getFeatureState:se,getFeatureValue:U,getGrowthbookStatus:ae,isFeatureOn:re,setUrl:ce,getId:E,getAnonymousId:de,trackEvent:(e,i)=>{let o=E(),s={};if(t("trackEvent | called",{event:e,analytics_data:i,userId:o,core_data:h}),pe(i)){let l=i;s={...l,event_metadata:{...h,...o&&!h.user_id&&{user_id:o},...l.event_metadata}},t("trackEvent | built V2 payload",{event:e,final_payload:s});}else s={...h,...i,...o&&!h.user_id&&{user_id:o}},t("trackEvent | built V1 payload",{event:e,final_payload:s});if(!(!(e in _)||_[e])){t("trackEvent | skipped \u2014 event disabled by tracking_config",{event:e});return}let d=a$2?.has_initialized;if(!navigator.onLine||!d)d?(t("trackEvent | offline \u2014 caching event to memory",{event:e}),w.push({event:e,payload:s})):(t("trackEvent | RudderStack not initialized \u2014 caching event to cookie",{event:e}),M(e,s));else {w.length>0&&(t(`trackEvent | flushing ${w.length} offline cached event(s) to RudderStack`),w.forEach(u=>{let y=k$1(u.payload);a$2?.track(u.event,y);}),w=[]);let l=k$1(s);t("trackEvent | sending event to RudderStack",{event:e,payload:l}),a$2?.track(e,l);}if(g$1?.has_initialized){let l$1=l(s),u=k$1(l$1);t("trackEvent | sending event to PostHog",{event:e,payload:u}),g$1.capture(e,u);}},getInstances:()=>({ab:f,tracking:a$2,posthog:g$1}),pageView:le,reset:fe};return typeof window<"u"&&(window.AnalyticsInstance=j$1),j$1}var he=ue();export{he as Analytics};//# sourceMappingURL=index.mjs.map
|
|
4
3
|
//# sourceMappingURL=index.mjs.map
|