@macroui/event-tracker 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +343 -0
  3. package/bin/event-tracker-suggest.mjs +141 -0
  4. package/bin/event-tracker.mjs +157 -0
  5. package/dist/event-tracker.cjs +3449 -0
  6. package/dist/event-tracker.js +3455 -0
  7. package/dist/event-tracker.min.js +1 -0
  8. package/dist/event-tracker.mjs +3402 -0
  9. package/dist/plugin/auto-track.cjs +201 -0
  10. package/dist/plugin/auto-track.mjs +199 -0
  11. package/dist/plugin/debug-sender.cjs +214 -0
  12. package/dist/plugin/debug-sender.mjs +211 -0
  13. package/dist/plugin/encrypt.cjs +284 -0
  14. package/dist/plugin/encrypt.mjs +275 -0
  15. package/dist/plugin/exposure.cjs +121 -0
  16. package/dist/plugin/exposure.mjs +119 -0
  17. package/dist/plugin/indexeddb-sender.cjs +94 -0
  18. package/dist/plugin/indexeddb-sender.mjs +92 -0
  19. package/dist/plugin/pageleave.cjs +74 -0
  20. package/dist/plugin/pageleave.mjs +72 -0
  21. package/dist/plugin/pageload.cjs +198 -0
  22. package/dist/plugin/pageload.mjs +196 -0
  23. package/dist/plugin/session-event.cjs +142 -0
  24. package/dist/plugin/session-event.mjs +140 -0
  25. package/dist/plugin/webview-bridge.cjs +111 -0
  26. package/dist/plugin/webview-bridge.mjs +109 -0
  27. package/dist/types/core/env.d.ts +10 -0
  28. package/dist/types/core/errors.d.ts +76 -0
  29. package/dist/types/core/failed-queue.d.ts +24 -0
  30. package/dist/types/core/identity-api.d.ts +6 -0
  31. package/dist/types/core/identity.d.ts +39 -0
  32. package/dist/types/core/instance-channel.d.ts +34 -0
  33. package/dist/types/core/lifecycle.d.ts +26 -0
  34. package/dist/types/core/logger.d.ts +13 -0
  35. package/dist/types/core/plugin.d.ts +60 -0
  36. package/dist/types/core/profile-api.d.ts +6 -0
  37. package/dist/types/core/profile-store.d.ts +23 -0
  38. package/dist/types/core/register-api.d.ts +22 -0
  39. package/dist/types/core/retry-policy.d.ts +33 -0
  40. package/dist/types/core/send-pipeline.d.ts +55 -0
  41. package/dist/types/core/signed-identity.d.ts +29 -0
  42. package/dist/types/core/stage.d.ts +48 -0
  43. package/dist/types/core/track-api.d.ts +6 -0
  44. package/dist/types/core/tracker.d.ts +130 -0
  45. package/dist/types/core/uuid.d.ts +4 -0
  46. package/dist/types/index.d.ts +40 -0
  47. package/dist/types/plugins/auto-track/index.d.ts +21 -0
  48. package/dist/types/plugins/debug-sender/index.d.ts +24 -0
  49. package/dist/types/plugins/encrypt/index.d.ts +56 -0
  50. package/dist/types/plugins/exposure/index.d.ts +18 -0
  51. package/dist/types/plugins/indexeddb-sender/index.d.ts +15 -0
  52. package/dist/types/plugins/pageleave/index.d.ts +12 -0
  53. package/dist/types/plugins/pageload/index.d.ts +14 -0
  54. package/dist/types/plugins/session-event/index.d.ts +14 -0
  55. package/dist/types/plugins/webview-bridge/index.d.ts +33 -0
  56. package/dist/types/presets/preset-properties.d.ts +25 -0
  57. package/dist/types/send/ajax-sender.d.ts +11 -0
  58. package/dist/types/send/batch-sender.d.ts +17 -0
  59. package/dist/types/send/beacon-sender.d.ts +10 -0
  60. package/dist/types/send/encode.d.ts +8 -0
  61. package/dist/types/send/image-sender.d.ts +10 -0
  62. package/dist/types/send/sender.d.ts +20 -0
  63. package/dist/types/storage/indexeddb-store.d.ts +14 -0
  64. package/dist/types/storage/store.d.ts +56 -0
  65. package/dist/types/types/common.d.ts +26 -0
  66. package/dist/types/types/config.d.ts +117 -0
  67. package/dist/types/types/constants.d.ts +110 -0
  68. package/dist/types/types/index.d.ts +25 -0
  69. package/dist/types/types.test-d.d.ts +5 -0
  70. package/dist/types.test-d.ts +103 -0
  71. package/package.json +218 -0
