cwj_monitoring 0.0.15 → 0.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -42
- package/dist/index.d.ts +9 -9
- package/dist/index.js +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
# 介绍
|
|
2
|
-
|
|
3
|
-
一个简易的前端监控 SDK DEMO,仅供学习,请勿在生产环境中使用。
|
|
4
|
-
|
|
5
|
-
## 目前已实现的功能
|
|
6
|
-
|
|
7
|
-
1. 行为监控:点击监控,页面跳转监控,页面停留时间监控
|
|
8
|
-
2. 错误监控:js错误,资源加载错误,手动console.error抛出的错误,promise未捕获的错误
|
|
9
|
-
3. 性能监控:DCL、FP、FCP、LCP、Load、FPS
|
|
10
|
-
|
|
11
|
-
注:目前点击监控只支持button标签触发的点击事件
|
|
12
|
-
|
|
13
|
-
## 源码涉及的设计模式
|
|
14
|
-
1. 单例模式
|
|
15
|
-
2. 代理模式
|
|
16
|
-
3. 模板方法模式
|
|
17
|
-
4. 工厂方法模式
|
|
18
|
-
5. 责任链模式
|
|
19
|
-
|
|
20
|
-
## 安装
|
|
21
|
-
|
|
22
|
-
```
|
|
23
|
-
npm i cwj_monitoring
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## 使用
|
|
27
|
-
|
|
28
|
-
```js
|
|
29
|
-
import { init , TYPES} from 'cwj_monitoring';
|
|
30
|
-
|
|
31
|
-
//使用 init 全局进行初始化
|
|
32
|
-
init({
|
|
33
|
-
url: 'http://localhost:8080', //必传参数,数据上传服务器地址
|
|
34
|
-
max: 10, //可选参数,最大缓存数,即超过缓存数立即上传,默认为5
|
|
35
|
-
time: 60000, //可选参数,最大缓存时间,即超过最大缓存时间立即上传,默认30s
|
|
36
|
-
plugin:[TYPES.ERROR,TYPES.CLICK,TYPES.PERFORMANCE,TYPES.ROUTER],//可选参数,错误事件,点击事件,性能指标,路由,传递几个就调用几个
|
|
37
|
-
data: {}, //可选参数,初始化时外部传入的固定参数,例如项目的名称与版本号data:{vs:'0.1.1'}
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
//无论vue的全局错误捕获,还是react的错误边界,都可使用window.$track.emit手动上传错误
|
|
41
|
-
window.$track.emit(type, data);
|
|
42
|
-
```
|
|
1
|
+
# 介绍
|
|
2
|
+
|
|
3
|
+
一个简易的前端监控 SDK DEMO,仅供学习,请勿在生产环境中使用。
|
|
4
|
+
|
|
5
|
+
## 目前已实现的功能
|
|
6
|
+
|
|
7
|
+
1. 行为监控:点击监控,页面跳转监控,页面停留时间监控
|
|
8
|
+
2. 错误监控:js错误,资源加载错误,手动console.error抛出的错误,promise未捕获的错误
|
|
9
|
+
3. 性能监控:DCL、FP、FCP、LCP、Load、FPS
|
|
10
|
+
|
|
11
|
+
注:目前点击监控只支持button标签触发的点击事件
|
|
12
|
+
|
|
13
|
+
## 源码涉及的设计模式
|
|
14
|
+
1. 单例模式
|
|
15
|
+
2. 代理模式
|
|
16
|
+
3. 模板方法模式
|
|
17
|
+
4. 工厂方法模式
|
|
18
|
+
5. 责任链模式
|
|
19
|
+
|
|
20
|
+
## 安装
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
npm i cwj_monitoring
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## 使用
|
|
27
|
+
|
|
28
|
+
```js
|
|
29
|
+
import { init , TYPES} from 'cwj_monitoring';
|
|
30
|
+
|
|
31
|
+
//使用 init 全局进行初始化
|
|
32
|
+
init({
|
|
33
|
+
url: 'http://localhost:8080', //必传参数,数据上传服务器地址
|
|
34
|
+
max: 10, //可选参数,最大缓存数,即超过缓存数立即上传,默认为5
|
|
35
|
+
time: 60000, //可选参数,最大缓存时间,即超过最大缓存时间立即上传,默认30s
|
|
36
|
+
plugin:[TYPES.ERROR,TYPES.CLICK,TYPES.PERFORMANCE,TYPES.ROUTER],//可选参数,错误事件,点击事件,性能指标,路由,传递几个就调用几个
|
|
37
|
+
data: {}, //可选参数,初始化时外部传入的固定参数,例如项目的名称与版本号data:{vs:'0.1.1'}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
//无论vue的全局错误捕获,还是react的错误边界,都可使用window.$track.emit手动上传错误
|
|
41
|
+
window.$track.emit(type, data);
|
|
42
|
+
```
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
type Plugin = 'error' | 'click' | 'performance' | 'router';
|
|
2
|
-
|
|
3
|
-
//初始化时传入的参数
|
|
4
|
-
interface Options {
|
|
5
|
-
url: string;
|
|
6
|
-
max?: number;
|
|
7
|
-
time?: number;
|
|
8
|
-
plugin?: Plugin[];
|
|
9
|
-
data?: any;
|
|
1
|
+
type Plugin = 'error' | 'click' | 'performance' | 'router';
|
|
2
|
+
|
|
3
|
+
//初始化时传入的参数
|
|
4
|
+
interface Options {
|
|
5
|
+
url: string;
|
|
6
|
+
max?: number;
|
|
7
|
+
time?: number;
|
|
8
|
+
plugin?: Plugin[];
|
|
9
|
+
data?: any;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
declare enum TYPES {
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
class e{name;constructor(e){this.name=e}}var t=new class extends e{constructor(){super("error")}monitor(){this.JSError(),this.resourceError(),this.consoleError(),this.promiseError()}JSError(){window.onerror=(e,t,r,o,n)=>{_.emit("error_js",{msg:e,url:t,line:r,column:o,error:n})}}resourceError(){window.addEventListener("error",(function(e){const{target:t}=e;if(t instanceof HTMLLinkElement||t instanceof HTMLScriptElement||t instanceof HTMLImageElement||t instanceof HTMLAudioElement||t instanceof HTMLVideoElement||t instanceof HTMLIFrameElement){const e=t.src||t.href;_.emit("error_resource",e)}}),!0)}consoleError(){const e=window.console.error;window.console.error=function(t,...r){_.emit("error_console",t),e.apply(window.console,[t,...r])}}promiseError(){window.addEventListener("unhandledrejection",(function(e){e.reason instanceof Error?_.emit("error_promise",e.reason.message):_.emit("error_promise",e.reason)}))}};var r=new class extends e{constructor(){super("pv")}monitor(){this.Hash(),this.History()}Hash(){window.addEventListener("hashchange",(function(){_.emit("hashchange")}))}History(){const e=window.history.pushState,t=window.history.replaceState;window.history.pushState=function(){e.apply(window.history,arguments),_.emit("historychange")},window.history.replaceState=function(){t.apply(window.history,arguments),_.emit("historychange")},window.addEventListener("popstate",(function(){_.emit("historychange")}))}};var o=new class extends e{constructor(){super("behavior")}monitor(){["click"].forEach((function(e){let t;document.addEventListener(e,(r=>{clearTimeout(t),t=setTimeout((()=>{const t=r.target;t instanceof HTMLButtonElement&&_.emit(e,t.textContent)}),300)}),!0)}))}};var n,i=new class extends e{constructor(){super("performance")}monitor(){this.paint(),this.lcp(),this.dcl(),this.load()}paint(){const e=new PerformanceObserver((t=>{for(const e of t.getEntries())"first-paint"===e.name?_.emit("performance_fp",e.startTime):"first-contentful-paint"===e.name&&_.emit("performance_fcp",e.startTime);e.disconnect()}));e.observe({type:"paint",buffered:!0})}lcp(){const e=new PerformanceObserver((t=>{e&&e.disconnect();for(const e of t.getEntries())_.emit("performance_lcp",e.startTime)}));e.observe({type:"largest-contentful-paint",buffered:!0})}dcl(){window.addEventListener("DOMContentLoaded",(function(e){_.emit("performance_DOMContentLoaded",e.timeStamp)}))}load(){window.addEventListener("load",(function(e){_.emit("performance_load",e.timeStamp)}))}},s=new Uint8Array(16);function a(){if(!n&&!(n="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return n(s)}for(var c=[],d=0;d<256;++d)c.push((d+256).toString(16).slice(1));var m={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function u(e,t,r){if(m.randomUUID&&!t&&!e)return m.randomUUID();var o=(e=e||{}).random||(e.rng||a)();if(o[6]=15&o[6]|64,o[8]=63&o[8]|128,t){r=r||0;for(var n=0;n<16;++n)t[r+n]=o[n];return t}return function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return(c[e[t+0]]+c[e[t+1]]+c[e[t+2]]+c[e[t+3]]+"-"+c[e[t+4]]+c[e[t+5]]+"-"+c[e[t+6]]+c[e[t+7]]+"-"+c[e[t+8]]+c[e[t+9]]+"-"+c[e[t+10]]+c[e[t+11]]+c[e[t+12]]+c[e[t+13]]+c[e[t+14]]+c[e[t+15]]).toLowerCase()}(o)}const h="uuid";let l=()=>{const e=(()=>{const e=navigator.userAgent.toLowerCase();return e.indexOf("opera")>-1||e.indexOf("opr")>-1?{browser:"Opera",browser_version:e.match(/ope?ra?\/([\d.]+)/)?.[1]}:e.indexOf("compatible")>-1&&e.indexOf("msie")>-1?{browser:"IE",browser_version:e.match(/(msie\s|trident.*rv:)([\w.]+)/)?.[2]||"IE"}:e.indexOf("edg")>-1?{browser:"Edge",browser_version:e.match(/edge?\/([\d.]+)/)?.[1]}:e.indexOf("firefox")>-1?{browser:"Firefox",browser_version:e.match(/firefox\/([\d.]+)/)?.[1]}:function(){const e=!1;for(const t in navigator.mimeTypes)if("application/360softmgrplugin"===navigator.mimeTypes[t].type)return!e;return e}()&&e.indexOf("safari")>-1?{browser:"360浏览器",browser_version:"Chromium browser"}:e.includes("2345explorer")?{browser:"2345浏览器",browser_version:e.match(/2345explorer\/([\d.]+)/)?.[1]||"Chromium browser"}:e.indexOf("bidubrowser")>-1?{browser:"百度浏览器",browser_version:e.match(/bidubrowser\/([\d.]+)/)?.[1]||"Chromium browser"}:e.indexOf("se 2.x")>-1?{browser:"搜狗浏览器",browser_version:"Chromium browser"}:e.indexOf("safari")>-1&&-1===e.indexOf("chrome")?{browser:"Safari",browser_version:e.match(/version\/([\d.]+)/)?.[1]}:/qqbrowser/.test(e)?{browser:"QQ浏览器",browser_version:e.match(/qqbrowser\/([\d.]+)/)?.[1]}:/micromessenger/i.test(e)?{browser:"微信浏览器",browser_version:e.match(/micromessenger\/([\d.]+)/)?.[1]}:e.indexOf("chrome")>-1&&e.indexOf("safari")>-1?{browser:"Chrome",browser_version:e.match(/chrome\/([\d.]+)/)?.[1]}:{browser:"未检测到的浏览器",browser_version:void 0}})();return l=()=>e,e};function w(){let e=0;const t=window.screen,r=navigator.userAgent.toLowerCase();return void 0!==window.devicePixelRatio?e=window.devicePixelRatio:~r.indexOf("msie")?t.deviceXDPI&&t.logicalXDPI&&(e=t.deviceXDPI/t.logicalXDPI):void 0!==window.outerWidth&&void 0!==window.innerWidth&&(e=window.outerWidth/window.innerWidth),e&&(e=Math.round(100*e)),e}class f{device;uuid;constructor(){this.device=Object.assign({},l(),{width:window.screen.width,height:window.screen.height},{ratio:w(),os:(navigator.userAgent.match(/[(](.*?)[)]/)?.[0]||"").replace(/[()]/g,"")}),localStorage.getItem(h)?this.uuid=localStorage.getItem(h):(this.uuid=u(),localStorage.setItem(h,this.uuid))}}var p=new class{cache;constructor(){this.cache=[]}getLength(){return this.cache.length}add(e){this.cache.push(e)}clear(){this.cache.length=0}};const v=e=>{const t=new Date(e),r=t.getFullYear(),o=t.getMonth()+1,n=t.getDate(),i=t.getHours(),s=t.getMinutes(),a=t.getSeconds(),c=e=>{let t="";return t=e<10?"0"+e:e.toString(),t};return r+"-"+c(o)+"-"+c(n)+" "+c(i)+":"+c(s)+":"+c(a)};class g extends f{url;max;time;timer;visitTime;data;constructor(e){super(),this.url=e.url,this.max=e.max||5,this.time=e.time||3e4,this.timer,this.visitTime=Date.now(),this.data=e.data}formatter(e,t){const r=Date.now(),o=Object.assign({},{device:this.device,uuid:this.uuid},{type:e,data:t,date:v(r),url:window.location.href,referrer:document.referrer,uuid:localStorage.getItem(h),duration:(n=r,i=this.visitTime,n<i&&([n,i]=[i,n]),Math.floor((n-i)/1e3)),userData:this.data});var n,i;return this.visitTime=r,o}send(){var e,t;p.getLength()&&(e=this.url,t=p.cache,navigator.sendBeacon(e,JSON.stringify(t)),p.clear())}emit(e,t){const r=this.formatter(e,t);p.add(r),clearTimeout(this.timer),p.getLength()>=this.max?this.send():this.timer=setTimeout((()=>{this.send()}),this.time)}}function x(e){return/^\d+$/.test(e.toString())}class b{nextValidator;constructor(){this.nextValidator=null}}const E=new class extends b{constructor(){super()}setNext(e){this.nextValidator=e}validate(e){return t=e.url,new RegExp("^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$","i").test(t)?!this.nextValidator||this.nextValidator.validate(e):(console.error("请输入符合规范的url"),!1);var t}},y=new class extends b{constructor(){super()}setNext(e){this.nextValidator=e}validate(e){return e.max&&!x(e.max)?(console.error("max请输入正整数"),!1):!this.nextValidator||this.nextValidator.validate(e)}},O=new class extends b{constructor(){super()}setNext(e){this.nextValidator=e}validate(e){return e.time&&!x(e.time)?(console.error("time请输入正整数"),!1):!this.nextValidator||this.nextValidator.validate(e)}};E.setNext(y),y.setNext(O);var L=(e=>(e.ERROR="error",e.CLICK="click",e.PERFORMANCE="performance",e.ROUTER="router",e))(L||{});let _;function T(e){E.validate(e)&&(_=new g(e),window.$track=_,function(e){const n=e.plugin;n&&n.forEach((e=>{switch(e){case L.CLICK:o.monitor();break;case L.ERROR:t.monitor();break;case L.PERFORMANCE:i.monitor();break;case L.ROUTER:r.monitor()}}))}(e),window.addEventListener("beforeunload",_.send,!0))}const R=function(){let e=!1;return function(t){e||(T(t),e=!0)}}();var S={init:R};export{L as TYPES,S as default,R as init};
|
|
1
|
+
class e{name;constructor(e){this.name=e}}var t=(e=>(e.ERROR="error",e.CLICK="click",e.PERFORMANCE="performance",e.ROUTER="router",e))(t||{}),r=(e=>(e.ERROR_JS="error_js",e.ERROR_PROMISE="error_promise",e.ERROR_RESOURCE="error_resource",e.ROUTER_HASH="hashchange",e.ROUTER_HISTORY="historychange",e.PERFORMANCE_FP="performance_fp",e.PERFORMANCE_FCP="performance_fcp",e.PERFORMANCE_LCP="performance_lcp",e.PERFORMANCE_DOMCONTENTLOADED="performance_DOMContentLoaded",e.PERFORMANCE_LOAD="performance_load",e.BEHAVIOR_CLICK="click",e))(r||{});function n(e){const{error:t,target:n}=e;if(t instanceof Error)return q.emit(r.ERROR_JS,{message:t.message,stack:t.stack,filename:e.filename});if(n instanceof HTMLLinkElement||n instanceof HTMLScriptElement||n instanceof HTMLImageElement||n instanceof HTMLAudioElement||n instanceof HTMLVideoElement||n instanceof HTMLIFrameElement){const e=n.src||n.href;return q.emit(r.ERROR_RESOURCE,{message:`Failed to get resource:${e}`,url:e})}return q.emit(r.ERROR_JS,{message:e.message,filename:e.filename})}function i(e){e.reason instanceof Error?q.emit(r.ERROR_PROMISE,{stack:e.reason.stack,message:e.reason.message}):q.emit(r.ERROR_PROMISE,{message:e.reason})}var s=new class extends e{constructor(){super("error")}monitor(){window.addEventListener("error",n),window.addEventListener("unhandledrejection",i)}};var o=new class extends e{constructor(){super("pv")}monitor(){this.Hash(),this.History()}Hash(){window.addEventListener("hashchange",(function(){q.emit(r.ROUTER_HASH)}))}History(){const e=window.history.pushState,t=window.history.replaceState;window.history.pushState=function(){e.apply(window.history,arguments),q.emit(r.ROUTER_HISTORY)},window.history.replaceState=function(){t.apply(window.history,arguments),q.emit(r.ROUTER_HISTORY)},window.addEventListener("popstate",(function(){q.emit(r.ROUTER_HISTORY)}))}};var a=new class extends e{constructor(){super("behavior")}monitor(){[r.BEHAVIOR_CLICK].forEach((function(e){let t;document.addEventListener(e,(r=>{clearTimeout(t),t=setTimeout((()=>{const t=r.target;t instanceof HTMLButtonElement&&q.emit(e,t.textContent)}),300)}),!0)}))}};var c,u=new class extends e{constructor(){super("performance")}monitor(){this.paint(),this.lcp(),this.dcl(),this.load()}paint(){const e=new PerformanceObserver((t=>{for(const e of t.getEntries())"first-paint"===e.name?q.emit(r.PERFORMANCE_FP,e.startTime):"first-contentful-paint"===e.name&&q.emit(r.PERFORMANCE_FCP,e.startTime);e.disconnect()}));e.observe({type:"paint",buffered:!0})}lcp(){const e=new PerformanceObserver((t=>{e&&e.disconnect();for(const e of t.getEntries())q.emit(r.PERFORMANCE_LCP,e.startTime)}));e.observe({type:"largest-contentful-paint",buffered:!0})}dcl(){window.addEventListener("DOMContentLoaded",(function(e){q.emit(r.PERFORMANCE_DOMCONTENTLOADED,e.timeStamp)}))}load(){window.addEventListener("load",(function(e){q.emit(r.PERFORMANCE_LOAD,e.timeStamp)}))}},d=new Uint8Array(16);function l(){if(!c&&!(c="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return c(d)}for(var f=[],h=0;h<256;++h)f.push((h+256).toString(16).slice(1));var m={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function v(e,t,r){if(m.randomUUID&&!t&&!e)return m.randomUUID();var n=(e=e||{}).random||(e.rng||l)();if(n[6]=15&n[6]|64,n[8]=63&n[8]|128,t){r=r||0;for(var i=0;i<16;++i)t[r+i]=n[i];return t}return function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return(f[e[t+0]]+f[e[t+1]]+f[e[t+2]]+f[e[t+3]]+"-"+f[e[t+4]]+f[e[t+5]]+"-"+f[e[t+6]]+f[e[t+7]]+"-"+f[e[t+8]]+f[e[t+9]]+"-"+f[e[t+10]]+f[e[t+11]]+f[e[t+12]]+f[e[t+13]]+f[e[t+14]]+f[e[t+15]]).toLowerCase()}(n)}const g="track_uuid",p=e=>{const t=new Date(e),r=t.getFullYear(),n=t.getMonth()+1,i=t.getDate(),s=t.getHours(),o=t.getMinutes(),a=t.getSeconds(),c=e=>{let t="";return t=e<10?"0"+e:e.toString(),t};return r+"-"+c(n)+"-"+c(i)+" "+c(s)+":"+c(o)+":"+c(a)};function b(e){return/^\d+$/.test(e.toString())}const w=window.requestIdleCallback||window.requestAnimationFrame||(e=>window.setTimeout(e,1e3/60));class y{nextValidator;constructor(){this.nextValidator=null}}const M=new class extends y{constructor(){super()}setNext(e){this.nextValidator=e}validate(e){return t=e.url,new RegExp("^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$","i").test(t)?!this.nextValidator||this.nextValidator.validate(e):(console.error("请输入符合规范的url"),!1);var t}},S=new class extends y{constructor(){super()}setNext(e){this.nextValidator=e}validate(e){return e.max&&!b(e.max)?(console.error("max请输入正整数"),!1):!this.nextValidator||this.nextValidator.validate(e)}},k=new class extends y{constructor(){super()}setNext(e){this.nextValidator=e}validate(e){return e.time&&!b(e.time)?(console.error("time请输入正整数"),!1):!this.nextValidator||this.nextValidator.validate(e)}};function R(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function E(e){return E="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},E(e)}function O(e){var t=function(e,t){if("object"!=E(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!=E(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==E(t)?t:t+""}function F(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,O(n.key),n)}}function _(e,t,r){return t&&F(e.prototype,t),r&&F(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}M.setNext(S),S.setNext(k);var B={"Amazon Silk":"amazon_silk","Android Browser":"android",Bada:"bada",BlackBerry:"blackberry",Chrome:"chrome",Chromium:"chromium",Electron:"electron",Epiphany:"epiphany",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot","Internet Explorer":"ie","K-Meleon":"k_meleon",Maxthon:"maxthon","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver",Opera:"opera","Opera Coast":"opera_coast",PhantomJS:"phantomjs",Puffin:"puffin",QupZilla:"qupzilla",QQ:"qq",QQLite:"qqlite",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SeaMonkey:"seamonkey",Sleipnir:"sleipnir",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat","Yandex Browser":"yandex",Roku:"roku"},x={amazon_silk:"Amazon Silk",android:"Android Browser",bada:"Bada",blackberry:"BlackBerry",chrome:"Chrome",chromium:"Chromium",electron:"Electron",epiphany:"Epiphany",firefox:"Firefox",focus:"Focus",generic:"Generic",googlebot:"Googlebot",google_search:"Google Search",ie:"Internet Explorer",k_meleon:"K-Meleon",maxthon:"Maxthon",edge:"Microsoft Edge",mz:"MZ Browser",naver:"NAVER Whale Browser",opera:"Opera",opera_coast:"Opera Coast",phantomjs:"PhantomJS",puffin:"Puffin",qupzilla:"QupZilla",qq:"QQ Browser",qqlite:"QQ Browser Lite",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",sleipnir:"Sleipnir",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yandex:"Yandex Browser"},P={tablet:"tablet",mobile:"mobile",desktop:"desktop",tv:"tv"},A={WindowsPhone:"Windows Phone",Windows:"Windows",MacOS:"macOS",iOS:"iOS",Android:"Android",WebOS:"WebOS",BlackBerry:"BlackBerry",Bada:"Bada",Tizen:"Tizen",Linux:"Linux",ChromeOS:"Chrome OS",PlayStation4:"PlayStation 4",Roku:"Roku"},N={EdgeHTML:"EdgeHTML",Blink:"Blink",Trident:"Trident",Presto:"Presto",Gecko:"Gecko",WebKit:"WebKit"},C=function(){function e(){R(this,e)}return _(e,null,[{key:"getFirstMatch",value:function(e,t){var r=t.match(e);return r&&r.length>0&&r[1]||""}},{key:"getSecondMatch",value:function(e,t){var r=t.match(e);return r&&r.length>1&&r[2]||""}},{key:"matchAndReturnConst",value:function(e,t,r){if(e.test(t))return r}},{key:"getWindowsVersionName",value:function(e){switch(e){case"NT":return"NT";case"XP":case"NT 5.1":return"XP";case"NT 5.0":return"2000";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}}},{key:"getMacOSVersionName",value:function(e){var t=e.split(".").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),10===t[0])switch(t[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}}},{key:"getAndroidVersionName",value:function(e){var t=e.split(".").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),!(1===t[0]&&t[1]<5))return 1===t[0]&&t[1]<6?"Cupcake":1===t[0]&&t[1]>=6?"Donut":2===t[0]&&t[1]<2?"Eclair":2===t[0]&&2===t[1]?"Froyo":2===t[0]&&t[1]>2?"Gingerbread":3===t[0]?"Honeycomb":4===t[0]&&t[1]<1?"Ice Cream Sandwich":4===t[0]&&t[1]<4?"Jelly Bean":4===t[0]&&t[1]>=4?"KitKat":5===t[0]?"Lollipop":6===t[0]?"Marshmallow":7===t[0]?"Nougat":8===t[0]?"Oreo":9===t[0]?"Pie":void 0}},{key:"getVersionPrecision",value:function(e){return e.split(".").length}},{key:"compareVersions",value:function(t,r){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=e.getVersionPrecision(t),s=e.getVersionPrecision(r),o=Math.max(i,s),a=0,c=e.map([t,r],(function(t){var r=o-e.getVersionPrecision(t),n=t+new Array(r+1).join(".0");return e.map(n.split("."),(function(e){return new Array(20-e.length).join("0")+e})).reverse()}));for(n&&(a=o-Math.min(i,s)),o-=1;o>=a;){if(c[0][o]>c[1][o])return 1;if(c[0][o]===c[1][o]){if(o===a)return 0;o-=1}else if(c[0][o]<c[1][o])return-1}}},{key:"map",value:function(e,t){var r,n=[];if(Array.prototype.map)return Array.prototype.map.call(e,t);for(r=0;r<e.length;r+=1)n.push(t(e[r]));return n}},{key:"find",value:function(e,t){var r,n;if(Array.prototype.find)return Array.prototype.find.call(e,t);for(r=0,n=e.length;r<n;r+=1){var i=e[r];if(t(i,r))return i}}},{key:"assign",value:function(e){for(var t,r,n=e,i=arguments.length,s=new Array(i>1?i-1:0),o=1;o<i;o++)s[o-1]=arguments[o];if(Object.assign)return Object.assign.apply(Object,[e].concat(s));var a=function(){var e=s[t];"object"===E(e)&&null!==e&&Object.keys(e).forEach((function(t){n[t]=e[t]}))};for(t=0,r=s.length;t<r;t+=1)a();return e}},{key:"getBrowserAlias",value:function(e){return B[e]}},{key:"getBrowserTypeByAlias",value:function(e){return x[e]||""}}]),e}(),T=/version\/(\d+(\.?_?\d+)+)/i,L=[{test:[/googlebot/i],describe:function(e){var t={name:"Googlebot"},r=C.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,e)||C.getFirstMatch(T,e);return r&&(t.version=r),t}},{test:[/opera/i],describe:function(e){var t={name:"Opera"},r=C.getFirstMatch(T,e)||C.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/opr\/|opios/i],describe:function(e){var t={name:"Opera"},r=C.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,e)||C.getFirstMatch(T,e);return r&&(t.version=r),t}},{test:[/SamsungBrowser/i],describe:function(e){var t={name:"Samsung Internet for Android"},r=C.getFirstMatch(T,e)||C.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Whale/i],describe:function(e){var t={name:"NAVER Whale Browser"},r=C.getFirstMatch(T,e)||C.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MZBrowser/i],describe:function(e){var t={name:"MZ Browser"},r=C.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,e)||C.getFirstMatch(T,e);return r&&(t.version=r),t}},{test:[/focus/i],describe:function(e){var t={name:"Focus"},r=C.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,e)||C.getFirstMatch(T,e);return r&&(t.version=r),t}},{test:[/swing/i],describe:function(e){var t={name:"Swing"},r=C.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,e)||C.getFirstMatch(T,e);return r&&(t.version=r),t}},{test:[/coast/i],describe:function(e){var t={name:"Opera Coast"},r=C.getFirstMatch(T,e)||C.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe:function(e){var t={name:"Opera Touch"},r=C.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,e)||C.getFirstMatch(T,e);return r&&(t.version=r),t}},{test:[/yabrowser/i],describe:function(e){var t={name:"Yandex Browser"},r=C.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,e)||C.getFirstMatch(T,e);return r&&(t.version=r),t}},{test:[/ucbrowser/i],describe:function(e){var t={name:"UC Browser"},r=C.getFirstMatch(T,e)||C.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Maxthon|mxios/i],describe:function(e){var t={name:"Maxthon"},r=C.getFirstMatch(T,e)||C.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/epiphany/i],describe:function(e){var t={name:"Epiphany"},r=C.getFirstMatch(T,e)||C.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/puffin/i],describe:function(e){var t={name:"Puffin"},r=C.getFirstMatch(T,e)||C.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sleipnir/i],describe:function(e){var t={name:"Sleipnir"},r=C.getFirstMatch(T,e)||C.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/k-meleon/i],describe:function(e){var t={name:"K-Meleon"},r=C.getFirstMatch(T,e)||C.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/micromessenger/i],describe:function(e){var t={name:"WeChat"},r=C.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,e)||C.getFirstMatch(T,e);return r&&(t.version=r),t}},{test:[/qqbrowser/i],describe:function(e){var t={name:/qqbrowserlite/i.test(e)?"QQ Browser Lite":"QQ Browser"},r=C.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,e)||C.getFirstMatch(T,e);return r&&(t.version=r),t}},{test:[/msie|trident/i],describe:function(e){var t={name:"Internet Explorer"},r=C.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/\sedg\//i],describe:function(e){var t={name:"Microsoft Edge"},r=C.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/edg([ea]|ios)/i],describe:function(e){var t={name:"Microsoft Edge"},r=C.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/vivaldi/i],describe:function(e){var t={name:"Vivaldi"},r=C.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/seamonkey/i],describe:function(e){var t={name:"SeaMonkey"},r=C.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sailfish/i],describe:function(e){var t={name:"Sailfish"},r=C.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,e);return r&&(t.version=r),t}},{test:[/silk/i],describe:function(e){var t={name:"Amazon Silk"},r=C.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/phantom/i],describe:function(e){var t={name:"PhantomJS"},r=C.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/slimerjs/i],describe:function(e){var t={name:"SlimerJS"},r=C.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(e){var t={name:"BlackBerry"},r=C.getFirstMatch(T,e)||C.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t={name:"WebOS Browser"},r=C.getFirstMatch(T,e)||C.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/bada/i],describe:function(e){var t={name:"Bada"},r=C.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/tizen/i],describe:function(e){var t={name:"Tizen"},r=C.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,e)||C.getFirstMatch(T,e);return r&&(t.version=r),t}},{test:[/qupzilla/i],describe:function(e){var t={name:"QupZilla"},r=C.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,e)||C.getFirstMatch(T,e);return r&&(t.version=r),t}},{test:[/firefox|iceweasel|fxios/i],describe:function(e){var t={name:"Firefox"},r=C.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/electron/i],describe:function(e){var t={name:"Electron"},r=C.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MiuiBrowser/i],describe:function(e){var t={name:"Miui"},r=C.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/chromium/i],describe:function(e){var t={name:"Chromium"},r=C.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,e)||C.getFirstMatch(T,e);return r&&(t.version=r),t}},{test:[/chrome|crios|crmo/i],describe:function(e){var t={name:"Chrome"},r=C.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/GSA/i],describe:function(e){var t={name:"Google Search"},r=C.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t={name:"Android Browser"},r=C.getFirstMatch(T,e);return r&&(t.version=r),t}},{test:[/playstation 4/i],describe:function(e){var t={name:"PlayStation 4"},r=C.getFirstMatch(T,e);return r&&(t.version=r),t}},{test:[/safari|applewebkit/i],describe:function(e){var t={name:"Safari"},r=C.getFirstMatch(T,e);return r&&(t.version=r),t}},{test:[/.*/i],describe:function(e){var t=-1!==e.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return{name:C.getFirstMatch(t,e),version:C.getSecondMatch(t,e)}}}],V=[{test:[/Roku\/DVP/],describe:function(e){var t=C.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,e);return{name:A.Roku,version:t}}},{test:[/windows phone/i],describe:function(e){var t=C.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,e);return{name:A.WindowsPhone,version:t}}},{test:[/windows /i],describe:function(e){var t=C.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,e),r=C.getWindowsVersionName(t);return{name:A.Windows,version:t,versionName:r}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(e){var t={name:A.iOS},r=C.getSecondMatch(/(Version\/)(\d[\d.]+)/,e);return r&&(t.version=r),t}},{test:[/macintosh/i],describe:function(e){var t=C.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,e).replace(/[_\s]/g,"."),r=C.getMacOSVersionName(t),n={name:A.MacOS,version:t};return r&&(n.versionName=r),n}},{test:[/(ipod|iphone|ipad)/i],describe:function(e){var t=C.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,e).replace(/[_\s]/g,".");return{name:A.iOS,version:t}}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t=C.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,e),r=C.getAndroidVersionName(t),n={name:A.Android,version:t};return r&&(n.versionName=r),n}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t=C.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,e),r={name:A.WebOS};return t&&t.length&&(r.version=t),r}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(e){var t=C.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,e)||C.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,e)||C.getFirstMatch(/\bbb(\d+)/i,e);return{name:A.BlackBerry,version:t}}},{test:[/bada/i],describe:function(e){var t=C.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,e);return{name:A.Bada,version:t}}},{test:[/tizen/i],describe:function(e){var t=C.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,e);return{name:A.Tizen,version:t}}},{test:[/linux/i],describe:function(){return{name:A.Linux}}},{test:[/CrOS/],describe:function(){return{name:A.ChromeOS}}},{test:[/PlayStation 4/],describe:function(e){var t=C.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,e);return{name:A.PlayStation4,version:t}}}],I=[{test:[/googlebot/i],describe:function(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe:function(e){var t=C.getFirstMatch(/(can-l01)/i,e)&&"Nova",r={type:P.mobile,vendor:"Huawei"};return t&&(r.model=t),r}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:function(){return{type:P.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe:function(){return{type:P.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(){return{type:P.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe:function(){return{type:P.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe:function(){return{type:P.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:P.tablet}}},{test:function(e){var t=e.test(/ipod|iphone/i),r=e.test(/like (ipod|iphone)/i);return t&&!r},describe:function(e){var t=C.getFirstMatch(/(ipod|iphone)/i,e);return{type:P.mobile,vendor:"Apple",model:t}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:P.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe:function(){return{type:P.mobile}}},{test:function(e){return"blackberry"===e.getBrowserName(!0)},describe:function(){return{type:P.mobile,vendor:"BlackBerry"}}},{test:function(e){return"bada"===e.getBrowserName(!0)},describe:function(){return{type:P.mobile}}},{test:function(e){return"windows phone"===e.getBrowserName()},describe:function(){return{type:P.mobile,vendor:"Microsoft"}}},{test:function(e){var t=Number(String(e.getOSVersion()).split(".")[0]);return"android"===e.getOSName(!0)&&t>=3},describe:function(){return{type:P.tablet}}},{test:function(e){return"android"===e.getOSName(!0)},describe:function(){return{type:P.mobile}}},{test:function(e){return"macos"===e.getOSName(!0)},describe:function(){return{type:P.desktop,vendor:"Apple"}}},{test:function(e){return"windows"===e.getOSName(!0)},describe:function(){return{type:P.desktop}}},{test:function(e){return"linux"===e.getOSName(!0)},describe:function(){return{type:P.desktop}}},{test:function(e){return"playstation 4"===e.getOSName(!0)},describe:function(){return{type:P.tv}}},{test:function(e){return"roku"===e.getOSName(!0)},describe:function(){return{type:P.tv}}}],z=[{test:function(e){return"microsoft edge"===e.getBrowserName(!0)},describe:function(e){if(/\sedg\//i.test(e))return{name:N.Blink};var t=C.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,e);return{name:N.EdgeHTML,version:t}}},{test:[/trident/i],describe:function(e){var t={name:N.Trident},r=C.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){return e.test(/presto/i)},describe:function(e){var t={name:N.Presto},r=C.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=e.test(/gecko/i),r=e.test(/like gecko/i);return t&&!r},describe:function(e){var t={name:N.Gecko},r=C.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(apple)?webkit\/537\.36/i],describe:function(){return{name:N.Blink}}},{test:[/(apple)?webkit/i],describe:function(e){var t={name:N.WebKit},r=C.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}}],U=function(){function e(t){var r=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(R(this,e),null==t||""===t)throw new Error("UserAgent parameter can't be empty");this._ua=t,this.parsedResult={},!0!==r&&this.parse()}return _(e,[{key:"getUA",value:function(){return this._ua}},{key:"test",value:function(e){return e.test(this._ua)}},{key:"parseBrowser",value:function(){var e=this;this.parsedResult.browser={};var t=C.find(L,(function(t){if("function"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some((function(t){return e.test(t)}));throw new Error("Browser's test function is not valid")}));return t&&(this.parsedResult.browser=t.describe(this.getUA())),this.parsedResult.browser}},{key:"getBrowser",value:function(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()}},{key:"getBrowserName",value:function(e){return e?String(this.getBrowser().name).toLowerCase()||"":this.getBrowser().name||""}},{key:"getBrowserVersion",value:function(){return this.getBrowser().version}},{key:"getOS",value:function(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()}},{key:"parseOS",value:function(){var e=this;this.parsedResult.os={};var t=C.find(V,(function(t){if("function"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some((function(t){return e.test(t)}));throw new Error("Browser's test function is not valid")}));return t&&(this.parsedResult.os=t.describe(this.getUA())),this.parsedResult.os}},{key:"getOSName",value:function(e){var t=this.getOS().name;return e?String(t).toLowerCase()||"":t||""}},{key:"getOSVersion",value:function(){return this.getOS().version}},{key:"getPlatform",value:function(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()}},{key:"getPlatformType",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.getPlatform().type;return e?String(t).toLowerCase()||"":t||""}},{key:"parsePlatform",value:function(){var e=this;this.parsedResult.platform={};var t=C.find(I,(function(t){if("function"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some((function(t){return e.test(t)}));throw new Error("Browser's test function is not valid")}));return t&&(this.parsedResult.platform=t.describe(this.getUA())),this.parsedResult.platform}},{key:"getEngine",value:function(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()}},{key:"getEngineName",value:function(e){return e?String(this.getEngine().name).toLowerCase()||"":this.getEngine().name||""}},{key:"parseEngine",value:function(){var e=this;this.parsedResult.engine={};var t=C.find(z,(function(t){if("function"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some((function(t){return e.test(t)}));throw new Error("Browser's test function is not valid")}));return t&&(this.parsedResult.engine=t.describe(this.getUA())),this.parsedResult.engine}},{key:"parse",value:function(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this}},{key:"getResult",value:function(){return C.assign({},this.parsedResult)}},{key:"satisfies",value:function(e){var t=this,r={},n=0,i={},s=0;if(Object.keys(e).forEach((function(t){var o=e[t];"string"==typeof o?(i[t]=o,s+=1):"object"===E(o)&&(r[t]=o,n+=1)})),n>0){var o=Object.keys(r),a=C.find(o,(function(e){return t.isOS(e)}));if(a){var c=this.satisfies(r[a]);if(void 0!==c)return c}var u=C.find(o,(function(e){return t.isPlatform(e)}));if(u){var d=this.satisfies(r[u]);if(void 0!==d)return d}}if(s>0){var l=Object.keys(i),f=C.find(l,(function(e){return t.isBrowser(e,!0)}));if(void 0!==f)return this.compareVersion(i[f])}}},{key:"isBrowser",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=this.getBrowserName().toLowerCase(),n=e.toLowerCase(),i=C.getBrowserTypeByAlias(n);return t&&i&&(n=i.toLowerCase()),n===r}},{key:"compareVersion",value:function(e){var t=[0],r=e,n=!1,i=this.getBrowserVersion();if("string"==typeof i)return">"===e[0]||"<"===e[0]?(r=e.substr(1),"="===e[1]?(n=!0,r=e.substr(2)):t=[],">"===e[0]?t.push(1):t.push(-1)):"="===e[0]?r=e.substr(1):"~"===e[0]&&(n=!0,r=e.substr(1)),t.indexOf(C.compareVersions(i,r,n))>-1}},{key:"isOS",value:function(e){return this.getOSName(!0)===String(e).toLowerCase()}},{key:"isPlatform",value:function(e){return this.getPlatformType(!0)===String(e).toLowerCase()}},{key:"isEngine",value:function(e){return this.getEngineName(!0)===String(e).toLowerCase()}},{key:"is",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return this.isBrowser(e,t)||this.isOS(e)||this.isPlatform(e)}},{key:"some",value:function(){var e=this;return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).some((function(t){return e.is(t)}))}}]),e}(),H=function(){function e(){R(this,e)}return _(e,null,[{key:"getParser",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if("string"!=typeof e)throw new Error("UserAgent should be a string");return new U(e,t)}},{key:"parse",value:function(e){return new U(e).getResult()}},{key:"BROWSER_MAP",get:function(){return x}},{key:"ENGINE_MAP",get:function(){return N}},{key:"OS_MAP",get:function(){return A}},{key:"PLATFORMS_MAP",get:function(){return P}}]),e}();function W(){let e=0;const t=window.screen,r=navigator.userAgent.toLowerCase();return void 0!==window.devicePixelRatio?e=window.devicePixelRatio:~r.indexOf("msie")?t.deviceXDPI&&t.logicalXDPI&&(e=t.deviceXDPI/t.logicalXDPI):void 0!==window.outerWidth&&void 0!==window.innerWidth&&(e=window.outerWidth/window.innerWidth),e&&(e=Math.round(100*e)),e}class D{device;uuid;constructor(){this.device=function(){const{browser:e,os:t,platform:r}=H.parse(window.navigator.userAgent);return{browser:e,os:t,platform:r,ratio:W(),wh:{width:window.screen.width,height:window.screen.height}}}(),localStorage.getItem(g)?this.uuid=localStorage.getItem(g):(this.uuid=v(),localStorage.setItem(g,this.uuid))}}class j extends D{url;max;time;timer;visitTime;data;events;constructor(e){var t;super(),this.url=e.url,this.max=e.max||5,this.time=e.time||3e4,this.timer,this.visitTime=Date.now(),this.data=e.data,this.events=[],t=this.send.bind(this,!0),window.addEventListener("beforeunload",(()=>{t()}))}formatter(e,t){const r=Date.now(),n=Object.assign({},{device:this.device,uuid:this.uuid},{type:e,data:t,date:p(r),url:window.location.href,referrer:document.referrer,uuid:localStorage.getItem(g),duration:(i=r,s=this.visitTime,i<s&&([i,s]=[s,i]),Math.floor((i-s)/1e3)),userData:this.data});var i,s;return this.visitTime=r,n}send(e){if(this.events.length){console.log("this.events",this.events);const t=e?this.events.length:this.max,r=this.events.slice(0,t);this.events=this.events.slice(t),this.safeSend(r),this.events.length&&w(this.send.bind(this,!1))}}emit(e,t){const r=this.formatter(e,t);console.log("info",r),this.events.push(r),this.timer&&clearTimeout(this.timer),this.events.length>=this.max?this.send(!1):this.timer=setTimeout((()=>{this.send(!1)}),this.time)}safeSend(e){if(e.length)if(window.navigator.sendBeacon instanceof Function)window.navigator.sendBeacon(this.url,JSON.stringify(e));else{const t=new XMLHttpRequest;t.open("POST",this.url,!0),t.send(JSON.stringify(e))}}}let q;function G(e){M.validate(e)&&(q=new j(e),window.$track=q,function(e){const r=e.plugin;r&&r.forEach((e=>{switch(e){case t.CLICK:a.monitor();break;case t.ERROR:s.monitor();break;case t.PERFORMANCE:u.monitor();break;case t.ROUTER:o.monitor()}}))}(e))}const Q=function(){let e=!1;return function(t){e||(G(t),e=!0)}}();var K={init:Q};export{t as TYPES,K as default,Q as init};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cwj_monitoring",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.18",
|
|
4
4
|
"description": "基于 JS 适用Web端的插件,为前端项目提供【 行为、性能、异常 】监控手段",
|
|
5
5
|
"repository": "https://github.com/cwjbjy/cwj_monitoring",
|
|
6
6
|
"main": "dist",
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
"@babel/core": "^7.22.10",
|
|
29
29
|
"@babel/plugin-transform-runtime": "^7.22.10",
|
|
30
30
|
"@babel/preset-env": "^7.22.10",
|
|
31
|
+
"@changesets/cli": "^2.27.11",
|
|
31
32
|
"@commitlint/cli": "^17.7.1",
|
|
32
33
|
"@commitlint/config-conventional": "^17.7.0",
|
|
33
34
|
"@rollup/plugin-alias": "^5.0.0",
|
|
@@ -47,7 +48,6 @@
|
|
|
47
48
|
"husky": "^8.0.3",
|
|
48
49
|
"lint-staged": "^14.0.1",
|
|
49
50
|
"prettier": "^3.0.3",
|
|
50
|
-
"rimraf": "^5.0.1",
|
|
51
51
|
"rollup": "^3.27.2",
|
|
52
52
|
"rollup-plugin-delete": "^2.0.0",
|
|
53
53
|
"rollup-plugin-dts": "^6.1.0",
|
|
@@ -57,6 +57,7 @@
|
|
|
57
57
|
"typescript": "^5.1.6"
|
|
58
58
|
},
|
|
59
59
|
"dependencies": {
|
|
60
|
+
"bowser": "^2.11.0",
|
|
60
61
|
"uuid": "^9.0.0"
|
|
61
62
|
},
|
|
62
63
|
"lint-staged": {
|