onerway-analytics 1.0.0 → 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.
- package/README.md +237 -0
- package/dist/bundle/index.js +74 -12
- package/dist/bundle/index.js.map +2 -2
- package/dist/core/analytics.d.ts +4 -0
- package/dist/core/analytics.d.ts.map +1 -1
- package/dist/core/analytics.js +57 -4
- package/dist/core/auto-track.js +1 -1
- package/dist/core/context-collector.d.ts.map +1 -1
- package/dist/core/context-collector.js +15 -1
- package/dist/core/ga-loader.d.ts.map +1 -1
- package/dist/core/ga-loader.js +8 -4
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +1 -0
- package/dist/core/storage.d.ts.map +1 -1
- package/dist/core/storage.js +5 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +4 -0
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
# onerway-analytics
|
|
2
|
+
|
|
3
|
+
客户端埋点 SDK,支持双发:自建数据服务 + Google Analytics 4。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
### npm
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install onerway-analytics
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### CDN / 本地文件
|
|
14
|
+
|
|
15
|
+
```html
|
|
16
|
+
<script src="./dist/bundle/index.js"></script>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 快速开始
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import { createAnalytics } from 'onerway-analytics';
|
|
25
|
+
|
|
26
|
+
const analytics = createAnalytics({
|
|
27
|
+
appKey: 'your-app-key', // 应用标识
|
|
28
|
+
serverUrl: 'https://your-server.com/collect', // 数据接收端点
|
|
29
|
+
env: 'prod', // 环境: beta | test | uat | prod
|
|
30
|
+
debug: true, // 开启控制台日志
|
|
31
|
+
});
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 上报模式
|
|
35
|
+
|
|
36
|
+
SDK 支持三种上报模式,按需选择。
|
|
37
|
+
|
|
38
|
+
#### 双发(自建 + GA)
|
|
39
|
+
|
|
40
|
+
同时发送到自建服务和 Google Analytics 4:
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
const analytics = createAnalytics({
|
|
44
|
+
appKey: 'your-app-key',
|
|
45
|
+
serverUrl: 'https://your-server.com/collect',
|
|
46
|
+
env: 'prod',
|
|
47
|
+
ga: {
|
|
48
|
+
measurementId: 'G-XXXXXXXXXX',
|
|
49
|
+
enabled: true,
|
|
50
|
+
sendPageView: false,
|
|
51
|
+
debugMode: true,
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
#### 只发自建服务
|
|
57
|
+
|
|
58
|
+
不配置 `ga`,或设置 `ga.enabled: false`:
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
const analytics = createAnalytics({
|
|
62
|
+
appKey: 'your-app-key',
|
|
63
|
+
serverUrl: 'https://your-server.com/collect',
|
|
64
|
+
env: 'prod',
|
|
65
|
+
debug: true,
|
|
66
|
+
});
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
#### 只发 GA
|
|
70
|
+
|
|
71
|
+
设置 `disableServer: true`,`serverUrl` 可留空。page_view、自动埋点、错误监控、性能指标均只走 GA:
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
const analytics = createAnalytics({
|
|
75
|
+
appKey: 'your-app-key',
|
|
76
|
+
serverUrl: '',
|
|
77
|
+
disableServer: true,
|
|
78
|
+
ga: {
|
|
79
|
+
measurementId: 'G-XXXXXXXXXX',
|
|
80
|
+
enabled: true,
|
|
81
|
+
debugMode: true,
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
> `disableServer` 开启后 `analytics.flush()` 和自动缓冲机制均不生效。
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## API
|
|
91
|
+
|
|
92
|
+
### 事件埋点
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
// 普通事件(进入缓冲区,定时批量发送)
|
|
96
|
+
analytics.track('purchase', { product_id: '123', amount: 99.9 });
|
|
97
|
+
|
|
98
|
+
// 关键事件(立即发送,不等待缓冲区)
|
|
99
|
+
analytics.track('payment_success', { order_id: '456' }, { keyEvent: true });
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 用户标识
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
// 设置用户 ID(同步到 GA 的 user_id)
|
|
106
|
+
analytics.identify('user-123', { vip: true, level: 'gold' });
|
|
107
|
+
|
|
108
|
+
// 获取用户信息
|
|
109
|
+
analytics.getUserProfile();
|
|
110
|
+
// { userId: 'user-123', anonymousId: 'uuid...', attributes: { vip: true } }
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### GA 编程式控制
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
// 直发 GA 事件(不走 SDK 服务端)
|
|
117
|
+
analytics.ga.track('login', { method: 'email' });
|
|
118
|
+
|
|
119
|
+
// 设置 GA 用户属性
|
|
120
|
+
analytics.ga.setUserProperties({ plan: 'premium' });
|
|
121
|
+
|
|
122
|
+
// GDPR 同意模式
|
|
123
|
+
analytics.ga.consent('default', {
|
|
124
|
+
analytics_storage: 'denied',
|
|
125
|
+
ad_storage: 'denied',
|
|
126
|
+
});
|
|
127
|
+
analytics.ga.consent('update', {
|
|
128
|
+
analytics_storage: 'granted',
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
// GA4 配置
|
|
132
|
+
analytics.ga.config({ page_title: '首页' });
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### 其他方法
|
|
136
|
+
|
|
137
|
+
```ts
|
|
138
|
+
// 立即刷新缓冲区
|
|
139
|
+
analytics.flush();
|
|
140
|
+
|
|
141
|
+
// 重置用户身份
|
|
142
|
+
analytics.reset();
|
|
143
|
+
|
|
144
|
+
// 获取会话 ID / 客户端 ID
|
|
145
|
+
analytics.getSessionId();
|
|
146
|
+
analytics.getClientId();
|
|
147
|
+
|
|
148
|
+
// 设置客户端类型 / 商户语言
|
|
149
|
+
analytics.setClientType('MINI_PROGRAM');
|
|
150
|
+
analytics.setMerchantLanguage('zh');
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## 自动埋点
|
|
156
|
+
|
|
157
|
+
默认开启,通过 `data-track-*` 属性声明式埋点:
|
|
158
|
+
|
|
159
|
+
```html
|
|
160
|
+
<!-- 自定义事件名 -->
|
|
161
|
+
<button data-track-name="subscribe_click">订阅</button>
|
|
162
|
+
|
|
163
|
+
<!-- 带 JSON 属性 -->
|
|
164
|
+
<button data-track-name="buy_now"
|
|
165
|
+
data-track-properties='{"product":"shoes","price":299}'>
|
|
166
|
+
立即购买
|
|
167
|
+
</button>
|
|
168
|
+
|
|
169
|
+
<!-- 任意 data-track-* 前缀自动成为属性键 -->
|
|
170
|
+
<a data-track-name="share"
|
|
171
|
+
data-track-platform="wechat"
|
|
172
|
+
data-track-position="top">
|
|
173
|
+
分享
|
|
174
|
+
</a>
|
|
175
|
+
|
|
176
|
+
<!-- 忽略该元素 -->
|
|
177
|
+
<div data-track-ignore>不追踪</div>
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
限定自动埋点范围:
|
|
181
|
+
|
|
182
|
+
```ts
|
|
183
|
+
createAnalytics({
|
|
184
|
+
serverUrl: '...',
|
|
185
|
+
autoTrackSelector: '#app', // 只在 #app 内追踪点击
|
|
186
|
+
});
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 配置项
|
|
192
|
+
|
|
193
|
+
| 配置 | 类型 | 默认值 | 说明 |
|
|
194
|
+
|---|---|---|---|
|
|
195
|
+
| `appKey` | `string` | — | 应用标识 |
|
|
196
|
+
| `serverUrl` | `string` | — | 数据接收端点 |
|
|
197
|
+
| `apiKey` | `string` | — | API Key(不填则根据 `env` 自动解析) |
|
|
198
|
+
| `env` | `string` | — | 环境:`beta` \| `test` \| `uat` \| `prod` |
|
|
199
|
+
| `debug` | `boolean` | `false` | 控制台日志 |
|
|
200
|
+
| `autoTrack` | `boolean` | `true` | 自动点击追踪 |
|
|
201
|
+
| `autoTrackSelector` | `string` | — | 自动埋点的 CSS 选择器范围 |
|
|
202
|
+
| `bufferFlushInterval` | `number` | `5000` | 缓冲区刷新间隔(ms) |
|
|
203
|
+
| `bufferMaxSize` | `number` | `25` | 缓冲区满即刷新 |
|
|
204
|
+
| `maxRetryCount` | `number` | `3` | 发送失败最大重试次数 |
|
|
205
|
+
| `sessionTimeout` | `number` | `1800000` | 会话过期时间(ms),默认30分钟 |
|
|
206
|
+
| `system` | `string` | — | 系统标识 |
|
|
207
|
+
| `domain` | `string` | — | 域名标识 |
|
|
208
|
+
| `performance` | `object` | `{ enabled: true }` | Core Web Vitals 采集配置 |
|
|
209
|
+
| `ga.enabled` | `boolean` | — | GA 双发开关 |
|
|
210
|
+
| `ga.measurementId` | `string` | — | GA4 测量 ID(G- 开头) |
|
|
211
|
+
| `ga.sendPageView` | `boolean` | `false` | 是否由 gtag 自动发送 page_view |
|
|
212
|
+
| `ga.debugMode` | `boolean` | `false` | GA 调试模式 |
|
|
213
|
+
| `disableServer` | `boolean` | `false` | 关闭自建服务上报,只发 GA |
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## 采集能力
|
|
218
|
+
|
|
219
|
+
| 采集项 | 说明 |
|
|
220
|
+
|---|---|
|
|
221
|
+
| 点击事件 | 自动埋点 + 手动 `analytics.track()` |
|
|
222
|
+
| 页面浏览 | 初始化时自动发送 `page_view` |
|
|
223
|
+
| JS 错误 | 全局 `window.error` / `unhandledrejection` |
|
|
224
|
+
| Core Web Vitals | LCP / FCP / CLS / INP / TTFB |
|
|
225
|
+
| 设备上下文 | 浏览器、OS、屏幕、语言、时区等 |
|
|
226
|
+
| 营销归因 | UTM 参数、落地页、来源 URL |
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## 双发机制
|
|
231
|
+
|
|
232
|
+
每个 `analytics.track()` 调用同时发送到两处:
|
|
233
|
+
|
|
234
|
+
1. **自建服务** — 事件进入缓冲区,定时批量 POST 到 `serverUrl`
|
|
235
|
+
2. **GA4** — 即时调用 `gtag('event', ...)`,附带 session_id、页面信息、UTM 参数
|
|
236
|
+
|
|
237
|
+
GA 初始化失败会自动降级,不影响自建服务上报。
|
package/dist/bundle/index.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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 (
|
|
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(
|
|
651
|
-
window.dataLayer.push(
|
|
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,15 +1117,21 @@ 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.
|
|
1089
|
-
|
|
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
|
}
|
|
1134
|
+
if (this.config.disableServer) return;
|
|
1097
1135
|
const event = {
|
|
1098
1136
|
event_id: generateUUID(),
|
|
1099
1137
|
event_name: eventName,
|
|
@@ -1125,6 +1163,8 @@ var OnrwayAnalytics = (() => {
|
|
|
1125
1163
|
if (attributes && isObject(attributes)) {
|
|
1126
1164
|
setGAUserProperties(attributes);
|
|
1127
1165
|
}
|
|
1166
|
+
} else if (this.config.ga?.enabled) {
|
|
1167
|
+
this.gaPendingIdentify = { userId, attributes };
|
|
1128
1168
|
}
|
|
1129
1169
|
this.log("User identified:", { userId, attributes });
|
|
1130
1170
|
if (wasAnonymous && this.buffer.length > 0) {
|
|
@@ -1228,11 +1268,16 @@ var OnrwayAnalytics = (() => {
|
|
|
1228
1268
|
}, this.config.bufferFlushInterval);
|
|
1229
1269
|
}
|
|
1230
1270
|
flushBuffer() {
|
|
1271
|
+
if (this.config.disableServer) return;
|
|
1231
1272
|
if (this.bufferTimer) {
|
|
1232
1273
|
clearTimeout(this.bufferTimer);
|
|
1233
1274
|
this.bufferTimer = null;
|
|
1234
1275
|
}
|
|
1235
1276
|
if (this.buffer.length === 0) return;
|
|
1277
|
+
if (this.retrying > 0) {
|
|
1278
|
+
this.scheduleBufferFlush();
|
|
1279
|
+
return;
|
|
1280
|
+
}
|
|
1236
1281
|
const events = this.buffer.splice(0, this.buffer.length);
|
|
1237
1282
|
events.forEach((e2, i2) => {
|
|
1238
1283
|
e2.batch_event_index = i2;
|
|
@@ -1241,6 +1286,7 @@ var OnrwayAnalytics = (() => {
|
|
|
1241
1286
|
this.sendBatch(events, 0);
|
|
1242
1287
|
}
|
|
1243
1288
|
flushKeyEvent(event) {
|
|
1289
|
+
if (this.config.disableServer) return;
|
|
1244
1290
|
this.log("Flushing key event:", event.event_name);
|
|
1245
1291
|
this.sendBatch([event], 0);
|
|
1246
1292
|
}
|
|
@@ -1267,6 +1313,9 @@ var OnrwayAnalytics = (() => {
|
|
|
1267
1313
|
setTimeout(() => {
|
|
1268
1314
|
this.retrying -= 1;
|
|
1269
1315
|
this.sendBatch(events, retryCount + 1);
|
|
1316
|
+
if (this.buffer.length > 0) {
|
|
1317
|
+
this.scheduleBufferFlush();
|
|
1318
|
+
}
|
|
1270
1319
|
}, delay);
|
|
1271
1320
|
} else {
|
|
1272
1321
|
this.log("Max retries reached, persisting events to localStorage");
|
|
@@ -1288,6 +1337,7 @@ var OnrwayAnalytics = (() => {
|
|
|
1288
1337
|
};
|
|
1289
1338
|
}
|
|
1290
1339
|
recoverFailedEvents() {
|
|
1340
|
+
if (this.config.disableServer) return;
|
|
1291
1341
|
const failedEvents = StorageQueue.recover();
|
|
1292
1342
|
if (failedEvents.length > 0) {
|
|
1293
1343
|
this.log(`Recovered ${failedEvents.length} failed events from storage`);
|
|
@@ -1306,8 +1356,19 @@ var OnrwayAnalytics = (() => {
|
|
|
1306
1356
|
}
|
|
1307
1357
|
}
|
|
1308
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
|
+
}
|
|
1309
1370
|
registerBeforeUnload() {
|
|
1310
|
-
if (!isBrowser()) return;
|
|
1371
|
+
if (!isBrowser() || this.config.disableServer) return;
|
|
1311
1372
|
const handler = () => {
|
|
1312
1373
|
if (this.buffer.length === 0) return;
|
|
1313
1374
|
const events = this.buffer.splice(0, this.buffer.length);
|
|
@@ -1340,6 +1401,7 @@ var OnrwayAnalytics = (() => {
|
|
|
1340
1401
|
}
|
|
1341
1402
|
}
|
|
1342
1403
|
};
|
|
1404
|
+
this.unloadHandler = handler;
|
|
1343
1405
|
window.addEventListener("beforeunload", handler);
|
|
1344
1406
|
window.addEventListener("pagehide", handler);
|
|
1345
1407
|
}
|
package/dist/bundle/index.js.map
CHANGED
|
@@ -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\r\n /** @deprecated use appKey instead */\r\n appId?: string;\r\n}\r\n\r\nexport interface TrackOptions {\r\n keyEvent?: boolean;\r\n}\r\n\r\nexport interface UserProfile {\r\n userId?: string;\r\n anonymousId?: string;\r\n attributes?: Record<string, unknown>;\r\n}\r\n\r\n/** @deprecated use EventPayload instead */\r\nexport interface TrackEvent {\r\n event: string;\r\n properties?: Record<string, unknown>;\r\n timestamp?: number;\r\n}\r\n\r\n/** @deprecated use AnalyticsPayload instead */\r\nexport interface QueueItem {\r\n id: string;\r\n event: TrackEvent;\r\n retryCount: number;\r\n}\r\n\r\nexport interface StorageQueueItem {\r\n event: EventPayload;\r\n storedAt: number;\r\n}\r\n\r\nexport interface RetryEntry {\r\n events: EventPayload[];\r\n retryCount: number;\r\n timer: ReturnType<typeof setTimeout> | null;\r\n}\r\n\r\nexport const API_KEY_MAP: Record<string, string> = {\r\n beta: '5skbadERCne5HKSS9a1EXz5RetUiEfpP',\r\n development: '5skbadERCne5HKSS9a1EXz5RetUiEfpP',\r\n test: 'Dguh5yxNDEwyQlqDmikmd7ImruaOp8c8',\r\n testing: 'Dguh5yxNDEwyQlqDmikmd7ImruaOp8c8',\r\n sit: 'Dguh5yxNDEwyQlqDmikmd7ImruaOp8c8',\r\n uat: 'W565QolX6clTuL1Kqgpp0JmUqBkWKY6i',\r\n prod: 'HUk5Kogyuv9zH5qDA2qSCjVEnhanSkf8',\r\n production: 'HUk5Kogyuv9zH5qDA2qSCjVEnhanSkf8',\r\n};\r\n\r\nexport const SDK_VERSION = '1.0.0';\r\n\r\nexport const DEFAULT_CONFIG = {\r\n debug: false,\r\n autoTrack: true,\r\n bufferFlushInterval: 5000,\r\n bufferMaxSize: 25,\r\n maxRetryCount: 3,\r\n sessionTimeout: 30 * 60 * 1000,\r\n clientType: 'WEB',\r\n merchantLanguage: 'en',\r\n} as const;\r\n\r\nexport const STORAGE_KEYS = {\r\n FAILED_QUEUE: '__analytics_failed_queue__',\r\n CLIENT_ID: '__analytics_client_id__',\r\n LANDING_PAGE: '__analytics_landing_page__',\r\n REFERRER_URL: '__analytics_referrer_url__',\r\n} as const;\r\n\r\nexport const MAX_STORAGE_ITEMS = 500;\r\n", "import { BrowserInfo, OSInfo } from '../types';\r\n\r\nexport function generateId(): string {\r\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\r\n}\r\n\r\nexport function getTimestamp(): number {\r\n return Date.now();\r\n}\r\n\r\nexport function isObject(value: unknown): value is Record<string, unknown> {\r\n return Object.prototype.toString.call(value) === '[object Object]';\r\n}\r\n\r\nexport function merge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {\r\n const result = { ...target };\r\n for (const key in source) {\r\n if (Object.prototype.hasOwnProperty.call(source, key)) {\r\n result[key] = source[key] as T[Extract<keyof T, string>];\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nexport function generateUUID(): string {\r\n const hex = '0123456789abcdef';\r\n const template = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';\r\n return template.replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return hex[v];\r\n });\r\n}\r\n\r\nexport function generateShortId(): string {\r\n return Math.random().toString(36).substring(2, 10);\r\n}\r\n\r\nexport function detectBrowser(): BrowserInfo {\r\n if (typeof navigator === 'undefined') return { name: 'Unknown', version: '0' };\r\n\r\n const ua = navigator.userAgent;\r\n const edgeMatch = ua.match(/Edg\\/(\\d+)/);\r\n if (edgeMatch) return { name: 'Edge', version: edgeMatch[1] };\r\n\r\n const chromeMatch = ua.match(/Chrome\\/(\\d+)/);\r\n const safariMatch = ua.match(/Safari\\/(\\d+)/);\r\n\r\n if (chromeMatch && !ua.includes('Edg') && !ua.includes('OPR')) {\r\n return { name: 'Chrome', version: chromeMatch[1] };\r\n }\r\n\r\n const firefoxMatch = ua.match(/Firefox\\/(\\d+)/);\r\n if (firefoxMatch) return { name: 'Firefox', version: firefoxMatch[1] };\r\n\r\n const opMatch = ua.match(/OPR\\/(\\d+)/);\r\n if (opMatch) return { name: 'Opera', version: opMatch[1] };\r\n\r\n if (safariMatch && !ua.includes('Chrome')) {\r\n const versionMatch = ua.match(/Version\\/(\\d+)/);\r\n return { name: 'Safari', version: versionMatch ? versionMatch[1] : safariMatch[1] };\r\n }\r\n\r\n const ieMatch = ua.match(/(?:MSIE |Trident\\/.*; rv:)(\\d+)/);\r\n if (ieMatch) return { name: 'IE', version: ieMatch[1] };\r\n\r\n return { name: 'Unknown', version: '0' };\r\n}\r\n\r\nexport function detectOS(): OSInfo {\r\n if (typeof navigator === 'undefined') return { name: 'Unknown', version: '0' };\r\n\r\n const ua = navigator.userAgent;\r\n const platform = navigator.platform || '';\r\n\r\n if (ua.includes('Windows NT 10')) return { name: 'Windows', version: '10' };\r\n if (ua.includes('Windows NT 6.3')) return { name: 'Windows', version: '8.1' };\r\n if (ua.includes('Windows NT 6.2')) return { name: 'Windows', version: '8' };\r\n if (ua.includes('Windows NT 6.1')) return { name: 'Windows', version: '7' };\r\n if (/Windows NT \\d/.test(ua)) return { name: 'Windows', version: ua.match(/Windows NT (\\d+\\.?\\d*)/)?.[1] || '0' };\r\n\r\n const macMatch = ua.match(/Mac OS X (\\d+[._]\\d+)/);\r\n if (macMatch) return { name: 'macOS', version: macMatch[1].replace('_', '.') };\r\n\r\n if (platform.startsWith('Mac')) return { name: 'macOS', version: '0' };\r\n\r\n if (/Android (\\d+\\.?\\d*)/.test(ua)) return { name: 'Android', version: ua.match(/Android (\\d+\\.?\\d*)/)?.[1] || '0' };\r\n\r\n if (/iPhone|iPad|iPod/.test(ua)) {\r\n const iosMatch = ua.match(/OS (\\d+[._]\\d+)/);\r\n return { name: 'iOS', version: iosMatch ? iosMatch[1].replace('_', '.') : '0' };\r\n }\r\n\r\n if (/Linux/.test(ua) || platform.includes('Linux')) return { name: 'Linux', version: '0' };\r\n\r\n return { name: 'Unknown', version: '0' };\r\n}\r\n\r\nexport function getDeviceType(): 'mobile' | 'tablet' | 'desktop' {\r\n if (typeof window === 'undefined' || typeof navigator === 'undefined') return 'desktop';\r\n\r\n const width = window.screen.width;\r\n const hasTouch = navigator.maxTouchPoints > 0;\r\n\r\n if (width < 768 && hasTouch) return 'mobile';\r\n if (width >= 768 && width <= 1024 && hasTouch) return 'tablet';\r\n return 'desktop';\r\n}\r\n\r\nexport function getScreenSize(): { width: number; height: number } {\r\n if (typeof window === 'undefined') return { width: 0, height: 0 };\r\n return {\r\n width: window.screen.width,\r\n height: window.screen.height,\r\n };\r\n}\r\n\r\nexport function getPageUrl(): string {\r\n if (typeof window === 'undefined') return '';\r\n return window.location.href;\r\n}\r\n\r\nexport function getReferrer(): string {\r\n if (typeof document === 'undefined') return '';\r\n return document.referrer || '';\r\n}\r\n\r\nexport function getHostname(): string {\r\n if (typeof window === 'undefined') return '';\r\n return window.location.host.split(':')[0];\r\n}\r\n\r\nexport function getTimezone(): string {\r\n try {\r\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n } catch {\r\n return 'UTC';\r\n }\r\n}\r\n\r\nexport function getLanguage(): string {\r\n if (typeof navigator === 'undefined') return 'en-US';\r\n return navigator.language || 'en-US';\r\n}\r\n\r\nexport function getCountryFromLanguage(language: string): string {\r\n const parts = language.split('-');\r\n if (parts.length > 1) return parts[1].toUpperCase();\r\n const langMap: Record<string, string> = {\r\n zh: 'CN', en: 'US', ja: 'JP', ko: 'KR', fr: 'FR',\r\n de: 'DE', es: 'ES', pt: 'BR', ru: 'RU', ar: 'SA',\r\n };\r\n return langMap[parts[0]] || parts[0].toUpperCase();\r\n}\r\n\r\nexport function parseUTMParams(): Record<string, string> {\r\n if (typeof window === 'undefined') return {};\r\n\r\n const params: Record<string, string> = {};\r\n const searchParams = new URLSearchParams(window.location.search);\r\n const utmKeys = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];\r\n\r\n for (const key of utmKeys) {\r\n const value = searchParams.get(key);\r\n if (value) params[key] = value;\r\n }\r\n\r\n return params;\r\n}\r\n\r\nexport function isBrowser(): boolean {\r\n return typeof window !== 'undefined' && typeof document !== 'undefined';\r\n}\r\n\r\nexport function safeLocalStorageGet(key: string): string | null {\r\n try {\r\n return localStorage.getItem(key);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function safeLocalStorageSet(key: string, value: string): boolean {\r\n try {\r\n localStorage.setItem(key, value);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function safeLocalStorageRemove(key: string): void {\r\n try {\r\n localStorage.removeItem(key);\r\n } catch {\r\n // ignore\r\n }\r\n}\r\n\r\nexport function safeSessionStorageGet(key: string): string | null {\r\n try {\r\n return sessionStorage.getItem(key);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function safeSessionStorageSet(key: string, value: string): boolean {\r\n try {\r\n sessionStorage.setItem(key, value);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function safeSessionStorageRemove(key: string): void {\r\n try {\r\n sessionStorage.removeItem(key);\r\n } catch {\r\n // ignore\r\n }\r\n}\r\n\r\nexport function truncateText(text: string, maxLength: number): string {\r\n if (!text) return '';\r\n const trimmed = text.trim().replace(/\\s+/g, ' ');\r\n return trimmed.length > maxLength ? trimmed.substring(0, maxLength) + '...' : trimmed;\r\n}\r\n", "import { generateUUID, safeSessionStorageGet, safeSessionStorageSet, safeSessionStorageRemove } from '../utils';\r\n\r\nconst SESSION_KEY = '__analytics_session__';\r\nconst SESSION_DEFAULT_TIMEOUT = 30 * 60 * 1000;\r\n\r\ninterface SessionData {\r\n sessionId: string;\r\n createdAt: number;\r\n}\r\n\r\nexport class SessionManager {\r\n private sessionId: string;\r\n private createdAt: number = 0;\r\n private timeout: number;\r\n\r\n constructor(timeout: number = SESSION_DEFAULT_TIMEOUT) {\r\n this.timeout = timeout;\r\n const existing = this.loadSession();\r\n if (existing && !this.isExpired(existing)) {\r\n this.sessionId = existing.sessionId;\r\n this.createdAt = existing.createdAt;\r\n } else {\r\n this.sessionId = this.createNewSession();\r\n this.createdAt = Date.now();\r\n }\r\n }\r\n\r\n getSessionId(): string {\r\n if (this.isExpired({ sessionId: this.sessionId, createdAt: this.createdAt })) {\r\n this.sessionId = this.createNewSession();\r\n }\r\n return this.sessionId;\r\n }\r\n\r\n refresh(): void {\r\n this.sessionId = this.createNewSession();\r\n }\r\n\r\n private loadSession(): SessionData | null {\r\n try {\r\n const raw = safeSessionStorageGet(SESSION_KEY);\r\n if (!raw) return null;\r\n return JSON.parse(raw) as SessionData;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private saveSession(): void {\r\n const data: SessionData = {\r\n sessionId: this.sessionId,\r\n createdAt: this.createdAt,\r\n };\r\n safeSessionStorageSet(SESSION_KEY, JSON.stringify(data));\r\n }\r\n\r\n private isExpired(data: SessionData): boolean {\r\n return Date.now() - data.createdAt > this.timeout;\r\n }\r\n\r\n private createNewSession(): string {\r\n const id = generateUUID();\r\n this.createdAt = Date.now();\r\n this.saveSession();\r\n return id;\r\n }\r\n}\r\n", "import { AnalyticsPayload } from '../types';\r\n\r\nexport class Sender {\r\n static async send(payload: AnalyticsPayload, serverUrl: string, apiKey: string): Promise<void> {\r\n if (Sender.supportsKeepalive()) {\r\n return Sender.fetchSend(payload, serverUrl, apiKey);\r\n }\r\n return Sender.xhrSend(payload, serverUrl, apiKey);\r\n }\r\n\r\n static async sendBeacon(payload: AnalyticsPayload, serverUrl: string, apiKey: string): Promise<void> {\r\n if (typeof navigator === 'undefined' || !navigator.sendBeacon) {\r\n throw new Error('sendBeacon not available');\r\n }\r\n\r\n const url = Sender.buildBeaconUrl(serverUrl, apiKey);\r\n const blob = new Blob([JSON.stringify(payload)], { type: 'application/json' });\r\n const success = navigator.sendBeacon(url, blob);\r\n\r\n if (!success) {\r\n throw new Error('sendBeacon rejected payload');\r\n }\r\n }\r\n\r\n static async fetchSend(payload: AnalyticsPayload, serverUrl: string, apiKey: string): Promise<void> {\r\n const response = await fetch(serverUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n apiKey,\r\n },\r\n body: JSON.stringify(payload),\r\n keepalive: true,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n }\r\n\r\n static async xhrSend(payload: AnalyticsPayload, serverUrl: string, apiKey: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open('POST', serverUrl);\r\n xhr.setRequestHeader('Content-Type', 'application/json');\r\n xhr.setRequestHeader('apiKey', apiKey);\r\n xhr.timeout = 10000;\r\n\r\n xhr.onload = () => {\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n resolve();\r\n } else {\r\n reject(new Error(`HTTP ${xhr.status}: ${xhr.statusText}`));\r\n }\r\n };\r\n\r\n xhr.onerror = () => reject(new Error('XHR network error'));\r\n xhr.ontimeout = () => reject(new Error('XHR timeout'));\r\n\r\n xhr.send(JSON.stringify(payload));\r\n });\r\n }\r\n\r\n private static supportsKeepalive(): boolean {\r\n try {\r\n return typeof Request !== 'undefined' && 'keepalive' in Request.prototype;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private static buildBeaconUrl(serverUrl: string, apiKey: string): string {\r\n const separator = serverUrl.includes('?') ? '&' : '?';\r\n return `${serverUrl}${separator}apiKey=${encodeURIComponent(apiKey)}`;\r\n }\r\n}\r\n", "import { EventPayload, StorageQueueItem, STORAGE_KEYS, MAX_STORAGE_ITEMS } from '../types';\r\nimport { safeLocalStorageGet, safeLocalStorageSet, safeLocalStorageRemove } from '../utils';\r\n\r\nexport class StorageQueue {\r\n static enqueue(event: EventPayload): void {\r\n try {\r\n const queue = StorageQueue.readQueue();\r\n queue.push({ event, storedAt: Date.now() });\r\n\r\n while (queue.length > MAX_STORAGE_ITEMS) {\r\n queue.shift();\r\n }\r\n\r\n safeLocalStorageSet(STORAGE_KEYS.FAILED_QUEUE, JSON.stringify(queue));\r\n } catch {\r\n // Silently fail if storage is unavailable\r\n }\r\n }\r\n\r\n static recover(): EventPayload[] {\r\n try {\r\n const queue = StorageQueue.readQueue();\r\n StorageQueue.clear();\r\n\r\n const events = queue.map((item) => item.event);\r\n return events;\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n static clear(): void {\r\n safeLocalStorageRemove(STORAGE_KEYS.FAILED_QUEUE);\r\n }\r\n\r\n static getQueueSize(): number {\r\n return StorageQueue.readQueue().length;\r\n }\r\n\r\n private static readQueue(): StorageQueueItem[] {\r\n try {\r\n const raw = safeLocalStorageGet(STORAGE_KEYS.FAILED_QUEUE);\r\n if (!raw) return [];\r\n const parsed = JSON.parse(raw);\r\n if (!Array.isArray(parsed)) return [];\r\n return parsed;\r\n } catch {\r\n return [];\r\n }\r\n }\r\n}\r\n", "import {\r\n ContextPayload,\r\n MarketingPayload,\r\n SDK_VERSION,\r\n STORAGE_KEYS,\r\n} from '../types';\r\nimport {\r\n detectBrowser,\r\n detectOS,\r\n getDeviceType,\r\n getScreenSize,\r\n getHostname,\r\n getReferrer,\r\n getTimezone,\r\n getLanguage,\r\n getCountryFromLanguage,\r\n parseUTMParams,\r\n safeLocalStorageGet,\r\n safeLocalStorageSet,\r\n isBrowser,\r\n} from '../utils';\r\n\r\nexport function collectContext(appKey: string, merchantLanguage: string, clientType: string): ContextPayload {\r\n const screen = getScreenSize();\r\n\r\n return {\r\n sdk_version: SDK_VERSION,\r\n app_key: appKey,\r\n screen_width: screen.width,\r\n screen_height: screen.height,\r\n user_agent: isBrowser() ? navigator.userAgent : '',\r\n referrer: getReferrer(),\r\n hostname: getHostname(),\r\n browser: detectBrowser(),\r\n operating_system: detectOS(),\r\n device_type: getDeviceType(),\r\n country: getCountryFromLanguage(getLanguage()),\r\n language: getLanguage(),\r\n merchant_language: merchantLanguage,\r\n timezone: getTimezone(),\r\n client_type: clientType,\r\n };\r\n}\r\n\r\nexport function collectMarketing(): MarketingPayload {\r\n if (!isBrowser()) return {};\r\n\r\n const utm = parseUTMParams();\r\n\r\n let landingPage = safeLocalStorageGet(STORAGE_KEYS.LANDING_PAGE);\r\n if (!landingPage) {\r\n landingPage = window.location.href;\r\n safeLocalStorageSet(STORAGE_KEYS.LANDING_PAGE, landingPage);\r\n }\r\n\r\n let referrerUrl = safeLocalStorageGet(STORAGE_KEYS.REFERRER_URL);\r\n if (referrerUrl === null && document.referrer) {\r\n referrerUrl = document.referrer;\r\n safeLocalStorageSet(STORAGE_KEYS.REFERRER_URL, referrerUrl);\r\n }\r\n\r\n return {\r\n ...utm,\r\n landing_page: landingPage || window.location.href,\r\n referrer_url: referrerUrl || '',\r\n };\r\n}\r\n", "import { truncateText } from '../utils';\r\n\r\nconst TRACK_ATTR_PREFIX = 'data-track-';\r\nconst IGNORE_ATTR = 'data-track-ignore';\r\nconst NAME_ATTR = 'data-track-name';\r\nconst PROPS_ATTR = 'data-track-properties';\r\n\r\nexport interface AutoTrackAPI {\r\n track(eventName: string, properties?: Record<string, unknown>): void;\r\n debug?: boolean;\r\n}\r\n\r\nexport function initAutoTrack(api: AutoTrackAPI, selector?: string): void {\r\n if (typeof document === 'undefined') return;\r\n\r\n const handler = (e: Event): void => {\r\n try {\r\n const target = e.target as HTMLElement;\r\n if (!target) return;\r\n\r\n if (shouldIgnoreElement(target)) return;\r\n\r\n if (selector) {\r\n const scope = document.querySelector(selector);\r\n if (scope && !scope.contains(target)) return;\r\n }\r\n\r\n const eventName = getTrackName(target);\r\n const properties = collectElementProperties(target);\r\n\r\n api.track(eventName, properties);\r\n } catch {\r\n // Fail silently to avoid breaking user's page\r\n }\r\n };\r\n\r\n document.addEventListener('click', handler, true);\r\n}\r\n\r\nfunction shouldIgnoreElement(element: HTMLElement): boolean {\r\n let current: HTMLElement | null = element;\r\n while (current) {\r\n if (current.hasAttribute(IGNORE_ATTR)) return true;\r\n current = current.parentElement;\r\n }\r\n return false;\r\n}\r\n\r\nfunction getTrackName(element: HTMLElement): string {\r\n const name = element.getAttribute(NAME_ATTR);\r\n if (name) return name;\r\n\r\n const id = element.id ? `_${element.id}` : '';\r\n const tag = element.tagName.toLowerCase();\r\n return `click_${tag}${id}`;\r\n}\r\n\r\nfunction collectElementProperties(element: HTMLElement): Record<string, unknown> {\r\n const props: Record<string, unknown> = {\r\n action: 'click',\r\n target_type: inferTargetType(element),\r\n target_id: getTargetId(element),\r\n target_tag: element.tagName.toLowerCase(),\r\n target_class: getTruncatedClassName(element),\r\n target_text: truncateText(element.innerText || '', 50),\r\n };\r\n\r\n if (element.hasAttribute('href') || element.closest('a')) {\r\n const anchor = element.closest('a');\r\n if (anchor) {\r\n props.target_href = anchor.getAttribute('href') || '';\r\n }\r\n }\r\n\r\n const customProps = collectDataTrackProps(element);\r\n Object.assign(props, customProps);\r\n\r\n return props;\r\n}\r\n\r\nfunction inferTargetType(element: HTMLElement): string {\r\n const tag = element.tagName.toLowerCase();\r\n if (tag === 'a' || tag === 'button') return 'button';\r\n if (tag === 'input') {\r\n const type = (element as HTMLInputElement).type;\r\n if (type === 'submit' || type === 'button' || type === 'reset') return 'button';\r\n if (type === 'checkbox' || type === 'radio') return 'checkbox';\r\n return 'input';\r\n }\r\n if (tag === 'select') return 'select';\r\n if (tag === 'img') return 'image';\r\n if (tag === 'form') return 'form';\r\n if (tag === 'textarea') return 'input';\r\n return 'element';\r\n}\r\n\r\nfunction getTargetId(element: HTMLElement): string {\r\n if (element.id) return element.id;\r\n\r\n const name = element.getAttribute('name');\r\n if (name) return name;\r\n\r\n const dataTestId = element.getAttribute('data-testid') || element.getAttribute('data-test-id');\r\n if (dataTestId) return dataTestId;\r\n\r\n return '';\r\n}\r\n\r\nfunction getTruncatedClassName(element: HTMLElement): string {\r\n const cls = typeof element.className === 'string' ? element.className : '';\r\n return truncateText(cls, 100);\r\n}\r\n\r\nfunction collectDataTrackProps(element: HTMLElement): Record<string, unknown> {\r\n const props: Record<string, unknown> = {};\r\n const trackName = element.getAttribute(NAME_ATTR);\r\n if (trackName) props.name = trackName;\r\n\r\n const rawProps = element.getAttribute(PROPS_ATTR);\r\n if (rawProps) {\r\n try {\r\n const parsed = JSON.parse(rawProps);\r\n Object.assign(props, parsed);\r\n } catch {\r\n // Invalid JSON, ignore\r\n }\r\n }\r\n\r\n for (const attr of Array.from(element.attributes)) {\r\n if (attr.name.startsWith(TRACK_ATTR_PREFIX) && attr.name !== NAME_ATTR && attr.name !== PROPS_ATTR && attr.name !== IGNORE_ATTR) {\r\n const key = attr.name.replace(TRACK_ATTR_PREFIX, '');\r\n props[key] = attr.value;\r\n }\r\n }\r\n\r\n return props;\r\n}\r\n", "export interface ErrorMonitorAPI {\r\n track(eventName: string, properties?: Record<string, unknown>): void;\r\n}\r\n\r\nexport function initErrorMonitor(api: ErrorMonitorAPI): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n window.addEventListener('error', (event: ErrorEvent) => {\r\n try {\r\n const { message, filename, lineno, colno, error } = event;\r\n\r\n const isResourceError = !message && event.target !== window;\r\n if (isResourceError) return;\r\n\r\n api.track('error_event', {\r\n action: 'error',\r\n target_type: 'system',\r\n error_type: 'window_error',\r\n error_message: message || 'Unknown error',\r\n error_filename: filename || '',\r\n error_lineno: lineno || 0,\r\n error_colno: colno || 0,\r\n error_stack: error instanceof Error ? error.stack : '',\r\n error_name: error instanceof Error ? error.name : '',\r\n });\r\n } catch {\r\n // Fail silently to avoid recursive error reporting\r\n }\r\n });\r\n\r\n window.addEventListener('unhandledrejection', (event: PromiseRejectionEvent) => {\r\n try {\r\n const { reason } = event;\r\n\r\n let errorMessage = 'Unhandled Promise Rejection';\r\n let errorStack = '';\r\n let errorName = 'PromiseRejection';\r\n\r\n if (reason instanceof Error) {\r\n errorMessage = reason.message;\r\n errorStack = reason.stack || '';\r\n errorName = reason.name;\r\n } else if (typeof reason === 'string') {\r\n errorMessage = reason;\r\n } else {\r\n try {\r\n errorMessage = JSON.stringify(reason);\r\n } catch {\r\n errorMessage = String(reason);\r\n }\r\n }\r\n\r\n api.track('error_event', {\r\n action: 'error',\r\n target_type: 'system',\r\n error_type: 'unhandled_rejection',\r\n error_message: errorMessage,\r\n error_stack: errorStack,\r\n error_name: errorName,\r\n });\r\n } catch {\r\n // Fail silently\r\n }\r\n });\r\n}\r\n", "import { GAConfig } from '../types';\n\ndeclare global {\n interface Window {\n gtag: (...args: unknown[]) => void;\n dataLayer: unknown[];\n }\n}\n\nexport function loadGtagScript(measurementId: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if (typeof window !== 'undefined' && typeof window.gtag === 'function') {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.async = true;\n script.src = `https://www.googletagmanager.com/gtag/js?id=${measurementId}`;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load gtag.js'));\n document.head.appendChild(script);\n });\n}\n\nexport async function initGA(config: GAConfig): Promise<void> {\n if (!config.enabled || !config.measurementId) return;\n if (typeof window === 'undefined') return;\n\n await loadGtagScript(config.measurementId);\n\n window.dataLayer = window.dataLayer || [];\n window.gtag = function gtag(...args: unknown[]): void {\n window.dataLayer.push(args);\n };\n\n window.gtag('js', new Date());\n window.gtag('config', config.measurementId, {\n send_page_view: config.sendPageView ?? false,\n debug_mode: config.debugMode ?? false,\n });\n}", "let e=-1;const t=t=>{addEventListener(\"pageshow\",n=>{n.persisted&&(e=n.timeStamp,t(n))},!0)},n=(e,t,n,i)=>{let s,o;return r=>{t.value>=0&&(r||i)&&(o=t.value-(s??0),(o||void 0===s)&&(s=t.value,t.delta=o,t.rating=((e,t)=>e>t[1]?\"poor\":e>t[0]?\"needs-improvement\":\"good\")(t.value,n),e(t)))}},i=e=>{requestAnimationFrame(()=>requestAnimationFrame(e))},s=()=>{const e=performance.getEntriesByType(\"navigation\")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},o=()=>s()?.activationStart??0,r=(t,n=-1)=>{const i=s();let r=\"navigate\";e>=0?r=\"back-forward-cache\":i&&(document.prerendering||o()>0?r=\"prerender\":document.wasDiscarded?r=\"restore\":i.type&&(r=i.type.replace(/_/g,\"-\")));return{name:t,value:n,rating:\"good\",delta:0,entries:[],id:`v5-${Date.now()}-${Math.floor(8999999999999*Math.random())+1e12}`,navigationType:r}},c=new WeakMap;function a(e,t){return c.get(e)||c.set(e,new t),c.get(e)}class d{t;i=0;o=[];h(e){if(e.hadRecentInput)return;const t=this.o[0],n=this.o.at(-1);this.i&&t&&n&&e.startTime-n.startTime<1e3&&e.startTime-t.startTime<5e3?(this.i+=e.value,this.o.push(e)):(this.i=e.value,this.o=[e]),this.t?.(e)}}const h=(e,t,n={})=>{try{if(PerformanceObserver.supportedEntryTypes.includes(e)){const i=new PerformanceObserver(e=>{queueMicrotask(()=>{t(e.getEntries())})});return i.observe({type:e,buffered:!0,...n}),i}}catch{}},f=e=>{let t=!1;return()=>{t||(e(),t=!0)}};let l=-1;const u=new Set,m=()=>\"hidden\"!==document.visibilityState||document.prerendering?1/0:0,g=e=>{if(\"hidden\"===document.visibilityState){if(\"visibilitychange\"===e.type)for(const e of u)e();isFinite(l)||(l=\"visibilitychange\"===e.type?e.timeStamp:0,removeEventListener(\"prerenderingchange\",g,!0))}},p=()=>{if(l<0){const e=o(),n=document.prerendering?void 0:globalThis.performance.getEntriesByType(\"visibility-state\").find(t=>\"hidden\"===t.name&&t.startTime>=e)?.startTime;l=n??m(),addEventListener(\"visibilitychange\",g,!0),addEventListener(\"prerenderingchange\",g,!0),t(()=>{setTimeout(()=>{l=m()})})}return{get firstHiddenTime(){return l},onHidden(e){u.add(e)}}},v=e=>{document.prerendering?addEventListener(\"prerenderingchange\",e,!0):e()},y=[1800,3e3],T=(e,s={})=>{v(()=>{const c=p();let a,d=r(\"FCP\");const f=h(\"paint\",e=>{for(const t of e)\"first-contentful-paint\"===t.name&&(f.disconnect(),t.startTime<c.firstHiddenTime&&(d.value=Math.max(t.startTime-o(),0),d.entries.push(t),a(!0)))});f&&(a=n(e,d,y,s.reportAllChanges),t(t=>{d=r(\"FCP\"),a=n(e,d,y,s.reportAllChanges),i(()=>{d.value=performance.now()-t.timeStamp,a(!0)})}))})},E=[.1,.25],b=(e,s={})=>{const o=p();T(f(()=>{let c,f=r(\"CLS\",0);const l=a(s,d),u=e=>{for(const t of e)l.h(t);l.i>f.value&&(f.value=l.i,f.entries=l.o,c())},m=h(\"layout-shift\",u);m&&(c=n(e,f,E,s.reportAllChanges),o.onHidden(()=>{u(m.takeRecords()),c(!0)}),t(()=>{l.i=0,f=r(\"CLS\",0),c=n(e,f,E,s.reportAllChanges),i(c)}),setTimeout(c))}))};let L=0,P=1/0,_=0;const M=e=>{for(const t of e)t.interactionId&&(P=Math.min(P,t.interactionId),_=Math.max(_,t.interactionId),L=_?(_-P)/7+1:0)};let w;const C=()=>w?L:performance.interactionCount??0,I=()=>{\"interactionCount\"in performance||w||(w=h(\"event\",M,{durationThreshold:0}))};let F=0;class k{l=[];u=new Map;m;p;v(){F=C(),this.l.length=0,this.u.clear()}T(){const e=Math.min(this.l.length-1,Math.floor((C()-F)/50));return this.l[e]}h(e){if(this.m?.(e),!e.interactionId&&\"first-input\"!==e.entryType)return;const t=this.l.at(-1);let n=this.u.get(e.interactionId);if(n||this.l.length<10||e.duration>t.L){if(n?e.duration>n.L?(n.entries=[e],n.L=e.duration):e.duration===n.L&&e.startTime===n.entries[0].startTime&&n.entries.push(e):(n={id:e.interactionId,entries:[e],L:e.duration},this.u.set(n.id,n),this.l.push(n)),this.l.sort((e,t)=>t.L-e.L),this.l.length>10){const e=this.l.splice(10);for(const t of e)this.u.delete(t.id)}this.p?.(n)}}}const A=e=>{const t=globalThis.requestIdleCallback||setTimeout,n=globalThis.cancelIdleCallback||clearTimeout;if(\"hidden\"===document.visibilityState)e();else{const i=f(e);let s=-1;const o=()=>{n(s),i()};addEventListener(\"visibilitychange\",o,{once:!0,capture:!0}),s=t(()=>{removeEventListener(\"visibilitychange\",o,{capture:!0}),i()})}},B=[200,500],S=(e,i={})=>{if(!globalThis.PerformanceEventTiming||!(\"interactionId\"in PerformanceEventTiming.prototype))return;const s=p();v(()=>{I();let o,c=r(\"INP\");const d=a(i,k),f=e=>{A(()=>{for(const t of e)d.h(t);const t=d.T();t&&t.L!==c.value&&(c.value=t.L,c.entries=t.entries,o())})},l=h(\"event\",f,{durationThreshold:i.durationThreshold??40});o=n(e,c,B,i.reportAllChanges),l&&(l.observe({type:\"first-input\",buffered:!0}),s.onHidden(()=>{f(l.takeRecords()),o(!0)}),t(()=>{d.v(),c=r(\"INP\"),o=n(e,c,B,i.reportAllChanges)}))})};class q{m;h(e){this.m?.(e)}}const N=[2500,4e3],x=(e,s={})=>{v(()=>{const c=p();let d,l=r(\"LCP\");const u=a(s,q),m=e=>{s.reportAllChanges||(e=e.slice(-1));for(const t of e)u.h(t),t.startTime<c.firstHiddenTime&&(l.value=Math.max(t.startTime-o(),0),l.entries=[t],d())},g=h(\"largest-contentful-paint\",m);if(g){d=n(e,l,N,s.reportAllChanges);const o=f(()=>{m(g.takeRecords()),g.disconnect(),d(!0)}),c=e=>{e.isTrusted&&(A(o),removeEventListener(e.type,c,{capture:!0}))};for(const e of[\"keydown\",\"click\",\"visibilitychange\"])addEventListener(e,c,{capture:!0});t(t=>{l=r(\"LCP\"),d=n(e,l,N,s.reportAllChanges),i(()=>{l.value=performance.now()-t.timeStamp,d(!0)})})}})},H=[800,1800],O=e=>{document.prerendering?v(()=>O(e)):\"complete\"!==document.readyState?addEventListener(\"load\",()=>O(e),!0):setTimeout(e)},$=(e,i={})=>{let c=r(\"TTFB\"),a=n(e,c,H,i.reportAllChanges);O(()=>{const d=s();d&&(c.value=Math.max(d.responseStart-o(),0),c.entries=[d],a(!0),t(()=>{c=r(\"TTFB\",0),a=n(e,c,H,i.reportAllChanges),a(!0)}))})};export{E as CLSThresholds,y as FCPThresholds,B as INPThresholds,N as LCPThresholds,H as TTFBThresholds,b as onCLS,T as onFCP,S as onINP,x as onLCP,$ as onTTFB};\n", "import {\n onLCP,\n onFCP,\n onCLS,\n onINP,\n onTTFB,\n} from 'web-vitals';\nimport type { MetricType } from 'web-vitals';\n\nimport type { Analytics } from './analytics';\nimport type { PerformanceConfig } from '../types';\n\nexport type PerformanceMonitorAPI = Pick<Analytics, 'track'>;\n\nfunction normalize(value: number, isCLS: boolean): number {\n if (isCLS) {\n return Math.round(value * 10000) / 10000;\n }\n return Math.round(value);\n}\n\nfunction reportMetric(api: PerformanceMonitorAPI, metric: MetricType): void {\n const isCLS = metric.name === 'CLS';\n const properties: Record<string, unknown> = {\n action: 'metric',\n target_type: 'performance',\n metric_name: metric.name,\n metric_value: normalize(metric.value, isCLS),\n metric_rating: metric.rating,\n delta: normalize(metric.delta, isCLS),\n metric_id: metric.id,\n navigation_type: metric.navigationType,\n };\n\n if (metric.name === 'LCP') {\n const entry = metric.entries[metric.entries.length - 1] as LargestContentfulPaint | undefined;\n if (entry) {\n properties.lcp_element = entry.element?.tagName?.toLowerCase() || '';\n properties.lcp_url = entry.url || '';\n properties.lcp_size = entry.size;\n }\n }\n\n api.track('web_vital', properties);\n}\n\nexport function initPerformanceMonitor(\n api: PerformanceMonitorAPI,\n config: PerformanceConfig = {},\n): void {\n if (config.enabled === false) return;\n\n try {\n onLCP((metric) => reportMetric(api, metric));\n onFCP((metric) => reportMetric(api, metric));\n onCLS((metric) => reportMetric(api, metric));\n onINP((metric) => reportMetric(api, metric));\n onTTFB((metric) => reportMetric(api, metric));\n } catch {\n // Web Vitals API not supported in this browser\n }\n}\n", "import { MarketingPayload } from '../types';\n\nexport interface GAEventOptions {\n sessionId: string;\n pageUrl: string;\n referrer: string;\n marketing: MarketingPayload;\n userId?: string | null;\n}\n\nexport function trackToGA(\n eventName: string,\n properties: Record<string, unknown>,\n options: GAEventOptions\n): void {\n if (typeof window === 'undefined' || !window.gtag) return;\n\n const params: Record<string, unknown> = {\n session_id: options.sessionId,\n engagement_time_msec: 100,\n page_location: options.pageUrl,\n page_referrer: options.referrer,\n };\n\n const { marketing, userId } = options;\n if (marketing.utm_source) params.utm_source = marketing.utm_source;\n if (marketing.utm_medium) params.utm_medium = marketing.utm_medium;\n if (marketing.utm_campaign) params.utm_campaign = marketing.utm_campaign;\n if (marketing.utm_term) params.utm_term = marketing.utm_term;\n if (marketing.utm_content) params.utm_content = marketing.utm_content;\n if (userId) params.user_id = userId;\n\n Object.assign(params, properties);\n\n window.gtag('event', eventName, params);\n}\n\nexport function setGAUserId(userId: string | null): void {\n if (typeof window === 'undefined' || !window.gtag) return;\n window.gtag('set', { user_id: userId ?? undefined });\n}\n\nexport function setGAUserProperties(properties: Record<string, unknown>): void {\n if (typeof window === 'undefined' || !window.gtag) return;\n window.gtag('set', 'user_properties', properties);\n}", "import type {\n GAConsentMode,\n GAConsentParams,\n} from '../types';\n\ndeclare global {\n interface Window {\n gtag: (...args: unknown[]) => void;\n dataLayer: unknown[];\n }\n}\n\nexport class GAManager {\n private _initialized = false;\n private _measurementId: string | undefined;\n\n get ready(): boolean {\n return this._initialized && typeof window !== 'undefined' && typeof window.gtag === 'function';\n }\n\n get measurementId(): string | undefined {\n return this._measurementId;\n }\n\n track(eventName: string, properties?: Record<string, unknown>): void {\n if (!this.ready) return;\n window.gtag('event', eventName, properties ?? {});\n }\n\n setUserId(userId: string | null): void {\n if (!this.ready) return;\n window.gtag('set', { user_id: userId ?? undefined });\n }\n\n setUserProperties(properties: Record<string, unknown>): void {\n if (!this.ready) return;\n window.gtag('set', 'user_properties', properties);\n }\n\n set(keyOrParams: string | Record<string, unknown>, value?: unknown): void {\n if (!this.ready) return;\n if (typeof keyOrParams === 'string') {\n window.gtag('set', keyOrParams, value);\n } else {\n window.gtag('set', keyOrParams);\n }\n }\n\n config(params?: Record<string, unknown>): void {\n if (!this.ready || !this._measurementId) return;\n window.gtag('config', this._measurementId, params ?? {});\n }\n\n consent(mode: GAConsentMode, params: GAConsentParams): void {\n if (!this.ready) return;\n window.gtag('consent', mode, params);\n }\n\n get(key: string, callback: (value: unknown) => void): void {\n if (!this.ready || !this._measurementId) return;\n window.gtag('get', this._measurementId, key, callback);\n }\n\n gtag(...args: unknown[]): void {\n if (typeof window === 'undefined' || !window.gtag) return;\n window.gtag(...args);\n }\n\n _init(measurementId: string): void {\n this._measurementId = measurementId;\n this._initialized = true;\n }\n\n _destroy(): void {\n this._initialized = false;\n this._measurementId = undefined;\n }\n}\n", "import {\r\n AnalyticsConfig,\r\n AnalyticsPayload,\r\n EventPayload,\r\n EventProperties,\r\n TrackOptions,\r\n UserProfile,\r\n API_KEY_MAP,\r\n DEFAULT_CONFIG,\r\n STORAGE_KEYS,\r\n} from '../types';\r\nimport { SessionManager } from './session-manager';\r\nimport { Sender } from './sender';\r\nimport { StorageQueue } from './storage';\r\nimport { collectContext, collectMarketing } from './context-collector';\r\nimport { initAutoTrack } from './auto-track';\r\nimport { initErrorMonitor } from './error-monitor';\r\nimport { initGA } from './ga-loader';\r\nimport { initPerformanceMonitor } from './performance-monitor';\r\nimport { trackToGA, setGAUserId, setGAUserProperties } from './ga-adapter';\r\nimport { GAManager } from './ga-manager';\r\nimport {\r\n generateId,\r\n generateUUID,\r\n getTimestamp,\r\n isObject,\r\n isBrowser,\r\n getPageUrl,\r\n safeLocalStorageGet,\r\n safeLocalStorageSet,\r\n} from '../utils';\r\n\r\nlet globalBatchCounter = 0;\r\n\r\nexport class Analytics {\r\n private config: Required<Pick<AnalyticsConfig, 'debug' | 'autoTrack' | 'bufferFlushInterval' | 'bufferMaxSize' | 'maxRetryCount'>> & AnalyticsConfig;\r\n private sessionManager: SessionManager;\r\n private buffer: EventPayload[] = [];\r\n private bufferTimer: ReturnType<typeof setTimeout> | null = null;\r\n private userId: string | null = null;\r\n private userProps: Record<string, unknown> = {};\r\n private batchPageId: string;\r\n private clientId: string;\r\n private merchantLang: string;\r\n private clientType: string;\r\n private initialized = false;\r\n private retrying = 0;\r\n private gaInitialized = false;\r\n ga: GAManager;\r\n\r\n constructor(config: AnalyticsConfig) {\r\n this.ga = new GAManager();\r\n\r\n this.config = {\r\n debug: false,\r\n autoTrack: true,\r\n bufferFlushInterval: DEFAULT_CONFIG.bufferFlushInterval,\r\n bufferMaxSize: DEFAULT_CONFIG.bufferMaxSize,\r\n maxRetryCount: DEFAULT_CONFIG.maxRetryCount,\r\n ...config,\r\n };\r\n\r\n const appKey = this.config.appKey || this.config.appId || 'unknown';\r\n if (this.config.appId) this.config.appKey = appKey;\r\n\r\n this.clientId = this.getOrCreateClientId();\r\n this.merchantLang = DEFAULT_CONFIG.merchantLanguage;\r\n this.clientType = DEFAULT_CONFIG.clientType;\r\n this.batchPageId = this.generateBatchPageId();\r\n this.sessionManager = new SessionManager(this.config.sessionTimeout);\r\n\r\n if (isBrowser()) {\r\n this.recoverFailedEvents();\r\n }\r\n\r\n this.registerBeforeUnload();\r\n\r\n if (this.config.autoTrack && isBrowser()) {\r\n initAutoTrack(this, this.config.autoTrackSelector);\r\n }\r\n\r\n if (isBrowser()) {\r\n initErrorMonitor(this);\r\n }\r\n\r\n if (isBrowser() && this.config.performance?.enabled !== false) {\r\n initPerformanceMonitor(this, this.config.performance);\r\n }\r\n\r\n if (isBrowser() && this.config.ga?.enabled) {\r\n this.ga._init(this.config.ga.measurementId);\r\n initGA(this.config.ga).then(() => {\r\n this.gaInitialized = true;\r\n this.log('GA4 initialized with measurementId:', this.config.ga?.measurementId);\r\n }).catch((error) => {\r\n this.ga._destroy();\r\n this.log('Failed to initialize GA4:', error);\r\n });\r\n }\r\n\r\n this.initialized = true;\r\n this.log('Analytics SDK initialized', {\r\n appKey: this.config.appKey,\r\n clientId: this.clientId,\r\n sessionId: this.sessionManager.getSessionId(),\r\n });\r\n\r\n if (isBrowser()) {\r\n this.trackPageView();\r\n }\r\n }\r\n\r\n track(eventName: string, properties?: Record<string, unknown>, options?: TrackOptions): void {\r\n if (!eventName || typeof eventName !== 'string') {\r\n this.log('Invalid event name');\r\n return;\r\n }\r\n\r\n const normalizedProps = properties && isObject(properties) ? properties : {};\r\n const isKeyEvent = options?.keyEvent === true || this.isKeyEvent(eventName);\r\n\r\n if (this.gaInitialized) {\r\n trackToGA(eventName, normalizedProps, {\r\n sessionId: this.sessionManager.getSessionId(),\r\n pageUrl: isBrowser() ? getPageUrl() : '',\r\n referrer: isBrowser() ? document.referrer : '',\r\n marketing: collectMarketing(),\r\n userId: this.userId,\r\n });\r\n }\r\n\r\n const event: EventPayload = {\r\n event_id: generateUUID(),\r\n event_name: eventName,\r\n batch_event_index: 0,\r\n batch_ordering_id: this.generateBatchOrderingId(),\r\n batch_page_id: this.batchPageId,\r\n timestamp: getTimestamp(),\r\n key_event: isKeyEvent,\r\n event_properties: this.buildEventProperties(normalizedProps),\r\n };\r\n\r\n if (isKeyEvent) {\r\n this.flushKeyEvent(event);\r\n return;\r\n }\r\n\r\n this.buffer.push(event);\r\n this.scheduleBufferFlush();\r\n\r\n if (this.buffer.length >= this.config.bufferMaxSize) {\r\n this.flushBuffer();\r\n }\r\n }\r\n\r\n identify(userId: string, attributes?: Record<string, unknown>): void {\r\n const wasAnonymous = !this.userId;\r\n this.userId = userId;\r\n if (attributes && isObject(attributes)) {\r\n this.userProps = attributes;\r\n }\r\n if (this.gaInitialized) {\r\n setGAUserId(userId);\r\n if (attributes && isObject(attributes)) {\r\n setGAUserProperties(attributes);\r\n }\r\n }\r\n this.log('User identified:', { userId, attributes });\r\n\r\n if (wasAnonymous && this.buffer.length > 0) {\r\n this.flushBuffer();\r\n }\r\n }\r\n\r\n setMerchantLanguage(language: string): void {\r\n this.merchantLang = language;\r\n }\r\n\r\n setClientType(clientType: string): void {\r\n this.clientType = clientType;\r\n }\r\n\r\n reset(): void {\r\n this.userId = null;\r\n this.userProps = {};\r\n this.buffer = [];\r\n if (this.bufferTimer) {\r\n clearTimeout(this.bufferTimer);\r\n this.bufferTimer = null;\r\n }\r\n if (this.gaInitialized) {\r\n setGAUserId(null);\r\n }\r\n this.log('Analytics reset');\r\n }\r\n\r\n getUserProfile(): UserProfile {\r\n return {\r\n userId: this.userId ?? undefined,\r\n anonymousId: this.clientId,\r\n attributes: this.userProps,\r\n };\r\n }\r\n\r\n getSessionId(): string {\r\n return this.sessionManager.getSessionId();\r\n }\r\n\r\n getClientId(): string {\r\n return this.clientId;\r\n }\r\n\r\n flush(): void {\r\n this.flushBuffer();\r\n }\r\n\r\n private log(...args: unknown[]): void {\r\n if (this.config.debug) {\r\n console.log('[Analytics]', ...args);\r\n }\r\n }\r\n\r\n private getOrCreateClientId(): string {\r\n if (!isBrowser()) return generateUUID();\r\n\r\n let clientId = safeLocalStorageGet(STORAGE_KEYS.CLIENT_ID);\r\n if (!clientId) {\r\n clientId = generateUUID();\r\n safeLocalStorageSet(STORAGE_KEYS.CLIENT_ID, clientId);\r\n }\r\n return clientId;\r\n }\r\n\r\n private resolveApiKey(): string {\r\n if (this.config.apiKey) return this.config.apiKey;\r\n\r\n if (this.config.env) {\r\n const key = API_KEY_MAP[this.config.env];\r\n if (key) return key;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private isKeyEvent(eventName: string): boolean {\r\n if (!this.config.keyEvents || this.config.keyEvents.length === 0) return false;\r\n return this.config.keyEvents.includes(eventName);\r\n }\r\n\r\n private generateBatchPageId(): string {\r\n return `${getTimestamp().toString(36)}-${generateId().split('-')[1] || Math.random().toString(36).slice(2, 9)}`;\r\n }\r\n\r\n private generateBatchOrderingId(): string {\r\n globalBatchCounter += 1;\r\n return `${getTimestamp()}-${globalBatchCounter}`;\r\n }\r\n\r\n private buildEventProperties(properties: Record<string, unknown>): EventProperties {\r\n const defaults: EventProperties = {\r\n system: this.config.system || '',\r\n domain: this.config.domain || '',\r\n scene: '',\r\n action: '',\r\n target_type: '',\r\n target_id: '',\r\n page_url: isBrowser() ? getPageUrl() : '',\r\n };\r\n\r\n const merged: EventProperties = {};\r\n for (const key of Object.keys(defaults)) {\r\n const k = key as keyof EventProperties;\r\n if (defaults[k] !== undefined) {\r\n (merged as Record<string, unknown>)[k] = defaults[k];\r\n }\r\n }\r\n for (const key of Object.keys(properties)) {\r\n (merged as Record<string, unknown>)[key] = properties[key];\r\n }\r\n\r\n return merged;\r\n }\r\n\r\n private scheduleBufferFlush(): void {\r\n if (this.bufferTimer) return;\r\n\r\n this.bufferTimer = setTimeout(() => {\r\n this.flushBuffer();\r\n }, this.config.bufferFlushInterval);\r\n }\r\n\r\n private flushBuffer(): void {\r\n if (this.bufferTimer) {\r\n clearTimeout(this.bufferTimer);\r\n this.bufferTimer = null;\r\n }\r\n\r\n if (this.buffer.length === 0) return;\r\n\r\n const events = this.buffer.splice(0, this.buffer.length);\r\n events.forEach((e, i) => {\r\n e.batch_event_index = i;\r\n });\r\n\r\n this.log(`Flushing ${events.length} events`);\r\n this.sendBatch(events, 0);\r\n }\r\n\r\n private flushKeyEvent(event: EventPayload): void {\r\n this.log('Flushing key event:', event.event_name);\r\n this.sendBatch([event], 0);\r\n }\r\n\r\n private async sendBatch(events: EventPayload[], retryCount: number): Promise<void> {\r\n if (events.length === 0) return;\r\n\r\n const apiKey = this.resolveApiKey();\r\n if (!apiKey) {\r\n this.log('No API key configured, dropping events');\r\n for (const event of events) {\r\n StorageQueue.enqueue(event);\r\n }\r\n return;\r\n }\r\n\r\n const payload = this.buildPayload(events);\r\n\r\n try {\r\n await Sender.send(payload, this.config.serverUrl, apiKey);\r\n this.log(`Batch sent successfully: ${events.length} events`);\r\n } catch (error) {\r\n this.log(`Batch send failed (attempt ${retryCount + 1}/${this.config.maxRetryCount + 1}):`, error);\r\n\r\n if (retryCount < this.config.maxRetryCount) {\r\n const delay = 1000 * Math.pow(2, retryCount);\r\n this.log(`Retrying in ${delay}ms...`);\r\n this.retrying += 1;\r\n setTimeout(() => {\r\n this.retrying -= 1;\r\n this.sendBatch(events, retryCount + 1);\r\n }, delay);\r\n } else {\r\n this.log('Max retries reached, persisting events to localStorage');\r\n for (const event of events) {\r\n StorageQueue.enqueue(event);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private buildPayload(events: EventPayload[]): AnalyticsPayload {\r\n return {\r\n client_id: this.clientId,\r\n user_id: this.userId || '',\r\n session_id: this.sessionManager.getSessionId(),\r\n user_properties: Object.keys(this.userProps).length > 0 ? this.userProps : undefined,\r\n context: collectContext(this.config.appKey || this.config.appId || 'unknown', this.merchantLang, this.clientType),\r\n marketing: collectMarketing(),\r\n events,\r\n };\r\n }\r\n\r\n private recoverFailedEvents(): void {\r\n const failedEvents = StorageQueue.recover();\r\n if (failedEvents.length > 0) {\r\n this.log(`Recovered ${failedEvents.length} failed events from storage`);\r\n\r\n for (const event of failedEvents) {\r\n event.batch_ordering_id = this.generateBatchOrderingId();\r\n event.batch_page_id = this.batchPageId;\r\n event.batch_event_index = 0;\r\n }\r\n\r\n const batchSize = this.config.bufferMaxSize;\r\n for (let i = 0; i < failedEvents.length; i += batchSize) {\r\n const batch = failedEvents.slice(i, i + batchSize);\r\n batch.forEach((e, idx) => {\r\n e.batch_event_index = idx;\r\n });\r\n this.sendBatch(batch, 0);\r\n }\r\n }\r\n }\r\n\r\n private registerBeforeUnload(): void {\r\n if (!isBrowser()) return;\r\n\r\n const handler = (): void => {\r\n if (this.buffer.length === 0) return;\r\n\r\n const events = this.buffer.splice(0, this.buffer.length);\r\n events.forEach((e, i) => {\r\n e.batch_event_index = i;\r\n });\r\n\r\n const apiKey = this.resolveApiKey();\r\n if (!apiKey) return;\r\n\r\n const payload = this.buildPayload(events);\r\n\r\n try {\r\n if (typeof navigator !== 'undefined' && navigator.sendBeacon) {\r\n const url = `${this.config.serverUrl}${this.config.serverUrl.includes('?') ? '&' : '?'}apiKey=${encodeURIComponent(apiKey)}`;\r\n const blob = new Blob([JSON.stringify(payload)], { type: 'application/json' });\r\n const success = navigator.sendBeacon(url, blob);\r\n if (!success) throw new Error('sendBeacon rejected');\r\n } else {\r\n // XHR sync as fallback \u2014 tries to send but doesn't block page unload\r\n try {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open('POST', this.config.serverUrl, false);\r\n xhr.setRequestHeader('Content-Type', 'application/json');\r\n xhr.setRequestHeader('apiKey', apiKey);\r\n xhr.timeout = 2000;\r\n xhr.send(JSON.stringify(payload));\r\n } catch {\r\n // XHR failed during unload\r\n }\r\n }\r\n } catch {\r\n for (const event of events) {\r\n StorageQueue.enqueue(event);\r\n }\r\n }\r\n };\r\n\r\n window.addEventListener('beforeunload', handler);\r\n window.addEventListener('pagehide', handler);\r\n }\r\n\r\n private trackPageView(): void {\r\n if (!isBrowser()) return;\r\n\r\n this.track('page_view', {\r\n action: 'view',\r\n target_type: 'page',\r\n page_url: getPageUrl(),\r\n referrer: document.referrer || '',\r\n });\r\n }\r\n}\r\n\r\nexport function createAnalytics(config: AnalyticsConfig): Analytics {\r\n return new Analytics(config);\r\n}\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
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
|
}
|
package/dist/core/analytics.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/core/analytics.js
CHANGED
|
@@ -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,15 +93,23 @@ 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.
|
|
81
|
-
|
|
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
|
}
|
|
111
|
+
if (this.config.disableServer)
|
|
112
|
+
return;
|
|
89
113
|
const event = {
|
|
90
114
|
event_id: generateUUID(),
|
|
91
115
|
event_name: eventName,
|
|
@@ -118,6 +142,9 @@ export class Analytics {
|
|
|
118
142
|
setGAUserProperties(attributes);
|
|
119
143
|
}
|
|
120
144
|
}
|
|
145
|
+
else if (this.config.ga?.enabled) {
|
|
146
|
+
this.gaPendingIdentify = { userId, attributes };
|
|
147
|
+
}
|
|
121
148
|
this.log('User identified:', { userId, attributes });
|
|
122
149
|
if (wasAnonymous && this.buffer.length > 0) {
|
|
123
150
|
this.flushBuffer();
|
|
@@ -225,12 +252,19 @@ export class Analytics {
|
|
|
225
252
|
}, this.config.bufferFlushInterval);
|
|
226
253
|
}
|
|
227
254
|
flushBuffer() {
|
|
255
|
+
if (this.config.disableServer)
|
|
256
|
+
return;
|
|
228
257
|
if (this.bufferTimer) {
|
|
229
258
|
clearTimeout(this.bufferTimer);
|
|
230
259
|
this.bufferTimer = null;
|
|
231
260
|
}
|
|
232
261
|
if (this.buffer.length === 0)
|
|
233
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
|
+
}
|
|
234
268
|
const events = this.buffer.splice(0, this.buffer.length);
|
|
235
269
|
events.forEach((e, i) => {
|
|
236
270
|
e.batch_event_index = i;
|
|
@@ -239,6 +273,8 @@ export class Analytics {
|
|
|
239
273
|
this.sendBatch(events, 0);
|
|
240
274
|
}
|
|
241
275
|
flushKeyEvent(event) {
|
|
276
|
+
if (this.config.disableServer)
|
|
277
|
+
return;
|
|
242
278
|
this.log('Flushing key event:', event.event_name);
|
|
243
279
|
this.sendBatch([event], 0);
|
|
244
280
|
}
|
|
@@ -267,6 +303,9 @@ export class Analytics {
|
|
|
267
303
|
setTimeout(() => {
|
|
268
304
|
this.retrying -= 1;
|
|
269
305
|
this.sendBatch(events, retryCount + 1);
|
|
306
|
+
if (this.buffer.length > 0) {
|
|
307
|
+
this.scheduleBufferFlush();
|
|
308
|
+
}
|
|
270
309
|
}, delay);
|
|
271
310
|
}
|
|
272
311
|
else {
|
|
@@ -289,6 +328,8 @@ export class Analytics {
|
|
|
289
328
|
};
|
|
290
329
|
}
|
|
291
330
|
recoverFailedEvents() {
|
|
331
|
+
if (this.config.disableServer)
|
|
332
|
+
return;
|
|
292
333
|
const failedEvents = StorageQueue.recover();
|
|
293
334
|
if (failedEvents.length > 0) {
|
|
294
335
|
this.log(`Recovered ${failedEvents.length} failed events from storage`);
|
|
@@ -307,8 +348,19 @@ export class Analytics {
|
|
|
307
348
|
}
|
|
308
349
|
}
|
|
309
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
|
+
}
|
|
310
362
|
registerBeforeUnload() {
|
|
311
|
-
if (!isBrowser())
|
|
363
|
+
if (!isBrowser() || this.config.disableServer)
|
|
312
364
|
return;
|
|
313
365
|
const handler = () => {
|
|
314
366
|
if (this.buffer.length === 0)
|
|
@@ -350,6 +402,7 @@ export class Analytics {
|
|
|
350
402
|
}
|
|
351
403
|
}
|
|
352
404
|
};
|
|
405
|
+
this.unloadHandler = handler;
|
|
353
406
|
window.addEventListener('beforeunload', handler);
|
|
354
407
|
window.addEventListener('pagehide', handler);
|
|
355
408
|
}
|
package/dist/core/auto-track.js
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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,
|
|
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"}
|
package/dist/core/ga-loader.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export function loadGtagScript(measurementId) {
|
|
2
2
|
return new Promise((resolve, reject) => {
|
|
3
|
-
|
|
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
|
-
|
|
21
|
+
// Must be defined BEFORE the script loads so gtag.js finds them on execution
|
|
21
22
|
window.dataLayer = window.dataLayer || [];
|
|
22
|
-
|
|
23
|
-
|
|
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;
|
|
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"}
|
|
@@ -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;
|
|
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"}
|
package/dist/core/storage.js
CHANGED
|
@@ -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
|
|
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 {
|
package/dist/types/index.d.ts
CHANGED
|
@@ -108,6 +108,7 @@ export interface AnalyticsConfig {
|
|
|
108
108
|
autoTrackSelector?: string;
|
|
109
109
|
performance?: PerformanceConfig;
|
|
110
110
|
ga?: GAConfig;
|
|
111
|
+
disableServer?: boolean;
|
|
111
112
|
/** @deprecated use appKey instead */
|
|
112
113
|
appId?: string;
|
|
113
114
|
}
|
|
@@ -157,6 +158,7 @@ export declare const STORAGE_KEYS: {
|
|
|
157
158
|
readonly CLIENT_ID: "__analytics_client_id__";
|
|
158
159
|
readonly LANDING_PAGE: "__analytics_landing_page__";
|
|
159
160
|
readonly REFERRER_URL: "__analytics_referrer_url__";
|
|
161
|
+
readonly UTM_PARAMS: "__analytics_utm_params__";
|
|
160
162
|
};
|
|
161
163
|
export declare const MAX_STORAGE_ITEMS = 500;
|
|
162
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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"}
|
package/dist/types/index.js
CHANGED
|
@@ -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;
|