onerway-analytics 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/bundle/index.js +1361 -0
  2. package/dist/bundle/index.js.map +7 -0
  3. package/dist/core/analytics.d.ts +45 -0
  4. package/dist/core/analytics.d.ts.map +1 -0
  5. package/dist/core/analytics.js +369 -0
  6. package/dist/core/analytics.test.d.ts +2 -0
  7. package/dist/core/analytics.test.d.ts.map +1 -0
  8. package/dist/core/analytics.test.js +169 -0
  9. package/dist/core/auto-track.d.ts +6 -0
  10. package/dist/core/auto-track.d.ts.map +1 -0
  11. package/dist/core/auto-track.js +126 -0
  12. package/dist/core/context-collector.d.ts +4 -0
  13. package/dist/core/context-collector.d.ts.map +1 -0
  14. package/dist/core/context-collector.js +42 -0
  15. package/dist/core/error-monitor.d.ts +5 -0
  16. package/dist/core/error-monitor.d.ts.map +1 -0
  17. package/dist/core/error-monitor.js +61 -0
  18. package/dist/core/ga-adapter.d.ts +12 -0
  19. package/dist/core/ga-adapter.d.ts.map +1 -0
  20. package/dist/core/ga-adapter.js +35 -0
  21. package/dist/core/ga-loader.d.ts +10 -0
  22. package/dist/core/ga-loader.d.ts.map +1 -0
  23. package/dist/core/ga-loader.js +30 -0
  24. package/dist/core/ga-manager.d.ts +24 -0
  25. package/dist/core/ga-manager.d.ts.map +1 -0
  26. package/dist/core/ga-manager.js +64 -0
  27. package/dist/core/performance-monitor.d.ts +5 -0
  28. package/dist/core/performance-monitor.d.ts.map +1 -0
  29. package/dist/core/performance-monitor.js +43 -0
  30. package/dist/core/sender.d.ts +10 -0
  31. package/dist/core/sender.d.ts.map +1 -0
  32. package/dist/core/sender.js +65 -0
  33. package/dist/core/session-manager.d.ts +13 -0
  34. package/dist/core/session-manager.d.ts.map +1 -0
  35. package/dist/core/session-manager.js +54 -0
  36. package/dist/core/storage.d.ts +9 -0
  37. package/dist/core/storage.d.ts.map +1 -0
  38. package/dist/core/storage.js +48 -0
  39. package/dist/index.d.ts +16 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +11 -0
  42. package/dist/types/index.d.ts +162 -0
  43. package/dist/types/index.d.ts.map +1 -0
  44. package/dist/types/index.js +28 -0
  45. package/dist/utils/index.d.ts +30 -0
  46. package/dist/utils/index.d.ts.map +1 -0
  47. package/dist/utils/index.js +216 -0
  48. package/package.json +47 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/index.ts", "../../src/types/index.ts", "../../src/utils/index.ts", "../../src/core/session-manager.ts", "../../src/core/sender.ts", "../../src/core/storage.ts", "../../src/core/context-collector.ts", "../../src/core/auto-track.ts", "../../src/core/error-monitor.ts", "../../src/core/ga-loader.ts", "../../node_modules/web-vitals/dist/web-vitals.js", "../../src/core/performance-monitor.ts", "../../src/core/ga-adapter.ts", "../../src/core/ga-manager.ts", "../../src/core/analytics.ts"],
