cwj_monitoring 0.0.20 → 0.0.22
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 +38 -29
- package/dist/index.js +1 -1
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -1,42 +1,51 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 🚀 前端监控 SDK DEMO
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> ⚠️ **注意**:这是一个简易的前端监控 SDK DEMO,仅供学习使用,请勿在生产环境中使用!
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 🌟 功能概览
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
| 功能类别 | 具体功能 | 状态 |
|
|
8
|
+
|----------------|--------------------------------------------------------------------------|------|
|
|
9
|
+
| **行为监控** | 🔍 点击监控、🔄 页面跳转监控、⏱️ 页面停留时间监控 | ✅ |
|
|
10
|
+
| **错误监控** | ❌ JS错误、🖼️ 资源加载错误、💻 console.error错误、🤞 Promise未捕获错误 | ✅ |
|
|
11
|
+
| **性能监控** | ⚡ DCL、FP、FCP、LCP、Load、FPS 等性能指标 | ✅ |
|
|
10
12
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
## 源码涉及的设计模式
|
|
14
|
-
1. 单例模式
|
|
15
|
-
2. 代理模式
|
|
16
|
-
3. 模板方法模式
|
|
17
|
-
4. 工厂方法模式
|
|
18
|
-
5. 责任链模式
|
|
19
|
-
|
|
20
|
-
## 安装
|
|
13
|
+
## 📦 安装
|
|
21
14
|
|
|
15
|
+
```bash
|
|
16
|
+
npm install cwj_monitoring
|
|
22
17
|
```
|
|
23
|
-
npm i cwj_monitoring
|
|
24
|
-
```
|
|
25
18
|
|
|
26
|
-
##
|
|
19
|
+
## 🛠️ 使用指南
|
|
20
|
+
|
|
21
|
+
1.基础用法
|
|
27
22
|
|
|
28
23
|
```js
|
|
29
|
-
import { init
|
|
24
|
+
import { init, TYPES } from 'cwj_monitoring';
|
|
30
25
|
|
|
31
|
-
//使用 init 全局进行初始化
|
|
32
26
|
init({
|
|
33
|
-
url: 'http://localhost:8080',
|
|
34
|
-
max: 10,
|
|
35
|
-
time: 60000,
|
|
36
|
-
plugin:[
|
|
37
|
-
|
|
27
|
+
url: 'http://localhost:8080', // 🔴 必填 - 数据上报地址
|
|
28
|
+
max: 10, // 🔵 可选 - 最大缓存数(默认5)
|
|
29
|
+
time: 60000, // 🔵 可选 - 最大缓存时间(默认30s)
|
|
30
|
+
plugin: [ // 🔵 可选 - 要启用的插件,不传plugin则启动所有插件
|
|
31
|
+
TYPES.ERROR, // 错误监控
|
|
32
|
+
TYPES.CLICK, // 点击监控
|
|
33
|
+
TYPES.PERFORMANCE, // 性能监控
|
|
34
|
+
TYPES.ROUTER // 路由监控
|
|
35
|
+
],
|
|
36
|
+
data: { // 🔵 可选 - 自定义元数据
|
|
37
|
+
vs: '0.1.1', // 版本号
|
|
38
|
+
env: 'production' // 环境标识
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
```
|
|
42
|
+
2.手动上报错误
|
|
43
|
+
```js
|
|
44
|
+
// 适用于Vue/React等框架的错误捕获
|
|
45
|
+
window.$track.emit('ERROR_TYPE', {
|
|
46
|
+
message: '自定义错误信息',
|
|
47
|
+
// 其他错误详情...
|
|
38
48
|
});
|
|
39
|
-
|
|
40
|
-
//无论vue的全局错误捕获,还是react的错误边界,都可使用window.$track.emit手动上传错误
|
|
41
|
-
window.$track.emit(type, data);
|
|
42
49
|
```
|
|
50
|
+
## 🤝 参与贡献
|
|
51
|
+
欢迎提交Issue或PR!🎉
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
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){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);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};
|
|
1
|
+
var e,t=new Uint8Array(16);function r(){if(!e&&!(e="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 e(t)}for(var i=[],n=0;n<256;++n)i.push((n+256).toString(16).slice(1));var s={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function o(e,t,n){if(s.randomUUID&&!t&&!e)return s.randomUUID();var o=(e=e||{}).random||(e.rng||r)();if(o[6]=15&o[6]|64,o[8]=63&o[8]|128,t){n=n||0;for(var a=0;a<16;++a)t[n+a]=o[a];return t}return function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return(i[e[t+0]]+i[e[t+1]]+i[e[t+2]]+i[e[t+3]]+"-"+i[e[t+4]]+i[e[t+5]]+"-"+i[e[t+6]]+i[e[t+7]]+"-"+i[e[t+8]]+i[e[t+9]]+"-"+i[e[t+10]]+i[e[t+11]]+i[e[t+12]]+i[e[t+13]]+i[e[t+14]]+i[e[t+15]]).toLowerCase()}(o)}const a="track_uuid",c=e=>{const t=new Date(e),r=t.getFullYear(),i=t.getMonth()+1,n=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(i)+"-"+c(n)+" "+c(s)+":"+c(o)+":"+c(a)};function u(e){return/^\d+$/.test(e.toString())}const d=window.requestIdleCallback||window.requestAnimationFrame||(e=>window.setTimeout(e,1e3/60));class l{nextValidator;constructor(){this.nextValidator=null}}const h=new class extends l{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}},f=new class extends l{constructor(){super()}setNext(e){this.nextValidator=e}validate(e){return e.max&&!u(e.max)?(console.error("max请输入正整数"),!1):!this.nextValidator||this.nextValidator.validate(e)}},m=new class extends l{constructor(){super()}setNext(e){this.nextValidator=e}validate(e){return e.time&&!u(e.time)?(console.error("time请输入正整数"),!1):!this.nextValidator||this.nextValidator.validate(e)}};function g(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function p(e){return p="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},p(e)}function v(e){var t=function(e,t){if("object"!=p(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var i=r.call(e,t||"default");if("object"!=p(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==p(t)?t:t+""}function w(e,t){for(var r=0;r<t.length;r++){var i=t[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,v(i.key),i)}}function b(e,t,r){return t&&w(e.prototype,t),r&&w(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}h.setNext(f),f.setNext(m);var y={"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"},M={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"},k={tablet:"tablet",mobile:"mobile",desktop:"desktop",tv:"tv"},S={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"},E={EdgeHTML:"EdgeHTML",Blink:"Blink",Trident:"Trident",Presto:"Presto",Gecko:"Gecko",WebKit:"WebKit"},F=function(){function e(){g(this,e)}return b(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 i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=e.getVersionPrecision(t),s=e.getVersionPrecision(r),o=Math.max(n,s),a=0,c=e.map([t,r],(function(t){var r=o-e.getVersionPrecision(t),i=t+new Array(r+1).join(".0");return e.map(i.split("."),(function(e){return new Array(20-e.length).join("0")+e})).reverse()}));for(i&&(a=o-Math.min(n,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,i=[];if(Array.prototype.map)return Array.prototype.map.call(e,t);for(r=0;r<e.length;r+=1)i.push(t(e[r]));return i}},{key:"find",value:function(e,t){var r,i;if(Array.prototype.find)return Array.prototype.find.call(e,t);for(r=0,i=e.length;r<i;r+=1){var n=e[r];if(t(n,r))return n}}},{key:"assign",value:function(e){for(var t,r,i=e,n=arguments.length,s=new Array(n>1?n-1:0),o=1;o<n;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"===p(e)&&null!==e&&Object.keys(e).forEach((function(t){i[t]=e[t]}))};for(t=0,r=s.length;t<r;t+=1)a();return e}},{key:"getBrowserAlias",value:function(e){return y[e]}},{key:"getBrowserTypeByAlias",value:function(e){return M[e]||""}}]),e}(),O=/version\/(\d+(\.?_?\d+)+)/i,R=[{test:[/googlebot/i],describe:function(e){var t={name:"Googlebot"},r=F.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/opera/i],describe:function(e){var t={name:"Opera"},r=F.getFirstMatch(O,e)||F.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=F.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/SamsungBrowser/i],describe:function(e){var t={name:"Samsung Internet for Android"},r=F.getFirstMatch(O,e)||F.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=F.getFirstMatch(O,e)||F.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=F.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/focus/i],describe:function(e){var t={name:"Focus"},r=F.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/swing/i],describe:function(e){var t={name:"Swing"},r=F.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/coast/i],describe:function(e){var t={name:"Opera Coast"},r=F.getFirstMatch(O,e)||F.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=F.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/yabrowser/i],describe:function(e){var t={name:"Yandex Browser"},r=F.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/ucbrowser/i],describe:function(e){var t={name:"UC Browser"},r=F.getFirstMatch(O,e)||F.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=F.getFirstMatch(O,e)||F.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=F.getFirstMatch(O,e)||F.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/puffin/i],describe:function(e){var t={name:"Puffin"},r=F.getFirstMatch(O,e)||F.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sleipnir/i],describe:function(e){var t={name:"Sleipnir"},r=F.getFirstMatch(O,e)||F.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=F.getFirstMatch(O,e)||F.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=F.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,e)||F.getFirstMatch(O,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=F.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/msie|trident/i],describe:function(e){var t={name:"Internet Explorer"},r=F.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=F.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=F.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=F.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/seamonkey/i],describe:function(e){var t={name:"SeaMonkey"},r=F.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sailfish/i],describe:function(e){var t={name:"Sailfish"},r=F.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=F.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/phantom/i],describe:function(e){var t={name:"PhantomJS"},r=F.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/slimerjs/i],describe:function(e){var t={name:"SlimerJS"},r=F.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=F.getFirstMatch(O,e)||F.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=F.getFirstMatch(O,e)||F.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=F.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/tizen/i],describe:function(e){var t={name:"Tizen"},r=F.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/qupzilla/i],describe:function(e){var t={name:"QupZilla"},r=F.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/firefox|iceweasel|fxios/i],describe:function(e){var t={name:"Firefox"},r=F.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=F.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MiuiBrowser/i],describe:function(e){var t={name:"Miui"},r=F.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/chromium/i],describe:function(e){var t={name:"Chromium"},r=F.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/chrome|crios|crmo/i],describe:function(e){var t={name:"Chrome"},r=F.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=F.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=F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/playstation 4/i],describe:function(e){var t={name:"PlayStation 4"},r=F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/safari|applewebkit/i],describe:function(e){var t={name:"Safari"},r=F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/.*/i],describe:function(e){var t=-1!==e.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return{name:F.getFirstMatch(t,e),version:F.getSecondMatch(t,e)}}}],P=[{test:[/Roku\/DVP/],describe:function(e){var t=F.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,e);return{name:S.Roku,version:t}}},{test:[/windows phone/i],describe:function(e){var t=F.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,e);return{name:S.WindowsPhone,version:t}}},{test:[/windows /i],describe:function(e){var t=F.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,e),r=F.getWindowsVersionName(t);return{name:S.Windows,version:t,versionName:r}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(e){var t={name:S.iOS},r=F.getSecondMatch(/(Version\/)(\d[\d.]+)/,e);return r&&(t.version=r),t}},{test:[/macintosh/i],describe:function(e){var t=F.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,e).replace(/[_\s]/g,"."),r=F.getMacOSVersionName(t),i={name:S.MacOS,version:t};return r&&(i.versionName=r),i}},{test:[/(ipod|iphone|ipad)/i],describe:function(e){var t=F.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,e).replace(/[_\s]/g,".");return{name:S.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=F.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,e),r=F.getAndroidVersionName(t),i={name:S.Android,version:t};return r&&(i.versionName=r),i}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t=F.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,e),r={name:S.WebOS};return t&&t.length&&(r.version=t),r}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(e){var t=F.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,e)||F.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,e)||F.getFirstMatch(/\bbb(\d+)/i,e);return{name:S.BlackBerry,version:t}}},{test:[/bada/i],describe:function(e){var t=F.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,e);return{name:S.Bada,version:t}}},{test:[/tizen/i],describe:function(e){var t=F.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,e);return{name:S.Tizen,version:t}}},{test:[/linux/i],describe:function(){return{name:S.Linux}}},{test:[/CrOS/],describe:function(){return{name:S.ChromeOS}}},{test:[/PlayStation 4/],describe:function(e){var t=F.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,e);return{name:S.PlayStation4,version:t}}}],_=[{test:[/googlebot/i],describe:function(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe:function(e){var t=F.getFirstMatch(/(can-l01)/i,e)&&"Nova",r={type:k.mobile,vendor:"Huawei"};return t&&(r.model=t),r}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:function(){return{type:k.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe:function(){return{type:k.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(){return{type:k.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe:function(){return{type:k.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe:function(){return{type:k.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:k.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=F.getFirstMatch(/(ipod|iphone)/i,e);return{type:k.mobile,vendor:"Apple",model:t}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:k.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe:function(){return{type:k.mobile}}},{test:function(e){return"blackberry"===e.getBrowserName(!0)},describe:function(){return{type:k.mobile,vendor:"BlackBerry"}}},{test:function(e){return"bada"===e.getBrowserName(!0)},describe:function(){return{type:k.mobile}}},{test:function(e){return"windows phone"===e.getBrowserName()},describe:function(){return{type:k.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:k.tablet}}},{test:function(e){return"android"===e.getOSName(!0)},describe:function(){return{type:k.mobile}}},{test:function(e){return"macos"===e.getOSName(!0)},describe:function(){return{type:k.desktop,vendor:"Apple"}}},{test:function(e){return"windows"===e.getOSName(!0)},describe:function(){return{type:k.desktop}}},{test:function(e){return"linux"===e.getOSName(!0)},describe:function(){return{type:k.desktop}}},{test:function(e){return"playstation 4"===e.getOSName(!0)},describe:function(){return{type:k.tv}}},{test:function(e){return"roku"===e.getOSName(!0)},describe:function(){return{type:k.tv}}}],B=[{test:function(e){return"microsoft edge"===e.getBrowserName(!0)},describe:function(e){if(/\sedg\//i.test(e))return{name:E.Blink};var t=F.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,e);return{name:E.EdgeHTML,version:t}}},{test:[/trident/i],describe:function(e){var t={name:E.Trident},r=F.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:E.Presto},r=F.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:E.Gecko},r=F.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(apple)?webkit\/537\.36/i],describe:function(){return{name:E.Blink}}},{test:[/(apple)?webkit/i],describe:function(e){var t={name:E.WebKit},r=F.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}}],x=function(){function e(t){var r=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(g(this,e),null==t||""===t)throw new Error("UserAgent parameter can't be empty");this._ua=t,this.parsedResult={},!0!==r&&this.parse()}return b(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=F.find(R,(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=F.find(P,(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=F.find(_,(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=F.find(B,(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 F.assign({},this.parsedResult)}},{key:"satisfies",value:function(e){var t=this,r={},i=0,n={},s=0;if(Object.keys(e).forEach((function(t){var o=e[t];"string"==typeof o?(n[t]=o,s+=1):"object"===p(o)&&(r[t]=o,i+=1)})),i>0){var o=Object.keys(r),a=F.find(o,(function(e){return t.isOS(e)}));if(a){var c=this.satisfies(r[a]);if(void 0!==c)return c}var u=F.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(n),h=F.find(l,(function(e){return t.isBrowser(e,!0)}));if(void 0!==h)return this.compareVersion(n[h])}}},{key:"isBrowser",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=this.getBrowserName().toLowerCase(),i=e.toLowerCase(),n=F.getBrowserTypeByAlias(i);return t&&n&&(i=n.toLowerCase()),i===r}},{key:"compareVersion",value:function(e){var t=[0],r=e,i=!1,n=this.getBrowserVersion();if("string"==typeof n)return">"===e[0]||"<"===e[0]?(r=e.substr(1),"="===e[1]?(i=!0,r=e.substr(2)):t=[],">"===e[0]?t.push(1):t.push(-1)):"="===e[0]?r=e.substr(1):"~"===e[0]&&(i=!0,r=e.substr(1)),t.indexOf(F.compareVersions(n,r,i))>-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}(),A=function(){function e(){g(this,e)}return b(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 x(e,t)}},{key:"parse",value:function(e){return new x(e).getResult()}},{key:"BROWSER_MAP",get:function(){return M}},{key:"ENGINE_MAP",get:function(){return E}},{key:"OS_MAP",get:function(){return S}},{key:"PLATFORMS_MAP",get:function(){return k}}]),e}();function C(){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 N{device;uuid;constructor(){this.device=function(){const{browser:e,os:t,platform:r}=A.parse(window.navigator.userAgent);return{browser:e,os:t,platform:r,ratio:C(),wh:{width:window.screen.width,height:window.screen.height}}}(),localStorage.getItem(a)?this.uuid=localStorage.getItem(a):(this.uuid=o(),localStorage.setItem(a,this.uuid))}}class T extends N{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(),i=Object.assign({},{device:this.device,uuid:this.uuid},{type:e,data:t,date:c(r),url:window.location.href,referrer:document.referrer,uuid:localStorage.getItem(a),duration:(n=r,s=this.visitTime,n<s&&([n,s]=[s,n]),Math.floor((n-s)/1e3)),userData:this.data});var n,s;return this.visitTime=r,i}send(e){if(this.events.length){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&&d(this.send.bind(this,!1))}}emit(e,t){const r=this.formatter(e,t);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))}}}class L extends T{pluginMap=new Map;constructor(e){super(e)}use(e){return this.pluginMap.has(e.name)||this.pluginMap.set(e.name,e),this}run(){this.pluginMap.forEach((e=>{e.install(this)}))}}class V{static instance;static plugins=new Map;static registerPlugin(e){this.plugins.set(e.name,e)}static start(e){h.validate(e)&&(this.instance=new L(e),window.$track=this.instance,this.loadPlugins(e))}static loadPlugins(e){const{plugin:t=[]}=e;(t.length>0?t:Array.from(this.plugins.keys())).forEach((e=>{const t=this.plugins.get(e);t&&this.instance.use(t)})),this.instance.run()}}class I{name;track;constructor(e){this.name=e}}var D=(e=>(e.ERROR="error",e.CLICK="click",e.PERFORMANCE="performance",e.ROUTER="router",e))(D||{}),z=(e=>(e.ERROR="error",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))(z||{});var U=new class extends I{originalConsoleError;constructor(){super(D.ERROR)}install(e){this.track=e,this.overrideConsoleError(),this.setupErrorListeners()}overrideConsoleError(){this.originalConsoleError=console.error,console.error=(...e)=>{this.originalConsoleError?.apply(console,e);const t={type:"console",message:e.map((e=>String(e))).join(" "),stack:(new Error).stack};this.track?.emit(z.ERROR,t)}}setupErrorListeners(){window.addEventListener("error",(e=>{this.handleSyncError(e,this.track)}),!0),window.addEventListener("unhandledrejection",(e=>{this.handleAsyncError(e,this.track)}),!0)}handleSyncError(e,t){const r={type:"sync",...this.getErrorDetails(e)};t?.emit(z.ERROR,r)}handleAsyncError(e,t){const r={type:"async",...this.getPromiseErrorDetails(e)};t?.emit(z.ERROR,r)}getPromiseErrorDetails(e){return e.reason instanceof Error?{errorType:"promise",message:e.reason.message,stack:e.reason.stack}:{errorType:"promise",message:String(e.reason)}}getErrorDetails(e){const{error:t,target:r,filename:i,message:n}=e;if(t instanceof Error)return{errorType:"js",message:t.message,stack:t.stack,filename:i,colno:e.colno,lineno:e.lineno};if(this.isResourceError(r)){const e=r.src||r.href;return{errorType:"resource",message:`Resource load failed: ${e}`,url:e}}return{errorType:"unknown",message:n,filename:i}}isResourceError(e){return e&&["LINK","SCRIPT","IMG","AUDIO","VIDEO","IFRAME"].includes(e.tagName)}};var W=new class extends I{constructor(){super(D.ROUTER)}install(e){this.track=e,this.setupHashListener(),this.setupHistoryListener()}setupHashListener(){window.addEventListener("hashchange",(()=>{this.track?.emit(z.ROUTER_HASH)}))}setupHistoryListener(){const e=window.history.pushState,t=window.history.replaceState;window.history.pushState=(...t)=>{e.apply(window.history,t),this.track?.emit(z.ROUTER_HISTORY)},window.history.replaceState=(...e)=>{t.apply(window.history,e),this.track?.emit(z.ROUTER_HISTORY)},window.addEventListener("popstate",(()=>{this.track?.emit(z.ROUTER_HISTORY)}))}};var j=new class extends I{constructor(){super(D.CLICK)}install(e){this.track=e,this.setupClickListeners()}setupClickListeners(){const e=e=>{const t=e.target;if(!t)return;const r={tagName:t.tagName,id:t.id,className:t.className,text:t.textContent?.trim(),xPath:this.getElementXPath(t)};this.track?.emit(z.BEHAVIOR_CLICK,r)};document.addEventListener(z.BEHAVIOR_CLICK,(t=>{setTimeout((()=>e(t)),300)}),!0)}getElementXPath(e){if(!e||1!==e.nodeType)return"";if(e.id)return`//*[@id="${e.id}"]`;const t=Array.from(e.parentNode?.children||[]).filter((t=>t.tagName===e.tagName)).indexOf(e)+1;return`${this.getElementXPath(e.parentNode)}/${e.tagName.toLowerCase()}[${t}]`}};var H=new class extends I{constructor(){super(D.PERFORMANCE)}install(e){this.track=e,this.setupPerformanceMonitoring()}setupPerformanceMonitoring(){this.monitorPaintMetrics(),this.monitorLCP(),this.monitorDCL(),this.monitorLoad()}monitorPaintMetrics(){const e=new PerformanceObserver((t=>{for(const e of t.getEntries())"first-paint"===e.name?this.track?.emit(z.PERFORMANCE_FP,e.startTime):"first-contentful-paint"===e.name&&this.track?.emit(z.PERFORMANCE_FCP,e.startTime);e.disconnect()}));e.observe({type:"paint",buffered:!0})}monitorLCP(){const e=new PerformanceObserver((t=>{e&&e.disconnect();for(const e of t.getEntries())this.track?.emit(z.PERFORMANCE_LCP,e.startTime)}));e.observe({type:"largest-contentful-paint",buffered:!0})}monitorDCL(){window.addEventListener("DOMContentLoaded",(e=>{this.track?.emit(z.PERFORMANCE_DOMCONTENTLOADED,e.timeStamp)}))}monitorLoad(){window.addEventListener("load",(e=>{this.track?.emit(z.PERFORMANCE_LOAD,e.timeStamp)}))}};V.registerPlugin(j),V.registerPlugin(U),V.registerPlugin(H),V.registerPlugin(W);const q=function(){let e=!1;return function(t){e||(V.start(t),e=!0)}}();var G={init:q};export{D as TYPES,G 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.22",
|
|
4
4
|
"description": "基于 JS 适用Web端的插件,为前端项目提供【 行为、性能、异常 】监控手段",
|
|
5
5
|
"repository": "https://github.com/cwjbjy/cwj_monitoring",
|
|
6
6
|
"main": "dist",
|
|
@@ -9,6 +9,9 @@
|
|
|
9
9
|
"scripts": {
|
|
10
10
|
"build": "rollup -c",
|
|
11
11
|
"server": "rollup -c -w",
|
|
12
|
+
"changeset": "changeset",
|
|
13
|
+
"version-packages": "changeset version",
|
|
14
|
+
"publish-packages": "changeset publish",
|
|
12
15
|
"lint": "eslint src --fix --ext .ts,.js --max-warnings 0"
|
|
13
16
|
},
|
|
14
17
|
"files": [
|