UNPKG

@deriv-com/analytics

Version:

Comprehensive analytics package for Deriv applications. Provides unified event tracking, A/B testing, and user analytics through RudderStack, PostHog and GrowthBook integrations with built-in caching and offline support.

1 lines 42.1 kB
{"version":3,"sources":["../src/utils/storage.ts","../src/analytics.ts"],"names":["CACHE_STORAGE_EVENTS","CACHE_STORAGE_PAGES","cacheEventToStorage","eventName","properties","existingCache","events","err","cachePageViewToStorage","pageName","pages","getCachedEvents","storedEventsString","getCachedPageViews","storedPagesString","clearCachedEvents","clearCachedPageViews","createAnalyticsInstance","_options","_debug","log","createLogger","_growthbook","_rudderstack","_posthog","core_data","tracking_config","offline_event_cache","_pending_identify_calls","_storage_cache_processed","processStorageCache","storedEvents","event","cleaned_properties","cleanObject","storedPages","page","getId","onSdkLoaded","userId","traits","initialise","growthbookKey","growthbookDecryptionKey","rudderstackKey","growthbookOptions","posthogOptions","debug","_a","_b","country","getCountry","RudderStack","attrs","anonymousId","isUUID","anonId","Growthbook","interval","getFeatureValue","Posthog","setAttributes","attributes","user_id","rest","user_identity","config","v","getFeatureState","id","defaultValue","getGrowthbookStatus","isFeatureOn","key","setUrl","href","AnalyticsInstance","stored_user_id","sanitizePII","t","email","safe","isInternalEmail","hasProviderStructure","rudderstackTraits","posthogTraits","rudderstack","posthog","sharedTraits","call","language","country_of_residence","analytics_data","final_payload","hasRudderstackInitialized","cache","cleaned_cache_payload","cleaned_payload","posthog_payload","flattenObject","current_page","platform","callback","Analytics"],"mappings":"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","file":"index.mjs","sourcesContent":["export const CACHE_STORAGE_EVENTS = 'cached_analytics_events'\nexport const CACHE_STORAGE_PAGES = 'cached_analytics_page_views'\n\nexport type CachedEvent = {\n name: string\n properties: Record<string, unknown>\n timestamp: number\n}\n\nexport type CachedPageView = {\n name: string\n properties?: Record<string, unknown>\n timestamp: number\n}\n\nexport const cacheEventToStorage = (eventName: string, properties: Record<string, unknown>): void => {\n try {\n const existingCache = localStorage.getItem(CACHE_STORAGE_EVENTS)\n const events: CachedEvent[] = existingCache ? JSON.parse(existingCache) : []\n events.push({ name: eventName, properties, timestamp: Date.now() })\n localStorage.setItem(CACHE_STORAGE_EVENTS, JSON.stringify(events))\n } catch (err) {\n console.warn('Analytics: Failed to cache event', err)\n }\n}\n\nexport const cachePageViewToStorage = (pageName: string, properties?: Record<string, unknown>): void => {\n try {\n const existingCache = localStorage.getItem(CACHE_STORAGE_PAGES)\n const pages: CachedPageView[] = existingCache ? JSON.parse(existingCache) : []\n pages.push({ name: pageName, properties, timestamp: Date.now() })\n localStorage.setItem(CACHE_STORAGE_PAGES, JSON.stringify(pages))\n } catch (err) {\n console.warn('Analytics: Failed to cache page view', err)\n }\n}\n\nexport const getCachedEvents = (): CachedEvent[] => {\n try {\n const storedEventsString = localStorage.getItem(CACHE_STORAGE_EVENTS)\n if (storedEventsString) {\n const events = JSON.parse(storedEventsString)\n return Array.isArray(events) ? events : []\n }\n } catch (err) {\n console.warn('Analytics: Failed to get cached events', err)\n }\n return []\n}\n\nexport const getCachedPageViews = (): CachedPageView[] => {\n try {\n const storedPagesString = localStorage.getItem(CACHE_STORAGE_PAGES)\n if (storedPagesString) {\n const pages = JSON.parse(storedPagesString)\n return Array.isArray(pages) ? pages : []\n }\n } catch (err) {\n console.warn('Analytics: Failed to get cached pages', err)\n }\n return []\n}\n\nexport const clearCachedEvents = (): void => {\n try {\n localStorage.removeItem(CACHE_STORAGE_EVENTS)\n } catch (err) {\n console.warn('Analytics: Failed to clear cached events', err)\n }\n}\n\nexport const clearCachedPageViews = (): void => {\n try {\n localStorage.removeItem(CACHE_STORAGE_PAGES)\n } catch (err) {\n console.warn('Analytics: Failed to clear cached page views', err)\n }\n}\n","import { RudderStack } from './providers/rudderstack'\nimport {\n cacheEventToStorage,\n cachePageViewToStorage,\n getCachedEvents,\n getCachedPageViews,\n clearCachedEvents,\n clearCachedPageViews,\n} from './utils/storage'\nimport { isUUID, getCountry, cleanObject, flattenObject, createLogger, isInternalEmail } from './utils/helpers'\n// Optional Growthbook types - only import if using Growthbook\nimport type { Growthbook, GrowthbookConfigs } from './providers/growthbook'\nimport type { TGrowthbookAttributes, TGrowthbookOptions } from './providers/growthbookTypes'\n\n// Optional Posthog types - only import if using Posthog\nimport type { Posthog } from './providers/posthog'\nimport type { TPosthogIdentifyTraits, TPosthogOptions } from './providers/posthogTypes'\n\ndeclare global {\n interface Window {\n AnalyticsInstance: ReturnType<typeof createAnalyticsInstance>\n }\n}\n\n/**\n * Configuration options for initializing the analytics instance\n */\ntype Options = {\n /** GrowthBook client API key for A/B testing and feature flags */\n growthbookKey?: string\n /** GrowthBook decryption key for encrypted feature payloads */\n growthbookDecryptionKey?: string\n /** RudderStack write key for event tracking */\n rudderstackKey?: string\n /** Additional configuration options for GrowthBook */\n growthbookOptions?: TGrowthbookOptions\n /** PostHog configuration options including API keys and settings */\n posthogOptions?: TPosthogOptions\n /** Enable debug logging — logs all analytics calls prefixed with [ANALYTIC] */\n debug?: boolean\n}\n\n/**\n * Creates a unified analytics instance that integrates RudderStack and GrowthBook.\n *\n * This function provides a centralized interface for:\n * - Event tracking across multiple analytics platforms\n * - A/B testing and feature flag management via GrowthBook\n * - Offline event caching with automatic replay\n *\n * @param {Options} _options - Optional initialization configuration\n * @returns {Object} Analytics instance with methods for tracking, identification, and feature management\n *\n * @example\n * ```typescript\n * const analytics = createAnalyticsInstance();\n *\n * // Initialize with providers\n * await analytics.initialise({\n * rudderstackKey: 'YOUR_RS_KEY',\n * growthbookKey: 'YOUR_GB_KEY',\n * growthbookDecryptionKey: 'YOUR_GB_DECRYPT_KEY'\n * });\n *\n * // Set user attributes\n * analytics.setAttributes({\n * user_id: 'user123',\n * country: 'US',\n * user_language: 'en'\n * });\n *\n * // Track events\n * analytics.trackEvent('button_clicked', { button_name: 'signup' });\n *\n * // Track page views\n * analytics.pageView('/dashboard', 'Deriv App');\n * ```\n */\nexport function createAnalyticsInstance(_options?: Options) {\n let _debug = _options?.debug ?? false\n\n const log = createLogger('', () => _debug)\n\n let _growthbook: Growthbook | undefined,\n _rudderstack: RudderStack,\n _posthog: Posthog | undefined,\n core_data: Record<string, any> = {},\n tracking_config: { [key: string]: boolean } = {},\n offline_event_cache: Array<{ event: string; payload: Record<string, any> }> = [],\n _pending_identify_calls: Array<{ userId: string; traits?: Record<string, any> }> = [],\n _storage_cache_processed = false\n\n const processStorageCache = () => {\n if (_storage_cache_processed) return\n if (!_rudderstack?.has_initialized) return\n\n _storage_cache_processed = true\n\n try {\n const storedEvents = getCachedEvents()\n if (storedEvents.length > 0) {\n log(`processStorageCache | replaying ${storedEvents.length} cached event(s)`, storedEvents)\n storedEvents.forEach(event => {\n const cleaned_properties = cleanObject(event.properties)\n _rudderstack?.track(event.name, cleaned_properties)\n })\n clearCachedEvents()\n }\n\n const storedPages = getCachedPageViews()\n if (storedPages.length > 0) {\n log(`processStorageCache | replaying ${storedPages.length} cached page view(s)`, storedPages)\n storedPages.forEach(page => {\n _rudderstack?.pageView(page.name, 'Deriv App', getId(), page.properties)\n })\n clearCachedPageViews()\n }\n } catch (err) {\n console.warn('Analytics: Failed to process storage cache', err)\n }\n }\n\n const onSdkLoaded = () => {\n log('onSdkLoaded | RudderStack SDK loaded')\n processStorageCache()\n\n if (_pending_identify_calls.length > 0) {\n log(`onSdkLoaded | flushing ${_pending_identify_calls.length} pending identify call(s)`)\n }\n _pending_identify_calls.forEach(({ userId, traits }) => {\n if (userId) {\n _rudderstack?.identifyEvent(userId, traits)\n }\n })\n _pending_identify_calls = []\n }\n\n /**\n * Initializes the analytics instance with specified provider configurations.\n * This method should be called before tracking any events.\n *\n * Features:\n * - Lazy-loads providers (GrowthBook, PostHog) only when configured\n * - Automatically fetches user's country for GrowthBook targeting\n * - Processes any cached events from previous sessions\n * - Sets up event tracking callback for GrowthBook experiments\n *\n * @param {Options} options - Configuration options for analytics providers\n * @returns {Promise<void>} Resolves when initialization is complete\n *\n * @example\n * ```typescript\n * await analytics.initialise({\n * rudderstackKey: 'YOUR_RS_KEY',\n * growthbookKey: 'YOUR_GB_KEY',\n * growthbookDecryptionKey: 'YOUR_GB_DECRYPT_KEY',\n * posthogOptions: {\n * apiKey: 'YOUR_POSTHOG_API_KEY',\n * config: {\n * session_recording: {\n * recordCrossOriginIframes: true,\n * minimumDurationMilliseconds: 30000\n * }\n * }\n * }\n * });\n * ```\n */\n const initialise = async ({\n growthbookKey,\n growthbookDecryptionKey,\n rudderstackKey,\n growthbookOptions,\n posthogOptions,\n debug,\n }: Options) => {\n if (debug !== undefined) _debug = debug\n\n log('initialise | starting analytics initialization', {\n rudderstack: !!rudderstackKey,\n growthbook: !!growthbookKey,\n posthog: !!posthogOptions,\n })\n\n try {\n // Only fetch country if GrowthBook is enabled and country not provided\n const country = growthbookOptions?.attributes?.country || (growthbookKey ? await getCountry() : undefined)\n\n if (rudderstackKey) {\n log('initialise | initializing RudderStack')\n _rudderstack = RudderStack.getRudderStackInstance(rudderstackKey, onSdkLoaded, _debug)\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 = (attributes: Record<string, any>) => {\n log('setAttributes | received attributes', attributes)\n\n const { user_id, ...rest } = attributes\n const user_identity = user_id ?? getId()\n\n if (_growthbook) {\n const config: TGrowthbookAttributes = { ...rest }\n if (user_id && !isUUID(user_id)) config.user_id = user_id\n if (user_identity) {\n config.id = user_identity\n config.user_id = user_identity\n }\n log('setAttributes | called GrowthBook setAttributes', config)\n _growthbook.setAttributes(config)\n }\n\n core_data = {\n ...core_data,\n ...Object.fromEntries(Object.entries(rest).filter(([, v]) => v !== undefined)),\n ...(user_id !== undefined && !isUUID(user_id) && { user_id }),\n }\n\n log('setAttributes | updated core_data', core_data)\n }\n\n const getFeatureState = (id: string) => _growthbook?.getFeatureState(id)?.experimentResult?.name\n\n const getFeatureValue = <K extends keyof GrowthbookConfigs, V extends GrowthbookConfigs[K]>(\n id: K,\n defaultValue: V\n ) => _growthbook?.getFeatureValue(id as string, defaultValue)\n\n const getGrowthbookStatus = async () => await _growthbook?.getStatus()\n const isFeatureOn = (key: string) => _growthbook?.isOn(key)\n const setUrl = (href: string) => _growthbook?.setUrl(href)\n\n const getId = () => {\n const userId = _rudderstack?.getUserId() || ''\n return userId && !isUUID(userId) ? userId : ''\n }\n\n const getAnonymousId = () => _rudderstack?.getAnonymousId() || ''\n\n /**\n * Tracks a page view event.\n *\n * Features:\n * - Automatically includes user ID if available\n * - Caches page views when offline or provider not initialized\n *\n * @param {string} current_page - The current page URL or path\n * @param {string} [platform='Deriv App'] - The platform name\n * @param {Record<string, unknown>} [properties] - Additional page properties\n *\n * @example\n * ```typescript\n * analytics.pageView('/dashboard');\n * analytics.pageView('/trade', 'Deriv Trader', { section: 'multipliers' });\n * ```\n */\n const pageView = (current_page: string, platform = 'Deriv App', properties?: Record<string, unknown>) => {\n const userId = getId()\n\n log('pageView | called', { current_page, platform, properties, userId })\n\n // Handle RudderStack pageView independently\n if (_rudderstack?.has_initialized) {\n log('pageView | sending page view to RudderStack', { current_page, platform })\n _rudderstack.pageView(current_page, platform, userId, properties)\n } else {\n log('pageView | RudderStack not initialized — caching page view to localStorage', { current_page })\n cachePageViewToStorage(current_page, { platform, ...properties })\n }\n\n // PostHog handles page views automatically via autocapture\n // No need to manually send page views to PostHog\n }\n\n /**\n * Identifies a user across analytics platforms.\n * This method should be called after user login or when user identity is known.\n *\n * Features:\n * - Queues identify calls if provider not yet initialized\n * - Allows custom traits for each provider or shared traits for both\n * - Identifies user in PostHog if configured\n *\n * @param {string} [user_id] - The user ID to identify. If not provided, uses stored user ID\n * @param {Record<string, any>} [traits] - Optional traits to send to both providers, or provider-specific traits\n *\n * @example\n * ```typescript\n * // Simple identify\n * analytics.identifyEvent('CR123456');\n *\n * // Identify with same traits for both providers\n * analytics.identifyEvent('CR123456', {\n * language: 'en',\n * country_of_residence: 'US'\n * });\n *\n * // Identify with provider-specific traits\n * analytics.identifyEvent('CR123456', {\n * rudderstack: { language: 'en', custom_field: 'value' },\n * posthog: { language: 'en', country_of_residence: 'US' }\n * });\n * ```\n */\n const identifyEvent = (user_id?: string, traits?: Record<string, any>) => {\n const stored_user_id = user_id || getId()\n if (!stored_user_id) {\n log('identifyEvent | skipped — no user_id available')\n return\n }\n\n log('identifyEvent | called', { user_id: stored_user_id, traits })\n\n // Strip PII: replace raw email with is_internal flag\n const sanitizePII = (t?: Record<string, any>) => {\n if (!t) return t\n const { email, ...safe } = t\n return { ...safe, ...(email && { is_internal: isInternalEmail(email) }) }\n }\n\n // Check if traits has provider-specific structure\n const hasProviderStructure = traits?.rudderstack !== undefined || traits?.posthog !== undefined\n let rudderstackTraits, posthogTraits\n if (hasProviderStructure) {\n // Merge shared top-level props with provider-specific ones (provider-specific wins on conflict)\n const { rudderstack, posthog, ...sharedTraits } = traits as any\n rudderstackTraits = sanitizePII({ ...sharedTraits, ...rudderstack })\n posthogTraits = sanitizePII({ ...sharedTraits, ...posthog })\n } else {\n rudderstackTraits = sanitizePII(traits)\n posthogTraits = sanitizePII(traits)\n }\n\n // Handle RudderStack identification independently\n if (_rudderstack) {\n if (_rudderstack.has_initialized) {\n log('identifyEvent | calling RudderStack identify', {\n user_id: stored_user_id,\n traits: rudderstackTraits,\n })\n _rudderstack.identifyEvent(stored_user_id, rudderstackTraits)\n } else {\n if (!_pending_identify_calls.some(call => call.userId === stored_user_id)) {\n log('identifyEvent | RudderStack not initialized — queuing identify call', {\n user_id: stored_user_id,\n })\n _pending_identify_calls.push({ userId: stored_user_id, traits: rudderstackTraits })\n }\n }\n }\n\n // Handle PostHog identification independently\n if (_posthog?.has_initialized) {\n log('identifyEvent | calling PostHog identify', { user_id: stored_user_id, traits: posthogTraits })\n _posthog.identifyEvent(stored_user_id, posthogTraits as TPosthogIdentifyTraits)\n }\n }\n\n const reset = () => {\n log('reset | resetting all providers')\n // Reset each provider independently\n if (_rudderstack?.has_initialized) {\n log('reset | resetting RudderStack')\n _rudderstack.reset()\n }\n if (_posthog?.has_initialized) {\n log('reset | resetting PostHog')\n _posthog.reset()\n }\n }\n\n /**\n * Tracks a custom event with associated data.\n *\n * Features:\n * - Automatically enriches events with core attributes\n * - RudderStack: Caches events when offline or not initialized\n * - PostHog: Sends immediately if initialized (has built-in caching)\n * - Respects feature flag configurations\n * - Each provider works independently - one failing won't affect the other\n *\n * @param {string} event - The event name to track\n * @param {Record<string, any>} analytics_data - The event data payload\n */\n const trackEvent = (event: string, analytics_data: Record<string, any>) => {\n const userId = getId()\n\n log('trackEvent | called', { event, analytics_data, userId, core_data })\n\n const final_payload = {\n ...core_data,\n ...analytics_data,\n ...(userId && !core_data.user_id && { user_id: userId }),\n }\n\n log('trackEvent | built payload', { event, final_payload })\n\n const shouldTrack = !(event in tracking_config) || tracking_config[event as string]\n if (!shouldTrack) {\n log('trackEvent | skipped — event disabled by tracking_config', { event })\n return\n }\n\n // Handle RudderStack independently\n const hasRudderstackInitialized = _rudderstack?.has_initialized\n if (!navigator.onLine || !hasRudderstackInitialized) {\n if (!hasRudderstackInitialized) {\n log('trackEvent | RudderStack not initialized — caching event to localStorage', { event })\n cacheEventToStorage(event as string, final_payload)\n } else {\n log('trackEvent | offline — caching event to memory', { event })\n offline_event_cache.push({ event, payload: final_payload })\n }\n } else {\n // Send cached events to RudderStack\n if (offline_event_cache.length > 0) {\n log(`trackEvent | flushing ${offline_event_cache.length} offline cached event(s) to RudderStack`)\n offline_event_cache.forEach(cache => {\n const cleaned_cache_payload = cleanObject(cache.payload)\n _rudderstack?.track(cache.event, cleaned_cache_payload)\n })\n offline_event_cache = []\n }\n\n // Send current event to RudderStack\n const cleaned_payload = cleanObject(final_payload)\n log('trackEvent | sending event to RudderStack', { event, payload: cleaned_payload })\n _rudderstack?.track(event, cleaned_payload)\n }\n\n // Handle PostHog independently - send immediately if initialized\n if (_posthog?.has_initialized) {\n const posthog_payload = cleanObject(flattenObject(final_payload))\n log('trackEvent | sending event to PostHog', { event, payload: posthog_payload })\n _posthog.capture(event as string, posthog_payload)\n }\n }\n\n /**\n * Ensures client_id is set in PostHog stored person properties.\n * Call this when the user ID is available and PostHog is loaded.\n * Useful for backfilling client_id for users identified in previous sessions.\n * No-op if client_id is already present or PostHog is not initialized.\n *\n * @param params.user_id - The user ID to use as client_id\n * @param params.email - The user's email, used to determine is_internal\n * @param params.language - The user's language (BCP 47 tag, e.g. \"en-GB\")\n * @param params.country_of_residence - The user's country of residence\n *\n * @example\n * ```typescript\n * if (window.posthog?.__loaded && userId) {\n * analytics.backfillPersonProperties({ user_id: userId, email, language, country_of_residence })\n * }\n * ```\n */\n const backfillPersonProperties = ({\n user_id,\n email,\n language,\n country_of_residence,\n }: {\n user_id: string\n email?: string\n language?: string\n country_of_residence?: string\n }): void => {\n log('backfillPersonProperties | called', { user_id })\n if (_posthog?.has_initialized) {\n log('backfillPersonProperties | backfilling person properties in PostHog', { user_id })\n _posthog.backfillPersonProperties({ user_id, email, language, country_of_residence })\n } else {\n log('backfillPersonProperties | skipped — PostHog not initialized')\n }\n }\n\n const getInstances = () => ({ ab: _growthbook, tracking: _rudderstack, posthog: _posthog })\n\n /**\n * Check whether a PostHog feature flag is enabled for the current user.\n * Returns undefined if PostHog is not initialized.\n */\n const isPosthogFeatureEnabled = (key: string): boolean | undefined => _posthog?.isFeatureEnabled(key)\n\n /**\n * Get the value of a PostHog feature flag.\n * Returns a string variant for multivariate flags, true/false for boolean flags,\n * or undefined if the flag does not exist or PostHog is not initialized.\n */\n const getPosthogFeatureFlag = (key: string): string | boolean | undefined => _posthog?.getFeatureFlag(key)\n\n /**\n * Get the JSON payload attached to a PostHog feature flag.\n * Returns undefined if the flag has no payload or PostHog is not initialized.\n */\n const getPosthogFeatureFlagPayload = (\n key: string\n ): string | number | boolean | null | Record<string, unknown> | unknown[] | undefined =>\n _posthog?.getFeatureFlagPayload(key)\n\n /**\n * Get all currently active PostHog feature flags and their values.\n * Returns an empty object if PostHog is not initialized.\n */\n const getPosthogAllFlags = (): Record<string, string | boolean> => _posthog?.getAllFlags() ?? {}\n\n /**\n * Subscribe to PostHog feature flag changes.\n * The callback fires immediately with current flags and again whenever flags are reloaded.\n * Returns an unsubscribe function — call it to stop listening.\n */\n const onPosthogFeatureFlags = (\n callback: (flags: string[], variants: Record<string, string | boolean>) => void\n ): (() => void) => _posthog?.onFeatureFlags(callback) ?? (() => {})\n\n /**\n * Force PostHog to reload feature flags from the server.\n * Useful after attribute/identity changes that may affect flag targeting.\n */\n const reloadPosthogFeatureFlags = (): void => _posthog?.reloadFeatureFlags()\n\n const AnalyticsInstance = {\n initialise,\n setAttributes,\n identifyEvent,\n backfillPersonProperties,\n getFeatureState,\n getFeatureValue,\n getGrowthbookStatus,\n isFeatureOn,\n setUrl,\n getId,\n getAnonymousId,\n trackEvent,\n getInstances,\n pageView,\n reset,\n isPosthogFeatureEnabled,\n getPosthogFeatureFlag,\n getPosthogFeatureFlagPayload,\n getPosthogAllFlags,\n onPosthogFeatureFlags,\n reloadPosthogFeatureFlags,\n }\n\n if (typeof window !== 'undefined') {\n window.AnalyticsInstance = AnalyticsInstance\n }\n\n return AnalyticsInstance\n}\n\nexport const Analytics = createAnalyticsInstance()\n"]}