js-use-core
Version:
JavaScript Comprehensive tool library, including full screen, copy and paste functions
2 lines (1 loc) • 45.2 kB
JavaScript
function e(e){if(!e||"string"!=typeof e)return{major:NaN,minor:NaN,patch:NaN,version:""};try{let t=e.replace(/\s*\(.*?\)\s*/g,"").replace(/[^\d.]/g,"").trim();if(t=t.replace(/\.+/g,"."),t=t.replace(/^\.+|\.+$/g,""),!t)return{major:NaN,minor:NaN,patch:NaN,version:""};const r=t.split("."),s=r[0]?parseInt(r[0],10):NaN,i=r[1]?parseInt(r[1],10):NaN,n=r[2]?parseInt(r[2],10):NaN;return isNaN(s)&&process.env.NODE_ENV,{major:isNaN(s)?NaN:s,minor:isNaN(i)?NaN:i,patch:isNaN(n)?NaN:n,version:t}}catch(e){return process.env.NODE_ENV,{major:NaN,minor:NaN,patch:NaN,version:""}}}function t(t=""){const r={browser:{name:"Unknown",version:"",major:NaN,minor:NaN,patch:NaN},engine:{name:"Unknown",version:""},os:{name:"Unknown",version:""},device:{type:"desktop"},cpu:{architecture:"unknown"},isBot:!1,isWebView:!1,isHeadless:!1,source:t||""};if(!t||"string"!=typeof t)return r;try{const s=t.trim();if(!s)return r;const i=function(t){if(!t||"string"!=typeof t)return{name:"Unknown",version:"",major:NaN,minor:NaN,patch:NaN};try{if(/Edg\/|EdgA\/|EdgDev\/|EdgiOS\//.test(t)){let r=t.match(/Edg\/([\d.]+)/),s="stable";return/EdgA\//.test(t)?(r=t.match(/EdgA\/([\d.]+)/),s="beta"):/EdgDev\//.test(t)?(r=t.match(/EdgDev\/([\d.]+)/),s="dev"):/EdgiOS\//.test(t)&&(r=t.match(/EdgiOS\/([\d.]+)/)),{name:"Edge",channel:s,...e(r?.[1]||"")}}if(/SamsungBrowser\//.test(t)){const r=t.match(/SamsungBrowser\/([\d.]+)/);return{name:"Samsung",...e(r?.[1]||"")}}if(/OPR\/|Opera\//.test(t)){let r=t.match(/OPR\/([\d.]+)/);return r||(r=t.match(/Opera\/([\d.]+)/)),{name:"Opera",...e(r?.[1]||"")}}if(/Chrome\//.test(t)&&!/Edg\/|EdgA\/|EdgDev\/|OPR\/|SamsungBrowser\//.test(t)){const r=t.match(/Chrome\/([\d.]+)/),s=e(r?.[1]||"");let i="stable";return/Chrome\/.*?beta/i.test(t)?i="beta":/Chrome\/.*?dev/i.test(t)?i="dev":/Chrome\/.*?canary/i.test(t)&&(i="canary"),{name:"Chrome",channel:i,...s}}if(/Firefox\//.test(t)){const r=t.match(/Firefox\/([\d.]+)/),s=e(r?.[1]||"");let i="stable";return/Firefox\/.*?beta/i.test(t)?i="beta":/Firefox\/.*?nightly/i.test(t)?i="nightly":/Firefox\/.*?esr/i.test(t)&&(i="esr"),{name:"Firefox",channel:i,...s}}if(/Safari\//.test(t)&&!/Chrome\//.test(t)){const r=t.match(/Version\/([\d.]+).*?Safari/);return{name:"Safari",...e(r?.[1]||"")}}if(/MSIE|Trident\//.test(t)){let r=t.match(/MSIE ([\d.]+)/);return r||(r=t.match(/rv:([\d.]+).*?Trident/)),{name:"IE",...e(r?.[1]||"")}}if(/QQBrowser\//.test(t)){const r=t.match(/QQBrowser\/([\d.]+)/);return{name:"QQ",...e(r?.[1]||"")}}if(/UCBrowser\//.test(t)){const r=t.match(/UCBrowser\/([\d.]+)/);return{name:"UC",...e(r?.[1]||"")}}if(/360SE|360EE/.test(t))return{name:"360",version:"",major:NaN,minor:NaN,patch:NaN};if(/SE\s[\d.X]+|SogouMobileBrowser/.test(t)){const r=t.match(/SE\s([\d.X]+)|SogouMobileBrowser\/([\d.]+)/);return{name:"Sogou",...e(r?.[1]||r?.[2]||"")}}return{name:"Unknown",version:"",major:NaN,minor:NaN,patch:NaN}}catch(e){return process.env.NODE_ENV,{name:"Unknown",version:"",major:NaN,minor:NaN,patch:NaN}}}(s),n=function(e){if(!e)return{name:"Unknown",version:""};if(/Chrome\//.test(e)||/Edg\/|EdgA\/|EdgDev\//.test(e)||/OPR\//.test(e)){const t=e.match(/Chrome\/([\d.]+)/);return{name:"Blink",version:t?.[1]||""}}if(/WebKit\//.test(e)&&!/Chrome\//.test(e)){const t=e.match(/WebKit\/([\d.]+)/);return{name:"WebKit",version:t?.[1]||""}}if(/Gecko\//.test(e)&&/Firefox\//.test(e)){const t=e.match(/rv:([\d.]+)/);return{name:"Gecko",version:t?.[1]||""}}if(/Trident\//.test(e)){const t=e.match(/Trident\/([\d.]+)/);return{name:"Trident",version:t?.[1]||""}}if(/Presto\//.test(e)){const t=e.match(/Presto\/([\d.]+)/);return{name:"Presto",version:t?.[1]||""}}return{name:"Unknown",version:""}}(s),o=function(e){if(!e||"string"!=typeof e)return{name:"Unknown",version:""};try{if(/iPhone|iPad|iPod/.test(e)){const t=e.match(/OS ([\d_]+)/);return{name:"iOS",version:t?.[1]?.replace(/_/g,".")||""}}if(/HarmonyOS/.test(e)){const t=e.match(/HarmonyOS ([\d.]+)/);return{name:"HarmonyOS",version:t?.[1]||""}}if(/Android/.test(e)){const t=e.match(/Android ([\d.]+)/);return{name:"Android",version:t?.[1]||""}}if(/Windows/.test(e)){let t="";if(/Windows NT 10\.0/.test(e))t=/Windows NT 10\.0.*?(?:22000|22621|22631|23000)/.test(e)?"11":"10";else if(/Windows NT 6\.3/.test(e))t="8.1";else if(/Windows NT 6\.2/.test(e))t="8";else if(/Windows NT 6\.1/.test(e))t="7";else if(/Windows NT 6\.0/.test(e))t="Vista";else if(/Windows NT 5\.2/.test(e))t="XP";else if(/Windows NT 5\.1/.test(e))t="XP";else if(/Windows NT 5\.0/.test(e))t="2000";else{const r=e.match(/Windows NT ([\d.]+)/);t=r?.[1]||""}return{name:"Windows",version:t}}if(/Mac OS X|macOS/.test(e)){const t=e.match(/Mac OS X ([\d_]+)/);let r=t?.[1]?.replace(/_/g,".")||"";if(r.startsWith("10.16")||r.startsWith("11.")){const e=r.match(/^(\d+)/);e&&parseInt(e[1])>=11||r.startsWith("10.16")&&(r="11.0")}return{name:"macOS",version:r}}if(/Linux/.test(e)&&!/Android/.test(e)&&!/HarmonyOS/.test(e)){if(/Ubuntu/.test(e)){const t=e.match(/Ubuntu\/([\d.]+)/);return{name:"Ubuntu",version:t?.[1]||""}}return/CentOS/.test(e)?{name:"CentOS",version:""}:{name:"Linux",version:""}}if(/CrOS/.test(e)){const t=e.match(/CrOS [\w]+ ([\d.]+)/);return{name:"Chrome OS",version:t?.[1]||""}}if(/FreeBSD/.test(e)){const t=e.match(/FreeBSD ([\d.]+)/);return{name:"FreeBSD",version:t?.[1]||""}}return{name:"Unknown",version:""}}catch(e){return process.env.NODE_ENV,{name:"Unknown",version:""}}}(s),a=function(e){if(!e||"string"!=typeof e)return{type:"desktop"};try{if(/TV|SmartTV|SMART-TV|GoogleTV|AppleTV|Roku|WebOS|Tizen.*TV/.test(e)){let t="",r="";return/AppleTV/.test(e)?(t="Apple",r="Apple TV"):/GoogleTV/.test(e)?(t="Google",r="Google TV"):/WebOS/.test(e)?(t="LG",r="WebOS TV"):/Tizen.*TV/.test(e)&&(t="Samsung",r="Tizen TV"),{type:"tv",vendor:t||void 0,model:r||void 0}}if(/Watch|wearable|WearOS/i.test(e)){let t="",r="";return/Apple.*Watch/.test(e)?(t="Apple",r="Apple Watch"):/WearOS/.test(e)&&(t="Google",r="Wear OS"),{type:"wearable",vendor:t||void 0,model:r||void 0}}if(/iPad/.test(e)||/Android/.test(e)&&!/Mobile/.test(e)&&!/TV/.test(e)){let t="",r="";if(/iPad/.test(e))t="Apple",r="iPad",/iPad.*Pro/.test(e)?r="iPad Pro":/iPad.*Air/.test(e)?r="iPad Air":/iPad.*Mini/.test(e)&&(r="iPad Mini");else if(/SM-T/.test(e)){t="Samsung";const s=e.match(/SM-T[\w]+/);r=s?.[0]||""}else/Pixel.*Tablet/.test(e)&&(t="Google",r="Pixel Tablet");return{type:"tablet",vendor:t||void 0,model:r||void 0}}if(/Mobile|iPhone|iPod|Android.*Mobile|BlackBerry|IEMobile|Opera.*Mini/.test(e)){let t="",r="";if(/iPhone/.test(e)){t="Apple",r="iPhone";const s=e.match(/iPhone(\d+,\d+)/);s&&(r=`iPhone ${s[1]}`)}else if(/iPod/.test(e))t="Apple",r="iPod";else if(/SM-/.test(e)){t="Samsung";const s=e.match(/SM-[\w]+/);r=s?.[0]||""}else if(/Pixel/.test(e)){t="Google";const s=e.match(/Pixel( \d+)?( Pro| XL)?/);r=s?.[0]||"Pixel"}else if(/MI\s/.test(e)||/Redmi/.test(e)){t="Xiaomi";const s=e.match(/(MI \w+|Redmi \w+)/);r=s?.[0]||""}else if(/HUAWEI|Honor/.test(e)){t="Huawei";const s=e.match(/(HUAWEI [\w-]+|Honor [\w-]+)/);r=s?.[0]||""}else if(/OPPO/.test(e)){t="OPPO";const s=e.match(/OPPO ([\w-]+)/);r=s?.[1]||""}else if(/vivo/.test(e)){t="Vivo";const s=e.match(/vivo ([\w-]+)/);r=s?.[1]||""}else if(/OnePlus/.test(e)){t="OnePlus";const s=e.match(/OnePlus ([\w-]+)/);r=s?.[1]||""}return{type:"mobile",vendor:t||void 0,model:r||void 0}}return{type:"desktop"}}catch(e){return process.env.NODE_ENV,{type:"desktop"}}}(s),c=function(e){return/WOW64|Win64|x64|amd64|x86_64/.test(e)?{architecture:"amd64"}:/arm64|aarch64/.test(e)?{architecture:"arm64"}:/arm/.test(e)?{architecture:"arm"}:/loongarch64/.test(e)?{architecture:"loongarch64"}:/riscv64/.test(e)?{architecture:"riscv64"}:/i386|i686|x86/.test(e)?{architecture:"ia32"}:{architecture:"unknown"}}(s),u=function(e){if(!e||"string"!=typeof e)return!1;const t=[/googlebot/i,/bingbot/i,/baiduspider/i,/yandexbot/i,/sogou.*spider/i,/360spider/i,/duckduckbot/i,/msnbot/i,/yahoo.*slurp/i,/applebot/i,/facebookexternalhit/i,/twitterbot/i,/linkedinbot/i,/whatsapp/i,/telegrambot/i,/slackbot/i,/discordbot/i,/skypebot/i,/crawler/i,/spider/i,/scraper/i,/fetcher/i,/monitor/i,/checker/i,/validator/i,/bot[\s\/]/i,/\sbot$/i,/^bot/i,/curl/i,/wget/i,/python-requests/i,/java\//i,/go-http-client/i,/okhttp/i,/axios/i,/node-fetch/i,/pingdom/i,/uptimerobot/i,/statuscake/i,/newrelic/i,/datadog/i];try{return t.some(t=>t.test(e))}catch(e){return process.env.NODE_ENV,!1}}(s),h=function(e){if(!e||"string"!=typeof e)return!1;try{return!(!/MicroMessenger/i.test(e)&&!/QQ\//i.test(e)&&!/Weibo/i.test(e)&&!/DingTalk/i.test(e)&&!/AlipayClient/i.test(e)&&!/Lark/i.test(e)&&!/ByteDance/i.test(e)&&!/TikTok/i.test(e)&&!/Douyin/i.test(e)&&!/Taobao/i.test(e)&&!/Tmall/i.test(e)&&!/JD/i.test(e)&&!/Meituan/i.test(e)&&!/Eleme/i.test(e)&&!/Instagram/i.test(e)&&!/Facebook/i.test(e)&&!/Twitter/i.test(e)&&!/LinkedIn/i.test(e)&&!/Pinterest/i.test(e)&&!/Snapchat/i.test(e)&&!/WhatsApp/i.test(e)&&!/Telegram/i.test(e)&&!/Line/i.test(e)&&!/Electron/i.test(e)&&!/Tauri/i.test(e)&&!/Cordova/i.test(e)&&!/Capacitor/i.test(e)&&!/ReactNative/i.test(e)&&!/Flutter/i.test(e)&&!/Xamarin/i.test(e)&&!/Ionic/i.test(e)&&!/wv\)|WebView/i.test(e)&&(!/Version\/[\d.]+.*Mobile.*Safari/i.test(e)||!/wv/i.test(e))&&(!/Android.*Version\/[\d.]+.*Chrome\/[\d.]+.*Mobile.*Safari/i.test(e)||/Chrome\/[\d.]+\.0\.0\.0/i.test(e)))}catch(e){return process.env.NODE_ENV,!1}}(s),l=function(e){if(!e||"string"!=typeof e)return!1;try{return!!(/HeadlessChrome/i.test(e)||/PhantomJS/i.test(e)||/Puppeteer/i.test(e)||/Playwright/i.test(e)||/Selenium/i.test(e)||/Chrome.*--headless/i.test(e)||/Firefox.*Headless/i.test(e)||/SlimerJS/i.test(e)||/HtmlUnit/i.test(e)||/Zombie/i.test(e))}catch(e){return process.env.NODE_ENV,!1}}(s);return{browser:i,engine:n,os:o,device:a,cpu:c,isBot:u,isWebView:h,isHeadless:l,source:t}}catch(e){return process.env.NODE_ENV,{...r,source:t}}}Object.defineProperty(exports,"__esModule",{value:!0});const r="120.0.0.0",s="17.0",i="23.0",n="537.36";class o{constructor(e){this.spec=e}buildSystemInfo(){const{os:e,cpu:t}=this.spec;let r="10.0";switch(e.version){case"11":case"10":default:r="10.0";break;case"8.1":r="6.3";break;case"8":r="6.2";break;case"7":r="6.1"}return`(Windows NT ${r}; ${"amd64"===t.architecture?"Win64; x64":"arm64"===t.architecture?"ARM64":"Win32"})`}buildWebKitInfo(){return"AppleWebKit/537.36 (KHTML, like Gecko)"}buildBrowserInfo(){const{browser:e}=this.spec,t=e.version||r;switch(e.name?.toLowerCase()){case"chrome":default:return`Chrome/${t} Safari/537.36`;case"edge":return`Chrome/${t} Safari/537.36 Edg/${t}`;case"firefox":return`Gecko/20100101 Firefox/${t}`;case"opera":return`Chrome/${t} Safari/537.36 OPR/${t}`}}}class a{constructor(e){this.spec=e}buildSystemInfo(){const{os:e,cpu:t}=this.spec,r=e.version?.replace(/\./g,"_")||"10_15_7";return`(Macintosh; ${"arm64"===t.architecture?"ARM64":"Intel"} Mac OS X ${r})`}buildWebKitInfo(){return"AppleWebKit/537.36 (KHTML, like Gecko)"}buildBrowserInfo(){const{browser:e}=this.spec,t=e.version||r;switch(e.name?.toLowerCase()){case"chrome":default:return`Chrome/${t} Safari/537.36`;case"edge":return`Chrome/${t} Safari/537.36 Edg/${t}`;case"firefox":return`Gecko/20100101 Firefox/${t}`;case"safari":return`Version/${t} Safari/605.1.15`;case"opera":return`Chrome/${t} Safari/537.36 OPR/${t}`}}}class c{constructor(e){this.spec=e}buildSystemInfo(){const{cpu:e}=this.spec;return`(X11; Linux ${"amd64"===e.architecture?"x86_64":"arm64"===e.architecture?"aarch64":e.architecture||"x86_64"})`}buildWebKitInfo(){return"AppleWebKit/537.36 (KHTML, like Gecko)"}buildBrowserInfo(){const{browser:e}=this.spec,t=e.version||r;switch(e.name?.toLowerCase()){case"chrome":default:return`Chrome/${t} Safari/537.36`;case"firefox":return`Gecko/20100101 Firefox/${t}`;case"opera":return`Chrome/${t} Safari/537.36 OPR/${t}`}}}class u{constructor(e){this.spec=e}buildSystemInfo(){const{os:e,device:t}=this.spec,r=e.version?.replace(/\./g,"_")||"17_0";return"tablet"===t.type?`(iPad; CPU OS ${r} like Mac OS X)`:`(iPhone; CPU iPhone OS ${r} like Mac OS X)`}buildWebKitInfo(){return"AppleWebKit/605.1.15 (KHTML, like Gecko)"}buildBrowserInfo(){const{browser:e}=this.spec;return`Version/${e.version||s} Mobile/15E148 Safari/604.1`}}class h{constructor(e){this.spec=e}buildSystemInfo(){const{os:e,device:t}=this.spec;return`(Linux; Android ${e.version||"14"}; ${t.model||("tablet"===t.type?"SM-T870":"SM-G991B")})`}buildWebKitInfo(){return"AppleWebKit/537.36 (KHTML, like Gecko)"}buildBrowserInfo(){const{browser:e,device:t}=this.spec,s=e.version||r,n="mobile"===t.type?"Mobile ":"";switch(e.name?.toLowerCase()){case"chrome":default:return`Chrome/${s} ${n}Safari/537.36`;case"samsung":return`Chrome/${s} ${n}Safari/537.36 SamsungBrowser/${e.version||i}`}}}function l(e){try{const t=function(e){return{browser:{name:"Chrome",version:r,major:120,minor:0,patch:0,...e.browser},engine:{name:"Blink",version:n,...e.engine},os:{name:"Windows",version:"10",...e.os},device:{type:"desktop",...e.device},cpu:{architecture:"amd64",...e.cpu}}}(e),s=function(e){switch(e.os.name?.toLowerCase()){case"windows":default:return new o(e);case"macos":return new a(e);case"linux":return new c(e);case"ios":return new u(e);case"android":return new h(e)}}(t);return["Mozilla/5.0",s.buildSystemInfo(),s.buildWebKitInfo(),s.buildBrowserInfo()].join(" ").replace(/\s+/g," ").trim()}catch(e){return process.env.NODE_ENV,"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}}const d={chromeWindows:(e="120.0.0.0")=>l({browser:{name:"Chrome",version:e},os:{name:"Windows",version:"10"},cpu:{architecture:"amd64"}}),chromeMac:(e="120.0.0.0")=>l({browser:{name:"Chrome",version:e},os:{name:"macOS",version:"10.15.7"},cpu:{architecture:"amd64"}}),chromeMacARM:(e="120.0.0.0")=>l({browser:{name:"Chrome",version:e},os:{name:"macOS",version:"12.0.0"},cpu:{architecture:"arm64"}}),safariIOS:(e="17.0")=>l({browser:{name:"Safari",version:e},os:{name:"iOS",version:"17.0"},device:{type:"mobile",vendor:"Apple",model:"iPhone"}}),safariIPad:(e="17.0")=>l({browser:{name:"Safari",version:e},os:{name:"iOS",version:"17.0"},device:{type:"tablet",vendor:"Apple",model:"iPad"}}),chromeAndroid:(e="120.0.0.0")=>l({browser:{name:"Chrome",version:e},os:{name:"Android",version:"14"},device:{type:"mobile",vendor:"Samsung",model:"SM-G991B"}}),samsungInternet:(e="23.0")=>l({browser:{name:"Samsung",version:e},os:{name:"Android",version:"14"},device:{type:"mobile",vendor:"Samsung",model:"SM-G991B"}}),edgeWindows:(e="120.0.0.0")=>l({browser:{name:"Edge",version:e},os:{name:"Windows",version:"11"},cpu:{architecture:"amd64"}}),edgeMac:(e="120.0.0.0")=>l({browser:{name:"Edge",version:e},os:{name:"macOS",version:"10.15.7"},cpu:{architecture:"amd64"}}),firefoxWindows:(e="120.0")=>l({browser:{name:"Firefox",version:e},os:{name:"Windows",version:"10"},cpu:{architecture:"amd64"}}),firefoxMac:(e="120.0")=>l({browser:{name:"Firefox",version:e},os:{name:"macOS",version:"10.15.7"},cpu:{architecture:"amd64"}}),firefoxLinux:(e="120.0")=>l({browser:{name:"Firefox",version:e},os:{name:"Linux",version:""},cpu:{architecture:"amd64"}}),safariMac:(e="17.0")=>l({browser:{name:"Safari",version:e},os:{name:"macOS",version:"10.15.7"},cpu:{architecture:"amd64"}}),operaWindows:(e="106.0.0.0")=>l({browser:{name:"Opera",version:e},os:{name:"Windows",version:"10"},cpu:{architecture:"amd64"}}),getTemplateNames:()=>Object.keys(d).filter(e=>"getTemplateNames"!==e),getRandom:()=>{const e=d.getTemplateNames(),t=e[Math.floor(Math.random()*e.length)];return d[t]()}};var m;function p(e){if(!e||"string"!=typeof e)return{major:0,minor:0,patch:0,raw:e||""};try{let t,r=e.trim();const s=r.match(/[-+]?([a-zA-Z]+[\w.-]*)/);s&&(t=s[1],r=r.replace(/[-+][a-zA-Z]+[\w.-]*/,""));const i=r.split(".").map(e=>{const t=parseInt(e,10);return isNaN(t)?0:t});return{major:i[0]||0,minor:i[1]||0,patch:i[2]||0,build:i[3],prerelease:t,raw:e}}catch(t){return process.env.NODE_ENV,{major:0,minor:0,patch:0,raw:e}}}function f(e,t){if(e===t)return exports.ComparisonResult.EQUAL;const r=p(e),s=p(t);if(r.major!==s.major)return r.major<s.major?exports.ComparisonResult.LESS_THAN:exports.ComparisonResult.GREATER_THAN;if(r.minor!==s.minor)return r.minor<s.minor?exports.ComparisonResult.LESS_THAN:exports.ComparisonResult.GREATER_THAN;if(r.patch!==s.patch)return r.patch<s.patch?exports.ComparisonResult.LESS_THAN:exports.ComparisonResult.GREATER_THAN;if(void 0!==r.build&&void 0!==s.build){if(r.build!==s.build)return r.build<s.build?exports.ComparisonResult.LESS_THAN:exports.ComparisonResult.GREATER_THAN}else{if(void 0!==r.build)return exports.ComparisonResult.GREATER_THAN;if(void 0!==s.build)return exports.ComparisonResult.LESS_THAN}return r.prerelease&&s.prerelease?r.prerelease.localeCompare(s.prerelease):r.prerelease?exports.ComparisonResult.LESS_THAN:s.prerelease?exports.ComparisonResult.GREATER_THAN:exports.ComparisonResult.EQUAL}function g(e,t){try{let r;if("string"==typeof e){const{parseUA:t}=require("./parser");r=t(e)}else r=e;return Array.isArray(t)?t.some(e=>R(r,e)):R(r,t)}catch(e){return process.env.NODE_ENV,!1}}function R(e,t){const r=function(e){if(!e||"string"!=typeof e)return null;try{const t=e.trim(),r=[/^(\w+)\s*(>=|>|<=|<|===|!==|==|!=)\s*(\d+(?:\.\d+)*(?:[-+][a-zA-Z]+[\w.-]*)?)$/,/^["'](\w+)["']\s*(>=|>|<=|<|===|!==|==|!=)\s*(\d+(?:\.\d+)*(?:[-+][a-zA-Z]+[\w.-]*)?)$/,/^([\w\s]+?)\s+(>=|>|<=|<|===|!==|==|!=)\s+(\d+(?:\.\d+)*(?:[-+][a-zA-Z]+[\w.-]*)?)$/];for(const e of r){const r=t.match(e);if(r){let e=r[2];"=="===e&&(e="==="),"!="===e&&(e="!==");const t=e;return{browser:r[1].trim(),operator:t,version:r[3]}}}return null}catch(e){return process.env.NODE_ENV,null}}(t);return r?!!E(e.browser.name,r.browser)&&function(e,t,r){try{if(("==="===t||"!=="===t)&&/^\d+$/.test(r)){const s=p(e),i=parseInt(r,10);return"==="===t?s.major===i:s.major!==i}const s=f(e,r);switch(t){case">=":return s>=exports.ComparisonResult.EQUAL;case">":return s>exports.ComparisonResult.EQUAL;case"<=":return s<=exports.ComparisonResult.EQUAL;case"<":return s<exports.ComparisonResult.EQUAL;case"===":return s===exports.ComparisonResult.EQUAL;case"!==":return s!==exports.ComparisonResult.EQUAL;default:return process.env.NODE_ENV,!1}}catch(e){return process.env.NODE_ENV,!1}}(e.browser.version,r.operator,r.version):(process.env.NODE_ENV,!1)}function E(e,t){const r=e.toLowerCase(),s=t.toLowerCase();if(r===s)return!0;const i={chrome:["chrome","chromium","google chrome"],firefox:["firefox","ff","mozilla firefox"],safari:["safari","mobile safari"],edge:["edge","microsoft edge","msedge"],ie:["ie","internet explorer","msie"],opera:["opera","opr"],samsung:["samsung","samsung internet","samsungbrowser"],qq:["qq","qqbrowser"],uc:["uc","ucbrowser"],sogou:["sogou","sogou browser"],360:["360","360se","360ee"]};for(const[e,t]of Object.entries(i))if(t.includes(r)&&t.includes(s))return!0;return!1}exports.ComparisonResult=void 0,(m=exports.ComparisonResult||(exports.ComparisonResult={}))[m.LESS_THAN=-1]="LESS_THAN",m[m.EQUAL=0]="EQUAL",m[m.GREATER_THAN=1]="GREATER_THAN";const S={modern:{Chrome:80,Edge:80,Firefox:72,Safari:13.1,Opera:67,Samsung:12,QQ:10,UC:12,Sogou:8},es2020:{Chrome:80,Edge:80,Firefox:72,Safari:13.1,Opera:67,Samsung:13},webgl2:{Chrome:56,Edge:79,Firefox:51,Safari:15,Opera:43,Samsung:6},webassembly:{Chrome:57,Edge:16,Firefox:52,Safari:11,Opera:44,Samsung:7},serviceWorker:{Chrome:40,Edge:17,Firefox:44,Safari:11.1,Opera:27,Samsung:4},cssGrid:{Chrome:57,Edge:16,Firefox:52,Safari:10.1,Opera:44,Samsung:6},esModules:{Chrome:61,Edge:16,Firefox:60,Safari:10.1,Opera:48,Samsung:8}};function v(e,t){const r=S[t];if(!r)return!1;const{browser:s}=e,i=r[s.name];if(void 0===i)return!1;if("string"==typeof i)return f(s.version,i)>=exports.ComparisonResult.EQUAL;if("Safari"===s.name){const e=parseFloat(s.version);return!isNaN(e)&&e>=i}return!isNaN(s.major)&&s.major>=i}function O(e,t={}){try{const{es2020:r=!0,webgl2:s=!1,webassembly:i=!1,serviceWorker:n=!1}=t;if(!v(e,"modern"))return!1;const o=[{enabled:r,feature:"es2020"},{enabled:s,feature:"webgl2"},{enabled:i,feature:"webassembly"},{enabled:n,feature:"serviceWorker"}];for(const{enabled:t,feature:r}of o)if(t&&!v(e,r))return!1;return!0}catch(e){return process.env.NODE_ENV,!1}}function w(e,t=24){try{const r={Chrome:{120:"2023-11",110:"2023-02",100:"2022-03",90:"2021-04",80:"2020-02"},Firefox:{120:"2023-11",110:"2023-01",100:"2022-05",90:"2021-04",80:"2020-11"},Safari:{17:"2023-09",16:"2022-09",15:"2021-09",14:"2020-09",13:"2019-09"},Edge:{120:"2023-11",110:"2023-02",100:"2022-03",90:"2021-04",80:"2020-02"}}[e.browser.name];if(!r||isNaN(e.browser.major))return!1;const s=r[e.browser.major];if(!s)return!0;const[i,n]=s.split("-").map(Number),o=new Date(i,n-1),a=new Date;return 12*(a.getFullYear()-o.getFullYear())+(a.getMonth()-o.getMonth())>t}catch(e){return process.env.NODE_ENV,!1}}class EventEmitter{constructor(){this.events=new Map,this.maxListeners=10}on(e,t,r){if("function"!=typeof t)throw new Error("Listener must be a function");const s={listener:t,once:r?.once||!1,priority:r?.priority||0};this.events.has(e)||this.events.set(e,[]);const i=this.events.get(e);i.length,this.maxListeners;let n=!1;for(let e=0;e<i.length;e++)if(s.priority>(i[e].priority||0)){i.splice(e,0,s),n=!0;break}return n||i.push(s),this}once(e,t,r){return this.on(e,t,{once:!0,priority:r})}off(e,t){if(!this.events.has(e))return this;const r=this.events.get(e);if(t){const s=r.findIndex(e=>e.listener===t);-1!==s&&(r.splice(s,1),0===r.length&&this.events.delete(e))}else this.events.delete(e);return this}emit(e,...t){if(!this.events.has(e))return!1;const r=this.events.get(e).slice(),s=[];for(const e of r)try{e.listener.apply(this,t),e.once&&s.push(e)}catch(e){}if(s.length>0){const t=this.events.get(e);if(t){for(const e of s){const r=t.indexOf(e);-1!==r&&t.splice(r,1)}0===t.length&&this.events.delete(e)}}return!0}listenerCount(e){return this.events.get(e)?.length||0}listeners(e){return this.events.get(e)?.map(e=>e.listener)||[]}eventNames(){return Array.from(this.events.keys())}removeAllListeners(e){return e?this.events.delete(e):this.events.clear(),this}setMaxListeners(e){if(e<0||!Number.isInteger(e))throw new Error("Max listeners must be a non-negative integer");return this.maxListeners=e,this}getMaxListeners(){return this.maxListeners}prependListener(e,t){return this.on(e,t,{priority:Number.MAX_SAFE_INTEGER})}prependOnceListener(e,t){return this.once(e,t,Number.MAX_SAFE_INTEGER)}}var N,b,y,T;!function(e){e.USER_ERROR="USER_ERROR",e.SYSTEM_ERROR="SYSTEM_ERROR",e.NETWORK_ERROR="NETWORK_ERROR",e.PERMISSION_ERROR="PERMISSION_ERROR",e.CONFIG_ERROR="CONFIG_ERROR",e.VALIDATION_ERROR="VALIDATION_ERROR",e.TIMEOUT_ERROR="TIMEOUT_ERROR",e.UNSUPPORTED_ERROR="UNSUPPORTED_ERROR",e.INTERNAL_ERROR="INTERNAL_ERROR",e.EXTERNAL_ERROR="EXTERNAL_ERROR",e.UNKNOWN_ERROR="UNKNOWN_ERROR"}(N||(N={})),function(e){e.LOW="low",e.MEDIUM="medium",e.HIGH="high",e.CRITICAL="critical"}(b||(b={})),function(e){e.USER_ERROR="USER_ERROR",e.SYSTEM_ERROR="SYSTEM_ERROR",e.NETWORK_ERROR="NETWORK_ERROR",e.PERMISSION_ERROR="PERMISSION_ERROR",e.CONFIG_ERROR="CONFIG_ERROR",e.TIMEOUT_ERROR="TIMEOUT_ERROR",e.VALIDATION_ERROR="VALIDATION_ERROR",e.INTERNAL_ERROR="INTERNAL_ERROR",e.UNKNOWN_ERROR="UNKNOWN_ERROR"}(y||(y={})),function(e){e[e.DEBUG=0]="DEBUG",e[e.INFO=1]="INFO",e[e.WARN=2]="WARN",e[e.ERROR=3]="ERROR"}(T||(T={}));class Logger{constructor(e="Core",t){this.level=T.INFO,this.logs=[],this.maxLogs=1e3,this.enableConsole=!0,this.module=e,t&&(this.level=t.level??T.INFO,this.maxLogs=t.maxLogs??1e3,this.enableConsole=t.enableConsole??!0)}setLevel(e){this.level=e}getLevel(){return this.level}debug(e,t){this.log(T.DEBUG,e,t)}info(e,t){this.log(T.INFO,e,t)}warn(e,t){this.log(T.WARN,e,t)}error(e,t){this.log(T.ERROR,e,t)}log(e,t,r){if(e<this.level)return;const s={level:e,message:t,timestamp:Date.now(),module:this.module,data:r};this.logs.push(s),this.logs.length>this.maxLogs&&this.logs.shift(),this.enableConsole&&this.outputToConsole(s)}outputToConsole(e){new Date(e.timestamp).toISOString(),T[e.level],e.module,e.message,void 0!==e.data&&e.data;switch(e.level){case T.DEBUG:case T.INFO:case T.WARN:case T.ERROR:}}getLogs(){return[...this.logs]}getLogsByLevel(e){return this.logs.filter(t=>t.level===e)}getLogsByTimeRange(e,t){return this.logs.filter(r=>r.timestamp>=e&&r.timestamp<=t)}clear(){this.logs=[]}setMaxLogs(e){if(e<0)throw new Error("Max logs must be non-negative");this.maxLogs=e,this.logs.length>e&&(this.logs=this.logs.slice(-e))}setConsoleOutput(e){this.enableConsole=e}exportLogs(){return JSON.stringify(this.logs,null,2)}importLogs(e){try{const t=JSON.parse(e);Array.isArray(t)&&(this.logs=t.filter(e=>e&&"number"==typeof e.level&&"string"==typeof e.message&&"number"==typeof e.timestamp))}catch(e){this.error("Failed to import logs",e)}}createChild(e){return new Logger(`${this.module}.${e}`,{level:this.level,maxLogs:this.maxLogs,enableConsole:this.enableConsole})}}class A extends Error{constructor(e,t,r){super(t),this.name="CustomError",this.type=e,this.code=r?.code,this.context=r?.context,this.recoverable=r?.recoverable??!1,r?.cause&&(this.cause=r.cause),Error.captureStackTrace&&Error.captureStackTrace(this,A)}}class ErrorHandler{constructor(e){this.errorSolutions=new Map,this.logger=e||new Logger("ErrorHandler"),this.initializeErrorSolutions()}handleError(e,t){const r=this.classifyError(e),s={module:"Unknown",method:"Unknown",timestamp:Date.now(),userAgent:"undefined"!=typeof navigator?navigator.userAgent:"Node.js",...t},i={type:r,severity:this.getErrorSeverity(r),message:e.message,userMessage:this.getUserFriendlyMessage(e,r),originalError:e,context:s,code:this.getErrorCode(e)||this.generateErrorCode(r),recoverable:this.isRecoverableError(e),solutions:this.getErrorSolutions(e),id:this.generateErrorId(),processedAt:Date.now(),relatedErrors:[]};return this.logger.error(`[${r}] ${i.message}`,{error:e.message,stack:e.stack,context:s,recoverable:i.recoverable}),i}createError(e,t,r){const s={module:"Unknown",method:"Unknown",timestamp:Date.now(),userAgent:"undefined"!=typeof navigator?navigator.userAgent:"Node.js",...r?.context};return new A(e,t,{code:r?.code,context:s,recoverable:r?.recoverable,cause:r?.cause})}isRecoverableError(e){if(e instanceof A)return e.recoverable;switch(this.classifyError(e)){case N.NETWORK_ERROR:case N.TIMEOUT_ERROR:return!0;case N.PERMISSION_ERROR:case N.SYSTEM_ERROR:return!1;case N.USER_ERROR:case N.CONFIG_ERROR:return!0;default:return!1}}getErrorSolution(e){const t=this.getErrorCode(e);if(t&&this.errorSolutions.has(t))return this.errorSolutions.get(t);const r=this.classifyError(e);return this.getDefaultSolution(r)}getErrorSolutions(e){const t=this.getErrorSolution(e);return t?[{description:t,steps:[t],automatic:!1,priority:1}]:[]}getErrorSeverity(e){switch(e){case N.USER_ERROR:case N.CONFIG_ERROR:return b.LOW;case N.NETWORK_ERROR:case N.TIMEOUT_ERROR:return b.MEDIUM;case N.PERMISSION_ERROR:case N.VALIDATION_ERROR:return b.HIGH;case N.SYSTEM_ERROR:case N.INTERNAL_ERROR:return b.CRITICAL;default:return b.MEDIUM}}generateErrorCode(e){return`${e}_${Date.now().toString(36)}_${Math.random().toString(36).substr(2,5)}`.toUpperCase()}generateErrorId(){return`error_${Date.now()}_${Math.random().toString(36).substr(2,9)}`}addErrorSolution(e,t){this.errorSolutions.set(e,t)}addErrorSolutions(e){for(const[t,r]of Object.entries(e))this.errorSolutions.set(t,r)}classifyError(e){if(e instanceof A)return e.type;const t=(e.message||"").toLowerCase(),r=(e.name||"").toLowerCase();return t.includes("network")||t.includes("fetch")||t.includes("xhr")||r.includes("networkerror")?N.NETWORK_ERROR:t.includes("timeout")||t.includes("timed out")||r.includes("timeouterror")?N.TIMEOUT_ERROR:t.includes("permission")||t.includes("denied")||t.includes("unauthorized")||t.includes("forbidden")||r.includes("notallowederror")?N.PERMISSION_ERROR:t.includes("not supported")||t.includes("not available")||t.includes("not implemented")||r.includes("notsupportederror")?N.SYSTEM_ERROR:t.includes("invalid")||t.includes("configuration")||t.includes("config")||r.includes("configerror")?N.CONFIG_ERROR:e instanceof TypeError||e instanceof RangeError||t.includes("invalid argument")||t.includes("invalid parameter")?N.USER_ERROR:N.UNKNOWN_ERROR}getUserFriendlyMessage(e,t){switch(t){case N.NETWORK_ERROR:return"网络连接失败,请检查网络连接后重试";case N.TIMEOUT_ERROR:return"操作超时,请稍后重试";case N.PERMISSION_ERROR:return"权限不足,请检查浏览器权限设置";case N.SYSTEM_ERROR:return"当前浏览器不支持此功能,请使用其他浏览器或升级浏览器版本";case N.CONFIG_ERROR:return"配置参数错误,请检查配置";case N.USER_ERROR:return"输入参数错误,请检查输入参数";default:return e.message||"发生未知错误"}}getErrorCode(e){if(e instanceof A)return e.code;const t=e;return t.code||t.errno||void 0}getDefaultSolution(e){switch(e){case N.NETWORK_ERROR:return"请检查网络连接,确保网络正常后重试";case N.TIMEOUT_ERROR:return"请稍后重试,或增加超时时间设置";case N.PERMISSION_ERROR:return"请在浏览器设置中允许相关权限,或使用HTTPS协议";case N.SYSTEM_ERROR:return"请使用支持此功能的现代浏览器,或升级浏览器版本";case N.CONFIG_ERROR:return"请检查配置参数是否正确,参考文档进行配置";case N.USER_ERROR:return"请检查输入参数的类型和格式是否正确";default:return null}}initializeErrorSolutions(){this.errorSolutions.set("ENOTFOUND","域名解析失败,请检查网络连接"),this.errorSolutions.set("ECONNREFUSED","连接被拒绝,请检查服务器状态"),this.errorSolutions.set("ETIMEDOUT","连接超时,请检查网络连接或稍后重试"),this.errorSolutions.set("CERT_UNTRUSTED","SSL证书不受信任,请检查证书配置"),this.errorSolutions.set("MIXED_CONTENT","混合内容错误,请使用HTTPS协议")}}class Cache{constructor(e){this.cache=new Map,this.config={maxSize:e?.maxSize??100,defaultTTL:e?.defaultTTL??3e5,enableLRU:e?.enableLRU??!0,cleanupInterval:e?.cleanupInterval??6e4},this.startCleanup()}set(e,t,r){const s=Date.now(),i={value:t,expireAt:s+(r??this.config.defaultTTL),createdAt:s,accessCount:0,lastAccessed:s};this.cache.size>=this.config.maxSize&&!this.cache.has(e)&&this.evictLRU(),this.cache.set(e,i)}get(e){const t=this.cache.get(e);if(!t)return;const r=Date.now();if(!(r>t.expireAt))return t.accessCount++,t.lastAccessed=r,t.value;this.cache.delete(e)}has(e){const t=this.cache.get(e);return!!t&&(!(Date.now()>t.expireAt)||(this.cache.delete(e),!1))}delete(e){return this.cache.delete(e)}clear(){this.cache.clear()}size(){return this.cache.size}keys(){return Array.from(this.cache.keys())}getInfo(e){const t=this.cache.get(e);if(t){if(!(Date.now()>t.expireAt))return{...t};this.cache.delete(e)}}touch(e,t){const r=this.cache.get(e);if(!r)return!1;const s=Date.now();if(s>r.expireAt)return this.cache.delete(e),!1;const i=t??this.config.defaultTTL;return r.expireAt=s+i,r.lastAccessed=s,!0}async getOrSet(e,t,r){const s=this.get(e);if(void 0!==s)return s;const i=await t();return this.set(e,i,r),i}mset(e,t){for(const[r,s]of e)this.set(r,s,t)}mget(e){return e.map(e=>this.get(e))}mdel(e){let t=0;for(const r of e)this.delete(r)&&t++;return t}getStats(){let e=0,t=0;const r=Date.now();for(const[s,i]of this.cache.entries())e+=i.accessCount,r>i.expireAt&&t++;return{size:this.cache.size,maxSize:this.config.maxSize,hitRate:e>0?(e-t)/e:0,totalAccess:e,expiredCount:t}}cleanup(){const e=Date.now();let t=0;for(const[r,s]of this.cache.entries())e>s.expireAt&&(this.cache.delete(r),t++);return t}evictLRU(){if(!this.config.enableLRU||0===this.cache.size)return;let e=null,t=1/0;for(const[r,s]of this.cache.entries())s.lastAccessed<t&&(t=s.lastAccessed,e=r);e&&this.cache.delete(e)}startCleanup(){this.cleanupTimer&&clearInterval(this.cleanupTimer),this.cleanupTimer=setInterval(()=>{this.cleanup()},this.config.cleanupInterval)}stopCleanup(){this.cleanupTimer&&(clearInterval(this.cleanupTimer),this.cleanupTimer=void 0)}updateConfig(e){if(this.config={...this.config,...e},void 0!==e.cleanupInterval&&this.startCleanup(),void 0!==e.maxSize&&this.cache.size>e.maxSize)for(;this.cache.size>e.maxSize;)this.evictLRU()}destroy(){this.stopCleanup(),this.clear()}}class BaseManager{constructor(e,t="BaseManager"){this.initialized=!1,this.destroyed=!1,this.initializing=!1,this.options=this.mergeDefaultOptions(e),this.logger=new Logger(t,{level:this.options.debug?0:1,enableConsole:this.options.debug}),this.eventEmitter=new EventEmitter,this.errorHandler=new ErrorHandler(this.logger),this.options.cache&&(this.cache=new Cache),this.setupErrorHandling(),this.startAutoInitialization()}on(e,t,r){return this.eventEmitter.on(e,t,r),this}off(e,t){return this.eventEmitter.off(e,t),this}emit(e,...t){return this.eventEmitter.emit(e,...t)}once(e,t,r){return this.eventEmitter.once(e,t,r),this}listenerCount(e){return this.eventEmitter.listenerCount(e)}eventNames(){return this.eventEmitter.eventNames()}handleError(e,t){const r={module:this.constructor.name,method:t},s=this.errorHandler.handleError(e,r);return this.emit("error",s),s}validateInput(e,t){try{if(t.type){const r=typeof e;if(r!==t.type)throw this.errorHandler.createError("USER_ERROR",`Expected ${t.type}, got ${r}`,{context:{method:"validateInput"}})}if(t.required&&null==e)throw this.errorHandler.createError("USER_ERROR","Required parameter is missing",{context:{method:"validateInput"}});if(t.isArray&&!Array.isArray(e))throw this.errorHandler.createError("USER_ERROR","Expected array",{context:{method:"validateInput"}});if(t.properties&&"object"==typeof e&&null!==e)for(const[r,s]of Object.entries(t.properties))if(!this.validateInput(e[r],s))return!1;return!0}catch(e){return this.handleError(e,"validateInput"),!1}}async safeExecute(e,t,r){const s=r??this.options.retries??0;let i=null;for(let r=0;r<=s;r++)try{const s=new Promise((e,r)=>{setTimeout(()=>{r(this.errorHandler.createError("TIMEOUT_ERROR",`Operation timed out after ${this.options.timeout}ms`,{context:{method:t}}))},this.options.timeout)}),i=await Promise.race([e(),s]);return r>0&&this.logger.info(`Operation succeeded after ${r} retries`,{context:t}),i}catch(e){if(i=e,r===s||!this.errorHandler.isRecoverableError(i))throw this.handleError(i,t);const n=Math.min(1e3*Math.pow(2,r),5e3);this.logger.warn(`Operation failed, retrying in ${n}ms (attempt ${r+1}/${s+1})`,{context:t,error:i.message}),await new Promise(e=>setTimeout(e,n))}throw this.handleError(i,t)}getCached(e){return this.cache?.get(e)}setCached(e,t,r){this.cache?.set(e,t,r)}async getOrSetCached(e,t,r){return this.cache?this.cache.getOrSet(e,t,r):t()}async ensureInitialized(){if(this.destroyed)throw this.errorHandler.createError("SYSTEM_ERROR","Manager has been destroyed and cannot be used.",{context:{method:"ensureInitialized"}});if(!this.initialized)if(this.initPromise)try{await this.initPromise,this.initPromise=void 0}catch(e){throw this.errorHandler.createError("SYSTEM_ERROR",`Manager initialization failed: ${e.message}`,{context:{method:"ensureInitialized"}})}else if(!this.initializing){this.initializing=!0;try{await this.initialize()}finally{this.initializing=!1}}}ensureInitializedSync(){if(!this.initialized)throw this.errorHandler.createError("SYSTEM_ERROR","Manager not initialized. Operations requiring initialization should be awaited.",{context:{method:"ensureInitializedSync"}})}ensureNotDestroyed(){if(this.destroyed)throw this.errorHandler.createError("SYSTEM_ERROR","Manager has been destroyed and cannot be used.",{context:{method:"ensureNotDestroyed"}})}async ready(){await this.ensureInitialized()}getStatus(){return{initialized:this.initialized,destroyed:this.destroyed,eventListeners:this.eventNames().reduce((e,t)=>e+this.listenerCount(t),0),cacheSize:this.cache?.size(),initializing:this.initializing||!!this.initPromise}}updateOptions(e){this.options={...this.options,...e},void 0!==e.debug&&(this.logger.setLevel(e.debug?0:1),this.logger.setConsoleOutput(e.debug)),this.emit("optionsUpdated",this.options)}mergeDefaultOptions(e){return{...this.getDefaultOptions(),...e}}setupErrorHandling(){"undefined"!=typeof window?window.addEventListener("unhandledrejection",e=>{this.handleError(new Error(e.reason),"unhandledrejection")}):"undefined"!=typeof process&&process.on("unhandledRejection",e=>{this.handleError(new Error(String(e)),"unhandledRejection")})}startAutoInitialization(){this.initPromise=this.initialize().catch(e=>(this.logger.error("Auto-initialization failed:",e),Promise.reject(e))),this.initPromise.catch(()=>{})}baseDestroy(){this.destroyed||(this.emit("beforeDestroy"),this.eventEmitter.removeAllListeners(),this.cache?.destroy(),this.logger.clear(),this.destroyed=!0,this.initialized=!1,this.emit("destroyed"))}}class C extends BaseManager{constructor(e){super(e,"UAManager"),this.plugins=[],this.parseStats={totalParses:0,cacheHits:0,pluginHits:0,errors:0}}getDefaultOptions(){return{debug:!1,timeout:5e3,retries:1,cache:!0,cacheTTL:3e5,enablePlugins:!0,maxCacheSize:1e3,parseTimeout:1e3}}async initialize(){if(!this.initialized)try{this.logger.info("Initializing UA Manager"),this.options.cache&&this.cache&&this.cache.updateConfig({maxSize:this.options.maxCacheSize}),this.emit("initialized"),this.initialized=!0,this.logger.info("UA Manager initialized successfully")}catch(e){throw this.handleError(e,"initialize")}}destroy(){this.destroyed||(this.logger.info("Destroying UA Manager"),this.plugins=[],this.parseStats={totalParses:0,cacheHits:0,pluginHits:0,errors:0},this.baseDestroy(),this.logger.info("UA Manager destroyed"))}async parse(e){await this.ensureInitialized(),this.ensureNotDestroyed();const t=e||this.getCurrentUA();this.parseStats.totalParses++;try{if(this.options.cache&&this.cache){const e=this.getCached(`parse:${t}`);if(e)return this.parseStats.cacheHits++,this.emit("cacheHit",{ua:t}),e}const e=await this.safeExecute(()=>this.performParse(t),"parse"),r=this.freezeParseResult(e);return this.options.cache&&this.cache&&this.setCached(`parse:${t}`,r,3e5),this.emit("parsed",{ua:t,result:r}),r}catch(e){throw this.parseStats.errors++,this.emit("parseError",{ua:t,error:e}),e}}parseSync(e){this.ensureInitializedSync(),this.ensureNotDestroyed();const t=e||this.getCurrentUA();this.parseStats.totalParses++;try{if(this.options.cache&&this.cache){const e=this.getCached(`parse:${t}`);if(e)return this.parseStats.cacheHits++,e}const e=this.performParseSync(t),r=this.freezeParseResult(e);return this.options.cache&&this.cache&&this.setCached(`parse:${t}`,r,3e5),r}catch(e){throw this.parseStats.errors++,this.handleError(e,"parseSync")}}stringify(e){this.ensureInitializedSync(),this.ensureNotDestroyed();try{this.validateInput(e,{type:"object",required:!0,properties:{browser:{type:"object"},engine:{type:"object"},os:{type:"object"},device:{type:"object"},cpu:{type:"object"}}});const t=l(e);return this.emit("generated",{spec:e,result:t}),t}catch(e){throw this.handleError(e,"stringify")}}satisfies(e,t){this.ensureInitializedSync(),this.ensureNotDestroyed();try{return this.validateInput(t,{type:"string",required:!0}),g(e,t)}catch(e){throw this.handleError(e,"satisfies")}}isModern(e,t){this.ensureInitializedSync(),this.ensureNotDestroyed();try{return this.validateInput(e,{type:"object",required:!0}),O(e,t)}catch(e){throw this.handleError(e,"isModern")}}async getCurrent(){return this.parse()}use(e){if(this.ensureInitializedSync(),this.ensureNotDestroyed(),this.options.enablePlugins)try{this.validateInput(e,{type:"object",required:!0,properties:{test:{type:"function",required:!0},parse:{type:"function",required:!0}}}),this.plugins.push(e),this.emit("pluginRegistered",{plugin:e}),this.logger.info(`Plugin registered: ${e.constructor.name||"Anonymous"}`)}catch(e){throw this.handleError(e,"use")}else this.logger.warn("Plugins are disabled")}removePlugin(e){this.ensureInitializedSync(),this.ensureNotDestroyed();const t=this.plugins.indexOf(e);return-1!==t&&(this.plugins.splice(t,1),this.emit("pluginRemoved",{plugin:e}),!0)}getStats(){const e=this.parseStats.totalParses>0?this.parseStats.cacheHits/this.parseStats.totalParses:0;return{...this.parseStats,cacheHitRate:e,pluginCount:this.plugins.length,cacheSize:this.cache?.size()}}resetStats(){this.parseStats={totalParses:0,cacheHits:0,pluginHits:0,errors:0},this.emit("statsReset")}getCurrentUA(){return"undefined"!=typeof navigator&&navigator.userAgent?navigator.userAgent:""}async performParse(e){return new Promise((t,r)=>{const s=setTimeout(()=>{r(this.errorHandler.createError("TIMEOUT_ERROR",`UA parsing timed out after ${this.options.parseTimeout}ms`,{context:{method:"performParse"}}))},this.options.parseTimeout);try{const r=this.performParseSync(e);clearTimeout(s),t(r)}catch(e){clearTimeout(s),r(e)}})}performParseSync(e){if(this.options.enablePlugins)for(const r of this.plugins)try{if(r.test(e)){const s=r.parse(e);if(s){this.parseStats.pluginHits++;const i=t(e);return this.emit("pluginHit",{plugin:r,ua:e}),{...i,...s}}}}catch(e){this.logger.warn(`Plugin error: ${e.message}`,{plugin:r})}return t(e)}freezeParseResult(e){return Object.freeze({browser:Object.freeze(e.browser),engine:Object.freeze(e.engine),os:Object.freeze(e.os),device:Object.freeze(e.device),cpu:Object.freeze(e.cpu),isBot:e.isBot,isWebView:e.isWebView,isHeadless:e.isHeadless,source:e.source})}clearCache(){this.cache&&this.cache.clear()}getCacheSize(){return this.cache?.size()||0}}let x=null;class M{static getManager(){return x||(x=new C,x.initialize().catch(e=>{})),x}static parse(e){return M.getManager().parseSync(e)}static async parseAsync(e){return M.getManager().parse(e)}static stringify(e){return M.getManager().stringify(e)}static satisfies(e,t){return M.getManager().satisfies(e,t)}static isModern(e,t){return M.getManager().isModern(e,t)}static get current(){return M.parse()}static use(e){M.getManager().use(e)}static clearCache(){M.getManager().clearCache()}static getCacheSize(){return M.getManager().getCacheSize()}static getStats(){return M.getManager().getStats()}static getCurrentUA(){return M.getManager().getCurrentUA()}static resetManager(){x&&(x.destroy(),x=null)}}function I(){return M.current}function _(e){return M.parse(e)}function U(e,t){return M.satisfies(t||M.getCurrentUA(),e)}var P={UA:M,getCurrentUA:I,parseUserAgent:_,isCompatible:U};exports.UA=M,exports.UAManager=C,exports.UATemplates=d,exports.compareUA=function(e,t){try{let r,s;if("string"==typeof e){const{parseUA:t}=require("./parser");r=t(e)}else r=e;if("string"==typeof t){const{parseUA:e}=require("./parser");s=e(t)}else s=t;if(!E(r.browser.name,s.browser.name))throw new Error("Cannot compare different browsers");return f(r.browser.version,s.browser.version)}catch(e){throw process.env.NODE_ENV,e}},exports.compareVersions=f,exports.default=P,exports.detectFakeUA=function(e){const t=[];let r=0;try{if(!e||"string"!=typeof e)return{isFake:!1,confidence:0,reasons:[]};if(/Chrome\/(\d+)/.test(e)&&/Safari\/(\d+)/.test(e)){const s=e.match(/Chrome\/([\d.]+)/),i=e.match(/Safari\/([\d.]+)/);if(s&&i){const e=parseInt(s[1]),n=parseFloat(i[1]);e>100&&n<500&&(t.push("Chrome and Safari version mismatch"),r+=30)}}!/iPhone|iPad/.test(e)||/Safari/.test(e)||/CriOS/.test(e)||/FxiOS/.test(e)||(t.push("iOS device without Safari-based browser"),r+=40),/Windows NT 5\.1/.test(e)&&/Chrome\/1[0-9]{2}/.test(e)&&(t.push("Modern Chrome on Windows XP"),r+=50),/Chrome\//.test(e)&&!/AppleWebKit/.test(e)&&(t.push("Chrome without WebKit"),r+=40);const s=e.match(/(Chrome|Firefox|Safari|Edge|Opera)\/[\d.]+/g);s&&s.length>3&&(t.push("Too many browser identifiers"),r+=20),/Mozilla\/5\.0/.test(e)||(t.push("Missing or unusual Mozilla prefix"),r+=10),e.length<50?(t.push("UA string too short"),r+=20):e.length>500&&(t.push("UA string too long"),r+=10);const i=Math.min(r,100);return{isFake:i>50,confidence:i,reasons:t}}catch(e){return process.env.NODE_ENV,{isFake:!1,confidence:0,reasons:[]}}},exports.generateRandomUA=function(e={}){const{browsers:t=["Chrome","Firefox","Safari","Edge"],os:r=["Windows","macOS","Linux"],devices:s=["desktop"]}=e,i=t[Math.floor(Math.random()*t.length)],n=r[Math.floor(Math.random()*r.length)],o=s[Math.floor(Math.random()*s.length)],a=Math.floor(50*Math.random())+80;return l({browser:{name:i,version:`${a}.${Math.floor(10*Math.random())}.${Math.floor(100*Math.random())}.0`,major:a},os:{name:n,version:"Windows"===n?"10":"macOS"===n?"10.15.7":""},device:{type:o}})},exports.generateUA=l,exports.getCurrentUA=I,exports.getSecurityLevel=function(e){try{return e.isBot||e.isHeadless?"low":O(e)?w(e,12)?"low":w(e,6)?"medium":"high":"critical"}catch(e){return process.env.NODE_ENV,"medium"}},exports.getSupportedFeatures=function(e){const t=[];for(const r of Object.keys(S))v(e,r)&&t.push(r);return t},exports.isCompatible=U,exports.isModern=O,exports.isOutdated=w,exports.parseUA=t,exports.parseUserAgent=_,exports.parseVersionString=p,exports.satisfies=g,exports.satisfiesAll=function(e,t){if(!Array.isArray(t)||0===t.length)return!0;try{return t.every(t=>g(e,t))}catch(e){return process.env.NODE_ENV,!1}},exports.satisfiesAny=function(e,t){if(!Array.isArray(t)||0===t.length)return!1;try{return t.some(t=>g(e,t))}catch(e){return process.env.NODE_ENV,!1}},exports.supportsFeature=v;
;