@haluo/util 1.0.6 → 1.0.7
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/.eslintrc.js +2 -2
- package/dist/index.cjs.js +89 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.esm.js +87 -0
- package/dist/lib-list.d.ts +2 -0
- package/dist/modules/cookie/index.d.ts +27 -0
- package/dist/modules/cookie/index.js +2 -2
- package/dist/modules/date/index.d.ts +1 -0
- package/dist/modules/date/index.js +11 -11
- package/dist/modules/dom/index.d.ts +1 -0
- package/dist/modules/dom/index.js +1 -1
- package/dist/modules/filter/index.d.ts +26 -0
- package/dist/modules/format/index.d.ts +13 -0
- package/dist/modules/match/index.d.ts +1 -0
- package/dist/modules/monitor/index.js +14 -0
- package/dist/modules/monitor/lib/jsError.js +60 -0
- package/dist/modules/monitor/lib/timing.js +69 -0
- package/dist/modules/monitor/lib/xhr.js +41 -0
- package/dist/modules/monitor/utils/onload.js +11 -0
- package/dist/modules/monitor/utils/tracker.js +35 -0
- package/dist/modules/number/index.d.ts +39 -0
- package/dist/modules/number/index.js +3 -3
- package/dist/modules/sentry/index.d.ts +15 -0
- package/dist/modules/tools/index.d.ts +1 -0
- package/dist/modules/tools/index.js +4 -4
- package/package.json +2 -1
- package/src/modules/monitor/index.ts +8 -0
- package/src/modules/monitor/lib/jsError.ts +54 -0
- package/src/modules/monitor/lib/timing.ts +75 -0
- package/src/modules/monitor/lib/xhr.ts +35 -0
- package/src/modules/monitor/utils/onload.ts +8 -0
- package/src/modules/monitor/utils/tracker.ts +22 -0
- package/coverage/clover.xml +0 -78
- package/coverage/coverage-final.json +0 -2
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -79
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +0 -111
- package/coverage/lcov-report/index.ts.html +0 -668
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -170
- package/coverage/lcov.info +0 -170
package/.eslintrc.js
CHANGED
|
@@ -3,7 +3,7 @@ const DOMGlobals = [] // ['window']
|
|
|
3
3
|
module.exports = {
|
|
4
4
|
root: true,
|
|
5
5
|
parserOptions: {
|
|
6
|
-
parser: '
|
|
6
|
+
parser: '@typescript-eslint/parser',
|
|
7
7
|
sourceType: 'module'
|
|
8
8
|
},
|
|
9
9
|
env: {
|
|
@@ -12,7 +12,7 @@ module.exports = {
|
|
|
12
12
|
es6: true,
|
|
13
13
|
jest: true
|
|
14
14
|
},
|
|
15
|
-
extends: ['plugin:vue/recommended', 'eslint:recommended'],
|
|
15
|
+
extends: ['plugin:vue/recommended', 'eslint:recommended', "plugin:@typescript-eslint/recommended"],
|
|
16
16
|
globals: {
|
|
17
17
|
document: true,
|
|
18
18
|
navigator: true,
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Cookie
|
|
5
|
+
* @Author: wanghui
|
|
6
|
+
* @createBy: @2021.01.21
|
|
7
|
+
*/
|
|
8
|
+
var CookieClass = /** @class */ (function () {
|
|
9
|
+
function CookieClass() {
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 获取cookie
|
|
13
|
+
* @param {String} name
|
|
14
|
+
* @return {String}
|
|
15
|
+
*/
|
|
16
|
+
CookieClass.prototype.getCookie = function (name) {
|
|
17
|
+
var _name = name + '=';
|
|
18
|
+
var ca = document.cookie.split(';');
|
|
19
|
+
for (var i = 0; i < ca.length; i++) {
|
|
20
|
+
var c = ca[i];
|
|
21
|
+
while (c.charAt(0) === ' ')
|
|
22
|
+
c = c.substring(1);
|
|
23
|
+
if (c.includes(_name))
|
|
24
|
+
return c.substring(_name.length, c.length);
|
|
25
|
+
}
|
|
26
|
+
return '';
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* 设置cookie
|
|
30
|
+
* @param {Object} ICookie
|
|
31
|
+
*/
|
|
32
|
+
CookieClass.prototype.setCookie = function (_a) {
|
|
33
|
+
var _b = _a.name, name = _b === void 0 ? '' : _b, _c = _a.value, value = _c === void 0 ? '' : _c, _d = _a.exdays, exdays = _d === void 0 ? -1 : _d, _e = _a.path, path = _e === void 0 ? '/' : _e, _f = _a.domain, domain = _f === void 0 ? '.jddmoto.com' : _f;
|
|
34
|
+
var d = new Date();
|
|
35
|
+
d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
|
|
36
|
+
var expires = "expires=" + d.toUTCString();
|
|
37
|
+
document.cookie = name + "=" + value + ";" + expires + ";path=" + path + ";domain=" + domain + ";";
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* 清除Cookie
|
|
41
|
+
* @param {String} name
|
|
42
|
+
*/
|
|
43
|
+
CookieClass.prototype.clearCookie = function (name) {
|
|
44
|
+
this.setCookie({
|
|
45
|
+
name: name,
|
|
46
|
+
value: '',
|
|
47
|
+
exdays: -1,
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
return CookieClass;
|
|
51
|
+
}());
|
|
52
|
+
var cookie = new CookieClass();
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* @Author: wanghui
|
|
56
|
+
* createBy: @2020.05.21
|
|
57
|
+
*/
|
|
58
|
+
// import date from './modules/date'
|
|
59
|
+
// import dom from './modules/dom'
|
|
60
|
+
// import filter from './modules/filter'
|
|
61
|
+
// import format from './modules/format'
|
|
62
|
+
// import match from './modules/match'
|
|
63
|
+
// import number from './modules/number'
|
|
64
|
+
// import tools from './modules/tools'
|
|
65
|
+
var modules = {
|
|
66
|
+
cookie: cookie,
|
|
67
|
+
};
|
|
68
|
+
var Utils = /** @class */ (function () {
|
|
69
|
+
function Utils() {
|
|
70
|
+
Object.assign(this, modules);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 挂载各组件
|
|
74
|
+
* 示例:this.$cookie、this.$date、this.$match、this.$number、this.$tools
|
|
75
|
+
* @param {Object} app 需要挂载的目标对象
|
|
76
|
+
*/
|
|
77
|
+
Utils.prototype.install = function (app) {
|
|
78
|
+
Object.keys(modules).forEach(function (key) {
|
|
79
|
+
if (key === 'filter') {
|
|
80
|
+
return modules[key].install(app);
|
|
81
|
+
}
|
|
82
|
+
app.config.globalProperties['$' + key] = modules[key];
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
return Utils;
|
|
86
|
+
}());
|
|
87
|
+
var utils = new Utils();
|
|
88
|
+
|
|
89
|
+
module.exports = utils;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
declare class Utils {
|
|
2
|
+
[key: string]: Object;
|
|
3
|
+
constructor();
|
|
4
|
+
/**
|
|
5
|
+
* 挂载各组件
|
|
6
|
+
* 示例:this.$cookie、this.$date、this.$match、this.$number、this.$tools
|
|
7
|
+
* @param {Object} app 需要挂载的目标对象
|
|
8
|
+
*/
|
|
9
|
+
install(app: any): void;
|
|
10
|
+
}
|
|
11
|
+
declare const utils: Utils;
|
|
12
|
+
export default utils;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Cookie
|
|
3
|
+
* @Author: wanghui
|
|
4
|
+
* @createBy: @2021.01.21
|
|
5
|
+
*/
|
|
6
|
+
var CookieClass = /** @class */ (function () {
|
|
7
|
+
function CookieClass() {
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* 获取cookie
|
|
11
|
+
* @param {String} name
|
|
12
|
+
* @return {String}
|
|
13
|
+
*/
|
|
14
|
+
CookieClass.prototype.getCookie = function (name) {
|
|
15
|
+
var _name = name + '=';
|
|
16
|
+
var ca = document.cookie.split(';');
|
|
17
|
+
for (var i = 0; i < ca.length; i++) {
|
|
18
|
+
var c = ca[i];
|
|
19
|
+
while (c.charAt(0) === ' ')
|
|
20
|
+
c = c.substring(1);
|
|
21
|
+
if (c.includes(_name))
|
|
22
|
+
return c.substring(_name.length, c.length);
|
|
23
|
+
}
|
|
24
|
+
return '';
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* 设置cookie
|
|
28
|
+
* @param {Object} ICookie
|
|
29
|
+
*/
|
|
30
|
+
CookieClass.prototype.setCookie = function (_a) {
|
|
31
|
+
var _b = _a.name, name = _b === void 0 ? '' : _b, _c = _a.value, value = _c === void 0 ? '' : _c, _d = _a.exdays, exdays = _d === void 0 ? -1 : _d, _e = _a.path, path = _e === void 0 ? '/' : _e, _f = _a.domain, domain = _f === void 0 ? '.jddmoto.com' : _f;
|
|
32
|
+
var d = new Date();
|
|
33
|
+
d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
|
|
34
|
+
var expires = "expires=" + d.toUTCString();
|
|
35
|
+
document.cookie = name + "=" + value + ";" + expires + ";path=" + path + ";domain=" + domain + ";";
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* 清除Cookie
|
|
39
|
+
* @param {String} name
|
|
40
|
+
*/
|
|
41
|
+
CookieClass.prototype.clearCookie = function (name) {
|
|
42
|
+
this.setCookie({
|
|
43
|
+
name: name,
|
|
44
|
+
value: '',
|
|
45
|
+
exdays: -1,
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
return CookieClass;
|
|
49
|
+
}());
|
|
50
|
+
var cookie = new CookieClass();
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @Author: wanghui
|
|
54
|
+
* createBy: @2020.05.21
|
|
55
|
+
*/
|
|
56
|
+
// import date from './modules/date'
|
|
57
|
+
// import dom from './modules/dom'
|
|
58
|
+
// import filter from './modules/filter'
|
|
59
|
+
// import format from './modules/format'
|
|
60
|
+
// import match from './modules/match'
|
|
61
|
+
// import number from './modules/number'
|
|
62
|
+
// import tools from './modules/tools'
|
|
63
|
+
var modules = {
|
|
64
|
+
cookie: cookie,
|
|
65
|
+
};
|
|
66
|
+
var Utils = /** @class */ (function () {
|
|
67
|
+
function Utils() {
|
|
68
|
+
Object.assign(this, modules);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 挂载各组件
|
|
72
|
+
* 示例:this.$cookie、this.$date、this.$match、this.$number、this.$tools
|
|
73
|
+
* @param {Object} app 需要挂载的目标对象
|
|
74
|
+
*/
|
|
75
|
+
Utils.prototype.install = function (app) {
|
|
76
|
+
Object.keys(modules).forEach(function (key) {
|
|
77
|
+
if (key === 'filter') {
|
|
78
|
+
return modules[key].install(app);
|
|
79
|
+
}
|
|
80
|
+
app.config.globalProperties['$' + key] = modules[key];
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
return Utils;
|
|
84
|
+
}());
|
|
85
|
+
var utils = new Utils();
|
|
86
|
+
|
|
87
|
+
export { utils as default };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
interface ICookie {
|
|
2
|
+
name: string;
|
|
3
|
+
value: string;
|
|
4
|
+
exdays: number;
|
|
5
|
+
path?: string;
|
|
6
|
+
domain?: string;
|
|
7
|
+
}
|
|
8
|
+
declare class CookieClass {
|
|
9
|
+
/**
|
|
10
|
+
* 获取cookie
|
|
11
|
+
* @param {String} name
|
|
12
|
+
* @return {String}
|
|
13
|
+
*/
|
|
14
|
+
getCookie(name: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* 设置cookie
|
|
17
|
+
* @param {Object} ICookie
|
|
18
|
+
*/
|
|
19
|
+
setCookie({ name, value, exdays, path, domain, }: ICookie): void;
|
|
20
|
+
/**
|
|
21
|
+
* 清除Cookie
|
|
22
|
+
* @param {String} name
|
|
23
|
+
*/
|
|
24
|
+
clearCookie(name: string): void;
|
|
25
|
+
}
|
|
26
|
+
declare const _default: CookieClass;
|
|
27
|
+
export default _default;
|
|
@@ -32,8 +32,8 @@ var CookieClass = /** @class */ (function () {
|
|
|
32
32
|
var _b = _a.name, name = _b === void 0 ? '' : _b, _c = _a.value, value = _c === void 0 ? '' : _c, _d = _a.exdays, exdays = _d === void 0 ? -1 : _d, _e = _a.path, path = _e === void 0 ? '/' : _e, _f = _a.domain, domain = _f === void 0 ? '.jddmoto.com' : _f;
|
|
33
33
|
var d = new Date();
|
|
34
34
|
d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
|
|
35
|
-
var expires = "expires="
|
|
36
|
-
document.cookie =
|
|
35
|
+
var expires = "expires=" + d.toUTCString();
|
|
36
|
+
document.cookie = name + "=" + value + ";" + expires + ";path=" + path + ";domain=" + domain + ";";
|
|
37
37
|
};
|
|
38
38
|
/**
|
|
39
39
|
* 清除Cookie
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -14,7 +14,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
14
14
|
function replacementDate(data, fmt) {
|
|
15
15
|
for (var k in data) {
|
|
16
16
|
if (new RegExp('(' + k + ')').test(fmt)) {
|
|
17
|
-
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (data[k]) : (("00"
|
|
17
|
+
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (data[k]) : (("00" + data[k]).substr(('' + data[k]).length)));
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
return fmt;
|
|
@@ -70,7 +70,7 @@ var DateClass = /** @class */ (function () {
|
|
|
70
70
|
};
|
|
71
71
|
fmt = replacementYear(timeData, fmt);
|
|
72
72
|
if (/(E+)/.test(fmt)) {
|
|
73
|
-
fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? '\u661f\u671f' : '\u5468') : '') + week[
|
|
73
|
+
fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? '\u661f\u671f' : '\u5468') : '') + week[timeData.getDay() + " "]);
|
|
74
74
|
}
|
|
75
75
|
return replacementDate(o, fmt);
|
|
76
76
|
};
|
|
@@ -105,10 +105,10 @@ var DateClass = /** @class */ (function () {
|
|
|
105
105
|
if (ts <= 0)
|
|
106
106
|
return false;
|
|
107
107
|
return {
|
|
108
|
-
dd: (dd < 10 ? "0"
|
|
109
|
-
hh: (hh < 10 ? "0"
|
|
110
|
-
mm: (mm < 10 ? "0"
|
|
111
|
-
ss: (ss < 10 ? "0"
|
|
108
|
+
dd: (dd < 10 ? "0" + dd : dd),
|
|
109
|
+
hh: (hh < 10 ? "0" + hh : hh),
|
|
110
|
+
mm: (mm < 10 ? "0" + mm : mm),
|
|
111
|
+
ss: (ss < 10 ? "0" + ss : ss)
|
|
112
112
|
};
|
|
113
113
|
};
|
|
114
114
|
/**
|
|
@@ -121,19 +121,19 @@ var DateClass = /** @class */ (function () {
|
|
|
121
121
|
var time = currentTime - startTime;
|
|
122
122
|
var year = Math.floor(time / (1000 * 60 * 60 * 24) / 30 / 12);
|
|
123
123
|
if (year)
|
|
124
|
-
return
|
|
124
|
+
return year + "\u5E74\u524D";
|
|
125
125
|
var month = Math.floor(time / (1000 * 60 * 60 * 24) / 30);
|
|
126
126
|
if (month)
|
|
127
|
-
return
|
|
127
|
+
return month + "\u4E2A\u6708\u524D";
|
|
128
128
|
var day = Math.floor(time / (1000 * 60 * 60 * 24));
|
|
129
129
|
if (day)
|
|
130
|
-
return
|
|
130
|
+
return day + "\u5929\u524D";
|
|
131
131
|
var hour = Math.floor(time / (1000 * 60 * 60));
|
|
132
132
|
if (hour)
|
|
133
|
-
return
|
|
133
|
+
return hour + "\u5C0F\u65F6\u524D";
|
|
134
134
|
var min = Math.floor(time / (1000 * 60));
|
|
135
135
|
if (min)
|
|
136
|
-
return
|
|
136
|
+
return min + "\u5206\u949F\u524D";
|
|
137
137
|
else
|
|
138
138
|
return '刚刚';
|
|
139
139
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -48,7 +48,7 @@ var DomClass = /** @class */ (function () {
|
|
|
48
48
|
var value = object[key];
|
|
49
49
|
if (Array.isArray(value)) {
|
|
50
50
|
value.forEach(function (subValue, i) {
|
|
51
|
-
return formData.append(key + "["
|
|
51
|
+
return formData.append(key + ("[" + i + "]"), subValue);
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
54
|
else {
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
declare const dateClass: any;
|
|
2
|
+
declare const numberClass: any;
|
|
3
|
+
declare const toolsClass: any;
|
|
4
|
+
declare class FilterClass {
|
|
5
|
+
/**
|
|
6
|
+
* 格式化时间,示例:1586840260500 | format('YYYY-MM-DD HH:mm:ss')
|
|
7
|
+
* @param {String|Number} date
|
|
8
|
+
* @param {String} fmt 'YYYY-MM-DD HH:mm:ss'
|
|
9
|
+
* @return {String} 'YYYY-MM-DD HH:mm:ss'
|
|
10
|
+
*/
|
|
11
|
+
format(date: string | number, fmt?: string): any;
|
|
12
|
+
/**
|
|
13
|
+
* 格式化金额,示例:123456 | formatMoney
|
|
14
|
+
* @param {Number} num
|
|
15
|
+
* @return {String} 123,456
|
|
16
|
+
*/
|
|
17
|
+
formatMoney(money: number | string): string;
|
|
18
|
+
/**
|
|
19
|
+
* 截取数组或字符串,示例:'1234' | slice(3)
|
|
20
|
+
* @param {Array|String} target 数组或字符串
|
|
21
|
+
* @param {Number} length 截取长度,从0开始
|
|
22
|
+
* @return {any}
|
|
23
|
+
*/
|
|
24
|
+
slice(target?: Array<any> | string, length?: number): any;
|
|
25
|
+
install(app: any): void;
|
|
26
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface Obj {
|
|
2
|
+
[prop: string]: any;
|
|
3
|
+
}
|
|
4
|
+
declare class Format {
|
|
5
|
+
/**
|
|
6
|
+
* @desc 对于对象非数字与布尔值的value,当其为falsy时,转换成separator
|
|
7
|
+
* @param {object} obj 传入的对象
|
|
8
|
+
* @param {string} separator 替换后的值
|
|
9
|
+
* transformObjectNullVal({ a: null, b: 0}, '23') // {a: "23", b: 0}
|
|
10
|
+
* @return {object}
|
|
11
|
+
*/
|
|
12
|
+
transformObjectNullVal<T extends Obj>(obj: T, separator?: string): T;
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
var jsError_1 = require("./lib/jsError");
|
|
7
|
+
var xhr_1 = __importDefault(require("./lib/xhr"));
|
|
8
|
+
// import timing from './lib/timing'
|
|
9
|
+
function setup() {
|
|
10
|
+
jsError_1.injectJsError();
|
|
11
|
+
xhr_1.default();
|
|
12
|
+
}
|
|
13
|
+
exports.default = setup;
|
|
14
|
+
// timing()
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.injectJsError = void 0;
|
|
7
|
+
var tracker_1 = __importDefault(require("../utils/tracker"));
|
|
8
|
+
function injectJsError() {
|
|
9
|
+
window.addEventListener('error', function (e) {
|
|
10
|
+
console.log(e);
|
|
11
|
+
if (e.target && (e.target.src || e.target.href)) {
|
|
12
|
+
tracker_1.default.send({
|
|
13
|
+
kind: 'stability',
|
|
14
|
+
type: 'error',
|
|
15
|
+
errorType: 'resourceError',
|
|
16
|
+
filename: e.target.src || e.target.href,
|
|
17
|
+
tagName: e.target.tagName
|
|
18
|
+
// selector: lastEvent ? get
|
|
19
|
+
});
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
tracker_1.default.send({
|
|
23
|
+
kind: 'stability',
|
|
24
|
+
type: 'error',
|
|
25
|
+
errorType: 'jsError',
|
|
26
|
+
message: e.message,
|
|
27
|
+
filename: e.filename,
|
|
28
|
+
position: e.lineno + ":" + e.colno,
|
|
29
|
+
stack: e.error.stack,
|
|
30
|
+
});
|
|
31
|
+
}, true);
|
|
32
|
+
window.addEventListener('unhandledrejection', function (e) {
|
|
33
|
+
var message, filename, line, column, stack;
|
|
34
|
+
var reason = e.reason;
|
|
35
|
+
if (typeof reason === 'string') {
|
|
36
|
+
message = reason;
|
|
37
|
+
}
|
|
38
|
+
else if (typeof reason === 'object') {
|
|
39
|
+
if (reason.stack) {
|
|
40
|
+
var matchResult = reason.stack.match(/at\s+(.+):(\d+):(\d+)/);
|
|
41
|
+
filename = matchResult[1];
|
|
42
|
+
line = matchResult[2];
|
|
43
|
+
column = matchResult[3];
|
|
44
|
+
}
|
|
45
|
+
message = reason.message;
|
|
46
|
+
stack = reason.stack;
|
|
47
|
+
}
|
|
48
|
+
tracker_1.default.send({
|
|
49
|
+
kind: 'stability',
|
|
50
|
+
type: 'error',
|
|
51
|
+
errorType: 'promiseError',
|
|
52
|
+
message: message,
|
|
53
|
+
filename: filename,
|
|
54
|
+
position: line + ":" + column,
|
|
55
|
+
stack: stack
|
|
56
|
+
// selector: lastEvent ? get
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
exports.injectJsError = injectJsError;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
var onload_1 = __importDefault(require("../utils/onload"));
|
|
7
|
+
var tracker_1 = __importDefault(require("../utils/tracker"));
|
|
8
|
+
function timing() {
|
|
9
|
+
var FMP, LCP;
|
|
10
|
+
new PerformanceObserver(function (entryList, observer) {
|
|
11
|
+
var perfEntries = entryList.getEntries();
|
|
12
|
+
FMP = perfEntries[0];
|
|
13
|
+
observer.disconnect(); // 不再观察
|
|
14
|
+
}).observe({ entryTypes: ['element'] }); // 观察页面中有意义的元素
|
|
15
|
+
new PerformanceObserver(function (entryList, observer) {
|
|
16
|
+
var perfEntries = entryList.getEntries();
|
|
17
|
+
LCP = perfEntries[0];
|
|
18
|
+
observer.disconnect(); // 不再观察
|
|
19
|
+
}).observe({ entryTypes: ['largest-contentful-paint'] }); // 观察页面中最大的元素
|
|
20
|
+
new PerformanceObserver(function (entryList, observer) {
|
|
21
|
+
var firstInput = entryList.getEntries();
|
|
22
|
+
console.log('FID', firstInput);
|
|
23
|
+
if (firstInput) {
|
|
24
|
+
var inputDelay = firstInput.processingStart - firstInput.startTime;
|
|
25
|
+
var duration = firstInput.duration;
|
|
26
|
+
if (inputDelay > 0 || duration > 0) {
|
|
27
|
+
tracker_1.default.send({
|
|
28
|
+
kind: 'experience',
|
|
29
|
+
type: 'firstInputDelay',
|
|
30
|
+
inputDelay: inputDelay,
|
|
31
|
+
duration: duration,
|
|
32
|
+
startTime: firstInput.startTime
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
observer.disconnect(); // 不再观察
|
|
37
|
+
}).observe({ type: 'first-input', buffered: true }); // 观察页面中最大的元素
|
|
38
|
+
onload_1.default(function () {
|
|
39
|
+
setTimeout(function () {
|
|
40
|
+
console.dir(window.performance);
|
|
41
|
+
var _a = performance.getEntriesByType('navigation')[0], fetchStart = _a.fetchStart, connectStart = _a.connectStart, connectEnd = _a.connectEnd, requestStart = _a.requestStart, responseStart = _a.responseStart, responseEnd = _a.responseEnd, domInteractive = _a.domInteractive, domContentLoadedEventStart = _a.domContentLoadedEventStart, domContentLoadedEventEnd = _a.domContentLoadedEventEnd, loadEventStart = _a.loadEventStart;
|
|
42
|
+
tracker_1.default.send({
|
|
43
|
+
kind: 'experience',
|
|
44
|
+
type: 'timing',
|
|
45
|
+
connectTime: connectEnd - connectStart,
|
|
46
|
+
ttfbTime: responseStart - requestStart,
|
|
47
|
+
responseTime: responseEnd - responseStart,
|
|
48
|
+
domContentLoadedTime: domContentLoadedEventEnd - domContentLoadedEventStart,
|
|
49
|
+
timeToInteractive: domInteractive - fetchStart,
|
|
50
|
+
loadTime: loadEventStart - fetchStart // 完整的页面加载时间
|
|
51
|
+
});
|
|
52
|
+
var FP = performance.getEntriesByName('first-paint')[0];
|
|
53
|
+
var FCP = performance.getEntriesByName('first-contentful-paint')[0];
|
|
54
|
+
console.log('FP', FP);
|
|
55
|
+
console.log('FCP', FCP);
|
|
56
|
+
console.log('FMP', FMP);
|
|
57
|
+
console.log('LCP', LCP);
|
|
58
|
+
tracker_1.default.send({
|
|
59
|
+
kind: 'experience',
|
|
60
|
+
type: 'paint',
|
|
61
|
+
FP: FP.startTime,
|
|
62
|
+
FCP: FCP.startTime,
|
|
63
|
+
FMP: FMP.startTime,
|
|
64
|
+
LCP: LCP.startTime,
|
|
65
|
+
});
|
|
66
|
+
}, 3000);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
exports.default = timing;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
var tracker_1 = __importDefault(require("../utils/tracker"));
|
|
7
|
+
function injectXHR() {
|
|
8
|
+
var XMLHttpRequest = window.XMLHttpRequest;
|
|
9
|
+
var oldOpen = XMLHttpRequest.prototype.open;
|
|
10
|
+
XMLHttpRequest.prototype.open = function (method, url, async) {
|
|
11
|
+
this.logData = { method: method, url: url, async: async };
|
|
12
|
+
return oldOpen.apply(this, arguments);
|
|
13
|
+
};
|
|
14
|
+
var oldSend = XMLHttpRequest.prototype.send;
|
|
15
|
+
XMLHttpRequest.prototype.send = function (body) {
|
|
16
|
+
var _this = this;
|
|
17
|
+
if (this.logData) {
|
|
18
|
+
var startTime_1 = Date.now();
|
|
19
|
+
var handler = function (type) { return function (event) {
|
|
20
|
+
var duration = Date.now() - startTime_1;
|
|
21
|
+
var status = _this.status;
|
|
22
|
+
var statusText = _this.statusText;
|
|
23
|
+
tracker_1.default.send({
|
|
24
|
+
kind: 'stability',
|
|
25
|
+
type: 'xhr',
|
|
26
|
+
eventType: event.type,
|
|
27
|
+
pathname: _this.logData.url,
|
|
28
|
+
status: status + '-' + statusText,
|
|
29
|
+
duration: duration,
|
|
30
|
+
response: _this.response ? JSON.stringify(_this.response) : '',
|
|
31
|
+
params: body || ''
|
|
32
|
+
});
|
|
33
|
+
}; };
|
|
34
|
+
this.addEventListener('load', handler('load'), false);
|
|
35
|
+
this.addEventListener('error', handler('error'), false);
|
|
36
|
+
this.addEventListener('abort', handler('abort'), false);
|
|
37
|
+
}
|
|
38
|
+
return oldSend.apply(this, arguments);
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
exports.default = injectXHR;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
var Parser = require('ua-parser-js');
|
|
15
|
+
var SendTracker = /** @class */ (function () {
|
|
16
|
+
function SendTracker() {
|
|
17
|
+
this.url = '';
|
|
18
|
+
this.xhr = new XMLHttpRequest();
|
|
19
|
+
}
|
|
20
|
+
SendTracker.prototype.send = function (data) {
|
|
21
|
+
if (data === void 0) { data = {}; }
|
|
22
|
+
var log = __assign(__assign({}, getExtraData()), data);
|
|
23
|
+
console.log(log);
|
|
24
|
+
};
|
|
25
|
+
return SendTracker;
|
|
26
|
+
}());
|
|
27
|
+
function getExtraData() {
|
|
28
|
+
return {
|
|
29
|
+
title: document.title,
|
|
30
|
+
url: location.href,
|
|
31
|
+
timestamp: Date.now(),
|
|
32
|
+
userAgent: new Parser().getResult()
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
exports.default = new SendTracker();
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
declare class NumberClass {
|
|
2
|
+
/**
|
|
3
|
+
* 个位数前面补0
|
|
4
|
+
* @param {Number} num 需要格式化的数字
|
|
5
|
+
* @return {String} '01'
|
|
6
|
+
*/
|
|
7
|
+
formatNumber(num: number): string;
|
|
8
|
+
/**
|
|
9
|
+
* 将手机号中间部分替换为星号
|
|
10
|
+
* @param {String} phone 手机号码
|
|
11
|
+
* @return {String} 131****1111
|
|
12
|
+
*/
|
|
13
|
+
formatPhone(phone: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* 格式化数字 万
|
|
16
|
+
* @param {Number} num
|
|
17
|
+
* @return {String} 12.3万
|
|
18
|
+
*/
|
|
19
|
+
convertToWan(num: number): string | number;
|
|
20
|
+
/**
|
|
21
|
+
* 格式化数字 k
|
|
22
|
+
* @param {Number} num
|
|
23
|
+
* @return {String} 1.2k
|
|
24
|
+
*/
|
|
25
|
+
convertToThousand(num: number): string | number;
|
|
26
|
+
/**
|
|
27
|
+
* 随机数,指定范围
|
|
28
|
+
* @param {Number} min 开始
|
|
29
|
+
* @param {Number} max 结束
|
|
30
|
+
* @return {Number|Object}
|
|
31
|
+
*/
|
|
32
|
+
random(min: number, max: number): number | null;
|
|
33
|
+
/**
|
|
34
|
+
* 格式化金额
|
|
35
|
+
* @param {Number} num
|
|
36
|
+
* @return {String} 123,456
|
|
37
|
+
*/
|
|
38
|
+
formatMoney(money: number | string, signal: string): string;
|
|
39
|
+
}
|
|
@@ -91,10 +91,10 @@ var NumberClass = /** @class */ (function () {
|
|
|
91
91
|
var price = money.split('.')[0] + '';
|
|
92
92
|
var pricePoint = money.split('.')[1];
|
|
93
93
|
result = price.length > 6 ?
|
|
94
|
-
""
|
|
94
|
+
"" + price.substring(0, price.length - 6) + signal + price.substring(price.length - 6, price.length - 3) + "," + price.substring(price.length - 3, price.length)
|
|
95
95
|
:
|
|
96
|
-
""
|
|
97
|
-
result = pricePoint ? ""
|
|
96
|
+
"" + price.substring(0, price.length - 3) + signal + price.substring(price.length - 3, price.length);
|
|
97
|
+
result = pricePoint ? "" + result + signal + pricePoint : result;
|
|
98
98
|
return result;
|
|
99
99
|
};
|
|
100
100
|
return NumberClass;
|