onerway-analytics 1.0.2 → 1.0.3

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.
@@ -454,16 +454,17 @@ var OnrwayAnalytics = (() => {
454
454
  function collectMarketing() {
455
455
  if (!isBrowser()) return {};
456
456
  let utm = {};
457
- const storedUtm = safeLocalStorageGet(STORAGE_KEYS.UTM_PARAMS);
458
- if (storedUtm) {
459
- try {
460
- utm = JSON.parse(storedUtm);
461
- } catch {
462
- }
457
+ const freshUtm = parseUTMParams();
458
+ if (Object.keys(freshUtm).length > 0) {
459
+ utm = freshUtm;
460
+ safeLocalStorageSet(STORAGE_KEYS.UTM_PARAMS, JSON.stringify(utm));
463
461
  } else {
464
- utm = parseUTMParams();
465
- if (Object.keys(utm).length > 0) {
466
- safeLocalStorageSet(STORAGE_KEYS.UTM_PARAMS, JSON.stringify(utm));
462
+ const storedUtm = safeLocalStorageGet(STORAGE_KEYS.UTM_PARAMS);
463
+ if (storedUtm) {
464
+ try {
465
+ utm = JSON.parse(storedUtm);
466
+ } catch {
467
+ }
467
468
  }
468
469
  }
469
470
  let landingPage = safeLocalStorageGet(STORAGE_KEYS.LANDING_PAGE);
@@ -950,23 +951,49 @@ var OnrwayAnalytics = (() => {
950
951
  }
951
952
 
952
953
  // src/core/ga-adapter.ts
954
+ var GA4_RESERVED_NAMES = /* @__PURE__ */ new Set([
955
+ "ad_activeview",
956
+ "ad_click",
957
+ "ad_exposure",
958
+ "ad_impression",
959
+ "ad_query",
960
+ "adunit_exposure",
961
+ "app_clear_data",
962
+ "app_exception",
963
+ "app_install",
964
+ "app_remove",
965
+ "app_update",
966
+ "app_upgrade",
967
+ "error",
968
+ "firebase_campaign",
969
+ "first_open",
970
+ "first_visit",
971
+ "in_app_purchase",
972
+ "notification_dismiss",
973
+ "notification_foreground",
974
+ "notification_open",
975
+ "notification_receive",
976
+ "os_update",
977
+ "session_start",
978
+ "user_engagement"
979
+ ]);
980
+ var SYSTEM_EVENTS = /* @__PURE__ */ new Set(["web_vital", "error_event"]);
981
+ function sanitizeEventName(name) {
982
+ let result = name.replace(/[^a-zA-Z0-9_]/g, "_");
983
+ if (!/^[a-zA-Z]/.test(result)) result = "e_" + result;
984
+ return result.slice(0, 40);
985
+ }
953
986
  function trackToGA(eventName, properties, options) {
954
987
  if (typeof window === "undefined" || !window.gtag) return;
955
- const params = {
956
- session_id: options.sessionId,
957
- engagement_time_msec: 100,
958
- page_location: options.pageUrl,
959
- page_referrer: options.referrer
960
- };
961
- const { marketing, userId } = options;
962
- if (marketing.utm_source) params.utm_source = marketing.utm_source;
963
- if (marketing.utm_medium) params.utm_medium = marketing.utm_medium;
964
- if (marketing.utm_campaign) params.utm_campaign = marketing.utm_campaign;
965
- if (marketing.utm_term) params.utm_term = marketing.utm_term;
966
- if (marketing.utm_content) params.utm_content = marketing.utm_content;
967
- if (userId) params.user_id = userId;
968
- Object.assign(params, properties);
969
- window.gtag("event", eventName, params);
988
+ const safeName = GA4_RESERVED_NAMES.has(eventName) ? `custom_${eventName}`.slice(0, 40) : sanitizeEventName(eventName);
989
+ const params = { ...properties };
990
+ params.session_id = options.sessionId;
991
+ params.page_location = options.pageUrl;
992
+ params.page_referrer = options.referrer;
993
+ if (!SYSTEM_EVENTS.has(eventName)) {
994
+ params.engagement_time_msec = 100;
995
+ }
996
+ window.gtag("event", safeName, params);
970
997
  }
971
998
  function setGAUserId(userId) {
972
999
  if (typeof window === "undefined" || !window.gtag) return;
@@ -976,6 +1003,18 @@ var OnrwayAnalytics = (() => {
976
1003
  if (typeof window === "undefined" || !window.gtag) return;
977
1004
  window.gtag("set", "user_properties", properties);
978
1005
  }
1006
+ function setGAMarketing(marketing) {
1007
+ if (typeof window === "undefined" || !window.gtag) return;
1008
+ const params = {};
1009
+ if (marketing.utm_source) params.utm_source = marketing.utm_source;
1010
+ if (marketing.utm_medium) params.utm_medium = marketing.utm_medium;
1011
+ if (marketing.utm_campaign) params.utm_campaign = marketing.utm_campaign;
1012
+ if (marketing.utm_term) params.utm_term = marketing.utm_term;
1013
+ if (marketing.utm_content) params.utm_content = marketing.utm_content;
1014
+ if (Object.keys(params).length > 0) {
1015
+ window.gtag("set", params);
1016
+ }
1017
+ }
979
1018
 
980
1019
  // src/core/ga-manager.ts
981
1020
  var GAManager = class {
@@ -1082,6 +1121,7 @@ var OnrwayAnalytics = (() => {
1082
1121
  initGA(this.config.ga).then(() => {
1083
1122
  this.gaInitialized = true;
1084
1123
  this.log("GA4 initialized with measurementId:", this.config.ga?.measurementId);
1124
+ setGAMarketing(collectMarketing());
1085
1125
  if (this.gaPendingIdentify) {
1086
1126
  setGAUserId(this.gaPendingIdentify.userId);
1087
1127
  if (this.gaPendingIdentify.attributes) {
@@ -1106,7 +1146,7 @@ var OnrwayAnalytics = (() => {
1106
1146
  clientId: this.clientId,
1107
1147
  sessionId: this.sessionManager.getSessionId()
1108
1148
  });
1109
- if (isBrowser()) {
1149
+ if (isBrowser() && this.config.autoTrackPageView !== false) {
1110
1150
  this.trackPageView();
1111
1151
  }
1112
1152
  }
@@ -1121,9 +1161,7 @@ var OnrwayAnalytics = (() => {
1121
1161
  const gaOptions = {
1122
1162
  sessionId: this.sessionManager.getSessionId(),
1123
1163
  pageUrl: isBrowser() ? getPageUrl() : "",
1124
- referrer: isBrowser() ? document.referrer : "",
1125
- marketing: collectMarketing(),
1126
- userId: this.userId
1164
+ referrer: isBrowser() ? document.referrer : ""
1127
1165
  };
1128
1166
  if (this.gaInitialized) {
1129
1167
  trackToGA(eventName, normalizedProps, gaOptions);
@@ -1252,8 +1290,9 @@ var OnrwayAnalytics = (() => {
1252
1290
  const merged = {};
1253
1291
  for (const key of Object.keys(defaults)) {
1254
1292
  const k2 = key;
1255
- if (defaults[k2] !== void 0) {
1256
- merged[k2] = defaults[k2];
1293
+ const val = defaults[k2];
1294
+ if (val !== void 0 && val !== "") {
1295
+ merged[k2] = val;
1257
1296
  }
1258
1297
  }
1259
1298
  for (const key of Object.keys(properties)) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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 disableServer?: boolean;\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 UTM_PARAMS: '__analytics_utm_params__',\r\n} as const;\r\n\r\n// WARNING: These keys are embedded in the built bundle and visible to end users.\r\n// For production deployments, pass apiKey directly in AnalyticsConfig to avoid\r\n// exposing environment keys in source code.\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.sessionId = id;\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\nconst MAX_EVENT_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours\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 now = Date.now();\r\n const events = queue\r\n .filter((item) => now - item.storedAt < MAX_EVENT_AGE_MS)\r\n .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 // Persist UTM params from the landing URL so they survive SPA navigation\r\n let utm: Record<string, string> = {};\r\n const storedUtm = safeLocalStorageGet(STORAGE_KEYS.UTM_PARAMS);\r\n if (storedUtm) {\r\n try { utm = JSON.parse(storedUtm); } catch { /* ignore corrupt value */ }\r\n } else {\r\n utm = parseUTMParams();\r\n if (Object.keys(utm).length > 0) {\r\n safeLocalStorageSet(STORAGE_KEYS.UTM_PARAMS, JSON.stringify(utm));\r\n }\r\n }\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.replace(/[^\\w-]/g, '_')}` : '';\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 // Check for existing script tag, not window.gtag \u2014 we define gtag before loading\n if (document.querySelector(`script[src*=\"googletagmanager.com/gtag/js\"]`)) {\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 // Must be defined BEFORE the script loads so gtag.js finds them on execution\n window.dataLayer = window.dataLayer || [];\n // gtag.js checks e.constructor == Arguments, so must push `arguments` not a rest-param array\n window.gtag = function gtag() {\n // eslint-disable-next-line prefer-rest-params\n (window.dataLayer as unknown[]).push(arguments);\n } as (...args: unknown[]) => void;\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\n await loadGtagScript(config.measurementId);\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 private gaPendingQueue: Array<{ eventName: string; properties: Record<string, unknown>; options: Parameters<typeof trackToGA>[2] }> = [];\r\n private gaPendingIdentify: { userId: string; attributes?: Record<string, unknown> } | null = null;\r\n private unloadHandler: (() => void) | null = null;\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 if (this.gaPendingIdentify) {\r\n setGAUserId(this.gaPendingIdentify.userId);\r\n if (this.gaPendingIdentify.attributes) {\r\n setGAUserProperties(this.gaPendingIdentify.attributes);\r\n }\r\n this.gaPendingIdentify = null;\r\n }\r\n for (const { eventName, properties, options } of this.gaPendingQueue) {\r\n trackToGA(eventName, properties, options);\r\n }\r\n this.gaPendingQueue = [];\r\n }).catch((error) => {\r\n this.ga._destroy();\r\n this.gaPendingIdentify = null;\r\n this.gaPendingQueue = [];\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.config.ga?.enabled) {\r\n const gaOptions = {\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 if (this.gaInitialized) {\r\n trackToGA(eventName, normalizedProps, gaOptions);\r\n } else {\r\n this.gaPendingQueue.push({ eventName, properties: normalizedProps, options: gaOptions });\r\n }\r\n }\r\n\r\n if (this.config.disableServer) return;\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 } else if (this.config.ga?.enabled) {\r\n this.gaPendingIdentify = { userId, attributes };\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.config.disableServer) return;\r\n\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 // Wait for inflight retries to settle before sending a new batch\r\n if (this.retrying > 0) {\r\n this.scheduleBufferFlush();\r\n return;\r\n }\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 if (this.config.disableServer) return;\r\n\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 if (this.buffer.length > 0) {\r\n this.scheduleBufferFlush();\r\n }\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 if (this.config.disableServer) return;\r\n\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 destroy(): void {\r\n if (this.unloadHandler) {\r\n window.removeEventListener('beforeunload', this.unloadHandler);\r\n window.removeEventListener('pagehide', this.unloadHandler);\r\n this.unloadHandler = null;\r\n }\r\n if (this.bufferTimer) {\r\n clearTimeout(this.bufferTimer);\r\n this.bufferTimer = null;\r\n }\r\n }\r\n\r\n private registerBeforeUnload(): void {\r\n if (!isBrowser() || this.config.disableServer) 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 this.unloadHandler = handler;\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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",
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 autoTrackPageView?: 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 disableServer?: boolean;\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 UTM_PARAMS: '__analytics_utm_params__',\r\n} as const;\r\n\r\n// WARNING: These keys are embedded in the built bundle and visible to end users.\r\n// For production deployments, pass apiKey directly in AnalyticsConfig to avoid\r\n// exposing environment keys in source code.\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.sessionId = id;\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\nconst MAX_EVENT_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours\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 now = Date.now();\r\n const events = queue\r\n .filter((item) => now - item.storedAt < MAX_EVENT_AGE_MS)\r\n .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 // If current URL has UTM params (new campaign visit), update the cache and use them.\r\n // If not (SPA internal navigation), fall back to cached value so attribution is preserved.\r\n let utm: Record<string, string> = {};\r\n const freshUtm = parseUTMParams();\r\n if (Object.keys(freshUtm).length > 0) {\r\n utm = freshUtm;\r\n safeLocalStorageSet(STORAGE_KEYS.UTM_PARAMS, JSON.stringify(utm));\r\n } else {\r\n const storedUtm = safeLocalStorageGet(STORAGE_KEYS.UTM_PARAMS);\r\n if (storedUtm) {\r\n try { utm = JSON.parse(storedUtm); } catch { /* ignore corrupt value */ }\r\n }\r\n }\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.replace(/[^\\w-]/g, '_')}` : '';\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 // Check for existing script tag, not window.gtag \u2014 we define gtag before loading\n if (document.querySelector(`script[src*=\"googletagmanager.com/gtag/js\"]`)) {\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 // Must be defined BEFORE the script loads so gtag.js finds them on execution\n window.dataLayer = window.dataLayer || [];\n // gtag.js checks e.constructor == Arguments, so must push `arguments` not a rest-param array\n window.gtag = function gtag() {\n // eslint-disable-next-line prefer-rest-params\n (window.dataLayer as unknown[]).push(arguments);\n } as (...args: unknown[]) => void;\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\n await loadGtagScript(config.measurementId);\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}\n\n// GA4 reserved event names \u2014 sending these as custom events causes silent drops\nconst GA4_RESERVED_NAMES = new Set([\n 'ad_activeview', 'ad_click', 'ad_exposure', 'ad_impression', 'ad_query',\n 'adunit_exposure', 'app_clear_data', 'app_exception', 'app_install',\n 'app_remove', 'app_update', 'app_upgrade', 'error', 'firebase_campaign',\n 'first_open', 'first_visit', 'in_app_purchase', 'notification_dismiss',\n 'notification_foreground', 'notification_open', 'notification_receive',\n 'os_update', 'session_start', 'user_engagement',\n]);\n\n// System/automated events \u2014 don't contribute to engagement_time_msec\nconst SYSTEM_EVENTS = new Set(['web_vital', 'error_event']);\n\nfunction sanitizeEventName(name: string): string {\n let result = name.replace(/[^a-zA-Z0-9_]/g, '_');\n if (!/^[a-zA-Z]/.test(result)) result = 'e_' + result;\n return result.slice(0, 40);\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 // Sanitize event name for GA4 compliance\n const safeName = GA4_RESERVED_NAMES.has(eventName)\n ? `custom_${eventName}`.slice(0, 40)\n : sanitizeEventName(eventName);\n\n // Business properties first, then GA reserved fields override \u2014 prevents\n // caller properties from corrupting session_id / page_location etc.\n const params: Record<string, unknown> = { ...properties };\n params.session_id = options.sessionId;\n params.page_location = options.pageUrl;\n params.page_referrer = options.referrer;\n\n // engagement_time_msec only for user-facing events, not automated system events\n if (!SYSTEM_EVENTS.has(eventName)) {\n params.engagement_time_msec = 100;\n }\n\n window.gtag('event', safeName, 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}\n\n// Set UTM attribution once at session level \u2014 GA4 auto-associates with all\n// subsequent events, no need to repeat on every event payload\nexport function setGAMarketing(marketing: MarketingPayload): void {\n if (typeof window === 'undefined' || !window.gtag) return;\n const params: Record<string, unknown> = {};\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 (Object.keys(params).length > 0) {\n window.gtag('set', params);\n }\n}\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, setGAMarketing } 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 private gaPendingQueue: Array<{ eventName: string; properties: Record<string, unknown>; options: Parameters<typeof trackToGA>[2] }> = [];\r\n private gaPendingIdentify: { userId: string; attributes?: Record<string, unknown> } | null = null;\r\n private unloadHandler: (() => void) | null = null;\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 // Set session-level attribution once \u2014 GA auto-associates with all events\r\n setGAMarketing(collectMarketing());\r\n if (this.gaPendingIdentify) {\r\n setGAUserId(this.gaPendingIdentify.userId);\r\n if (this.gaPendingIdentify.attributes) {\r\n setGAUserProperties(this.gaPendingIdentify.attributes);\r\n }\r\n this.gaPendingIdentify = null;\r\n }\r\n for (const { eventName, properties, options } of this.gaPendingQueue) {\r\n trackToGA(eventName, properties, options);\r\n }\r\n this.gaPendingQueue = [];\r\n }).catch((error) => {\r\n this.ga._destroy();\r\n this.gaPendingIdentify = null;\r\n this.gaPendingQueue = [];\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() && this.config.autoTrackPageView !== false) {\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.config.ga?.enabled) {\r\n const gaOptions = {\r\n sessionId: this.sessionManager.getSessionId(),\r\n pageUrl: isBrowser() ? getPageUrl() : '',\r\n referrer: isBrowser() ? document.referrer : '',\r\n };\r\n if (this.gaInitialized) {\r\n trackToGA(eventName, normalizedProps, gaOptions);\r\n } else {\r\n this.gaPendingQueue.push({ eventName, properties: normalizedProps, options: gaOptions });\r\n }\r\n }\r\n\r\n if (this.config.disableServer) return;\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 } else if (this.config.ga?.enabled) {\r\n this.gaPendingIdentify = { userId, attributes };\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 const val = defaults[k];\r\n if (val !== undefined && val !== '') {\r\n (merged as Record<string, unknown>)[k] = val;\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.config.disableServer) return;\r\n\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 // Wait for inflight retries to settle before sending a new batch\r\n if (this.retrying > 0) {\r\n this.scheduleBufferFlush();\r\n return;\r\n }\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 if (this.config.disableServer) return;\r\n\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 if (this.buffer.length > 0) {\r\n this.scheduleBufferFlush();\r\n }\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 if (this.config.disableServer) return;\r\n\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 destroy(): void {\r\n if (this.unloadHandler) {\r\n window.removeEventListener('beforeunload', this.unloadHandler);\r\n window.removeEventListener('pagehide', this.unloadHandler);\r\n this.unloadHandler = null;\r\n }\r\n if (this.bufferTimer) {\r\n clearTimeout(this.bufferTimer);\r\n this.bufferTimer = null;\r\n }\r\n }\r\n\r\n private registerBeforeUnload(): void {\r\n if (!isBrowser() || this.config.disableServer) 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 this.unloadHandler = handler;\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
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
7
  }
@@ -1 +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,OAAO,CAAC,cAAc,CAAmH;IACzI,OAAO,CAAC,iBAAiB,CAAyE;IAClG,OAAO,CAAC,aAAa,CAA6B;IAClD,EAAE,EAAE,SAAS,CAAC;gBAEF,MAAM,EAAE,eAAe;IA2EnC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IAkD5F,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAqBpE,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;IAyBnB,OAAO,CAAC,aAAa;YAOP,SAAS;IAwCvB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,mBAAmB;IAwB3B,OAAO,IAAI,IAAI;IAYf,OAAO,CAAC,oBAAoB;IA+C5B,OAAO,CAAC,aAAa;CAUtB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAElE"}
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,OAAO,CAAC,cAAc,CAAmH;IACzI,OAAO,CAAC,iBAAiB,CAAyE;IAClG,OAAO,CAAC,aAAa,CAA6B;IAClD,EAAE,EAAE,SAAS,CAAC;gBAEF,MAAM,EAAE,eAAe;IA6EnC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IAgD5F,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAqBpE,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;IA0B5B,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,WAAW;IAyBnB,OAAO,CAAC,aAAa;YAOP,SAAS;IAwCvB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,mBAAmB;IAwB3B,OAAO,IAAI,IAAI;IAYf,OAAO,CAAC,oBAAoB;IA+C5B,OAAO,CAAC,aAAa;CAUtB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAElE"}
@@ -7,7 +7,7 @@ import { initAutoTrack } from './auto-track';
7
7
  import { initErrorMonitor } from './error-monitor';
8
8
  import { initGA } from './ga-loader';
9
9
  import { initPerformanceMonitor } from './performance-monitor';
10
- import { trackToGA, setGAUserId, setGAUserProperties } from './ga-adapter';
10
+ import { trackToGA, setGAUserId, setGAUserProperties, setGAMarketing } from './ga-adapter';
11
11
  import { GAManager } from './ga-manager';
12
12
  import { generateId, generateUUID, getTimestamp, isObject, isBrowser, getPageUrl, safeLocalStorageGet, safeLocalStorageSet, } from '../utils';
13
13
  let globalBatchCounter = 0;
@@ -58,6 +58,8 @@ export class Analytics {
58
58
  initGA(this.config.ga).then(() => {
59
59
  this.gaInitialized = true;
60
60
  this.log('GA4 initialized with measurementId:', this.config.ga?.measurementId);
61
+ // Set session-level attribution once — GA auto-associates with all events
62
+ setGAMarketing(collectMarketing());
61
63
  if (this.gaPendingIdentify) {
62
64
  setGAUserId(this.gaPendingIdentify.userId);
63
65
  if (this.gaPendingIdentify.attributes) {
@@ -82,7 +84,7 @@ export class Analytics {
82
84
  clientId: this.clientId,
83
85
  sessionId: this.sessionManager.getSessionId(),
84
86
  });
85
- if (isBrowser()) {
87
+ if (isBrowser() && this.config.autoTrackPageView !== false) {
86
88
  this.trackPageView();
87
89
  }
88
90
  }
@@ -98,8 +100,6 @@ export class Analytics {
98
100
  sessionId: this.sessionManager.getSessionId(),
99
101
  pageUrl: isBrowser() ? getPageUrl() : '',
100
102
  referrer: isBrowser() ? document.referrer : '',
101
- marketing: collectMarketing(),
102
- userId: this.userId,
103
103
  };
104
104
  if (this.gaInitialized) {
105
105
  trackToGA(eventName, normalizedProps, gaOptions);
@@ -235,8 +235,9 @@ export class Analytics {
235
235
  const merged = {};
236
236
  for (const key of Object.keys(defaults)) {
237
237
  const k = key;
238
- if (defaults[k] !== undefined) {
239
- merged[k] = defaults[k];
238
+ const val = defaults[k];
239
+ if (val !== undefined && val !== '') {
240
+ merged[k] = val;
240
241
  }
241
242
  }
242
243
  for (const key of Object.keys(properties)) {
@@ -1 +1 @@
1
- {"version":3,"file":"context-collector.d.ts","sourceRoot":"","sources":["../../src/core/context-collector.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,gBAAgB,EAGjB,MAAM,UAAU,CAAC;AAiBlB,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,cAAc,CAoB3G;AAED,wBAAgB,gBAAgB,IAAI,gBAAgB,CAgCnD"}
1
+ {"version":3,"file":"context-collector.d.ts","sourceRoot":"","sources":["../../src/core/context-collector.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,gBAAgB,EAGjB,MAAM,UAAU,CAAC;AAiBlB,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,cAAc,CAoB3G;AAED,wBAAgB,gBAAgB,IAAI,gBAAgB,CAkCnD"}
@@ -23,19 +23,21 @@ export function collectContext(appKey, merchantLanguage, clientType) {
23
23
  export function collectMarketing() {
24
24
  if (!isBrowser())
25
25
  return {};
26
- // Persist UTM params from the landing URL so they survive SPA navigation
26
+ // If current URL has UTM params (new campaign visit), update the cache and use them.
27
+ // If not (SPA internal navigation), fall back to cached value so attribution is preserved.
27
28
  let utm = {};
28
- const storedUtm = safeLocalStorageGet(STORAGE_KEYS.UTM_PARAMS);
29
- if (storedUtm) {
30
- try {
31
- utm = JSON.parse(storedUtm);
32
- }
33
- catch { /* ignore corrupt value */ }
29
+ const freshUtm = parseUTMParams();
30
+ if (Object.keys(freshUtm).length > 0) {
31
+ utm = freshUtm;
32
+ safeLocalStorageSet(STORAGE_KEYS.UTM_PARAMS, JSON.stringify(utm));
34
33
  }
35
34
  else {
36
- utm = parseUTMParams();
37
- if (Object.keys(utm).length > 0) {
38
- safeLocalStorageSet(STORAGE_KEYS.UTM_PARAMS, JSON.stringify(utm));
35
+ const storedUtm = safeLocalStorageGet(STORAGE_KEYS.UTM_PARAMS);
36
+ if (storedUtm) {
37
+ try {
38
+ utm = JSON.parse(storedUtm);
39
+ }
40
+ catch { /* ignore corrupt value */ }
39
41
  }
40
42
  }
41
43
  let landingPage = safeLocalStorageGet(STORAGE_KEYS.LANDING_PAGE);
@@ -3,10 +3,9 @@ export interface GAEventOptions {
3
3
  sessionId: string;
4
4
  pageUrl: string;
5
5
  referrer: string;
6
- marketing: MarketingPayload;
7
- userId?: string | null;
8
6
  }
9
7
  export declare function trackToGA(eventName: string, properties: Record<string, unknown>, options: GAEventOptions): void;
10
8
  export declare function setGAUserId(userId: string | null): void;
11
9
  export declare function setGAUserProperties(properties: Record<string, unknown>): void;
10
+ export declare function setGAMarketing(marketing: MarketingPayload): void;
12
11
  //# sourceMappingURL=ga-adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ga-adapter.d.ts","sourceRoot":"","sources":["../../src/core/ga-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,wBAAgB,SAAS,CACvB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,OAAO,EAAE,cAAc,GACtB,IAAI,CAqBN;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAGvD;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAG7E"}
1
+ {"version":3,"file":"ga-adapter.d.ts","sourceRoot":"","sources":["../../src/core/ga-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAqBD,wBAAgB,SAAS,CACvB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,OAAO,EAAE,cAAc,GACtB,IAAI,CAqBN;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAGvD;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAG7E;AAID,wBAAgB,cAAc,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAWhE"}
@@ -1,27 +1,38 @@
1
+ // GA4 reserved event names — sending these as custom events causes silent drops
2
+ const GA4_RESERVED_NAMES = new Set([
3
+ 'ad_activeview', 'ad_click', 'ad_exposure', 'ad_impression', 'ad_query',
4
+ 'adunit_exposure', 'app_clear_data', 'app_exception', 'app_install',
5
+ 'app_remove', 'app_update', 'app_upgrade', 'error', 'firebase_campaign',
6
+ 'first_open', 'first_visit', 'in_app_purchase', 'notification_dismiss',
7
+ 'notification_foreground', 'notification_open', 'notification_receive',
8
+ 'os_update', 'session_start', 'user_engagement',
9
+ ]);
10
+ // System/automated events — don't contribute to engagement_time_msec
11
+ const SYSTEM_EVENTS = new Set(['web_vital', 'error_event']);
12
+ function sanitizeEventName(name) {
13
+ let result = name.replace(/[^a-zA-Z0-9_]/g, '_');
14
+ if (!/^[a-zA-Z]/.test(result))
15
+ result = 'e_' + result;
16
+ return result.slice(0, 40);
17
+ }
1
18
  export function trackToGA(eventName, properties, options) {
2
19
  if (typeof window === 'undefined' || !window.gtag)
3
20
  return;
4
- const params = {
5
- session_id: options.sessionId,
6
- engagement_time_msec: 100,
7
- page_location: options.pageUrl,
8
- page_referrer: options.referrer,
9
- };
10
- const { marketing, userId } = options;
11
- if (marketing.utm_source)
12
- params.utm_source = marketing.utm_source;
13
- if (marketing.utm_medium)
14
- params.utm_medium = marketing.utm_medium;
15
- if (marketing.utm_campaign)
16
- params.utm_campaign = marketing.utm_campaign;
17
- if (marketing.utm_term)
18
- params.utm_term = marketing.utm_term;
19
- if (marketing.utm_content)
20
- params.utm_content = marketing.utm_content;
21
- if (userId)
22
- params.user_id = userId;
23
- Object.assign(params, properties);
24
- window.gtag('event', eventName, params);
21
+ // Sanitize event name for GA4 compliance
22
+ const safeName = GA4_RESERVED_NAMES.has(eventName)
23
+ ? `custom_${eventName}`.slice(0, 40)
24
+ : sanitizeEventName(eventName);
25
+ // Business properties first, then GA reserved fields override — prevents
26
+ // caller properties from corrupting session_id / page_location etc.
27
+ const params = { ...properties };
28
+ params.session_id = options.sessionId;
29
+ params.page_location = options.pageUrl;
30
+ params.page_referrer = options.referrer;
31
+ // engagement_time_msec only for user-facing events, not automated system events
32
+ if (!SYSTEM_EVENTS.has(eventName)) {
33
+ params.engagement_time_msec = 100;
34
+ }
35
+ window.gtag('event', safeName, params);
25
36
  }
26
37
  export function setGAUserId(userId) {
27
38
  if (typeof window === 'undefined' || !window.gtag)
@@ -33,3 +44,23 @@ export function setGAUserProperties(properties) {
33
44
  return;
34
45
  window.gtag('set', 'user_properties', properties);
35
46
  }
47
+ // Set UTM attribution once at session level — GA4 auto-associates with all
48
+ // subsequent events, no need to repeat on every event payload
49
+ export function setGAMarketing(marketing) {
50
+ if (typeof window === 'undefined' || !window.gtag)
51
+ return;
52
+ const params = {};
53
+ if (marketing.utm_source)
54
+ params.utm_source = marketing.utm_source;
55
+ if (marketing.utm_medium)
56
+ params.utm_medium = marketing.utm_medium;
57
+ if (marketing.utm_campaign)
58
+ params.utm_campaign = marketing.utm_campaign;
59
+ if (marketing.utm_term)
60
+ params.utm_term = marketing.utm_term;
61
+ if (marketing.utm_content)
62
+ params.utm_content = marketing.utm_content;
63
+ if (Object.keys(params).length > 0) {
64
+ window.gtag('set', params);
65
+ }
66
+ }
@@ -98,6 +98,7 @@ export interface AnalyticsConfig {
98
98
  env?: Environment;
99
99
  debug?: boolean;
100
100
  autoTrack?: boolean;
101
+ autoTrackPageView?: boolean;
101
102
  system?: string;
102
103
  domain?: string;
103
104
  keyEvents?: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "onerway-analytics",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "Onrway Analytics SDK",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",