monitor-track 1.10.0 → 1.10.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.
Files changed (65) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/{dist/cjs → cjs}/index.js +1 -1
  3. package/esm/package.json.js +3 -0
  4. package/{dist/index.js → index.js} +1 -1
  5. package/package.json +2 -2
  6. package/dist/CHANGELOG.md +0 -21
  7. package/dist/README.md +0 -101
  8. package/dist/esm/package.json.js +0 -3
  9. package/dist/package.json +0 -41
  10. package/rollup.config.js +0 -66
  11. package/scripts/cp.js +0 -11
  12. package/src/config/global.ts +0 -309
  13. package/src/config/index.ts +0 -53
  14. package/src/constant.ts +0 -2
  15. package/src/handlers/error.ts +0 -187
  16. package/src/handlers/index.ts +0 -3
  17. package/src/handlers/pv.ts +0 -124
  18. package/src/handlers/user-activity.ts +0 -69
  19. package/src/index.ts +0 -127
  20. package/src/main.ts +0 -8
  21. package/src/reporter.ts +0 -372
  22. package/src/types/config.ts +0 -58
  23. package/src/types/global.ts +0 -73
  24. package/src/types/index.ts +0 -227
  25. package/src/typing.d.ts +0 -15
  26. package/src/utils/index.ts +0 -371
  27. package/tsconfig.esm.json +0 -14
  28. /package/{dist/cjs → cjs}/config/global.d.ts +0 -0
  29. /package/{dist/cjs → cjs}/config/index.d.ts +0 -0
  30. /package/{dist/cjs → cjs}/constant.d.ts +0 -0
  31. /package/{dist/cjs → cjs}/handlers/error.d.ts +0 -0
  32. /package/{dist/cjs → cjs}/handlers/index.d.ts +0 -0
  33. /package/{dist/cjs → cjs}/handlers/pv.d.ts +0 -0
  34. /package/{dist/cjs → cjs}/handlers/user-activity.d.ts +0 -0
  35. /package/{dist/cjs → cjs}/index.d.ts +0 -0
  36. /package/{dist/cjs → cjs}/main.d.ts +0 -0
  37. /package/{dist/cjs → cjs}/reporter.d.ts +0 -0
  38. /package/{dist/cjs → cjs}/types/config.d.ts +0 -0
  39. /package/{dist/cjs → cjs}/types/global.d.ts +0 -0
  40. /package/{dist/cjs → cjs}/types/index.d.ts +0 -0
  41. /package/{dist/cjs → cjs}/utils/index.d.ts +0 -0
  42. /package/{dist/esm → esm}/_virtual/_tslib.js +0 -0
  43. /package/{dist/esm → esm}/config/global.d.ts +0 -0
  44. /package/{dist/esm → esm}/config/global.js +0 -0
  45. /package/{dist/esm → esm}/config/index.d.ts +0 -0
  46. /package/{dist/esm → esm}/config/index.js +0 -0
  47. /package/{dist/esm → esm}/constant.d.ts +0 -0
  48. /package/{dist/esm → esm}/constant.js +0 -0
  49. /package/{dist/esm → esm}/handlers/error.d.ts +0 -0
  50. /package/{dist/esm → esm}/handlers/error.js +0 -0
  51. /package/{dist/esm → esm}/handlers/index.d.ts +0 -0
  52. /package/{dist/esm → esm}/handlers/pv.d.ts +0 -0
  53. /package/{dist/esm → esm}/handlers/pv.js +0 -0
  54. /package/{dist/esm → esm}/handlers/user-activity.d.ts +0 -0
  55. /package/{dist/esm → esm}/handlers/user-activity.js +0 -0
  56. /package/{dist/esm → esm}/index.d.ts +0 -0
  57. /package/{dist/esm → esm}/index.js +0 -0
  58. /package/{dist/esm → esm}/main.d.ts +0 -0
  59. /package/{dist/esm → esm}/reporter.d.ts +0 -0
  60. /package/{dist/esm → esm}/reporter.js +0 -0
  61. /package/{dist/esm → esm}/types/config.d.ts +0 -0
  62. /package/{dist/esm → esm}/types/global.d.ts +0 -0
  63. /package/{dist/esm → esm}/types/index.d.ts +0 -0
  64. /package/{dist/esm → esm}/utils/index.d.ts +0 -0
  65. /package/{dist/esm → esm}/utils/index.js +0 -0
