UNPKG

cwj_monitoring

Version:

基于 JS 适用Web端的插件,为前端项目提供【 行为、性能、异常 】监控手段

960 lines 65.8 kB
(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
  typeof define === 'function' && define.amd ? define(['exports'], factory) :
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.CWJMonitoring = {}));
})(this, (function (exports) { 'use strict';

  const urlAlphabet =
    'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict';

  /* @ts-self-types="./index.d.ts" */
  let nanoid = (size = 21) => {
    let id = '';
    let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)));
    while (size--) {
      id += urlAlphabet[bytes[size] & 63];
    }
    return id
  };

  const getDate = (time = Date.now()) => {
    const date = new Date(time);
    const year = date.getFullYear();
    const month = date.getMonth() + 1;
    const day = date.getDate();
    const hour = date.getHours();
    const minute = date.getMinutes();
    const second = date.getSeconds();
    const formatter = (date2) => {
      let res = "";
      if (date2 < 10) {
        res = "0" + date2;
      } else {
        res = date2.toString();
      }
      return res;
    };
    return year + "-" + formatter(month) + "-" + formatter(day) + " " + formatter(hour) + ":" + formatter(minute) + ":" + formatter(second);
  };
  const getSeconds = (timestamp1, timestamp2) => {
    if (timestamp1 < timestamp2) {
      [timestamp1, timestamp2] = [timestamp2, timestamp1];
    }
    return Math.floor((timestamp1 - timestamp2) / 1e3);
  };

  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};

  function getDefaultExportFromCjs (x) {
  	return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
  }

  var es5 = {exports: {}};

  (function (module, exports) {
  	!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;}})})); 
  } (es5));

  var es5Exports = es5.exports;
  var Bowser = /*@__PURE__*/getDefaultExportFromCjs(es5Exports);

  function getBrowserNameVersion() {
    const { browser, os, platform } = Bowser.parse(window.navigator.userAgent);
    return {
      browser,
      os,
      platform,
      ratio: getRatio(),
      wh: getWH()
    };
  }
  function getRatio() {
    let ratio = 0;
    const screen = window.screen;
    const ua = navigator.userAgent.toLowerCase();
    if (window.devicePixelRatio !== void 0) {
      ratio = window.devicePixelRatio;
    } else if (~ua.indexOf("msie")) {
      if (screen.deviceXDPI && screen.logicalXDPI) {
        ratio = screen.deviceXDPI / screen.logicalXDPI;
      }
    } else if (window.outerWidth !== void 0 && window.innerWidth !== void 0) {
      ratio = window.outerWidth / window.innerWidth;
    }
    if (ratio) {
      ratio = Math.round(ratio * 100);
    }
    return ratio;
  }
  function getWH() {
    return {
      width: window.screen.width,
      height: window.screen.height
    };
  }
  const nextTime = window.requestIdleCallback || window.requestAnimationFrame || ((callback) => window.setTimeout(callback, 1e3 / 60));
  const beforeUnload = (callback) => {
    window.addEventListener("beforeunload", () => {
      callback();
    });
  };

  function throttle(fn, delay) {
    let lastTime = 0;
    return function(...args) {
      const now = Date.now();
      if (now - lastTime >= delay) {
        fn.apply(this, args);
        lastTime = now;
      }
    };
  }
  const isIgnoredScriptSource = (sourceURL) => {
    if (!sourceURL || typeof sourceURL !== "string")
      return false;
    if (/node_modules/.test(sourceURL))
      return true;
    return false;
  };

  const MAX_CACHE_LEN = 5;
  const MAX_WAITING_TIME = 3e4;
  const UUID = "track_uuid";
  const DEFAULT_RESOURCE_THRESHOLD = 1e3;
  const DEFAULT_LOAF_THRESHOLD = 100;
  const DEFAULT_LOAF_SINGLETIME = 50;

  var __defProp$3 = Object.defineProperty;
  var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  var __publicField$3 = (obj, key, value) => {
    __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
    return value;
  };
  class DeviceInfo {
    constructor(uuidKey = UUID) {
      __publicField$3(this, "device");
      __publicField$3(this, "uuid", "");
      this.device = getBrowserNameVersion();
      this.getUUid(uuidKey);
    }
    getUUid(key) {
      try {
        const uuid = localStorage.getItem(key);
        if (uuid) {
          this.uuid = uuid;
        } else {
          this.uuid = nanoid();
          localStorage.setItem(key, this.uuid);
        }
      } catch (e) {
        this.uuid = nanoid();
        console.warn("[CWJ Monitor] localStorage access failed, UUID will not be persisted:", e);
      }
    }
  }

  var __defProp$2 = Object.defineProperty;
  var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  var __publicField$2 = (obj, key, value) => {
    __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
    return value;
  };
  class EventTrack {
    constructor(options, reporter) {
      __publicField$2(this, "deviceInfo");
      __publicField$2(this, "reporter");
      __publicField$2(this, "data");
      this.deviceInfo = new DeviceInfo(options.uuidKey);
      this.reporter = reporter;
      this.data = options.data;
    }
    /**
     * 格式化事件数据用于传输
     */
    formatter(type, data) {
      const timestamp = Date.now();
      return {
        device: this.deviceInfo.device,
        uuid: this.deviceInfo.uuid,
        type,
        data,
        date: getDate(timestamp),
        userData: this.data
      };
    }
    /**
     * 公共方法:发送事件
     * 将事件格式化后交给 reporter 处理
     */
    emit(type, data) {
      const payload = this.formatter(type, data);
      this.reporter.send(payload);
    }
    /**
     * 获取上报器实例 (供 Core 使用)
     */
    getReporter() {
      return this.reporter;
    }
  }

  var __defProp$1 = Object.defineProperty;
  var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  var __publicField$1 = (obj, key, value) => {
    __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
    return value;
  };
  class Reporter {
    constructor(url, config) {
      __publicField$1(this, "url");
      __publicField$1(this, "transportConfig");
      __publicField$1(this, "events", []);
      __publicField$1(this, "isSending", false);
      __publicField$1(this, "timer", null);
      this.url = url;
      this.transportConfig = {
        maxBatchSize: config?.maxBatchSize ?? MAX_CACHE_LEN,
        maxWaitTime: config?.maxWaitTime ?? MAX_WAITING_TIME
      };
      beforeUnload(() => this.flush());
    }
    /**
     * 将事件加入队列
     */
    send(payload) {
      this.events.push(payload);
      if (this.events.length >= this.transportConfig.maxBatchSize) {
        this.clearTimer();
        this.triggerSend();
      } else if (!this.timer) {
        this.timer = setTimeout(() => {
          this.timer = null;
          this.triggerSend();
        }, this.transportConfig.maxWaitTime);
      }
    }
    /**
     * 立即刷新所有待发送事件
     */
    flush() {
      return this.triggerSend(true);
    }
    clearTimer() {
      if (this.timer) {
        clearTimeout(this.timer);
        this.timer = null;
      }
    }
    /**
     * 触发发送逻辑
     */
    async triggerSend(isFlush = false) {
      if (this.isSending || !this.events.length)
        return;
      this.isSending = true;
      try {
        const maxLen = isFlush ? this.events.length : this.transportConfig.maxBatchSize;
        const sendEvents = this.events.slice(0, maxLen);
        this.events = this.events.slice(maxLen);
        await this.safeSend(sendEvents);
        if (this.events.length) {
          nextTime(() => this.triggerSend());
        }
      } catch {
      } finally {
        this.isSending = false;
      }
    }
    /**
     * 使用 navigator.sendBeacon 或 XMLHttpRequest 安全发送事件
     */
    safeSend(events) {
      return new Promise((resolve, reject) => {
        if (!events.length) {
          resolve();
          return;
        }
        const data = JSON.stringify(events);
        if (typeof navigator.sendBeacon === "function") {
          const blob = new Blob([data], { type: "application/json" });
          const success = navigator.sendBeacon(this.url, blob);
          if (success) {
            resolve();
          } else {
            this.sendViaXHR(data, resolve, reject);
          }
        } else {
          this.sendViaXHR(data, resolve, reject);
        }
      });
    }
    /**
     * 通过 XMLHttpRequest 发送
     */
    sendViaXHR(data, resolve, reject) {
      const xhr = new XMLHttpRequest();
      xhr.open("POST", this.url, true);
      xhr.setRequestHeader("Content-Type", "application/json");
      xhr.onload = () => {
        if (xhr.status >= 200 && xhr.status < 300) {
          resolve();
        } else {
          reject(new Error(`HTTP ${xhr.status}: ${xhr.statusText}`));
        }
      };
      xhr.onerror = () => reject(new Error("Network error"));
      xhr.ontimeout = () => reject(new Error("Request timeout"));
      xhr.timeout = 1e4;
      xhr.send(data);
    }
  }

  var TYPES = /* @__PURE__ */ ((TYPES2) => {
    TYPES2["ERROR"] = "error";
    TYPES2["CLICK"] = "click";
    TYPES2["PERFORMANCE"] = "performance";
    TYPES2["ROUTER"] = "router";
    TYPES2["XHR"] = "xhr";
    TYPES2["FETCH"] = "fetch";
    return TYPES2;
  })(TYPES || {});
  var EMIT_TYPE = /* @__PURE__ */ ((EMIT_TYPE2) => {
    EMIT_TYPE2["ERROR"] = "error";
    EMIT_TYPE2["BEHAVIOR_CLICK"] = "click";
    EMIT_TYPE2["ROUTE_CHANGE"] = "route_change";
    EMIT_TYPE2["PERFORMANCE_FP"] = "performance_fp";
    EMIT_TYPE2["PERFORMANCE_FCP"] = "performance_fcp";
    EMIT_TYPE2["PERFORMANCE_LCP"] = "performance_lcp";
    EMIT_TYPE2["PERFORMANCE_INP"] = "performance_inp";
    EMIT_TYPE2["PERFORMANCE_LONGTASK"] = "performance_longtask";
    EMIT_TYPE2["PERFORMANCE_RESOURCE"] = "performance_resource";
    EMIT_TYPE2["PERFORMANCE_LOAF"] = "performance_loaf";
    EMIT_TYPE2["XHR"] = "xhr";
    EMIT_TYPE2["FETCH"] = "fetch";
    EMIT_TYPE2["CUSTOM"] = "custom";
    return EMIT_TYPE2;
  })(EMIT_TYPE || {});

  var __defProp = Object.defineProperty;
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  var __publicField = (obj, key, value) => {
    __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
    return value;
  };
  class Core extends EventTrack {
    constructor(options) {
      const reporter = new Reporter(options.url, options.transport);
      super(options, reporter);
      __publicField(this, "pluginMap", /* @__PURE__ */ new Map());
      __publicField(this, "options");
      this.options = options;
    }
    use(plugin) {
      if (!this.pluginMap.has(plugin.name)) {
        this.pluginMap.set(plugin.name, plugin);
      }
      return this;
    }
    /**
     * 自定义事件上报
     * @param data 上报的数据
     * @param type 事件类型,默认为 'custom'
     */
    log(data, type = EMIT_TYPE.CUSTOM) {
      this.emit(type, data);
    }
    // 启动插件
    run() {
      const context = {
        emit: this.emit.bind(this),
        url: this.options.url
      };
      this.pluginMap.forEach((plugin) => {
        plugin.install(context);
      });
      this.mount();
    }
    // 停止并卸载所有插件
    stop() {
      this.pluginMap.forEach((plugin) => {
        plugin.uninstall?.();
      });
      this.pluginMap.clear();
      this.unmount();
    }
    mount() {
      const { globalKey = "$track" } = this.options;
      if (typeof window !== "undefined") {
        window[globalKey] = this;
      }
    }
    unmount() {
      const { globalKey = "$track" } = this.options;
      if (typeof window !== "undefined" && window[globalKey] === this) {
        delete window[globalKey];
      }
    }
  }
  function createMonitor(options) {
    return new Core(options);
  }

  const ErrorPlugin = (options = {}) => {
    let originalConsoleError;
    let context;
    const overrideConsoleError = () => {
      originalConsoleError = console.error;
      console.error = (...args) => {
        originalConsoleError?.apply(console, args);
        const errorData = {
          type: "console",
          message: args.map((arg) => String(arg)).join(" "),
          stack: new Error().stack
        };
        if (options.filter && !options.filter(errorData)) {
          return;
        }
        context?.emit(EMIT_TYPE.ERROR, errorData);
      };
    };
    const restoreConsoleError = () => {
      if (originalConsoleError) {
        console.error = originalConsoleError;
      }
    };
    const cleanStack = (stack) => {
      if (!stack)
        return void 0;
      const lines = stack.split("\n").slice(0, 11);
      return lines.join("\n");
    };
    const simpleHash = (str) => {
      let hash = 0;
      for (let i = 0; i < str.length; i++) {
        const char = str.charCodeAt(i);
        hash = (hash << 5) - hash + char;
        hash = hash & hash;
      }
      return Math.abs(hash).toString(36);
    };
    const generateFingerprint = (...parts) => {
      const combined = parts.filter(Boolean).join("|");
      return simpleHash(combined);
    };
    const isResourceError = (target) => {
      const resourceTags = ["LINK", "SCRIPT", "IMG", "AUDIO", "VIDEO", "IFRAME"];
      return target && resourceTags.includes(target.tagName);
    };
    const getPromiseErrorDetails = (e) => {
      if (e.reason instanceof Error) {
        return {
          errorType: "promise",
          message: e.reason.message,
          stack: cleanStack(e.reason.stack),
          name: e.reason.name,
          fingerprint: generateFingerprint(e.reason.message, e.reason.stack)
        };
      }
      return {
        errorType: "promise",
        message: String(e.reason)
      };
    };
    const getErrorDetails = (e) => {
      const { error, target, filename, message } = e;
      if (error instanceof Error) {
        return {
          errorType: "js",
          name: error.name,
          message: error.message,
          stack: cleanStack(error.stack),
          filename,
          colno: e.colno,
          lineno: e.lineno,
          fingerprint: generateFingerprint(error.message, error.stack)
        };
      }
      if (isResourceError(target)) {
        const element = target;
        const url = "src" in element ? element.src : element.href;
        return {
          errorType: "resource",
          message: `Resource load failed: ${url}`,
          url,
          tagName: element.tagName,
          fingerprint: generateFingerprint(`resource:${url}`)
        };
      }
      return {
        errorType: "unknown",
        message,
        filename
      };
    };
    const errorHandler = (e) => {
      const errorData = { type: "sync", ...getErrorDetails(e) };
      if (options.filter && !options.filter(errorData))
        return;
      context?.emit(EMIT_TYPE.ERROR, errorData);
    };
    const rejectionHandler = (e) => {
      const errorData = { type: "async", ...getPromiseErrorDetails(e) };
      if (options.filter && !options.filter(errorData))
        return;
      context?.emit(EMIT_TYPE.ERROR, errorData);
    };
    return {
      name: TYPES.ERROR,
      install: (ctx) => {
        context = ctx;
        overrideConsoleError();
        window.addEventListener("error", errorHandler, true);
        window.addEventListener("unhandledrejection", rejectionHandler, true);
      },
      uninstall: () => {
        restoreConsoleError();
        window.removeEventListener("error", errorHandler, true);
        window.removeEventListener("unhandledrejection", rejectionHandler, true);
      }
    };
  };

  const PVPlugin = (options = {}) => {
    let lastRouteTime = Date.now();
    let context;
    let originPushState;
    let originReplaceState;
    const emitRouteChange = (type) => {
      const now = Date.now();
      const to = window.location.href;
      const from = document.referrer;
      if (options.filter && !options.filter(to, from)) {
        return;
      }
      context?.emit(EMIT_TYPE.ROUTE_CHANGE, {
        from,
        to,
        type,
        duration: getSeconds(now, lastRouteTime)
      });
      lastRouteTime = now;
    };
    const handleHashChange = () => emitRouteChange("hashchange");
    const handlePopState = () => emitRouteChange("popstate");
    const setupHistoryListener = () => {
      originPushState = window.history.pushState;
      originReplaceState = window.history.replaceState;
      window.history.pushState = (...args) => {
        originPushState.apply(window.history, args);
        emitRouteChange("pushState");
      };
      window.history.replaceState = (...args) => {
        originReplaceState.apply(window.history, args);
        emitRouteChange("replaceState");
      };
    };
    const restoreHistoryListener = () => {
      if (originPushState)
        window.history.pushState = originPushState;
      if (originReplaceState)
        window.history.replaceState = originReplaceState;
    };
    return {
      name: TYPES.ROUTER,
      install: (ctx) => {
        context = ctx;
        lastRouteTime = Date.now();
        window.addEventListener("hashchange", handleHashChange);
        window.addEventListener("popstate", handlePopState);
        setupHistoryListener();
      },
      uninstall: () => {
        window.removeEventListener("hashchange", handleHashChange);
        window.removeEventListener("popstate", handlePopState);
        restoreHistoryListener();
      }
    };
  };

  const BehaviorPlugin = (options = {}) => {
    const { throttleDelay = 500 } = options;
    let context;
    const getElementXPath = (element) => {
      if (!element || element.nodeType !== 1)
        return "";
      if (element.id)
        return `//*[@id="${element.id}"]`;
      const sameTagSiblings = Array.from(element.parentNode?.children || []).filter(
        (el) => el.tagName === element.tagName
      );
      const idx = sameTagSiblings.indexOf(element) + 1;
      return `${getElementXPath(element.parentNode)}/${element.tagName.toLowerCase()}[${idx}]`;
    };
    const handleClick = throttle((e) => {
      const target = e.target;
      if (!target)
        return;
      if (options.filter && !options.filter(target)) {
        return;
      }
      const clickData = {
        tagName: target.tagName,
        id: target.id,
        className: target.className,
        text: target.textContent?.trim(),
        xPath: getElementXPath(target)
      };
      context?.emit(EMIT_TYPE.BEHAVIOR_CLICK, clickData);
    }, throttleDelay);
    return {
      name: TYPES.CLICK,
      install: (ctx) => {
        context = ctx;
        document.addEventListener(EMIT_TYPE.BEHAVIOR_CLICK, handleClick, true);
      },
      uninstall: () => {
        document.removeEventListener(EMIT_TYPE.BEHAVIOR_CLICK, handleClick, true);
      }
    };
  };

  const PerformancePlugin = (options = {}) => {
    let context;
    let paintObserver = null;
    let lcpObserver = null;
    let resourceObserver = null;
    let loafObserver = null;
    const monitorPaintMetrics = () => {
      const entryHandler = (list) => {
        for (const entry of list.getEntries()) {
          if (entry.name === "first-paint") {
            if (options.filter && !options.filter(EMIT_TYPE.PERFORMANCE_FP, entry.startTime)) {
              continue;
            }
            context?.emit(EMIT_TYPE.PERFORMANCE_FP, entry.startTime);
          } else if (entry.name === "first-contentful-paint") {
            if (options.filter && !options.filter(EMIT_TYPE.PERFORMANCE_FCP, entry.startTime)) {
              continue;
            }
            context?.emit(EMIT_TYPE.PERFORMANCE_FCP, entry.startTime);
          }
        }
        paintObserver?.disconnect();
      };
      try {
        paintObserver = new PerformanceObserver(entryHandler);
        paintObserver.observe({ type: "paint", buffered: true });
      } catch (e) {
        console.warn("[CWJ Monitor] Paint observation not supported:", e);
      }
    };
    const monitorLCP = () => {
      const entryHandler = (list) => {
        if (lcpObserver) {
          lcpObserver.disconnect();
        }
        for (const entry of list.getEntries()) {
          if (options.filter && !options.filter(EMIT_TYPE.PERFORMANCE_LCP, entry.startTime)) {
            continue;
          }
          context?.emit(EMIT_TYPE.PERFORMANCE_LCP, entry.startTime);
        }
      };
      try {
        lcpObserver = new PerformanceObserver(entryHandler);
        lcpObserver.observe({ type: "largest-contentful-paint", buffered: true });
      } catch (e) {
        console.warn("[CWJ Monitor] LCP observation not supported:", e);
      }
    };
    const monitorLoAF = () => {
      const entryHandler = (list) => {
        for (const entry of list.getEntries()) {
          if (options.filter && !options.filter(EMIT_TYPE.PERFORMANCE_LOAF, entry)) {
            continue;
          }
          const threshold = options.loafThreshold ?? DEFAULT_LOAF_THRESHOLD;
          if (typeof entry.duration !== "number" || entry.duration <= threshold)
            continue;
          const scripts = Array.isArray(entry.scripts) ? entry.scripts : [];
          let isUserTriggered = false;
          let allIgnored = true;
          for (let i = 0; i < scripts.length; i++) {
            const s = scripts[i];
            if (!s)
              continue;
            if (!isUserTriggered && s.invokerType === "user-callback")
              isUserTriggered = true;
            if (allIgnored && !isIgnoredScriptSource(s.sourceURL)) {
              allIgnored = false;
            }
            if (isUserTriggered && !allIgnored)
              break;
          }
          if (isUserTriggered && !allIgnored) {
            const baseInfo = {
              duration: entry.duration,
              startTime: entry.startTime,
              renderStart: entry.renderStart,
              styleAndLayoutStart: entry.styleAndLayoutStart,
              hadRecentInput: entry.hadRecentInput,
              scripts: entry.scripts.map((s) => ({
                duration: s.duration,
                invoker: s.invoker,
                invokerType: s.invokerType,
                sourceURL: s.sourceURL,
                functionName: s.functionName,
                sourceFunctionName: s.sourceFunctionName,
                sourceCharPosition: s.sourceCharPosition,
                startTime: s.startTime
              }))
            };
            (async () => {
              const longScripts = scripts.filter(
                (s) => s && typeof s.duration === "number" && s.duration > DEFAULT_LOAF_SINGLETIME && s.sourceURL
              );
              const contexts = [];
              for (const s of longScripts) {
                try {
                  const url = String(s.sourceURL);
                  const resp = await fetch(url, { cache: "no-store" });
                  if (!resp.ok) {
                    contexts.push({ sourceURL: url, error: `http ${resp.status}` });
                    continue;
                  }
                  const text = await resp.text();
                  const pos = typeof s.sourceCharPosition === "number" ? s.sourceCharPosition : void 0;
                  if (pos !== void 0 && Number.isFinite(pos)) {
                    const start = Math.max(0, pos - 50);
                    const end = Math.min(text.length, pos + 50);
                    const snippet = text.substring(start, end);
                    contexts.push({ sourceURL: url, position: pos, snippet });
                  } else {
                    contexts.push({ sourceURL: url, error: "no-position" });
                  }
                } catch (e) {
                  contexts.push({
                    sourceURL: s && s.sourceURL ? String(s.sourceURL) : "",
                    error: e?.message || String(e)
                  });
                }
              }
              const info = { ...baseInfo, contexts };
              context?.emit(EMIT_TYPE.PERFORMANCE_LOAF, info);
            })();
          }
        }
      };
      try {
        loafObserver = new PerformanceObserver(entryHandler);
        loafObserver.observe({ type: "long-animation-frame", buffered: true });
      } catch (e) {
        console.warn("[CWJ Monitor] LoAF observation not supported:", e);
      }
    };
    const monitorResource = () => {
      const entryHandler = (list) => {
        for (const entry of list.getEntries()) {
          if (entry.initiatorType !== "fetch" && entry.initiatorType !== "xmlhttprequest") {
            continue;
          }
          if (options.filter && !options.filter(EMIT_TYPE.PERFORMANCE_RESOURCE, entry)) {
            continue;
          }
          const threshold = options.resourceThreshold ?? DEFAULT_RESOURCE_THRESHOLD;
          if (entry.duration > threshold) {
            context?.emit(EMIT_TYPE.PERFORMANCE_RESOURCE, {
              name: entry.name,
              // 资源 URL
              initiatorType: entry.initiatorType,
              duration: entry.duration,
              startTime: entry.startTime,
              transferSize: entry.transferSize,
              encodedBodySize: entry.encodedBodySize,
              decodedBodySize: entry.decodedBodySize
            });
          }
        }
      };
      try {
        resourceObserver = new PerformanceObserver(entryHandler);
        resourceObserver.observe({ type: "resource", buffered: true });
      } catch (e) {
        console.warn("[CWJ Monitor] Resource observation not supported:", e);
      }
    };
    return {
      name: TYPES.PERFORMANCE,
      install: (ctx) => {
        context = ctx;
        monitorPaintMetrics();
        monitorLCP();
        monitorResource();
        monitorLoAF();
      },
      uninstall: () => {
        paintObserver?.disconnect();
        lcpObserver?.disconnect();
        resourceObserver?.disconnect();
        loafObserver?.disconnect();
      }
    };
  };

  const XHRPlugin = (options = {}) => {
    let context;
    let originOpen;
    let originSend;
    const setupXHRListeners = () => {
      const originXhr = window.XMLHttpRequest;
      if (!originXhr)
        return;
      originOpen = originXhr.prototype.open;
      originSend = originXhr.prototype.send;
      originXhr.prototype.open = function(...args) {
        this._xhr_info = {
          method: args[0].toUpperCase(),
          url: String(args[1]),
          startTime: 0
        };
        return originOpen.apply(this, args);
      };
      originXhr.prototype.send = function(...args) {
        if (this._xhr_info) {
          this._xhr_info.startTime = Date.now();
        }
        const onLoadend = () => {
          if (this._xhr_info) {
            const trackerUrl = context?.url;
            const { url, method, startTime } = this._xhr_info;
            if (trackerUrl && url.includes(trackerUrl)) {
              return;
            }
            if (options.filter && !options.filter(method, url)) {
              return;
            }
            const duration = Date.now() - startTime;
            const status = this.status;
            if (!(status >= 200 && status < 300)) {
              const data = {
                method,
                url,
                status,
                duration,
                // 限制响应体大小,避免数据过大
                response: this.response ? String(this.response).slice(0, 200) : ""
              };
              context?.emit(EMIT_TYPE.XHR, data);
            }
          }
        };
        this.addEventListener("loadend", onLoadend);
        return originSend.apply(this, args);
      };
    };
    const restoreXHR = () => {
      const originXhr = window.XMLHttpRequest;
      if (!originXhr)
        return;
      if (originOpen)
        originXhr.prototype.open = originOpen;
      if (originSend)
        originXhr.prototype.send = originSend;
    };
    return {
      name: TYPES.XHR,
      install: (ctx) => {
        context = ctx;
        setupXHRListeners();
      },
      uninstall: () => {
        restoreXHR();
      }
    };
  };

  const FetchPlugin = (options = {}) => {
    let context;
    let originFetch;
    const setupFetchListeners = () => {
      originFetch = window.fetch;
      if (!originFetch)
        return;
      window.fetch = function(input, init) {
        const startTime = Date.now();
        const method = (init?.method || "GET").toUpperCase();
        const url = input instanceof Request ? input.url : String(input);
        return originFetch.apply(this, [input, init]).then(
          (response) => {
            const trackerUrl = context?.url;
            if (trackerUrl && url.includes(trackerUrl)) {
              return response;
            }
            if (options.filter && !options.filter(method, url)) {
              return response;
            }
            if (!response.ok) {
              const duration = Date.now() - startTime;
              const data = {
                method,
                url,
                status: response.status,
                duration,
                success: false
              };
              context?.emit(EMIT_TYPE.FETCH, data);
            }
            return response;
          },
          (error) => {
            const trackerUrl = context?.url;
            if (trackerUrl && url.includes(trackerUrl)) {
              throw error;
            }
            if (options.filter && !options.filter(method, url)) {
              throw error;
            }
            const duration = Date.now() - startTime;
            const data = {
              method,
              url,
              status: 0,
              duration,
              success: false,
              message: error.message
            };
            context?.emit(EMIT_TYPE.FETCH, data);
            throw error;
          }
        );
      };
    };
    const restoreFetch = () => {
      if (originFetch)
        window.fetch = originFetch;
    };
    return {
      name: TYPES.FETCH,
      install: (ctx) => {
        context = ctx;
        setupFetchListeners();
      },
      uninstall: () => {
        restoreFetch();
      }
    };
  };

  exports.BehaviorPlugin = BehaviorPlugin;
  exports.Core = Core;
  exports.EMIT_TYPE = EMIT_TYPE;
  exports.ErrorPlugin = ErrorPlugin;
  exports.FetchPlugin = FetchPlugin;
  exports.PVPlugin = PVPlugin;
  exports.PerformancePlugin = PerformancePlugin;
  exports.XHRPlugin = XHRPlugin;
  exports.createMonitor = createMonitor;

}));
//# sourceMappingURL=index.umd.js.map