@@ -0,0 +1,92 @@
1
+ /**
2
+ * 浏览器端辅助方法
3
+ */
4
+ function isBrowser() {
5
+ return typeof window !== 'undefined' && typeof window.document !== 'undefined';
6
+ }
7
+
8
+ /**
9
+ * 序列化 & 编码
10
+ */
11
+ function encodeEvent(event, encryptor) {
12
+ var json = JSON.stringify(event);
13
+ return json;
14
+ }
15
+
16
+ /**
17
+ * indexeddb-sender 插件:把事件写到 IndexedDB(用于离线缓存 / 批量消费)
18
+ * - 不实际发送,只把序列化事件追加到指定 IDB store
19
+ * - 适合后续被 webview bridge / native / service worker 消费
20
+ */
21
+ function indexedDBSender(opts) {
22
+ if (opts === void 0) { opts = {}; }
23
+ var dbName = opts.dbName || 'event-tracker-outbox';
24
+ var storeName = opts.storeName || 'outbox';
25
+ var max = opts.max || 500;
26
+ var dbPromise = null;
27
+ function openDB() {
28
+ if (!isBrowser() || typeof indexedDB === 'undefined')
29
+ return Promise.resolve(null);
30
+ return new Promise(function (resolve) {
31
+ try {
32
+ var req_1 = indexedDB.open(dbName, 1);
33
+ req_1.onupgradeneeded = function () {
34
+ var db = req_1.result;
35
+ if (!db.objectStoreNames.contains(storeName)) {
36
+ db.createObjectStore(storeName, { autoIncrement: true });
37
+ }
38
+ };
39
+ req_1.onsuccess = function () { return resolve(req_1.result); };
40
+ req_1.onerror = function () { return resolve(null); };
41
+ }
42
+ catch (_a) {
43
+ resolve(null);
44
+ }
45
+ });
46
+ }
47
+ var interceptor = {
48
+ name: 'indexeddb-sender',
49
+ priority: 60,
50
+ entry: function (ctx) {
51
+ if (ctx.meta.stage !== 'sendDataStage')
52
+ return;
53
+ var ev = ctx.data;
54
+ dbPromise !== null && dbPromise !== void 0 ? dbPromise : (dbPromise = openDB());
55
+ dbPromise.then(function (db) {
56
+ if (!db)
57
+ return;
58
+ try {
59
+ var tx = db.transaction(storeName, 'readwrite');
60
+ var store_1 = tx.objectStore(storeName);
61
+ var payload_1 = encodeEvent(ev);
62
+ // 限制大小:> max 则删头
63
+ var cntReq_1 = store_1.count();
64
+ cntReq_1.onsuccess = function () {
65
+ if (cntReq_1.result >= max) {
66
+ store_1.delete(IDBKeyRange.lowerBound(0, true));
67
+ }
68
+ store_1.add({ time: Date.now(), payload: payload_1 });
69
+ };
70
+ }
71
+ catch (_a) {
72
+ /* ignore */
73
+ }
74
+ }).catch(function () { });
75
+ return ev;
76
+ },
77
+ };
78
+ return {
79
+ name: 'indexeddb-sender',
80
+ install: function (_a) {
81
+ var stages = _a.stages;
82
+ if (!isBrowser())
83
+ return;
84
+ stages.sendDataStage.register(interceptor);
85
+ },
86
+ uninstall: function () {
87
+ dbPromise = null;
88
+ },
89
+ };
90
+ }
91
+
92
+ export { indexedDBSender };
@@ -0,0 +1,74 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * 浏览器端辅助方法
5
+ */
6
+ function isBrowser() {
7
+ return typeof window !== 'undefined' && typeof window.document !== 'undefined';
8
+ }
9
+
10
+ /**
11
+ * SDK 预置事件名与预置属性 key(v1.1:完整对齐神策)
12
+ * 命名风格对齐神策,方便跨平台对接
13
+ */
14
+ /** 预置事件名 */
15
+ var PresetEvent = {
16
+ WebPageLeave: '$WebPageLeave'};
17
+ /** 预置属性 key */
18
+ var PresetProperty = {
19
+ URLPath: '$url_path',
20
+ Title: '$title',
21
+ EventDuration: '$event_duration',
22
+ ViewportPosition: '$viewport_position'};
23
+
24
+ /**
25
+ * pageleave 插件:用户离开页面(关闭、跳转、切到后台)时上报
26
+ * - $WebPageLeave 事件
27
+ * - 包含 $event_duration / $url_path / $referrer / $viewport_position
28
+ * - 包含 page_visible 标记(visibilitychange API)
29
+ */
30
+ function pageLeave(_opts) {
31
+ var sdkRef = null;
32
+ var enterTime = Date.now();
33
+ function fire(reason) {
34
+ var _a;
35
+ if (!sdkRef)
36
+ return;
37
+ var dur = Date.now() - enterTime;
38
+ sdkRef.track(PresetEvent.WebPageLeave, (_a = {},
39
+ _a[PresetProperty.EventDuration] = dur,
40
+ _a[PresetProperty.URLPath] = location.pathname + location.search + location.hash,
41
+ _a[PresetProperty.Title] = document.title,
42
+ _a[PresetProperty.ViewportPosition] = window.scrollY || 0,
43
+ _a.$page_leave_reason = reason,
44
+ _a));
45
+ }
46
+ return {
47
+ name: 'pageleave',
48
+ install: function (_a) {
49
+ var sdk = _a.sdk;
50
+ if (!isBrowser())
51
+ return;
52
+ sdkRef = sdk;
53
+ enterTime = Date.now();
54
+ // 重新进入页面时刷新 enterTime
55
+ var onVisible = function () {
56
+ if (document.visibilityState === 'visible')
57
+ enterTime = Date.now();
58
+ };
59
+ document.addEventListener('visibilitychange', onVisible);
60
+ // 关闭/离开
61
+ window.addEventListener('pagehide', function () { return fire('pagehide'); });
62
+ window.addEventListener('beforeunload', function () { return fire('unload'); });
63
+ document.addEventListener('visibilitychange', function () {
64
+ if (document.visibilityState === 'hidden')
65
+ fire('hidden');
66
+ });
67
+ },
68
+ uninstall: function () {
69
+ sdkRef = null;
70
+ },
71
+ };
72
+ }
73
+
74
+ exports.pageLeave = pageLeave;
@@ -0,0 +1,72 @@
1
+ /**
2
+ * 浏览器端辅助方法
3
+ */
4
+ function isBrowser() {
5
+ return typeof window !== 'undefined' && typeof window.document !== 'undefined';
6
+ }
7
+
8
+ /**
9
+ * SDK 预置事件名与预置属性 key(v1.1:完整对齐神策)
10
+ * 命名风格对齐神策,方便跨平台对接
11
+ */
12
+ /** 预置事件名 */
13
+ var PresetEvent = {
14
+ WebPageLeave: '$WebPageLeave'};
15
+ /** 预置属性 key */
16
+ var PresetProperty = {
17
+ URLPath: '$url_path',
18
+ Title: '$title',
19
+ EventDuration: '$event_duration',
20
+ ViewportPosition: '$viewport_position'};
21
+
22
+ /**
23
+ * pageleave 插件:用户离开页面(关闭、跳转、切到后台)时上报
24
+ * - $WebPageLeave 事件
25
+ * - 包含 $event_duration / $url_path / $referrer / $viewport_position
26
+ * - 包含 page_visible 标记(visibilitychange API)
27
+ */
28
+ function pageLeave(_opts) {
29
+ var sdkRef = null;
30
+ var enterTime = Date.now();
31
+ function fire(reason) {
32
+ var _a;
33
+ if (!sdkRef)
34
+ return;
35
+ var dur = Date.now() - enterTime;
36
+ sdkRef.track(PresetEvent.WebPageLeave, (_a = {},
37
+ _a[PresetProperty.EventDuration] = dur,
38
+ _a[PresetProperty.URLPath] = location.pathname + location.search + location.hash,
39
+ _a[PresetProperty.Title] = document.title,
40
+ _a[PresetProperty.ViewportPosition] = window.scrollY || 0,
41
+ _a.$page_leave_reason = reason,
42
+ _a));
43
+ }
44
+ return {
45
+ name: 'pageleave',
46
+ install: function (_a) {
47
+ var sdk = _a.sdk;
48
+ if (!isBrowser())
49
+ return;
50
+ sdkRef = sdk;
51
+ enterTime = Date.now();
52
+ // 重新进入页面时刷新 enterTime
53
+ var onVisible = function () {
54
+ if (document.visibilityState === 'visible')
55
+ enterTime = Date.now();
56
+ };
57
+ document.addEventListener('visibilitychange', onVisible);
58
+ // 关闭/离开
59
+ window.addEventListener('pagehide', function () { return fire('pagehide'); });
60
+ window.addEventListener('beforeunload', function () { return fire('unload'); });
61
+ document.addEventListener('visibilitychange', function () {
62
+ if (document.visibilityState === 'hidden')
63
+ fire('hidden');
64
+ });
65
+ },
66
+ uninstall: function () {
67
+ sdkRef = null;
68
+ },
69
+ };
70
+ }
71
+
72
+ export { pageLeave };
@@ -0,0 +1,198 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * 浏览器端辅助方法
5
+ */
6
+ function isBrowser() {
7
+ return typeof window !== 'undefined' && typeof window.document !== 'undefined';
8
+ }
9
+
10
+ /**
11
+ * SDK 预置事件名与预置属性 key(v1.1:完整对齐神策)
12
+ * 命名风格对齐神策,方便跨平台对接
13
+ */
14
+ /** 预置事件名 */
15
+ var PresetEvent = {
16
+ WebPageLoad: '$WebPageLoad'};
17
+ /** 预置属性 key */
18
+ var PresetProperty = {
19
+ // 设备 / 环境
20
+ AppId: '$app_id',
21
+ AppVersion: '$app_version',
22
+ Lib: '$lib',
23
+ LibMethod: '$lib_method',
24
+ LibDetail: '$lib_detail',
25
+ LibVersion: '$lib_version',
26
+ ScreenWidth: '$screen_width',
27
+ ScreenHeight: '$screen_height',
28
+ ViewportWidth: '$viewport_width',
29
+ ViewportHeight: '$viewport_height',
30
+ TimezoneOffset: '$timezone_offset',
31
+ UserAgent: '$user_agent',
32
+ Language: '$language',
33
+ FirstBrowserCharset: '$first_browser_charset',
34
+ FirstBrowserLanguage: '$first_browser_language',
35
+ // 位置 / 流量来源
36
+ URL: '$url',
37
+ URLPath: '$url_path',
38
+ Title: '$title',
39
+ Referrer: '$referrer',
40
+ ReferrerHost: '$referrer_host',
41
+ LatestReferrer: '$latest_referrer',
42
+ LatestReferrerHost: '$latest_referrer_host',
43
+ LatestLandingPage: '$latest_landing_page',
44
+ LatestSearchKeyword: '$latest_search_keyword',
45
+ LatestTrafficSourceType: '$latest_traffic_source_type',
46
+ FirstReferrer: '$first_referrer',
47
+ FirstReferrerHost: '$first_referrer_host',
48
+ FirstSearchKeyword: '$first_search_keyword',
49
+ FirstTrafficSourceType: '$first_traffic_source_type',
50
+ FirstVisitTime: '$first_visit_time',
51
+ SearchKeywordId: '$search_keyword_id',
52
+ SearchKeywordIdHash: '$search_keyword_id_hash',
53
+ SearchKeywordIdType: '$search_keyword_id_type',
54
+ IsFirstDay: '$is_first_day',
55
+ IsFirstTime: '$is_first_time',
56
+ // UTM
57
+ LatestUtmSource: '$latest_utm_source',
58
+ LatestUtmMedium: '$latest_utm_medium',
59
+ LatestUtmCampaign: '$latest_utm_campaign',
60
+ LatestUtmContent: '$latest_utm_content',
61
+ LatestUtmTerm: '$latest_utm_term',
62
+ Utms: '$utms',
63
+ // 身份
64
+ DistinctId: '$distinct_id',
65
+ AnonymousId: '$anonymous_id',
66
+ FirstId: '$first_id',
67
+ OriginalId: '$original_id',
68
+ LoginId: '$login_id',
69
+ IsLoginId: '$is_login_id',
70
+ IdentityLoginId: '$identity_login_id',
71
+ IdentityAnonymousId: '$identity_anonymous_id',
72
+ IdentityCookieId: '$identity_cookie_id',
73
+ IdentityEmail: '$identity_email',
74
+ IdentityMobile: '$identity_mobile',
75
+ // 全埋点元素属性
76
+ ElementSelector: '$element_selector',
77
+ ElementPath: '$element_path',
78
+ ElementType: '$element_type',
79
+ ElementId: '$element_id',
80
+ ElementClassName: '$element_class_name',
81
+ ElementName: '$element_name',
82
+ ElementContent: '$element_content',
83
+ ElementTargetUrl: '$element_target_url',
84
+ ElementPosition: '$element_position',
85
+ PageX: '$page_x',
86
+ PageY: '$page_y',
87
+ // 性能
88
+ PageHeight: '$page_height',
89
+ PageResourceSize: '$page_resource_size',
90
+ EventDuration: '$event_duration',
91
+ ViewportPosition: '$viewport_position',
92
+ // 渠道
93
+ LatestWxAdClickId: '$latest_wx_ad_click_id',
94
+ LatestWxAdCallbacks: '$latest_wx_ad_callbacks',
95
+ LatestWxAdHashKey: '$latest_wx_ad_hash_key',
96
+ IsChannelCallbackEvent: '$is_channel_callback_event',
97
+ // 会话
98
+ EventSessionId: '$event_session_id',
99
+ // 元信息
100
+ Time: '$time',
101
+ Event: '$event',
102
+ Option: '$option',
103
+ Project: '$project',
104
+ Token: '$token',
105
+ // 特殊
106
+ SignupMethod: '$signup_method',
107
+ };
108
+
109
+ /**
110
+ * pageload 插件:performance API 采集首屏加载性能
111
+ * - $WebPageLoad 事件,包含:
112
+ * $load_time / $dom_ready_time / $dom_interactive_time / $response_time
113
+ * $page_resource_size / $page_height / $viewport_position
114
+ */
115
+ function pageLoad(opts) {
116
+ if (opts === void 0) { opts = {}; }
117
+ var sdkRef = null;
118
+ function fire() {
119
+ var _a;
120
+ if (!sdkRef)
121
+ return;
122
+ var props = (_a = {},
123
+ _a[PresetProperty.URLPath] = location.pathname + location.search + location.hash,
124
+ _a[PresetProperty.Title] = document.title,
125
+ _a);
126
+ // 尝试 performance API
127
+ try {
128
+ var perf = (typeof performance !== 'undefined' ? performance : null);
129
+ if (perf) {
130
+ var nav = perf.getEntriesByType('navigation')[0];
131
+ if (nav) {
132
+ if (typeof nav.domContentLoadedEventEnd === 'number') {
133
+ props['$dom_ready_time'] = Math.round(nav.domContentLoadedEventEnd - nav.startTime);
134
+ }
135
+ if (typeof nav.domInteractive === 'number') {
136
+ props['$dom_interactive_time'] = Math.round(nav.domInteractive - nav.startTime);
137
+ }
138
+ if (typeof nav.loadEventEnd === 'number' && typeof nav.startTime === 'number') {
139
+ props['$load_time'] = Math.round(nav.loadEventEnd - nav.startTime);
140
+ }
141
+ if (typeof nav.responseEnd === 'number' && typeof nav.requestStart === 'number') {
142
+ props['$response_time'] = Math.round(nav.responseEnd - nav.requestStart);
143
+ }
144
+ if (typeof nav.transferSize === 'number') {
145
+ props[PresetProperty.PageResourceSize] = nav.transferSize;
146
+ }
147
+ }
148
+ // paint
149
+ var fp = perf.getEntriesByName('first-paint')[0];
150
+ var fcp = perf.getEntriesByName('first-contentful-paint')[0];
151
+ if (fp)
152
+ props['$first_paint'] = Math.round(fp.startTime);
153
+ if (fcp)
154
+ props['$first_contentful_paint'] = Math.round(fcp.startTime);
155
+ }
156
+ }
157
+ catch (_b) {
158
+ /* ignore */
159
+ }
160
+ // 页面尺寸
161
+ try {
162
+ if (document.documentElement) {
163
+ props[PresetProperty.PageHeight] = document.documentElement.scrollHeight;
164
+ props[PresetProperty.ViewportPosition] = window.scrollY || 0;
165
+ }
166
+ }
167
+ catch (_c) {
168
+ /* ignore */
169
+ }
170
+ sdkRef.track(PresetEvent.WebPageLoad, props);
171
+ }
172
+ return {
173
+ name: 'pageload',
174
+ install: function (_a) {
175
+ var sdk = _a.sdk;
176
+ if (!isBrowser())
177
+ return;
178
+ sdkRef = sdk;
179
+ var fireNow = opts.immediate !== false;
180
+ if (document.readyState === 'complete') {
181
+ if (fireNow)
182
+ fire();
183
+ else
184
+ window.addEventListener('load', fire, { once: true });
185
+ }
186
+ else {
187
+ window.addEventListener('load', function () {
188
+ if (fireNow)
189
+ fire();
190
+ else
191
+ setTimeout(fire, 0);
192
+ }, { once: true });
193
+ }
194
+ },
195
+ };
196
+ }
197
+
198
+ exports.pageLoad = pageLoad;
@@ -0,0 +1,196 @@
1
+ /**
2
+ * 浏览器端辅助方法
3
+ */
4
+ function isBrowser() {
5
+ return typeof window !== 'undefined' && typeof window.document !== 'undefined';
6
+ }
7
+
8
+ /**
9
+ * SDK 预置事件名与预置属性 key(v1.1:完整对齐神策)
10
+ * 命名风格对齐神策,方便跨平台对接
11
+ */
12
+ /** 预置事件名 */
13
+ var PresetEvent = {
14
+ WebPageLoad: '$WebPageLoad'};
15
+ /** 预置属性 key */
16
+ var PresetProperty = {
17
+ // 设备 / 环境
18
+ AppId: '$app_id',
19
+ AppVersion: '$app_version',
20
+ Lib: '$lib',
21
+ LibMethod: '$lib_method',
22
+ LibDetail: '$lib_detail',
23
+ LibVersion: '$lib_version',
24
+ ScreenWidth: '$screen_width',
25
+ ScreenHeight: '$screen_height',
26
+ ViewportWidth: '$viewport_width',
27
+ ViewportHeight: '$viewport_height',
28
+ TimezoneOffset: '$timezone_offset',
29
+ UserAgent: '$user_agent',
30
+ Language: '$language',
31
+ FirstBrowserCharset: '$first_browser_charset',
32
+ FirstBrowserLanguage: '$first_browser_language',
33
+ // 位置 / 流量来源
34
+ URL: '$url',
35
+ URLPath: '$url_path',
36
+ Title: '$title',
37
+ Referrer: '$referrer',
38
+ ReferrerHost: '$referrer_host',
39
+ LatestReferrer: '$latest_referrer',
40
+ LatestReferrerHost: '$latest_referrer_host',
41
+ LatestLandingPage: '$latest_landing_page',
42
+ LatestSearchKeyword: '$latest_search_keyword',
43
+ LatestTrafficSourceType: '$latest_traffic_source_type',
44
+ FirstReferrer: '$first_referrer',
45
+ FirstReferrerHost: '$first_referrer_host',
46
+ FirstSearchKeyword: '$first_search_keyword',
47
+ FirstTrafficSourceType: '$first_traffic_source_type',
48
+ FirstVisitTime: '$first_visit_time',
49
+ SearchKeywordId: '$search_keyword_id',
50
+ SearchKeywordIdHash: '$search_keyword_id_hash',
51
+ SearchKeywordIdType: '$search_keyword_id_type',
52
+ IsFirstDay: '$is_first_day',
53
+ IsFirstTime: '$is_first_time',
54
+ // UTM
55
+ LatestUtmSource: '$latest_utm_source',
56
+ LatestUtmMedium: '$latest_utm_medium',
57
+ LatestUtmCampaign: '$latest_utm_campaign',
58
+ LatestUtmContent: '$latest_utm_content',
59
+ LatestUtmTerm: '$latest_utm_term',
60
+ Utms: '$utms',
61
+ // 身份
62
+ DistinctId: '$distinct_id',
63
+ AnonymousId: '$anonymous_id',
64
+ FirstId: '$first_id',
65
+ OriginalId: '$original_id',
66
+ LoginId: '$login_id',
67
+ IsLoginId: '$is_login_id',
68
+ IdentityLoginId: '$identity_login_id',
69
+ IdentityAnonymousId: '$identity_anonymous_id',
70
+ IdentityCookieId: '$identity_cookie_id',
71
+ IdentityEmail: '$identity_email',
72
+ IdentityMobile: '$identity_mobile',
73
+ // 全埋点元素属性
74
+ ElementSelector: '$element_selector',
75
+ ElementPath: '$element_path',
76
+ ElementType: '$element_type',
77
+ ElementId: '$element_id',
78
+ ElementClassName: '$element_class_name',
79
+ ElementName: '$element_name',
80
+ ElementContent: '$element_content',
81
+ ElementTargetUrl: '$element_target_url',
82
+ ElementPosition: '$element_position',
83
+ PageX: '$page_x',
84
+ PageY: '$page_y',
85
+ // 性能
86
+ PageHeight: '$page_height',
87
+ PageResourceSize: '$page_resource_size',
88
+ EventDuration: '$event_duration',
89
+ ViewportPosition: '$viewport_position',
90
+ // 渠道
91
+ LatestWxAdClickId: '$latest_wx_ad_click_id',
92
+ LatestWxAdCallbacks: '$latest_wx_ad_callbacks',
93
+ LatestWxAdHashKey: '$latest_wx_ad_hash_key',
94
+ IsChannelCallbackEvent: '$is_channel_callback_event',
95
+ // 会话
96
+ EventSessionId: '$event_session_id',
97
+ // 元信息
98
+ Time: '$time',
99
+ Event: '$event',
100
+ Option: '$option',
101
+ Project: '$project',
102
+ Token: '$token',
103
+ // 特殊
104
+ SignupMethod: '$signup_method',
105
+ };
106
+
107
+ /**
108
+ * pageload 插件:performance API 采集首屏加载性能
109
+ * - $WebPageLoad 事件,包含:
110
+ * $load_time / $dom_ready_time / $dom_interactive_time / $response_time
111
+ * $page_resource_size / $page_height / $viewport_position
112
+ */
113
+ function pageLoad(opts) {
114
+ if (opts === void 0) { opts = {}; }
115
+ var sdkRef = null;
116
+ function fire() {
117
+ var _a;
118
+ if (!sdkRef)
119
+ return;
120
+ var props = (_a = {},
121
+ _a[PresetProperty.URLPath] = location.pathname + location.search + location.hash,
122
+ _a[PresetProperty.Title] = document.title,
123
+ _a);
124
+ // 尝试 performance API
125
+ try {
126
+ var perf = (typeof performance !== 'undefined' ? performance : null);
127
+ if (perf) {
128
+ var nav = perf.getEntriesByType('navigation')[0];
129
+ if (nav) {
130
+ if (typeof nav.domContentLoadedEventEnd === 'number') {
131
+ props['$dom_ready_time'] = Math.round(nav.domContentLoadedEventEnd - nav.startTime);
132
+ }
133
+ if (typeof nav.domInteractive === 'number') {
134
+ props['$dom_interactive_time'] = Math.round(nav.domInteractive - nav.startTime);
135
+ }
136
+ if (typeof nav.loadEventEnd === 'number' && typeof nav.startTime === 'number') {
137
+ props['$load_time'] = Math.round(nav.loadEventEnd - nav.startTime);
138
+ }
139
+ if (typeof nav.responseEnd === 'number' && typeof nav.requestStart === 'number') {
140
+ props['$response_time'] = Math.round(nav.responseEnd - nav.requestStart);
141
+ }
142
+ if (typeof nav.transferSize === 'number') {
143
+ props[PresetProperty.PageResourceSize] = nav.transferSize;
144
+ }
145
+ }
146
+ // paint
147
+ var fp = perf.getEntriesByName('first-paint')[0];
148
+ var fcp = perf.getEntriesByName('first-contentful-paint')[0];
149
+ if (fp)
150
+ props['$first_paint'] = Math.round(fp.startTime);
151
+ if (fcp)
152
+ props['$first_contentful_paint'] = Math.round(fcp.startTime);
153
+ }
154
+ }
155
+ catch (_b) {
156
+ /* ignore */
157
+ }
158
+ // 页面尺寸
159
+ try {
160
+ if (document.documentElement) {
161
+ props[PresetProperty.PageHeight] = document.documentElement.scrollHeight;
162
+ props[PresetProperty.ViewportPosition] = window.scrollY || 0;
163
+ }
164
+ }
165
+ catch (_c) {
166
+ /* ignore */
167
+ }
168
+ sdkRef.track(PresetEvent.WebPageLoad, props);
169
+ }
170
+ return {
171
+ name: 'pageload',
172
+ install: function (_a) {
173
+ var sdk = _a.sdk;
174
+ if (!isBrowser())
175
+ return;
176
+ sdkRef = sdk;
177
+ var fireNow = opts.immediate !== false;
178
+ if (document.readyState === 'complete') {
179
+ if (fireNow)
180
+ fire();
181
+ else
182
+ window.addEventListener('load', fire, { once: true });
183
+ }
184
+ else {
185
+ window.addEventListener('load', function () {
186
+ if (fireNow)
187
+ fire();
188
+ else
189
+ setTimeout(fire, 0);
190
+ }, { once: true });
191
+ }
192
+ },
193
+ };
194
+ }
195
+
196
+ export { pageLoad };