@@ -1,227 +0,0 @@
1
- /**
2
- * @description 浏览器信息
3
- */
4
- export interface INavigator {
5
- /** language */
6
- language: string;
7
- /** vendor, 浏览器厂商 */
8
- navigatorVendor: string;
9
- /** 网络连接类型 */
10
- connectionType: '2g' | '3g' | '4g';
11
- /** 浏览器名称 */
12
- browserName: string;
13
- /** 浏览器版本 */
14
- browserVersion: string;
15
- /** 浏览器引擎名称 */
16
- engineName: string;
17
- /** 浏览器引擎版本 */
18
- engineVersion: string;
19
- /** 操作系统名称 */
20
- osName: string;
21
- /** 操作系统版本 */
22
- osVersion: string;
23
- }
24
-
25
- // /**
26
- // * @description 上报数据类型及对应结构
27
- // */
28
- // interface IReportDataMap {
29
- // pv: IReport;
30
- // error: IReportError;
31
- // userActivity: IReportUserActivity;
32
- // }
33
-
34
- // /**
35
- // * @description 错误信息
36
- // */
37
- // type IReportError = IReport & IErrorInfo;
38
-
39
- // /**
40
- // * @description 用户行为信息
41
- // */
42
- // type IReportUserActivity = IReport & IUserActivity;
43
-
44
- /**
45
- * @description pv类接口
46
- */
47
- export interface IPv {
48
- /** 停留时间 */
49
- stayTime: number;
50
- }
51
-
52
- /**
53
- * @description 错误子类型
54
- */
55
- export type IErrorSubType = 'resource' | 'js' | 'async' | 'manual';
56
-
57
- /**
58
- * @description stackFrame类型
59
- */
60
- export interface StackFrame {
61
- constructor(object: StackFrame): StackFrame;
62
-
63
- isConstructor?: boolean;
64
- getIsConstructor(): boolean;
65
- setIsConstructor(): void;
66
-
67
- isEval?: boolean;
68
- getIsEval(): boolean;
69
- setIsEval(): void;
70
-
71
- isNative?: boolean;
72
- getIsNative(): boolean;
73
- setIsNative(): void;
74
-
75
- isTopLevel?: boolean;
76
- getIsTopLevel(): boolean;
77
- setIsTopLevel(): void;
78
-
79
- columnNumber?: number;
80
- getColumnNumber(): number;
81
- setColumnNumber(): void;
82
-
83
- lineNumber?: number;
84
- getLineNumber(): number;
85
- setLineNumber(): void;
86
-
87
- fileName?: string;
88
- getFileName(): string;
89
- setFileName(): void;
90
-
91
- functionName?: string;
92
- getFunctionName(): string;
93
- setFunctionName(): void;
94
-
95
- source?: string;
96
- getSource(): string;
97
- setSource(): void;
98
-
99
- args?: any[];
100
- getArgs(): any[];
101
- setArgs(): void;
102
-
103
- evalOrigin?: StackFrame;
104
- getEvalOrigin(): StackFrame;
105
- setEvalOrigin(): void;
106
-
107
- toString(): string;
108
- }
109
-
110
- /**
111
- * @description 资源加载错误及js错误接口
112
- */
113
- export interface IErrorInfo {
114
- /** 子类型 */
115
- subType: IErrorSubType;
116
- /** 错误行 */
117
- line?: number;
118
- /** 错误列 */
119
- column?: number;
120
- /** 错误信息 */
121
- message: string;
122
- /** 错误文件 */
123
- filename?: string;
124
- /** 错误函数名 */
125
- functionName?: string;
126
- /** 错误栈信息 */
127
- stack?: string;
128
- /** 错误帧*/
129
- stackFrame?: string;
130
- /** 操作录像*/
131
- events?: string;
132
- }
133
-
134
- /**
135
- * @description 用户行为子类型
136
- */
137
- export type IUserActivitySubType = 'ui.click' | 'ui.blur' | 'ui.scroll';
138
-
139
- /**
140
- * @description 用户行为类接口
141
- */
142
- export interface IUserActivity {
143
- /** 子类型 */
144
- subType: IUserActivitySubType;
145
- /** x轴坐标 */
146
- x?: number;
147
- /** y轴坐标 */
148
- y?: number;
149
- /** 元素路径 */
150
- path?: string;
151
- /** 值 */
152
- value?: string;
153
- }
154
-
155
- export interface IPerformance {
156
- navigation: {
157
- /**
158
- *一个无符号短整型,表示是如何导航到这个页面的。可能的值如下:
159
- TYPE_NAVIGATE (0)
160
- 当前页面是通过点击链接,书签和表单提交,或者脚本操作,或者在url中直接输入地址,type值为0
161
- TYPE_RELOAD (1)
162
- 点击刷新页面按钮或者通过Location.reload()方法显示的页面,type值为1
163
- The page was accessed by clicking the Reload button or via the Location.reload() method.
164
- TYPE_BACK_FORWARD (2)
165
- 页面通过历史记录和前进后退访问时。type值为2
166
- TYPE_RESERVED (255)
167
- 任何其他方式,type值为255
168
- */
169
- type: number;
170
- /** 无符号短整型,表示在到达这个页面之前重定向了多少次。 */
171
- redirectCount: number;
172
- };
173
- memory?: {
174
- /** 上下文内可用堆的最大体积,以字节计算。 */
175
- jsHeapSizeLimit: number;
176
- /** 已分配的堆体积,以字节计算。 */
177
- totalJSHeapSize: number;
178
- /** 当前 JS 堆活跃段(segment)的体积,以字节计算。 */
179
- usedJSHeapSize: number;
180
- };
181
- /** 返回性能测量开始时的时间的高精度时间戳。 */
182
- timeOrigin: number;
183
- timing: {
184
- /** 是一个无符号long long 型的毫秒数,返回浏览器与服务器之间的连接建立时的Unix毫秒时间戳。如果建立的是持久连接,则返回值等同于fetchStart属性的值。连接建立指的是所有握手和认证过程全部结束。 */
185
- connectEnd: number;
186
- /** 是一个无符号long long 型的毫秒数,返回HTTP请求开始向服务器发送时的Unix毫秒时间戳。如果使用持久连接(persistent connection),则返回值等同于fetchStart属性的值 */
187
- connectStart: number;
188
- /** 是一个无符号long long 型的毫秒数,返回当前文档解析完成,即Document.readyState 变为 'complete'且相对应的readystatechange (en-US) 被触发时的Unix毫秒时间戳。 */
189
- domComplete: number;
190
- /** 是一个无符号long long 型的毫秒数,返回当所有需要立即执行的脚本已经被执行(不论执行顺序)时的Unix毫秒时间戳。 */
191
- domContentLoadedEventEnd: number;
192
- /** 是一个无符号long long 型的毫秒数,返回当解析器发送DOMContentLoaded (en-US) 事件,即所有需要被执行的脚本已经被解析时的Unix毫秒时间戳。 */
193
- domContentLoadedEventStart: number;
194
- /** 是一个无符号long long 型的毫秒数,返回当前网页DOM结构结束解析、开始加载内嵌资源时(即Document.readyState属性变为“interactive”、相应的readystatechange (en-US)事件触发时)的Unix毫秒时间戳。 */
195
- domInteractive: number;
196
- /** 是一个无符号long long 型的毫秒数,返回当前网页DOM结构开始解析时(即Document.readyState属性变为“loading”、相应的 readystatechange (en-US)事件触发时)的Unix毫秒时间戳。 */
197
- domLoading: number;
198
- /** 是一个无符号long long 型的毫秒数,表征了域名查询结束的UNIX时间戳。如果使用了持续连接(persistent connection),或者这个信息存储到了缓存或者本地资源上,这个值将和 PerformanceTiming.fetchStart一致。 */
199
- domainLookupEnd: number;
200
- /** 是一个无符号long long 型的毫秒数,表征了域名查询开始的UNIX时间戳。如果使用了持续连接(persistent connection),或者这个信息存储到了缓存或者本地资源上,这个值将和 PerformanceTiming.fetchStart一致。 */
201
- domainLookupStart: number;
202
- /** 是一个无符号long long 型的毫秒数,表征了浏览器准备好使用HTTP请求来获取(fetch)文档的UNIX时间戳。这个时间点会在检查任何应用缓存之前。 */
203
- fetchStart: number;
204
- /** 是一个无符号long long 型的毫秒数,返回当load (en-US)事件结束,即加载事件完成时的Unix毫秒时间戳。如果这个事件还未被发送,或者尚未完成,它的值将会是0. */
205
- loadEventEnd: number;
206
- /** 是一个无符号long long 型的毫秒数,返回该文档下,load (en-US)事件被发送时的Unix毫秒时间戳。如果这个事件还未被发送,它的值将会是0。 */
207
- loadEventStart: number;
208
- /** 是一个无符号long long 型的毫秒数,表征了从同一个浏览器上下文的上一个文档卸载(unload)结束时的UNIX时间戳。如果没有上一个文档,这个值会和PerformanceTiming.fetchStart相同 */
209
- navigationStart: number;
210
- /** 是一个无符号long long 型的毫秒数,表征了最后一个HTTP重定向完成时(也就是说是HTTP响应的最后一个比特直接被收到的时间)的UNIX时间戳。如果没有重定向,或者重定向中的一个不同源,这个值会返回0. */
211
- redirectEnd: number;
212
- /** 是一个无符号long long 型的毫秒数,表征了第一个HTTP重定向开始时的UNIX时间戳。如果没有重定向,或者重定向中的一个不同源,这个值会返回0. */
213
- redirectStart: number;
214
- /** 是一个无符号long long 型的毫秒数,返回浏览器向服务器发出HTTP请求时(或开始读取本地缓存时)的Unix毫秒时间戳。 */
215
- requestStart: number;
216
- /** 是一个无符号long long 型的毫秒数,返回浏览器从服务器收到(或从本地缓存读取,或从本地资源读取)最后一个字节时(如果在此之前HTTP连接已经关闭,则返回关闭时)的Unix毫秒时间戳。 */
217
- responseEnd: number;
218
- /** 是一个无符号long long 型的毫秒数,返回浏览器从服务器收到(或从本地缓存读取)第一个字节时的Unix毫秒时间戳。如果传输层在开始请求之后失败并且连接被重开,该属性将会被数制成新的请求的相对应的发起时间。 */
219
- responseStart: number;
220
- /** 是一个无符号long long 型的毫秒数,返回浏览器与服务器开始安全链接的握手时的Unix毫秒时间戳。如果当前网页不要求安全连接,则返回0。 */
221
- secureConnectionStart: number;
222
- /** 是一个无符号long long 型的毫秒数,表征了unload (en-US)事件处理完成时的UNIX时间戳。如果没有上一个文档,or if the previous document, or one of the needed redirects, is not of the same origin, 这个值会返回0. */
223
- unloadEventEnd: number;
224
- /** 是一个无符号long long 型的毫秒数,表征了unload (en-US)事件抛出时的UNIX时间戳。如果没有上一个文档,or if the previous document, or one of the needed redirects, is not of the same origin, 这个值会返回0. */
225
- unloadEventStart: number;
226
- };
227
- }
package/src/typing.d.ts DELETED
@@ -1,15 +0,0 @@
1
- interface Navigator {
2
- connection: any;
3
- }
4
-
5
- interface Window {
6
- attachEvent: any;
7
- detachEvent: any;
8
- XMLHttpRequest: any; //拦截并定制XHR
9
- __XMLHttpRequest__: any; //原生的XHR
10
- fetch: any; //拦截并定制fetch
11
- __fetch__: any; //原生的fetch
12
- getRRWebUserEventsCaptureFunc: () => void; //手动上报视频录像
13
- getFullScreenShootFunc: (filename: string | undefined) => Promise<void>; //手动截图
14
- manualReportTrackFunc: (data: object) => void; //手动上报
15
- }
@@ -1,371 +0,0 @@
1
- import axios from 'axios';
2
- import { v4 as uuidv4 } from 'uuid';
3
- import { UAParser } from 'ua-parser-js';
4
- import { shuyunTrackId, shuyunTrackSessionId } from '../constant';
5
- import { getReport, setReportValue } from '../config/global';
6
- import { INavigator } from '../types';
7
- import { IListData } from '../types/config';
8
- import { IReport } from '../types/global';
9
- import { report } from '../reporter';
10
- import { Config } from '../config';
11
- import { version } from '../../package.json';
12
- import { getFullScreenShoot, getUserEvents } from '../handlers/error';
13
- import { pv } from '../handlers';
14
-
15
- const parser = new UAParser();
16
-
17
- /**
18
- * @description 获取uuid
19
- */
20
- export function getUid(): string {
21
- let uid = localStorage.getItem(shuyunTrackId) || '';
22
- if (!uid) {
23
- uid = uuidv4();
24
- localStorage.setItem(shuyunTrackId, uid);
25
- }
26
- return uid;
27
- }
28
-
29
- /**
30
- * @description 获取session id
31
- */
32
- export function getSessionId(): string {
33
- const sessionId = sessionStorage.getItem(shuyunTrackSessionId);
34
- if (sessionId) {
35
- return sessionId;
36
- } else {
37
- const id = uuidv4();
38
- sessionStorage.setItem(shuyunTrackSessionId, id);
39
- return id;
40
- }
41
- }
42
-
43
- /**
44
- * @description 获取浏览器信息
45
- */
46
- export function getNavigator(): INavigator {
47
- const uaResult = parser.getResult();
48
- return {
49
- language: navigator.language,
50
- navigatorVendor: navigator.vendor,
51
- connectionType: navigator?.connection?.effectiveType || '2g',
52
- browserName: uaResult.browser.name || '',
53
- browserVersion: uaResult.browser.version || '',
54
- engineName: uaResult.engine.name || '',
55
- engineVersion: uaResult.engine.version || '',
56
- osName: uaResult.os.name || '',
57
- osVersion: uaResult.os.version || '',
58
- };
59
- }
60
-
61
- /**
62
- * @description 获取viewport的宽高
63
- */
64
- export function getViewport() {
65
- const w = document.documentElement.clientWidth || document.body.clientWidth;
66
- const h = document.documentElement.clientHeight || document.body.clientHeight;
67
- return `${w} x ${h}`;
68
- }
69
-
70
- /**
71
- * @description 获取元素路径,最多保留5层
72
- * @param e
73
- */
74
- export const getElmPath = function (target: any) {
75
- if (!target || target.nodeType !== 1) {
76
- return '';
77
- }
78
- const ret: string[] = [];
79
- // 层数,最多5层
80
- let deepLength = 0;
81
- // 元素
82
- let elm = '';
83
- if (typeof target.innerText === 'string') {
84
- ret.push(`(${target.innerText.substr(0, 50)})`);
85
- }
86
- for (let t = target || null; t && deepLength++ < 5 && !((elm = normalTarget(t)) === 'html'); ) {
87
- // eslint-disable-next-line no-sequences
88
- ret.push(elm), (t = t.parentNode);
89
- }
90
- return ret.reverse().join(' > ');
91
- };
92
-
93
- /**
94
- * @description 处理html node
95
- * @param e
96
- */
97
- const normalTarget = function (target: Element) {
98
- let t, n, r, a, i;
99
- const o: string[] = [];
100
- if (!target || !target.tagName) {
101
- return '';
102
- }
103
-
104
- o.push(target.tagName.toLowerCase());
105
-
106
- if (target.id) {
107
- o.push('#'.concat(target.id));
108
- }
109
-
110
- if ((t = target.className) && Object.prototype.toString.call(t) === '[object String]') {
111
- for (n = t.split(/\s+/), i = 0; i < n.length; i++) {
112
- // className包含active的不加入路径
113
- if (n[i].indexOf('active') < 0) o.push('.'.concat(n[i]));
114
- }
115
- }
116
-
117
- const s = ['type', 'name', 'title', 'alt'];
118
- for (i = 0; i < s.length; i++) {
119
- r = s[i];
120
- if ((a = target.getAttribute(r))) {
121
- o.push('['.concat(r, '="').concat(a, '"]'));
122
- }
123
- }
124
-
125
- return o.join('');
126
- };
127
-
128
- /**
129
- * @description 序列化对象
130
- * @param obj
131
- */
132
- export function serialize(obj: { [key: string]: any }) {
133
- const str: string[] = [];
134
- for (const p in obj) {
135
- if (Object.prototype.hasOwnProperty.call(obj, p) && typeof obj[p] !== 'undefined') {
136
- const value = typeof obj[p] === 'object' ? JSON.stringify(obj[p]) : obj[p];
137
- str.push(encodeURIComponent(p) + '=' + encodeURIComponent(value));
138
- }
139
- }
140
- return str.join('&');
141
- }
142
- /**
143
- * @description 注册事件监听
144
- * @param event 事件
145
- * @param fn 回调方法
146
- */
147
- export const on = function (event: string, fn: (e: Event) => void) {
148
- if (window.addEventListener) {
149
- window.addEventListener(event, fn, true);
150
- } else {
151
- window.attachEvent(`on${event}`, fn);
152
- }
153
- };
154
-
155
- /**
156
- * @description 移除事件监听
157
- * @param event 事件
158
- * @param fn 回调方法
159
- */
160
- export const off = function (event: any, fn: (e: Event) => void) {
161
- if (window.removeEventListener) {
162
- return window.removeEventListener(event, fn);
163
- } else {
164
- return window.detachEvent(`on${event}`, fn);
165
- }
166
- };
167
-
168
- const formatTrackElementXPath = (xPath: string) => {
169
- const result: string[] = [];
170
- const array = xPath.split('/');
171
- array.forEach((item) => {
172
- if (
173
- !['svg', 'path', 'g', 'image', 'text', 'line', 'rect', 'polygon', 'circle', 'ellipse'].some((child) => {
174
- if (item.toLowerCase().split('[')[0] === child) {
175
- result.push(`/*[name()="${child}"]`);
176
- return true;
177
- } else {
178
- return false;
179
- }
180
- })
181
- ) {
182
- result.push(item);
183
- }
184
- });
185
- return result.join('/');
186
- };
187
-
188
- const formatElementXPath = (info: { elementXPath: string }) => {
189
- let elementXPathValue = '';
190
- const elementXPath = info.elementXPath;
191
- if (elementXPath) {
192
- const xpathElement = document.evaluate(formatTrackElementXPath(elementXPath), document).iterateNext();
193
- elementXPathValue = xpathElement ? (xpathElement.textContent || (xpathElement as any).value)?.trim() : '';
194
- }
195
- return {
196
- elementXPath,
197
- elementXPathValue,
198
- };
199
- };
200
-
201
- let existTrackListenEvent: { [key: string]: boolean } = {};
202
- const elements: Array<Node> = [];
203
- let timeout: NodeJS.Timeout | null;
204
- export const visualTrackFunc = () => {
205
- if (Config.enableVisualTrack) {
206
- if (timeout) clearTimeout(timeout);
207
- timeout = setTimeout(() => {
208
- timeout = null;
209
- const url = location.href.split('?')[0];
210
- axios
211
- .get(`${Config.reportUrl.replace('/s/r', '')}/visual/get_data_list?url=${encodeURIComponent(url)}`)
212
- .then((res: any) => {
213
- const listData: IListData[] = res.data.result?.result?.dataList;
214
- if (Array.isArray(listData)) {
215
- try {
216
- listData.forEach((item) => {
217
- if (item.trackType === 'mount') {
218
- visualReportEvent(item);
219
- } else {
220
- const element = document
221
- .evaluate(formatTrackElementXPath(item.trackElementXPath), document)
222
- .iterateNext();
223
- const key = url + item.trackElementXPath;
224
- if (element) {
225
- if (!existTrackListenEvent[key]) {
226
- existTrackListenEvent[key] = true;
227
- elements.push(element);
228
- //@ts-ignore
229
- element.setAttribute('visual-track-data-attr', JSON.stringify(item));
230
- element.addEventListener('click', clickEventFunc);
231
- }
232
- } else {
233
- const func = () => {
234
- const { browserName, browserVersion } = getNavigator();
235
- const payload = {
236
- projectID: Config.projectID,
237
- version,
238
- url,
239
- trackElementXPath: item.trackElementXPath,
240
- trackNameInfo: item.trackNameInfo,
241
- params: item.params,
242
- customPayload: Config.customPayload,
243
- type: 'visual_track_xpath_not_found',
244
- browser: `${browserName} - ${browserVersion}`,
245
- };
246
- if (typeof window.navigator?.sendBeacon === 'function') {
247
- const formData = new FormData();
248
- for (const i in payload) {
249
- if (Object.prototype.hasOwnProperty.call(payload, i)) {
250
- const value = (payload as { [k: string]: string | object })[i];
251
- formData.append(i, value && typeof value === 'object' ? JSON.stringify(value) : value);
252
- }
253
- }
254
- window.navigator.sendBeacon(Config.reportUrl, formData);
255
- } else {
256
- new Image().src = `${Config.reportUrl}?${serialize(payload)}`;
257
- }
258
- };
259
- if (typeof window.requestIdleCallback === 'function') {
260
- window.requestIdleCallback(() => func(), { timeout: 2000 });
261
- } else {
262
- setTimeout(() => func(), 0);
263
- }
264
- }
265
- }
266
- });
267
- } catch (err) {
268
- // eslint-disable-next-line no-console
269
- console.log('visual track evaluate err', err);
270
- }
271
- }
272
- });
273
- }, 1000);
274
- }
275
- };
276
-
277
- const visualReportEvent = (item: IListData) => {
278
- const { elementXPath, elementXPathValue } = formatElementXPath(item.trackNameInfo);
279
- const visualTrackData = {
280
- trackType: item.trackType,
281
- trackName: elementXPath ? elementXPathValue : item.trackNameInfo.name,
282
- params: item.params?.map((child) => {
283
- const { elementXPath, elementXPathValue } = formatElementXPath(child);
284
- return {
285
- name: child.name,
286
- value: elementXPath ? elementXPathValue : child.value,
287
- };
288
- }),
289
- };
290
- setReportValue<IReport, 'type'>('type', 'visual');
291
- setReportValue<IReport, 'vD'>('vD', visualTrackData);
292
- report(getReport());
293
- setReportValue<IReport, 'vD'>('vD', undefined);
294
- };
295
-
296
- const clickEventFunc = (e: Event) => {
297
- //@ts-ignore
298
- const item: IListData = JSON.parse(e.target!.getAttribute('visual-track-data-attr'));
299
- visualReportEvent(item);
300
- };
301
-
302
- export const initWindowObjectFunction = () => {
303
- if (typeof window.manualReportTrackFunc === 'undefined') {
304
- window.manualReportTrackFunc = (data: object) => {
305
- if (Object.prototype.toString.call(data) !== '[object Object]') {
306
- // eslint-disable-next-line no-console
307
- console.warn('manualReportTrackFunc参数必须是一个对象!');
308
- } else {
309
- setReportValue<IReport, 'type'>('type', 'manual');
310
- setReportValue<IReport, 'manualReport'>('manualReport', data);
311
- report(getReport());
312
- setReportValue<IReport, 'manualReport'>('manualReport', undefined);
313
- }
314
- };
315
- }
316
-
317
- if (typeof window.getFullScreenShootFunc === 'undefined') {
318
- //下载页面截图
319
- window.getFullScreenShootFunc = async (filename: string | undefined): Promise<void> => {
320
- const file = await getFullScreenShoot(filename);
321
- const url = window.URL.createObjectURL(file);
322
- const tagA = document.createElement('a');
323
- tagA.setAttribute('href', url);
324
- tagA.setAttribute('download', file.name);
325
- tagA.setAttribute('target', '_blank');
326
- document.body.appendChild(tagA);
327
- tagA.click();
328
- document.body.removeChild(tagA);
329
- };
330
- }
331
-
332
- if (typeof window.getRRWebUserEventsCaptureFunc === 'undefined') {
333
- window.getRRWebUserEventsCaptureFunc = (): void => {
334
- setReportValue<IReport, 'type'>('type', 'error');
335
- setReportValue<IReport, 'error'>('error', {
336
- subType: 'manual',
337
- message: 'manual trigger',
338
- events: getUserEvents(true),
339
- });
340
- report(getReport());
341
- };
342
- }
343
- };
344
-
345
- let prewHref: string = '';
346
- export const handleLocationChange = (e: Event) => {
347
- const curHref: string = location.href;
348
- // href中`?`后面的值改变,不触发后续动作
349
- if (prewHref.split('?')[0] === curHref.split('?')[0]) {
350
- return;
351
- }
352
- prewHref = curHref;
353
- pv.handleHistoryChange(e);
354
- elements.forEach((element) => {
355
- element?.removeEventListener('click', clickEventFunc);
356
- });
357
- //清空可视化埋点之前的数据
358
- existTrackListenEvent = {};
359
- elements.length = 0;
360
- visualTrackFunc();
361
- };
362
-
363
- export function debounce(fn: Function) {
364
- let timeout: NodeJS.Timeout;
365
- return function (...arg: unknown[]) {
366
- clearTimeout(timeout);
367
- timeout = setTimeout(() => {
368
- fn.apply(this, arg);
369
- }, 1000);
370
- };
371
- }
package/tsconfig.esm.json DELETED
@@ -1,14 +0,0 @@
1
- {
2
- "extends": "../../tsconfig.json",
3
- "include": [
4
- "src/**/*"
5
- ],
6
- "exclude": [
7
- "dist",
8
- "node_modules",
9
- "scripts"
10
- ],
11
- "compilerOptions": {
12
- "sourceMap": false
13
- }
14
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes