cwj_monitoring
Version:
基于 JS 适用Web端的插件,为前端项目提供【 行为、性能、异常 】监控手段
1 lines • 161 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../node_modules/.pnpm/nanoid@5.1.6/node_modules/nanoid/url-alphabet/index.js","../node_modules/.pnpm/nanoid@5.1.6/node_modules/nanoid/index.browser.js","../src/utils/date.ts","../node_modules/.pnpm/bowser@2.13.1/node_modules/bowser/es5.js","../src/utils/browser.ts","../src/utils/common.ts","../src/constant.ts","../src/core/deviceInfo.ts","../src/core/eventTrack.ts","../src/core/reporter.ts","../src/types/event.ts","../src/core/index.ts","../src/plugin/error.ts","../src/plugin/pv.ts","../src/plugin/behavior.ts","../src/plugin/performance.ts","../src/plugin/xhr.ts","../src/plugin/fetch.ts"],"sourcesContent":["export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","/* @ts-self-types=\"./index.d.ts\" */\nimport { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << Math.log2(alphabet.length - 1)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step | 0\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length >= size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size | 0, random)\nexport let nanoid = (size = 21) => {\n let id = ''\n let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n while (size--) {\n id += scopedUrlAlphabet[bytes[size] & 63]\n }\n return id\n}\n","/* 将时间戳转为年月日 */\nexport const getDate = (time: number = Date.now()) => {\n const date = new Date(time);\n const year = date.getFullYear();\n const month = date.getMonth() + 1; //获取系统月份,由于月份是从0开始计算,所以要加1\n const day = date.getDate();\n const hour = date.getHours();\n const minute = date.getMinutes();\n const second = date.getSeconds();\n\n const formatter = (date: number) => {\n let res = '';\n if (date < 10) {\n res = '0' + date;\n } else {\n res = date.toString();\n }\n return res;\n };\n\n return (\n year +\n '-' +\n formatter(month) +\n '-' +\n formatter(day) +\n ' ' +\n formatter(hour) +\n ':' +\n formatter(minute) +\n ':' +\n formatter(second)\n );\n};\n\n/* 将两个时间戳转为秒 */\nexport const getSeconds = (timestamp1: number, timestamp2: number) => {\n if (timestamp1 < timestamp2) {\n [timestamp1, timestamp2] = [timestamp2, timestamp1];\n }\n\n return Math.floor((timestamp1 - timestamp2) / 1000);\n};\n","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.bowser=t():e.bowser=t()}(this,(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){\"use strict\";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){\"use strict\";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){\"use strict\";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){\"use strict\";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){\"use strict\";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){\"use strict\";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){\"use strict\";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){\"use strict\";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}})}));","import Bowser from 'bowser';\n\n/**\n * 获取浏览器名称和版本等设备信息\n */\nexport function getBrowserNameVersion() {\n const { browser, os, platform } = Bowser.parse(window.navigator.userAgent);\n return {\n browser,\n os,\n platform,\n ratio: getRatio(),\n wh: getWH(),\n };\n}\n\n/**\n * 获取屏幕缩放比例\n */\nfunction getRatio() {\n let ratio = 0;\n const screen: any = window.screen;\n const ua = navigator.userAgent.toLowerCase();\n if (window.devicePixelRatio !== undefined) {\n ratio = window.devicePixelRatio;\n } else if (~ua.indexOf('msie')) {\n if (screen.deviceXDPI && screen.logicalXDPI) {\n ratio = screen.deviceXDPI / screen.logicalXDPI;\n }\n } else if (window.outerWidth !== undefined && window.innerWidth !== undefined) {\n ratio = window.outerWidth / window.innerWidth;\n }\n\n if (ratio) {\n ratio = Math.round(ratio * 100);\n }\n return ratio;\n}\n\n/**\n * 获取浏览器屏幕宽高\n */\nfunction getWH() {\n return {\n width: window.screen.width,\n height: window.screen.height,\n };\n}\n\n/**\n * 异步执行 / 空闲时刻 / 每帧回调\n */\nexport const nextTime =\n window.requestIdleCallback || window.requestAnimationFrame || ((callback) => window.setTimeout(callback, 1000 / 60));\n\n/**\n * 页面卸载前的回调\n */\nexport const beforeUnload = (callback: () => void) => {\n window.addEventListener('beforeunload', () => {\n callback();\n });\n};\n","/**\n * 节流函数\n * @param fn 执行函数\n * @param delay 延迟时间(ms)\n */\nexport function throttle<T extends (...args: any[]) => any>(fn: T, delay: number): (...args: Parameters<T>) => void {\n let lastTime = 0;\n return function (this: any, ...args: Parameters<T>) {\n const now = Date.now();\n if (now - lastTime >= delay) {\n fn.apply(this, args);\n lastTime = now;\n }\n };\n}\n\n/**\n * 过滤函数\n * @param sourceURL 文件地址\n */\nexport const isIgnoredScriptSource = (sourceURL?: string) => {\n if (!sourceURL || typeof sourceURL !== 'string') return false;\n if (/node_modules/.test(sourceURL)) return true;\n return false;\n};\n","/**\n * 事件发送前的最大缓存数\n */\nexport const MAX_CACHE_LEN = 5;\n\n/**\n * 发送缓存事件前的最大等待时间(毫秒)\n */\nexport const MAX_WAITING_TIME = 30000;\n\n/**\n * 存储的用户UUID\n */\nexport const UUID = 'track_uuid';\n\n/**\n * 默认资源加载阈值 (ms)\n */\nexport const DEFAULT_RESOURCE_THRESHOLD = 1000;\n\n/**\n * 默认 LoAF 阈值 (ms)\n */\nexport const DEFAULT_LOAF_THRESHOLD = 100;\n\n/**\n * 默认 LoAF 单次事件阈值 (ms)\n */\nexport const DEFAULT_LOAF_SINGLETIME = 50;\n","import { nanoid } from 'nanoid';\nimport { getBrowserNameVersion } from '../utils';\nimport type { Device } from '../types/index';\nimport { UUID } from '../constant';\n\n//基本信息\nexport default class DeviceInfo {\n device: Device;\n uuid: string = '';\n\n constructor(uuidKey: string = UUID) {\n //设备信息\n this.device = getBrowserNameVersion();\n this.getUUid(uuidKey);\n }\n\n private getUUid(key: string) {\n try {\n const uuid = localStorage.getItem(key);\n if (uuid) {\n this.uuid = uuid;\n } else {\n this.uuid = nanoid();\n localStorage.setItem(key, this.uuid);\n }\n } catch (e) {\n // 降级处理:如果 localStorage 不可用(如隐身模式),仅在内存中生成 UUID\n this.uuid = nanoid();\n console.warn('[CWJ Monitor] localStorage access failed, UUID will not be persisted:', e);\n }\n }\n}\n","import DeviceInfo from './deviceInfo';\nimport { getDate } from '../utils';\nimport type { Options, MonitoringPayload } from '../types/index';\nimport { EMIT_TYPE } from '../types/event';\nimport Reporter from './reporter';\n\n/**\n * EventTrack 类处理事件收集和转换\n * 职责:\n * 1. 管理设备信息 (DeviceInfo)\n * 2. 格式化原始数据为 MonitoringPayload\n * 3. 将格式化后的数据交给 Reporter 发送\n */\nexport default class EventTrack {\n private deviceInfo: DeviceInfo;\n private reporter: Reporter;\n private data?: Record<string, any>;\n\n constructor(options: Options, reporter: Reporter) {\n this.deviceInfo = new DeviceInfo(options.uuidKey);\n this.reporter = reporter;\n this.data = options.data;\n }\n\n /**\n * 格式化事件数据用于传输\n */\n private formatter(type: EMIT_TYPE | string, data: any): MonitoringPayload {\n const timestamp = Date.now();\n return {\n device: this.deviceInfo.device,\n uuid: this.deviceInfo.uuid,\n type,\n data,\n date: getDate(timestamp),\n userData: this.data,\n };\n }\n\n /**\n * 公共方法:发送事件\n * 将事件格式化后交给 reporter 处理\n */\n public emit(type: EMIT_TYPE | string, data?: any): void {\n const payload = this.formatter(type, data);\n this.reporter.send(payload);\n }\n\n /**\n * 获取上报器实例 (供 Core 使用)\n */\n public getReporter(): Reporter {\n return this.reporter;\n }\n}\n","import { MAX_CACHE_LEN, MAX_WAITING_TIME } from '../constant';\nimport { nextTime, beforeUnload } from '../utils';\nimport type { MonitoringPayload, TransportConfig } from '../types/index';\n\n/**\n * Reporter 类负责数据的批量上报、重试和调度\n */\nexport default class Reporter {\n private url: string;\n private transportConfig: Required<TransportConfig>;\n private events: MonitoringPayload[] = [];\n private isSending = false;\n private timer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(url: string, config?: TransportConfig) {\n this.url = url;\n this.transportConfig = {\n maxBatchSize: config?.maxBatchSize ?? MAX_CACHE_LEN,\n maxWaitTime: config?.maxWaitTime ?? MAX_WAITING_TIME,\n };\n\n // 页面卸载前刷新事件\n beforeUnload(() => this.flush());\n }\n\n /**\n * 将事件加入队列\n */\n public send(payload: MonitoringPayload) {\n this.events.push(payload);\n\n // 达到最大批处理大小时立即发送,否则通过定时器发送\n if (this.events.length >= this.transportConfig.maxBatchSize) {\n this.clearTimer();\n this.triggerSend();\n } else if (!this.timer) {\n this.timer = setTimeout(() => {\n this.timer = null;\n this.triggerSend();\n }, this.transportConfig.maxWaitTime);\n }\n }\n\n /**\n * 立即刷新所有待发送事件\n */\n public flush(): Promise<void> {\n return this.triggerSend(true);\n }\n\n private clearTimer() {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n\n /**\n * 触发发送逻辑\n */\n private async triggerSend(isFlush = false): Promise<void> {\n if (this.isSending || !this.events.length) return;\n\n this.isSending = true;\n\n try {\n const maxLen = isFlush ? this.events.length : this.transportConfig.maxBatchSize;\n const sendEvents = this.events.slice(0, maxLen);\n this.events = this.events.slice(maxLen);\n\n await this.safeSend(sendEvents);\n\n // 如果还有剩余事件,调度下次发送\n if (this.events.length) {\n nextTime(() => this.triggerSend());\n }\n } catch {\n // 失败处理逻辑,目前简单忽略\n } finally {\n this.isSending = false;\n }\n }\n\n /**\n * 使用 navigator.sendBeacon 或 XMLHttpRequest 安全发送事件\n */\n private safeSend(events: MonitoringPayload[]): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!events.length) {\n resolve();\n return;\n }\n\n const data = JSON.stringify(events);\n\n // 优先尝试 sendBeacon(更适合页面卸载)\n if (typeof navigator.sendBeacon === 'function') {\n const blob = new Blob([data], { type: 'application/json' });\n const success = navigator.sendBeacon(this.url, blob);\n\n if (success) {\n resolve();\n } else {\n this.sendViaXHR(data, resolve, reject);\n }\n } else {\n // 降级到 XMLHttpRequest\n this.sendViaXHR(data, resolve, reject);\n }\n });\n }\n\n /**\n * 通过 XMLHttpRequest 发送\n */\n private sendViaXHR(data: string, resolve: () => void, reject: (error: Error) => void): void {\n const xhr = new XMLHttpRequest();\n\n xhr.open('POST', this.url, true);\n xhr.setRequestHeader('Content-Type', 'application/json');\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve();\n } else {\n reject(new Error(`HTTP ${xhr.status}: ${xhr.statusText}`));\n }\n };\n\n xhr.onerror = () => reject(new Error('Network error'));\n xhr.ontimeout = () => reject(new Error('Request timeout'));\n\n xhr.timeout = 10000;\n xhr.send(data);\n }\n}\n","/**\n * 插件类型标识符\n * 用于插件注册和配置\n */\nexport enum TYPES {\n ERROR = 'error',\n CLICK = 'click',\n PERFORMANCE = 'performance',\n ROUTER = 'router',\n XHR = 'xhr',\n FETCH = 'fetch',\n}\n\n/**\n * 事件发送类型标识符\n * 用于向追踪系统发送事件时使用\n */\nexport enum EMIT_TYPE {\n // 错误事件\n ERROR = 'error',\n\n // 行为事件\n BEHAVIOR_CLICK = 'click',\n ROUTE_CHANGE = 'route_change',\n\n // 性能事件 - Core Web Vitals\n PERFORMANCE_FP = 'performance_fp',\n PERFORMANCE_FCP = 'performance_fcp',\n PERFORMANCE_LCP = 'performance_lcp',\n PERFORMANCE_INP = 'performance_inp',\n PERFORMANCE_LONGTASK = 'performance_longtask',\n PERFORMANCE_RESOURCE = 'performance_resource',\n PERFORMANCE_LOAF = 'performance_loaf',\n\n // XHR 事件\n XHR = 'xhr',\n FETCH = 'fetch',\n\n // 自定义事件\n CUSTOM = 'custom',\n}\n","import EventTrack from './eventTrack';\nimport Reporter from './reporter';\nimport type { Options } from '../types/index';\nimport type { IPlugin } from '../plugin/definePlugin';\nimport { EMIT_TYPE } from '../types/event';\n\nexport default class Core extends EventTrack {\n private pluginMap: Map<string, IPlugin> = new Map();\n private options: Options;\n\n constructor(options: Options) {\n const reporter = new Reporter(options.url, options.transport);\n super(options, reporter);\n this.options = options;\n }\n\n use(plugin: IPlugin): Core {\n if (!this.pluginMap.has(plugin.name)) {\n this.pluginMap.set(plugin.name, plugin);\n }\n return this; // 方便链式调用\n }\n\n /**\n * 自定义事件上报\n * @param data 上报的数据\n * @param type 事件类型,默认为 'custom'\n */\n log(data: any, type: string = EMIT_TYPE.CUSTOM): void {\n this.emit(type, data);\n }\n\n // 启动插件\n run() {\n const context = {\n emit: this.emit.bind(this),\n url: this.options.url,\n };\n\n this.pluginMap.forEach((plugin) => {\n plugin.install(context);\n });\n\n // 挂载全局变量\n this.mount();\n }\n\n // 停止并卸载所有插件\n stop() {\n this.pluginMap.forEach((plugin) => {\n plugin.uninstall?.();\n });\n this.pluginMap.clear();\n\n // 卸载全局变量\n this.unmount();\n }\n\n private mount() {\n const { globalKey = '$track' } = this.options;\n if (typeof window !== 'undefined') {\n (window as any)[globalKey] = this;\n }\n }\n\n private unmount() {\n const { globalKey = '$track' } = this.options;\n if (typeof window !== 'undefined' && (window as any)[globalKey] === this) {\n delete (window as any)[globalKey];\n }\n }\n}\n\n/**\n * 创建监控实例的工厂函数\n * @param options 配置项\n */\nexport function createMonitor(options: Options): Core {\n return new Core(options);\n}\n","import { IPlugin, PluginContext } from './definePlugin';\nimport { EMIT_TYPE, TYPES } from '../types/event';\n\nexport interface ErrorOptions {\n /** 过滤函数,返回 false 则不记录该错误 */\n filter?: (error: any) => boolean;\n}\n\n/**\n * 错误监控插件\n * 监控并捕获 JavaScript 错误、资源加载错误、Promise 拒绝以及 console.error 调用\n */\nexport const ErrorPlugin = (options: ErrorOptions = {}): IPlugin => {\n let originalConsoleError: (...data: any[]) => void;\n let context: PluginContext;\n\n /**\n * 重写 console.error 以捕获错误日志\n */\