@haluo/util 2.0.33 → 2.0.34
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/dist/index.d.ts +3 -0
- package/dist/index.js +23 -19
- package/dist/modules/app-call/configs.d.ts +9 -0
- package/dist/modules/app-call/configs.js +44 -0
- package/dist/modules/app-call/core.d.ts +53 -0
- package/dist/modules/app-call/core.js +175 -0
- package/dist/modules/app-call/extensions.d.ts +187 -0
- package/dist/modules/app-call/extensions.js +1297 -0
- package/dist/modules/app-call/index.d.ts +16 -0
- package/dist/modules/app-call/index.js +84 -0
- package/dist/modules/app-call/offline.d.ts +12 -0
- package/dist/modules/app-call/offline.js +191 -0
- package/dist/modules/app-call/types.d.ts +67 -0
- package/dist/modules/app-call/types.js +4 -0
- package/dist/modules/cookie/index.js +22 -17
- package/dist/modules/date/index.js +54 -48
- package/dist/modules/dom/index.js +21 -15
- package/dist/modules/filter/index.js +14 -8
- package/dist/modules/format/index.js +9 -5
- package/dist/modules/match/index.js +8 -5
- package/dist/modules/monitor/lib/jsError.js +27 -38
- package/dist/modules/monitor/lib/timing.js +15 -17
- package/dist/modules/monitor/lib/xhr.js +26 -25
- package/dist/modules/monitor/utils/tracker.js +22 -10
- package/dist/modules/number/index.js +33 -30
- package/dist/modules/open-app/index.d.ts +3 -7
- package/dist/modules/open-app/index.js +52 -62
- package/dist/modules/sentry/index.js +16 -12
- package/dist/modules/tools/index.js +164 -154
- package/dist/modules/track/index.d.ts +122 -0
- package/dist/modules/track/index.js +421 -0
- package/dist/modules/track/types.d.ts +108 -0
- package/dist/modules/track/types.js +4 -0
- package/dist/modules/upload/aliOss.d.ts +52 -5
- package/dist/modules/upload/aliOss.js +589 -378
- package/dist/modules/upload/index.js +32 -29
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +27 -2
|
@@ -3,19 +3,99 @@
|
|
|
3
3
|
* @Author: wanghui
|
|
4
4
|
*/
|
|
5
5
|
'use strict';
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
var previous = 0;
|
|
7
|
+
var timeout = null;
|
|
8
8
|
import cloneDeep from 'lodash/cloneDeep';
|
|
9
9
|
import copy from 'clipboard-copy';
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
var ToolsClass = /** @class */ (function () {
|
|
11
|
+
function ToolsClass() {
|
|
12
|
+
var _this = this;
|
|
13
|
+
/**
|
|
14
|
+
* 蒙层显示后,html禁止滚动操作
|
|
15
|
+
* @param {String} className
|
|
16
|
+
* @return {Void}
|
|
17
|
+
*/
|
|
18
|
+
this.stopScroll = function (className) {
|
|
19
|
+
if (!(window && window.document)) {
|
|
20
|
+
return new Error('仅支持浏览器');
|
|
21
|
+
}
|
|
22
|
+
var html = document.documentElement;
|
|
23
|
+
html.style.overflow = 'hidden';
|
|
24
|
+
html.style.height = '100%';
|
|
25
|
+
var body = document.body;
|
|
26
|
+
body.style.overflow = 'hidden';
|
|
27
|
+
body.style.height = '100%';
|
|
28
|
+
if (className) {
|
|
29
|
+
var dom = document.querySelector(".".concat(className));
|
|
30
|
+
dom && dom.addEventListener('touchmove', _this.__setDefault__);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* 蒙层隐藏后,html开启滚动操作
|
|
35
|
+
* @param {String} className
|
|
36
|
+
* @return {Void}
|
|
37
|
+
*/
|
|
38
|
+
this.startScroll = function (className) {
|
|
39
|
+
if (!(window && window.document)) {
|
|
40
|
+
return new Error('仅支持浏览器');
|
|
41
|
+
}
|
|
42
|
+
var html = document.documentElement;
|
|
43
|
+
html.style.overflow = 'visible';
|
|
44
|
+
html.style.height = 'auto';
|
|
45
|
+
var body = document.body;
|
|
46
|
+
body.style.overflow = 'visible';
|
|
47
|
+
body.style.height = 'auto';
|
|
48
|
+
if (className) {
|
|
49
|
+
var dom = document.querySelector(".".concat(className));
|
|
50
|
+
dom && dom.removeEventListener('touchmove', _this.__setDefault__);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* object 对象转 array 数组
|
|
55
|
+
* demo:
|
|
56
|
+
* objectToArray({a:1,b:2}) 输出:["a=1", "b=2"]
|
|
57
|
+
* @param {Object} obj
|
|
58
|
+
* @returns {Array} arr
|
|
59
|
+
*/
|
|
60
|
+
this.objectToArray = function (obj) {
|
|
61
|
+
var arr = [];
|
|
62
|
+
if (typeof obj === 'object') {
|
|
63
|
+
for (var key in obj) {
|
|
64
|
+
if (obj.hasOwnProperty(key)) {
|
|
65
|
+
arr.push([key, obj[key]].join('='));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return arr;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* convertEnum
|
|
73
|
+
* 枚举键值互换
|
|
74
|
+
* @param {Object} obj
|
|
75
|
+
* convertKeyValueEnum({a: 1, b: 2}) // {1: "a", 2: "b"}
|
|
76
|
+
* @returns {Object} result
|
|
77
|
+
*/
|
|
78
|
+
this.convertKeyValueEnum = function (obj) {
|
|
79
|
+
var result = {};
|
|
80
|
+
if (typeof obj === 'object') {
|
|
81
|
+
for (var key in obj) {
|
|
82
|
+
if (obj.hasOwnProperty(key)) {
|
|
83
|
+
result[obj[key]] = key;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
};
|
|
89
|
+
this.isDefined = function (val) {
|
|
90
|
+
return val !== undefined && val !== null;
|
|
91
|
+
};
|
|
12
92
|
this.__loaded__ = {}; // 已加载的资源
|
|
13
93
|
/**
|
|
14
94
|
* 阻止事件传递
|
|
15
95
|
* @param {Event} e
|
|
16
96
|
* @return {Void}
|
|
17
97
|
*/
|
|
18
|
-
this.__setDefault__ = (e)
|
|
98
|
+
this.__setDefault__ = function (e) {
|
|
19
99
|
e && e.preventDefault();
|
|
20
100
|
};
|
|
21
101
|
}
|
|
@@ -25,31 +105,31 @@ class ToolsClass {
|
|
|
25
105
|
* @param {String} data
|
|
26
106
|
* @return {Object}
|
|
27
107
|
*/
|
|
28
|
-
deepCopy(data) {
|
|
108
|
+
ToolsClass.prototype.deepCopy = function (data) {
|
|
29
109
|
return JSON.parse(JSON.stringify(data));
|
|
30
|
-
}
|
|
110
|
+
};
|
|
31
111
|
/**
|
|
32
112
|
* 深拷贝 Object|Array
|
|
33
113
|
* 支持 普通对象、数组和函数的深复制,但是未解决循环引用、Date、RegExp
|
|
34
114
|
* @param {Object|Array} data
|
|
35
115
|
* @return {Object}
|
|
36
116
|
*/
|
|
37
|
-
deepCopy2(obj) {
|
|
38
|
-
|
|
39
|
-
for (
|
|
117
|
+
ToolsClass.prototype.deepCopy2 = function (obj) {
|
|
118
|
+
var _obj = Array.isArray(obj) ? [] : {};
|
|
119
|
+
for (var i in obj) {
|
|
40
120
|
_obj[i] = typeof obj[i] === 'object' ? this.deepCopy2(obj[i]) : obj[i];
|
|
41
121
|
}
|
|
42
122
|
return _obj;
|
|
43
|
-
}
|
|
123
|
+
};
|
|
44
124
|
/**
|
|
45
125
|
* 深拷贝 Object|Array
|
|
46
126
|
* 注意:需要 yarn add lodash
|
|
47
127
|
* @param {Object|Array} data
|
|
48
128
|
* @return {Object}
|
|
49
129
|
*/
|
|
50
|
-
deepCopy3(obj) {
|
|
130
|
+
ToolsClass.prototype.deepCopy3 = function (obj) {
|
|
51
131
|
return cloneDeep(obj);
|
|
52
|
-
}
|
|
132
|
+
};
|
|
53
133
|
/**
|
|
54
134
|
* 防抖
|
|
55
135
|
* demo:debounce(func, 300)(args)
|
|
@@ -57,17 +137,17 @@ class ToolsClass {
|
|
|
57
137
|
* @param {Number} wait 节流时间,毫秒
|
|
58
138
|
* @return {Function} delay
|
|
59
139
|
*/
|
|
60
|
-
debounce(func, wait) {
|
|
61
|
-
|
|
62
|
-
|
|
140
|
+
ToolsClass.prototype.debounce = function (func, wait) {
|
|
141
|
+
var delay = function () {
|
|
142
|
+
var args = arguments;
|
|
63
143
|
if (timeout)
|
|
64
144
|
clearTimeout(timeout);
|
|
65
|
-
timeout = setTimeout(()
|
|
145
|
+
timeout = setTimeout(function () {
|
|
66
146
|
func.apply(delay, args);
|
|
67
147
|
}, wait);
|
|
68
148
|
};
|
|
69
149
|
return delay;
|
|
70
|
-
}
|
|
150
|
+
};
|
|
71
151
|
/**
|
|
72
152
|
* 节流
|
|
73
153
|
* demo:throttle(func, 300)(args)
|
|
@@ -75,124 +155,86 @@ class ToolsClass {
|
|
|
75
155
|
* @param {Number} wait 节流时间,毫秒
|
|
76
156
|
* @return {Function} delay
|
|
77
157
|
*/
|
|
78
|
-
throttle(func, wait) {
|
|
79
|
-
|
|
80
|
-
|
|
158
|
+
ToolsClass.prototype.throttle = function (func, wait) {
|
|
159
|
+
var delay = function () {
|
|
160
|
+
var now = Date.now();
|
|
81
161
|
if (now - previous > wait) {
|
|
82
162
|
func.apply(delay, arguments);
|
|
83
163
|
previous = now;
|
|
84
164
|
}
|
|
85
165
|
};
|
|
86
166
|
return delay;
|
|
87
|
-
}
|
|
167
|
+
};
|
|
88
168
|
/**
|
|
89
169
|
* 获取路径中文件名称
|
|
90
170
|
* @param {String} url
|
|
91
171
|
* @return {String}
|
|
92
172
|
*/
|
|
93
|
-
getUrlName(url) {
|
|
173
|
+
ToolsClass.prototype.getUrlName = function (url) {
|
|
94
174
|
return (url && url.split('?')[0].split('/').reverse()[0]);
|
|
95
|
-
}
|
|
175
|
+
};
|
|
96
176
|
/**
|
|
97
177
|
* 动态加载脚本
|
|
98
178
|
* tip:按需加载时用(多次调用,js不会重复加载)
|
|
99
179
|
* @param {String} url
|
|
100
180
|
* @return {Promise}
|
|
101
181
|
*/
|
|
102
|
-
loadJs(url) {
|
|
182
|
+
ToolsClass.prototype.loadJs = function (url) {
|
|
183
|
+
var _this = this;
|
|
103
184
|
if (!(window && window.document)) {
|
|
104
185
|
return new Error('仅支持浏览器');
|
|
105
186
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
return new Promise((resolve, reject)
|
|
109
|
-
if (
|
|
187
|
+
var name = this.getUrlName(url);
|
|
188
|
+
var id = 'js_' + name;
|
|
189
|
+
return new Promise(function (resolve, reject) {
|
|
190
|
+
if (_this.__loaded__[id]) {
|
|
110
191
|
return resolve();
|
|
111
192
|
}
|
|
112
|
-
|
|
193
|
+
var script = document.createElement('script');
|
|
113
194
|
script.type = 'text/javascript';
|
|
114
195
|
script.async = true;
|
|
115
196
|
script.src = url;
|
|
116
197
|
script.id = id;
|
|
117
|
-
script.onload = ()
|
|
118
|
-
|
|
198
|
+
script.onload = function () {
|
|
199
|
+
_this.__loaded__[id] = true;
|
|
119
200
|
resolve();
|
|
120
201
|
};
|
|
121
|
-
script.onerror = (e)
|
|
202
|
+
script.onerror = function (e) {
|
|
122
203
|
reject(e);
|
|
123
204
|
};
|
|
124
205
|
document.body.appendChild(script);
|
|
125
206
|
});
|
|
126
|
-
}
|
|
207
|
+
};
|
|
127
208
|
/**
|
|
128
209
|
* 动态加载样式
|
|
129
210
|
* @param {String} url
|
|
130
211
|
* @return {Promise}
|
|
131
212
|
*/
|
|
132
|
-
loadCss(url) {
|
|
213
|
+
ToolsClass.prototype.loadCss = function (url) {
|
|
214
|
+
var _this = this;
|
|
133
215
|
if (!(window && window.document)) {
|
|
134
216
|
return new Error('仅支持浏览器');
|
|
135
217
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
return new Promise((resolve, reject)
|
|
139
|
-
if (
|
|
218
|
+
var name = this.getUrlName(url);
|
|
219
|
+
var id = 'css_' + name;
|
|
220
|
+
return new Promise(function (resolve, reject) {
|
|
221
|
+
if (_this.__loaded__[id]) {
|
|
140
222
|
return resolve();
|
|
141
223
|
}
|
|
142
|
-
|
|
224
|
+
var link = document.createElement('link');
|
|
143
225
|
link.type = 'text/css';
|
|
144
226
|
link.rel = 'stylesheet';
|
|
145
227
|
link.href = url;
|
|
146
228
|
link.id = id;
|
|
147
|
-
link.onload = ()
|
|
148
|
-
|
|
229
|
+
link.onload = function () {
|
|
230
|
+
_this.__loaded__[id] = true;
|
|
149
231
|
resolve();
|
|
150
232
|
};
|
|
151
|
-
link.onerror = (e)
|
|
233
|
+
link.onerror = function (e) {
|
|
152
234
|
reject(e);
|
|
153
235
|
};
|
|
154
236
|
document.head.appendChild(link);
|
|
155
237
|
});
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* 蒙层显示后,html禁止滚动操作
|
|
159
|
-
* @param {String} className
|
|
160
|
-
* @return {Void}
|
|
161
|
-
*/
|
|
162
|
-
stopScroll = (className) => {
|
|
163
|
-
if (!(window && window.document)) {
|
|
164
|
-
return new Error('仅支持浏览器');
|
|
165
|
-
}
|
|
166
|
-
const html = document.documentElement;
|
|
167
|
-
html.style.overflow = 'hidden';
|
|
168
|
-
html.style.height = '100%';
|
|
169
|
-
const body = document.body;
|
|
170
|
-
body.style.overflow = 'hidden';
|
|
171
|
-
body.style.height = '100%';
|
|
172
|
-
if (className) {
|
|
173
|
-
const dom = document.querySelector(`.${className}`);
|
|
174
|
-
dom && dom.addEventListener('touchmove', this.__setDefault__);
|
|
175
|
-
}
|
|
176
|
-
};
|
|
177
|
-
/**
|
|
178
|
-
* 蒙层隐藏后,html开启滚动操作
|
|
179
|
-
* @param {String} className
|
|
180
|
-
* @return {Void}
|
|
181
|
-
*/
|
|
182
|
-
startScroll = (className) => {
|
|
183
|
-
if (!(window && window.document)) {
|
|
184
|
-
return new Error('仅支持浏览器');
|
|
185
|
-
}
|
|
186
|
-
const html = document.documentElement;
|
|
187
|
-
html.style.overflow = 'visible';
|
|
188
|
-
html.style.height = 'auto';
|
|
189
|
-
const body = document.body;
|
|
190
|
-
body.style.overflow = 'visible';
|
|
191
|
-
body.style.height = 'auto';
|
|
192
|
-
if (className) {
|
|
193
|
-
const dom = document.querySelector(`.${className}`);
|
|
194
|
-
dom && dom.removeEventListener('touchmove', this.__setDefault__);
|
|
195
|
-
}
|
|
196
238
|
};
|
|
197
239
|
/**
|
|
198
240
|
* 字符串复制到剪贴板
|
|
@@ -200,91 +242,58 @@ class ToolsClass {
|
|
|
200
242
|
* @param {String} str
|
|
201
243
|
* @return {String}
|
|
202
244
|
*/
|
|
203
|
-
clipboard(str) {
|
|
245
|
+
ToolsClass.prototype.clipboard = function (str) {
|
|
204
246
|
if (!(window && window.document)) {
|
|
205
247
|
return new Error('仅支持浏览器');
|
|
206
248
|
}
|
|
207
249
|
return copy(str);
|
|
208
|
-
}
|
|
250
|
+
};
|
|
209
251
|
/**
|
|
210
252
|
* 首字母大写
|
|
211
253
|
* @param {String} str
|
|
212
254
|
* @return {String}
|
|
213
255
|
*/
|
|
214
|
-
firstUpperCase(str) {
|
|
256
|
+
ToolsClass.prototype.firstUpperCase = function (str) {
|
|
215
257
|
return str.charAt(0).toUpperCase() + str.toString().slice(1);
|
|
216
|
-
}
|
|
258
|
+
};
|
|
217
259
|
/**
|
|
218
260
|
* 截取数组或字符串,示例:slice('1234', 3)
|
|
219
261
|
* @param {Array|String} target 数组或字符串
|
|
220
262
|
* @param {Number} length 截取长度,从0开始
|
|
221
263
|
* @return {any}
|
|
222
264
|
*/
|
|
223
|
-
slice
|
|
265
|
+
ToolsClass.prototype.slice = function (target, length) {
|
|
266
|
+
if (target === void 0) { target = ''; }
|
|
267
|
+
if (length === void 0) { length = 0; }
|
|
224
268
|
return target.slice(0, length);
|
|
225
|
-
}
|
|
269
|
+
};
|
|
226
270
|
/**
|
|
227
271
|
* 获取guid
|
|
228
272
|
* @return {String}
|
|
229
273
|
*/
|
|
230
|
-
guid() {
|
|
274
|
+
ToolsClass.prototype.guid = function () {
|
|
231
275
|
function S4() {
|
|
232
276
|
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
|
|
233
277
|
}
|
|
234
278
|
return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
|
|
235
|
-
}
|
|
279
|
+
};
|
|
236
280
|
/**
|
|
237
281
|
* 获取文本字节数(含中文)
|
|
238
282
|
* @param {String} str
|
|
239
283
|
* @return {String}
|
|
240
284
|
*/
|
|
241
|
-
getBytesOfText
|
|
285
|
+
ToolsClass.prototype.getBytesOfText = function (str) {
|
|
286
|
+
if (str === void 0) { str = ''; }
|
|
242
287
|
return str.replace(/[^\u0000-\u00ff]/g, "aa").length;
|
|
243
|
-
}
|
|
244
|
-
/**
|
|
245
|
-
* object 对象转 array 数组
|
|
246
|
-
* demo:
|
|
247
|
-
* objectToArray({a:1,b:2}) 输出:["a=1", "b=2"]
|
|
248
|
-
* @param {Object} obj
|
|
249
|
-
* @returns {Array} arr
|
|
250
|
-
*/
|
|
251
|
-
objectToArray = (obj) => {
|
|
252
|
-
var arr = [];
|
|
253
|
-
if (typeof obj === 'object') {
|
|
254
|
-
for (var key in obj) {
|
|
255
|
-
if (obj.hasOwnProperty(key)) {
|
|
256
|
-
arr.push([key, obj[key]].join('='));
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
return arr;
|
|
261
|
-
};
|
|
262
|
-
/**
|
|
263
|
-
* convertEnum
|
|
264
|
-
* 枚举键值互换
|
|
265
|
-
* @param {Object} obj
|
|
266
|
-
* convertKeyValueEnum({a: 1, b: 2}) // {1: "a", 2: "b"}
|
|
267
|
-
* @returns {Object} result
|
|
268
|
-
*/
|
|
269
|
-
convertKeyValueEnum = (obj) => {
|
|
270
|
-
const result = {};
|
|
271
|
-
if (typeof obj === 'object') {
|
|
272
|
-
for (const key in obj) {
|
|
273
|
-
if (obj.hasOwnProperty(key)) {
|
|
274
|
-
result[obj[key]] = key;
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
return result;
|
|
279
288
|
};
|
|
280
289
|
/**
|
|
281
290
|
* 数组去重
|
|
282
291
|
* @param {Array} arr
|
|
283
292
|
* @returns {Array}
|
|
284
293
|
*/
|
|
285
|
-
uniqueArr(arr) {
|
|
294
|
+
ToolsClass.prototype.uniqueArr = function (arr) {
|
|
286
295
|
return Array.from(new Set(arr));
|
|
287
|
-
}
|
|
296
|
+
};
|
|
288
297
|
/**
|
|
289
298
|
* 数组元素交换位置
|
|
290
299
|
* index1和index2分别是两个数组的索引值,即是两个要交换元素位置的索引值,如1,5就是数组中下标为1和5的两个元素交换位置
|
|
@@ -294,37 +303,38 @@ class ToolsClass {
|
|
|
294
303
|
* swapArray([1, 2, 3, 4], 2, 3) // [1, 2, 4, 3]
|
|
295
304
|
* @returns {Array<string | number>} array
|
|
296
305
|
*/
|
|
297
|
-
swapArray(array, index1, index2) {
|
|
298
|
-
|
|
306
|
+
ToolsClass.prototype.swapArray = function (array, index1, index2) {
|
|
307
|
+
var _a;
|
|
308
|
+
_a = [array[index2], array[index1]], array[index1] = _a[0], array[index2] = _a[1];
|
|
299
309
|
return array;
|
|
300
|
-
}
|
|
310
|
+
};
|
|
301
311
|
/**
|
|
302
312
|
* 过滤表情符号
|
|
303
313
|
* @param {String} str
|
|
304
314
|
* @return {String}
|
|
305
315
|
*/
|
|
306
|
-
filterEmoji(str) {
|
|
316
|
+
ToolsClass.prototype.filterEmoji = function (str) {
|
|
307
317
|
return str.replace(/\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F]/mg, '');
|
|
308
|
-
}
|
|
318
|
+
};
|
|
309
319
|
/**
|
|
310
320
|
* 是否包含表情
|
|
311
321
|
* @param {String} str
|
|
312
322
|
* @return {boolean}
|
|
313
323
|
*/
|
|
314
|
-
containsEmoji(str) {
|
|
315
|
-
|
|
324
|
+
ToolsClass.prototype.containsEmoji = function (str) {
|
|
325
|
+
var reg = /\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F]/mg;
|
|
316
326
|
return reg.test(str);
|
|
317
|
-
}
|
|
327
|
+
};
|
|
318
328
|
/**
|
|
319
329
|
* 是否包含表汉字
|
|
320
330
|
* @param {String} str
|
|
321
331
|
* @return {boolean}
|
|
322
332
|
*/
|
|
323
|
-
containsHanZi(str) {
|
|
324
|
-
|
|
333
|
+
ToolsClass.prototype.containsHanZi = function (str) {
|
|
334
|
+
var reg = /[\u4e00-\u9fa5]/mg;
|
|
325
335
|
return reg.test(str);
|
|
326
|
-
}
|
|
327
|
-
isEmpty(val) {
|
|
336
|
+
};
|
|
337
|
+
ToolsClass.prototype.isEmpty = function (val) {
|
|
328
338
|
// null or undefined
|
|
329
339
|
if (val == null)
|
|
330
340
|
return true;
|
|
@@ -351,11 +361,8 @@ class ToolsClass {
|
|
|
351
361
|
}
|
|
352
362
|
}
|
|
353
363
|
return false;
|
|
354
|
-
}
|
|
355
|
-
;
|
|
356
|
-
isDefined = (val) => {
|
|
357
|
-
return val !== undefined && val !== null;
|
|
358
364
|
};
|
|
365
|
+
;
|
|
359
366
|
/**
|
|
360
367
|
* 字段脱敏处理
|
|
361
368
|
* @param {String} field 未脱敏字段
|
|
@@ -363,20 +370,23 @@ class ToolsClass {
|
|
|
363
370
|
* @param {Int} after 结尾未脱敏字符数
|
|
364
371
|
* @return {String} 已脱敏字段
|
|
365
372
|
*/
|
|
366
|
-
sensitiveField(field, before
|
|
373
|
+
ToolsClass.prototype.sensitiveField = function (field, before, after) {
|
|
374
|
+
if (before === void 0) { before = 3; }
|
|
375
|
+
if (after === void 0) { after = 4; }
|
|
367
376
|
if (!field) {
|
|
368
377
|
return '';
|
|
369
378
|
}
|
|
370
379
|
field = String(field);
|
|
371
|
-
|
|
380
|
+
var sensitiveLen = field.length - before - after;
|
|
372
381
|
if (sensitiveLen < 0) {
|
|
373
382
|
sensitiveLen = 0;
|
|
374
383
|
}
|
|
375
384
|
// 匹配中文、英文、数字
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
return field.replace(reg,
|
|
380
|
-
}
|
|
381
|
-
|
|
385
|
+
var regItem = '[\u4e00-\u9fa5a-zA-Z0-9]';
|
|
386
|
+
var regExp = "(".concat(regItem, "{").concat(before, "})").concat(regItem, "*(").concat(regItem, "{").concat(after, "})");
|
|
387
|
+
var reg = new RegExp(regExp);
|
|
388
|
+
return field.replace(reg, "$1".concat("*".repeat(sensitiveLen), "$2"));
|
|
389
|
+
};
|
|
390
|
+
return ToolsClass;
|
|
391
|
+
}());
|
|
382
392
|
export default new ToolsClass();
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Track 埋点模块
|
|
3
|
+
* 统一封装各项目的埋点上报逻辑
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* // 最简初始化(所有配置都有默认值)
|
|
7
|
+
* import { createTracker } from '@haluo/util/dist/modules/track'
|
|
8
|
+
*
|
|
9
|
+
* const tracker = createTracker({})
|
|
10
|
+
* // 或指定 appName
|
|
11
|
+
* const tracker2 = createTracker({ appName: 'emoto' })
|
|
12
|
+
*
|
|
13
|
+
* // 使用
|
|
14
|
+
* tracker.track('EVENT_ID', { key: 'value' })
|
|
15
|
+
* tracker.trackError({ err: 'error message' })
|
|
16
|
+
*/
|
|
17
|
+
import type { TrackConfig, ErrorContent } from './types';
|
|
18
|
+
export * from './types';
|
|
19
|
+
/**
|
|
20
|
+
* 内置的 getChannel 方法
|
|
21
|
+
* 根据 UA 检测渠道:微信、QQ、微博等
|
|
22
|
+
*/
|
|
23
|
+
declare function defaultGetChannel(): string;
|
|
24
|
+
/**
|
|
25
|
+
* Track 类
|
|
26
|
+
* 提供埋点上报功能
|
|
27
|
+
*/
|
|
28
|
+
declare class Tracker {
|
|
29
|
+
private config;
|
|
30
|
+
constructor(config: TrackConfig);
|
|
31
|
+
/**
|
|
32
|
+
* 获取当前版本号
|
|
33
|
+
* 优先级:window.AppCall.getAppVersion() > 传入的 appCall > config.version
|
|
34
|
+
*/
|
|
35
|
+
private getVersion;
|
|
36
|
+
/**
|
|
37
|
+
* 获取渠道号
|
|
38
|
+
* 优先使用自定义 getChannel,否则使用内置的默认方法
|
|
39
|
+
*/
|
|
40
|
+
private getChannel;
|
|
41
|
+
/**
|
|
42
|
+
* 检查是否命中AB测试
|
|
43
|
+
*/
|
|
44
|
+
private checkAbTest;
|
|
45
|
+
/**
|
|
46
|
+
* 构建埋点请求数据
|
|
47
|
+
*/
|
|
48
|
+
private buildPostData;
|
|
49
|
+
/**
|
|
50
|
+
* 发送埋点请求
|
|
51
|
+
*/
|
|
52
|
+
private sendRequest;
|
|
53
|
+
/**
|
|
54
|
+
* 核心埋点方法
|
|
55
|
+
* @param params 埋点参数
|
|
56
|
+
*/
|
|
57
|
+
private trackUser;
|
|
58
|
+
/**
|
|
59
|
+
* 埋点上报
|
|
60
|
+
* @param eId 事件ID
|
|
61
|
+
* @param contentObj 事件内容对象
|
|
62
|
+
* @param isAbTest 是否AB测试(已废弃,保留兼容)
|
|
63
|
+
*/
|
|
64
|
+
track(eId: string, contentObj?: Record<string, any>, isAbTest?: boolean): Promise<any>;
|
|
65
|
+
/**
|
|
66
|
+
* 错误上报
|
|
67
|
+
* @param contentObj 错误内容对象
|
|
68
|
+
*/
|
|
69
|
+
trackError(contentObj?: Partial<ErrorContent>): Promise<any>;
|
|
70
|
+
/**
|
|
71
|
+
* 更新配置
|
|
72
|
+
*/
|
|
73
|
+
updateConfig(config: Partial<TrackConfig>): void;
|
|
74
|
+
/**
|
|
75
|
+
* 获取当前配置
|
|
76
|
+
*/
|
|
77
|
+
getConfig(): TrackConfig;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 创建 Tracker 实例
|
|
81
|
+
* @param config 配置项
|
|
82
|
+
* @returns Tracker 实例
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* const tracker = createTracker({
|
|
86
|
+
* appName: 'emoto'
|
|
87
|
+
* // logUrl 可选,默认: https://log-center.58moto.com/am/log/v1/json
|
|
88
|
+
* // httpClient 可选,默认使用内置 fetch 实现
|
|
89
|
+
* })
|
|
90
|
+
*
|
|
91
|
+
* // 普通埋点
|
|
92
|
+
* tracker.track('EVENT_001', { page: 'home' })
|
|
93
|
+
*
|
|
94
|
+
* // 错误上报
|
|
95
|
+
* tracker.trackError({ err: 'Something went wrong' })
|
|
96
|
+
*/
|
|
97
|
+
export declare function createTracker(config: TrackConfig): Tracker;
|
|
98
|
+
/**
|
|
99
|
+
* 创建简化版埋点方法
|
|
100
|
+
* 返回 postTrack 和 postTrackError 方法,与原有项目用法一致
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* const { postTrack, postTrackError } = createTrackMethods({
|
|
104
|
+
* appName: 'moto'
|
|
105
|
+
* })
|
|
106
|
+
*
|
|
107
|
+
* // 等同于原来的 postJddTrack
|
|
108
|
+
* postTrack('EVENT_001', { page: 'home' })
|
|
109
|
+
*
|
|
110
|
+
* // 等同于原来的 postJddTrackError
|
|
111
|
+
* postTrackError({ err: 'error message' })
|
|
112
|
+
*/
|
|
113
|
+
export declare function createTrackMethods(config: TrackConfig): {
|
|
114
|
+
/** 埋点上报方法 */
|
|
115
|
+
postTrack: (eId: string, contentObj?: Record<string, any>, isAbTest?: boolean) => Promise<any>;
|
|
116
|
+
/** 错误上报方法 */
|
|
117
|
+
postTrackError: (contentObj?: Partial<ErrorContent>) => Promise<any>;
|
|
118
|
+
/** Tracker 实例 */
|
|
119
|
+
tracker: Tracker;
|
|
120
|
+
};
|
|
121
|
+
export { defaultGetChannel as getChannel };
|
|
122
|
+
export default createTracker;
|