cwj_monitoring 0.0.23 → 0.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,893 @@
1
+ 'use strict';
2
+
3
+ const urlAlphabet =
4
+ 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict';
5
+
6
+ /* @ts-self-types="./index.d.ts" */
7
+ let nanoid = (size = 21) => {
8
+ let id = '';
9
+ let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)));
10
+ while (size--) {
11
+ id += urlAlphabet[bytes[size] & 63];
12
+ }
13
+ return id
14
+ };
15
+
16
+ const getDate = (time = Date.now()) => {
17
+ const date = new Date(time);
18
+ const year = date.getFullYear();
19
+ const month = date.getMonth() + 1;
20
+ const day = date.getDate();
21
+ const hour = date.getHours();
22
+ const minute = date.getMinutes();
23
+ const second = date.getSeconds();
24
+ const formatter = (date2) => {
25
+ let res = "";
26
+ if (date2 < 10) {
27
+ res = "0" + date2;
28
+ } else {
29
+ res = date2.toString();
30
+ }
31
+ return res;
32
+ };
33
+ return year + "-" + formatter(month) + "-" + formatter(day) + " " + formatter(hour) + ":" + formatter(minute) + ":" + formatter(second);
34
+ };
35
+ const getSeconds = (timestamp1, timestamp2) => {
36
+ if (timestamp1 < timestamp2) {
37
+ [timestamp1, timestamp2] = [timestamp2, timestamp1];
38
+ }
39
+ return Math.floor((timestamp1 - timestamp2) / 1e3);
40
+ };
41
+
42
+ var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
43
+
44
+ function getDefaultExportFromCjs (x) {
45
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
46
+ }
47
+
48
+ var es5 = {exports: {}};
49
+
50
+ (function (module, exports) {
51
+ !function(e,t){module.exports=t();}(commonjsGlobal,(function(){return function(e){var t={};function r(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=e,r.c=t,r.d=function(e,t,i){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i});},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0});},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(r.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)r.d(i,n,function(t){return e[t]}.bind(null,n));return i},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=90)}({17:function(e,t,r){t.__esModule=!0,t.default=void 0;var i=r(18),n=function(){function e(){}return e.getFirstMatch=function(e,t){var r=t.match(e);return r&&r.length>0&&r[1]||""},e.getSecondMatch=function(e,t){var r=t.match(e);return r&&r.length>1&&r[2]||""},e.matchAndReturnConst=function(e,t,r){if(e.test(t))return r},e.getWindowsVersionName=function(e){switch(e){case"NT":return "NT";case"XP":return "XP";case"NT 5.0":return "2000";case"NT 5.1":return "XP";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}},e.getMacOSVersionName=function(e){var t=e.split(".").splice(0,2).map((function(e){return parseInt(e,10)||0}));t.push(0);var r=t[0],i=t[1];if(10===r)switch(i){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}switch(r){case 11:return "Big Sur";case 12:return "Monterey";case 13:return "Ventura";case 14:return "Sonoma";case 15:return "Sequoia";default:return}},e.getAndroidVersionName=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},e.getVersionPrecision=function(e){return e.split(".").length},e.compareVersions=function(t,r,i){void 0===i&&(i=!1);var n=e.getVersionPrecision(t),a=e.getVersionPrecision(r),o=Math.max(n,a),s=0,u=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&&(s=o-Math.min(n,a)),o-=1;o>=s;){if(u[0][o]>u[1][o])return 1;if(u[0][o]===u[1][o]){if(o===s)return 0;o-=1;}else if(u[0][o]<u[1][o])return -1}},e.map=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},e.find=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}},e.assign=function(e){for(var t,r,i=e,n=arguments.length,a=new Array(n>1?n-1:0),o=1;o<n;o++)a[o-1]=arguments[o];if(Object.assign)return Object.assign.apply(Object,[e].concat(a));var s=function(){var e=a[t];"object"==typeof e&&null!==e&&Object.keys(e).forEach((function(t){i[t]=e[t];}));};for(t=0,r=a.length;t<r;t+=1)s();return e},e.getBrowserAlias=function(e){return i.BROWSER_ALIASES_MAP[e]},e.getBrowserTypeByAlias=function(e){return i.BROWSER_MAP[e]||""},e}();t.default=n,e.exports=t.default;},18:function(e,t,r){t.__esModule=!0,t.ENGINE_MAP=t.OS_MAP=t.PLATFORMS_MAP=t.BROWSER_MAP=t.BROWSER_ALIASES_MAP=void 0;t.BROWSER_ALIASES_MAP={AmazonBot:"amazonbot","Amazon Silk":"amazon_silk","Android Browser":"android",BaiduSpider:"baiduspider",Bada:"bada",BingCrawler:"bingcrawler",BlackBerry:"blackberry","ChatGPT-User":"chatgpt_user",Chrome:"chrome",ClaudeBot:"claudebot",Chromium:"chromium",Diffbot:"diffbot",DuckDuckBot:"duckduckbot",Electron:"electron",Epiphany:"epiphany",FacebookExternalHit:"facebookexternalhit",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot",GPTBot:"gptbot","Internet Explorer":"ie",InternetArchiveCrawler:"internetarchivecrawler","K-Meleon":"k_meleon",LibreWolf:"librewolf",Maxthon:"maxthon","Meta-ExternalAds":"meta_externalads","Meta-ExternalAgent":"meta_externalagent","Meta-ExternalFetcher":"meta_externalfetcher","Meta-WebIndexer":"meta_webindexer","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver","OAI-SearchBot":"oai_searchbot",Omgilibot:"omgilibot",Opera:"opera","Opera Coast":"opera_coast","Pale Moon":"pale_moon",PerplexityBot:"perplexitybot","Perplexity-User":"perplexity_user",PhantomJS:"phantomjs",PingdomBot:"pingdombot",Puffin:"puffin",QQ:"qq",QQLite:"qqlite",QupZilla:"qupzilla",Roku:"roku",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SeaMonkey:"seamonkey",Sleipnir:"sleipnir","Sogou Browser":"sogou",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat",YahooSlurp:"yahooslurp","Yandex Browser":"yandex",YandexBot:"yandexbot",YouBot:"youbot"};t.BROWSER_MAP={amazonbot:"AmazonBot",amazon_silk:"Amazon Silk",android:"Android Browser",baiduspider:"BaiduSpider",bada:"Bada",bingcrawler:"BingCrawler",blackberry:"BlackBerry",chatgpt_user:"ChatGPT-User",chrome:"Chrome",claudebot:"ClaudeBot",chromium:"Chromium",diffbot:"Diffbot",duckduckbot:"DuckDuckBot",edge:"Microsoft Edge",electron:"Electron",epiphany:"Epiphany",facebookexternalhit:"FacebookExternalHit",firefox:"Firefox",focus:"Focus",generic:"Generic",google_search:"Google Search",googlebot:"Googlebot",gptbot:"GPTBot",ie:"Internet Explorer",internetarchivecrawler:"InternetArchiveCrawler",k_meleon:"K-Meleon",librewolf:"LibreWolf",maxthon:"Maxthon",meta_externalads:"Meta-ExternalAds",meta_externalagent:"Meta-ExternalAgent",meta_externalfetcher:"Meta-ExternalFetcher",meta_webindexer:"Meta-WebIndexer",mz:"MZ Browser",naver:"NAVER Whale Browser",oai_searchbot:"OAI-SearchBot",omgilibot:"Omgilibot",opera:"Opera",opera_coast:"Opera Coast",pale_moon:"Pale Moon",perplexitybot:"PerplexityBot",perplexity_user:"Perplexity-User",phantomjs:"PhantomJS",pingdombot:"PingdomBot",puffin:"Puffin",qq:"QQ Browser",qqlite:"QQ Browser Lite",qupzilla:"QupZilla",roku:"Roku",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",sleipnir:"Sleipnir",sogou:"Sogou Browser",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yahooslurp:"YahooSlurp",yandex:"Yandex Browser",yandexbot:"YandexBot",youbot:"YouBot"};t.PLATFORMS_MAP={bot:"bot",desktop:"desktop",mobile:"mobile",tablet:"tablet",tv:"tv"};t.OS_MAP={Android:"Android",Bada:"Bada",BlackBerry:"BlackBerry",ChromeOS:"Chrome OS",HarmonyOS:"HarmonyOS",iOS:"iOS",Linux:"Linux",MacOS:"macOS",PlayStation4:"PlayStation 4",Roku:"Roku",Tizen:"Tizen",WebOS:"WebOS",Windows:"Windows",WindowsPhone:"Windows Phone"};t.ENGINE_MAP={Blink:"Blink",EdgeHTML:"EdgeHTML",Gecko:"Gecko",Presto:"Presto",Trident:"Trident",WebKit:"WebKit"};},90:function(e,t,r){t.__esModule=!0,t.default=void 0;var i,n=(i=r(91))&&i.__esModule?i:{default:i},a=r(18);function o(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,i.key,i);}}var s=function(){function e(){}var t,r,i;return e.getParser=function(e,t){if(void 0===t&&(t=!1),"string"!=typeof e)throw new Error("UserAgent should be a string");return new n.default(e,t)},e.parse=function(e){return new n.default(e).getResult()},t=e,i=[{key:"BROWSER_MAP",get:function(){return a.BROWSER_MAP}},{key:"ENGINE_MAP",get:function(){return a.ENGINE_MAP}},{key:"OS_MAP",get:function(){return a.OS_MAP}},{key:"PLATFORMS_MAP",get:function(){return a.PLATFORMS_MAP}}],(r=null)&&o(t.prototype,r),i&&o(t,i),e}();t.default=s,e.exports=t.default;},91:function(e,t,r){t.__esModule=!0,t.default=void 0;var i=u(r(92)),n=u(r(93)),a=u(r(94)),o=u(r(95)),s=u(r(17));function u(e){return e&&e.__esModule?e:{default:e}}var d=function(){function e(e,t){if(void 0===t&&(t=!1),null==e||""===e)throw new Error("UserAgent parameter can't be empty");this._ua=e,this.parsedResult={},!0!==t&&this.parse();}var t=e.prototype;return t.getUA=function(){return this._ua},t.test=function(e){return e.test(this._ua)},t.parseBrowser=function(){var e=this;this.parsedResult.browser={};var t=s.default.find(i.default,(function(t){if("function"==typeof t.test)return t.test(e);if(Array.isArray(t.test))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},t.getBrowser=function(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()},t.getBrowserName=function(e){return e?String(this.getBrowser().name).toLowerCase()||"":this.getBrowser().name||""},t.getBrowserVersion=function(){return this.getBrowser().version},t.getOS=function(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()},t.parseOS=function(){var e=this;this.parsedResult.os={};var t=s.default.find(n.default,(function(t){if("function"==typeof t.test)return t.test(e);if(Array.isArray(t.test))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},t.getOSName=function(e){var t=this.getOS().name;return e?String(t).toLowerCase()||"":t||""},t.getOSVersion=function(){return this.getOS().version},t.getPlatform=function(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()},t.getPlatformType=function(e){void 0===e&&(e=!1);var t=this.getPlatform().type;return e?String(t).toLowerCase()||"":t||""},t.parsePlatform=function(){var e=this;this.parsedResult.platform={};var t=s.default.find(a.default,(function(t){if("function"==typeof t.test)return t.test(e);if(Array.isArray(t.test))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},t.getEngine=function(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()},t.getEngineName=function(e){return e?String(this.getEngine().name).toLowerCase()||"":this.getEngine().name||""},t.parseEngine=function(){var e=this;this.parsedResult.engine={};var t=s.default.find(o.default,(function(t){if("function"==typeof t.test)return t.test(e);if(Array.isArray(t.test))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},t.parse=function(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this},t.getResult=function(){return s.default.assign({},this.parsedResult)},t.satisfies=function(e){var t=this,r={},i=0,n={},a=0;if(Object.keys(e).forEach((function(t){var o=e[t];"string"==typeof o?(n[t]=o,a+=1):"object"==typeof o&&(r[t]=o,i+=1);})),i>0){var o=Object.keys(r),u=s.default.find(o,(function(e){return t.isOS(e)}));if(u){var d=this.satisfies(r[u]);if(void 0!==d)return d}var c=s.default.find(o,(function(e){return t.isPlatform(e)}));if(c){var f=this.satisfies(r[c]);if(void 0!==f)return f}}if(a>0){var l=Object.keys(n),b=s.default.find(l,(function(e){return t.isBrowser(e,!0)}));if(void 0!==b)return this.compareVersion(n[b])}},t.isBrowser=function(e,t){void 0===t&&(t=!1);var r=this.getBrowserName().toLowerCase(),i=e.toLowerCase(),n=s.default.getBrowserTypeByAlias(i);return t&&n&&(i=n.toLowerCase()),i===r},t.compareVersion=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(s.default.compareVersions(n,r,i))>-1},t.isOS=function(e){return this.getOSName(!0)===String(e).toLowerCase()},t.isPlatform=function(e){return this.getPlatformType(!0)===String(e).toLowerCase()},t.isEngine=function(e){return this.getEngineName(!0)===String(e).toLowerCase()},t.is=function(e,t){return void 0===t&&(t=!1),this.isBrowser(e,t)||this.isOS(e)||this.isPlatform(e)},t.some=function(e){var t=this;return void 0===e&&(e=[]),e.some((function(e){return t.is(e)}))},e}();t.default=d,e.exports=t.default;},92:function(e,t,r){t.__esModule=!0,t.default=void 0;var i,n=(i=r(17))&&i.__esModule?i:{default:i};var a=/version\/(\d+(\.?_?\d+)+)/i,o=[{test:[/gptbot/i],describe:function(e){var t={name:"GPTBot"},r=n.default.getFirstMatch(/gptbot\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/chatgpt-user/i],describe:function(e){var t={name:"ChatGPT-User"},r=n.default.getFirstMatch(/chatgpt-user\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/oai-searchbot/i],describe:function(e){var t={name:"OAI-SearchBot"},r=n.default.getFirstMatch(/oai-searchbot\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/claudebot/i,/claude-web/i,/claude-user/i,/claude-searchbot/i],describe:function(e){var t={name:"ClaudeBot"},r=n.default.getFirstMatch(/(?:claudebot|claude-web|claude-user|claude-searchbot)\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/omgilibot/i,/webzio-extended/i],describe:function(e){var t={name:"Omgilibot"},r=n.default.getFirstMatch(/(?:omgilibot|webzio-extended)\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/diffbot/i],describe:function(e){var t={name:"Diffbot"},r=n.default.getFirstMatch(/diffbot\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/perplexitybot/i],describe:function(e){var t={name:"PerplexityBot"},r=n.default.getFirstMatch(/perplexitybot\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/perplexity-user/i],describe:function(e){var t={name:"Perplexity-User"},r=n.default.getFirstMatch(/perplexity-user\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/youbot/i],describe:function(e){var t={name:"YouBot"},r=n.default.getFirstMatch(/youbot\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/meta-webindexer/i],describe:function(e){var t={name:"Meta-WebIndexer"},r=n.default.getFirstMatch(/meta-webindexer\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/meta-externalads/i],describe:function(e){var t={name:"Meta-ExternalAds"},r=n.default.getFirstMatch(/meta-externalads\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/meta-externalagent/i],describe:function(e){var t={name:"Meta-ExternalAgent"},r=n.default.getFirstMatch(/meta-externalagent\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/meta-externalfetcher/i],describe:function(e){var t={name:"Meta-ExternalFetcher"},r=n.default.getFirstMatch(/meta-externalfetcher\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/googlebot/i],describe:function(e){var t={name:"Googlebot"},r=n.default.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/amazonbot/i],describe:function(e){var t={name:"AmazonBot"},r=n.default.getFirstMatch(/amazonbot\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/bingbot/i],describe:function(e){var t={name:"BingCrawler"},r=n.default.getFirstMatch(/bingbot\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/baiduspider/i],describe:function(e){var t={name:"BaiduSpider"},r=n.default.getFirstMatch(/baiduspider\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/duckduckbot/i],describe:function(e){var t={name:"DuckDuckBot"},r=n.default.getFirstMatch(/duckduckbot\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/ia_archiver/i],describe:function(e){var t={name:"InternetArchiveCrawler"},r=n.default.getFirstMatch(/ia_archiver\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/facebookexternalhit/i,/facebookcatalog/i],describe:function(){return {name:"FacebookExternalHit"}}},{test:[/yahoo!?[\s/]*slurp/i],describe:function(){return {name:"YahooSlurp"}}},{test:[/yandexbot/i,/yandexmobilebot/i],describe:function(){return {name:"YandexBot"}}},{test:[/pingdom/i],describe:function(){return {name:"PingdomBot"}}},{test:[/opera/i],describe:function(e){var t={name:"Opera"},r=n.default.getFirstMatch(a,e)||n.default.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=n.default.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/SamsungBrowser/i],describe:function(e){var t={name:"Samsung Internet for Android"},r=n.default.getFirstMatch(a,e)||n.default.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=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/PaleMoon/i],describe:function(e){var t={name:"Pale Moon"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:PaleMoon)[\s/](\d+(?:\.\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MZBrowser/i],describe:function(e){var t={name:"MZ Browser"},r=n.default.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/focus/i],describe:function(e){var t={name:"Focus"},r=n.default.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/swing/i],describe:function(e){var t={name:"Swing"},r=n.default.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/coast/i],describe:function(e){var t={name:"Opera Coast"},r=n.default.getFirstMatch(a,e)||n.default.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=n.default.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/yabrowser/i],describe:function(e){var t={name:"Yandex Browser"},r=n.default.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/ucbrowser/i],describe:function(e){var t={name:"UC Browser"},r=n.default.getFirstMatch(a,e)||n.default.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=n.default.getFirstMatch(a,e)||n.default.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=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/puffin/i],describe:function(e){var t={name:"Puffin"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sleipnir/i],describe:function(e){var t={name:"Sleipnir"},r=n.default.getFirstMatch(a,e)||n.default.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=n.default.getFirstMatch(a,e)||n.default.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=n.default.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,e)||n.default.getFirstMatch(a,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=n.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/msie|trident/i],describe:function(e){var t={name:"Internet Explorer"},r=n.default.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=n.default.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=n.default.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=n.default.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/seamonkey/i],describe:function(e){var t={name:"SeaMonkey"},r=n.default.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sailfish/i],describe:function(e){var t={name:"Sailfish"},r=n.default.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=n.default.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/phantom/i],describe:function(e){var t={name:"PhantomJS"},r=n.default.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/slimerjs/i],describe:function(e){var t={name:"SlimerJS"},r=n.default.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=n.default.getFirstMatch(a,e)||n.default.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=n.default.getFirstMatch(a,e)||n.default.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=n.default.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/tizen/i],describe:function(e){var t={name:"Tizen"},r=n.default.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/qupzilla/i],describe:function(e){var t={name:"QupZilla"},r=n.default.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/librewolf/i],describe:function(e){var t={name:"LibreWolf"},r=n.default.getFirstMatch(/(?:librewolf)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/firefox|iceweasel|fxios/i],describe:function(e){var t={name:"Firefox"},r=n.default.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=n.default.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sogoumobilebrowser/i,/metasr/i,/se 2\.[x]/i],describe:function(e){var t={name:"Sogou Browser"},r=n.default.getFirstMatch(/(?:sogoumobilebrowser)[\s/](\d+(\.?_?\d+)+)/i,e),i=n.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,e),a=n.default.getFirstMatch(/se ([\d.]+)x/i,e),o=r||i||a;return o&&(t.version=o),t}},{test:[/MiuiBrowser/i],describe:function(e){var t={name:"Miui"},r=n.default.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/chromium/i],describe:function(e){var t={name:"Chromium"},r=n.default.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/chrome|crios|crmo/i],describe:function(e){var t={name:"Chrome"},r=n.default.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=n.default.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=n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/playstation 4/i],describe:function(e){var t={name:"PlayStation 4"},r=n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/safari|applewebkit/i],describe:function(e){var t={name:"Safari"},r=n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/.*/i],describe:function(e){var t=-1!==e.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return {name:n.default.getFirstMatch(t,e),version:n.default.getSecondMatch(t,e)}}}];t.default=o,e.exports=t.default;},93:function(e,t,r){t.__esModule=!0,t.default=void 0;var i,n=(i=r(17))&&i.__esModule?i:{default:i},a=r(18);var o=[{test:[/Roku\/DVP/],describe:function(e){var t=n.default.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,e);return {name:a.OS_MAP.Roku,version:t}}},{test:[/windows phone/i],describe:function(e){var t=n.default.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,e);return {name:a.OS_MAP.WindowsPhone,version:t}}},{test:[/windows /i],describe:function(e){var t=n.default.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,e),r=n.default.getWindowsVersionName(t);return {name:a.OS_MAP.Windows,version:t,versionName:r}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(e){var t={name:a.OS_MAP.iOS},r=n.default.getSecondMatch(/(Version\/)(\d[\d.]+)/,e);return r&&(t.version=r),t}},{test:[/macintosh/i],describe:function(e){var t=n.default.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,e).replace(/[_\s]/g,"."),r=n.default.getMacOSVersionName(t),i={name:a.OS_MAP.MacOS,version:t};return r&&(i.versionName=r),i}},{test:[/(ipod|iphone|ipad)/i],describe:function(e){var t=n.default.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,e).replace(/[_\s]/g,".");return {name:a.OS_MAP.iOS,version:t}}},{test:[/OpenHarmony/i],describe:function(e){var t=n.default.getFirstMatch(/OpenHarmony\s+(\d+(\.\d+)*)/i,e);return {name:a.OS_MAP.HarmonyOS,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=n.default.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,e),r=n.default.getAndroidVersionName(t),i={name:a.OS_MAP.Android,version:t};return r&&(i.versionName=r),i}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t=n.default.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,e),r={name:a.OS_MAP.WebOS};return t&&t.length&&(r.version=t),r}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(e){var t=n.default.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,e)||n.default.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,e)||n.default.getFirstMatch(/\bbb(\d+)/i,e);return {name:a.OS_MAP.BlackBerry,version:t}}},{test:[/bada/i],describe:function(e){var t=n.default.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,e);return {name:a.OS_MAP.Bada,version:t}}},{test:[/tizen/i],describe:function(e){var t=n.default.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,e);return {name:a.OS_MAP.Tizen,version:t}}},{test:[/linux/i],describe:function(){return {name:a.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return {name:a.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(e){var t=n.default.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,e);return {name:a.OS_MAP.PlayStation4,version:t}}}];t.default=o,e.exports=t.default;},94:function(e,t,r){t.__esModule=!0,t.default=void 0;var i,n=(i=r(17))&&i.__esModule?i:{default:i},a=r(18);var o=[{test:[/googlebot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Google"}}},{test:[/amazonbot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Amazon"}}},{test:[/gptbot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"OpenAI"}}},{test:[/chatgpt-user/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"OpenAI"}}},{test:[/oai-searchbot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"OpenAI"}}},{test:[/baiduspider/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Baidu"}}},{test:[/bingbot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Bing"}}},{test:[/duckduckbot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"DuckDuckGo"}}},{test:[/claudebot/i,/claude-web/i,/claude-user/i,/claude-searchbot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Anthropic"}}},{test:[/omgilibot/i,/webzio-extended/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Webz.io"}}},{test:[/diffbot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Diffbot"}}},{test:[/perplexitybot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Perplexity AI"}}},{test:[/perplexity-user/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Perplexity AI"}}},{test:[/youbot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"You.com"}}},{test:[/ia_archiver/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Internet Archive"}}},{test:[/meta-webindexer/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Meta"}}},{test:[/meta-externalads/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Meta"}}},{test:[/meta-externalagent/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Meta"}}},{test:[/meta-externalfetcher/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Meta"}}},{test:[/facebookexternalhit/i,/facebookcatalog/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Meta"}}},{test:[/yahoo/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Yahoo"}}},{test:[/yandexbot/i,/yandexmobilebot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Yandex"}}},{test:[/pingdom/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Pingdom"}}},{test:[/huawei/i],describe:function(e){var t=n.default.getFirstMatch(/(can-l01)/i,e)&&"Nova",r={type:a.PLATFORMS_MAP.mobile,vendor:"Huawei"};return t&&(r.model=t),r}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:function(){return {type:a.PLATFORMS_MAP.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe:function(){return {type:a.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(){return {type:a.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe:function(){return {type:a.PLATFORMS_MAP.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe:function(){return {type:a.PLATFORMS_MAP.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe:function(){return {type:a.PLATFORMS_MAP.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=n.default.getFirstMatch(/(ipod|iphone)/i,e);return {type:a.PLATFORMS_MAP.mobile,vendor:"Apple",model:t}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return {type:a.PLATFORMS_MAP.mobile,vendor:"Nexus"}}},{test:[/Nokia/i],describe:function(e){var t=n.default.getFirstMatch(/Nokia\s+([0-9]+(\.[0-9]+)?)/i,e),r={type:a.PLATFORMS_MAP.mobile,vendor:"Nokia"};return t&&(r.model=t),r}},{test:[/[^-]mobi/i],describe:function(){return {type:a.PLATFORMS_MAP.mobile}}},{test:function(e){return "blackberry"===e.getBrowserName(!0)},describe:function(){return {type:a.PLATFORMS_MAP.mobile,vendor:"BlackBerry"}}},{test:function(e){return "bada"===e.getBrowserName(!0)},describe:function(){return {type:a.PLATFORMS_MAP.mobile}}},{test:function(e){return "windows phone"===e.getBrowserName()},describe:function(){return {type:a.PLATFORMS_MAP.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:a.PLATFORMS_MAP.tablet}}},{test:function(e){return "android"===e.getOSName(!0)},describe:function(){return {type:a.PLATFORMS_MAP.mobile}}},{test:function(e){return "macos"===e.getOSName(!0)},describe:function(){return {type:a.PLATFORMS_MAP.desktop,vendor:"Apple"}}},{test:function(e){return "windows"===e.getOSName(!0)},describe:function(){return {type:a.PLATFORMS_MAP.desktop}}},{test:function(e){return "linux"===e.getOSName(!0)},describe:function(){return {type:a.PLATFORMS_MAP.desktop}}},{test:function(e){return "playstation 4"===e.getOSName(!0)},describe:function(){return {type:a.PLATFORMS_MAP.tv}}},{test:function(e){return "roku"===e.getOSName(!0)},describe:function(){return {type:a.PLATFORMS_MAP.tv}}}];t.default=o,e.exports=t.default;},95:function(e,t,r){t.__esModule=!0,t.default=void 0;var i,n=(i=r(17))&&i.__esModule?i:{default:i},a=r(18);var o=[{test:function(e){return "microsoft edge"===e.getBrowserName(!0)},describe:function(e){if(/\sedg\//i.test(e))return {name:a.ENGINE_MAP.Blink};var t=n.default.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,e);return {name:a.ENGINE_MAP.EdgeHTML,version:t}}},{test:[/trident/i],describe:function(e){var t={name:a.ENGINE_MAP.Trident},r=n.default.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:a.ENGINE_MAP.Presto},r=n.default.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:a.ENGINE_MAP.Gecko},r=n.default.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(apple)?webkit\/537\.36/i],describe:function(){return {name:a.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(e){var t={name:a.ENGINE_MAP.WebKit},r=n.default.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}}];t.default=o,e.exports=t.default;}})}));
52
+ } (es5));
53
+
54
+ var es5Exports = es5.exports;
55
+ var Bowser = /*@__PURE__*/getDefaultExportFromCjs(es5Exports);
56
+
57
+ function getBrowserNameVersion() {
58
+ const { browser, os, platform } = Bowser.parse(window.navigator.userAgent);
59
+ return {
60
+ browser,
61
+ os,
62
+ platform,
63
+ ratio: getRatio(),
64
+ wh: getWH()
65
+ };
66
+ }
67
+ function getRatio() {
68
+ let ratio = 0;
69
+ const screen = window.screen;
70
+ const ua = navigator.userAgent.toLowerCase();
71
+ if (window.devicePixelRatio !== void 0) {
72
+ ratio = window.devicePixelRatio;
73
+ } else if (~ua.indexOf("msie")) {
74
+ if (screen.deviceXDPI && screen.logicalXDPI) {
75
+ ratio = screen.deviceXDPI / screen.logicalXDPI;
76
+ }
77
+ } else if (window.outerWidth !== void 0 && window.innerWidth !== void 0) {
78
+ ratio = window.outerWidth / window.innerWidth;
79
+ }
80
+ if (ratio) {
81
+ ratio = Math.round(ratio * 100);
82
+ }
83
+ return ratio;
84
+ }
85
+ function getWH() {
86
+ return {
87
+ width: window.screen.width,
88
+ height: window.screen.height
89
+ };
90
+ }
91
+ const nextTime = window.requestIdleCallback || window.requestAnimationFrame || ((callback) => window.setTimeout(callback, 1e3 / 60));
92
+ const beforeUnload = (callback) => {
93
+ window.addEventListener("beforeunload", () => {
94
+ callback();
95
+ });
96
+ };
97
+
98
+ function throttle(fn, delay) {
99
+ let lastTime = 0;
100
+ return function(...args) {
101
+ const now = Date.now();
102
+ if (now - lastTime >= delay) {
103
+ fn.apply(this, args);
104
+ lastTime = now;
105
+ }
106
+ };
107
+ }
108
+
109
+ const MAX_CACHE_LEN = 5;
110
+ const MAX_WAITING_TIME = 3e4;
111
+ const UUID = "track_uuid";
112
+ const DEFAULT_RESOURCE_THRESHOLD = 1e3;
113
+ const DEFAULT_LOAF_THRESHOLD = 50;
114
+
115
+ var __defProp$3 = Object.defineProperty;
116
+ var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
117
+ var __publicField$3 = (obj, key, value) => {
118
+ __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
119
+ return value;
120
+ };
121
+ class DeviceInfo {
122
+ constructor(uuidKey = UUID) {
123
+ __publicField$3(this, "device");
124
+ __publicField$3(this, "uuid", "");
125
+ this.device = getBrowserNameVersion();
126
+ this.getUUid(uuidKey);
127
+ }
128
+ getUUid(key) {
129
+ try {
130
+ const uuid = localStorage.getItem(key);
131
+ if (uuid) {
132
+ this.uuid = uuid;
133
+ } else {
134
+ this.uuid = nanoid();
135
+ localStorage.setItem(key, this.uuid);
136
+ }
137
+ } catch (e) {
138
+ this.uuid = nanoid();
139
+ console.warn("[CWJ Monitor] localStorage access failed, UUID will not be persisted:", e);
140
+ }
141
+ }
142
+ }
143
+
144
+ var __defProp$2 = Object.defineProperty;
145
+ var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
146
+ var __publicField$2 = (obj, key, value) => {
147
+ __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
148
+ return value;
149
+ };
150
+ class EventTrack {
151
+ constructor(options, reporter) {
152
+ __publicField$2(this, "deviceInfo");
153
+ __publicField$2(this, "reporter");
154
+ __publicField$2(this, "data");
155
+ this.deviceInfo = new DeviceInfo(options.uuidKey);
156
+ this.reporter = reporter;
157
+ this.data = options.data;
158
+ }
159
+ /**
160
+ * 格式化事件数据用于传输
161
+ */
162
+ formatter(type, data) {
163
+ const timestamp = Date.now();
164
+ return {
165
+ device: this.deviceInfo.device,
166
+ uuid: this.deviceInfo.uuid,
167
+ type,
168
+ data,
169
+ date: getDate(timestamp),
170
+ userData: this.data
171
+ };
172
+ }
173
+ /**
174
+ * 公共方法:发送事件
175
+ * 将事件格式化后交给 reporter 处理
176
+ */
177
+ emit(type, data) {
178
+ const payload = this.formatter(type, data);
179
+ this.reporter.send(payload);
180
+ }
181
+ /**
182
+ * 获取上报器实例 (供 Core 使用)
183
+ */
184
+ getReporter() {
185
+ return this.reporter;
186
+ }
187
+ }
188
+
189
+ var __defProp$1 = Object.defineProperty;
190
+ var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
191
+ var __publicField$1 = (obj, key, value) => {
192
+ __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
193
+ return value;
194
+ };
195
+ class Reporter {
196
+ constructor(url, config) {
197
+ __publicField$1(this, "url");
198
+ __publicField$1(this, "transportConfig");
199
+ __publicField$1(this, "events", []);
200
+ __publicField$1(this, "isSending", false);
201
+ __publicField$1(this, "timer", null);
202
+ this.url = url;
203
+ this.transportConfig = {
204
+ maxBatchSize: config?.maxBatchSize ?? MAX_CACHE_LEN,
205
+ maxWaitTime: config?.maxWaitTime ?? MAX_WAITING_TIME
206
+ };
207
+ beforeUnload(() => this.flush());
208
+ }
209
+ /**
210
+ * 将事件加入队列
211
+ */
212
+ send(payload) {
213
+ this.events.push(payload);
214
+ if (this.events.length >= this.transportConfig.maxBatchSize) {
215
+ this.clearTimer();
216
+ this.triggerSend();
217
+ } else if (!this.timer) {
218
+ this.timer = setTimeout(() => {
219
+ this.timer = null;
220
+ this.triggerSend();
221
+ }, this.transportConfig.maxWaitTime);
222
+ }
223
+ }
224
+ /**
225
+ * 立即刷新所有待发送事件
226
+ */
227
+ flush() {
228
+ return this.triggerSend(true);
229
+ }
230
+ clearTimer() {
231
+ if (this.timer) {
232
+ clearTimeout(this.timer);
233
+ this.timer = null;
234
+ }
235
+ }
236
+ /**
237
+ * 触发发送逻辑
238
+ */
239
+ async triggerSend(isFlush = false) {
240
+ if (this.isSending || !this.events.length)
241
+ return;
242
+ this.isSending = true;
243
+ try {
244
+ const maxLen = isFlush ? this.events.length : this.transportConfig.maxBatchSize;
245
+ const sendEvents = this.events.slice(0, maxLen);
246
+ this.events = this.events.slice(maxLen);
247
+ await this.safeSend(sendEvents);
248
+ if (this.events.length) {
249
+ nextTime(() => this.triggerSend());
250
+ }
251
+ } catch (error) {
252
+ } finally {
253
+ this.isSending = false;
254
+ }
255
+ }
256
+ /**
257
+ * 使用 navigator.sendBeacon 或 XMLHttpRequest 安全发送事件
258
+ */
259
+ safeSend(events) {
260
+ return new Promise((resolve, reject) => {
261
+ if (!events.length) {
262
+ resolve();
263
+ return;
264
+ }
265
+ const data = JSON.stringify(events);
266
+ if (typeof navigator.sendBeacon === "function") {
267
+ const blob = new Blob([data], { type: "application/json" });
268
+ const success = navigator.sendBeacon(this.url, blob);
269
+ if (success) {
270
+ resolve();
271
+ } else {
272
+ this.sendViaXHR(data, resolve, reject);
273
+ }
274
+ } else {
275
+ this.sendViaXHR(data, resolve, reject);
276
+ }
277
+ });
278
+ }
279
+ /**
280
+ * 通过 XMLHttpRequest 发送
281
+ */
282
+ sendViaXHR(data, resolve, reject) {
283
+ const xhr = new XMLHttpRequest();
284
+ xhr.open("POST", this.url, true);
285
+ xhr.setRequestHeader("Content-Type", "application/json");
286
+ xhr.onload = () => {
287
+ if (xhr.status >= 200 && xhr.status < 300) {
288
+ resolve();
289
+ } else {
290
+ reject(new Error(`HTTP ${xhr.status}: ${xhr.statusText}`));
291
+ }
292
+ };
293
+ xhr.onerror = () => reject(new Error("Network error"));
294
+ xhr.ontimeout = () => reject(new Error("Request timeout"));
295
+ xhr.timeout = 1e4;
296
+ xhr.send(data);
297
+ }
298
+ }
299
+
300
+ var TYPES = /* @__PURE__ */ ((TYPES2) => {
301
+ TYPES2["ERROR"] = "error";
302
+ TYPES2["CLICK"] = "click";
303
+ TYPES2["PERFORMANCE"] = "performance";
304
+ TYPES2["ROUTER"] = "router";
305
+ TYPES2["XHR"] = "xhr";
306
+ TYPES2["FETCH"] = "fetch";
307
+ return TYPES2;
308
+ })(TYPES || {});
309
+ var EMIT_TYPE = /* @__PURE__ */ ((EMIT_TYPE2) => {
310
+ EMIT_TYPE2["ERROR"] = "error";
311
+ EMIT_TYPE2["BEHAVIOR_CLICK"] = "click";
312
+ EMIT_TYPE2["ROUTE_CHANGE"] = "route_change";
313
+ EMIT_TYPE2["PERFORMANCE_FP"] = "performance_fp";
314
+ EMIT_TYPE2["PERFORMANCE_FCP"] = "performance_fcp";
315
+ EMIT_TYPE2["PERFORMANCE_LCP"] = "performance_lcp";
316
+ EMIT_TYPE2["PERFORMANCE_INP"] = "performance_inp";
317
+ EMIT_TYPE2["PERFORMANCE_LONGTASK"] = "performance_longtask";
318
+ EMIT_TYPE2["PERFORMANCE_RESOURCE"] = "performance_resource";
319
+ EMIT_TYPE2["PERFORMANCE_LOAF"] = "performance_loaf";
320
+ EMIT_TYPE2["XHR"] = "xhr";
321
+ EMIT_TYPE2["FETCH"] = "fetch";
322
+ EMIT_TYPE2["CUSTOM"] = "custom";
323
+ return EMIT_TYPE2;
324
+ })(EMIT_TYPE || {});
325
+
326
+ var __defProp = Object.defineProperty;
327
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
328
+ var __publicField = (obj, key, value) => {
329
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
330
+ return value;
331
+ };
332
+ class Core extends EventTrack {
333
+ constructor(options) {
334
+ const reporter = new Reporter(options.url, options.transport);
335
+ super(options, reporter);
336
+ __publicField(this, "pluginMap", /* @__PURE__ */ new Map());
337
+ __publicField(this, "options");
338
+ this.options = options;
339
+ }
340
+ use(plugin) {
341
+ if (!this.pluginMap.has(plugin.name)) {
342
+ this.pluginMap.set(plugin.name, plugin);
343
+ }
344
+ return this;
345
+ }
346
+ /**
347
+ * 自定义事件上报
348
+ * @param data 上报的数据
349
+ * @param type 事件类型,默认为 'custom'
350
+ */
351
+ log(data, type = EMIT_TYPE.CUSTOM) {
352
+ this.emit(type, data);
353
+ }
354
+ // 启动插件
355
+ run() {
356
+ const context = {
357
+ emit: this.emit.bind(this),
358
+ url: this.options.url
359
+ };
360
+ this.pluginMap.forEach((plugin) => {
361
+ plugin.install(context);
362
+ });
363
+ this.mount();
364
+ }
365
+ // 停止并卸载所有插件
366
+ stop() {
367
+ this.pluginMap.forEach((plugin) => {
368
+ plugin.uninstall?.();
369
+ });
370
+ this.pluginMap.clear();
371
+ this.unmount();
372
+ }
373
+ mount() {
374
+ const { globalKey = "$track" } = this.options;
375
+ if (typeof window !== "undefined") {
376
+ window[globalKey] = this;
377
+ }
378
+ }
379
+ unmount() {
380
+ const { globalKey = "$track" } = this.options;
381
+ if (typeof window !== "undefined" && window[globalKey] === this) {
382
+ delete window[globalKey];
383
+ }
384
+ }
385
+ }
386
+ function createMonitor(options) {
387
+ return new Core(options);
388
+ }
389
+
390
+ const ErrorPlugin = (options = {}) => {
391
+ let originalConsoleError;
392
+ let context;
393
+ const overrideConsoleError = () => {
394
+ originalConsoleError = console.error;
395
+ console.error = (...args) => {
396
+ originalConsoleError?.apply(console, args);
397
+ const errorData = {
398
+ type: "console",
399
+ message: args.map((arg) => String(arg)).join(" "),
400
+ stack: new Error().stack
401
+ };
402
+ if (options.filter && !options.filter(errorData)) {
403
+ return;
404
+ }
405
+ context?.emit(EMIT_TYPE.ERROR, errorData);
406
+ };
407
+ };
408
+ const restoreConsoleError = () => {
409
+ if (originalConsoleError) {
410
+ console.error = originalConsoleError;
411
+ }
412
+ };
413
+ const cleanStack = (stack) => {
414
+ if (!stack)
415
+ return void 0;
416
+ const lines = stack.split("\n").slice(0, 11);
417
+ return lines.join("\n");
418
+ };
419
+ const simpleHash = (str) => {
420
+ let hash = 0;
421
+ for (let i = 0; i < str.length; i++) {
422
+ const char = str.charCodeAt(i);
423
+ hash = (hash << 5) - hash + char;
424
+ hash = hash & hash;
425
+ }
426
+ return Math.abs(hash).toString(36);
427
+ };
428
+ const generateFingerprint = (...parts) => {
429
+ const combined = parts.filter(Boolean).join("|");
430
+ return simpleHash(combined);
431
+ };
432
+ const isResourceError = (target) => {
433
+ const resourceTags = ["LINK", "SCRIPT", "IMG", "AUDIO", "VIDEO", "IFRAME"];
434
+ return target && resourceTags.includes(target.tagName);
435
+ };
436
+ const getPromiseErrorDetails = (e) => {
437
+ if (e.reason instanceof Error) {
438
+ return {
439
+ errorType: "promise",
440
+ message: e.reason.message,
441
+ stack: cleanStack(e.reason.stack),
442
+ name: e.reason.name,
443
+ fingerprint: generateFingerprint(e.reason.message, e.reason.stack)
444
+ };
445
+ }
446
+ return {
447
+ errorType: "promise",
448
+ message: String(e.reason)
449
+ };
450
+ };
451
+ const getErrorDetails = (e) => {
452
+ const { error, target, filename, message } = e;
453
+ if (error instanceof Error) {
454
+ return {
455
+ errorType: "js",
456
+ name: error.name,
457
+ message: error.message,
458
+ stack: cleanStack(error.stack),
459
+ filename,
460
+ colno: e.colno,
461
+ lineno: e.lineno,
462
+ fingerprint: generateFingerprint(error.message, error.stack)
463
+ };
464
+ }
465
+ if (isResourceError(target)) {
466
+ const element = target;
467
+ const url = "src" in element ? element.src : element.href;
468
+ return {
469
+ errorType: "resource",
470
+ message: `Resource load failed: ${url}`,
471
+ url,
472
+ tagName: element.tagName,
473
+ fingerprint: generateFingerprint(`resource:${url}`)
474
+ };
475
+ }
476
+ return {
477
+ errorType: "unknown",
478
+ message,
479
+ filename
480
+ };
481
+ };
482
+ const errorHandler = (e) => {
483
+ const errorData = { type: "sync", ...getErrorDetails(e) };
484
+ if (options.filter && !options.filter(errorData))
485
+ return;
486
+ context?.emit(EMIT_TYPE.ERROR, errorData);
487
+ };
488
+ const rejectionHandler = (e) => {
489
+ const errorData = { type: "async", ...getPromiseErrorDetails(e) };
490
+ if (options.filter && !options.filter(errorData))
491
+ return;
492
+ context?.emit(EMIT_TYPE.ERROR, errorData);
493
+ };
494
+ return {
495
+ name: TYPES.ERROR,
496
+ install: (ctx) => {
497
+ context = ctx;
498
+ overrideConsoleError();
499
+ window.addEventListener("error", errorHandler, true);
500
+ window.addEventListener("unhandledrejection", rejectionHandler, true);
501
+ },
502
+ uninstall: () => {
503
+ restoreConsoleError();
504
+ window.removeEventListener("error", errorHandler, true);
505
+ window.removeEventListener("unhandledrejection", rejectionHandler, true);
506
+ }
507
+ };
508
+ };
509
+
510
+ const PVPlugin = (options = {}) => {
511
+ let lastRouteTime = Date.now();
512
+ let context;
513
+ let originPushState;
514
+ let originReplaceState;
515
+ const emitRouteChange = (type) => {
516
+ const now = Date.now();
517
+ const to = window.location.href;
518
+ const from = document.referrer;
519
+ if (options.filter && !options.filter(to, from)) {
520
+ return;
521
+ }
522
+ context?.emit(EMIT_TYPE.ROUTE_CHANGE, {
523
+ from,
524
+ to,
525
+ type,
526
+ duration: getSeconds(now, lastRouteTime)
527
+ });
528
+ lastRouteTime = now;
529
+ };
530
+ const handleHashChange = () => emitRouteChange("hashchange");
531
+ const handlePopState = () => emitRouteChange("popstate");
532
+ const setupHistoryListener = () => {
533
+ originPushState = window.history.pushState;
534
+ originReplaceState = window.history.replaceState;
535
+ window.history.pushState = (...args) => {
536
+ originPushState.apply(window.history, args);
537
+ emitRouteChange("pushState");
538
+ };
539
+ window.history.replaceState = (...args) => {
540
+ originReplaceState.apply(window.history, args);
541
+ emitRouteChange("replaceState");
542
+ };
543
+ };
544
+ const restoreHistoryListener = () => {
545
+ if (originPushState)
546
+ window.history.pushState = originPushState;
547
+ if (originReplaceState)
548
+ window.history.replaceState = originReplaceState;
549
+ };
550
+ return {
551
+ name: TYPES.ROUTER,
552
+ install: (ctx) => {
553
+ context = ctx;
554
+ lastRouteTime = Date.now();
555
+ window.addEventListener("hashchange", handleHashChange);
556
+ window.addEventListener("popstate", handlePopState);
557
+ setupHistoryListener();
558
+ },
559
+ uninstall: () => {
560
+ window.removeEventListener("hashchange", handleHashChange);
561
+ window.removeEventListener("popstate", handlePopState);
562
+ restoreHistoryListener();
563
+ }
564
+ };
565
+ };
566
+
567
+ const BehaviorPlugin = (options = {}) => {
568
+ const { throttleDelay = 500 } = options;
569
+ let context;
570
+ const getElementXPath = (element) => {
571
+ if (!element || element.nodeType !== 1)
572
+ return "";
573
+ if (element.id)
574
+ return `//*[@id="${element.id}"]`;
575
+ const sameTagSiblings = Array.from(element.parentNode?.children || []).filter(
576
+ (el) => el.tagName === element.tagName
577
+ );
578
+ const idx = sameTagSiblings.indexOf(element) + 1;
579
+ return `${getElementXPath(element.parentNode)}/${element.tagName.toLowerCase()}[${idx}]`;
580
+ };
581
+ const handleClick = throttle((e) => {
582
+ const target = e.target;
583
+ if (!target)
584
+ return;
585
+ if (options.filter && !options.filter(target)) {
586
+ return;
587
+ }
588
+ const clickData = {
589
+ tagName: target.tagName,
590
+ id: target.id,
591
+ className: target.className,
592
+ text: target.textContent?.trim(),
593
+ xPath: getElementXPath(target)
594
+ };
595
+ context?.emit(EMIT_TYPE.BEHAVIOR_CLICK, clickData);
596
+ }, throttleDelay);
597
+ return {
598
+ name: TYPES.CLICK,
599
+ install: (ctx) => {
600
+ context = ctx;
601
+ document.addEventListener(EMIT_TYPE.BEHAVIOR_CLICK, handleClick, true);
602
+ },
603
+ uninstall: () => {
604
+ document.removeEventListener(EMIT_TYPE.BEHAVIOR_CLICK, handleClick, true);
605
+ }
606
+ };
607
+ };
608
+
609
+ const PerformancePlugin = (options = {}) => {
610
+ let context;
611
+ let paintObserver = null;
612
+ let lcpObserver = null;
613
+ let resourceObserver = null;
614
+ let loafObserver = null;
615
+ const monitorPaintMetrics = () => {
616
+ const entryHandler = (list) => {
617
+ for (const entry of list.getEntries()) {
618
+ if (entry.name === "first-paint") {
619
+ if (options.filter && !options.filter(EMIT_TYPE.PERFORMANCE_FP, entry.startTime)) {
620
+ continue;
621
+ }
622
+ context?.emit(EMIT_TYPE.PERFORMANCE_FP, entry.startTime);
623
+ } else if (entry.name === "first-contentful-paint") {
624
+ if (options.filter && !options.filter(EMIT_TYPE.PERFORMANCE_FCP, entry.startTime)) {
625
+ continue;
626
+ }
627
+ context?.emit(EMIT_TYPE.PERFORMANCE_FCP, entry.startTime);
628
+ }
629
+ }
630
+ paintObserver?.disconnect();
631
+ };
632
+ try {
633
+ paintObserver = new PerformanceObserver(entryHandler);
634
+ paintObserver.observe({ type: "paint", buffered: true });
635
+ } catch (e) {
636
+ console.warn("[CWJ Monitor] Paint observation not supported:", e);
637
+ }
638
+ };
639
+ const monitorLCP = () => {
640
+ const entryHandler = (list) => {
641
+ if (lcpObserver) {
642
+ lcpObserver.disconnect();
643
+ }
644
+ for (const entry of list.getEntries()) {
645
+ if (options.filter && !options.filter(EMIT_TYPE.PERFORMANCE_LCP, entry.startTime)) {
646
+ continue;
647
+ }
648
+ context?.emit(EMIT_TYPE.PERFORMANCE_LCP, entry.startTime);
649
+ }
650
+ };
651
+ try {
652
+ lcpObserver = new PerformanceObserver(entryHandler);
653
+ lcpObserver.observe({ type: "largest-contentful-paint", buffered: true });
654
+ } catch (e) {
655
+ console.warn("[CWJ Monitor] LCP observation not supported:", e);
656
+ }
657
+ };
658
+ const monitorLoAF = () => {
659
+ const entryHandler = (list) => {
660
+ for (const entry of list.getEntries()) {
661
+ if (options.filter && !options.filter(EMIT_TYPE.PERFORMANCE_LOAF, entry)) {
662
+ continue;
663
+ }
664
+ const threshold = options.loafThreshold ?? DEFAULT_LOAF_THRESHOLD;
665
+ if (entry.duration > threshold) {
666
+ context?.emit(EMIT_TYPE.PERFORMANCE_LOAF, {
667
+ duration: entry.duration,
668
+ startTime: entry.startTime,
669
+ renderStart: entry.renderStart,
670
+ styleAndLayoutStart: entry.styleAndLayoutStart,
671
+ hadRecentInput: entry.hadRecentInput,
672
+ scripts: entry.scripts.map((s) => ({
673
+ duration: s.duration,
674
+ invoker: s.invoker,
675
+ invokerType: s.invokerType,
676
+ sourceURL: s.sourceURL,
677
+ functionName: s.functionName,
678
+ startTime: s.startTime
679
+ }))
680
+ });
681
+ }
682
+ }
683
+ };
684
+ try {
685
+ loafObserver = new PerformanceObserver(entryHandler);
686
+ loafObserver.observe({ type: "long-animation-frame", buffered: true });
687
+ } catch (e) {
688
+ console.warn("[CWJ Monitor] LoAF observation not supported:", e);
689
+ }
690
+ };
691
+ const monitorResource = () => {
692
+ const entryHandler = (list) => {
693
+ for (const entry of list.getEntries()) {
694
+ if (entry.initiatorType !== "fetch" && entry.initiatorType !== "xmlhttprequest") {
695
+ continue;
696
+ }
697
+ if (options.filter && !options.filter(EMIT_TYPE.PERFORMANCE_RESOURCE, entry)) {
698
+ continue;
699
+ }
700
+ const threshold = options.resourceThreshold ?? DEFAULT_RESOURCE_THRESHOLD;
701
+ if (entry.duration > threshold) {
702
+ context?.emit(EMIT_TYPE.PERFORMANCE_RESOURCE, {
703
+ name: entry.name,
704
+ // 资源 URL
705
+ initiatorType: entry.initiatorType,
706
+ duration: entry.duration,
707
+ startTime: entry.startTime,
708
+ transferSize: entry.transferSize,
709
+ encodedBodySize: entry.encodedBodySize,
710
+ decodedBodySize: entry.decodedBodySize
711
+ });
712
+ }
713
+ }
714
+ };
715
+ try {
716
+ resourceObserver = new PerformanceObserver(entryHandler);
717
+ resourceObserver.observe({ type: "resource", buffered: true });
718
+ } catch (e) {
719
+ console.warn("[CWJ Monitor] Resource observation not supported:", e);
720
+ }
721
+ };
722
+ return {
723
+ name: TYPES.PERFORMANCE,
724
+ install: (ctx) => {
725
+ context = ctx;
726
+ monitorPaintMetrics();
727
+ monitorLCP();
728
+ monitorResource();
729
+ monitorLoAF();
730
+ },
731
+ uninstall: () => {
732
+ paintObserver?.disconnect();
733
+ lcpObserver?.disconnect();
734
+ resourceObserver?.disconnect();
735
+ loafObserver?.disconnect();
736
+ }
737
+ };
738
+ };
739
+
740
+ const XHRPlugin = (options = {}) => {
741
+ let context;
742
+ let originOpen;
743
+ let originSend;
744
+ const setupXHRListeners = () => {
745
+ const originXhr = window.XMLHttpRequest;
746
+ if (!originXhr)
747
+ return;
748
+ originOpen = originXhr.prototype.open;
749
+ originSend = originXhr.prototype.send;
750
+ originXhr.prototype.open = function(...args) {
751
+ this._xhr_info = {
752
+ method: args[0].toUpperCase(),
753
+ url: String(args[1]),
754
+ startTime: 0
755
+ };
756
+ return originOpen.apply(this, args);
757
+ };
758
+ originXhr.prototype.send = function(...args) {
759
+ if (this._xhr_info) {
760
+ this._xhr_info.startTime = Date.now();
761
+ }
762
+ const onLoadend = () => {
763
+ if (this._xhr_info) {
764
+ const trackerUrl = context?.url;
765
+ const { url, method, startTime } = this._xhr_info;
766
+ if (trackerUrl && url.includes(trackerUrl)) {
767
+ return;
768
+ }
769
+ if (options.filter && !options.filter(method, url)) {
770
+ return;
771
+ }
772
+ const duration = Date.now() - startTime;
773
+ const status = this.status;
774
+ if (!(status >= 200 && status < 300)) {
775
+ const data = {
776
+ method,
777
+ url,
778
+ status,
779
+ duration,
780
+ // 限制响应体大小,避免数据过大
781
+ response: this.response ? String(this.response).slice(0, 200) : ""
782
+ };
783
+ context?.emit(EMIT_TYPE.XHR, data);
784
+ }
785
+ }
786
+ };
787
+ this.addEventListener("loadend", onLoadend);
788
+ return originSend.apply(this, args);
789
+ };
790
+ };
791
+ const restoreXHR = () => {
792
+ const originXhr = window.XMLHttpRequest;
793
+ if (!originXhr)
794
+ return;
795
+ if (originOpen)
796
+ originXhr.prototype.open = originOpen;
797
+ if (originSend)
798
+ originXhr.prototype.send = originSend;
799
+ };
800
+ return {
801
+ name: TYPES.XHR,
802
+ install: (ctx) => {
803
+ context = ctx;
804
+ setupXHRListeners();
805
+ },
806
+ uninstall: () => {
807
+ restoreXHR();
808
+ }
809
+ };
810
+ };
811
+
812
+ const FetchPlugin = (options = {}) => {
813
+ let context;
814
+ let originFetch;
815
+ const setupFetchListeners = () => {
816
+ originFetch = window.fetch;
817
+ if (!originFetch)
818
+ return;
819
+ window.fetch = function(input, init) {
820
+ const startTime = Date.now();
821
+ const method = (init?.method || "GET").toUpperCase();
822
+ const url = input instanceof Request ? input.url : String(input);
823
+ return originFetch.apply(this, [input, init]).then(
824
+ (response) => {
825
+ const trackerUrl = context?.url;
826
+ if (trackerUrl && url.includes(trackerUrl)) {
827
+ return response;
828
+ }
829
+ if (options.filter && !options.filter(method, url)) {
830
+ return response;
831
+ }
832
+ if (!response.ok) {
833
+ const duration = Date.now() - startTime;
834
+ const data = {
835
+ method,
836
+ url,
837
+ status: response.status,
838
+ duration,
839
+ success: false
840
+ };
841
+ context?.emit(EMIT_TYPE.FETCH, data);
842
+ }
843
+ return response;
844
+ },
845
+ (error) => {
846
+ const trackerUrl = context?.url;
847
+ if (trackerUrl && url.includes(trackerUrl)) {
848
+ throw error;
849
+ }
850
+ if (options.filter && !options.filter(method, url)) {
851
+ throw error;
852
+ }
853
+ const duration = Date.now() - startTime;
854
+ const data = {
855
+ method,
856
+ url,
857
+ status: 0,
858
+ duration,
859
+ success: false,
860
+ message: error.message
861
+ };
862
+ context?.emit(EMIT_TYPE.FETCH, data);
863
+ throw error;
864
+ }
865
+ );
866
+ };
867
+ };
868
+ const restoreFetch = () => {
869
+ if (originFetch)
870
+ window.fetch = originFetch;
871
+ };
872
+ return {
873
+ name: TYPES.FETCH,
874
+ install: (ctx) => {
875
+ context = ctx;
876
+ setupFetchListeners();
877
+ },
878
+ uninstall: () => {
879
+ restoreFetch();
880
+ }
881
+ };
882
+ };
883
+
884
+ exports.BehaviorPlugin = BehaviorPlugin;
885
+ exports.Core = Core;
886
+ exports.EMIT_TYPE = EMIT_TYPE;
887
+ exports.ErrorPlugin = ErrorPlugin;
888
+ exports.FetchPlugin = FetchPlugin;
889
+ exports.PVPlugin = PVPlugin;
890
+ exports.PerformancePlugin = PerformancePlugin;
891
+ exports.XHRPlugin = XHRPlugin;
892
+ exports.createMonitor = createMonitor;
893
+ //# sourceMappingURL=index.cjs.map