onerway-analytics 1.0.1 → 1.0.2

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.
@@ -82,7 +82,8 @@ var OnrwayAnalytics = (() => {
82
82
  FAILED_QUEUE: "__analytics_failed_queue__",
83
83
  CLIENT_ID: "__analytics_client_id__",
84
84
  LANDING_PAGE: "__analytics_landing_page__",
85
- REFERRER_URL: "__analytics_referrer_url__"
85
+ REFERRER_URL: "__analytics_referrer_url__",
86
+ UTM_PARAMS: "__analytics_utm_params__"
86
87
  };
87
88
  var MAX_STORAGE_ITEMS = 500;
88
89
 
@@ -313,6 +314,7 @@ var OnrwayAnalytics = (() => {
313
314
  }
314
315
  createNewSession() {
315
316
  const id = generateUUID();
317
+ this.sessionId = id;
316
318
  this.createdAt = Date.now();
317
319
  this.saveSession();
318
320
  return id;
@@ -385,6 +387,7 @@ var OnrwayAnalytics = (() => {
385
387
  };
386
388
 
387
389
  // src/core/storage.ts
390
+ var MAX_EVENT_AGE_MS = 24 * 60 * 60 * 1e3;
388
391
  var StorageQueue = class _StorageQueue {
389
392
  static enqueue(event) {
390
393
  try {
@@ -401,7 +404,8 @@ var OnrwayAnalytics = (() => {
401
404
  try {
402
405
  const queue = _StorageQueue.readQueue();
403
406
  _StorageQueue.clear();
404
- const events = queue.map((item) => item.event);
407
+ const now = Date.now();
408
+ const events = queue.filter((item) => now - item.storedAt < MAX_EVENT_AGE_MS).map((item) => item.event);
405
409
  return events;
406
410
  } catch {
407
411
  return [];
@@ -449,7 +453,19 @@ var OnrwayAnalytics = (() => {
449
453
  }
450
454
  function collectMarketing() {
451
455
  if (!isBrowser()) return {};
452
- const utm = parseUTMParams();
456
+ let utm = {};
457
+ const storedUtm = safeLocalStorageGet(STORAGE_KEYS.UTM_PARAMS);
458
+ if (storedUtm) {
459
+ try {
460
+ utm = JSON.parse(storedUtm);
461
+ } catch {
462
+ }
463
+ } else {
464
+ utm = parseUTMParams();
465
+ if (Object.keys(utm).length > 0) {
466
+ safeLocalStorageSet(STORAGE_KEYS.UTM_PARAMS, JSON.stringify(utm));
467
+ }
468
+ }
453
469
  let landingPage = safeLocalStorageGet(STORAGE_KEYS.LANDING_PAGE);
454
470
  if (!landingPage) {
455
471
  landingPage = window.location.href;
@@ -502,7 +518,7 @@ var OnrwayAnalytics = (() => {
502
518
  function getTrackName(element) {
503
519
  const name = element.getAttribute(NAME_ATTR);
504
520
  if (name) return name;
505
- const id = element.id ? `_${element.id}` : "";
521
+ const id = element.id ? `_${element.id.replace(/[^\w-]/g, "_")}` : "";
506
522
  const tag = element.tagName.toLowerCase();
507
523
  return `click_${tag}${id}`;
508
524
  }
@@ -630,7 +646,7 @@ var OnrwayAnalytics = (() => {
630
646
  // src/core/ga-loader.ts
631
647
  function loadGtagScript(measurementId) {
632
648
  return new Promise((resolve, reject) => {
633
- if (typeof window !== "undefined" && typeof window.gtag === "function") {
649
+ if (document.querySelector(`script[src*="googletagmanager.com/gtag/js"]`)) {
634
650
  resolve();
635
651
  return;
636
652
  }
@@ -645,16 +661,16 @@ var OnrwayAnalytics = (() => {
645
661
  async function initGA(config) {
646
662
  if (!config.enabled || !config.measurementId) return;
647
663
  if (typeof window === "undefined") return;
648
- await loadGtagScript(config.measurementId);
649
664
  window.dataLayer = window.dataLayer || [];
650
- window.gtag = function gtag(...args) {
651
- window.dataLayer.push(args);
665
+ window.gtag = function gtag() {
666
+ window.dataLayer.push(arguments);
652
667
  };
653
668
  window.gtag("js", /* @__PURE__ */ new Date());
654
669
  window.gtag("config", config.measurementId, {
655
670
  send_page_view: config.sendPageView ?? false,
656
671
  debug_mode: config.debugMode ?? false
657
672
  });
673
+ await loadGtagScript(config.measurementId);
658
674
  }
659
675
 
660
676
  // node_modules/web-vitals/dist/web-vitals.js
@@ -1029,6 +1045,9 @@ var OnrwayAnalytics = (() => {
1029
1045
  this.initialized = false;
1030
1046
  this.retrying = 0;
1031
1047
  this.gaInitialized = false;
1048
+ this.gaPendingQueue = [];
1049
+ this.gaPendingIdentify = null;
1050
+ this.unloadHandler = null;
1032
1051
  this.ga = new GAManager();
1033
1052
  this.config = {
1034
1053
  debug: false,
@@ -1063,8 +1082,21 @@ var OnrwayAnalytics = (() => {
1063
1082
  initGA(this.config.ga).then(() => {
1064
1083
  this.gaInitialized = true;
1065
1084
  this.log("GA4 initialized with measurementId:", this.config.ga?.measurementId);
1085
+ if (this.gaPendingIdentify) {
1086
+ setGAUserId(this.gaPendingIdentify.userId);
1087
+ if (this.gaPendingIdentify.attributes) {
1088
+ setGAUserProperties(this.gaPendingIdentify.attributes);
1089
+ }
1090
+ this.gaPendingIdentify = null;
1091
+ }
1092
+ for (const { eventName, properties, options } of this.gaPendingQueue) {
1093
+ trackToGA(eventName, properties, options);
1094
+ }
1095
+ this.gaPendingQueue = [];
1066
1096
  }).catch((error) => {
1067
1097
  this.ga._destroy();
1098
+ this.gaPendingIdentify = null;
1099
+ this.gaPendingQueue = [];
1068
1100
  this.log("Failed to initialize GA4:", error);
1069
1101
  });
1070
1102
  }
@@ -1085,14 +1117,19 @@ var OnrwayAnalytics = (() => {
1085
1117
  }
1086
1118
  const normalizedProps = properties && isObject(properties) ? properties : {};
1087
1119
  const isKeyEvent = options?.keyEvent === true || this.isKeyEvent(eventName);
1088
- if (this.gaInitialized) {
1089
- trackToGA(eventName, normalizedProps, {
1120
+ if (this.config.ga?.enabled) {
1121
+ const gaOptions = {
1090
1122
  sessionId: this.sessionManager.getSessionId(),
1091
1123
  pageUrl: isBrowser() ? getPageUrl() : "",
1092
1124
  referrer: isBrowser() ? document.referrer : "",
1093
1125
  marketing: collectMarketing(),
1094
1126
  userId: this.userId
1095
- });
1127
+ };
1128
+ if (this.gaInitialized) {
1129
+ trackToGA(eventName, normalizedProps, gaOptions);
1130
+ } else {
1131
+ this.gaPendingQueue.push({ eventName, properties: normalizedProps, options: gaOptions });
1132
+ }
1096
1133
  }
1097
1134
  if (this.config.disableServer) return;
1098
1135
  const event = {
@@ -1126,6 +1163,8 @@ var OnrwayAnalytics = (() => {
1126
1163
  if (attributes && isObject(attributes)) {
1127
1164
  setGAUserProperties(attributes);
1128
1165
  }
1166
+ } else if (this.config.ga?.enabled) {
1167
+ this.gaPendingIdentify = { userId, attributes };
1129
1168
  }
1130
1169
  this.log("User identified:", { userId, attributes });
1131
1170
  if (wasAnonymous && this.buffer.length > 0) {
@@ -1235,6 +1274,10 @@ var OnrwayAnalytics = (() => {
1235
1274
  this.bufferTimer = null;
1236
1275
  }
1237
1276
  if (this.buffer.length === 0) return;
1277
+ if (this.retrying > 0) {
1278
+ this.scheduleBufferFlush();
1279
+ return;
1280
+ }
1238
1281
  const events = this.buffer.splice(0, this.buffer.length);
1239
1282
  events.forEach((e2, i2) => {
1240
1283
  e2.batch_event_index = i2;
@@ -1270,6 +1313,9 @@ var OnrwayAnalytics = (() => {
1270
1313
  setTimeout(() => {
1271
1314
  this.retrying -= 1;
1272
1315
  this.sendBatch(events, retryCount + 1);
1316
+ if (this.buffer.length > 0) {
1317
+ this.scheduleBufferFlush();
1318
+ }
1273
1319
  }, delay);
1274
1320
  } else {
1275
1321
  this.log("Max retries reached, persisting events to localStorage");
@@ -1310,6 +1356,17 @@ var OnrwayAnalytics = (() => {
1310
1356
  }
1311
1357
  }
1312
1358
  }
1359
+ destroy() {
1360
+ if (this.unloadHandler) {
1361
+ window.removeEventListener("beforeunload", this.unloadHandler);
1362
+ window.removeEventListener("pagehide", this.unloadHandler);
1363
+ this.unloadHandler = null;
1364
+ }
1365
+ if (this.bufferTimer) {
1366
+ clearTimeout(this.bufferTimer);
1367
+ this.bufferTimer = null;
1368
+ }
1369
+ }
1313
1370
  registerBeforeUnload() {
1314
1371
  if (!isBrowser() || this.config.disableServer) return;
1315
1372
  const handler = () => {
@@ -1344,6 +1401,7 @@ var OnrwayAnalytics = (() => {
1344
1401
  }
1345
1402
  }
1346
1403
  };
1404
+ this.unloadHandler = handler;
1347
1405
  window.addEventListener("beforeunload", handler);
1348
1406
  window.addEventListener("pagehide", handler);
1349
1407
  }
@@ -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} as const;\r\n\r\nexport const MAX_STORAGE_ITEMS = 500;\r\n", "import { BrowserInfo, OSInfo } from '../types';\r\n\r\nexport function generateId(): string {\r\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\r\n}\r\n\r\nexport function getTimestamp(): number {\r\n return Date.now();\r\n}\r\n\r\nexport function isObject(value: unknown): value is Record<string, unknown> {\r\n return Object.prototype.toString.call(value) === '[object Object]';\r\n}\r\n\r\nexport function merge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {\r\n const result = { ...target };\r\n for (const key in source) {\r\n if (Object.prototype.hasOwnProperty.call(source, key)) {\r\n result[key] = source[key] as T[Extract<keyof T, string>];\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nexport function generateUUID(): string {\r\n const hex = '0123456789abcdef';\r\n const template = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';\r\n return template.replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return hex[v];\r\n });\r\n}\r\n\r\nexport function generateShortId(): string {\r\n return Math.random().toString(36).substring(2, 10);\r\n}\r\n\r\nexport function detectBrowser(): BrowserInfo {\r\n if (typeof navigator === 'undefined') return { name: 'Unknown', version: '0' };\r\n\r\n const ua = navigator.userAgent;\r\n const edgeMatch = ua.match(/Edg\\/(\\d+)/);\r\n if (edgeMatch) return { name: 'Edge', version: edgeMatch[1] };\r\n\r\n const chromeMatch = ua.match(/Chrome\\/(\\d+)/);\r\n const safariMatch = ua.match(/Safari\\/(\\d+)/);\r\n\r\n if (chromeMatch && !ua.includes('Edg') && !ua.includes('OPR')) {\r\n return { name: 'Chrome', version: chromeMatch[1] };\r\n }\r\n\r\n const firefoxMatch = ua.match(/Firefox\\/(\\d+)/);\r\n if (firefoxMatch) return { name: 'Firefox', version: firefoxMatch[1] };\r\n\r\n const opMatch = ua.match(/OPR\\/(\\d+)/);\r\n if (opMatch) return { name: 'Opera', version: opMatch[1] };\r\n\r\n if (safariMatch && !ua.includes('Chrome')) {\r\n const versionMatch = ua.match(/Version\\/(\\d+)/);\r\n return { name: 'Safari', version: versionMatch ? versionMatch[1] : safariMatch[1] };\r\n }\r\n\r\n const ieMatch = ua.match(/(?:MSIE |Trident\\/.*; rv:)(\\d+)/);\r\n if (ieMatch) return { name: 'IE', version: ieMatch[1] };\r\n\r\n return { name: 'Unknown', version: '0' };\r\n}\r\n\r\nexport function detectOS(): OSInfo {\r\n if (typeof navigator === 'undefined') return { name: 'Unknown', version: '0' };\r\n\r\n const ua = navigator.userAgent;\r\n const platform = navigator.platform || '';\r\n\r\n if (ua.includes('Windows NT 10')) return { name: 'Windows', version: '10' };\r\n if (ua.includes('Windows NT 6.3')) return { name: 'Windows', version: '8.1' };\r\n if (ua.includes('Windows NT 6.2')) return { name: 'Windows', version: '8' };\r\n if (ua.includes('Windows NT 6.1')) return { name: 'Windows', version: '7' };\r\n if (/Windows NT \\d/.test(ua)) return { name: 'Windows', version: ua.match(/Windows NT (\\d+\\.?\\d*)/)?.[1] || '0' };\r\n\r\n const macMatch = ua.match(/Mac OS X (\\d+[._]\\d+)/);\r\n if (macMatch) return { name: 'macOS', version: macMatch[1].replace('_', '.') };\r\n\r\n if (platform.startsWith('Mac')) return { name: 'macOS', version: '0' };\r\n\r\n if (/Android (\\d+\\.?\\d*)/.test(ua)) return { name: 'Android', version: ua.match(/Android (\\d+\\.?\\d*)/)?.[1] || '0' };\r\n\r\n if (/iPhone|iPad|iPod/.test(ua)) {\r\n const iosMatch = ua.match(/OS (\\d+[._]\\d+)/);\r\n return { name: 'iOS', version: iosMatch ? iosMatch[1].replace('_', '.') : '0' };\r\n }\r\n\r\n if (/Linux/.test(ua) || platform.includes('Linux')) return { name: 'Linux', version: '0' };\r\n\r\n return { name: 'Unknown', version: '0' };\r\n}\r\n\r\nexport function getDeviceType(): 'mobile' | 'tablet' | 'desktop' {\r\n if (typeof window === 'undefined' || typeof navigator === 'undefined') return 'desktop';\r\n\r\n const width = window.screen.width;\r\n const hasTouch = navigator.maxTouchPoints > 0;\r\n\r\n if (width < 768 && hasTouch) return 'mobile';\r\n if (width >= 768 && width <= 1024 && hasTouch) return 'tablet';\r\n return 'desktop';\r\n}\r\n\r\nexport function getScreenSize(): { width: number; height: number } {\r\n if (typeof window === 'undefined') return { width: 0, height: 0 };\r\n return {\r\n width: window.screen.width,\r\n height: window.screen.height,\r\n };\r\n}\r\n\r\nexport function getPageUrl(): string {\r\n if (typeof window === 'undefined') return '';\r\n return window.location.href;\r\n}\r\n\r\nexport function getReferrer(): string {\r\n if (typeof document === 'undefined') return '';\r\n return document.referrer || '';\r\n}\r\n\r\nexport function getHostname(): string {\r\n if (typeof window === 'undefined') return '';\r\n return window.location.host.split(':')[0];\r\n}\r\n\r\nexport function getTimezone(): string {\r\n try {\r\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n } catch {\r\n return 'UTC';\r\n }\r\n}\r\n\r\nexport function getLanguage(): string {\r\n if (typeof navigator === 'undefined') return 'en-US';\r\n return navigator.language || 'en-US';\r\n}\r\n\r\nexport function getCountryFromLanguage(language: string): string {\r\n const parts = language.split('-');\r\n if (parts.length > 1) return parts[1].toUpperCase();\r\n const langMap: Record<string, string> = {\r\n zh: 'CN', en: 'US', ja: 'JP', ko: 'KR', fr: 'FR',\r\n de: 'DE', es: 'ES', pt: 'BR', ru: 'RU', ar: 'SA',\r\n };\r\n return langMap[parts[0]] || parts[0].toUpperCase();\r\n}\r\n\r\nexport function parseUTMParams(): Record<string, string> {\r\n if (typeof window === 'undefined') return {};\r\n\r\n const params: Record<string, string> = {};\r\n const searchParams = new URLSearchParams(window.location.search);\r\n const utmKeys = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];\r\n\r\n for (const key of utmKeys) {\r\n const value = searchParams.get(key);\r\n if (value) params[key] = value;\r\n }\r\n\r\n return params;\r\n}\r\n\r\nexport function isBrowser(): boolean {\r\n return typeof window !== 'undefined' && typeof document !== 'undefined';\r\n}\r\n\r\nexport function safeLocalStorageGet(key: string): string | null {\r\n try {\r\n return localStorage.getItem(key);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function safeLocalStorageSet(key: string, value: string): boolean {\r\n try {\r\n localStorage.setItem(key, value);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function safeLocalStorageRemove(key: string): void {\r\n try {\r\n localStorage.removeItem(key);\r\n } catch {\r\n // ignore\r\n }\r\n}\r\n\r\nexport function safeSessionStorageGet(key: string): string | null {\r\n try {\r\n return sessionStorage.getItem(key);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function safeSessionStorageSet(key: string, value: string): boolean {\r\n try {\r\n sessionStorage.setItem(key, value);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function safeSessionStorageRemove(key: string): void {\r\n try {\r\n sessionStorage.removeItem(key);\r\n } catch {\r\n // ignore\r\n }\r\n}\r\n\r\nexport function truncateText(text: string, maxLength: number): string {\r\n if (!text) return '';\r\n const trimmed = text.trim().replace(/\\s+/g, ' ');\r\n return trimmed.length > maxLength ? trimmed.substring(0, maxLength) + '...' : trimmed;\r\n}\r\n", "import { generateUUID, safeSessionStorageGet, safeSessionStorageSet, safeSessionStorageRemove } from '../utils';\r\n\r\nconst SESSION_KEY = '__analytics_session__';\r\nconst SESSION_DEFAULT_TIMEOUT = 30 * 60 * 1000;\r\n\r\ninterface SessionData {\r\n sessionId: string;\r\n createdAt: number;\r\n}\r\n\r\nexport class SessionManager {\r\n private sessionId: string;\r\n private createdAt: number = 0;\r\n private timeout: number;\r\n\r\n constructor(timeout: number = SESSION_DEFAULT_TIMEOUT) {\r\n this.timeout = timeout;\r\n const existing = this.loadSession();\r\n if (existing && !this.isExpired(existing)) {\r\n this.sessionId = existing.sessionId;\r\n this.createdAt = existing.createdAt;\r\n } else {\r\n this.sessionId = this.createNewSession();\r\n this.createdAt = Date.now();\r\n }\r\n }\r\n\r\n getSessionId(): string {\r\n if (this.isExpired({ sessionId: this.sessionId, createdAt: this.createdAt })) {\r\n this.sessionId = this.createNewSession();\r\n }\r\n return this.sessionId;\r\n }\r\n\r\n refresh(): void {\r\n this.sessionId = this.createNewSession();\r\n }\r\n\r\n private loadSession(): SessionData | null {\r\n try {\r\n const raw = safeSessionStorageGet(SESSION_KEY);\r\n if (!raw) return null;\r\n return JSON.parse(raw) as SessionData;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private saveSession(): void {\r\n const data: SessionData = {\r\n sessionId: this.sessionId,\r\n createdAt: this.createdAt,\r\n };\r\n safeSessionStorageSet(SESSION_KEY, JSON.stringify(data));\r\n }\r\n\r\n private isExpired(data: SessionData): boolean {\r\n return Date.now() - data.createdAt > this.timeout;\r\n }\r\n\r\n private createNewSession(): string {\r\n const id = generateUUID();\r\n this.createdAt = Date.now();\r\n this.saveSession();\r\n return id;\r\n }\r\n}\r\n", "import { AnalyticsPayload } from '../types';\r\n\r\nexport class Sender {\r\n static async send(payload: AnalyticsPayload, serverUrl: string, apiKey: string): Promise<void> {\r\n if (Sender.supportsKeepalive()) {\r\n return Sender.fetchSend(payload, serverUrl, apiKey);\r\n }\r\n return Sender.xhrSend(payload, serverUrl, apiKey);\r\n }\r\n\r\n static async sendBeacon(payload: AnalyticsPayload, serverUrl: string, apiKey: string): Promise<void> {\r\n if (typeof navigator === 'undefined' || !navigator.sendBeacon) {\r\n throw new Error('sendBeacon not available');\r\n }\r\n\r\n const url = Sender.buildBeaconUrl(serverUrl, apiKey);\r\n const blob = new Blob([JSON.stringify(payload)], { type: 'application/json' });\r\n const success = navigator.sendBeacon(url, blob);\r\n\r\n if (!success) {\r\n throw new Error('sendBeacon rejected payload');\r\n }\r\n }\r\n\r\n static async fetchSend(payload: AnalyticsPayload, serverUrl: string, apiKey: string): Promise<void> {\r\n const response = await fetch(serverUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n apiKey,\r\n },\r\n body: JSON.stringify(payload),\r\n keepalive: true,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n }\r\n\r\n static async xhrSend(payload: AnalyticsPayload, serverUrl: string, apiKey: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open('POST', serverUrl);\r\n xhr.setRequestHeader('Content-Type', 'application/json');\r\n xhr.setRequestHeader('apiKey', apiKey);\r\n xhr.timeout = 10000;\r\n\r\n xhr.onload = () => {\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n resolve();\r\n } else {\r\n reject(new Error(`HTTP ${xhr.status}: ${xhr.statusText}`));\r\n }\r\n };\r\n\r\n xhr.onerror = () => reject(new Error('XHR network error'));\r\n xhr.ontimeout = () => reject(new Error('XHR timeout'));\r\n\r\n xhr.send(JSON.stringify(payload));\r\n });\r\n }\r\n\r\n private static supportsKeepalive(): boolean {\r\n try {\r\n return typeof Request !== 'undefined' && 'keepalive' in Request.prototype;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private static buildBeaconUrl(serverUrl: string, apiKey: string): string {\r\n const separator = serverUrl.includes('?') ? '&' : '?';\r\n return `${serverUrl}${separator}apiKey=${encodeURIComponent(apiKey)}`;\r\n }\r\n}\r\n", "import { EventPayload, StorageQueueItem, STORAGE_KEYS, MAX_STORAGE_ITEMS } from '../types';\r\nimport { safeLocalStorageGet, safeLocalStorageSet, safeLocalStorageRemove } from '../utils';\r\n\r\nexport class StorageQueue {\r\n static enqueue(event: EventPayload): void {\r\n try {\r\n const queue = StorageQueue.readQueue();\r\n queue.push({ event, storedAt: Date.now() });\r\n\r\n while (queue.length > MAX_STORAGE_ITEMS) {\r\n queue.shift();\r\n }\r\n\r\n safeLocalStorageSet(STORAGE_KEYS.FAILED_QUEUE, JSON.stringify(queue));\r\n } catch {\r\n // Silently fail if storage is unavailable\r\n }\r\n }\r\n\r\n static recover(): EventPayload[] {\r\n try {\r\n const queue = StorageQueue.readQueue();\r\n StorageQueue.clear();\r\n\r\n const events = queue.map((item) => item.event);\r\n return events;\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n static clear(): void {\r\n safeLocalStorageRemove(STORAGE_KEYS.FAILED_QUEUE);\r\n }\r\n\r\n static getQueueSize(): number {\r\n return StorageQueue.readQueue().length;\r\n }\r\n\r\n private static readQueue(): StorageQueueItem[] {\r\n try {\r\n const raw = safeLocalStorageGet(STORAGE_KEYS.FAILED_QUEUE);\r\n if (!raw) return [];\r\n const parsed = JSON.parse(raw);\r\n if (!Array.isArray(parsed)) return [];\r\n return parsed;\r\n } catch {\r\n return [];\r\n }\r\n }\r\n}\r\n", "import {\r\n ContextPayload,\r\n MarketingPayload,\r\n SDK_VERSION,\r\n STORAGE_KEYS,\r\n} from '../types';\r\nimport {\r\n detectBrowser,\r\n detectOS,\r\n getDeviceType,\r\n getScreenSize,\r\n getHostname,\r\n getReferrer,\r\n getTimezone,\r\n getLanguage,\r\n getCountryFromLanguage,\r\n parseUTMParams,\r\n safeLocalStorageGet,\r\n safeLocalStorageSet,\r\n isBrowser,\r\n} from '../utils';\r\n\r\nexport function collectContext(appKey: string, merchantLanguage: string, clientType: string): ContextPayload {\r\n const screen = getScreenSize();\r\n\r\n return {\r\n sdk_version: SDK_VERSION,\r\n app_key: appKey,\r\n screen_width: screen.width,\r\n screen_height: screen.height,\r\n user_agent: isBrowser() ? navigator.userAgent : '',\r\n referrer: getReferrer(),\r\n hostname: getHostname(),\r\n browser: detectBrowser(),\r\n operating_system: detectOS(),\r\n device_type: getDeviceType(),\r\n country: getCountryFromLanguage(getLanguage()),\r\n language: getLanguage(),\r\n merchant_language: merchantLanguage,\r\n timezone: getTimezone(),\r\n client_type: clientType,\r\n };\r\n}\r\n\r\nexport function collectMarketing(): MarketingPayload {\r\n if (!isBrowser()) return {};\r\n\r\n const utm = parseUTMParams();\r\n\r\n let landingPage = safeLocalStorageGet(STORAGE_KEYS.LANDING_PAGE);\r\n if (!landingPage) {\r\n landingPage = window.location.href;\r\n safeLocalStorageSet(STORAGE_KEYS.LANDING_PAGE, landingPage);\r\n }\r\n\r\n let referrerUrl = safeLocalStorageGet(STORAGE_KEYS.REFERRER_URL);\r\n if (referrerUrl === null && document.referrer) {\r\n referrerUrl = document.referrer;\r\n safeLocalStorageSet(STORAGE_KEYS.REFERRER_URL, referrerUrl);\r\n }\r\n\r\n return {\r\n ...utm,\r\n landing_page: landingPage || window.location.href,\r\n referrer_url: referrerUrl || '',\r\n };\r\n}\r\n", "import { truncateText } from '../utils';\r\n\r\nconst TRACK_ATTR_PREFIX = 'data-track-';\r\nconst IGNORE_ATTR = 'data-track-ignore';\r\nconst NAME_ATTR = 'data-track-name';\r\nconst PROPS_ATTR = 'data-track-properties';\r\n\r\nexport interface AutoTrackAPI {\r\n track(eventName: string, properties?: Record<string, unknown>): void;\r\n debug?: boolean;\r\n}\r\n\r\nexport function initAutoTrack(api: AutoTrackAPI, selector?: string): void {\r\n if (typeof document === 'undefined') return;\r\n\r\n const handler = (e: Event): void => {\r\n try {\r\n const target = e.target as HTMLElement;\r\n if (!target) return;\r\n\r\n if (shouldIgnoreElement(target)) return;\r\n\r\n if (selector) {\r\n const scope = document.querySelector(selector);\r\n if (scope && !scope.contains(target)) return;\r\n }\r\n\r\n const eventName = getTrackName(target);\r\n const properties = collectElementProperties(target);\r\n\r\n api.track(eventName, properties);\r\n } catch {\r\n // Fail silently to avoid breaking user's page\r\n }\r\n };\r\n\r\n document.addEventListener('click', handler, true);\r\n}\r\n\r\nfunction shouldIgnoreElement(element: HTMLElement): boolean {\r\n let current: HTMLElement | null = element;\r\n while (current) {\r\n if (current.hasAttribute(IGNORE_ATTR)) return true;\r\n current = current.parentElement;\r\n }\r\n return false;\r\n}\r\n\r\nfunction getTrackName(element: HTMLElement): string {\r\n const name = element.getAttribute(NAME_ATTR);\r\n if (name) return name;\r\n\r\n const id = element.id ? `_${element.id}` : '';\r\n const tag = element.tagName.toLowerCase();\r\n return `click_${tag}${id}`;\r\n}\r\n\r\nfunction collectElementProperties(element: HTMLElement): Record<string, unknown> {\r\n const props: Record<string, unknown> = {\r\n action: 'click',\r\n target_type: inferTargetType(element),\r\n target_id: getTargetId(element),\r\n target_tag: element.tagName.toLowerCase(),\r\n target_class: getTruncatedClassName(element),\r\n target_text: truncateText(element.innerText || '', 50),\r\n };\r\n\r\n if (element.hasAttribute('href') || element.closest('a')) {\r\n const anchor = element.closest('a');\r\n if (anchor) {\r\n props.target_href = anchor.getAttribute('href') || '';\r\n }\r\n }\r\n\r\n const customProps = collectDataTrackProps(element);\r\n Object.assign(props, customProps);\r\n\r\n return props;\r\n}\r\n\r\nfunction inferTargetType(element: HTMLElement): string {\r\n const tag = element.tagName.toLowerCase();\r\n if (tag === 'a' || tag === 'button') return 'button';\r\n if (tag === 'input') {\r\n const type = (element as HTMLInputElement).type;\r\n if (type === 'submit' || type === 'button' || type === 'reset') return 'button';\r\n if (type === 'checkbox' || type === 'radio') return 'checkbox';\r\n return 'input';\r\n }\r\n if (tag === 'select') return 'select';\r\n if (tag === 'img') return 'image';\r\n if (tag === 'form') return 'form';\r\n if (tag === 'textarea') return 'input';\r\n return 'element';\r\n}\r\n\r\nfunction getTargetId(element: HTMLElement): string {\r\n if (element.id) return element.id;\r\n\r\n const name = element.getAttribute('name');\r\n if (name) return name;\r\n\r\n const dataTestId = element.getAttribute('data-testid') || element.getAttribute('data-test-id');\r\n if (dataTestId) return dataTestId;\r\n\r\n return '';\r\n}\r\n\r\nfunction getTruncatedClassName(element: HTMLElement): string {\r\n const cls = typeof element.className === 'string' ? element.className : '';\r\n return truncateText(cls, 100);\r\n}\r\n\r\nfunction collectDataTrackProps(element: HTMLElement): Record<string, unknown> {\r\n const props: Record<string, unknown> = {};\r\n const trackName = element.getAttribute(NAME_ATTR);\r\n if (trackName) props.name = trackName;\r\n\r\n const rawProps = element.getAttribute(PROPS_ATTR);\r\n if (rawProps) {\r\n try {\r\n const parsed = JSON.parse(rawProps);\r\n Object.assign(props, parsed);\r\n } catch {\r\n // Invalid JSON, ignore\r\n }\r\n }\r\n\r\n for (const attr of Array.from(element.attributes)) {\r\n if (attr.name.startsWith(TRACK_ATTR_PREFIX) && attr.name !== NAME_ATTR && attr.name !== PROPS_ATTR && attr.name !== IGNORE_ATTR) {\r\n const key = attr.name.replace(TRACK_ATTR_PREFIX, '');\r\n props[key] = attr.value;\r\n }\r\n }\r\n\r\n return props;\r\n}\r\n", "export interface ErrorMonitorAPI {\r\n track(eventName: string, properties?: Record<string, unknown>): void;\r\n}\r\n\r\nexport function initErrorMonitor(api: ErrorMonitorAPI): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n window.addEventListener('error', (event: ErrorEvent) => {\r\n try {\r\n const { message, filename, lineno, colno, error } = event;\r\n\r\n const isResourceError = !message && event.target !== window;\r\n if (isResourceError) return;\r\n\r\n api.track('error_event', {\r\n action: 'error',\r\n target_type: 'system',\r\n error_type: 'window_error',\r\n error_message: message || 'Unknown error',\r\n error_filename: filename || '',\r\n error_lineno: lineno || 0,\r\n error_colno: colno || 0,\r\n error_stack: error instanceof Error ? error.stack : '',\r\n error_name: error instanceof Error ? error.name : '',\r\n });\r\n } catch {\r\n // Fail silently to avoid recursive error reporting\r\n }\r\n });\r\n\r\n window.addEventListener('unhandledrejection', (event: PromiseRejectionEvent) => {\r\n try {\r\n const { reason } = event;\r\n\r\n let errorMessage = 'Unhandled Promise Rejection';\r\n let errorStack = '';\r\n let errorName = 'PromiseRejection';\r\n\r\n if (reason instanceof Error) {\r\n errorMessage = reason.message;\r\n errorStack = reason.stack || '';\r\n errorName = reason.name;\r\n } else if (typeof reason === 'string') {\r\n errorMessage = reason;\r\n } else {\r\n try {\r\n errorMessage = JSON.stringify(reason);\r\n } catch {\r\n errorMessage = String(reason);\r\n }\r\n }\r\n\r\n api.track('error_event', {\r\n action: 'error',\r\n target_type: 'system',\r\n error_type: 'unhandled_rejection',\r\n error_message: errorMessage,\r\n error_stack: errorStack,\r\n error_name: errorName,\r\n });\r\n } catch {\r\n // Fail silently\r\n }\r\n });\r\n}\r\n", "import { GAConfig } from '../types';\n\ndeclare global {\n interface Window {\n gtag: (...args: unknown[]) => void;\n dataLayer: unknown[];\n }\n}\n\nexport function loadGtagScript(measurementId: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if (typeof window !== 'undefined' && typeof window.gtag === 'function') {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.async = true;\n script.src = `https://www.googletagmanager.com/gtag/js?id=${measurementId}`;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load gtag.js'));\n document.head.appendChild(script);\n });\n}\n\nexport async function initGA(config: GAConfig): Promise<void> {\n if (!config.enabled || !config.measurementId) return;\n if (typeof window === 'undefined') return;\n\n await loadGtagScript(config.measurementId);\n\n window.dataLayer = window.dataLayer || [];\n window.gtag = function gtag(...args: unknown[]): void {\n window.dataLayer.push(args);\n };\n\n window.gtag('js', new Date());\n window.gtag('config', config.measurementId, {\n send_page_view: config.sendPageView ?? false,\n debug_mode: config.debugMode ?? false,\n });\n}", "let e=-1;const t=t=>{addEventListener(\"pageshow\",n=>{n.persisted&&(e=n.timeStamp,t(n))},!0)},n=(e,t,n,i)=>{let s,o;return r=>{t.value>=0&&(r||i)&&(o=t.value-(s??0),(o||void 0===s)&&(s=t.value,t.delta=o,t.rating=((e,t)=>e>t[1]?\"poor\":e>t[0]?\"needs-improvement\":\"good\")(t.value,n),e(t)))}},i=e=>{requestAnimationFrame(()=>requestAnimationFrame(e))},s=()=>{const e=performance.getEntriesByType(\"navigation\")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},o=()=>s()?.activationStart??0,r=(t,n=-1)=>{const i=s();let r=\"navigate\";e>=0?r=\"back-forward-cache\":i&&(document.prerendering||o()>0?r=\"prerender\":document.wasDiscarded?r=\"restore\":i.type&&(r=i.type.replace(/_/g,\"-\")));return{name:t,value:n,rating:\"good\",delta:0,entries:[],id:`v5-${Date.now()}-${Math.floor(8999999999999*Math.random())+1e12}`,navigationType:r}},c=new WeakMap;function a(e,t){return c.get(e)||c.set(e,new t),c.get(e)}class d{t;i=0;o=[];h(e){if(e.hadRecentInput)return;const t=this.o[0],n=this.o.at(-1);this.i&&t&&n&&e.startTime-n.startTime<1e3&&e.startTime-t.startTime<5e3?(this.i+=e.value,this.o.push(e)):(this.i=e.value,this.o=[e]),this.t?.(e)}}const h=(e,t,n={})=>{try{if(PerformanceObserver.supportedEntryTypes.includes(e)){const i=new PerformanceObserver(e=>{queueMicrotask(()=>{t(e.getEntries())})});return i.observe({type:e,buffered:!0,...n}),i}}catch{}},f=e=>{let t=!1;return()=>{t||(e(),t=!0)}};let l=-1;const u=new Set,m=()=>\"hidden\"!==document.visibilityState||document.prerendering?1/0:0,g=e=>{if(\"hidden\"===document.visibilityState){if(\"visibilitychange\"===e.type)for(const e of u)e();isFinite(l)||(l=\"visibilitychange\"===e.type?e.timeStamp:0,removeEventListener(\"prerenderingchange\",g,!0))}},p=()=>{if(l<0){const e=o(),n=document.prerendering?void 0:globalThis.performance.getEntriesByType(\"visibility-state\").find(t=>\"hidden\"===t.name&&t.startTime>=e)?.startTime;l=n??m(),addEventListener(\"visibilitychange\",g,!0),addEventListener(\"prerenderingchange\",g,!0),t(()=>{setTimeout(()=>{l=m()})})}return{get firstHiddenTime(){return l},onHidden(e){u.add(e)}}},v=e=>{document.prerendering?addEventListener(\"prerenderingchange\",e,!0):e()},y=[1800,3e3],T=(e,s={})=>{v(()=>{const c=p();let a,d=r(\"FCP\");const f=h(\"paint\",e=>{for(const t of e)\"first-contentful-paint\"===t.name&&(f.disconnect(),t.startTime<c.firstHiddenTime&&(d.value=Math.max(t.startTime-o(),0),d.entries.push(t),a(!0)))});f&&(a=n(e,d,y,s.reportAllChanges),t(t=>{d=r(\"FCP\"),a=n(e,d,y,s.reportAllChanges),i(()=>{d.value=performance.now()-t.timeStamp,a(!0)})}))})},E=[.1,.25],b=(e,s={})=>{const o=p();T(f(()=>{let c,f=r(\"CLS\",0);const l=a(s,d),u=e=>{for(const t of e)l.h(t);l.i>f.value&&(f.value=l.i,f.entries=l.o,c())},m=h(\"layout-shift\",u);m&&(c=n(e,f,E,s.reportAllChanges),o.onHidden(()=>{u(m.takeRecords()),c(!0)}),t(()=>{l.i=0,f=r(\"CLS\",0),c=n(e,f,E,s.reportAllChanges),i(c)}),setTimeout(c))}))};let L=0,P=1/0,_=0;const M=e=>{for(const t of e)t.interactionId&&(P=Math.min(P,t.interactionId),_=Math.max(_,t.interactionId),L=_?(_-P)/7+1:0)};let w;const C=()=>w?L:performance.interactionCount??0,I=()=>{\"interactionCount\"in performance||w||(w=h(\"event\",M,{durationThreshold:0}))};let F=0;class k{l=[];u=new Map;m;p;v(){F=C(),this.l.length=0,this.u.clear()}T(){const e=Math.min(this.l.length-1,Math.floor((C()-F)/50));return this.l[e]}h(e){if(this.m?.(e),!e.interactionId&&\"first-input\"!==e.entryType)return;const t=this.l.at(-1);let n=this.u.get(e.interactionId);if(n||this.l.length<10||e.duration>t.L){if(n?e.duration>n.L?(n.entries=[e],n.L=e.duration):e.duration===n.L&&e.startTime===n.entries[0].startTime&&n.entries.push(e):(n={id:e.interactionId,entries:[e],L:e.duration},this.u.set(n.id,n),this.l.push(n)),this.l.sort((e,t)=>t.L-e.L),this.l.length>10){const e=this.l.splice(10);for(const t of e)this.u.delete(t.id)}this.p?.(n)}}}const A=e=>{const t=globalThis.requestIdleCallback||setTimeout,n=globalThis.cancelIdleCallback||clearTimeout;if(\"hidden\"===document.visibilityState)e();else{const i=f(e);let s=-1;const o=()=>{n(s),i()};addEventListener(\"visibilitychange\",o,{once:!0,capture:!0}),s=t(()=>{removeEventListener(\"visibilitychange\",o,{capture:!0}),i()})}},B=[200,500],S=(e,i={})=>{if(!globalThis.PerformanceEventTiming||!(\"interactionId\"in PerformanceEventTiming.prototype))return;const s=p();v(()=>{I();let o,c=r(\"INP\");const d=a(i,k),f=e=>{A(()=>{for(const t of e)d.h(t);const t=d.T();t&&t.L!==c.value&&(c.value=t.L,c.entries=t.entries,o())})},l=h(\"event\",f,{durationThreshold:i.durationThreshold??40});o=n(e,c,B,i.reportAllChanges),l&&(l.observe({type:\"first-input\",buffered:!0}),s.onHidden(()=>{f(l.takeRecords()),o(!0)}),t(()=>{d.v(),c=r(\"INP\"),o=n(e,c,B,i.reportAllChanges)}))})};class q{m;h(e){this.m?.(e)}}const N=[2500,4e3],x=(e,s={})=>{v(()=>{const c=p();let d,l=r(\"LCP\");const u=a(s,q),m=e=>{s.reportAllChanges||(e=e.slice(-1));for(const t of e)u.h(t),t.startTime<c.firstHiddenTime&&(l.value=Math.max(t.startTime-o(),0),l.entries=[t],d())},g=h(\"largest-contentful-paint\",m);if(g){d=n(e,l,N,s.reportAllChanges);const o=f(()=>{m(g.takeRecords()),g.disconnect(),d(!0)}),c=e=>{e.isTrusted&&(A(o),removeEventListener(e.type,c,{capture:!0}))};for(const e of[\"keydown\",\"click\",\"visibilitychange\"])addEventListener(e,c,{capture:!0});t(t=>{l=r(\"LCP\"),d=n(e,l,N,s.reportAllChanges),i(()=>{l.value=performance.now()-t.timeStamp,d(!0)})})}})},H=[800,1800],O=e=>{document.prerendering?v(()=>O(e)):\"complete\"!==document.readyState?addEventListener(\"load\",()=>O(e),!0):setTimeout(e)},$=(e,i={})=>{let c=r(\"TTFB\"),a=n(e,c,H,i.reportAllChanges);O(()=>{const d=s();d&&(c.value=Math.max(d.responseStart-o(),0),c.entries=[d],a(!0),t(()=>{c=r(\"TTFB\",0),a=n(e,c,H,i.reportAllChanges),a(!0)}))})};export{E as CLSThresholds,y as FCPThresholds,B as INPThresholds,N as LCPThresholds,H as TTFBThresholds,b as onCLS,T as onFCP,S as onINP,x as onLCP,$ as onTTFB};\n", "import {\n onLCP,\n onFCP,\n onCLS,\n onINP,\n onTTFB,\n} from 'web-vitals';\nimport type { MetricType } from 'web-vitals';\n\nimport type { Analytics } from './analytics';\nimport type { PerformanceConfig } from '../types';\n\nexport type PerformanceMonitorAPI = Pick<Analytics, 'track'>;\n\nfunction normalize(value: number, isCLS: boolean): number {\n if (isCLS) {\n return Math.round(value * 10000) / 10000;\n }\n return Math.round(value);\n}\n\nfunction reportMetric(api: PerformanceMonitorAPI, metric: MetricType): void {\n const isCLS = metric.name === 'CLS';\n const properties: Record<string, unknown> = {\n action: 'metric',\n target_type: 'performance',\n metric_name: metric.name,\n metric_value: normalize(metric.value, isCLS),\n metric_rating: metric.rating,\n delta: normalize(metric.delta, isCLS),\n metric_id: metric.id,\n navigation_type: metric.navigationType,\n };\n\n if (metric.name === 'LCP') {\n const entry = metric.entries[metric.entries.length - 1] as LargestContentfulPaint | undefined;\n if (entry) {\n properties.lcp_element = entry.element?.tagName?.toLowerCase() || '';\n properties.lcp_url = entry.url || '';\n properties.lcp_size = entry.size;\n }\n }\n\n api.track('web_vital', properties);\n}\n\nexport function initPerformanceMonitor(\n api: PerformanceMonitorAPI,\n config: PerformanceConfig = {},\n): void {\n if (config.enabled === false) return;\n\n try {\n onLCP((metric) => reportMetric(api, metric));\n onFCP((metric) => reportMetric(api, metric));\n onCLS((metric) => reportMetric(api, metric));\n onINP((metric) => reportMetric(api, metric));\n onTTFB((metric) => reportMetric(api, metric));\n } catch {\n // Web Vitals API not supported in this browser\n }\n}\n", "import { MarketingPayload } from '../types';\n\nexport interface GAEventOptions {\n sessionId: string;\n pageUrl: string;\n referrer: string;\n marketing: MarketingPayload;\n userId?: string | null;\n}\n\nexport function trackToGA(\n eventName: string,\n properties: Record<string, unknown>,\n options: GAEventOptions\n): void {\n if (typeof window === 'undefined' || !window.gtag) return;\n\n const params: Record<string, unknown> = {\n session_id: options.sessionId,\n engagement_time_msec: 100,\n page_location: options.pageUrl,\n page_referrer: options.referrer,\n };\n\n const { marketing, userId } = options;\n if (marketing.utm_source) params.utm_source = marketing.utm_source;\n if (marketing.utm_medium) params.utm_medium = marketing.utm_medium;\n if (marketing.utm_campaign) params.utm_campaign = marketing.utm_campaign;\n if (marketing.utm_term) params.utm_term = marketing.utm_term;\n if (marketing.utm_content) params.utm_content = marketing.utm_content;\n if (userId) params.user_id = userId;\n\n Object.assign(params, properties);\n\n window.gtag('event', eventName, params);\n}\n\nexport function setGAUserId(userId: string | null): void {\n if (typeof window === 'undefined' || !window.gtag) return;\n window.gtag('set', { user_id: userId ?? undefined });\n}\n\nexport function setGAUserProperties(properties: Record<string, unknown>): void {\n if (typeof window === 'undefined' || !window.gtag) return;\n window.gtag('set', 'user_properties', properties);\n}", "import type {\n GAConsentMode,\n GAConsentParams,\n} from '../types';\n\ndeclare global {\n interface Window {\n gtag: (...args: unknown[]) => void;\n dataLayer: unknown[];\n }\n}\n\nexport class GAManager {\n private _initialized = false;\n private _measurementId: string | undefined;\n\n get ready(): boolean {\n return this._initialized && typeof window !== 'undefined' && typeof window.gtag === 'function';\n }\n\n get measurementId(): string | undefined {\n return this._measurementId;\n }\n\n track(eventName: string, properties?: Record<string, unknown>): void {\n if (!this.ready) return;\n window.gtag('event', eventName, properties ?? {});\n }\n\n setUserId(userId: string | null): void {\n if (!this.ready) return;\n window.gtag('set', { user_id: userId ?? undefined });\n }\n\n setUserProperties(properties: Record<string, unknown>): void {\n if (!this.ready) return;\n window.gtag('set', 'user_properties', properties);\n }\n\n set(keyOrParams: string | Record<string, unknown>, value?: unknown): void {\n if (!this.ready) return;\n if (typeof keyOrParams === 'string') {\n window.gtag('set', keyOrParams, value);\n } else {\n window.gtag('set', keyOrParams);\n }\n }\n\n config(params?: Record<string, unknown>): void {\n if (!this.ready || !this._measurementId) return;\n window.gtag('config', this._measurementId, params ?? {});\n }\n\n consent(mode: GAConsentMode, params: GAConsentParams): void {\n if (!this.ready) return;\n window.gtag('consent', mode, params);\n }\n\n get(key: string, callback: (value: unknown) => void): void {\n if (!this.ready || !this._measurementId) return;\n window.gtag('get', this._measurementId, key, callback);\n }\n\n gtag(...args: unknown[]): void {\n if (typeof window === 'undefined' || !window.gtag) return;\n window.gtag(...args);\n }\n\n _init(measurementId: string): void {\n this._measurementId = measurementId;\n this._initialized = true;\n }\n\n _destroy(): void {\n this._initialized = false;\n this._measurementId = undefined;\n }\n}\n", "import {\r\n AnalyticsConfig,\r\n AnalyticsPayload,\r\n EventPayload,\r\n EventProperties,\r\n TrackOptions,\r\n UserProfile,\r\n API_KEY_MAP,\r\n DEFAULT_CONFIG,\r\n STORAGE_KEYS,\r\n} from '../types';\r\nimport { SessionManager } from './session-manager';\r\nimport { Sender } from './sender';\r\nimport { StorageQueue } from './storage';\r\nimport { collectContext, collectMarketing } from './context-collector';\r\nimport { initAutoTrack } from './auto-track';\r\nimport { initErrorMonitor } from './error-monitor';\r\nimport { initGA } from './ga-loader';\r\nimport { initPerformanceMonitor } from './performance-monitor';\r\nimport { trackToGA, setGAUserId, setGAUserProperties } from './ga-adapter';\r\nimport { GAManager } from './ga-manager';\r\nimport {\r\n generateId,\r\n generateUUID,\r\n getTimestamp,\r\n isObject,\r\n isBrowser,\r\n getPageUrl,\r\n safeLocalStorageGet,\r\n safeLocalStorageSet,\r\n} from '../utils';\r\n\r\nlet globalBatchCounter = 0;\r\n\r\nexport class Analytics {\r\n private config: Required<Pick<AnalyticsConfig, 'debug' | 'autoTrack' | 'bufferFlushInterval' | 'bufferMaxSize' | 'maxRetryCount'>> & AnalyticsConfig;\r\n private sessionManager: SessionManager;\r\n private buffer: EventPayload[] = [];\r\n private bufferTimer: ReturnType<typeof setTimeout> | null = null;\r\n private userId: string | null = null;\r\n private userProps: Record<string, unknown> = {};\r\n private batchPageId: string;\r\n private clientId: string;\r\n private merchantLang: string;\r\n private clientType: string;\r\n private initialized = false;\r\n private retrying = 0;\r\n private gaInitialized = false;\r\n ga: GAManager;\r\n\r\n constructor(config: AnalyticsConfig) {\r\n this.ga = new GAManager();\r\n\r\n this.config = {\r\n debug: false,\r\n autoTrack: true,\r\n bufferFlushInterval: DEFAULT_CONFIG.bufferFlushInterval,\r\n bufferMaxSize: DEFAULT_CONFIG.bufferMaxSize,\r\n maxRetryCount: DEFAULT_CONFIG.maxRetryCount,\r\n ...config,\r\n };\r\n\r\n const appKey = this.config.appKey || this.config.appId || 'unknown';\r\n if (this.config.appId) this.config.appKey = appKey;\r\n\r\n this.clientId = this.getOrCreateClientId();\r\n this.merchantLang = DEFAULT_CONFIG.merchantLanguage;\r\n this.clientType = DEFAULT_CONFIG.clientType;\r\n this.batchPageId = this.generateBatchPageId();\r\n this.sessionManager = new SessionManager(this.config.sessionTimeout);\r\n\r\n if (isBrowser()) {\r\n this.recoverFailedEvents();\r\n }\r\n\r\n this.registerBeforeUnload();\r\n\r\n if (this.config.autoTrack && isBrowser()) {\r\n initAutoTrack(this, this.config.autoTrackSelector);\r\n }\r\n\r\n if (isBrowser()) {\r\n initErrorMonitor(this);\r\n }\r\n\r\n if (isBrowser() && this.config.performance?.enabled !== false) {\r\n initPerformanceMonitor(this, this.config.performance);\r\n }\r\n\r\n if (isBrowser() && this.config.ga?.enabled) {\r\n this.ga._init(this.config.ga.measurementId);\r\n initGA(this.config.ga).then(() => {\r\n this.gaInitialized = true;\r\n this.log('GA4 initialized with measurementId:', this.config.ga?.measurementId);\r\n }).catch((error) => {\r\n this.ga._destroy();\r\n this.log('Failed to initialize GA4:', error);\r\n });\r\n }\r\n\r\n this.initialized = true;\r\n this.log('Analytics SDK initialized', {\r\n appKey: this.config.appKey,\r\n clientId: this.clientId,\r\n sessionId: this.sessionManager.getSessionId(),\r\n });\r\n\r\n if (isBrowser()) {\r\n this.trackPageView();\r\n }\r\n }\r\n\r\n track(eventName: string, properties?: Record<string, unknown>, options?: TrackOptions): void {\r\n if (!eventName || typeof eventName !== 'string') {\r\n this.log('Invalid event name');\r\n return;\r\n }\r\n\r\n const normalizedProps = properties && isObject(properties) ? properties : {};\r\n const isKeyEvent = options?.keyEvent === true || this.isKeyEvent(eventName);\r\n\r\n if (this.gaInitialized) {\r\n trackToGA(eventName, normalizedProps, {\r\n sessionId: this.sessionManager.getSessionId(),\r\n pageUrl: isBrowser() ? getPageUrl() : '',\r\n referrer: isBrowser() ? document.referrer : '',\r\n marketing: collectMarketing(),\r\n userId: this.userId,\r\n });\r\n }\r\n\r\n 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 }\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 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 }, 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 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 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 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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",
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
  }
@@ -14,6 +14,9 @@ export declare class Analytics {
14
14
  private initialized;
15
15
  private retrying;
16
16
  private gaInitialized;
17
+ private gaPendingQueue;
18
+ private gaPendingIdentify;
19
+ private unloadHandler;
17
20
  ga: GAManager;
18
21
  constructor(config: AnalyticsConfig);
19
22
  track(eventName: string, properties?: Record<string, unknown>, options?: TrackOptions): void;
@@ -38,6 +41,7 @@ export declare class Analytics {
38
41
  private sendBatch;
39
42
  private buildPayload;
40
43
  private recoverFailedEvents;
44
+ destroy(): void;
41
45
  private registerBeforeUnload;
42
46
  private trackPageView;
43
47
  }
@@ -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,EAAE,EAAE,SAAS,CAAC;gBAEF,MAAM,EAAE,eAAe;IA8DnC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IA6C5F,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAmBpE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI3C,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIvC,KAAK,IAAI,IAAI;IAcb,cAAc,IAAI,WAAW;IAQ7B,YAAY,IAAI,MAAM;IAItB,WAAW,IAAI,MAAM;IAIrB,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,GAAG;IAMX,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,uBAAuB;IAK/B,OAAO,CAAC,oBAAoB;IAyB5B,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,aAAa;YAOP,SAAS;IAqCvB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,mBAAmB;IAwB3B,OAAO,CAAC,oBAAoB;IA8C5B,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;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"}
@@ -20,6 +20,9 @@ export class Analytics {
20
20
  this.initialized = false;
21
21
  this.retrying = 0;
22
22
  this.gaInitialized = false;
23
+ this.gaPendingQueue = [];
24
+ this.gaPendingIdentify = null;
25
+ this.unloadHandler = null;
23
26
  this.ga = new GAManager();
24
27
  this.config = {
25
28
  debug: false,
@@ -55,8 +58,21 @@ export class Analytics {
55
58
  initGA(this.config.ga).then(() => {
56
59
  this.gaInitialized = true;
57
60
  this.log('GA4 initialized with measurementId:', this.config.ga?.measurementId);
61
+ if (this.gaPendingIdentify) {
62
+ setGAUserId(this.gaPendingIdentify.userId);
63
+ if (this.gaPendingIdentify.attributes) {
64
+ setGAUserProperties(this.gaPendingIdentify.attributes);
65
+ }
66
+ this.gaPendingIdentify = null;
67
+ }
68
+ for (const { eventName, properties, options } of this.gaPendingQueue) {
69
+ trackToGA(eventName, properties, options);
70
+ }
71
+ this.gaPendingQueue = [];
58
72
  }).catch((error) => {
59
73
  this.ga._destroy();
74
+ this.gaPendingIdentify = null;
75
+ this.gaPendingQueue = [];
60
76
  this.log('Failed to initialize GA4:', error);
61
77
  });
62
78
  }
@@ -77,14 +93,20 @@ export class Analytics {
77
93
  }
78
94
  const normalizedProps = properties && isObject(properties) ? properties : {};
79
95
  const isKeyEvent = options?.keyEvent === true || this.isKeyEvent(eventName);
80
- if (this.gaInitialized) {
81
- trackToGA(eventName, normalizedProps, {
96
+ if (this.config.ga?.enabled) {
97
+ const gaOptions = {
82
98
  sessionId: this.sessionManager.getSessionId(),
83
99
  pageUrl: isBrowser() ? getPageUrl() : '',
84
100
  referrer: isBrowser() ? document.referrer : '',
85
101
  marketing: collectMarketing(),
86
102
  userId: this.userId,
87
- });
103
+ };
104
+ if (this.gaInitialized) {
105
+ trackToGA(eventName, normalizedProps, gaOptions);
106
+ }
107
+ else {
108
+ this.gaPendingQueue.push({ eventName, properties: normalizedProps, options: gaOptions });
109
+ }
88
110
  }
89
111
  if (this.config.disableServer)
90
112
  return;
@@ -120,6 +142,9 @@ export class Analytics {
120
142
  setGAUserProperties(attributes);
121
143
  }
122
144
  }
145
+ else if (this.config.ga?.enabled) {
146
+ this.gaPendingIdentify = { userId, attributes };
147
+ }
123
148
  this.log('User identified:', { userId, attributes });
124
149
  if (wasAnonymous && this.buffer.length > 0) {
125
150
  this.flushBuffer();
@@ -235,6 +260,11 @@ export class Analytics {
235
260
  }
236
261
  if (this.buffer.length === 0)
237
262
  return;
263
+ // Wait for inflight retries to settle before sending a new batch
264
+ if (this.retrying > 0) {
265
+ this.scheduleBufferFlush();
266
+ return;
267
+ }
238
268
  const events = this.buffer.splice(0, this.buffer.length);
239
269
  events.forEach((e, i) => {
240
270
  e.batch_event_index = i;
@@ -273,6 +303,9 @@ export class Analytics {
273
303
  setTimeout(() => {
274
304
  this.retrying -= 1;
275
305
  this.sendBatch(events, retryCount + 1);
306
+ if (this.buffer.length > 0) {
307
+ this.scheduleBufferFlush();
308
+ }
276
309
  }, delay);
277
310
  }
278
311
  else {
@@ -315,6 +348,17 @@ export class Analytics {
315
348
  }
316
349
  }
317
350
  }
351
+ destroy() {
352
+ if (this.unloadHandler) {
353
+ window.removeEventListener('beforeunload', this.unloadHandler);
354
+ window.removeEventListener('pagehide', this.unloadHandler);
355
+ this.unloadHandler = null;
356
+ }
357
+ if (this.bufferTimer) {
358
+ clearTimeout(this.bufferTimer);
359
+ this.bufferTimer = null;
360
+ }
361
+ }
318
362
  registerBeforeUnload() {
319
363
  if (!isBrowser() || this.config.disableServer)
320
364
  return;
@@ -358,6 +402,7 @@ export class Analytics {
358
402
  }
359
403
  }
360
404
  };
405
+ this.unloadHandler = handler;
361
406
  window.addEventListener('beforeunload', handler);
362
407
  window.addEventListener('pagehide', handler);
363
408
  }
@@ -41,7 +41,7 @@ function getTrackName(element) {
41
41
  const name = element.getAttribute(NAME_ATTR);
42
42
  if (name)
43
43
  return name;
44
- const id = element.id ? `_${element.id}` : '';
44
+ const id = element.id ? `_${element.id.replace(/[^\w-]/g, '_')}` : '';
45
45
  const tag = element.tagName.toLowerCase();
46
46
  return `click_${tag}${id}`;
47
47
  }
@@ -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,CAsBnD"}
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"}
@@ -23,7 +23,21 @@ export function collectContext(appKey, merchantLanguage, clientType) {
23
23
  export function collectMarketing() {
24
24
  if (!isBrowser())
25
25
  return {};
26
- const utm = parseUTMParams();
26
+ // Persist UTM params from the landing URL so they survive SPA navigation
27
+ 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 */ }
34
+ }
35
+ else {
36
+ utm = parseUTMParams();
37
+ if (Object.keys(utm).length > 0) {
38
+ safeLocalStorageSet(STORAGE_KEYS.UTM_PARAMS, JSON.stringify(utm));
39
+ }
40
+ }
27
41
  let landingPage = safeLocalStorageGet(STORAGE_KEYS.LANDING_PAGE);
28
42
  if (!landingPage) {
29
43
  landingPage = window.location.href;
@@ -1 +1 @@
1
- {"version":3,"file":"ga-loader.d.ts","sourceRoot":"","sources":["../../src/core/ga-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;QACnC,SAAS,EAAE,OAAO,EAAE,CAAC;KACtB;CACF;AAED,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAcnE;AAED,wBAAsB,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB5D"}
1
+ {"version":3,"file":"ga-loader.d.ts","sourceRoot":"","sources":["../../src/core/ga-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;QACnC,SAAS,EAAE,OAAO,EAAE,CAAC;KACtB;CACF;AAED,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAenE;AAED,wBAAsB,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB5D"}
@@ -1,6 +1,7 @@
1
1
  export function loadGtagScript(measurementId) {
2
2
  return new Promise((resolve, reject) => {
3
- if (typeof window !== 'undefined' && typeof window.gtag === 'function') {
3
+ // Check for existing script tag, not window.gtag we define gtag before loading
4
+ if (document.querySelector(`script[src*="googletagmanager.com/gtag/js"]`)) {
4
5
  resolve();
5
6
  return;
6
7
  }
@@ -17,14 +18,17 @@ export async function initGA(config) {
17
18
  return;
18
19
  if (typeof window === 'undefined')
19
20
  return;
20
- await loadGtagScript(config.measurementId);
21
+ // Must be defined BEFORE the script loads so gtag.js finds them on execution
21
22
  window.dataLayer = window.dataLayer || [];
22
- window.gtag = function gtag(...args) {
23
- window.dataLayer.push(args);
23
+ // gtag.js checks e.constructor == Arguments, so must push `arguments` not a rest-param array
24
+ window.gtag = function gtag() {
25
+ // eslint-disable-next-line prefer-rest-params
26
+ window.dataLayer.push(arguments);
24
27
  };
25
28
  window.gtag('js', new Date());
26
29
  window.gtag('config', config.measurementId, {
27
30
  send_page_view: config.sendPageView ?? false,
28
31
  debug_mode: config.debugMode ?? false,
29
32
  });
33
+ await loadGtagScript(config.measurementId);
30
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"AAUA,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAgC;IAYrD,YAAY,IAAI,MAAM;IAOtB,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,gBAAgB;CAMzB"}
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"AAUA,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAgC;IAYrD,YAAY,IAAI,MAAM;IAOtB,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,gBAAgB;CAOzB"}
@@ -47,6 +47,7 @@ export class SessionManager {
47
47
  }
48
48
  createNewSession() {
49
49
  const id = generateUUID();
50
+ this.sessionId = id;
50
51
  this.createdAt = Date.now();
51
52
  this.saveSession();
52
53
  return id;
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/core/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqD,MAAM,UAAU,CAAC;AAG3F,qBAAa,YAAY;IACvB,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAezC,MAAM,CAAC,OAAO,IAAI,YAAY,EAAE;IAYhC,MAAM,CAAC,KAAK,IAAI,IAAI;IAIpB,MAAM,CAAC,YAAY,IAAI,MAAM;IAI7B,OAAO,CAAC,MAAM,CAAC,SAAS;CAWzB"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/core/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqD,MAAM,UAAU,CAAC;AAK3F,qBAAa,YAAY;IACvB,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAezC,MAAM,CAAC,OAAO,IAAI,YAAY,EAAE;IAehC,MAAM,CAAC,KAAK,IAAI,IAAI;IAIpB,MAAM,CAAC,YAAY,IAAI,MAAM;IAI7B,OAAO,CAAC,MAAM,CAAC,SAAS;CAWzB"}
@@ -1,5 +1,6 @@
1
1
  import { STORAGE_KEYS, MAX_STORAGE_ITEMS } from '../types';
2
2
  import { safeLocalStorageGet, safeLocalStorageSet, safeLocalStorageRemove } from '../utils';
3
+ const MAX_EVENT_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours
3
4
  export class StorageQueue {
4
5
  static enqueue(event) {
5
6
  try {
@@ -18,7 +19,10 @@ export class StorageQueue {
18
19
  try {
19
20
  const queue = StorageQueue.readQueue();
20
21
  StorageQueue.clear();
21
- const events = queue.map((item) => item.event);
22
+ const now = Date.now();
23
+ const events = queue
24
+ .filter((item) => now - item.storedAt < MAX_EVENT_AGE_MS)
25
+ .map((item) => item.event);
22
26
  return events;
23
27
  }
24
28
  catch {
@@ -158,6 +158,7 @@ export declare const STORAGE_KEYS: {
158
158
  readonly CLIENT_ID: "__analytics_client_id__";
159
159
  readonly LANDING_PAGE: "__analytics_landing_page__";
160
160
  readonly REFERRER_URL: "__analytics_referrer_url__";
161
+ readonly UTM_PARAMS: "__analytics_utm_params__";
161
162
  };
162
163
  export declare const MAX_STORAGE_ITEMS = 500;
163
164
  //# sourceMappingURL=index.d.ts.map
@@ -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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"}
@@ -24,5 +24,9 @@ export const STORAGE_KEYS = {
24
24
  CLIENT_ID: '__analytics_client_id__',
25
25
  LANDING_PAGE: '__analytics_landing_page__',
26
26
  REFERRER_URL: '__analytics_referrer_url__',
27
+ UTM_PARAMS: '__analytics_utm_params__',
27
28
  };
29
+ // WARNING: These keys are embedded in the built bundle and visible to end users.
30
+ // For production deployments, pass apiKey directly in AnalyticsConfig to avoid
31
+ // exposing environment keys in source code.
28
32
  export const MAX_STORAGE_ITEMS = 500;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "onerway-analytics",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "Onrway Analytics SDK",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",