4
+ "sourcesContent": ["export { Analytics, createAnalytics } from './core/analytics';\r\nexport { Sender } from './core/sender';\r\nexport { StorageQueue } from './core/storage';\r\nexport { SessionManager } from './core/session-manager';\r\nexport { initAutoTrack } from './core/auto-track';\r\nexport type { AutoTrackAPI } from './core/auto-track';\r\nexport { initErrorMonitor } from './core/error-monitor';\r\nexport type { ErrorMonitorAPI } from './core/error-monitor';\r\nexport { GAManager } from './core/ga-manager';\r\nexport { initPerformanceMonitor } from './core/performance-monitor';\r\nexport type { PerformanceMonitorAPI } from './core/performance-monitor';\r\nexport { collectContext, collectMarketing } from './core/context-collector';\r\n\r\nexport type {\r\n AnalyticsConfig,\r\n AnalyticsPayload,\r\n EventPayload,\r\n EventProperties,\r\n EventContext,\r\n ContextPayload,\r\n MarketingPayload,\r\n BrowserInfo,\r\n OSInfo,\r\n TrackOptions,\r\n TrackEvent,\r\n QueueItem,\r\n UserProfile,\r\n Environment,\r\n PerformanceConfig,\r\n GAConfig,\r\n GAConsentMode,\r\n GAConsentParams,\r\n} from './types';\r\n\r\nexport {\r\n API_KEY_MAP,\r\n SDK_VERSION,\r\n DEFAULT_CONFIG,\r\n STORAGE_KEYS,\r\n} from './types';\r\n\r\nexport {\r\n generateUUID,\r\n generateId,\r\n getTimestamp,\r\n isObject,\r\n merge,\r\n detectBrowser,\r\n detectOS,\r\n getDeviceType,\r\n getScreenSize,\r\n getPageUrl,\r\n getReferrer,\r\n getHostname,\r\n getTimezone,\r\n getLanguage,\r\n getCountryFromLanguage,\r\n parseUTMParams,\r\n isBrowser,\r\n truncateText,\r\n} from './utils';\r\n", "export type Environment = 'beta' | 'development' | 'test' | 'testing' | 'sit' | 'uat' | 'prod' | 'production';\r\n\r\nexport interface BrowserInfo {\r\n name: string;\r\n version: string;\r\n}\r\n\r\nexport interface OSInfo {\r\n name: string;\r\n version: string;\r\n}\r\n\r\nexport interface ContextPayload {\r\n sdk_version: string;\r\n app_key: string;\r\n screen_width: number;\r\n screen_height: number;\r\n user_agent: string;\r\n referrer: string;\r\n hostname: string;\r\n browser: BrowserInfo;\r\n operating_system: OSInfo;\r\n device_type: 'mobile' | 'tablet' | 'desktop';\r\n country: string;\r\n language: string;\r\n merchant_language: string;\r\n timezone: string;\r\n client_type: string;\r\n}\r\n\r\nexport interface MarketingPayload {\r\n utm_source?: string;\r\n utm_medium?: string;\r\n utm_campaign?: string;\r\n utm_term?: string;\r\n utm_content?: string;\r\n landing_page?: string;\r\n referrer_url?: string;\r\n}\r\n\r\nexport interface EventProperties {\r\n system?: string;\r\n domain?: string;\r\n scene?: string;\r\n action?: string;\r\n target_type?: string;\r\n target_id?: string;\r\n page_url?: string;\r\n flow_id?: string;\r\n entity_type?: string;\r\n entity_id?: string;\r\n status?: string;\r\n response_code?: string;\r\n response_msg?: string;\r\n duration_ms?: number;\r\n request_id?: string;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface EventContext {\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface EventPayload {\r\n event_id: string;\r\n event_name: string;\r\n batch_event_index: number;\r\n batch_ordering_id: string;\r\n batch_page_id: string;\r\n timestamp: number;\r\n key_event: boolean;\r\n event_properties: EventProperties;\r\n context?: EventContext;\r\n}\r\n\r\nexport interface AnalyticsPayload {\r\n client_id: string;\r\n user_id?: string;\r\n session_id: string;\r\n user_properties?: Record<string, unknown>;\r\n context: ContextPayload;\r\n marketing: MarketingPayload;\r\n events: EventPayload[];\r\n}\r\n\r\nexport interface PerformanceConfig {\r\n enabled?: boolean;\r\n}\r\n\r\nexport type GAConsentMode = 'default' | 'update';\r\n\r\nexport interface GAConsentParams {\r\n ad_storage?: 'granted' | 'denied';\r\n analytics_storage?: 'granted' | 'denied';\r\n ad_user_data?: 'granted' | 'denied';\r\n ad_personalization?: 'granted' | 'denied';\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface GAConfig {\r\n measurementId: string;\r\n enabled: boolean;\r\n sendPageView?: boolean;\r\n debugMode?: boolean;\r\n}\r\n\r\nexport interface AnalyticsConfig {\r\n appKey?: string;\r\n serverUrl: string;\r\n apiKey?: string;\r\n env?: Environment;\r\n debug?: boolean;\r\n autoTrack?: boolean;\r\n system?: string;\r\n domain?: string;\r\n keyEvents?: string[];\r\n bufferFlushInterval?: number;\r\n bufferMaxSize?: number;\r\n maxRetryCount?: number;\r\n sessionTimeout?: number;\r\n autoTrackSelector?: string;\r\n performance?: PerformanceConfig;\r\n ga?: GAConfig;\r\n\r\n /** @deprecated use appKey instead */\r\n appId?: string;\r\n}\r\n\r\nexport interface TrackOptions {\r\n keyEvent?: boolean;\r\n}\r\n\r\nexport interface UserProfile {\r\n userId?: string;\r\n anonymousId?: string;\r\n attributes?: Record<string, unknown>;\r\n}\r\n\r\n/** @deprecated use EventPayload instead */\r\nexport interface TrackEvent {\r\n event: string;\r\n properties?: Record<string, unknown>;\r\n timestamp?: number;\r\n}\r\n\r\n/** @deprecated use AnalyticsPayload instead */\r\nexport interface QueueItem {\r\n id: string;\r\n event: TrackEvent;\r\n retryCount: number;\r\n}\r\n\r\nexport interface StorageQueueItem {\r\n event: EventPayload;\r\n storedAt: number;\r\n}\r\n\r\nexport interface RetryEntry {\r\n events: EventPayload[];\r\n retryCount: number;\r\n timer: ReturnType<typeof setTimeout> | null;\r\n}\r\n\r\nexport const API_KEY_MAP: Record<string, string> = {\r\n beta: '5skbadERCne5HKSS9a1EXz5RetUiEfpP',\r\n development: '5skbadERCne5HKSS9a1EXz5RetUiEfpP',\r\n test: 'Dguh5yxNDEwyQlqDmikmd7ImruaOp8c8',\r\n testing: 'Dguh5yxNDEwyQlqDmikmd7ImruaOp8c8',\r\n sit: 'Dguh5yxNDEwyQlqDmikmd7ImruaOp8c8',\r\n uat: 'W565QolX6clTuL1Kqgpp0JmUqBkWKY6i',\r\n prod: 'HUk5Kogyuv9zH5qDA2qSCjVEnhanSkf8',\r\n production: 'HUk5Kogyuv9zH5qDA2qSCjVEnhanSkf8',\r\n};\r\n\r\nexport const SDK_VERSION = '1.0.0';\r\n\r\nexport const DEFAULT_CONFIG = {\r\n debug: false,\r\n autoTrack: true,\r\n bufferFlushInterval: 5000,\r\n bufferMaxSize: 25,\r\n maxRetryCount: 3,\r\n sessionTimeout: 30 * 60 * 1000,\r\n clientType: 'WEB',\r\n merchantLanguage: 'en',\r\n} as const;\r\n\r\nexport const STORAGE_KEYS = {\r\n FAILED_QUEUE: '__analytics_failed_queue__',\r\n CLIENT_ID: '__analytics_client_id__',\r\n LANDING_PAGE: '__analytics_landing_page__',\r\n REFERRER_URL: '__analytics_referrer_url__',\r\n} as const;\r\n\r\nexport const MAX_STORAGE_ITEMS = 500;\r\n", "import { BrowserInfo, OSInfo } from '../types';\r\n\r\nexport function generateId(): string {\r\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\r\n}\r\n\r\nexport function getTimestamp(): number {\r\n return Date.now();\r\n}\r\n\r\nexport function isObject(value: unknown): value is Record<string, unknown> {\r\n return Object.prototype.toString.call(value) === '[object Object]';\r\n}\r\n\r\nexport function merge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {\r\n const result = { ...target };\r\n for (const key in source) {\r\n if (Object.prototype.hasOwnProperty.call(source, key)) {\r\n result[key] = source[key] as T[Extract<keyof T, string>];\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nexport function generateUUID(): string {\r\n const hex = '0123456789abcdef';\r\n const template = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';\r\n return template.replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return hex[v];\r\n });\r\n}\r\n\r\nexport function generateShortId(): string {\r\n return Math.random().toString(36).substring(2, 10);\r\n}\r\n\r\nexport function detectBrowser(): BrowserInfo {\r\n if (typeof navigator === 'undefined') return { name: 'Unknown', version: '0' };\r\n\r\n const ua = navigator.userAgent;\r\n const edgeMatch = ua.match(/Edg\\/(\\d+)/);\r\n if (edgeMatch) return { name: 'Edge', version: edgeMatch[1] };\r\n\r\n const chromeMatch = ua.match(/Chrome\\/(\\d+)/);\r\n const safariMatch = ua.match(/Safari\\/(\\d+)/);\r\n\r\n if (chromeMatch && !ua.includes('Edg') && !ua.includes('OPR')) {\r\n return { name: 'Chrome', version: chromeMatch[1] };\r\n }\r\n\r\n const firefoxMatch = ua.match(/Firefox\\/(\\d+)/);\r\n if (firefoxMatch) return { name: 'Firefox', version: firefoxMatch[1] };\r\n\r\n const opMatch = ua.match(/OPR\\/(\\d+)/);\r\n if (opMatch) return { name: 'Opera', version: opMatch[1] };\r\n\r\n if (safariMatch && !ua.includes('Chrome')) {\r\n const versionMatch = ua.match(/Version\\/(\\d+)/);\r\n return { name: 'Safari', version: versionMatch ? versionMatch[1] : safariMatch[1] };\r\n }\r\n\r\n const ieMatch = ua.match(/(?:MSIE |Trident\\/.*; rv:)(\\d+)/);\r\n if (ieMatch) return { name: 'IE', version: ieMatch[1] };\r\n\r\n return { name: 'Unknown', version: '0' };\r\n}\r\n\r\nexport function detectOS(): OSInfo {\r\n if (typeof navigator === 'undefined') return { name: 'Unknown', version: '0' };\r\n\r\n const ua = navigator.userAgent;\r\n const platform = navigator.platform || '';\r\n\r\n if (ua.includes('Windows NT 10')) return { name: 'Windows', version: '10' };\r\n if (ua.includes('Windows NT 6.3')) return { name: 'Windows', version: '8.1' };\r\n if (ua.includes('Windows NT 6.2')) return { name: 'Windows', version: '8' };\r\n if (ua.includes('Windows NT 6.1')) return { name: 'Windows', version: '7' };\r\n if (/Windows NT \\d/.test(ua)) return { name: 'Windows', version: ua.match(/Windows NT (\\d+\\.?\\d*)/)?.[1] || '0' };\r\n\r\n const macMatch = ua.match(/Mac OS X (\\d+[._]\\d+)/);\r\n if (macMatch) return { name: 'macOS', version: macMatch[1].replace('_', '.') };\r\n\r\n if (platform.startsWith('Mac')) return { name: 'macOS', version: '0' };\r\n\r\n if (/Android (\\d+\\.?\\d*)/.test(ua)) return { name: 'Android', version: ua.match(/Android (\\d+\\.?\\d*)/)?.[1] || '0' };\r\n\r\n if (/iPhone|iPad|iPod/.test(ua)) {\r\n const iosMatch = ua.match(/OS (\\d+[._]\\d+)/);\r\n return { name: 'iOS', version: iosMatch ? iosMatch[1].replace('_', '.') : '0' };\r\n }\r\n\r\n if (/Linux/.test(ua) || platform.includes('Linux')) return { name: 'Linux', version: '0' };\r\n\r\n return { name: 'Unknown', version: '0' };\r\n}\r\n\r\nexport function getDeviceType(): 'mobile' | 'tablet' | 'desktop' {\r\n if (typeof window === 'undefined' || typeof navigator === 'undefined') return 'desktop';\r\n\r\n const width = window.screen.width;\r\n const hasTouch = navigator.maxTouchPoints > 0;\r\n\r\n if (width < 768 && hasTouch) return 'mobile';\r\n if (width >= 768 && width <= 1024 && hasTouch) return 'tablet';\r\n return 'desktop';\r\n}\r\n\r\nexport function getScreenSize(): { width: number; height: number } {\r\n if (typeof window === 'undefined') return { width: 0, height: 0 };\r\n return {\r\n width: window.screen.width,\r\n height: window.screen.height,\r\n };\r\n}\r\n\r\nexport function getPageUrl(): string {\r\n if (typeof window === 'undefined') return '';\r\n return window.location.href;\r\n}\r\n\r\nexport function getReferrer(): string {\r\n if (typeof document === 'undefined') return '';\r\n return document.referrer || '';\r\n}\r\n\r\nexport function getHostname(): string {\r\n if (typeof window === 'undefined') return '';\r\n return window.location.host.split(':')[0];\r\n}\r\n\r\nexport function getTimezone(): string {\r\n try {\r\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n } catch {\r\n return 'UTC';\r\n }\r\n}\r\n\r\nexport function getLanguage(): string {\r\n if (typeof navigator === 'undefined') return 'en-US';\r\n return navigator.language || 'en-US';\r\n}\r\n\r\nexport function getCountryFromLanguage(language: string): string {\r\n const parts = language.split('-');\r\n if (parts.length > 1) return parts[1].toUpperCase();\r\n const langMap: Record<string, string> = {\r\n zh: 'CN', en: 'US', ja: 'JP', ko: 'KR', fr: 'FR',\r\n de: 'DE', es: 'ES', pt: 'BR', ru: 'RU', ar: 'SA',\r\n };\r\n return langMap[parts[0]] || parts[0].toUpperCase();\r\n}\r\n\r\nexport function parseUTMParams(): Record<string, string> {\r\n if (typeof window === 'undefined') return {};\r\n\r\n const params: Record<string, string> = {};\r\n const searchParams = new URLSearchParams(window.location.search);\r\n const utmKeys = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];\r\n\r\n for (const key of utmKeys) {\r\n const value = searchParams.get(key);\r\n if (value) params[key] = value;\r\n }\r\n\r\n return params;\r\n}\r\n\r\nexport function isBrowser(): boolean {\r\n return typeof window !== 'undefined' && typeof document !== 'undefined';\r\n}\r\n\r\nexport function safeLocalStorageGet(key: string): string | null {\r\n try {\r\n return localStorage.getItem(key);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function safeLocalStorageSet(key: string, value: string): boolean {\r\n try {\r\n localStorage.setItem(key, value);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function safeLocalStorageRemove(key: string): void {\r\n try {\r\n localStorage.removeItem(key);\r\n } catch {\r\n // ignore\r\n }\r\n}\r\n\r\nexport function safeSessionStorageGet(key: string): string | null {\r\n try {\r\n return sessionStorage.getItem(key);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function safeSessionStorageSet(key: string, value: string): boolean {\r\n try {\r\n sessionStorage.setItem(key, value);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function safeSessionStorageRemove(key: string): void {\r\n try {\r\n sessionStorage.removeItem(key);\r\n } catch {\r\n // ignore\r\n }\r\n}\r\n\r\nexport function truncateText(text: string, maxLength: number): string {\r\n if (!text) return '';\r\n const trimmed = text.trim().replace(/\\s+/g, ' ');\r\n return trimmed.length > maxLength ? trimmed.substring(0, maxLength) + '...' : trimmed;\r\n}\r\n", "import { generateUUID, safeSessionStorageGet, safeSessionStorageSet, safeSessionStorageRemove } from '../utils';\r\n\r\nconst SESSION_KEY = '__analytics_session__';\r\nconst SESSION_DEFAULT_TIMEOUT = 30 * 60 * 1000;\r\n\r\ninterface SessionData {\r\n sessionId: string;\r\n createdAt: number;\r\n}\r\n\r\nexport class SessionManager {\r\n private sessionId: string;\r\n private createdAt: number = 0;\r\n private timeout: number;\r\n\r\n constructor(timeout: number = SESSION_DEFAULT_TIMEOUT) {\r\n this.timeout = timeout;\r\n const existing = this.loadSession();\r\n if (existing && !this.isExpired(existing)) {\r\n this.sessionId = existing.sessionId;\r\n this.createdAt = existing.createdAt;\r\n } else {\r\n this.sessionId = this.createNewSession();\r\n this.createdAt = Date.now();\r\n }\r\n }\r\n\r\n getSessionId(): string {\r\n if (this.isExpired({ sessionId: this.sessionId, createdAt: this.createdAt })) {\r\n this.sessionId = this.createNewSession();\r\n }\r\n return this.sessionId;\r\n }\r\n\r\n refresh(): void {\r\n this.sessionId = this.createNewSession();\r\n }\r\n\r\n private loadSession(): SessionData | null {\r\n try {\r\n const raw = safeSessionStorageGet(SESSION_KEY);\r\n if (!raw) return null;\r\n return JSON.parse(raw) as SessionData;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private saveSession(): void {\r\n const data: SessionData = {\r\n sessionId: this.sessionId,\r\n createdAt: this.createdAt,\r\n };\r\n safeSessionStorageSet(SESSION_KEY, JSON.stringify(data));\r\n }\r\n\r\n private isExpired(data: SessionData): boolean {\r\n return Date.now() - data.createdAt > this.timeout;\r\n }\r\n\r\n private createNewSession(): string {\r\n const id = generateUUID();\r\n this.createdAt = Date.now();\r\n this.saveSession();\r\n return id;\r\n }\r\n}\r\n", "import { AnalyticsPayload } from '../types';\r\n\r\nexport class Sender {\r\n static async send(payload: AnalyticsPayload, serverUrl: string, apiKey: string): Promise<void> {\r\n if (Sender.supportsKeepalive()) {\r\n return Sender.fetchSend(payload, serverUrl, apiKey);\r\n }\r\n return Sender.xhrSend(payload, serverUrl, apiKey);\r\n }\r\n\r\n static async sendBeacon(payload: AnalyticsPayload, serverUrl: string, apiKey: string): Promise<void> {\r\n if (typeof navigator === 'undefined' || !navigator.sendBeacon) {\r\n throw new Error('sendBeacon not available');\r\n }\r\n\r\n const url = Sender.buildBeaconUrl(serverUrl, apiKey);\r\n const blob = new Blob([JSON.stringify(payload)], { type: 'application/json' });\r\n const success = navigator.sendBeacon(url, blob);\r\n\r\n if (!success) {\r\n throw new Error('sendBeacon rejected payload');\r\n }\r\n }\r\n\r\n static async fetchSend(payload: AnalyticsPayload, serverUrl: string, apiKey: string): Promise<void> {\r\n const response = await fetch(serverUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n apiKey,\r\n },\r\n body: JSON.stringify(payload),\r\n keepalive: true,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n }\r\n\r\n static async xhrSend(payload: AnalyticsPayload, serverUrl: string, apiKey: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open('POST', serverUrl);\r\n xhr.setRequestHeader('Content-Type', 'application/json');\r\n xhr.setRequestHeader('apiKey', apiKey);\r\n xhr.timeout = 10000;\r\n\r\n xhr.onload = () => {\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n resolve();\r\n } else {\r\n reject(new Error(`HTTP ${xhr.status}: ${xhr.statusText}`));\r\n }\r\n };\r\n\r\n xhr.onerror = () => reject(new Error('XHR network error'));\r\n xhr.ontimeout = () => reject(new Error('XHR timeout'));\r\n\r\n xhr.send(JSON.stringify(payload));\r\n });\r\n }\r\n\r\n private static supportsKeepalive(): boolean {\r\n try {\r\n return typeof Request !== 'undefined' && 'keepalive' in Request.prototype;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private static buildBeaconUrl(serverUrl: string, apiKey: string): string {\r\n const separator = serverUrl.includes('?') ? '&' : '?';\r\n return `${serverUrl}${separator}apiKey=${encodeURIComponent(apiKey)}`;\r\n }\r\n}\r\n", "import { EventPayload, StorageQueueItem, STORAGE_KEYS, MAX_STORAGE_ITEMS } from '../types';\r\nimport { safeLocalStorageGet, safeLocalStorageSet, safeLocalStorageRemove } from '../utils';\r\n\r\nexport class StorageQueue {\r\n static enqueue(event: EventPayload): void {\r\n try {\r\n const queue = StorageQueue.readQueue();\r\n queue.push({ event, storedAt: Date.now() });\r\n\r\n while (queue.length > MAX_STORAGE_ITEMS) {\r\n queue.shift();\r\n }\r\n\r\n safeLocalStorageSet(STORAGE_KEYS.FAILED_QUEUE, JSON.stringify(queue));\r\n } catch {\r\n // Silently fail if storage is unavailable\r\n }\r\n }\r\n\r\n static recover(): EventPayload[] {\r\n try {\r\n const queue = StorageQueue.readQueue();\r\n StorageQueue.clear();\r\n\r\n const events = queue.map((item) => item.event);\r\n return events;\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n static clear(): void {\r\n safeLocalStorageRemove(STORAGE_KEYS.FAILED_QUEUE);\r\n }\r\n\r\n static getQueueSize(): number {\r\n return StorageQueue.readQueue().length;\r\n }\r\n\r\n private static readQueue(): StorageQueueItem[] {\r\n try {\r\n const raw = safeLocalStorageGet(STORAGE_KEYS.FAILED_QUEUE);\r\n if (!raw) return [];\r\n const parsed = JSON.parse(raw);\r\n if (!Array.isArray(parsed)) return [];\r\n return parsed;\r\n } catch {\r\n return [];\r\n }\r\n }\r\n}\r\n", "import {\r\n ContextPayload,\r\n MarketingPayload,\r\n SDK_VERSION,\r\n STORAGE_KEYS,\r\n} from '../types';\r\nimport {\r\n detectBrowser,\r\n detectOS,\r\n getDeviceType,\r\n getScreenSize,\r\n getHostname,\r\n getReferrer,\r\n getTimezone,\r\n getLanguage,\r\n getCountryFromLanguage,\r\n parseUTMParams,\r\n safeLocalStorageGet,\r\n safeLocalStorageSet,\r\n isBrowser,\r\n} from '../utils';\r\n\r\nexport function collectContext(appKey: string, merchantLanguage: string, clientType: string): ContextPayload {\r\n const screen = getScreenSize();\r\n\r\n return {\r\n sdk_version: SDK_VERSION,\r\n app_key: appKey,\r\n screen_width: screen.width,\r\n screen_height: screen.height,\r\n user_agent: isBrowser() ? navigator.userAgent : '',\r\n referrer: getReferrer(),\r\n hostname: getHostname(),\r\n browser: detectBrowser(),\r\n operating_system: detectOS(),\r\n device_type: getDeviceType(),\r\n country: getCountryFromLanguage(getLanguage()),\r\n language: getLanguage(),\r\n merchant_language: merchantLanguage,\r\n timezone: getTimezone(),\r\n client_type: clientType,\r\n };\r\n}\r\n\r\nexport function collectMarketing(): MarketingPayload {\r\n if (!isBrowser()) return {};\r\n\r\n const utm = parseUTMParams();\r\n\r\n let landingPage = safeLocalStorageGet(STORAGE_KEYS.LANDING_PAGE);\r\n if (!landingPage) {\r\n landingPage = window.location.href;\r\n safeLocalStorageSet(STORAGE_KEYS.LANDING_PAGE, landingPage);\r\n }\r\n\r\n let referrerUrl = safeLocalStorageGet(STORAGE_KEYS.REFERRER_URL);\r\n if (referrerUrl === null && document.referrer) {\r\n referrerUrl = document.referrer;\r\n safeLocalStorageSet(STORAGE_KEYS.REFERRER_URL, referrerUrl);\r\n }\r\n\r\n return {\r\n ...utm,\r\n landing_page: landingPage || window.location.href,\r\n referrer_url: referrerUrl || '',\r\n };\r\n}\r\n", "import { truncateText } from '../utils';\r\n\r\nconst TRACK_ATTR_PREFIX = 'data-track-';\r\nconst IGNORE_ATTR = 'data-track-ignore';\r\nconst NAME_ATTR = 'data-track-name';\r\nconst PROPS_ATTR = 'data-track-properties';\r\n\r\nexport interface AutoTrackAPI {\r\n track(eventName: string, properties?: Record<string, unknown>): void;\r\n debug?: boolean;\r\n}\r\n\r\nexport function initAutoTrack(api: AutoTrackAPI, selector?: string): void {\r\n if (typeof document === 'undefined') return;\r\n\r\n const handler = (e: Event): void => {\r\n try {\r\n const target = e.target as HTMLElement;\r\n if (!target) return;\r\n\r\n if (shouldIgnoreElement(target)) return;\r\n\r\n if (selector) {\r\n const scope = document.querySelector(selector);\r\n if (scope && !scope.contains(target)) return;\r\n }\r\n\r\n const eventName = getTrackName(target);\r\n const properties = collectElementProperties(target);\r\n\r\n api.track(eventName, properties);\r\n } catch {\r\n // Fail silently to avoid breaking user's page\r\n }\r\n };\r\n\r\n document.addEventListener('click', handler, true);\r\n}\r\n\r\nfunction shouldIgnoreElement(element: HTMLElement): boolean {\r\n let current: HTMLElement | null = element;\r\n while (current) {\r\n if (current.hasAttribute(IGNORE_ATTR)) return true;\r\n current = current.parentElement;\r\n }\r\n return false;\r\n}\r\n\r\nfunction getTrackName(element: HTMLElement): string {\r\n const name = element.getAttribute(NAME_ATTR);\r\n if (name) return name;\r\n\r\n const id = element.id ? `_${element.id}` : '';\r\n const tag = element.tagName.toLowerCase();\r\n return `click_${tag}${id}`;\r\n}\r\n\r\nfunction collectElementProperties(element: HTMLElement): Record<string, unknown> {\r\n const props: Record<string, unknown> = {\r\n action: 'click',\r\n target_type: inferTargetType(element),\r\n target_id: getTargetId(element),\r\n target_tag: element.tagName.toLowerCase(),\r\n target_class: getTruncatedClassName(element),\r\n target_text: truncateText(element.innerText || '', 50),\r\n };\r\n\r\n if (element.hasAttribute('href') || element.closest('a')) {\r\n const anchor = element.closest('a');\r\n if (anchor) {\r\n props.target_href = anchor.getAttribute('href') || '';\r\n }\r\n }\r\n\r\n const customProps = collectDataTrackProps(element);\r\n Object.assign(props, customProps);\r\n\r\n return props;\r\n}\r\n\r\nfunction inferTargetType(element: HTMLElement): string {\r\n const tag = element.tagName.toLowerCase();\r\n if (tag === 'a' || tag === 'button') return 'button';\r\n if (tag === 'input') {\r\n const type = (element as HTMLInputElement).type;\r\n if (type === 'submit' || type === 'button' || type === 'reset') return 'button';\r\n if (type === 'checkbox' || type === 'radio') return 'checkbox';\r\n return 'input';\r\n }\r\n if (tag === 'select') return 'select';\r\n if (tag === 'img') return 'image';\r\n if (tag === 'form') return 'form';\r\n if (tag === 'textarea') return 'input';\r\n return 'element';\r\n}\r\n\r\nfunction getTargetId(element: HTMLElement): string {\r\n if (element.id) return element.id;\r\n\r\n const name = element.getAttribute('name');\r\n if (name) return name;\r\n\r\n const dataTestId = element.getAttribute('data-testid') || element.getAttribute('data-test-id');\r\n if (dataTestId) return dataTestId;\r\n\r\n return '';\r\n}\r\n\r\nfunction getTruncatedClassName(element: HTMLElement): string {\r\n const cls = typeof element.className === 'string' ? element.className : '';\r\n return truncateText(cls, 100);\r\n}\r\n\r\nfunction collectDataTrackProps(element: HTMLElement): Record<string, unknown> {\r\n const props: Record<string, unknown> = {};\r\n const trackName = element.getAttribute(NAME_ATTR);\r\n if (trackName) props.name = trackName;\r\n\r\n const rawProps = element.getAttribute(PROPS_ATTR);\r\n if (rawProps) {\r\n try {\r\n const parsed = JSON.parse(rawProps);\r\n Object.assign(props, parsed);\r\n } catch {\r\n // Invalid JSON, ignore\r\n }\r\n }\r\n\r\n for (const attr of Array.from(element.attributes)) {\r\n if (attr.name.startsWith(TRACK_ATTR_PREFIX) && attr.name !== NAME_ATTR && attr.name !== PROPS_ATTR && attr.name !== IGNORE_ATTR) {\r\n const key = attr.name.replace(TRACK_ATTR_PREFIX, '');\r\n props[key] = attr.value;\r\n }\r\n }\r\n\r\n return props;\r\n}\r\n", "export interface ErrorMonitorAPI {\r\n track(eventName: string, properties?: Record<string, unknown>): void;\r\n}\r\n\r\nexport function initErrorMonitor(api: ErrorMonitorAPI): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n window.addEventListener('error', (event: ErrorEvent) => {\r\n try {\r\n const { message, filename, lineno, colno, error } = event;\r\n\r\n const isResourceError = !message && event.target !== window;\r\n if (isResourceError) return;\r\n\r\n api.track('error_event', {\r\n action: 'error',\r\n target_type: 'system',\r\n error_type: 'window_error',\r\n error_message: message || 'Unknown error',\r\n error_filename: filename || '',\r\n error_lineno: lineno || 0,\r\n error_colno: colno || 0,\r\n error_stack: error instanceof Error ? error.stack : '',\r\n error_name: error instanceof Error ? error.name : '',\r\n });\r\n } catch {\r\n // Fail silently to avoid recursive error reporting\r\n }\r\n });\r\n\r\n window.addEventListener('unhandledrejection', (event: PromiseRejectionEvent) => {\r\n try {\r\n const { reason } = event;\r\n\r\n let errorMessage = 'Unhandled Promise Rejection';\r\n let errorStack = '';\r\n let errorName = 'PromiseRejection';\r\n\r\n if (reason instanceof Error) {\r\n errorMessage = reason.message;\r\n errorStack = reason.stack || '';\r\n errorName = reason.name;\r\n } else if (typeof reason === 'string') {\r\n errorMessage = reason;\r\n } else {\r\n try {\r\n errorMessage = JSON.stringify(reason);\r\n } catch {\r\n errorMessage = String(reason);\r\n }\r\n }\r\n\r\n api.track('error_event', {\r\n action: 'error',\r\n target_type: 'system',\r\n error_type: 'unhandled_rejection',\r\n error_message: errorMessage,\r\n error_stack: errorStack,\r\n error_name: errorName,\r\n });\r\n } catch {\r\n // Fail silently\r\n }\r\n });\r\n}\r\n", "import { GAConfig } from '../types';\n\ndeclare global {\n interface Window {\n gtag: (...args: unknown[]) => void;\n dataLayer: unknown[];\n }\n}\n\nexport function loadGtagScript(measurementId: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if (typeof window !== 'undefined' && typeof window.gtag === 'function') {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.async = true;\n script.src = `https://www.googletagmanager.com/gtag/js?id=${measurementId}`;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load gtag.js'));\n document.head.appendChild(script);\n });\n}\n\nexport async function initGA(config: GAConfig): Promise<void> {\n if (!config.enabled || !config.measurementId) return;\n if (typeof window === 'undefined') return;\n\n await loadGtagScript(config.measurementId);\n\n window.dataLayer = window.dataLayer || [];\n window.gtag = function gtag(...args: unknown[]): void {\n window.dataLayer.push(args);\n };\n\n window.gtag('js', new Date());\n window.gtag('config', config.measurementId, {\n send_page_view: config.sendPageView ?? false,\n debug_mode: config.debugMode ?? false,\n });\n}", "let e=-1;const t=t=>{addEventListener(\"pageshow\",n=>{n.persisted&&(e=n.timeStamp,t(n))},!0)},n=(e,t,n,i)=>{let s,o;return r=>{t.value>=0&&(r||i)&&(o=t.value-(s??0),(o||void 0===s)&&(s=t.value,t.delta=o,t.rating=((e,t)=>e>t[1]?\"poor\":e>t[0]?\"needs-improvement\":\"good\")(t.value,n),e(t)))}},i=e=>{requestAnimationFrame(()=>requestAnimationFrame(e))},s=()=>{const e=performance.getEntriesByType(\"navigation\")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},o=()=>s()?.activationStart??0,r=(t,n=-1)=>{const i=s();let r=\"navigate\";e>=0?r=\"back-forward-cache\":i&&(document.prerendering||o()>0?r=\"prerender\":document.wasDiscarded?r=\"restore\":i.type&&(r=i.type.replace(/_/g,\"-\")));return{name:t,value:n,rating:\"good\",delta:0,entries:[],id:`v5-${Date.now()}-${Math.floor(8999999999999*Math.random())+1e12}`,navigationType:r}},c=new WeakMap;function a(e,t){return c.get(e)||c.set(e,new t),c.get(e)}class d{t;i=0;o=[];h(e){if(e.hadRecentInput)return;const t=this.o[0],n=this.o.at(-1);this.i&&t&&n&&e.startTime-n.startTime<1e3&&e.startTime-t.startTime<5e3?(this.i+=e.value,this.o.push(e)):(this.i=e.value,this.o=[e]),this.t?.(e)}}const h=(e,t,n={})=>{try{if(PerformanceObserver.supportedEntryTypes.includes(e)){const i=new PerformanceObserver(e=>{queueMicrotask(()=>{t(e.getEntries())})});return i.observe({type:e,buffered:!0,...n}),i}}catch{}},f=e=>{let t=!1;return()=>{t||(e(),t=!0)}};let l=-1;const u=new Set,m=()=>\"hidden\"!==document.visibilityState||document.prerendering?1/0:0,g=e=>{if(\"hidden\"===document.visibilityState){if(\"visibilitychange\"===e.type)for(const e of u)e();isFinite(l)||(l=\"visibilitychange\"===e.type?e.timeStamp:0,removeEventListener(\"prerenderingchange\",g,!0))}},p=()=>{if(l<0){const e=o(),n=document.prerendering?void 0:globalThis.performance.getEntriesByType(\"visibility-state\").find(t=>\"hidden\"===t.name&&t.startTime>=e)?.startTime;l=n??m(),addEventListener(\"visibilitychange\",g,!0),addEventListener(\"prerenderingchange\",g,!0),t(()=>{setTimeout(()=>{l=m()})})}return{get firstHiddenTime(){return l},onHidden(e){u.add(e)}}},v=e=>{document.prerendering?addEventListener(\"prerenderingchange\",e,!0):e()},y=[1800,3e3],T=(e,s={})=>{v(()=>{const c=p();let a,d=r(\"FCP\");const f=h(\"paint\",e=>{for(const t of e)\"first-contentful-paint\"===t.name&&(f.disconnect(),t.startTime<c.firstHiddenTime&&(d.value=Math.max(t.startTime-o(),0),d.entries.push(t),a(!0)))});f&&(a=n(e,d,y,s.reportAllChanges),t(t=>{d=r(\"FCP\"),a=n(e,d,y,s.reportAllChanges),i(()=>{d.value=performance.now()-t.timeStamp,a(!0)})}))})},E=[.1,.25],b=(e,s={})=>{const o=p();T(f(()=>{let c,f=r(\"CLS\",0);const l=a(s,d),u=e=>{for(const t of e)l.h(t);l.i>f.value&&(f.value=l.i,f.entries=l.o,c())},m=h(\"layout-shift\",u);m&&(c=n(e,f,E,s.reportAllChanges),o.onHidden(()=>{u(m.takeRecords()),c(!0)}),t(()=>{l.i=0,f=r(\"CLS\",0),c=n(e,f,E,s.reportAllChanges),i(c)}),setTimeout(c))}))};let L=0,P=1/0,_=0;const M=e=>{for(const t of e)t.interactionId&&(P=Math.min(P,t.interactionId),_=Math.max(_,t.interactionId),L=_?(_-P)/7+1:0)};let w;const C=()=>w?L:performance.interactionCount??0,I=()=>{\"interactionCount\"in performance||w||(w=h(\"event\",M,{durationThreshold:0}))};let F=0;class k{l=[];u=new Map;m;p;v(){F=C(),this.l.length=0,this.u.clear()}T(){const e=Math.min(this.l.length-1,Math.floor((C()-F)/50));return this.l[e]}h(e){if(this.m?.(e),!e.interactionId&&\"first-input\"!==e.entryType)return;const t=this.l.at(-1);let n=this.u.get(e.interactionId);if(n||this.l.length<10||e.duration>t.L){if(n?e.duration>n.L?(n.entries=[e],n.L=e.duration):e.duration===n.L&&e.startTime===n.entries[0].startTime&&n.entries.push(e):(n={id:e.interactionId,entries:[e],L:e.duration},this.u.set(n.id,n),this.l.push(n)),this.l.sort((e,t)=>t.L-e.L),this.l.length>10){const e=this.l.splice(10);for(const t of e)this.u.delete(t.id)}this.p?.(n)}}}const A=e=>{const t=globalThis.requestIdleCallback||setTimeout,n=globalThis.cancelIdleCallback||clearTimeout;if(\"hidden\"===document.visibilityState)e();else{const i=f(e);let s=-1;const o=()=>{n(s),i()};addEventListener(\"visibilitychange\",o,{once:!0,capture:!0}),s=t(()=>{removeEventListener(\"visibilitychange\",o,{capture:!0}),i()})}},B=[200,500],S=(e,i={})=>{if(!globalThis.PerformanceEventTiming||!(\"interactionId\"in PerformanceEventTiming.prototype))return;const s=p();v(()=>{I();let o,c=r(\"INP\");const d=a(i,k),f=e=>{A(()=>{for(const t of e)d.h(t);const t=d.T();t&&t.L!==c.value&&(c.value=t.L,c.entries=t.entries,o())})},l=h(\"event\",f,{durationThreshold:i.durationThreshold??40});o=n(e,c,B,i.reportAllChanges),l&&(l.observe({type:\"first-input\",buffered:!0}),s.onHidden(()=>{f(l.takeRecords()),o(!0)}),t(()=>{d.v(),c=r(\"INP\"),o=n(e,c,B,i.reportAllChanges)}))})};class q{m;h(e){this.m?.(e)}}const N=[2500,4e3],x=(e,s={})=>{v(()=>{const c=p();let d,l=r(\"LCP\");const u=a(s,q),m=e=>{s.reportAllChanges||(e=e.slice(-1));for(const t of e)u.h(t),t.startTime<c.firstHiddenTime&&(l.value=Math.max(t.startTime-o(),0),l.entries=[t],d())},g=h(\"largest-contentful-paint\",m);if(g){d=n(e,l,N,s.reportAllChanges);const o=f(()=>{m(g.takeRecords()),g.disconnect(),d(!0)}),c=e=>{e.isTrusted&&(A(o),removeEventListener(e.type,c,{capture:!0}))};for(const e of[\"keydown\",\"click\",\"visibilitychange\"])addEventListener(e,c,{capture:!0});t(t=>{l=r(\"LCP\"),d=n(e,l,N,s.reportAllChanges),i(()=>{l.value=performance.now()-t.timeStamp,d(!0)})})}})},H=[800,1800],O=e=>{document.prerendering?v(()=>O(e)):\"complete\"!==document.readyState?addEventListener(\"load\",()=>O(e),!0):setTimeout(e)},$=(e,i={})=>{let c=r(\"TTFB\"),a=n(e,c,H,i.reportAllChanges);O(()=>{const d=s();d&&(c.value=Math.max(d.responseStart-o(),0),c.entries=[d],a(!0),t(()=>{c=r(\"TTFB\",0),a=n(e,c,H,i.reportAllChanges),a(!0)}))})};export{E as CLSThresholds,y as FCPThresholds,B as INPThresholds,N as LCPThresholds,H as TTFBThresholds,b as onCLS,T as onFCP,S as onINP,x as onLCP,$ as onTTFB};\n", "import {\n onLCP,\n onFCP,\n onCLS,\n onINP,\n onTTFB,\n} from 'web-vitals';\nimport type { MetricType } from 'web-vitals';\n\nimport type { Analytics } from './analytics';\nimport type { PerformanceConfig } from '../types';\n\nexport type PerformanceMonitorAPI = Pick<Analytics, 'track'>;\n\nfunction normalize(value: number, isCLS: boolean): number {\n if (isCLS) {\n return Math.round(value * 10000) / 10000;\n }\n return Math.round(value);\n}\n\nfunction reportMetric(api: PerformanceMonitorAPI, metric: MetricType): void {\n const isCLS = metric.name === 'CLS';\n const properties: Record<string, unknown> = {\n action: 'metric',\n target_type: 'performance',\n metric_name: metric.name,\n metric_value: normalize(metric.value, isCLS),\n metric_rating: metric.rating,\n delta: normalize(metric.delta, isCLS),\n metric_id: metric.id,\n navigation_type: metric.navigationType,\n };\n\n if (metric.name === 'LCP') {\n const entry = metric.entries[metric.entries.length - 1] as LargestContentfulPaint | undefined;\n if (entry) {\n properties.lcp_element = entry.element?.tagName?.toLowerCase() || '';\n properties.lcp_url = entry.url || '';\n properties.lcp_size = entry.size;\n }\n }\n\n api.track('web_vital', properties);\n}\n\nexport function initPerformanceMonitor(\n api: PerformanceMonitorAPI,\n config: PerformanceConfig = {},\n): void {\n if (config.enabled === false) return;\n\n try {\n onLCP((metric) => reportMetric(api, metric));\n onFCP((metric) => reportMetric(api, metric));\n onCLS((metric) => reportMetric(api, metric));\n onINP((metric) => reportMetric(api, metric));\n onTTFB((metric) => reportMetric(api, metric));\n } catch {\n // Web Vitals API not supported in this browser\n }\n}\n", "import { MarketingPayload } from '../types';\n\nexport interface GAEventOptions {\n sessionId: string;\n pageUrl: string;\n referrer: string;\n marketing: MarketingPayload;\n userId?: string | null;\n}\n\nexport function trackToGA(\n eventName: string,\n properties: Record<string, unknown>,\n options: GAEventOptions\n): void {\n if (typeof window === 'undefined' || !window.gtag) return;\n\n const params: Record<string, unknown> = {\n session_id: options.sessionId,\n engagement_time_msec: 100,\n page_location: options.pageUrl,\n page_referrer: options.referrer,\n };\n\n const { marketing, userId } = options;\n if (marketing.utm_source) params.utm_source = marketing.utm_source;\n if (marketing.utm_medium) params.utm_medium = marketing.utm_medium;\n if (marketing.utm_campaign) params.utm_campaign = marketing.utm_campaign;\n if (marketing.utm_term) params.utm_term = marketing.utm_term;\n if (marketing.utm_content) params.utm_content = marketing.utm_content;\n if (userId) params.user_id = userId;\n\n Object.assign(params, properties);\n\n window.gtag('event', eventName, params);\n}\n\nexport function setGAUserId(userId: string | null): void {\n if (typeof window === 'undefined' || !window.gtag) return;\n window.gtag('set', { user_id: userId ?? undefined });\n}\n\nexport function setGAUserProperties(properties: Record<string, unknown>): void {\n if (typeof window === 'undefined' || !window.gtag) return;\n window.gtag('set', 'user_properties', properties);\n}", "import type {\n GAConsentMode,\n GAConsentParams,\n} from '../types';\n\ndeclare global {\n interface Window {\n gtag: (...args: unknown[]) => void;\n dataLayer: unknown[];\n }\n}\n\nexport class GAManager {\n private _initialized = false;\n private _measurementId: string | undefined;\n\n get ready(): boolean {\n return this._initialized && typeof window !== 'undefined' && typeof window.gtag === 'function';\n }\n\n get measurementId(): string | undefined {\n return this._measurementId;\n }\n\n track(eventName: string, properties?: Record<string, unknown>): void {\n if (!this.ready) return;\n window.gtag('event', eventName, properties ?? {});\n }\n\n setUserId(userId: string | null): void {\n if (!this.ready) return;\n window.gtag('set', { user_id: userId ?? undefined });\n }\n\n setUserProperties(properties: Record<string, unknown>): void {\n if (!this.ready) return;\n window.gtag('set', 'user_properties', properties);\n }\n\n set(keyOrParams: string | Record<string, unknown>, value?: unknown): void {\n if (!this.ready) return;\n if (typeof keyOrParams === 'string') {\n window.gtag('set', keyOrParams, value);\n } else {\n window.gtag('set', keyOrParams);\n }\n }\n\n config(params?: Record<string, unknown>): void {\n if (!this.ready || !this._measurementId) return;\n window.gtag('config', this._measurementId, params ?? {});\n }\n\n consent(mode: GAConsentMode, params: GAConsentParams): void {\n if (!this.ready) return;\n window.gtag('consent', mode, params);\n }\n\n get(key: string, callback: (value: unknown) => void): void {\n if (!this.ready || !this._measurementId) return;\n window.gtag('get', this._measurementId, key, callback);\n }\n\n gtag(...args: unknown[]): void {\n if (typeof window === 'undefined' || !window.gtag) return;\n window.gtag(...args);\n }\n\n _init(measurementId: string): void {\n this._measurementId = measurementId;\n this._initialized = true;\n }\n\n _destroy(): void {\n this._initialized = false;\n this._measurementId = undefined;\n }\n}\n", "import {\r\n AnalyticsConfig,\r\n AnalyticsPayload,\r\n EventPayload,\r\n EventProperties,\r\n TrackOptions,\r\n UserProfile,\r\n API_KEY_MAP,\r\n DEFAULT_CONFIG,\r\n STORAGE_KEYS,\r\n} from '../types';\r\nimport { SessionManager } from './session-manager';\r\nimport { Sender } from './sender';\r\nimport { StorageQueue } from './storage';\r\nimport { collectContext, collectMarketing } from './context-collector';\r\nimport { initAutoTrack } from './auto-track';\r\nimport { initErrorMonitor } from './error-monitor';\r\nimport { initGA } from './ga-loader';\r\nimport { initPerformanceMonitor } from './performance-monitor';\r\nimport { trackToGA, setGAUserId, setGAUserProperties } from './ga-adapter';\r\nimport { GAManager } from './ga-manager';\r\nimport {\r\n generateId,\r\n generateUUID,\r\n getTimestamp,\r\n isObject,\r\n isBrowser,\r\n getPageUrl,\r\n safeLocalStorageGet,\r\n safeLocalStorageSet,\r\n} from '../utils';\r\n\r\nlet globalBatchCounter = 0;\r\n\r\nexport class Analytics {\r\n private config: Required<Pick<AnalyticsConfig, 'debug' | 'autoTrack' | 'bufferFlushInterval' | 'bufferMaxSize' | 'maxRetryCount'>> & AnalyticsConfig;\r\n private sessionManager: SessionManager;\r\n private buffer: EventPayload[] = [];\r\n private bufferTimer: ReturnType<typeof setTimeout> | null = null;\r\n private userId: string | null = null;\r\n private userProps: Record<string, unknown> = {};\r\n private batchPageId: string;\r\n private clientId: string;\r\n private merchantLang: string;\r\n private clientType: string;\r\n private initialized = false;\r\n private retrying = 0;\r\n private gaInitialized = false;\r\n ga: GAManager;\r\n\r\n constructor(config: AnalyticsConfig) {\r\n this.ga = new GAManager();\r\n\r\n this.config = {\r\n debug: false,\r\n autoTrack: true,\r\n bufferFlushInterval: DEFAULT_CONFIG.bufferFlushInterval,\r\n bufferMaxSize: DEFAULT_CONFIG.bufferMaxSize,\r\n maxRetryCount: DEFAULT_CONFIG.maxRetryCount,\r\n ...config,\r\n };\r\n\r\n const appKey = this.config.appKey || this.config.appId || 'unknown';\r\n if (this.config.appId) this.config.appKey = appKey;\r\n\r\n this.clientId = this.getOrCreateClientId();\r\n this.merchantLang = DEFAULT_CONFIG.merchantLanguage;\r\n this.clientType = DEFAULT_CONFIG.clientType;\r\n this.batchPageId = this.generateBatchPageId();\r\n this.sessionManager = new SessionManager(this.config.sessionTimeout);\r\n\r\n if (isBrowser()) {\r\n this.recoverFailedEvents();\r\n }\r\n\r\n this.registerBeforeUnload();\r\n\r\n if (this.config.autoTrack && isBrowser()) {\r\n initAutoTrack(this, this.config.autoTrackSelector);\r\n }\r\n\r\n if (isBrowser()) {\r\n initErrorMonitor(this);\r\n }\r\n\r\n if (isBrowser() && this.config.performance?.enabled !== false) {\r\n initPerformanceMonitor(this, this.config.performance);\r\n }\r\n\r\n if (isBrowser() && this.config.ga?.enabled) {\r\n this.ga._init(this.config.ga.measurementId);\r\n initGA(this.config.ga).then(() => {\r\n this.gaInitialized = true;\r\n this.log('GA4 initialized with measurementId:', this.config.ga?.measurementId);\r\n }).catch((error) => {\r\n this.ga._destroy();\r\n this.log('Failed to initialize GA4:', error);\r\n });\r\n }\r\n\r\n this.initialized = true;\r\n this.log('Analytics SDK initialized', {\r\n appKey: this.config.appKey,\r\n clientId: this.clientId,\r\n sessionId: this.sessionManager.getSessionId(),\r\n });\r\n\r\n if (isBrowser()) {\r\n this.trackPageView();\r\n }\r\n }\r\n\r\n track(eventName: string, properties?: Record<string, unknown>, options?: TrackOptions): void {\r\n if (!eventName || typeof eventName !== 'string') {\r\n this.log('Invalid event name');\r\n return;\r\n }\r\n\r\n const normalizedProps = properties && isObject(properties) ? properties : {};\r\n const isKeyEvent = options?.keyEvent === true || this.isKeyEvent(eventName);\r\n\r\n if (this.gaInitialized) {\r\n trackToGA(eventName, normalizedProps, {\r\n sessionId: this.sessionManager.getSessionId(),\r\n pageUrl: isBrowser() ? getPageUrl() : '',\r\n referrer: isBrowser() ? document.referrer : '',\r\n marketing: collectMarketing(),\r\n userId: this.userId,\r\n });\r\n }\r\n\r\n const event: EventPayload = {\r\n event_id: generateUUID(),\r\n event_name: eventName,\r\n batch_event_index: 0,\r\n batch_ordering_id: this.generateBatchOrderingId(),\r\n batch_page_id: this.batchPageId,\r\n timestamp: getTimestamp(),\r\n key_event: isKeyEvent,\r\n event_properties: this.buildEventProperties(normalizedProps),\r\n };\r\n\r\n if (isKeyEvent) {\r\n this.flushKeyEvent(event);\r\n return;\r\n }\r\n\r\n this.buffer.push(event);\r\n this.scheduleBufferFlush();\r\n\r\n if (this.buffer.length >= this.config.bufferMaxSize) {\r\n this.flushBuffer();\r\n }\r\n }\r\n\r\n identify(userId: string, attributes?: Record<string, unknown>): void {\r\n const wasAnonymous = !this.userId;\r\n this.userId = userId;\r\n if (attributes && isObject(attributes)) {\r\n this.userProps = attributes;\r\n }\r\n if (this.gaInitialized) {\r\n setGAUserId(userId);\r\n if (attributes && isObject(attributes)) {\r\n setGAUserProperties(attributes);\r\n }\r\n }\r\n this.log('User identified:', { userId, attributes });\r\n\r\n if (wasAnonymous && this.buffer.length > 0) {\r\n this.flushBuffer();\r\n }\r\n }\r\n\r\n setMerchantLanguage(language: string): void {\r\n this.merchantLang = language;\r\n }\r\n\r\n setClientType(clientType: string): void {\r\n this.clientType = clientType;\r\n }\r\n\r\n reset(): void {\r\n this.userId = null;\r\n this.userProps = {};\r\n this.buffer = [];\r\n if (this.bufferTimer) {\r\n clearTimeout(this.bufferTimer);\r\n this.bufferTimer = null;\r\n }\r\n if (this.gaInitialized) {\r\n setGAUserId(null);\r\n }\r\n this.log('Analytics reset');\r\n }\r\n\r\n getUserProfile(): UserProfile {\r\n return {\r\n userId: this.userId ?? undefined,\r\n anonymousId: this.clientId,\r\n attributes: this.userProps,\r\n };\r\n }\r\n\r\n getSessionId(): string {\r\n return this.sessionManager.getSessionId();\r\n }\r\n\r\n getClientId(): string {\r\n return this.clientId;\r\n }\r\n\r\n flush(): void {\r\n this.flushBuffer();\r\n }\r\n\r\n private log(...args: unknown[]): void {\r\n if (this.config.debug) {\r\n console.log('[Analytics]', ...args);\r\n }\r\n }\r\n\r\n private getOrCreateClientId(): string {\r\n if (!isBrowser()) return generateUUID();\r\n\r\n let clientId = safeLocalStorageGet(STORAGE_KEYS.CLIENT_ID);\r\n if (!clientId) {\r\n clientId = generateUUID();\r\n safeLocalStorageSet(STORAGE_KEYS.CLIENT_ID, clientId);\r\n }\r\n return clientId;\r\n }\r\n\r\n private resolveApiKey(): string {\r\n if (this.config.apiKey) return this.config.apiKey;\r\n\r\n if (this.config.env) {\r\n const key = API_KEY_MAP[this.config.env];\r\n if (key) return key;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private isKeyEvent(eventName: string): boolean {\r\n if (!this.config.keyEvents || this.config.keyEvents.length === 0) return false;\r\n return this.config.keyEvents.includes(eventName);\r\n }\r\n\r\n private generateBatchPageId(): string {\r\n return `${getTimestamp().toString(36)}-${generateId().split('-')[1] || Math.random().toString(36).slice(2, 9)}`;\r\n }\r\n\r\n private generateBatchOrderingId(): string {\r\n globalBatchCounter += 1;\r\n return `${getTimestamp()}-${globalBatchCounter}`;\r\n }\r\n\r\n private buildEventProperties(properties: Record<string, unknown>): EventProperties {\r\n const defaults: EventProperties = {\r\n system: this.config.system || '',\r\n domain: this.config.domain || '',\r\n scene: '',\r\n action: '',\r\n target_type: '',\r\n target_id: '',\r\n page_url: isBrowser() ? getPageUrl() : '',\r\n };\r\n\r\n const merged: EventProperties = {};\r\n for (const key of Object.keys(defaults)) {\r\n const k = key as keyof EventProperties;\r\n if (defaults[k] !== undefined) {\r\n (merged as Record<string, unknown>)[k] = defaults[k];\r\n }\r\n }\r\n for (const key of Object.keys(properties)) {\r\n (merged as Record<string, unknown>)[key] = properties[key];\r\n }\r\n\r\n return merged;\r\n }\r\n\r\n private scheduleBufferFlush(): void {\r\n if (this.bufferTimer) return;\r\n\r\n this.bufferTimer = setTimeout(() => {\r\n this.flushBuffer();\r\n }, this.config.bufferFlushInterval);\r\n }\r\n\r\n private flushBuffer(): void {\r\n if (this.bufferTimer) {\r\n clearTimeout(this.bufferTimer);\r\n this.bufferTimer = null;\r\n }\r\n\r\n if (this.buffer.length === 0) return;\r\n\r\n const events = this.buffer.splice(0, this.buffer.length);\r\n events.forEach((e, i) => {\r\n e.batch_event_index = i;\r\n });\r\n\r\n this.log(`Flushing ${events.length} events`);\r\n this.sendBatch(events, 0);\r\n }\r\n\r\n private flushKeyEvent(event: EventPayload): void {\r\n this.log('Flushing key event:', event.event_name);\r\n this.sendBatch([event], 0);\r\n }\r\n\r\n private async sendBatch(events: EventPayload[], retryCount: number): Promise<void> {\r\n if (events.length === 0) return;\r\n\r\n const apiKey = this.resolveApiKey();\r\n if (!apiKey) {\r\n this.log('No API key configured, dropping events');\r\n for (const event of events) {\r\n StorageQueue.enqueue(event);\r\n }\r\n return;\r\n }\r\n\r\n const payload = this.buildPayload(events);\r\n\r\n try {\r\n await Sender.send(payload, this.config.serverUrl, apiKey);\r\n this.log(`Batch sent successfully: ${events.length} events`);\r\n } catch (error) {\r\n this.log(`Batch send failed (attempt ${retryCount + 1}/${this.config.maxRetryCount + 1}):`, error);\r\n\r\n if (retryCount < this.config.maxRetryCount) {\r\n const delay = 1000 * Math.pow(2, retryCount);\r\n this.log(`Retrying in ${delay}ms...`);\r\n this.retrying += 1;\r\n setTimeout(() => {\r\n this.retrying -= 1;\r\n this.sendBatch(events, retryCount + 1);\r\n }, delay);\r\n } else {\r\n this.log('Max retries reached, persisting events to localStorage');\r\n for (const event of events) {\r\n StorageQueue.enqueue(event);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private buildPayload(events: EventPayload[]): AnalyticsPayload {\r\n return {\r\n client_id: this.clientId,\r\n user_id: this.userId || '',\r\n session_id: this.sessionManager.getSessionId(),\r\n user_properties: Object.keys(this.userProps).length > 0 ? this.userProps : undefined,\r\n context: collectContext(this.config.appKey || this.config.appId || 'unknown', this.merchantLang, this.clientType),\r\n marketing: collectMarketing(),\r\n events,\r\n };\r\n }\r\n\r\n private recoverFailedEvents(): void {\r\n const failedEvents = StorageQueue.recover();\r\n if (failedEvents.length > 0) {\r\n this.log(`Recovered ${failedEvents.length} failed events from storage`);\r\n\r\n for (const event of failedEvents) {\r\n event.batch_ordering_id = this.generateBatchOrderingId();\r\n event.batch_page_id = this.batchPageId;\r\n event.batch_event_index = 0;\r\n }\r\n\r\n const batchSize = this.config.bufferMaxSize;\r\n for (let i = 0; i < failedEvents.length; i += batchSize) {\r\n const batch = failedEvents.slice(i, i + batchSize);\r\n batch.forEach((e, idx) => {\r\n e.batch_event_index = idx;\r\n });\r\n this.sendBatch(batch, 0);\r\n }\r\n }\r\n }\r\n\r\n private registerBeforeUnload(): void {\r\n if (!isBrowser()) return;\r\n\r\n const handler = (): void => {\r\n if (this.buffer.length === 0) return;\r\n\r\n const events = this.buffer.splice(0, this.buffer.length);\r\n events.forEach((e, i) => {\r\n e.batch_event_index = i;\r\n });\r\n\r\n const apiKey = this.resolveApiKey();\r\n if (!apiKey) return;\r\n\r\n const payload = this.buildPayload(events);\r\n\r\n try {\r\n if (typeof navigator !== 'undefined' && navigator.sendBeacon) {\r\n const url = `${this.config.serverUrl}${this.config.serverUrl.includes('?') ? '&' : '?'}apiKey=${encodeURIComponent(apiKey)}`;\r\n const blob = new Blob([JSON.stringify(payload)], { type: 'application/json' });\r\n const success = navigator.sendBeacon(url, blob);\r\n if (!success) throw new Error('sendBeacon rejected');\r\n } else {\r\n // XHR sync as fallback \u2014 tries to send but doesn't block page unload\r\n try {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open('POST', this.config.serverUrl, false);\r\n xhr.setRequestHeader('Content-Type', 'application/json');\r\n xhr.setRequestHeader('apiKey', apiKey);\r\n xhr.timeout = 2000;\r\n xhr.send(JSON.stringify(payload));\r\n } catch {\r\n // XHR failed during unload\r\n }\r\n }\r\n } catch {\r\n for (const event of events) {\r\n StorageQueue.enqueue(event);\r\n }\r\n }\r\n };\r\n\r\n window.addEventListener('beforeunload', handler);\r\n window.addEventListener('pagehide', handler);\r\n }\r\n\r\n private trackPageView(): void {\r\n if (!isBrowser()) return;\r\n\r\n this.track('page_view', {\r\n action: 'view',\r\n target_type: 'page',\r\n page_url: getPageUrl(),\r\n referrer: document.referrer || '',\r\n });\r\n }\r\n}\r\n\r\nexport function createAnalytics(config: AnalyticsConfig): Analytics {\r\n return new Analytics(config);\r\n}\r\n"],
5
+ "mappings": "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",
6
+ "names": ["c", "r", "v", "e", "t", "n", "e", "i", "s", "o", "r", "c", "a", "d", "f", "l", "u", "m", "g", "k", "e", "i"]
7
+ }
@@ -0,0 +1,45 @@
1
+ import { AnalyticsConfig, TrackOptions, UserProfile } from '../types';
2
+ import { GAManager } from './ga-manager';
3
+ export declare class Analytics {
4
+ private config;
5
+ private sessionManager;
6
+ private buffer;
7
+ private bufferTimer;
8
+ private userId;
9
+ private userProps;
10
+ private batchPageId;
11
+ private clientId;
12
+ private merchantLang;
13
+ private clientType;
14
+ private initialized;
15
+ private retrying;
16
+ private gaInitialized;
17
+ ga: GAManager;
18
+ constructor(config: AnalyticsConfig);
19
+ track(eventName: string, properties?: Record<string, unknown>, options?: TrackOptions): void;
20
+ identify(userId: string, attributes?: Record<string, unknown>): void;
21
+ setMerchantLanguage(language: string): void;
22
+ setClientType(clientType: string): void;
23
+ reset(): void;
24
+ getUserProfile(): UserProfile;
25
+ getSessionId(): string;
26
+ getClientId(): string;
27
+ flush(): void;
28
+ private log;
29
+ private getOrCreateClientId;
30
+ private resolveApiKey;
31
+ private isKeyEvent;
32
+ private generateBatchPageId;
33
+ private generateBatchOrderingId;
34
+ private buildEventProperties;
35
+ private scheduleBufferFlush;
36
+ private flushBuffer;
37
+ private flushKeyEvent;
38
+ private sendBatch;
39
+ private buildPayload;
40
+ private recoverFailedEvents;
41
+ private registerBeforeUnload;
42
+ private trackPageView;
43
+ }
44
+ export declare function createAnalytics(config: AnalyticsConfig): Analytics;
45
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/core/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAIf,YAAY,EACZ,WAAW,EAIZ,MAAM,UAAU,CAAC;AAUlB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAczC,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAuI;IACrJ,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,WAAW,CAA8C;IACjE,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,aAAa,CAAS;IAC9B,EAAE,EAAE,SAAS,CAAC;gBAEF,MAAM,EAAE,eAAe;IA8DnC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IA2C5F,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAmBpE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI3C,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIvC,KAAK,IAAI,IAAI;IAcb,cAAc,IAAI,WAAW;IAQ7B,YAAY,IAAI,MAAM;IAItB,WAAW,IAAI,MAAM;IAIrB,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,GAAG;IAMX,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,uBAAuB;IAK/B,OAAO,CAAC,oBAAoB;IAyB5B,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,aAAa;YAKP,SAAS;IAqCvB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,oBAAoB;IA8C5B,OAAO,CAAC,aAAa;CAUtB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAElE"}
@@ -0,0 +1,369 @@
1
+ import { API_KEY_MAP, DEFAULT_CONFIG, STORAGE_KEYS, } from '../types';
2
+ import { SessionManager } from './session-manager';
3
+ import { Sender } from './sender';
4
+ import { StorageQueue } from './storage';
5
+ import { collectContext, collectMarketing } from './context-collector';
6
+ import { initAutoTrack } from './auto-track';
7
+ import { initErrorMonitor } from './error-monitor';
8
+ import { initGA } from './ga-loader';
9
+ import { initPerformanceMonitor } from './performance-monitor';
10
+ import { trackToGA, setGAUserId, setGAUserProperties } from './ga-adapter';
11
+ import { GAManager } from './ga-manager';
12
+ import { generateId, generateUUID, getTimestamp, isObject, isBrowser, getPageUrl, safeLocalStorageGet, safeLocalStorageSet, } from '../utils';
13
+ let globalBatchCounter = 0;
14
+ export class Analytics {
15
+ constructor(config) {
16
+ this.buffer = [];
17
+ this.bufferTimer = null;
18
+ this.userId = null;
19
+ this.userProps = {};
20
+ this.initialized = false;
21
+ this.retrying = 0;
22
+ this.gaInitialized = false;
23
+ this.ga = new GAManager();
24
+ this.config = {
25
+ debug: false,
26
+ autoTrack: true,
27
+ bufferFlushInterval: DEFAULT_CONFIG.bufferFlushInterval,
28
+ bufferMaxSize: DEFAULT_CONFIG.bufferMaxSize,
29
+ maxRetryCount: DEFAULT_CONFIG.maxRetryCount,
30
+ ...config,
31
+ };
32
+ const appKey = this.config.appKey || this.config.appId || 'unknown';
33
+ if (this.config.appId)
34
+ this.config.appKey = appKey;
35
+ this.clientId = this.getOrCreateClientId();
36
+ this.merchantLang = DEFAULT_CONFIG.merchantLanguage;
37
+ this.clientType = DEFAULT_CONFIG.clientType;
38
+ this.batchPageId = this.generateBatchPageId();
39
+ this.sessionManager = new SessionManager(this.config.sessionTimeout);
40
+ if (isBrowser()) {
41
+ this.recoverFailedEvents();
42
+ }
43
+ this.registerBeforeUnload();
44
+ if (this.config.autoTrack && isBrowser()) {
45
+ initAutoTrack(this, this.config.autoTrackSelector);
46
+ }
47
+ if (isBrowser()) {
48
+ initErrorMonitor(this);
49
+ }
50
+ if (isBrowser() && this.config.performance?.enabled !== false) {
51
+ initPerformanceMonitor(this, this.config.performance);
52
+ }
53
+ if (isBrowser() && this.config.ga?.enabled) {
54
+ this.ga._init(this.config.ga.measurementId);
55
+ initGA(this.config.ga).then(() => {
56
+ this.gaInitialized = true;
57
+ this.log('GA4 initialized with measurementId:', this.config.ga?.measurementId);
58
+ }).catch((error) => {
59
+ this.ga._destroy();
60
+ this.log('Failed to initialize GA4:', error);
61
+ });
62
+ }
63
+ this.initialized = true;
64
+ this.log('Analytics SDK initialized', {
65
+ appKey: this.config.appKey,
66
+ clientId: this.clientId,
67
+ sessionId: this.sessionManager.getSessionId(),
68
+ });
69
+ if (isBrowser()) {
70
+ this.trackPageView();
71
+ }
72
+ }
73
+ track(eventName, properties, options) {
74
+ if (!eventName || typeof eventName !== 'string') {
75
+ this.log('Invalid event name');
76
+ return;
77
+ }
78
+ const normalizedProps = properties && isObject(properties) ? properties : {};
79
+ const isKeyEvent = options?.keyEvent === true || this.isKeyEvent(eventName);
80
+ if (this.gaInitialized) {
81
+ trackToGA(eventName, normalizedProps, {
82
+ sessionId: this.sessionManager.getSessionId(),
83
+ pageUrl: isBrowser() ? getPageUrl() : '',
84
+ referrer: isBrowser() ? document.referrer : '',
85
+ marketing: collectMarketing(),
86
+ userId: this.userId,
87
+ });
88
+ }
89
+ const event = {
90
+ event_id: generateUUID(),
91
+ event_name: eventName,
92
+ batch_event_index: 0,
93
+ batch_ordering_id: this.generateBatchOrderingId(),
94
+ batch_page_id: this.batchPageId,
95
+ timestamp: getTimestamp(),
96
+ key_event: isKeyEvent,
97
+ event_properties: this.buildEventProperties(normalizedProps),
98
+ };
99
+ if (isKeyEvent) {
100
+ this.flushKeyEvent(event);
101
+ return;
102
+ }
103
+ this.buffer.push(event);
104
+ this.scheduleBufferFlush();
105
+ if (this.buffer.length >= this.config.bufferMaxSize) {
106
+ this.flushBuffer();
107
+ }
108
+ }
109
+ identify(userId, attributes) {
110
+ const wasAnonymous = !this.userId;
111
+ this.userId = userId;
112
+ if (attributes && isObject(attributes)) {
113
+ this.userProps = attributes;
114
+ }
115
+ if (this.gaInitialized) {
116
+ setGAUserId(userId);
117
+ if (attributes && isObject(attributes)) {
118
+ setGAUserProperties(attributes);
119
+ }
120
+ }
121
+ this.log('User identified:', { userId, attributes });
122
+ if (wasAnonymous && this.buffer.length > 0) {
123
+ this.flushBuffer();
124
+ }
125
+ }
126
+ setMerchantLanguage(language) {
127
+ this.merchantLang = language;
128
+ }
129
+ setClientType(clientType) {
130
+ this.clientType = clientType;
131
+ }
132
+ reset() {
133
+ this.userId = null;
134
+ this.userProps = {};
135
+ this.buffer = [];
136
+ if (this.bufferTimer) {
137
+ clearTimeout(this.bufferTimer);
138
+ this.bufferTimer = null;
139
+ }
140
+ if (this.gaInitialized) {
141
+ setGAUserId(null);
142
+ }
143
+ this.log('Analytics reset');
144
+ }
145
+ getUserProfile() {
146
+ return {
147
+ userId: this.userId ?? undefined,
148
+ anonymousId: this.clientId,
149
+ attributes: this.userProps,
150
+ };
151
+ }
152
+ getSessionId() {
153
+ return this.sessionManager.getSessionId();
154
+ }
155
+ getClientId() {
156
+ return this.clientId;
157
+ }
158
+ flush() {
159
+ this.flushBuffer();
160
+ }
161
+ log(...args) {
162
+ if (this.config.debug) {
163
+ console.log('[Analytics]', ...args);
164
+ }
165
+ }
166
+ getOrCreateClientId() {
167
+ if (!isBrowser())
168
+ return generateUUID();
169
+ let clientId = safeLocalStorageGet(STORAGE_KEYS.CLIENT_ID);
170
+ if (!clientId) {
171
+ clientId = generateUUID();
172
+ safeLocalStorageSet(STORAGE_KEYS.CLIENT_ID, clientId);
173
+ }
174
+ return clientId;
175
+ }
176
+ resolveApiKey() {
177
+ if (this.config.apiKey)
178
+ return this.config.apiKey;
179
+ if (this.config.env) {
180
+ const key = API_KEY_MAP[this.config.env];
181
+ if (key)
182
+ return key;
183
+ }
184
+ return '';
185
+ }
186
+ isKeyEvent(eventName) {
187
+ if (!this.config.keyEvents || this.config.keyEvents.length === 0)
188
+ return false;
189
+ return this.config.keyEvents.includes(eventName);
190
+ }
191
+ generateBatchPageId() {
192
+ return `${getTimestamp().toString(36)}-${generateId().split('-')[1] || Math.random().toString(36).slice(2, 9)}`;
193
+ }
194
+ generateBatchOrderingId() {
195
+ globalBatchCounter += 1;
196
+ return `${getTimestamp()}-${globalBatchCounter}`;
197
+ }
198
+ buildEventProperties(properties) {
199
+ const defaults = {
200
+ system: this.config.system || '',
201
+ domain: this.config.domain || '',
202
+ scene: '',
203
+ action: '',
204
+ target_type: '',
205
+ target_id: '',
206
+ page_url: isBrowser() ? getPageUrl() : '',
207
+ };
208
+ const merged = {};
209
+ for (const key of Object.keys(defaults)) {
210
+ const k = key;
211
+ if (defaults[k] !== undefined) {
212
+ merged[k] = defaults[k];
213
+ }
214
+ }
215
+ for (const key of Object.keys(properties)) {
216
+ merged[key] = properties[key];
217
+ }
218
+ return merged;
219
+ }
220
+ scheduleBufferFlush() {
221
+ if (this.bufferTimer)
222
+ return;
223
+ this.bufferTimer = setTimeout(() => {
224
+ this.flushBuffer();
225
+ }, this.config.bufferFlushInterval);
226
+ }
227
+ flushBuffer() {
228
+ if (this.bufferTimer) {
229
+ clearTimeout(this.bufferTimer);
230
+ this.bufferTimer = null;
231
+ }
232
+ if (this.buffer.length === 0)
233
+ return;
234
+ const events = this.buffer.splice(0, this.buffer.length);
235
+ events.forEach((e, i) => {
236
+ e.batch_event_index = i;
237
+ });
238
+ this.log(`Flushing ${events.length} events`);
239
+ this.sendBatch(events, 0);
240
+ }
241
+ flushKeyEvent(event) {
242
+ this.log('Flushing key event:', event.event_name);
243
+ this.sendBatch([event], 0);
244
+ }
245
+ async sendBatch(events, retryCount) {
246
+ if (events.length === 0)
247
+ return;
248
+ const apiKey = this.resolveApiKey();
249
+ if (!apiKey) {
250
+ this.log('No API key configured, dropping events');
251
+ for (const event of events) {
252
+ StorageQueue.enqueue(event);
253
+ }
254
+ return;
255
+ }
256
+ const payload = this.buildPayload(events);
257
+ try {
258
+ await Sender.send(payload, this.config.serverUrl, apiKey);
259
+ this.log(`Batch sent successfully: ${events.length} events`);
260
+ }
261
+ catch (error) {
262
+ this.log(`Batch send failed (attempt ${retryCount + 1}/${this.config.maxRetryCount + 1}):`, error);
263
+ if (retryCount < this.config.maxRetryCount) {
264
+ const delay = 1000 * Math.pow(2, retryCount);
265
+ this.log(`Retrying in ${delay}ms...`);
266
+ this.retrying += 1;
267
+ setTimeout(() => {
268
+ this.retrying -= 1;
269
+ this.sendBatch(events, retryCount + 1);
270
+ }, delay);
271
+ }
272
+ else {
273
+ this.log('Max retries reached, persisting events to localStorage');
274
+ for (const event of events) {
275
+ StorageQueue.enqueue(event);
276
+ }
277
+ }
278
+ }
279
+ }
280
+ buildPayload(events) {
281
+ return {
282
+ client_id: this.clientId,
283
+ user_id: this.userId || '',
284
+ session_id: this.sessionManager.getSessionId(),
285
+ user_properties: Object.keys(this.userProps).length > 0 ? this.userProps : undefined,
286
+ context: collectContext(this.config.appKey || this.config.appId || 'unknown', this.merchantLang, this.clientType),
287
+ marketing: collectMarketing(),
288
+ events,
289
+ };
290
+ }
291
+ recoverFailedEvents() {
292
+ const failedEvents = StorageQueue.recover();
293
+ if (failedEvents.length > 0) {
294
+ this.log(`Recovered ${failedEvents.length} failed events from storage`);
295
+ for (const event of failedEvents) {
296
+ event.batch_ordering_id = this.generateBatchOrderingId();
297
+ event.batch_page_id = this.batchPageId;
298
+ event.batch_event_index = 0;
299
+ }
300
+ const batchSize = this.config.bufferMaxSize;
301
+ for (let i = 0; i < failedEvents.length; i += batchSize) {
302
+ const batch = failedEvents.slice(i, i + batchSize);
303
+ batch.forEach((e, idx) => {
304
+ e.batch_event_index = idx;
305
+ });
306
+ this.sendBatch(batch, 0);
307
+ }
308
+ }
309
+ }
310
+ registerBeforeUnload() {
311
+ if (!isBrowser())
312
+ return;
313
+ const handler = () => {
314
+ if (this.buffer.length === 0)
315
+ return;
316
+ const events = this.buffer.splice(0, this.buffer.length);
317
+ events.forEach((e, i) => {
318
+ e.batch_event_index = i;
319
+ });
320
+ const apiKey = this.resolveApiKey();
321
+ if (!apiKey)
322
+ return;
323
+ const payload = this.buildPayload(events);
324
+ try {
325
+ if (typeof navigator !== 'undefined' && navigator.sendBeacon) {
326
+ const url = `${this.config.serverUrl}${this.config.serverUrl.includes('?') ? '&' : '?'}apiKey=${encodeURIComponent(apiKey)}`;
327
+ const blob = new Blob([JSON.stringify(payload)], { type: 'application/json' });
328
+ const success = navigator.sendBeacon(url, blob);
329
+ if (!success)
330
+ throw new Error('sendBeacon rejected');
331
+ }
332
+ else {
333
+ // XHR sync as fallback — tries to send but doesn't block page unload
334
+ try {
335
+ const xhr = new XMLHttpRequest();
336
+ xhr.open('POST', this.config.serverUrl, false);
337
+ xhr.setRequestHeader('Content-Type', 'application/json');
338
+ xhr.setRequestHeader('apiKey', apiKey);
339
+ xhr.timeout = 2000;
340
+ xhr.send(JSON.stringify(payload));
341
+ }
342
+ catch {
343
+ // XHR failed during unload
344
+ }
345
+ }
346
+ }
347
+ catch {
348
+ for (const event of events) {
349
+ StorageQueue.enqueue(event);
350
+ }
351
+ }
352
+ };
353
+ window.addEventListener('beforeunload', handler);
354
+ window.addEventListener('pagehide', handler);
355
+ }
356
+ trackPageView() {
357
+ if (!isBrowser())
358
+ return;
359
+ this.track('page_view', {
360
+ action: 'view',
361
+ target_type: 'page',
362
+ page_url: getPageUrl(),
363
+ referrer: document.referrer || '',
364
+ });
365
+ }
366
+ }
367
+ export function createAnalytics(config) {
368
+ return new Analytics(config);
369
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=analytics.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.test.d.ts","sourceRoot":"","sources":["../../src/core/analytics.test.ts"],"names":[],"mappings":""}