diff --git a/CHANGELOG.md b/CHANGELOG.md index d1f9ac6..8ea4bb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -65,6 +65,35 @@ --- +## Version 2.0.5 + +- Add new browser: Zalo +- Add new CPU arch: alpha +- Add new device vendor: Philips +- Improve device detection: Pico +- Fix parsing error on pages with modified Array prototypes +- Improve type declarations: + - Replace `node-fetch` dependency with `undici` + - Replace hardcoded string values with enum from `enum` submodule +- `enums` submodule: + - Add `Extension` enum for `extensions` submodule + - Type declaration file now automatically generated using build script + - Naming adjustments: + - `Browser` => `BrowserName` + - `CPU` => `CPUArch` + - `Device` => `DeviceType` + - `Vendor` => `DeviceVendor` + - `Engine` => `EngineName` + - `OS` => `OSName` +- `extensions` submodule: + - Add new crawlers: + APIs-Google, Algolia Crawler, Algolia Crawler Renderscript, Baidu-ADS, BLEXBot, botify, Bravebot, Claude-Web, cohere-training-data-crawler, contxbot, Cotoyogi, Coveobot, CriteoBot, DeepSeekBot, DuckDuckGo-Favicons-Bot, Elastic, FirecrawlAgent, Freespoke, Google-CloudVertexBot, HuggingFace-Bot, Kagibot, Kangaroo Bot, marginalia, msnbot, OnCrawl, Replicate-Bot, RunPod-Bot, SBIntuitionsBot, SeekportBot, Siteimprove, Sogou Pic Spider, TikTokSpider, TwinAgent, v0bot, webzio, Webzio-Extended, xAI-Bot, YandexAccessibilityBot, YandexAdditionalBot, YandexAdNet, YandexBot MirrorDetector, YandexBlogs, YandexComBot, YandexFavicons, YandexImageResizer, YandexImages, YandexMarket, YandexMetrika, YandexMedia, YandexMobileBot, YandexMobileScreenShotBot, YandexNews, YandexOntoDB, YandexOntoDBAPI, YandexPartner, YandexRCA, YandexRenderResourcesBot, YandexScreenshotBot, YandexSpravBot, YandexTracker, YandexVertis, YandexVerticals, YandexVideo, YandexVideoParser, YandexWebmaster, YepBot, ZumBot + - Add new fetchers: + Asana, bitlybot, Blueno, BufferLinkPreviewBot, Chrome-Lighthouse, Gemini-Deep-Research, HubSpot Page Fetcher, kakaotalk-scrap, vercel-favicon-bot, vercel-screenshot-bot, vercelflags, verceltracing, YaDirectFetcher, YandexCalendar, YandexDirect, YandexDirectDyn, YandexForDomain, YandexPagechecker, YandexSearchShop, YandexSitelinks, YandexUserproxy +- `helpers` submodule: + - Add some crawler to `isAIBot()`: + Bravebot, cohere-training-data-crawler, FirecrawlAgent, HuggingFace-Bot, Kangaroo Bot, PanguBot, Replicate-Bot, RunPod-Bot, TikTokSpider, Together-Bot, v0bot, xAI-Bot + ## Version 2.0.4 - Add new browser: Edge WebView, Edge WebView2 @@ -240,6 +269,16 @@ --- +## Version 0.7.41 / 1.0.41 +- Add new browser: Daum, Ladybird +- Add new device vendor: HMD +- Add new engine: LibWeb +- Add new os: Windows IoT, Ubuntu Touch +- Improve cpu detection: ARM, x86 +- Improve device vendor detection: Apple, Archos, Generic, Google, Honor, Huawei, Infinix, Nvidia, Lenovo, Nokia, OnePlus, Xiaomi +- Improve device type detection: smarttv, wearables +- Improve os detection: Linux, Symbian + ## Version 0.7.40 / 1.0.40 - Add new browser: 115, LibreWolf, Slimboat, Slimjet - Add new device: Advan, Cat, Energizer, IMO, Micromax, Smartfren diff --git a/README.md b/README.md index 9ceab46..cfc6ba1 100644 --- a/README.md +++ b/README.md @@ -26,4 +26,4 @@ import { UAParser } from '@ua-parser-js/pro-personal'; UAParser.js PRO Personal -Copyright (c) 2023-2024 Faisal Salman <> \ No newline at end of file +Copyright (c) 2023-2024 Faisal Salman <> diff --git a/dist/ua-parser.min.js b/dist/ua-parser.min.js index 2109fa7..8efc947 100644 --- a/dist/ua-parser.min.js +++ b/dist/ua-parser.min.js @@ -1,4 +1,4 @@ -/* UAParser.js v2.0.4 +/* UAParser.js v2.0.5 Copyright © 2012-2025 Faisal Salman UAParser.js PRO Personal License */ -(function(window,undefined){"use strict";var LIBVERSION="2.0.4",UA_MAX_LENGTH=500,USER_AGENT="user-agent",EMPTY="",UNKNOWN="?",FUNC_TYPE="function",UNDEF_TYPE="undefined",OBJ_TYPE="object",STR_TYPE="string",UA_BROWSER="browser",UA_CPU="cpu",UA_DEVICE="device",UA_ENGINE="engine",UA_OS="os",UA_RESULT="result",NAME="name",TYPE="type",VENDOR="vendor",VERSION="version",ARCHITECTURE="architecture",MAJOR="major",MODEL="model",CONSOLE="console",MOBILE="mobile",TABLET="tablet",SMARTTV="smarttv",WEARABLE="wearable",XR="xr",EMBEDDED="embedded",INAPP="inapp",BRANDS="brands",FORMFACTORS="formFactors",FULLVERLIST="fullVersionList",PLATFORM="platform",PLATFORMVER="platformVersion",BITNESS="bitness",CH_HEADER="sec-ch-ua",CH_HEADER_FULL_VER_LIST=CH_HEADER+"-full-version-list",CH_HEADER_ARCH=CH_HEADER+"-arch",CH_HEADER_BITNESS=CH_HEADER+"-"+BITNESS,CH_HEADER_FORM_FACTORS=CH_HEADER+"-form-factors",CH_HEADER_MOBILE=CH_HEADER+"-"+MOBILE,CH_HEADER_MODEL=CH_HEADER+"-"+MODEL,CH_HEADER_PLATFORM=CH_HEADER+"-"+PLATFORM,CH_HEADER_PLATFORM_VER=CH_HEADER_PLATFORM+"-version",CH_ALL_VALUES=[BRANDS,FULLVERLIST,MOBILE,MODEL,PLATFORM,PLATFORMVER,ARCHITECTURE,FORMFACTORS,BITNESS],AMAZON="Amazon",APPLE="Apple",ASUS="ASUS",BLACKBERRY="BlackBerry",GOOGLE="Google",HUAWEI="Huawei",LENOVO="Lenovo",HONOR="Honor",LG="LG",MICROSOFT="Microsoft",MOTOROLA="Motorola",NVIDIA="Nvidia",ONEPLUS="OnePlus",OPPO="OPPO",SAMSUNG="Samsung",SHARP="Sharp",SONY="Sony",XIAOMI="Xiaomi",ZEBRA="Zebra",CHROME="Chrome",CHROMIUM="Chromium",CHROMECAST="Chromecast",EDGE="Edge",FIREFOX="Firefox",OPERA="Opera",FACEBOOK="Facebook",SOGOU="Sogou",PREFIX_MOBILE="Mobile ",SUFFIX_BROWSER=" Browser",WINDOWS="Windows";var isWindow=typeof window!==UNDEF_TYPE,NAVIGATOR=isWindow&&window.navigator?window.navigator:undefined,NAVIGATOR_UADATA=NAVIGATOR&&NAVIGATOR.userAgentData?NAVIGATOR.userAgentData:undefined;var extend=function(defaultRgx,extensions){var mergedRgx={};var extraRgx=extensions;if(!isExtensions(extensions)){extraRgx={};for(var i in extensions){for(var j in extensions[i]){extraRgx[j]=extensions[i][j].concat(extraRgx[j]?extraRgx[j]:[])}}}for(var k in defaultRgx){mergedRgx[k]=extraRgx[k]&&extraRgx[k].length%2===0?extraRgx[k].concat(defaultRgx[k]):defaultRgx[k]}return mergedRgx},enumerize=function(arr){var enums={};for(var i=0;i0){for(var i in str1){if(lowerize(str2)==lowerize(str1[i]))return true}return false}return isString(str1)?lowerize(str2)==lowerize(str1):false},isExtensions=function(obj,deep){for(var prop in obj){return/^(browser|cpu|device|engine|os)$/.test(prop)||(deep?isExtensions(obj[prop]):false)}},isString=function(val){return typeof val===STR_TYPE},itemListToArray=function(header){if(!header)return undefined;var arr=[];var tokens=strip(/\\?\"/g,header).split(",");for(var i=0;i-1){var token=trim(tokens[i]).split(";v=");arr[i]={brand:token[0],version:token[1]}}else{arr[i]=trim(tokens[i])}}return arr},lowerize=function(str){return isString(str)?str.toLowerCase():str},majorize=function(version){return isString(version)?strip(/[^\d\.]/g,version).split(".")[0]:undefined},setProps=function(arr){for(var i in arr){var propName=arr[i];if(typeof propName==OBJ_TYPE&&propName.length==2){this[propName[0]]=propName[1]}else{this[propName]=undefined}}return this},strip=function(pattern,str){return isString(str)?str.replace(pattern,EMPTY):str},stripQuotes=function(str){return strip(/\\?\"/g,str)},trim=function(str,len){if(isString(str)){str=strip(/^\s\s*/,str);return typeof len===UNDEF_TYPE?str:str.substring(0,UA_MAX_LENGTH)}};var rgxMapper=function(ua,arrays){if(!ua||!arrays)return;var i=0,j,k,p,q,matches,match;while(i0){if(q.length===2){if(typeof q[1]==FUNC_TYPE){this[q[0]]=q[1].call(this,match)}else{this[q[0]]=q[1]}}else if(q.length>=3){if(typeof q[1]===FUNC_TYPE&&!(q[1].exec&&q[1].test)){if(q.length>3){this[q[0]]=match?q[1].apply(this,q.slice(2)):undefined}else{this[q[0]]=match?q[1].call(this,match,q[2]):undefined}}else{if(q.length==3){this[q[0]]=match?match.replace(q[1],q[2]):undefined}else if(q.length==4){this[q[0]]=match?q[3].call(this,match.replace(q[1],q[2])):undefined}else if(q.length>4){this[q[0]]=match?q[3].apply(this,[match.replace(q[1],q[2])].concat(q.slice(4))):undefined}}}}else{this[q]=match?match:undefined}}}}i+=2}},strMapper=function(str,map){for(var i in map){if(typeof map[i]===OBJ_TYPE&&map[i].length>0){for(var j=0;j2){this.set(MODEL,"iPad").set(TYPE,TABLET)}break;case UA_OS:if(!this.get(NAME)&&NAVIGATOR_UADATA&&NAVIGATOR_UADATA[PLATFORM]){this.set(NAME,NAVIGATOR_UADATA[PLATFORM])}break;case UA_RESULT:var data=this.data;var detect=function(itemType){return data[itemType].getItem().detectFeature().get()};this.set(UA_BROWSER,detect(UA_BROWSER)).set(UA_CPU,detect(UA_CPU)).set(UA_DEVICE,detect(UA_DEVICE)).set(UA_ENGINE,detect(UA_ENGINE)).set(UA_OS,detect(UA_OS))}}return this};this.parseUA=function(){if(this.itemType!=UA_RESULT){rgxMapper.call(this.data,this.ua,this.rgxMap)}if(this.itemType==UA_BROWSER){this.set(MAJOR,majorize(this.get(VERSION)))}return this};this.parseCH=function(){var uaCH=this.uaCH,rgxMap=this.rgxMap;switch(this.itemType){case UA_BROWSER:case UA_ENGINE:var brands=uaCH[FULLVERLIST]||uaCH[BRANDS],prevName;if(brands){for(var i in brands){var brandName=brands[i].brand||brands[i],brandVersion=brands[i].version;if(this.itemType==UA_BROWSER&&!/not.a.brand/i.test(brandName)&&(!prevName||/Chrom/.test(prevName)&&brandName!=CHROMIUM||prevName==EDGE&&/WebView2/.test(brandName))){brandName=strMapper(brandName,browserHintsMap);prevName=this.get(NAME);if(!(prevName&&!/Chrom/.test(prevName)&&/Chrom/.test(brandName))){this.set(NAME,brandName).set(VERSION,brandVersion).set(MAJOR,majorize(brandVersion))}prevName=brandName}if(this.itemType==UA_ENGINE&&brandName==CHROMIUM){this.set(VERSION,brandVersion)}}}break;case UA_CPU:var archName=uaCH[ARCHITECTURE];if(archName){if(archName&&uaCH[BITNESS]=="64")archName+="64";rgxMapper.call(this.data,archName+";",rgxMap)}break;case UA_DEVICE:if(uaCH[MOBILE]){this.set(TYPE,MOBILE)}if(uaCH[MODEL]){this.set(MODEL,uaCH[MODEL]);if(!this.get(TYPE)||!this.get(VENDOR)){var reParse={};rgxMapper.call(reParse,"droid 9; "+uaCH[MODEL]+")",rgxMap);if(!this.get(TYPE)&&!!reParse.type){this.set(TYPE,reParse.type)}if(!this.get(VENDOR)&&!!reParse.vendor){this.set(VENDOR,reParse.vendor)}}}if(uaCH[FORMFACTORS]){var ff;if(typeof uaCH[FORMFACTORS]!=="string"){var idx=0;while(!ff&&idx=13?"11":"10";this.set(NAME,osName).set(VERSION,osVersion)}if(this.get(NAME)==WINDOWS&&uaCH[MODEL]=="Xbox"){this.set(NAME,"Xbox").set(VERSION,undefined)}break;case UA_RESULT:var data=this.data;var parse=function(itemType){return data[itemType].getItem().setCH(uaCH).parseCH().get()};this.set(UA_BROWSER,parse(UA_BROWSER)).set(UA_CPU,parse(UA_CPU)).set(UA_DEVICE,parse(UA_DEVICE)).set(UA_ENGINE,parse(UA_ENGINE)).set(UA_OS,parse(UA_OS))}return this};setProps.call(this,[["itemType",itemType],["ua",ua],["uaCH",uaCH],["rgxMap",rgxMap],["data",createIData(this,itemType)]]);return this}function UAParser(ua,extensions,headers){if(typeof ua===OBJ_TYPE){if(isExtensions(ua,true)){if(typeof extensions===OBJ_TYPE){headers=extensions}extensions=ua}else{headers=ua;extensions=undefined}ua=undefined}else if(typeof ua===STR_TYPE&&!isExtensions(extensions,true)){headers=extensions;extensions=undefined}if(headers&&typeof headers.append===FUNC_TYPE){var kv={};headers.forEach(function(v,k){kv[k]=v});headers=kv}if(!(this instanceof UAParser)){return new UAParser(ua,extensions,headers).getResult()}var userAgent=typeof ua===STR_TYPE?ua:headers&&headers[USER_AGENT]?headers[USER_AGENT]:NAVIGATOR&&NAVIGATOR.userAgent?NAVIGATOR.userAgent:EMPTY,httpUACH=new UACHData(headers,true),regexMap=extensions?extend(defaultRegexes,extensions):defaultRegexes,createItemFunc=function(itemType){if(itemType==UA_RESULT){return function(){return new UAItem(itemType,userAgent,regexMap,httpUACH).set("ua",userAgent).set(UA_BROWSER,this.getBrowser()).set(UA_CPU,this.getCPU()).set(UA_DEVICE,this.getDevice()).set(UA_ENGINE,this.getEngine()).set(UA_OS,this.getOS()).get()}}else{return function(){return new UAItem(itemType,userAgent,regexMap[itemType],httpUACH).parseUA().get()}}};setProps.call(this,[["getBrowser",createItemFunc(UA_BROWSER)],["getCPU",createItemFunc(UA_CPU)],["getDevice",createItemFunc(UA_DEVICE)],["getEngine",createItemFunc(UA_ENGINE)],["getOS",createItemFunc(UA_OS)],["getResult",createItemFunc(UA_RESULT)],["getUA",function(){return userAgent}],["setUA",function(ua){if(isString(ua))userAgent=ua.length>UA_MAX_LENGTH?trim(ua,UA_MAX_LENGTH):ua;return this}]]).setUA(userAgent);return this}UAParser.VERSION=LIBVERSION;UAParser.BROWSER=enumerize([NAME,VERSION,MAJOR,TYPE]);UAParser.CPU=enumerize([ARCHITECTURE]);UAParser.DEVICE=enumerize([MODEL,VENDOR,TYPE,CONSOLE,MOBILE,SMARTTV,TABLET,WEARABLE,EMBEDDED]);UAParser.ENGINE=UAParser.OS=enumerize([NAME,VERSION]);if(typeof exports!==UNDEF_TYPE){if(typeof module!==UNDEF_TYPE&&module.exports){exports=module.exports=UAParser}exports.UAParser=UAParser}else{if(typeof define===FUNC_TYPE&&define.amd){define(function(){return UAParser})}else if(isWindow){window.UAParser=UAParser}}var $=isWindow&&(window.jQuery||window.Zepto);if($&&!$.ua){var parser=new UAParser;$.ua=parser.getResult();$.ua.get=function(){return parser.getUA()};$.ua.set=function(ua){parser.setUA(ua);var result=parser.getResult();for(var prop in result){$.ua[prop]=result[prop]}}}})(typeof window==="object"?window:this); \ No newline at end of file +(function(window,undefined){"use strict";var LIBVERSION="2.0.5",UA_MAX_LENGTH=500,USER_AGENT="user-agent",EMPTY="",UNKNOWN="?",FUNC_TYPE="function",UNDEF_TYPE="undefined",OBJ_TYPE="object",STR_TYPE="string",UA_BROWSER="browser",UA_CPU="cpu",UA_DEVICE="device",UA_ENGINE="engine",UA_OS="os",UA_RESULT="result",NAME="name",TYPE="type",VENDOR="vendor",VERSION="version",ARCHITECTURE="architecture",MAJOR="major",MODEL="model",CONSOLE="console",MOBILE="mobile",TABLET="tablet",SMARTTV="smarttv",WEARABLE="wearable",XR="xr",EMBEDDED="embedded",INAPP="inapp",BRANDS="brands",FORMFACTORS="formFactors",FULLVERLIST="fullVersionList",PLATFORM="platform",PLATFORMVER="platformVersion",BITNESS="bitness",CH_HEADER="sec-ch-ua",CH_HEADER_FULL_VER_LIST=CH_HEADER+"-full-version-list",CH_HEADER_ARCH=CH_HEADER+"-arch",CH_HEADER_BITNESS=CH_HEADER+"-"+BITNESS,CH_HEADER_FORM_FACTORS=CH_HEADER+"-form-factors",CH_HEADER_MOBILE=CH_HEADER+"-"+MOBILE,CH_HEADER_MODEL=CH_HEADER+"-"+MODEL,CH_HEADER_PLATFORM=CH_HEADER+"-"+PLATFORM,CH_HEADER_PLATFORM_VER=CH_HEADER_PLATFORM+"-version",CH_ALL_VALUES=[BRANDS,FULLVERLIST,MOBILE,MODEL,PLATFORM,PLATFORMVER,ARCHITECTURE,FORMFACTORS,BITNESS],AMAZON="Amazon",APPLE="Apple",ASUS="ASUS",BLACKBERRY="BlackBerry",GOOGLE="Google",HUAWEI="Huawei",LENOVO="Lenovo",HONOR="Honor",LG="LG",MICROSOFT="Microsoft",MOTOROLA="Motorola",NVIDIA="Nvidia",ONEPLUS="OnePlus",OPPO="OPPO",SAMSUNG="Samsung",SHARP="Sharp",SONY="Sony",XIAOMI="Xiaomi",ZEBRA="Zebra",CHROME="Chrome",CHROMIUM="Chromium",CHROMECAST="Chromecast",EDGE="Edge",FIREFOX="Firefox",OPERA="Opera",FACEBOOK="Facebook",SOGOU="Sogou",PREFIX_MOBILE="Mobile ",SUFFIX_BROWSER=" Browser",WINDOWS="Windows";var isWindow=typeof window!==UNDEF_TYPE,NAVIGATOR=isWindow&&window.navigator?window.navigator:undefined,NAVIGATOR_UADATA=NAVIGATOR&&NAVIGATOR.userAgentData?NAVIGATOR.userAgentData:undefined;var extend=function(defaultRgx,extensions){var mergedRgx={};var extraRgx=extensions;if(!isExtensions(extensions)){extraRgx={};for(var i in extensions){for(var j in extensions[i]){extraRgx[j]=extensions[i][j].concat(extraRgx[j]?extraRgx[j]:[])}}}for(var k in defaultRgx){mergedRgx[k]=extraRgx[k]&&extraRgx[k].length%2===0?extraRgx[k].concat(defaultRgx[k]):defaultRgx[k]}return mergedRgx},enumerize=function(arr){var enums={};for(var i=0;i0){for(var i in str1){if(lowerize(str2)==lowerize(str1[i]))return true}return false}return isString(str1)?lowerize(str2)==lowerize(str1):false},isExtensions=function(obj,deep){for(var prop in obj){return/^(browser|cpu|device|engine|os)$/.test(prop)||(deep?isExtensions(obj[prop]):false)}},isString=function(val){return typeof val===STR_TYPE},itemListToArray=function(header){if(!header)return undefined;var arr=[];var tokens=strip(/\\?\"/g,header).split(",");for(var i=0;i-1){var token=trim(tokens[i]).split(";v=");arr[i]={brand:token[0],version:token[1]}}else{arr[i]=trim(tokens[i])}}return arr},lowerize=function(str){return isString(str)?str.toLowerCase():str},majorize=function(version){return isString(version)?strip(/[^\d\.]/g,version).split(".")[0]:undefined},setProps=function(arr){for(var i in arr){if(!arr.hasOwnProperty(i))continue;var propName=arr[i];if(typeof propName==OBJ_TYPE&&propName.length==2){this[propName[0]]=propName[1]}else{this[propName]=undefined}}return this},strip=function(pattern,str){return isString(str)?str.replace(pattern,EMPTY):str},stripQuotes=function(str){return strip(/\\?\"/g,str)},trim=function(str,len){if(isString(str)){str=strip(/^\s\s*/,str);return typeof len===UNDEF_TYPE?str:str.substring(0,UA_MAX_LENGTH)}};var rgxMapper=function(ua,arrays){if(!ua||!arrays)return;var i=0,j,k,p,q,matches,match;while(i0){if(q.length===2){if(typeof q[1]==FUNC_TYPE){this[q[0]]=q[1].call(this,match)}else{this[q[0]]=q[1]}}else if(q.length>=3){if(typeof q[1]===FUNC_TYPE&&!(q[1].exec&&q[1].test)){if(q.length>3){this[q[0]]=match?q[1].apply(this,q.slice(2)):undefined}else{this[q[0]]=match?q[1].call(this,match,q[2]):undefined}}else{if(q.length==3){this[q[0]]=match?match.replace(q[1],q[2]):undefined}else if(q.length==4){this[q[0]]=match?q[3].call(this,match.replace(q[1],q[2])):undefined}else if(q.length>4){this[q[0]]=match?q[3].apply(this,[match.replace(q[1],q[2])].concat(q.slice(4))):undefined}}}}else{this[q]=match?match:undefined}}}}i+=2}},strMapper=function(str,map){for(var i in map){if(typeof map[i]===OBJ_TYPE&&map[i].length>0){for(var j=0;j2){this.set(MODEL,"iPad").set(TYPE,TABLET)}break;case UA_OS:if(!this.get(NAME)&&NAVIGATOR_UADATA&&NAVIGATOR_UADATA[PLATFORM]){this.set(NAME,NAVIGATOR_UADATA[PLATFORM])}break;case UA_RESULT:var data=this.data;var detect=function(itemType){return data[itemType].getItem().detectFeature().get()};this.set(UA_BROWSER,detect(UA_BROWSER)).set(UA_CPU,detect(UA_CPU)).set(UA_DEVICE,detect(UA_DEVICE)).set(UA_ENGINE,detect(UA_ENGINE)).set(UA_OS,detect(UA_OS))}}return this};this.parseUA=function(){if(this.itemType!=UA_RESULT){rgxMapper.call(this.data,this.ua,this.rgxMap)}if(this.itemType==UA_BROWSER){this.set(MAJOR,majorize(this.get(VERSION)))}return this};this.parseCH=function(){var uaCH=this.uaCH,rgxMap=this.rgxMap;switch(this.itemType){case UA_BROWSER:case UA_ENGINE:var brands=uaCH[FULLVERLIST]||uaCH[BRANDS],prevName;if(brands){for(var i=0;i=13?"11":"10";this.set(NAME,osName).set(VERSION,osVersion)}if(this.get(NAME)==WINDOWS&&uaCH[MODEL]=="Xbox"){this.set(NAME,"Xbox").set(VERSION,undefined)}break;case UA_RESULT:var data=this.data;var parse=function(itemType){return data[itemType].getItem().setCH(uaCH).parseCH().get()};this.set(UA_BROWSER,parse(UA_BROWSER)).set(UA_CPU,parse(UA_CPU)).set(UA_DEVICE,parse(UA_DEVICE)).set(UA_ENGINE,parse(UA_ENGINE)).set(UA_OS,parse(UA_OS))}return this};setProps.call(this,[["itemType",itemType],["ua",ua],["uaCH",uaCH],["rgxMap",rgxMap],["data",createIData(this,itemType)]]);return this}function UAParser(ua,extensions,headers){if(typeof ua===OBJ_TYPE){if(isExtensions(ua,true)){if(typeof extensions===OBJ_TYPE){headers=extensions}extensions=ua}else{headers=ua;extensions=undefined}ua=undefined}else if(typeof ua===STR_TYPE&&!isExtensions(extensions,true)){headers=extensions;extensions=undefined}if(headers){if(typeof headers.append===FUNC_TYPE){var kv={};headers.forEach(function(v,k){kv[String(k).toLowerCase()]=v});headers=kv}else{var normalized={};for(var header in headers){if(headers.hasOwnProperty(header)){normalized[String(header).toLowerCase()]=headers[header]}}headers=normalized}}if(!(this instanceof UAParser)){return new UAParser(ua,extensions,headers).getResult()}var userAgent=typeof ua===STR_TYPE?ua:headers&&headers[USER_AGENT]?headers[USER_AGENT]:NAVIGATOR&&NAVIGATOR.userAgent?NAVIGATOR.userAgent:EMPTY,httpUACH=new UACHData(headers,true),regexMap=extensions?extend(defaultRegexes,extensions):defaultRegexes,createItemFunc=function(itemType){if(itemType==UA_RESULT){return function(){return new UAItem(itemType,userAgent,regexMap,httpUACH).set("ua",userAgent).set(UA_BROWSER,this.getBrowser()).set(UA_CPU,this.getCPU()).set(UA_DEVICE,this.getDevice()).set(UA_ENGINE,this.getEngine()).set(UA_OS,this.getOS()).get()}}else{return function(){return new UAItem(itemType,userAgent,regexMap[itemType],httpUACH).parseUA().get()}}};setProps.call(this,[["getBrowser",createItemFunc(UA_BROWSER)],["getCPU",createItemFunc(UA_CPU)],["getDevice",createItemFunc(UA_DEVICE)],["getEngine",createItemFunc(UA_ENGINE)],["getOS",createItemFunc(UA_OS)],["getResult",createItemFunc(UA_RESULT)],["getUA",function(){return userAgent}],["setUA",function(ua){if(isString(ua))userAgent=ua.length>UA_MAX_LENGTH?trim(ua,UA_MAX_LENGTH):ua;return this}]]).setUA(userAgent);return this}UAParser.VERSION=LIBVERSION;UAParser.BROWSER=enumerize([NAME,VERSION,MAJOR,TYPE]);UAParser.CPU=enumerize([ARCHITECTURE]);UAParser.DEVICE=enumerize([MODEL,VENDOR,TYPE,CONSOLE,MOBILE,SMARTTV,TABLET,WEARABLE,EMBEDDED]);UAParser.ENGINE=UAParser.OS=enumerize([NAME,VERSION]);if(typeof exports!==UNDEF_TYPE){if(typeof module!==UNDEF_TYPE&&module.exports){exports=module.exports=UAParser}exports.UAParser=UAParser}else{if(typeof define===FUNC_TYPE&&define.amd){define(function(){return UAParser})}else if(isWindow){window.UAParser=UAParser}}var $=isWindow&&(window.jQuery||window.Zepto);if($&&!$.ua){var parser=new UAParser;$.ua=parser.getResult();$.ua.get=function(){return parser.getUA()};$.ua.set=function(ua){parser.setUA(ua);var result=parser.getResult();for(var prop in result){$.ua[prop]=result[prop]}}}})(typeof window==="object"?window:this); \ No newline at end of file diff --git a/dist/ua-parser.min.mjs b/dist/ua-parser.min.mjs index 57ccaec..3da324b 100644 --- a/dist/ua-parser.min.mjs +++ b/dist/ua-parser.min.mjs @@ -1,4 +1,4 @@ -/* UAParser.js v2.0.4 +/* UAParser.js v2.0.5 Copyright © 2012-2025 Faisal Salman UAParser.js PRO Personal License */ -var LIBVERSION="2.0.4",UA_MAX_LENGTH=500,USER_AGENT="user-agent",EMPTY="",UNKNOWN="?",FUNC_TYPE="function",UNDEF_TYPE="undefined",OBJ_TYPE="object",STR_TYPE="string",UA_BROWSER="browser",UA_CPU="cpu",UA_DEVICE="device",UA_ENGINE="engine",UA_OS="os",UA_RESULT="result",NAME="name",TYPE="type",VENDOR="vendor",VERSION="version",ARCHITECTURE="architecture",MAJOR="major",MODEL="model",CONSOLE="console",MOBILE="mobile",TABLET="tablet",SMARTTV="smarttv",WEARABLE="wearable",XR="xr",EMBEDDED="embedded",INAPP="inapp",BRANDS="brands",FORMFACTORS="formFactors",FULLVERLIST="fullVersionList",PLATFORM="platform",PLATFORMVER="platformVersion",BITNESS="bitness",CH_HEADER="sec-ch-ua",CH_HEADER_FULL_VER_LIST=CH_HEADER+"-full-version-list",CH_HEADER_ARCH=CH_HEADER+"-arch",CH_HEADER_BITNESS=CH_HEADER+"-"+BITNESS,CH_HEADER_FORM_FACTORS=CH_HEADER+"-form-factors",CH_HEADER_MOBILE=CH_HEADER+"-"+MOBILE,CH_HEADER_MODEL=CH_HEADER+"-"+MODEL,CH_HEADER_PLATFORM=CH_HEADER+"-"+PLATFORM,CH_HEADER_PLATFORM_VER=CH_HEADER_PLATFORM+"-version",CH_ALL_VALUES=[BRANDS,FULLVERLIST,MOBILE,MODEL,PLATFORM,PLATFORMVER,ARCHITECTURE,FORMFACTORS,BITNESS],AMAZON="Amazon",APPLE="Apple",ASUS="ASUS",BLACKBERRY="BlackBerry",GOOGLE="Google",HUAWEI="Huawei",LENOVO="Lenovo",HONOR="Honor",LG="LG",MICROSOFT="Microsoft",MOTOROLA="Motorola",NVIDIA="Nvidia",ONEPLUS="OnePlus",OPPO="OPPO",SAMSUNG="Samsung",SHARP="Sharp",SONY="Sony",XIAOMI="Xiaomi",ZEBRA="Zebra",CHROME="Chrome",CHROMIUM="Chromium",CHROMECAST="Chromecast",EDGE="Edge",FIREFOX="Firefox",OPERA="Opera",FACEBOOK="Facebook",SOGOU="Sogou",PREFIX_MOBILE="Mobile ",SUFFIX_BROWSER=" Browser",WINDOWS="Windows";var isWindow=typeof window!==UNDEF_TYPE,NAVIGATOR=isWindow&&window.navigator?window.navigator:undefined,NAVIGATOR_UADATA=NAVIGATOR&&NAVIGATOR.userAgentData?NAVIGATOR.userAgentData:undefined;var extend=function(defaultRgx,extensions){var mergedRgx={};var extraRgx=extensions;if(!isExtensions(extensions)){extraRgx={};for(var i in extensions){for(var j in extensions[i]){extraRgx[j]=extensions[i][j].concat(extraRgx[j]?extraRgx[j]:[])}}}for(var k in defaultRgx){mergedRgx[k]=extraRgx[k]&&extraRgx[k].length%2===0?extraRgx[k].concat(defaultRgx[k]):defaultRgx[k]}return mergedRgx},enumerize=function(arr){var enums={};for(var i=0;i0){for(var i in str1){if(lowerize(str2)==lowerize(str1[i]))return true}return false}return isString(str1)?lowerize(str2)==lowerize(str1):false},isExtensions=function(obj,deep){for(var prop in obj){return/^(browser|cpu|device|engine|os)$/.test(prop)||(deep?isExtensions(obj[prop]):false)}},isString=function(val){return typeof val===STR_TYPE},itemListToArray=function(header){if(!header)return undefined;var arr=[];var tokens=strip(/\\?\"/g,header).split(",");for(var i=0;i-1){var token=trim(tokens[i]).split(";v=");arr[i]={brand:token[0],version:token[1]}}else{arr[i]=trim(tokens[i])}}return arr},lowerize=function(str){return isString(str)?str.toLowerCase():str},majorize=function(version){return isString(version)?strip(/[^\d\.]/g,version).split(".")[0]:undefined},setProps=function(arr){for(var i in arr){var propName=arr[i];if(typeof propName==OBJ_TYPE&&propName.length==2){this[propName[0]]=propName[1]}else{this[propName]=undefined}}return this},strip=function(pattern,str){return isString(str)?str.replace(pattern,EMPTY):str},stripQuotes=function(str){return strip(/\\?\"/g,str)},trim=function(str,len){if(isString(str)){str=strip(/^\s\s*/,str);return typeof len===UNDEF_TYPE?str:str.substring(0,UA_MAX_LENGTH)}};var rgxMapper=function(ua,arrays){if(!ua||!arrays)return;var i=0,j,k,p,q,matches,match;while(i0){if(q.length===2){if(typeof q[1]==FUNC_TYPE){this[q[0]]=q[1].call(this,match)}else{this[q[0]]=q[1]}}else if(q.length>=3){if(typeof q[1]===FUNC_TYPE&&!(q[1].exec&&q[1].test)){if(q.length>3){this[q[0]]=match?q[1].apply(this,q.slice(2)):undefined}else{this[q[0]]=match?q[1].call(this,match,q[2]):undefined}}else{if(q.length==3){this[q[0]]=match?match.replace(q[1],q[2]):undefined}else if(q.length==4){this[q[0]]=match?q[3].call(this,match.replace(q[1],q[2])):undefined}else if(q.length>4){this[q[0]]=match?q[3].apply(this,[match.replace(q[1],q[2])].concat(q.slice(4))):undefined}}}}else{this[q]=match?match:undefined}}}}i+=2}},strMapper=function(str,map){for(var i in map){if(typeof map[i]===OBJ_TYPE&&map[i].length>0){for(var j=0;j2){this.set(MODEL,"iPad").set(TYPE,TABLET)}break;case UA_OS:if(!this.get(NAME)&&NAVIGATOR_UADATA&&NAVIGATOR_UADATA[PLATFORM]){this.set(NAME,NAVIGATOR_UADATA[PLATFORM])}break;case UA_RESULT:var data=this.data;var detect=function(itemType){return data[itemType].getItem().detectFeature().get()};this.set(UA_BROWSER,detect(UA_BROWSER)).set(UA_CPU,detect(UA_CPU)).set(UA_DEVICE,detect(UA_DEVICE)).set(UA_ENGINE,detect(UA_ENGINE)).set(UA_OS,detect(UA_OS))}}return this};this.parseUA=function(){if(this.itemType!=UA_RESULT){rgxMapper.call(this.data,this.ua,this.rgxMap)}if(this.itemType==UA_BROWSER){this.set(MAJOR,majorize(this.get(VERSION)))}return this};this.parseCH=function(){var uaCH=this.uaCH,rgxMap=this.rgxMap;switch(this.itemType){case UA_BROWSER:case UA_ENGINE:var brands=uaCH[FULLVERLIST]||uaCH[BRANDS],prevName;if(brands){for(var i in brands){var brandName=brands[i].brand||brands[i],brandVersion=brands[i].version;if(this.itemType==UA_BROWSER&&!/not.a.brand/i.test(brandName)&&(!prevName||/Chrom/.test(prevName)&&brandName!=CHROMIUM||prevName==EDGE&&/WebView2/.test(brandName))){brandName=strMapper(brandName,browserHintsMap);prevName=this.get(NAME);if(!(prevName&&!/Chrom/.test(prevName)&&/Chrom/.test(brandName))){this.set(NAME,brandName).set(VERSION,brandVersion).set(MAJOR,majorize(brandVersion))}prevName=brandName}if(this.itemType==UA_ENGINE&&brandName==CHROMIUM){this.set(VERSION,brandVersion)}}}break;case UA_CPU:var archName=uaCH[ARCHITECTURE];if(archName){if(archName&&uaCH[BITNESS]=="64")archName+="64";rgxMapper.call(this.data,archName+";",rgxMap)}break;case UA_DEVICE:if(uaCH[MOBILE]){this.set(TYPE,MOBILE)}if(uaCH[MODEL]){this.set(MODEL,uaCH[MODEL]);if(!this.get(TYPE)||!this.get(VENDOR)){var reParse={};rgxMapper.call(reParse,"droid 9; "+uaCH[MODEL]+")",rgxMap);if(!this.get(TYPE)&&!!reParse.type){this.set(TYPE,reParse.type)}if(!this.get(VENDOR)&&!!reParse.vendor){this.set(VENDOR,reParse.vendor)}}}if(uaCH[FORMFACTORS]){var ff;if(typeof uaCH[FORMFACTORS]!=="string"){var idx=0;while(!ff&&idx=13?"11":"10";this.set(NAME,osName).set(VERSION,osVersion)}if(this.get(NAME)==WINDOWS&&uaCH[MODEL]=="Xbox"){this.set(NAME,"Xbox").set(VERSION,undefined)}break;case UA_RESULT:var data=this.data;var parse=function(itemType){return data[itemType].getItem().setCH(uaCH).parseCH().get()};this.set(UA_BROWSER,parse(UA_BROWSER)).set(UA_CPU,parse(UA_CPU)).set(UA_DEVICE,parse(UA_DEVICE)).set(UA_ENGINE,parse(UA_ENGINE)).set(UA_OS,parse(UA_OS))}return this};setProps.call(this,[["itemType",itemType],["ua",ua],["uaCH",uaCH],["rgxMap",rgxMap],["data",createIData(this,itemType)]]);return this}function UAParser(ua,extensions,headers){if(typeof ua===OBJ_TYPE){if(isExtensions(ua,true)){if(typeof extensions===OBJ_TYPE){headers=extensions}extensions=ua}else{headers=ua;extensions=undefined}ua=undefined}else if(typeof ua===STR_TYPE&&!isExtensions(extensions,true)){headers=extensions;extensions=undefined}if(headers&&typeof headers.append===FUNC_TYPE){var kv={};headers.forEach(function(v,k){kv[k]=v});headers=kv}if(!(this instanceof UAParser)){return new UAParser(ua,extensions,headers).getResult()}var userAgent=typeof ua===STR_TYPE?ua:headers&&headers[USER_AGENT]?headers[USER_AGENT]:NAVIGATOR&&NAVIGATOR.userAgent?NAVIGATOR.userAgent:EMPTY,httpUACH=new UACHData(headers,true),regexMap=extensions?extend(defaultRegexes,extensions):defaultRegexes,createItemFunc=function(itemType){if(itemType==UA_RESULT){return function(){return new UAItem(itemType,userAgent,regexMap,httpUACH).set("ua",userAgent).set(UA_BROWSER,this.getBrowser()).set(UA_CPU,this.getCPU()).set(UA_DEVICE,this.getDevice()).set(UA_ENGINE,this.getEngine()).set(UA_OS,this.getOS()).get()}}else{return function(){return new UAItem(itemType,userAgent,regexMap[itemType],httpUACH).parseUA().get()}}};setProps.call(this,[["getBrowser",createItemFunc(UA_BROWSER)],["getCPU",createItemFunc(UA_CPU)],["getDevice",createItemFunc(UA_DEVICE)],["getEngine",createItemFunc(UA_ENGINE)],["getOS",createItemFunc(UA_OS)],["getResult",createItemFunc(UA_RESULT)],["getUA",function(){return userAgent}],["setUA",function(ua){if(isString(ua))userAgent=ua.length>UA_MAX_LENGTH?trim(ua,UA_MAX_LENGTH):ua;return this}]]).setUA(userAgent);return this}UAParser.VERSION=LIBVERSION;UAParser.BROWSER=enumerize([NAME,VERSION,MAJOR,TYPE]);UAParser.CPU=enumerize([ARCHITECTURE]);UAParser.DEVICE=enumerize([MODEL,VENDOR,TYPE,CONSOLE,MOBILE,SMARTTV,TABLET,WEARABLE,EMBEDDED]);UAParser.ENGINE=UAParser.OS=enumerize([NAME,VERSION]);export{UAParser}; \ No newline at end of file +var LIBVERSION="2.0.5",UA_MAX_LENGTH=500,USER_AGENT="user-agent",EMPTY="",UNKNOWN="?",FUNC_TYPE="function",UNDEF_TYPE="undefined",OBJ_TYPE="object",STR_TYPE="string",UA_BROWSER="browser",UA_CPU="cpu",UA_DEVICE="device",UA_ENGINE="engine",UA_OS="os",UA_RESULT="result",NAME="name",TYPE="type",VENDOR="vendor",VERSION="version",ARCHITECTURE="architecture",MAJOR="major",MODEL="model",CONSOLE="console",MOBILE="mobile",TABLET="tablet",SMARTTV="smarttv",WEARABLE="wearable",XR="xr",EMBEDDED="embedded",INAPP="inapp",BRANDS="brands",FORMFACTORS="formFactors",FULLVERLIST="fullVersionList",PLATFORM="platform",PLATFORMVER="platformVersion",BITNESS="bitness",CH_HEADER="sec-ch-ua",CH_HEADER_FULL_VER_LIST=CH_HEADER+"-full-version-list",CH_HEADER_ARCH=CH_HEADER+"-arch",CH_HEADER_BITNESS=CH_HEADER+"-"+BITNESS,CH_HEADER_FORM_FACTORS=CH_HEADER+"-form-factors",CH_HEADER_MOBILE=CH_HEADER+"-"+MOBILE,CH_HEADER_MODEL=CH_HEADER+"-"+MODEL,CH_HEADER_PLATFORM=CH_HEADER+"-"+PLATFORM,CH_HEADER_PLATFORM_VER=CH_HEADER_PLATFORM+"-version",CH_ALL_VALUES=[BRANDS,FULLVERLIST,MOBILE,MODEL,PLATFORM,PLATFORMVER,ARCHITECTURE,FORMFACTORS,BITNESS],AMAZON="Amazon",APPLE="Apple",ASUS="ASUS",BLACKBERRY="BlackBerry",GOOGLE="Google",HUAWEI="Huawei",LENOVO="Lenovo",HONOR="Honor",LG="LG",MICROSOFT="Microsoft",MOTOROLA="Motorola",NVIDIA="Nvidia",ONEPLUS="OnePlus",OPPO="OPPO",SAMSUNG="Samsung",SHARP="Sharp",SONY="Sony",XIAOMI="Xiaomi",ZEBRA="Zebra",CHROME="Chrome",CHROMIUM="Chromium",CHROMECAST="Chromecast",EDGE="Edge",FIREFOX="Firefox",OPERA="Opera",FACEBOOK="Facebook",SOGOU="Sogou",PREFIX_MOBILE="Mobile ",SUFFIX_BROWSER=" Browser",WINDOWS="Windows";var isWindow=typeof window!==UNDEF_TYPE,NAVIGATOR=isWindow&&window.navigator?window.navigator:undefined,NAVIGATOR_UADATA=NAVIGATOR&&NAVIGATOR.userAgentData?NAVIGATOR.userAgentData:undefined;var extend=function(defaultRgx,extensions){var mergedRgx={};var extraRgx=extensions;if(!isExtensions(extensions)){extraRgx={};for(var i in extensions){for(var j in extensions[i]){extraRgx[j]=extensions[i][j].concat(extraRgx[j]?extraRgx[j]:[])}}}for(var k in defaultRgx){mergedRgx[k]=extraRgx[k]&&extraRgx[k].length%2===0?extraRgx[k].concat(defaultRgx[k]):defaultRgx[k]}return mergedRgx},enumerize=function(arr){var enums={};for(var i=0;i0){for(var i in str1){if(lowerize(str2)==lowerize(str1[i]))return true}return false}return isString(str1)?lowerize(str2)==lowerize(str1):false},isExtensions=function(obj,deep){for(var prop in obj){return/^(browser|cpu|device|engine|os)$/.test(prop)||(deep?isExtensions(obj[prop]):false)}},isString=function(val){return typeof val===STR_TYPE},itemListToArray=function(header){if(!header)return undefined;var arr=[];var tokens=strip(/\\?\"/g,header).split(",");for(var i=0;i-1){var token=trim(tokens[i]).split(";v=");arr[i]={brand:token[0],version:token[1]}}else{arr[i]=trim(tokens[i])}}return arr},lowerize=function(str){return isString(str)?str.toLowerCase():str},majorize=function(version){return isString(version)?strip(/[^\d\.]/g,version).split(".")[0]:undefined},setProps=function(arr){for(var i in arr){if(!arr.hasOwnProperty(i))continue;var propName=arr[i];if(typeof propName==OBJ_TYPE&&propName.length==2){this[propName[0]]=propName[1]}else{this[propName]=undefined}}return this},strip=function(pattern,str){return isString(str)?str.replace(pattern,EMPTY):str},stripQuotes=function(str){return strip(/\\?\"/g,str)},trim=function(str,len){if(isString(str)){str=strip(/^\s\s*/,str);return typeof len===UNDEF_TYPE?str:str.substring(0,UA_MAX_LENGTH)}};var rgxMapper=function(ua,arrays){if(!ua||!arrays)return;var i=0,j,k,p,q,matches,match;while(i0){if(q.length===2){if(typeof q[1]==FUNC_TYPE){this[q[0]]=q[1].call(this,match)}else{this[q[0]]=q[1]}}else if(q.length>=3){if(typeof q[1]===FUNC_TYPE&&!(q[1].exec&&q[1].test)){if(q.length>3){this[q[0]]=match?q[1].apply(this,q.slice(2)):undefined}else{this[q[0]]=match?q[1].call(this,match,q[2]):undefined}}else{if(q.length==3){this[q[0]]=match?match.replace(q[1],q[2]):undefined}else if(q.length==4){this[q[0]]=match?q[3].call(this,match.replace(q[1],q[2])):undefined}else if(q.length>4){this[q[0]]=match?q[3].apply(this,[match.replace(q[1],q[2])].concat(q.slice(4))):undefined}}}}else{this[q]=match?match:undefined}}}}i+=2}},strMapper=function(str,map){for(var i in map){if(typeof map[i]===OBJ_TYPE&&map[i].length>0){for(var j=0;j2){this.set(MODEL,"iPad").set(TYPE,TABLET)}break;case UA_OS:if(!this.get(NAME)&&NAVIGATOR_UADATA&&NAVIGATOR_UADATA[PLATFORM]){this.set(NAME,NAVIGATOR_UADATA[PLATFORM])}break;case UA_RESULT:var data=this.data;var detect=function(itemType){return data[itemType].getItem().detectFeature().get()};this.set(UA_BROWSER,detect(UA_BROWSER)).set(UA_CPU,detect(UA_CPU)).set(UA_DEVICE,detect(UA_DEVICE)).set(UA_ENGINE,detect(UA_ENGINE)).set(UA_OS,detect(UA_OS))}}return this};this.parseUA=function(){if(this.itemType!=UA_RESULT){rgxMapper.call(this.data,this.ua,this.rgxMap)}if(this.itemType==UA_BROWSER){this.set(MAJOR,majorize(this.get(VERSION)))}return this};this.parseCH=function(){var uaCH=this.uaCH,rgxMap=this.rgxMap;switch(this.itemType){case UA_BROWSER:case UA_ENGINE:var brands=uaCH[FULLVERLIST]||uaCH[BRANDS],prevName;if(brands){for(var i=0;i=13?"11":"10";this.set(NAME,osName).set(VERSION,osVersion)}if(this.get(NAME)==WINDOWS&&uaCH[MODEL]=="Xbox"){this.set(NAME,"Xbox").set(VERSION,undefined)}break;case UA_RESULT:var data=this.data;var parse=function(itemType){return data[itemType].getItem().setCH(uaCH).parseCH().get()};this.set(UA_BROWSER,parse(UA_BROWSER)).set(UA_CPU,parse(UA_CPU)).set(UA_DEVICE,parse(UA_DEVICE)).set(UA_ENGINE,parse(UA_ENGINE)).set(UA_OS,parse(UA_OS))}return this};setProps.call(this,[["itemType",itemType],["ua",ua],["uaCH",uaCH],["rgxMap",rgxMap],["data",createIData(this,itemType)]]);return this}function UAParser(ua,extensions,headers){if(typeof ua===OBJ_TYPE){if(isExtensions(ua,true)){if(typeof extensions===OBJ_TYPE){headers=extensions}extensions=ua}else{headers=ua;extensions=undefined}ua=undefined}else if(typeof ua===STR_TYPE&&!isExtensions(extensions,true)){headers=extensions;extensions=undefined}if(headers){if(typeof headers.append===FUNC_TYPE){var kv={};headers.forEach(function(v,k){kv[String(k).toLowerCase()]=v});headers=kv}else{var normalized={};for(var header in headers){if(headers.hasOwnProperty(header)){normalized[String(header).toLowerCase()]=headers[header]}}headers=normalized}}if(!(this instanceof UAParser)){return new UAParser(ua,extensions,headers).getResult()}var userAgent=typeof ua===STR_TYPE?ua:headers&&headers[USER_AGENT]?headers[USER_AGENT]:NAVIGATOR&&NAVIGATOR.userAgent?NAVIGATOR.userAgent:EMPTY,httpUACH=new UACHData(headers,true),regexMap=extensions?extend(defaultRegexes,extensions):defaultRegexes,createItemFunc=function(itemType){if(itemType==UA_RESULT){return function(){return new UAItem(itemType,userAgent,regexMap,httpUACH).set("ua",userAgent).set(UA_BROWSER,this.getBrowser()).set(UA_CPU,this.getCPU()).set(UA_DEVICE,this.getDevice()).set(UA_ENGINE,this.getEngine()).set(UA_OS,this.getOS()).get()}}else{return function(){return new UAItem(itemType,userAgent,regexMap[itemType],httpUACH).parseUA().get()}}};setProps.call(this,[["getBrowser",createItemFunc(UA_BROWSER)],["getCPU",createItemFunc(UA_CPU)],["getDevice",createItemFunc(UA_DEVICE)],["getEngine",createItemFunc(UA_ENGINE)],["getOS",createItemFunc(UA_OS)],["getResult",createItemFunc(UA_RESULT)],["getUA",function(){return userAgent}],["setUA",function(ua){if(isString(ua))userAgent=ua.length>UA_MAX_LENGTH?trim(ua,UA_MAX_LENGTH):ua;return this}]]).setUA(userAgent);return this}UAParser.VERSION=LIBVERSION;UAParser.BROWSER=enumerize([NAME,VERSION,MAJOR,TYPE]);UAParser.CPU=enumerize([ARCHITECTURE]);UAParser.DEVICE=enumerize([MODEL,VENDOR,TYPE,CONSOLE,MOBILE,SMARTTV,TABLET,WEARABLE,EMBEDDED]);UAParser.ENGINE=UAParser.OS=enumerize([NAME,VERSION]);export{UAParser}; \ No newline at end of file diff --git a/dist/ua-parser.pack.js b/dist/ua-parser.pack.js index 91f2a06..938a8a6 100644 --- a/dist/ua-parser.pack.js +++ b/dist/ua-parser.pack.js @@ -1,4 +1,4 @@ -/* UAParser.js v2.0.4 +/* UAParser.js v2.0.5 Copyright © 2012-2025 Faisal Salman UAParser.js PRO Personal License */ -((i,l)=>{function I(i){for(var e={},t=0;t{var t,o={},r=e;if(!Ti(e))for(var a in r={},e)for(var s in e[a])r[s]=e[a][s].concat(r[s]||[]);for(t in i)o[t]=r[t]&&r[t].length%2==0?r[t].concat(i[t]):i[t];return o})(Pi,e):Pi,M.call(this,[["getBrowser",(n=function(i){return i==g?function(){return new Gi(i,r,s,a).set("ua",r).set(u,this.getBrowser()).set(h,this.getCPU()).set(p,this.getDevice()).set(m,this.getEngine()).set(f,this.getOS()).get()}:function(){return new Gi(i,r,s[i],a).parseUA().get()}})(u)],["getCPU",n(h)],["getDevice",n(p)],["getEngine",n(m)],["getOS",n(f)],["getResult",n(g)],["getUA",function(){return r}],["setUA",function(i){return O(i)&&(r=i.length>U?Mi(i,U):i),this}]]).setUA(r),this):new V(i,e,t).getResult()}V.VERSION="2.0.4",V.BROWSER=I([v,y,G,k]),V.CPU=I([C]),V.DEVICE=I([S,x,k,W,_,e,r,t,F]),V.ENGINE=V.OS=I([v,y]),typeof exports!==n?(exports=typeof module!==n&&module.exports?module.exports=V:exports).UAParser=V:typeof define===R&&define.amd?define(function(){return V}):qi&&(i.UAParser=V);var Wi,Ni=qi&&(i.jQuery||i.Zepto);Ni&&!Ni.ua&&(Wi=new V,Ni.ua=Wi.getResult(),Ni.ua.get=function(){return Wi.getUA()},Ni.ua.set=function(i){Wi.setUA(i);var e,t=Wi.getResult();for(e in t)Ni.ua[e]=t[e]})})("object"==typeof window?window:this); \ No newline at end of file +((i,c)=>{function V(i){for(var e={},t=0;t{var t,o={},r=e;if(!zi(e))for(var a in r={},e)for(var s in e[a])r[s]=e[a][s].concat(r[s]||[]);for(t in i)o[t]=r[t]&&r[t].length%2==0?r[t].concat(i[t]):i[t];return o})(Ui,e):Ui,M.call(this,[["getBrowser",(b=function(i){return i==g?function(){return new Gi(i,s,w,n).set("ua",s).set(u,this.getBrowser()).set(h,this.getCPU()).set(p,this.getDevice()).set(m,this.getEngine()).set(f,this.getOS()).get()}:function(){return new Gi(i,s,w[i],n).parseUA().get()}})(u)],["getCPU",b(h)],["getDevice",b(p)],["getEngine",b(m)],["getOS",b(f)],["getResult",b(g)],["getUA",function(){return s}],["setUA",function(i){return Oi(i)&&(s=i.length>I?Mi(i,I):i),this}]]).setUA(s),this):new P(i,e,t).getResult()}P.VERSION="2.0.5",P.BROWSER=V([v,y,G,k]),P.CPU=V([C]),P.DEVICE=V([S,x,k,W,_,e,r,t,F]),P.ENGINE=P.OS=V([v,y]),typeof exports!==n?(exports=typeof module!==n&&module.exports?module.exports=P:exports).UAParser=P:typeof define===L&&define.amd?define(function(){return P}):_i&&(i.UAParser=P);var Wi,Ni=_i&&(i.jQuery||i.Zepto);Ni&&!Ni.ua&&(Wi=new P,Ni.ua=Wi.getResult(),Ni.ua.get=function(){return Wi.getUA()},Ni.ua.set=function(i){Wi.setUA(i);var e,t=Wi.getResult();for(e in t)Ni.ua[e]=t[e]})})("object"==typeof window?window:this); \ No newline at end of file diff --git a/dist/ua-parser.pack.mjs b/dist/ua-parser.pack.mjs index 3938d46..45505b7 100644 --- a/dist/ua-parser.pack.mjs +++ b/dist/ua-parser.pack.mjs @@ -1,4 +1,4 @@ -/* UAParser.js v2.0.4 +/* UAParser.js v2.0.5 Copyright © 2012-2025 Faisal Salman UAParser.js PRO Personal License */ -function I(i){for(var e={},o=0;o{var o,t={},r=e;if(!zi(e))for(var a in r={},e)for(var s in e[a])r[s]=e[a][s].concat(r[s]||[]);for(o in i)t[o]=r[o]&&r[o].length%2==0?r[o].concat(i[o]):i[o];return t})(Ii,e):Ii,A.call(this,[["getBrowser",(n=function(i){return i==f?function(){return new Li(i,r,s,a).set("ua",r).set(c,this.getBrowser()).set(u,this.getCPU()).set(h,this.getDevice()).set(p,this.getEngine()).set(m,this.getOS()).get()}:function(){return new Li(i,r,s[i],a).parseUA().get()}})(c)],["getCPU",n(u)],["getDevice",n(h)],["getEngine",n(p)],["getOS",n(m)],["getResult",n(f)],["getUA",function(){return r}],["setUA",function(i){return H(i)&&(r=i.length>B?Mi(i,B):i),this}]]).setUA(r),this):new V(i,e,o).getResult()}V.VERSION="2.0.4",V.BROWSER=I([g,x,C,v]),V.CPU=I([y]),V.DEVICE=I([S,k,v,G,_,i,r,e,N]),V.ENGINE=V.OS=I([g,x]);export{V as UAParser}; \ No newline at end of file +function I(i){for(var e={},o=0;o{var o,t={},r=e;if(!zi(e))for(var a in r={},e)for(var s in e[a])r[s]=e[a][s].concat(r[s]||[]);for(o in i)t[o]=r[o]&&r[o].length%2==0?r[o].concat(i[o]):i[o];return t})(Ii,e):Ii,A.call(this,[["getBrowser",(d=function(i){return i==f?function(){return new Li(i,s,w,n).set("ua",s).set(c,this.getBrowser()).set(h,this.getCPU()).set(u,this.getDevice()).set(p,this.getEngine()).set(m,this.getOS()).get()}:function(){return new Li(i,s,w[i],n).parseUA().get()}})(c)],["getCPU",d(h)],["getDevice",d(u)],["getEngine",d(p)],["getOS",d(m)],["getResult",d(f)],["getUA",function(){return s}],["setUA",function(i){return H(i)&&(s=i.length>P?Mi(i,P):i),this}]]).setUA(s),this):new V(i,e,o).getResult()}V.VERSION="2.0.5",V.BROWSER=I([g,x,G,v]),V.CPU=I([y]),V.DEVICE=I([C,k,v,W,S,i,r,e,F]),V.ENGINE=V.OS=I([g,x]);export{V as UAParser}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 5c74e9a..dfa84c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ua-parser-js/pro-personal", - "version": "2.0.4", + "version": "2.0.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ua-parser-js/pro-personal", - "version": "2.0.4", + "version": "2.0.5", "funding": [ { "type": "opencollective", @@ -23,11 +23,10 @@ ], "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@types/node-fetch": "^2.6.12", "detect-europe-js": "^0.1.2", "is-standalone-pwa": "^0.1.1", - "node-fetch": "^2.7.0", - "ua-is-frozen": "^0.1.2" + "ua-is-frozen": "^0.1.2", + "undici": "^7.12.0" }, "bin": { "pro-personal": "script/cli.js" @@ -402,23 +401,6 @@ "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true }, - "node_modules/@types/node": { - "version": "22.13.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz", - "integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==", - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/@types/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.0" - } - }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", @@ -519,11 +501,6 @@ "node": ">=0.10.0" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -664,17 +641,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -753,14 +719,6 @@ "node": ">=0.10.0" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/detect-europe-js": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/detect-europe-js/-/detect-europe-js-0.1.2.tgz", @@ -1011,19 +969,6 @@ "flat": "cli.js" } }, - "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1591,25 +1536,6 @@ "node": ">=8.6" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -1963,25 +1889,6 @@ "node": "^10 || ^12 || >=13.7" } }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/normalize-package-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", @@ -2713,11 +2620,6 @@ "node": ">=8.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -2791,10 +2693,14 @@ "node": ">=0.8.0" } }, - "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" + "node_modules/undici": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.12.0.tgz", + "integrity": "sha512-GrKEsc3ughskmGA9jevVlIOPMiiAHJ4OFUtaAH+NhfTUSiZ1wMPIQqQvAJUrJspFXJt3EBWgpAeoHEDVT1IBug==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } }, "node_modules/validate-npm-package-license": { "version": "3.0.4", @@ -2806,20 +2712,6 @@ "spdx-expression-parse": "^3.0.0" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 8edbf75..c8a2c6e 100755 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "title": "UAParser.js PRO Personal", "name": "@ua-parser-js/pro-personal", - "version": "2.0.4", + "version": "2.0.5", "author": "Faisal Salman (http://faisalman.com)", "description": "Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent & Client Hints data. Supports browser & node.js environment", "keywords": [ @@ -227,8 +227,7 @@ "detect-europe-js": "^0.1.2", "is-standalone-pwa": "^0.1.1", "ua-is-frozen": "^0.1.2", - "node-fetch": "^2.7.0", - "@types/node-fetch": "^2.6.12" + "undici": "^7.12.0" }, "devDependencies": { "@babel/parser": "7.15.8", diff --git a/script/build-esm.js b/script/build-esm.js index 98f7ffb..78321dd 100755 --- a/script/build-esm.js +++ b/script/build-esm.js @@ -2,15 +2,18 @@ /* jshint esversion: 6 */ const fs = require('fs'); -const generateMJS = (module) => { - let { src, dest, title, replacements } = module; - let text = fs.readFileSync(src, 'utf-8'); - - replacements.push( +const defaultReplacements = { + mjs: [ [/const (.+?)\s*=\s*require\(\'\.(.+)\'\)/ig, 'import $1 from \'\.$2.mjs\''], [/const (.+?)\s*=\s*require\(\'(.+)\'\)/ig, 'import $1 from \'$2\''], [/module\.exports =/ig, 'export'] - ); + ] +} + +const generateFile = (module) => { + let { src, dest, title, replacements } = module; + let text = fs.readFileSync(src, 'utf-8'); + replacements.forEach(rep => { text = text.replace(rep[0], rep[1]); }); @@ -18,42 +21,54 @@ const generateMJS = (module) => { console.log(`Generate ${dest}`); fs.writeFileSync(dest, -`// Generated ESM version of ${title} +`// ${title} // DO NOT EDIT THIS FILE! // Source: /${src} ${text}`, 'utf-8'); - }; -const modules = [ +const files = [ { src : 'src/main/ua-parser.js', dest : 'src/main/ua-parser.mjs', - title : 'ua-parser-js', + title : 'Generated ESM version of ua-parser-js', replacements : [ [/\(func[\s\S]+strict\';/ig, ''], [/esversion\: 3/ig, 'esversion: 6'], - [/\/[\/\s]+export[\s\S]+/ig,'export {UAParser};'] + [/\/[\/\s]+export[\s\S]+/ig,'export {UAParser};'], + ...defaultReplacements.mjs ] - },{ + }, + { src : 'src/enums/ua-parser-enums.js', dest :'src/enums/ua-parser-enums.mjs', - title : 'ua-parser-js/enums', - replacements : [] + title : 'Generated ESM version of ua-parser-js/enums', + replacements : [...defaultReplacements.mjs] + }, + { + src : 'src/enums/ua-parser-enums.js', + dest :'src/enums/ua-parser-enums.d.ts', + title : 'Generated type declarations of ua-parser-js/enums', + replacements : [ + [/(const .+) = object\.freeze\(/ig, 'export $1: Readonly<'], + [/(const .+) =( .+;)/ig, 'export $1: typeof$2'], + [/}\);/ig, '}>;'], + [/module\.exports =.+/igs, ''] + ] }, { src : 'src/extensions/ua-parser-extensions.js', dest : 'src/extensions/ua-parser-extensions.mjs', - title : 'ua-parser-js/extensions', - replacements : [] + title : 'Generated ESM version of ua-parser-js/extensions', + replacements : [...defaultReplacements.mjs] }, { src : 'src/helpers/ua-parser-helpers.js', dest : 'src/helpers/ua-parser-helpers.mjs', - title : 'ua-parser-js/helpers', - replacements : [] + title : 'Generated ESM version of ua-parser-js/helpers', + replacements : [...defaultReplacements.mjs] } ]; -modules.forEach(module => generateMJS(module)); \ No newline at end of file +files.forEach(module => generateFile(module)); \ No newline at end of file diff --git a/src/enums/ua-parser-enums.d.ts b/src/enums/ua-parser-enums.d.ts index e8d3615..b1ae749 100644 --- a/src/enums/ua-parser-enums.d.ts +++ b/src/enums/ua-parser-enums.d.ts @@ -1,384 +1,731 @@ -// Type definitions for Enums submodule of UAParser.js v2.0.4 -// Project: https://github.com/faisalman/ua-parser-js -// Definitions by: Faisal Salman +// Generated type declarations of ua-parser-js/enums +// DO NOT EDIT THIS FILE! +// Source: /src/enums/ua-parser-enums.js -export const Browser: Readonly<{ - '115': "115"; - '2345': "2345"; - '360': "360"; - ALIPAY: "Alipay"; - AMAYA: "Amaya"; - ANDROID: "Android Browser"; - ARORA: "Arora"; - AVANT: "Avant"; - AVAST: "Avast Secure Browser"; - AVG: "AVG Secure Browser"; - BAIDU: "Baidu Browser"; - BASILISK: "Basilisk"; - BLAZER: "Blazer"; - BOLT: "Bolt"; - BOWSER: "Bowser"; - BRAVE: "Brave"; - CAMINO: "Camino"; - CHIMERA: "Chimera"; - CHROME: "Chrome"; - CHROME_HEADLESS: "Chrome Headless"; - CHROME_MOBILE: "Mobile Chrome"; - CHROME_WEBVIEW: "Chrome WebView"; - CHROMIUM: "Chromium"; - COBALT: "Cobalt"; - COC_COC: "Coc Coc"; - CONKEROR: "Conkeror"; - DAUM: "Daum"; - DILLO: "Dillo"; - DOLPHIN: "Dolphin"; +/////////////////////////////////////////////// +/* Enums for UAParser.js v2.0.5 + https://github.com/faisalman/ua-parser-js + Author: Faisal Salman + UAParser.js PRO Personal License */ +////////////////////////////////////////////// + +/*jshint esversion: 6 */ + +export const BrowserName: Readonly<{ + '115': '115', + '2345': '2345', + '360': '360', + ALIPAY: 'Alipay', + AMAYA: 'Amaya', + ANDROID: 'Android Browser', + ARORA: 'Arora', + AVANT: 'Avant', + AVAST: 'Avast Secure Browser', + AVG: 'AVG Secure Browser', + BAIDU: 'Baidu Browser', + BASILISK: 'Basilisk', + BLAZER: 'Blazer', + BOLT: 'Bolt', + BOWSER: 'Bowser', + BRAVE: 'Brave', + CAMINO: 'Camino', + CHIMERA: 'Chimera', + CHROME: 'Chrome', + CHROME_HEADLESS: 'Chrome Headless', + CHROME_MOBILE: 'Mobile Chrome', + CHROME_WEBVIEW: 'Chrome WebView', + CHROMIUM: 'Chromium', + COBALT: 'Cobalt', + COC_COC: 'Coc Coc', + CONKEROR: 'Conkeror', + DAUM: 'Daum', + DILLO: 'Dillo', + DOLPHIN: 'Dolphin', DOOBLE: 'Dooble', - DORIS: "Doris"; - DRAGON: "Dragon"; - DUCKDUCKGO: "DuckDuckGo"; - ECOSIA: "Ecosia"; - EDGE: "Edge"; - EDGE_WEBVIEW: "Edge WebView"; - EDGE_WEBVIEW2: "Edge WebView2"; - EPIPHANY: "Epiphany"; - FACEBOOK: "Facebook"; - FALKON: "Falkon"; - FIREBIRD: "Firebird"; - FIREFOX: "Firefox"; - FIREFOX_FOCUS: "Firefox Focus"; - FIREFOX_MOBILE: "Mobile Firefox"; - FIREFOX_REALITY: "Firefox Reality"; - FENNEC: "Fennec"; - FLOCK: "Flock"; - FLOW: "Flow"; - GO: "GoBrowser"; - GOOGLE_SEARCH: "GSA"; - HELIO: "Helio"; - HEYTAP: "HeyTap"; - HONOR: "Honor"; - HUAWEI: "Huawei Browser"; - ICAB: "iCab"; - ICE: "ICE Browser"; - ICEAPE: "IceApe"; - ICECAT: "IceCat"; - ICEDRAGON: "IceDragon"; - ICEWEASEL: "IceWeasel"; - IE: "IE"; - INSTAGRAM: "Instagram"; - IRIDIUM: "Iridium"; - IRON: "Iron"; - JASMINE: "Jasmine"; - KONQUEROR: "Konqueror"; - KAKAO: "KakaoTalk"; - KHTML: "KHTML"; - K_MELEON: "K-Meleon"; - KLAR: "Klar"; - KLARNA: "Klarna"; - KINDLE: "Kindle"; - LENOVO: "Smart Lenovo Browser"; - LADYBIRD: "Ladybird"; - LG: "LG Browser"; - LIBREWOLF: "LibreWolf"; - LIEBAO: "LBBROWSER"; - LINE: "Line"; - LINKEDIN: "LinkedIn"; - LINKS: "Links"; - LUNASCAPE: "Lunascape"; - LYNX: "Lynx"; - MAEMO: "Maemo Browser"; - MAXTHON: "Maxthon"; - MIDORI: "Midori"; - MINIMO: "Minimo"; - MIUI: "MIUI Browser"; - MOZILLA: "Mozilla"; - MOSAIC: "Mosaic"; - NAVER: "Naver"; - NETFRONT: "NetFront"; - NETSCAPE: "Netscape"; - NETSURF: "Netsurf"; - NOKIA: "Nokia Browser"; - OBIGO: "Obigo"; - OCULUS: "Oculus Browser"; - OMNIWEB: "OmniWeb"; - OPERA: "Opera"; - OPERA_COAST: "Opera Coast"; - OPERA_GX: "Opera GX", - OPERA_MINI: "Opera Mini"; - OPERA_MOBI: "Opera Mobi"; - OPERA_TABLET: "Opera Tablet"; - OPERA_TOUCH: "Opera Touch"; - OTTER: "Otter"; - OVI: "OviBrowser"; - PALEMOON: "PaleMoon"; - PHANTOMJS: "PhantomJS"; - PHOENIX: "Phoenix"; - PICOBROWSER: "Pico Browser"; - POLARIS: "Polaris"; - PUFFIN: "Puffin"; - QQ: "QQBrowser"; - QQ_LITE: "QQBrowserLite"; - QUARK: "Quark"; - QUPZILLA: "QupZilla"; - QUTEBROWSER: "qutebrowser"; - REKONQ: "rekonq"; - ROCKMELT: "Rockmelt"; - SAFARI: "Safari"; - SAFARI_MOBILE: "Mobile Safari"; - SAILFISH: "Sailfish Browser"; - SAMSUNG: "Samsung Internet"; - SEAMONKEY: "SeaMonkey"; - SILK: "Silk"; - SKYFIRE: "Skyfire"; - SLEIPNIR: "Sleipnir"; - SLIMBOAT: "SlimBoat"; - SLIMBROWSER: "SlimBrowser"; - SLIMJET: "Slimjet"; - SNAPCHAT: "Snapchat"; - SOGOU_EXPLORER: "Sogou Explorer"; - SOGOU_MOBILE: "Sogou Mobile"; - SURF: "Surf"; - SWIFTFOX: "Swiftfox"; - TESLA: "Tesla"; - TIKTOK: "TikTok"; - TIZEN: "Tizen Browser"; - TWITTER: "Twitter"; - UC: "UCBrowser"; - UP: "UP.Browser"; - VIVALDI: "Vivaldi"; - VIVO: "Vivo Browser"; - W3M: "w3m"; - WATERFOX: "Waterfox"; - WEBKIT: "WebKit"; - WECHAT: "WeChat"; - WEIBO: "Weibo"; - WHALE: "Whale"; - WOLVIC: "Wolvic"; - YANDEX: "Yandex"; + DORIS: 'Doris', + DRAGON: 'Dragon', + DUCKDUCKGO: 'DuckDuckGo', + ECOSIA: 'Ecosia', + EDGE: 'Edge', + EDGE_WEBVIEW: 'Edge WebView', + EDGE_WEBVIEW2: 'Edge WebView2', + EPIPHANY: 'Epiphany', + FACEBOOK: 'Facebook', + FALKON: 'Falkon', + FIREBIRD: 'Firebird', + FIREFOX: 'Firefox', + FIREFOX_FOCUS: 'Firefox Focus', + FIREFOX_MOBILE: 'Mobile Firefox', + FIREFOX_REALITY: 'Firefox Reality', + FENNEC: 'Fennec', + FLOCK: 'Flock', + FLOW: 'Flow', + GO: 'GoBrowser', + GOOGLE_SEARCH: 'GSA', + HELIO: 'Helio', + HEYTAP: 'HeyTap', + HONOR: 'Honor', + HUAWEI: 'Huawei Browser', + ICAB: 'iCab', + ICE: 'ICE Browser', + ICEAPE: 'IceApe', + ICECAT: 'IceCat', + ICEDRAGON: 'IceDragon', + ICEWEASEL: 'IceWeasel', + IE: 'IE', + INSTAGRAM: 'Instagram', + IRIDIUM: 'Iridium', + IRON: 'Iron', + JASMINE: 'Jasmine', + KONQUEROR: 'Konqueror', + KAKAO: 'KakaoTalk', + KHTML: 'KHTML', + K_MELEON: 'K-Meleon', + KLAR: 'Klar', + KLARNA: 'Klarna', + KINDLE: 'Kindle', + LENOVO: 'Smart Lenovo Browser', + LADYBIRD: 'Ladybird', + LG: 'LG Browser', + LIBREWOLF: 'LibreWolf', + LIEBAO: 'LBBROWSER', + LINE: 'Line', + LINKEDIN: 'LinkedIn', + LINKS: 'Links', + LUNASCAPE: 'Lunascape', + LYNX: 'Lynx', + MAEMO: 'Maemo Browser', + MAXTHON: 'Maxthon', + MIDORI: 'Midori', + MINIMO: 'Minimo', + MIUI: 'MIUI Browser', + MOZILLA: 'Mozilla', + MOSAIC: 'Mosaic', + NAVER: 'Naver', + NETFRONT: 'NetFront', + NETSCAPE: 'Netscape', + NETSURF: 'Netsurf', + NOKIA: 'Nokia Browser', + OBIGO: 'Obigo', + OCULUS: 'Oculus Browser', + OMNIWEB: 'OmniWeb', + OPERA: 'Opera', + OPERA_COAST: 'Opera Coast', + OPERA_GX: 'Opera GX', + OPERA_MINI: 'Opera Mini', + OPERA_MOBI: 'Opera Mobi', + OPERA_TABLET: 'Opera Tablet', + OPERA_TOUCH: 'Opera Touch', + OTTER: 'Otter', + OVI: 'OviBrowser', + PALEMOON: 'PaleMoon', + PHANTOMJS: 'PhantomJS', + PHOENIX: 'Phoenix', + PICOBROWSER: 'Pico Browser', + POLARIS: 'Polaris', + PUFFIN: 'Puffin', + QQ: 'QQBrowser', + QQ_LITE: 'QQBrowserLite', + QUARK: 'Quark', + QUPZILLA: 'QupZilla', + QUTEBROWSER: 'qutebrowser', + REKONQ: 'rekonq', + ROCKMELT: 'Rockmelt', + SAFARI: 'Safari', + SAFARI_MOBILE: 'Mobile Safari', + SAILFISH: 'Sailfish Browser', + SAMSUNG: 'Samsung Internet', + SEAMONKEY: 'SeaMonkey', + SILK: 'Silk', + SKYFIRE: 'Skyfire', + SLEIPNIR: 'Sleipnir', + SLIMBOAT: 'SlimBoat', + SLIMBROWSER: 'SlimBrowser', + SLIMJET: 'Slimjet', + SNAPCHAT: 'Snapchat', + SOGOU_EXPLORER: 'Sogou Explorer', + SOGOU_MOBILE: 'Sogou Mobile', + SURF: 'Surf', + SWIFTFOX: 'Swiftfox', + TESLA: 'Tesla', + TIKTOK: 'TikTok', + TIZEN: 'Tizen Browser', + TWITTER: 'Twitter', + UC: 'UCBrowser', + UP: 'UP.Browser', + VIVALDI: 'Vivaldi', + VIVO: 'Vivo Browser', + W3M: 'w3m', + WATERFOX: 'Waterfox', + WEBKIT: 'WebKit', + WECHAT: 'WeChat', + WEIBO: 'Weibo', + WHALE: 'Whale', + WOLVIC: 'Wolvic', + YANDEX: 'Yandex', + ZALO: 'Zalo' + + // TODO : test! }>; +/** + * @deprecated Use `BrowserName` instead + */ +export const Browser: typeof BrowserName; + export const BrowserType: Readonly<{ - CRAWLER: "crawler"; - CLI: "cli"; - EMAIL: "email"; - FETCHER: "fetcher"; - INAPP: "inapp"; - MEDIAPLAYER: "mediaplayer"; - LIBRARY: "library"; + CRAWLER: 'crawler', + CLI: 'cli', + EMAIL: 'email', + FETCHER: 'fetcher', + INAPP: 'inapp', + MEDIAPLAYER: 'mediaplayer', + LIBRARY: 'library' }>; -export const CPU: Readonly<{ - '68K': "68k"; - ARM: "arm"; - ARM_64: "arm64"; - ARM_HF: "armhf"; - AVR: "avr"; - AVR_32: "avr32"; - IA64: "ia64"; - IRIX: "irix"; - IRIX_64: "irix64"; - MIPS: "mips"; - MIPS_64: "mips64"; - PA_RISC: "pa-risc"; - PPC: "ppc"; - SPARC: "sparc"; - SPARC_64: "sparc64"; - X86: "ia32"; - X86_64: "amd64"; + +export const CPUArch: Readonly<{ + '68K': '68k', + ALPHA: 'alpha', + ARM : 'arm', + ARM_64: 'arm64', + ARM_HF: 'armhf', + AVR: 'avr', + AVR_32: 'avr32', + IA64: 'ia64', + IRIX: 'irix', + IRIX_64: 'irix64', + MIPS: 'mips', + MIPS_64: 'mips64', + PA_RISC: 'pa-risc', + PPC: 'ppc', + SPARC: 'sparc', + SPARC_64: 'sparc64', + X86: 'ia32', + X86_64: 'amd64' }>; -export const Device: Readonly<{ - CONSOLE: "console"; - DESKTOP: "desktop"; - EMBEDDED: "embedded"; - MOBILE: "mobile"; - SMARTTV: "smarttv"; - TABLET: "tablet"; - WEARABLE: "wearable"; - XR: "xr"; +/** + * @deprecated Use `CPUArch` instead + */ +export const CPU: typeof CPUArch; + +export const DeviceType: Readonly<{ + CONSOLE: 'console', + DESKTOP: 'desktop', + EMBEDDED: 'embedded', + MOBILE: 'mobile', + SMARTTV: 'smarttv', + TABLET: 'tablet', + WEARABLE: 'wearable', + XR: 'xr' }>; -export const Vendor: Readonly<{ - ACER: "Acer"; - ADVAN: "Advan"; - ALCATEL: "Alcatel"; - APPLE: "Apple"; - AMAZON: "Amazon"; - ARCHOS: "Archos"; - ASUS: "ASUS"; - ATT: "AT&T"; - BENQ: "BenQ"; - BLACKBERRY: "BlackBerry"; - BLU: "BLU"; - CAT: "Cat"; - DELL: "Dell"; - ENERGIZER: "Energizer"; - ESSENTIAL: "Essential"; - FACEBOOK: "Facebook"; - FAIRPHONE: "Fairphone"; - GEEKSPHONE: "GeeksPhone"; - GENERIC: "Generic"; - GOOGLE: "Google"; - HMD: "HMD"; - HP: "HP"; - HTC: "HTC"; - HUAWEI: "Huawei"; - IMO: "IMO"; - INFINIX: "Infinix"; - ITEL: "itel"; - JOLLA: "Jolla"; - KOBO: "Kobo"; - LAVA: "Lava"; - LENOVO: "Lenovo"; - LG: "LG"; - MEIZU: "Meizu"; - MICROMAX: "Micromax"; - MICROSOFT: "Microsoft"; - MOTOROLA: "Motorola"; - NEXIAN: "Nexian"; - NINTENDO: "Nintendo"; - NOKIA: "Nokia"; - NOTHING: "Nothing"; - NVIDIA: "Nvidia"; - ONEPLUS: "OnePlus"; - OPPO: "OPPO"; - OUYA: "Ouya"; - PALM: "Palm"; - PANASONIC: "Panasonic"; - PEBBLE: "Pebble"; - PICO: "Pico"; - POLYTRON: "Polytron"; - REALME: "Realme"; - RETROID: "Retroid"; - RIM: "RIM"; - ROKU: "Roku"; - SAMSUNG: "Samsung"; - SHARP: "Sharp"; - SIEMENS: "Siemens"; - SMARTFREN: "Smartfren"; - SONY: "Sony"; - SPRINT: "Sprint"; - TCL: "TCL"; - TECHNISAT: "TechniSAT"; - TECNO: "Tecno"; - TESLA: "Tesla"; - ULEFONE: "Ulefone"; - VIVO: "Vivo"; - VIZIO: "Vizio"; - VODAFONE: "Vodafone"; - XBOX: "Xbox"; - XIAOMI: "Xiaomi"; - ZEBRA: "Zebra"; - ZTE: "ZTE"; +/** + * @deprecated Use `DeviceType` instead + */ +export const Device: typeof DeviceType; + +export const DeviceVendor: Readonly<{ + ACER: 'Acer', + ADVAN: 'Advan', + ALCATEL: 'Alcatel', + APPLE: 'Apple', + AMAZON: 'Amazon', + ARCHOS: 'Archos', + ASUS: 'ASUS', + ATT: 'AT&T', + BENQ: 'BenQ', + BLACKBERRY: 'BlackBerry', + BLU: 'BLU', + CAT: 'Cat', + DELL: 'Dell', + ENERGIZER: 'Energizer', + ESSENTIAL: 'Essential', + FACEBOOK: 'Facebook', + FAIRPHONE: 'Fairphone', + GEEKSPHONE: 'GeeksPhone', + GENERIC: 'Generic', + GOOGLE: 'Google', + HMD: 'HMD', + HP: 'HP', + HTC: 'HTC', + HUAWEI: 'Huawei', + IMO: 'IMO', + INFINIX: 'Infinix', + ITEL: 'itel', + JOLLA: 'Jolla', + KOBO: 'Kobo', + LAVA: 'Lava', + LENOVO: 'Lenovo', + LG: 'LG', + MEIZU: 'Meizu', + MICROMAX: 'Micromax', + MICROSOFT: 'Microsoft', + MOTOROLA: 'Motorola', + NEXIAN: 'Nexian', + NINTENDO: 'Nintendo', + NOKIA: 'Nokia', + NOTHING: 'Nothing', + NVIDIA: 'Nvidia', + ONEPLUS: 'OnePlus', + OPPO: 'OPPO', + OUYA: 'Ouya', + PALM: 'Palm', + PANASONIC: 'Panasonic', + PEBBLE: 'Pebble', + PHILIPS: 'Philips', + PICO: 'Pico', + POLYTRON: 'Polytron', + REALME: 'Realme', + RETROID: 'Retroid', + RIM: 'RIM', + ROKU: 'Roku', + SAMSUNG: 'Samsung', + SHARP: 'Sharp', + SIEMENS: 'Siemens', + SMARTFREN: 'Smartfren', + SONY: 'Sony', + SPRINT: 'Sprint', + TCL: 'TCL', + TECHNISAT: 'TechniSAT', + TECNO: 'TECNO', + TESLA: 'Tesla', + ULEFONE: 'Ulefone', + VIVO: 'Vivo', + VIZIO: 'Vizio', + VODAFONE: 'Vodafone', + XBOX: 'Xbox', + XIAOMI: 'Xiaomi', + ZEBRA: 'Zebra', + ZTE: 'ZTE', + + // TODO : test! }>; -export const Engine: Readonly<{ - AMAYA: "Amaya"; - ARKWEB: "ArkWeb"; - BLINK: "Blink"; - EDGEHTML: "EdgeHTML"; - FLOW: "Flow"; - GECKO: "Gecko"; - GOANNA: "Goanna"; - ICAB: "iCab"; - KHTML: "KHTML"; - LIBWEB: "LibWeb"; - LINKS: "Links"; - LYNX: "Lynx"; - NETFRONT: "NetFront"; - NETSURF: "NetSurf"; - PRESTO: "Presto"; - SERVO: "Servo"; - TASMAN: "Tasman"; - TRIDENT: "Trident"; - W3M: "w3m"; - WEBKIT: "WebKit"; +/** + * @deprecated Use `DeviceVendor` instead + */ +export const Vendor: typeof DeviceVendor; + +export const EngineName: Readonly<{ + AMAYA: 'Amaya', + ARKWEB: 'ArkWeb', + BLINK: 'Blink', + EDGEHTML: 'EdgeHTML', + FLOW: 'Flow', + GECKO: 'Gecko', + GOANNA: 'Goanna', + ICAB: 'iCab', + KHTML: 'KHTML', + LIBWEB: 'LibWeb', + LINKS: 'Links', + LYNX: 'Lynx', + NETFRONT: 'NetFront', + NETSURF: 'NetSurf', + PRESTO: 'Presto', + SERVO: 'Servo', + TASMAN: 'Tasman', + TRIDENT: 'Trident', + W3M: 'w3m', + WEBKIT: 'WebKit' }>; -export const OS: Readonly<{ - AIX: "AIX"; - AMIGA_OS: "Amiga OS"; - ANDROID: "Android"; - ANDROID_X86: "Android-x86"; - ARCAOS: "ArcaOS"; - ARCH: "Arch"; - BADA: "Bada"; - BEOS: "BeOS"; - BLACKBERRY: "BlackBerry"; - CENTOS: "CentOS"; - CHROME_OS: "Chrome OS"; - CHROMECAST: "Chromecast"; - CHROMECAST_ANDROID: "Chromecast Android"; - CHROMECAST_FUCHSIA: "Chromecast Fuchsia"; - CHROMECAST_LINUX: "Chromecast Linux"; - CHROMECAST_SMARTSPEAKER: "Chromecast SmartSpeaker"; - CONTIKI: "Contiki"; - DEBIAN: "Debian"; - DEEPIN: "Deepin"; - DRAGONFLY: "DragonFly"; - ELEMENTARY_OS: "elementary OS"; - FEDORA: "Fedora"; - FIREFOX_OS: "Firefox OS"; - FREEBSD: "FreeBSD"; - FUCHSIA: "Fuchsia"; - GENTOO: "Gentoo"; - GHOSTBSD: "GhostBSD"; - GNU: "GNU"; - HAIKU: "Haiku"; - HARMONYOS: "HarmonyOS"; - HP_UX: "HP-UX"; - HURD: "Hurd"; - IOS: "iOS"; - JOLI: "Joli"; - KAIOS: "KaiOS"; - KNOPPIX: "Knoppix"; - KUBUNTU: "Kubuntu"; - LINPUS: "Linpus"; - LINSPIRE: "Linspire"; - LINUX: "Linux"; - MACOS: "macOS"; - MAEMO: "Maemo"; - MAGEIA: "Mageia"; - MANDRIVA: "Mandriva"; - MANJARO: "Manjaro"; - MEEGO: "MeeGo"; - MINIX: "Minix"; - MINT: "Mint"; - MORPH_OS: "Morph OS"; - NETBSD: "NetBSD"; - NETRANGE: "NetRange"; - NETTV: "NetTV"; - NINTENDO: "Nintendo"; - OPENHARMONY: "OpenHarmony"; - OPENBSD: "OpenBSD"; - OPENVMS: "OpenVMS"; - OS2: "OS/2"; - PALM: "Palm"; - PC_BSD: "PC-BSD"; - PCLINUXOS: "PCLinuxOS"; - PICO: "Pico"; - PLAN9: "Plan9"; - PLAYSTATION: "PlayStation"; - QNX: "QNX"; - RASPBIAN: "Raspbian"; - REDHAT: "RedHat"; - RIM_TABLET_OS: "RIM Tablet OS"; - RISC_OS: "RISC OS"; - SABAYON: "Sabayon"; - SAILFISH: "Sailfish"; - SERENITYOS: "SerenityOS"; - SERIES40: "Series40"; - SLACKWARE: "Slackware"; - SOLARIS: "Solaris"; - SUSE: "SUSE"; - SYMBIAN: "Symbian"; - TIZEN: "Tizen"; - UBUNTU: "Ubuntu"; - UBUNTU_TOUCH: "Ubuntu Touch", - UNIX: "Unix"; - VECTORLINUX: "VectorLinux"; - WATCHOS: "watchOS"; - WEBOS: "WebOS"; - WINDOWS: "Windows"; - WINDOWS_CE: "Windows CE"; - WINDOWS_IOT: "Windows IoT"; - WINDOWS_MOBILE: "Windows Mobile"; - WINDOWS_PHONE: "Windows Phone"; - WINDOWS_RT: "Windows RT"; - XBOX: "Xbox"; - XUBUNTU: "Xubuntu"; - ZENWALK: "Zenwalk"; +/** + * @deprecated Use `EngineName` instead + */ +export const Engine: typeof EngineName; + +export const OSName: Readonly<{ + AIX: 'AIX', + AMIGA_OS: 'Amiga OS', + ANDROID: 'Android', + ANDROID_X86: 'Android-x86', + ARCAOS: 'ArcaOS', + ARCH: 'Arch', + BADA: 'Bada', + BEOS: 'BeOS', + BLACKBERRY: 'BlackBerry', + CENTOS: 'CentOS', + CHROME_OS: 'Chrome OS', + CHROMECAST: 'Chromecast', + CHROMECAST_ANDROID: 'Chromecast Android', + CHROMECAST_FUCHSIA: 'Chromecast Fuchsia', + CHROMECAST_LINUX: 'Chromecast Linux', + CHROMECAST_SMARTSPEAKER: 'Chromecast SmartSpeaker', + CONTIKI: 'Contiki', + DEBIAN: 'Debian', + DEEPIN: 'Deepin', + DRAGONFLY: 'DragonFly', + ELEMENTARY_OS: 'elementary OS', + FEDORA: 'Fedora', + FIREFOX_OS: 'Firefox OS', + FREEBSD: 'FreeBSD', + FUCHSIA: 'Fuchsia', + GENTOO: 'Gentoo', + GHOSTBSD: 'GhostBSD', + GNU: 'GNU', + HAIKU: 'Haiku', + HARMONYOS: 'HarmonyOS', + HP_UX: 'HP-UX', + HURD: 'Hurd', + IOS: 'iOS', + JOLI: 'Joli', + KAIOS: 'KaiOS', + KNOPPIX: 'Knoppix', + KUBUNTU: 'Kubuntu', + LINPUS: 'Linpus', + LINSPIRE: 'Linspire', + LINUX: 'Linux', + MACOS: 'macOS', + MAEMO: 'Maemo', + MAGEIA: 'Mageia', + MANDRIVA: 'Mandriva', + MANJARO: 'Manjaro', + MEEGO: 'MeeGo', + MINIX: 'Minix', + MINT: 'Mint', + MORPH_OS: 'Morph OS', + NETBSD: 'NetBSD', + NETRANGE: 'NetRange', + NETTV: 'NetTV', + NINTENDO: 'Nintendo', + OPENHARMONY: 'OpenHarmony', + OPENBSD: 'OpenBSD', + OPENVMS: 'OpenVMS', + OS2: 'OS/2', + PALM: 'Palm', + PC_BSD: 'PC-BSD', + PCLINUXOS: 'PCLinuxOS', + PICO: 'Pico', + PLAN9: 'Plan9', + PLAYSTATION: 'PlayStation', + QNX: 'QNX', + RASPBIAN: 'Raspbian', + REDHAT: 'RedHat', + RIM_TABLET_OS: 'RIM Tablet OS', + RISC_OS: 'RISC OS', + SABAYON: 'Sabayon', + SAILFISH: 'Sailfish', + SERENITYOS: 'SerenityOS', + SERIES40: 'Series40', + SLACKWARE: 'Slackware', + SOLARIS: 'Solaris', + SUSE: 'SUSE', + SYMBIAN: 'Symbian', + TIZEN: 'Tizen', + UBUNTU: 'Ubuntu', + UBUNTU_TOUCH: 'Ubuntu Touch', + UNIX: 'Unix', + VECTORLINUX: 'VectorLinux', + WATCHOS: 'watchOS', + WEBOS: 'WebOS', + WINDOWS: 'Windows', + WINDOWS_CE: 'Windows CE', + WINDOWS_IOT: 'Windows IoT', + WINDOWS_MOBILE: 'Windows Mobile', + WINDOWS_PHONE: 'Windows Phone', + WINDOWS_RT: 'Windows RT', + XBOX: 'Xbox', + XUBUNTU: 'Xubuntu', + ZENWALK: 'Zenwalk' + + // TODO : test! }>; +/** + * @deprecated Use `OSName` instead + */ +export const OS: typeof OSName; + +/*//////////////////////////////// + * Enums for Extensions submodule + */////////////////////////////// + +export const Extension: Readonly<{ + BrowserName: { + CLI: { + CURL: 'curl', + ELINKS: 'ELinks', + HTTPIE: 'HTTPie', + LYNX: 'Lynx', + WGET: 'Wget' + }, + Crawler: { + AHREFS_BOT: 'AhrefsBot', + AI2_BOT: 'AI2Bot', + AIHIT_BOT: 'aiHitBot', + ALGOLIA_CRAWLER: 'Algolia Crawler', + APPLE_BOT: 'Applebot', + APPLE_BOT_EXTENDED: 'Applebot-Extended', + ASK_TEOMA: 'Teoma', + AMAZON_BOT: 'Amazonbot', + AMAZON_CONTXBOT: 'contxbot', + ANTHROPIC_AI: 'anthropic-ai', + ANTHROPIC_CLAUDE_BOT: 'ClaudeBot', + ANTHROPIC_CLAUDE_SEARCHBOT: 'Claude-SearchBot', + ANTHROPIC_CLAUDE_WEB: 'Claude-Web', + ARCHIVEORG_BOT: 'archive.org_bot', + BAIDU_ADS: 'Baidu-ADS', + BAIDU_SPIDER: 'Baiduspider', + BAIDU_SPIDER_ADS: 'Baiduspider-ads', + BAIDU_SPIDER_CPRO: 'Baiduspider-cpro', + BAIDU_SPIDER_FAVO: 'Baiduspider-favo', + BAIDU_SPIDER_IMAGE: 'Baiduspider-image', + BAIDU_SPIDER_NEWS: 'Baiduspider-news', + BAIDU_SPIDER_RENDER: 'Baiduspider-render', + BAIDU_SPIDER_VIDEO: 'Baiduspider-video', + BLEX_BOT: 'BLEXBot', + BOTIFY: 'botify', + BRAVE_BOT: 'Bravebot', + BYTEDANCE_BYTESPIDER: 'Bytespider', + BYTEDANCE_TIKTOKSPIDER: 'TikTokSpider', + COMMON_CRAWL_CCBOT: 'CCBot', + COCCOC_BOT_WEB: 'coccocbot-web', + COCCOC_BOT_IMAGE: 'coccocbot-image', + COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler', + COTOYOGI: 'Cotoyogi', + COVEO_BOT: 'Coveobot', + CRITEO_BOT: 'CriteoBot', + DATAFORSEO_BOT: 'DataForSeoBot', + DAUM: 'Daum', + DAUM_DAUMOA: 'Daumoa', + DAUM_DAUMOA_IMAGE: 'Daumoa-image', + DEEPSEEK_BOT: 'DeepSeekBot', + DIFFBOT: 'Diffbot', + DUCKDUCKGO_BOT: 'DuckDuckBot', + DUCKDUCKGO_FAVICONS_BOT: 'DuckDuckGo-Favicons-Bot', + ELASTIC: 'Elastic', + EXALEAD_EXABOT: 'Exabot', + FIRECRAWL_AGENT: 'FirecrawlAgent', + FREESPOKE: 'Freespoke', + GOOGLE_ADSBOT: 'AdsBot-Google', + GOOGLE_ADSBOT_MOBILE: 'Adsbot-Google-Mobile', + GOOGLE_ADSENSE: 'AdSense', + GOOGLE_APIS: 'APIs-Google', + GOOGLE_BOT: 'Googlebot', + GOOGLE_BOT_IMAGE: 'Googlebot-Image', + GOOGLE_BOT_NEWS: 'Googlebot-News', + GOOGLE_BOT_VIDEO: 'Googlebot-Video', + GOOGLE_CLOUDVERTEXBOT: 'Google-CloudVertexBot', + GOOGLE_EXTENDED: 'Google-Extended', + GOOGLE_INSPECTIONTOOL: 'Google-InspectionTool', + GOOGLE_OTHER: 'GoogleOther', + GOOGLE_OTHER_IMAGE: 'GoogleOther-Image', + GOOGLE_OTHER_VIDEO: 'GoogleOther-Video', + GOOGLE_SAFETY: 'Google-Safety', + GOOGLE_STOREBOT: 'Storebot-Google', + HIVE_IMAGESIFTBOT: 'ImagesiftBot', + HUAWEI_PANGUBOT: 'PanguBot', + HUAWEI_PETALBOT: 'PetalBot', + HUGGINGFACE_BOT: 'HuggingFace-Bot', + HUNTER_VELENPUBLICWEBCRAWLER: 'VelenPublicWebCrawler', + IA_ARCHIVER: 'ia_archiver', + IASK_BOT: 'iAskBot', + KAGI_BOT: 'Kagibot', + KANGAROO_BOT: 'Kangaroo Bot', + LINE_SPIDER: 'Linespider', + LINKEDIN_BOT: 'LinkedInBot', + MAGPIE_CRAWLER: 'magpie-crawler', + MARGINALIA: 'marginalia', + META_EXTERNALAGENT: 'meta-externalagent', + META_FACEBOOKBOT: 'FacebookBot', + META_FACEBOOKCATALOG: 'facebookcatalog', + META_FACEBOOKEXTERNALHIT: 'facebookexternalhit', + MAJESTIC_MJ12BOT: 'MJ12bot', + MICROSOFT_BINGBOT: 'Bingbot', + MICROSOFT_MSNBOT: 'msnbot', + MICROSOFT_ADIDXBOT: 'adidxbot', + MOJEEK_BOT: 'MojeekBot', + MOZ_DOTBOT: 'DotBot', + ONCRAWL: 'OnCrawl', + ONESPOT_SCRAPERBOT: 'Onespot-ScraperBot', + OPENAI_GPTBOT: 'GPTBot', + OPENAI_SEARCH_BOT: 'OAI-SearchBot', + PERPLEXITY_BOT: 'PerplexityBot', + QIHOO_360_SPIDER: '360Spider', + QWANT_BOT: 'Qwantbot', + REPLICATE_BOT: 'Replicate-Bot', + RUNPOD_BOT: 'RunPod-Bot', + SB_INTUITIONS_BOT: 'SBIntuitionsBot', + SEEKPORT_BOT: 'SeekportBot', + SEMRUSH_BOT: 'SemrushBot', + SEMRUSH_BOT_BACKLINK: 'SemrushBot-BA', + SEMRUSH_BOT_CONTENTSHAKE: 'SemrushBot-OCOB', + SEMRUSH_BOT_SEO_CHECKER: 'SemrushBot-SI', + SEZNAM_BOT: 'SeznamBot', + SITEIMPROVE: 'Siteimprove', + SOGOU_PIC_SPIDER: 'Sogou Pic Spider', + SOGOU_WEB_SPIDER: 'Sogou web spider', + STARTPAGE: 'Startpage', + TIMPI_BOT: 'Timpibot', + TOGETHER_BOT: 'Together-Bot', + TURNITIN_BOT: 'TurnitinBot', + TWIN_AGENT: 'TwinAgent', + VERCEL_V0BOT: 'v0bot', + WEBZIO: 'webzio', + WEBZIO_EXTENDED: 'Webzio-Extended', + WEBZIO_OMGILI: 'omgili', + WEBZIO_OMGILI_BOT: 'omgilibot', + XAI_BOT: 'xAI-Bot', + YAHOO_JAPAN: 'Y!J-BRW', + YAHOO_SLURP: 'Yahoo! Slurp', + YANDEX_ACCESSIBILITY_BOT: 'YandexAccessibilityBot', + YANDEX_ADDITIONAL_BOT: 'YandexAdditionalBot', + YANDEX_ADNET: 'YandexAdNet', + YANDEX_BLOGS: 'YandexBlogs', + YANDEX_BOT: 'YandexBot', + YANDEX_BOT_MIRRORDETECTOR: 'YandexBot MirrorDetector', + YANDEX_COMBOT: 'YandexComBot', + YANDEX_FAVICONS: 'YandexFavicons', + YANDEX_IMAGE_RESIZER: 'YandexImageResizer', + YANDEX_IMAGES: 'YandexImages', + YANDEX_MARKET: 'YandexMarket', + YANDEX_MEDIA: 'YandexMedia', + YANDEX_METRIKA: 'YandexMetrika', + YANDEX_MOBILE_BOT: 'YandexMobileBot', + YANDEX_MOBILE_SCREENSHOT_BOT: 'YandexMobileScreenShotBot', + YANDEX_NEWS: 'YandexNews', + YANDEX_ONTODB: 'YandexOntoDB', + YANDEX_ONTODB_API: 'YandexOntoDBAPI', + YANDEX_PARTNER: 'YandexPartner', + YANDEX_RCA: 'YandexRCA', + YANDEX_RENDERRESOURCES_BOT: 'YandexRenderResourcesBot', + YANDEX_SCREENSHOT_BOT: 'YandexScreenshotBot', + YANDEX_SPRAV_BOT: 'YandexSpravBot', + YANDEX_TRACKER: 'YandexTracker', + YANDEX_VERTICALS: 'YandexVerticals', + YANDEX_VERTIS: 'YandexVertis', + YANDEX_VIDEO: 'YandexVideo', + YANDEX_VIDEO_PARSER: 'YandexVideoParser', + YANDEX_WEBMASTER: 'YandexWebmaster', + YEP_BOT: 'YepBot', + YETI: 'Yeti', + YISOU_SPIDER: 'YisouSpider', + YOU_BOT: 'YouBot', + ZHIPU_CHATGLM_SPIDER: 'ChatGLM-Spider', + ZUM_BOT: 'ZumBot' + }, + Email: { + AIRMAIL: 'Airmail', + APPLE_MAIL: 'Mail', + BLUEMAIL: 'BlueMail', + DAUM_MAIL: 'DaumMail', + EVOLUTION: 'Evolution', + EM_CLIENT: 'eM Client', + FOXMAIL: 'Foxmail', + KMAIL: 'KMail', + KMAIL2: 'kmail2', + KONTACT: 'Kontact', + MICROSOFT_OUTLOOK: 'Microsoft Outlook', + MICROSOFT_OUTLOOK_MAC: 'MacOutlook', + NAVER_MAILAPP: 'NaverMailApp', + POLYMAIL: 'Polymail', + PROTON_MAIL: 'ProtonMail', + SPARK_MAIL: 'SparkDesktop', + SPARROW: 'Sparrow', + THUNDERBIRD: 'Thunderbird', + YAHOO_MAIL: 'Yahoo', + ZIMBRA: 'Zimbra', + ZOHO_MAIL: 'ZohoMail-Desktop' + }, + Fetcher: { + AHREFS_SITEAUDIT: 'AhrefsSiteAudit', + ANTHROPIC_CLAUDE_USER: 'Claude-User', + ASANA: 'Asana', + BETTER_UPTIME_BOT: 'Better Uptime Bot', + BITLY_BOT: 'bitlybot', + BLUESKY: 'Bluesky', + BUFFER_LINKPREVIEWBOT: 'BufferLinkPreviewBot', + COHERE_AI: 'Cohere-AI', + DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot', + GOOGLE_CHROME_LIGHTHOUSE: 'Chrome-Lighthouse', + GOOGLE_FEEDFETCHER: 'FeedFetcher-Google', + GOOGLE_GEMINI_DEEP_RESEARCH: 'Gemini-Deep-Research', + GOOGLE_IMAGEPROXY: 'GoogleImageProxy', + GOOGLE_PAGERENDERER: 'Google-PageRenderer', + GOOGLE_READ_ALOUD: 'Google-Read-Aloud', + GOOGLE_PRODUCER: 'GoogleProducer', + GOOGLE_SITE_VERIFICATION: 'Google-Site-Verification', + HUBSPOT_PAGE_FETCHER: 'HubSpot Page Fetcher', + IFRAMELY: 'Iframely', + KAKAOTALK_SCRAP: 'kakaotalk-scrap', + META_EXTERNALFETCHER: 'meta-externalfetcher', + META_WHATSAPP: 'WhatsApp', + MICROSOFT_BINGPREVIEW: 'BingPreview', + MICROSOFT_PREVIEW: 'MicrosoftPreview', + MISTRALAI_USER: 'MistralAI-User', + NAVER_BLUENO: 'Blueno', + ONCRAWL_ROGERBOT: 'rogerbot', + OPENAI_CHATGPT_USER: 'ChatGPT-User', + PERPLEXITY_USER: 'Perplexity-User', + PINTEREST_BOT: 'Pinterestbot', + SEMRUSH_SITEAUDITBOT: 'SiteAuditBot', + SNAP_URL_PREVIEW: 'Snap URL Preview', + SKYPE_URIPREVIEW: 'SkypeUriPreview', + TELEGRAM_BOT: 'TelegramBot', + UPTIMEROBOT: 'UptimeRobot', + VERCEL_FAVICON_BOT: 'vercel-favicon-bot', + VERCEL_SCREENSHOT_BOT: 'vercel-screenshot-bot', + VERCEL_BOT: 'Vercelbot', + VERCEL_FLAGS: 'vercelflags', + VERCEL_TRACING: 'verceltracing', + YANDEX_CALENDAR: 'YandexCalendar', + YANDEX_DIRECT: 'YandexDirect', + YANDEX_DIRECTDYN: 'YandexDirectDyn', + YANDEX_DIRECTFETCHER: 'YaDirectFetcher', + YANDEX_FORDOMAIN: 'YandexForDomain', + YANDEX_PAGECHECKER: 'YandexPagechecker', + YANDEX_SEARCHSHOP: 'YandexSearchShop', + YANDEX_SITELINKS: 'YandexSitelinks', + YANDEX_USERPROXY: 'YandexUserproxy', + ZOOMINFO_BOT: 'Zoombot' + }, + InApp: { + DISCORD: 'Discord', + EVERNOTE: 'Evernote', + FIGMA: 'Figma', + FLIPBOARD: 'Flipboard', + MATTERMOST: 'Mattermost', + TEAMS: 'Teams', + NOTION: 'Notion', + POSTMAN: 'Postman', + RAMBOX: 'Rambox', + ROCKETCHAT: 'Rocket.Chat', + SLACK: 'Slack', + TIKTOK_LITE: 'TikTok Lite', + VSCODE: 'VS Code', + YAHOO_JAPAN: 'Yahoo! Japan' + }, + Library: { + ADOBE_AIR: 'AdobeAIR', + AIOHTTP: 'aiohttp', + APACHE_HTTPCLIENT: 'Apache-HttpClient', + AXIOS: 'axios', + GO_HTTP_CLIENT: 'go-http-client', + GOT: 'got', + GUZZLEHTTP: 'GuzzleHttp', + JAVA: 'Java', + JAVA_HTTPCLIENT: 'Java-http-client', + JSDOM: 'jsdom', + LIBWWW_PERL: 'libwww-perl', + LUA_RESTY_HTTP: 'lua-resty-http', + NEEDLE: 'Needle', + NUTCH: 'Nutch', + OKHTTP: 'OkHttp', + NODE_FETCH: 'node-fetch', + NODE_SUPERAGENT: 'node-superagent', + PHP_SOAP: 'PHP-SOAP', + POSTMAN_RUNTIME: 'PostmanRuntime', + PYTHON_HTTPX: 'python-httpx', + PYTHON_URLLIB: 'python-urllib', + PYTHON_URLLIB3: 'python-urllib3', + PYTHON_REQUESTS: 'python-requests', + SCRAPY: 'Scrapy' + } + }, + DeviceVendor: { + Vehicle: { + BMW: 'BMW', + BYD: 'BYD', + JEEP: 'Jeep', + RIVIAN: 'Rivian', + TESLA: 'Tesla', + VOLVO: 'Volvo' + } + } +}>; + diff --git a/src/enums/ua-parser-enums.js b/src/enums/ua-parser-enums.js index 13c623b..bcc7bfb 100644 --- a/src/enums/ua-parser-enums.js +++ b/src/enums/ua-parser-enums.js @@ -1,5 +1,5 @@ /////////////////////////////////////////////// -/* Enums for UAParser.js v2.0.4 +/* Enums for UAParser.js v2.0.5 https://github.com/faisalman/ua-parser-js Author: Faisal Salman UAParser.js PRO Personal License */ @@ -7,7 +7,7 @@ /*jshint esversion: 6 */ -const Browser = Object.freeze({ +const BrowserName = Object.freeze({ '115': '115', '2345': '2345', '360': '360', @@ -158,10 +158,15 @@ const Browser = Object.freeze({ WEIBO: 'Weibo', WHALE: 'Whale', WOLVIC: 'Wolvic', - YANDEX: 'Yandex' + YANDEX: 'Yandex', + ZALO: 'Zalo' // TODO : test! }); +/** + * @deprecated Use `BrowserName` instead + */ +const Browser = BrowserName; const BrowserType = Object.freeze({ CRAWLER: 'crawler', @@ -173,8 +178,9 @@ const BrowserType = Object.freeze({ LIBRARY: 'library' }); -const CPU = Object.freeze({ +const CPUArch = Object.freeze({ '68K': '68k', + ALPHA: 'alpha', ARM : 'arm', ARM_64: 'arm64', ARM_HF: 'armhf', @@ -192,8 +198,12 @@ const CPU = Object.freeze({ X86: 'ia32', X86_64: 'amd64' }); +/** + * @deprecated Use `CPUArch` instead + */ +const CPU = CPUArch; -const Device = Object.freeze({ +const DeviceType = Object.freeze({ CONSOLE: 'console', DESKTOP: 'desktop', EMBEDDED: 'embedded', @@ -203,8 +213,12 @@ const Device = Object.freeze({ WEARABLE: 'wearable', XR: 'xr' }); +/** + * @deprecated Use `DeviceType` instead + */ +const Device = DeviceType; -const Vendor = Object.freeze({ +const DeviceVendor = Object.freeze({ ACER: 'Acer', ADVAN: 'Advan', ALCATEL: 'Alcatel', @@ -252,6 +266,7 @@ const Vendor = Object.freeze({ PALM: 'Palm', PANASONIC: 'Panasonic', PEBBLE: 'Pebble', + PHILIPS: 'Philips', PICO: 'Pico', POLYTRON: 'Polytron', REALME: 'Realme', @@ -266,7 +281,7 @@ const Vendor = Object.freeze({ SPRINT: 'Sprint', TCL: 'TCL', TECHNISAT: 'TechniSAT', - TECNO: 'Tecno', + TECNO: 'TECNO', TESLA: 'Tesla', ULEFONE: 'Ulefone', VIVO: 'Vivo', @@ -279,8 +294,12 @@ const Vendor = Object.freeze({ // TODO : test! }); +/** + * @deprecated Use `DeviceVendor` instead + */ +const Vendor = DeviceVendor; -const Engine = Object.freeze({ +const EngineName = Object.freeze({ AMAYA: 'Amaya', ARKWEB: 'ArkWeb', BLINK: 'Blink', @@ -302,8 +321,12 @@ const Engine = Object.freeze({ W3M: 'w3m', WEBKIT: 'WebKit' }); +/** + * @deprecated Use `EngineName` instead + */ +const Engine = EngineName; -const OS = Object.freeze({ +const OSName = Object.freeze({ AIX: 'AIX', AMIGA_OS: 'Amiga OS', ANDROID: 'Android', @@ -399,13 +422,322 @@ const OS = Object.freeze({ // TODO : test! }); +/** + * @deprecated Use `OSName` instead + */ +const OS = OSName; + +/*//////////////////////////////// + * Enums for Extensions submodule + */////////////////////////////// + +const Extension = Object.freeze({ + BrowserName: { + CLI: { + CURL: 'curl', + ELINKS: 'ELinks', + HTTPIE: 'HTTPie', + LYNX: 'Lynx', + WGET: 'Wget' + }, + Crawler: { + AHREFS_BOT: 'AhrefsBot', + AI2_BOT: 'AI2Bot', + AIHIT_BOT: 'aiHitBot', + ALGOLIA_CRAWLER: 'Algolia Crawler', + APPLE_BOT: 'Applebot', + APPLE_BOT_EXTENDED: 'Applebot-Extended', + ASK_TEOMA: 'Teoma', + AMAZON_BOT: 'Amazonbot', + AMAZON_CONTXBOT: 'contxbot', + ANTHROPIC_AI: 'anthropic-ai', + ANTHROPIC_CLAUDE_BOT: 'ClaudeBot', + ANTHROPIC_CLAUDE_SEARCHBOT: 'Claude-SearchBot', + ANTHROPIC_CLAUDE_WEB: 'Claude-Web', + ARCHIVEORG_BOT: 'archive.org_bot', + BAIDU_ADS: 'Baidu-ADS', + BAIDU_SPIDER: 'Baiduspider', + BAIDU_SPIDER_ADS: 'Baiduspider-ads', + BAIDU_SPIDER_CPRO: 'Baiduspider-cpro', + BAIDU_SPIDER_FAVO: 'Baiduspider-favo', + BAIDU_SPIDER_IMAGE: 'Baiduspider-image', + BAIDU_SPIDER_NEWS: 'Baiduspider-news', + BAIDU_SPIDER_RENDER: 'Baiduspider-render', + BAIDU_SPIDER_VIDEO: 'Baiduspider-video', + BLEX_BOT: 'BLEXBot', + BOTIFY: 'botify', + BRAVE_BOT: 'Bravebot', + BYTEDANCE_BYTESPIDER: 'Bytespider', + BYTEDANCE_TIKTOKSPIDER: 'TikTokSpider', + COMMON_CRAWL_CCBOT: 'CCBot', + COCCOC_BOT_WEB: 'coccocbot-web', + COCCOC_BOT_IMAGE: 'coccocbot-image', + COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler', + COTOYOGI: 'Cotoyogi', + COVEO_BOT: 'Coveobot', + CRITEO_BOT: 'CriteoBot', + DATAFORSEO_BOT: 'DataForSeoBot', + DAUM: 'Daum', + DAUM_DAUMOA: 'Daumoa', + DAUM_DAUMOA_IMAGE: 'Daumoa-image', + DEEPSEEK_BOT: 'DeepSeekBot', + DIFFBOT: 'Diffbot', + DUCKDUCKGO_BOT: 'DuckDuckBot', + DUCKDUCKGO_FAVICONS_BOT: 'DuckDuckGo-Favicons-Bot', + ELASTIC: 'Elastic', + EXALEAD_EXABOT: 'Exabot', + FIRECRAWL_AGENT: 'FirecrawlAgent', + FREESPOKE: 'Freespoke', + GOOGLE_ADSBOT: 'AdsBot-Google', + GOOGLE_ADSBOT_MOBILE: 'Adsbot-Google-Mobile', + GOOGLE_ADSENSE: 'AdSense', + GOOGLE_APIS: 'APIs-Google', + GOOGLE_BOT: 'Googlebot', + GOOGLE_BOT_IMAGE: 'Googlebot-Image', + GOOGLE_BOT_NEWS: 'Googlebot-News', + GOOGLE_BOT_VIDEO: 'Googlebot-Video', + GOOGLE_CLOUDVERTEXBOT: 'Google-CloudVertexBot', + GOOGLE_EXTENDED: 'Google-Extended', + GOOGLE_INSPECTIONTOOL: 'Google-InspectionTool', + GOOGLE_OTHER: 'GoogleOther', + GOOGLE_OTHER_IMAGE: 'GoogleOther-Image', + GOOGLE_OTHER_VIDEO: 'GoogleOther-Video', + GOOGLE_SAFETY: 'Google-Safety', + GOOGLE_STOREBOT: 'Storebot-Google', + HIVE_IMAGESIFTBOT: 'ImagesiftBot', + HUAWEI_PANGUBOT: 'PanguBot', + HUAWEI_PETALBOT: 'PetalBot', + HUGGINGFACE_BOT: 'HuggingFace-Bot', + HUNTER_VELENPUBLICWEBCRAWLER: 'VelenPublicWebCrawler', + IA_ARCHIVER: 'ia_archiver', + IASK_BOT: 'iAskBot', + KAGI_BOT: 'Kagibot', + KANGAROO_BOT: 'Kangaroo Bot', + LINE_SPIDER: 'Linespider', + LINKEDIN_BOT: 'LinkedInBot', + MAGPIE_CRAWLER: 'magpie-crawler', + MARGINALIA: 'marginalia', + META_EXTERNALAGENT: 'meta-externalagent', + META_FACEBOOKBOT: 'FacebookBot', + META_FACEBOOKCATALOG: 'facebookcatalog', + META_FACEBOOKEXTERNALHIT: 'facebookexternalhit', + MAJESTIC_MJ12BOT: 'MJ12bot', + MICROSOFT_BINGBOT: 'Bingbot', + MICROSOFT_MSNBOT: 'msnbot', + MICROSOFT_ADIDXBOT: 'adidxbot', + MOJEEK_BOT: 'MojeekBot', + MOZ_DOTBOT: 'DotBot', + ONCRAWL: 'OnCrawl', + ONESPOT_SCRAPERBOT: 'Onespot-ScraperBot', + OPENAI_GPTBOT: 'GPTBot', + OPENAI_SEARCH_BOT: 'OAI-SearchBot', + PERPLEXITY_BOT: 'PerplexityBot', + QIHOO_360_SPIDER: '360Spider', + QWANT_BOT: 'Qwantbot', + REPLICATE_BOT: 'Replicate-Bot', + RUNPOD_BOT: 'RunPod-Bot', + SB_INTUITIONS_BOT: 'SBIntuitionsBot', + SEEKPORT_BOT: 'SeekportBot', + SEMRUSH_BOT: 'SemrushBot', + SEMRUSH_BOT_BACKLINK: 'SemrushBot-BA', + SEMRUSH_BOT_CONTENTSHAKE: 'SemrushBot-OCOB', + SEMRUSH_BOT_SEO_CHECKER: 'SemrushBot-SI', + SEZNAM_BOT: 'SeznamBot', + SITEIMPROVE: 'Siteimprove', + SOGOU_PIC_SPIDER: 'Sogou Pic Spider', + SOGOU_WEB_SPIDER: 'Sogou web spider', + STARTPAGE: 'Startpage', + TIMPI_BOT: 'Timpibot', + TOGETHER_BOT: 'Together-Bot', + TURNITIN_BOT: 'TurnitinBot', + TWIN_AGENT: 'TwinAgent', + VERCEL_V0BOT: 'v0bot', + WEBZIO: 'webzio', + WEBZIO_EXTENDED: 'Webzio-Extended', + WEBZIO_OMGILI: 'omgili', + WEBZIO_OMGILI_BOT: 'omgilibot', + XAI_BOT: 'xAI-Bot', + YAHOO_JAPAN: 'Y!J-BRW', + YAHOO_SLURP: 'Yahoo! Slurp', + YANDEX_ACCESSIBILITY_BOT: 'YandexAccessibilityBot', + YANDEX_ADDITIONAL_BOT: 'YandexAdditionalBot', + YANDEX_ADNET: 'YandexAdNet', + YANDEX_BLOGS: 'YandexBlogs', + YANDEX_BOT: 'YandexBot', + YANDEX_BOT_MIRRORDETECTOR: 'YandexBot MirrorDetector', + YANDEX_COMBOT: 'YandexComBot', + YANDEX_FAVICONS: 'YandexFavicons', + YANDEX_IMAGE_RESIZER: 'YandexImageResizer', + YANDEX_IMAGES: 'YandexImages', + YANDEX_MARKET: 'YandexMarket', + YANDEX_MEDIA: 'YandexMedia', + YANDEX_METRIKA: 'YandexMetrika', + YANDEX_MOBILE_BOT: 'YandexMobileBot', + YANDEX_MOBILE_SCREENSHOT_BOT: 'YandexMobileScreenShotBot', + YANDEX_NEWS: 'YandexNews', + YANDEX_ONTODB: 'YandexOntoDB', + YANDEX_ONTODB_API: 'YandexOntoDBAPI', + YANDEX_PARTNER: 'YandexPartner', + YANDEX_RCA: 'YandexRCA', + YANDEX_RENDERRESOURCES_BOT: 'YandexRenderResourcesBot', + YANDEX_SCREENSHOT_BOT: 'YandexScreenshotBot', + YANDEX_SPRAV_BOT: 'YandexSpravBot', + YANDEX_TRACKER: 'YandexTracker', + YANDEX_VERTICALS: 'YandexVerticals', + YANDEX_VERTIS: 'YandexVertis', + YANDEX_VIDEO: 'YandexVideo', + YANDEX_VIDEO_PARSER: 'YandexVideoParser', + YANDEX_WEBMASTER: 'YandexWebmaster', + YEP_BOT: 'YepBot', + YETI: 'Yeti', + YISOU_SPIDER: 'YisouSpider', + YOU_BOT: 'YouBot', + ZHIPU_CHATGLM_SPIDER: 'ChatGLM-Spider', + ZUM_BOT: 'ZumBot' + }, + Email: { + AIRMAIL: 'Airmail', + APPLE_MAIL: 'Mail', + BLUEMAIL: 'BlueMail', + DAUM_MAIL: 'DaumMail', + EVOLUTION: 'Evolution', + EM_CLIENT: 'eM Client', + FOXMAIL: 'Foxmail', + KMAIL: 'KMail', + KMAIL2: 'kmail2', + KONTACT: 'Kontact', + MICROSOFT_OUTLOOK: 'Microsoft Outlook', + MICROSOFT_OUTLOOK_MAC: 'MacOutlook', + NAVER_MAILAPP: 'NaverMailApp', + POLYMAIL: 'Polymail', + PROTON_MAIL: 'ProtonMail', + SPARK_MAIL: 'SparkDesktop', + SPARROW: 'Sparrow', + THUNDERBIRD: 'Thunderbird', + YAHOO_MAIL: 'Yahoo', + ZIMBRA: 'Zimbra', + ZOHO_MAIL: 'ZohoMail-Desktop' + }, + Fetcher: { + AHREFS_SITEAUDIT: 'AhrefsSiteAudit', + ANTHROPIC_CLAUDE_USER: 'Claude-User', + ASANA: 'Asana', + BETTER_UPTIME_BOT: 'Better Uptime Bot', + BITLY_BOT: 'bitlybot', + BLUESKY: 'Bluesky', + BUFFER_LINKPREVIEWBOT: 'BufferLinkPreviewBot', + COHERE_AI: 'Cohere-AI', + DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot', + GOOGLE_CHROME_LIGHTHOUSE: 'Chrome-Lighthouse', + GOOGLE_FEEDFETCHER: 'FeedFetcher-Google', + GOOGLE_GEMINI_DEEP_RESEARCH: 'Gemini-Deep-Research', + GOOGLE_IMAGEPROXY: 'GoogleImageProxy', + GOOGLE_PAGERENDERER: 'Google-PageRenderer', + GOOGLE_READ_ALOUD: 'Google-Read-Aloud', + GOOGLE_PRODUCER: 'GoogleProducer', + GOOGLE_SITE_VERIFICATION: 'Google-Site-Verification', + HUBSPOT_PAGE_FETCHER: 'HubSpot Page Fetcher', + IFRAMELY: 'Iframely', + KAKAOTALK_SCRAP: 'kakaotalk-scrap', + META_EXTERNALFETCHER: 'meta-externalfetcher', + META_WHATSAPP: 'WhatsApp', + MICROSOFT_BINGPREVIEW: 'BingPreview', + MICROSOFT_PREVIEW: 'MicrosoftPreview', + MISTRALAI_USER: 'MistralAI-User', + NAVER_BLUENO: 'Blueno', + ONCRAWL_ROGERBOT: 'rogerbot', + OPENAI_CHATGPT_USER: 'ChatGPT-User', + PERPLEXITY_USER: 'Perplexity-User', + PINTEREST_BOT: 'Pinterestbot', + SEMRUSH_SITEAUDITBOT: 'SiteAuditBot', + SNAP_URL_PREVIEW: 'Snap URL Preview', + SKYPE_URIPREVIEW: 'SkypeUriPreview', + TELEGRAM_BOT: 'TelegramBot', + UPTIMEROBOT: 'UptimeRobot', + VERCEL_FAVICON_BOT: 'vercel-favicon-bot', + VERCEL_SCREENSHOT_BOT: 'vercel-screenshot-bot', + VERCEL_BOT: 'Vercelbot', + VERCEL_FLAGS: 'vercelflags', + VERCEL_TRACING: 'verceltracing', + YANDEX_CALENDAR: 'YandexCalendar', + YANDEX_DIRECT: 'YandexDirect', + YANDEX_DIRECTDYN: 'YandexDirectDyn', + YANDEX_DIRECTFETCHER: 'YaDirectFetcher', + YANDEX_FORDOMAIN: 'YandexForDomain', + YANDEX_PAGECHECKER: 'YandexPagechecker', + YANDEX_SEARCHSHOP: 'YandexSearchShop', + YANDEX_SITELINKS: 'YandexSitelinks', + YANDEX_USERPROXY: 'YandexUserproxy', + ZOOMINFO_BOT: 'Zoombot' + }, + InApp: { + DISCORD: 'Discord', + EVERNOTE: 'Evernote', + FIGMA: 'Figma', + FLIPBOARD: 'Flipboard', + MATTERMOST: 'Mattermost', + TEAMS: 'Teams', + NOTION: 'Notion', + POSTMAN: 'Postman', + RAMBOX: 'Rambox', + ROCKETCHAT: 'Rocket.Chat', + SLACK: 'Slack', + TIKTOK_LITE: 'TikTok Lite', + VSCODE: 'VS Code', + YAHOO_JAPAN: 'Yahoo! Japan' + }, + Library: { + ADOBE_AIR: 'AdobeAIR', + AIOHTTP: 'aiohttp', + APACHE_HTTPCLIENT: 'Apache-HttpClient', + AXIOS: 'axios', + GO_HTTP_CLIENT: 'go-http-client', + GOT: 'got', + GUZZLEHTTP: 'GuzzleHttp', + JAVA: 'Java', + JAVA_HTTPCLIENT: 'Java-http-client', + JSDOM: 'jsdom', + LIBWWW_PERL: 'libwww-perl', + LUA_RESTY_HTTP: 'lua-resty-http', + NEEDLE: 'Needle', + NUTCH: 'Nutch', + OKHTTP: 'OkHttp', + NODE_FETCH: 'node-fetch', + NODE_SUPERAGENT: 'node-superagent', + PHP_SOAP: 'PHP-SOAP', + POSTMAN_RUNTIME: 'PostmanRuntime', + PYTHON_HTTPX: 'python-httpx', + PYTHON_URLLIB: 'python-urllib', + PYTHON_URLLIB3: 'python-urllib3', + PYTHON_REQUESTS: 'python-requests', + SCRAPY: 'Scrapy' + } + }, + DeviceVendor: { + Vehicle: { + BMW: 'BMW', + BYD: 'BYD', + JEEP: 'Jeep', + RIVIAN: 'Rivian', + TESLA: 'Tesla', + VOLVO: 'Volvo' + } + } +}); module.exports = { - Browser, + Browser,// deprecated + CPU, // deprecated + Device, // deprecated + Vendor, // deprecated + Engine, // deprecated + OS, // deprecated + BrowserName, BrowserType, - CPU, - Device, - Vendor, - Engine, - OS + CPUArch, + DeviceType, + DeviceVendor, + EngineName, + OSName, + Extension }; \ No newline at end of file diff --git a/src/enums/ua-parser-enums.mjs b/src/enums/ua-parser-enums.mjs index a8bdba9..d06757e 100644 --- a/src/enums/ua-parser-enums.mjs +++ b/src/enums/ua-parser-enums.mjs @@ -3,7 +3,7 @@ // Source: /src/enums/ua-parser-enums.js /////////////////////////////////////////////// -/* Enums for UAParser.js v2.0.4 +/* Enums for UAParser.js v2.0.5 https://github.com/faisalman/ua-parser-js Author: Faisal Salman UAParser.js PRO Personal License */ @@ -11,7 +11,7 @@ /*jshint esversion: 6 */ -const Browser = Object.freeze({ +const BrowserName = Object.freeze({ '115': '115', '2345': '2345', '360': '360', @@ -162,10 +162,15 @@ const Browser = Object.freeze({ WEIBO: 'Weibo', WHALE: 'Whale', WOLVIC: 'Wolvic', - YANDEX: 'Yandex' + YANDEX: 'Yandex', + ZALO: 'Zalo' // TODO : test! }); +/** + * @deprecated Use `BrowserName` instead + */ +const Browser = BrowserName; const BrowserType = Object.freeze({ CRAWLER: 'crawler', @@ -177,8 +182,9 @@ const BrowserType = Object.freeze({ LIBRARY: 'library' }); -const CPU = Object.freeze({ +const CPUArch = Object.freeze({ '68K': '68k', + ALPHA: 'alpha', ARM : 'arm', ARM_64: 'arm64', ARM_HF: 'armhf', @@ -196,8 +202,12 @@ const CPU = Object.freeze({ X86: 'ia32', X86_64: 'amd64' }); +/** + * @deprecated Use `CPUArch` instead + */ +const CPU = CPUArch; -const Device = Object.freeze({ +const DeviceType = Object.freeze({ CONSOLE: 'console', DESKTOP: 'desktop', EMBEDDED: 'embedded', @@ -207,8 +217,12 @@ const Device = Object.freeze({ WEARABLE: 'wearable', XR: 'xr' }); +/** + * @deprecated Use `DeviceType` instead + */ +const Device = DeviceType; -const Vendor = Object.freeze({ +const DeviceVendor = Object.freeze({ ACER: 'Acer', ADVAN: 'Advan', ALCATEL: 'Alcatel', @@ -256,6 +270,7 @@ const Vendor = Object.freeze({ PALM: 'Palm', PANASONIC: 'Panasonic', PEBBLE: 'Pebble', + PHILIPS: 'Philips', PICO: 'Pico', POLYTRON: 'Polytron', REALME: 'Realme', @@ -270,7 +285,7 @@ const Vendor = Object.freeze({ SPRINT: 'Sprint', TCL: 'TCL', TECHNISAT: 'TechniSAT', - TECNO: 'Tecno', + TECNO: 'TECNO', TESLA: 'Tesla', ULEFONE: 'Ulefone', VIVO: 'Vivo', @@ -283,8 +298,12 @@ const Vendor = Object.freeze({ // TODO : test! }); +/** + * @deprecated Use `DeviceVendor` instead + */ +const Vendor = DeviceVendor; -const Engine = Object.freeze({ +const EngineName = Object.freeze({ AMAYA: 'Amaya', ARKWEB: 'ArkWeb', BLINK: 'Blink', @@ -306,8 +325,12 @@ const Engine = Object.freeze({ W3M: 'w3m', WEBKIT: 'WebKit' }); +/** + * @deprecated Use `EngineName` instead + */ +const Engine = EngineName; -const OS = Object.freeze({ +const OSName = Object.freeze({ AIX: 'AIX', AMIGA_OS: 'Amiga OS', ANDROID: 'Android', @@ -403,13 +426,322 @@ const OS = Object.freeze({ // TODO : test! }); +/** + * @deprecated Use `OSName` instead + */ +const OS = OSName; + +/*//////////////////////////////// + * Enums for Extensions submodule + */////////////////////////////// + +const Extension = Object.freeze({ + BrowserName: { + CLI: { + CURL: 'curl', + ELINKS: 'ELinks', + HTTPIE: 'HTTPie', + LYNX: 'Lynx', + WGET: 'Wget' + }, + Crawler: { + AHREFS_BOT: 'AhrefsBot', + AI2_BOT: 'AI2Bot', + AIHIT_BOT: 'aiHitBot', + ALGOLIA_CRAWLER: 'Algolia Crawler', + APPLE_BOT: 'Applebot', + APPLE_BOT_EXTENDED: 'Applebot-Extended', + ASK_TEOMA: 'Teoma', + AMAZON_BOT: 'Amazonbot', + AMAZON_CONTXBOT: 'contxbot', + ANTHROPIC_AI: 'anthropic-ai', + ANTHROPIC_CLAUDE_BOT: 'ClaudeBot', + ANTHROPIC_CLAUDE_SEARCHBOT: 'Claude-SearchBot', + ANTHROPIC_CLAUDE_WEB: 'Claude-Web', + ARCHIVEORG_BOT: 'archive.org_bot', + BAIDU_ADS: 'Baidu-ADS', + BAIDU_SPIDER: 'Baiduspider', + BAIDU_SPIDER_ADS: 'Baiduspider-ads', + BAIDU_SPIDER_CPRO: 'Baiduspider-cpro', + BAIDU_SPIDER_FAVO: 'Baiduspider-favo', + BAIDU_SPIDER_IMAGE: 'Baiduspider-image', + BAIDU_SPIDER_NEWS: 'Baiduspider-news', + BAIDU_SPIDER_RENDER: 'Baiduspider-render', + BAIDU_SPIDER_VIDEO: 'Baiduspider-video', + BLEX_BOT: 'BLEXBot', + BOTIFY: 'botify', + BRAVE_BOT: 'Bravebot', + BYTEDANCE_BYTESPIDER: 'Bytespider', + BYTEDANCE_TIKTOKSPIDER: 'TikTokSpider', + COMMON_CRAWL_CCBOT: 'CCBot', + COCCOC_BOT_WEB: 'coccocbot-web', + COCCOC_BOT_IMAGE: 'coccocbot-image', + COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler', + COTOYOGI: 'Cotoyogi', + COVEO_BOT: 'Coveobot', + CRITEO_BOT: 'CriteoBot', + DATAFORSEO_BOT: 'DataForSeoBot', + DAUM: 'Daum', + DAUM_DAUMOA: 'Daumoa', + DAUM_DAUMOA_IMAGE: 'Daumoa-image', + DEEPSEEK_BOT: 'DeepSeekBot', + DIFFBOT: 'Diffbot', + DUCKDUCKGO_BOT: 'DuckDuckBot', + DUCKDUCKGO_FAVICONS_BOT: 'DuckDuckGo-Favicons-Bot', + ELASTIC: 'Elastic', + EXALEAD_EXABOT: 'Exabot', + FIRECRAWL_AGENT: 'FirecrawlAgent', + FREESPOKE: 'Freespoke', + GOOGLE_ADSBOT: 'AdsBot-Google', + GOOGLE_ADSBOT_MOBILE: 'Adsbot-Google-Mobile', + GOOGLE_ADSENSE: 'AdSense', + GOOGLE_APIS: 'APIs-Google', + GOOGLE_BOT: 'Googlebot', + GOOGLE_BOT_IMAGE: 'Googlebot-Image', + GOOGLE_BOT_NEWS: 'Googlebot-News', + GOOGLE_BOT_VIDEO: 'Googlebot-Video', + GOOGLE_CLOUDVERTEXBOT: 'Google-CloudVertexBot', + GOOGLE_EXTENDED: 'Google-Extended', + GOOGLE_INSPECTIONTOOL: 'Google-InspectionTool', + GOOGLE_OTHER: 'GoogleOther', + GOOGLE_OTHER_IMAGE: 'GoogleOther-Image', + GOOGLE_OTHER_VIDEO: 'GoogleOther-Video', + GOOGLE_SAFETY: 'Google-Safety', + GOOGLE_STOREBOT: 'Storebot-Google', + HIVE_IMAGESIFTBOT: 'ImagesiftBot', + HUAWEI_PANGUBOT: 'PanguBot', + HUAWEI_PETALBOT: 'PetalBot', + HUGGINGFACE_BOT: 'HuggingFace-Bot', + HUNTER_VELENPUBLICWEBCRAWLER: 'VelenPublicWebCrawler', + IA_ARCHIVER: 'ia_archiver', + IASK_BOT: 'iAskBot', + KAGI_BOT: 'Kagibot', + KANGAROO_BOT: 'Kangaroo Bot', + LINE_SPIDER: 'Linespider', + LINKEDIN_BOT: 'LinkedInBot', + MAGPIE_CRAWLER: 'magpie-crawler', + MARGINALIA: 'marginalia', + META_EXTERNALAGENT: 'meta-externalagent', + META_FACEBOOKBOT: 'FacebookBot', + META_FACEBOOKCATALOG: 'facebookcatalog', + META_FACEBOOKEXTERNALHIT: 'facebookexternalhit', + MAJESTIC_MJ12BOT: 'MJ12bot', + MICROSOFT_BINGBOT: 'Bingbot', + MICROSOFT_MSNBOT: 'msnbot', + MICROSOFT_ADIDXBOT: 'adidxbot', + MOJEEK_BOT: 'MojeekBot', + MOZ_DOTBOT: 'DotBot', + ONCRAWL: 'OnCrawl', + ONESPOT_SCRAPERBOT: 'Onespot-ScraperBot', + OPENAI_GPTBOT: 'GPTBot', + OPENAI_SEARCH_BOT: 'OAI-SearchBot', + PERPLEXITY_BOT: 'PerplexityBot', + QIHOO_360_SPIDER: '360Spider', + QWANT_BOT: 'Qwantbot', + REPLICATE_BOT: 'Replicate-Bot', + RUNPOD_BOT: 'RunPod-Bot', + SB_INTUITIONS_BOT: 'SBIntuitionsBot', + SEEKPORT_BOT: 'SeekportBot', + SEMRUSH_BOT: 'SemrushBot', + SEMRUSH_BOT_BACKLINK: 'SemrushBot-BA', + SEMRUSH_BOT_CONTENTSHAKE: 'SemrushBot-OCOB', + SEMRUSH_BOT_SEO_CHECKER: 'SemrushBot-SI', + SEZNAM_BOT: 'SeznamBot', + SITEIMPROVE: 'Siteimprove', + SOGOU_PIC_SPIDER: 'Sogou Pic Spider', + SOGOU_WEB_SPIDER: 'Sogou web spider', + STARTPAGE: 'Startpage', + TIMPI_BOT: 'Timpibot', + TOGETHER_BOT: 'Together-Bot', + TURNITIN_BOT: 'TurnitinBot', + TWIN_AGENT: 'TwinAgent', + VERCEL_V0BOT: 'v0bot', + WEBZIO: 'webzio', + WEBZIO_EXTENDED: 'Webzio-Extended', + WEBZIO_OMGILI: 'omgili', + WEBZIO_OMGILI_BOT: 'omgilibot', + XAI_BOT: 'xAI-Bot', + YAHOO_JAPAN: 'Y!J-BRW', + YAHOO_SLURP: 'Yahoo! Slurp', + YANDEX_ACCESSIBILITY_BOT: 'YandexAccessibilityBot', + YANDEX_ADDITIONAL_BOT: 'YandexAdditionalBot', + YANDEX_ADNET: 'YandexAdNet', + YANDEX_BLOGS: 'YandexBlogs', + YANDEX_BOT: 'YandexBot', + YANDEX_BOT_MIRRORDETECTOR: 'YandexBot MirrorDetector', + YANDEX_COMBOT: 'YandexComBot', + YANDEX_FAVICONS: 'YandexFavicons', + YANDEX_IMAGE_RESIZER: 'YandexImageResizer', + YANDEX_IMAGES: 'YandexImages', + YANDEX_MARKET: 'YandexMarket', + YANDEX_MEDIA: 'YandexMedia', + YANDEX_METRIKA: 'YandexMetrika', + YANDEX_MOBILE_BOT: 'YandexMobileBot', + YANDEX_MOBILE_SCREENSHOT_BOT: 'YandexMobileScreenShotBot', + YANDEX_NEWS: 'YandexNews', + YANDEX_ONTODB: 'YandexOntoDB', + YANDEX_ONTODB_API: 'YandexOntoDBAPI', + YANDEX_PARTNER: 'YandexPartner', + YANDEX_RCA: 'YandexRCA', + YANDEX_RENDERRESOURCES_BOT: 'YandexRenderResourcesBot', + YANDEX_SCREENSHOT_BOT: 'YandexScreenshotBot', + YANDEX_SPRAV_BOT: 'YandexSpravBot', + YANDEX_TRACKER: 'YandexTracker', + YANDEX_VERTICALS: 'YandexVerticals', + YANDEX_VERTIS: 'YandexVertis', + YANDEX_VIDEO: 'YandexVideo', + YANDEX_VIDEO_PARSER: 'YandexVideoParser', + YANDEX_WEBMASTER: 'YandexWebmaster', + YEP_BOT: 'YepBot', + YETI: 'Yeti', + YISOU_SPIDER: 'YisouSpider', + YOU_BOT: 'YouBot', + ZHIPU_CHATGLM_SPIDER: 'ChatGLM-Spider', + ZUM_BOT: 'ZumBot' + }, + Email: { + AIRMAIL: 'Airmail', + APPLE_MAIL: 'Mail', + BLUEMAIL: 'BlueMail', + DAUM_MAIL: 'DaumMail', + EVOLUTION: 'Evolution', + EM_CLIENT: 'eM Client', + FOXMAIL: 'Foxmail', + KMAIL: 'KMail', + KMAIL2: 'kmail2', + KONTACT: 'Kontact', + MICROSOFT_OUTLOOK: 'Microsoft Outlook', + MICROSOFT_OUTLOOK_MAC: 'MacOutlook', + NAVER_MAILAPP: 'NaverMailApp', + POLYMAIL: 'Polymail', + PROTON_MAIL: 'ProtonMail', + SPARK_MAIL: 'SparkDesktop', + SPARROW: 'Sparrow', + THUNDERBIRD: 'Thunderbird', + YAHOO_MAIL: 'Yahoo', + ZIMBRA: 'Zimbra', + ZOHO_MAIL: 'ZohoMail-Desktop' + }, + Fetcher: { + AHREFS_SITEAUDIT: 'AhrefsSiteAudit', + ANTHROPIC_CLAUDE_USER: 'Claude-User', + ASANA: 'Asana', + BETTER_UPTIME_BOT: 'Better Uptime Bot', + BITLY_BOT: 'bitlybot', + BLUESKY: 'Bluesky', + BUFFER_LINKPREVIEWBOT: 'BufferLinkPreviewBot', + COHERE_AI: 'Cohere-AI', + DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot', + GOOGLE_CHROME_LIGHTHOUSE: 'Chrome-Lighthouse', + GOOGLE_FEEDFETCHER: 'FeedFetcher-Google', + GOOGLE_GEMINI_DEEP_RESEARCH: 'Gemini-Deep-Research', + GOOGLE_IMAGEPROXY: 'GoogleImageProxy', + GOOGLE_PAGERENDERER: 'Google-PageRenderer', + GOOGLE_READ_ALOUD: 'Google-Read-Aloud', + GOOGLE_PRODUCER: 'GoogleProducer', + GOOGLE_SITE_VERIFICATION: 'Google-Site-Verification', + HUBSPOT_PAGE_FETCHER: 'HubSpot Page Fetcher', + IFRAMELY: 'Iframely', + KAKAOTALK_SCRAP: 'kakaotalk-scrap', + META_EXTERNALFETCHER: 'meta-externalfetcher', + META_WHATSAPP: 'WhatsApp', + MICROSOFT_BINGPREVIEW: 'BingPreview', + MICROSOFT_PREVIEW: 'MicrosoftPreview', + MISTRALAI_USER: 'MistralAI-User', + NAVER_BLUENO: 'Blueno', + ONCRAWL_ROGERBOT: 'rogerbot', + OPENAI_CHATGPT_USER: 'ChatGPT-User', + PERPLEXITY_USER: 'Perplexity-User', + PINTEREST_BOT: 'Pinterestbot', + SEMRUSH_SITEAUDITBOT: 'SiteAuditBot', + SNAP_URL_PREVIEW: 'Snap URL Preview', + SKYPE_URIPREVIEW: 'SkypeUriPreview', + TELEGRAM_BOT: 'TelegramBot', + UPTIMEROBOT: 'UptimeRobot', + VERCEL_FAVICON_BOT: 'vercel-favicon-bot', + VERCEL_SCREENSHOT_BOT: 'vercel-screenshot-bot', + VERCEL_BOT: 'Vercelbot', + VERCEL_FLAGS: 'vercelflags', + VERCEL_TRACING: 'verceltracing', + YANDEX_CALENDAR: 'YandexCalendar', + YANDEX_DIRECT: 'YandexDirect', + YANDEX_DIRECTDYN: 'YandexDirectDyn', + YANDEX_DIRECTFETCHER: 'YaDirectFetcher', + YANDEX_FORDOMAIN: 'YandexForDomain', + YANDEX_PAGECHECKER: 'YandexPagechecker', + YANDEX_SEARCHSHOP: 'YandexSearchShop', + YANDEX_SITELINKS: 'YandexSitelinks', + YANDEX_USERPROXY: 'YandexUserproxy', + ZOOMINFO_BOT: 'Zoombot' + }, + InApp: { + DISCORD: 'Discord', + EVERNOTE: 'Evernote', + FIGMA: 'Figma', + FLIPBOARD: 'Flipboard', + MATTERMOST: 'Mattermost', + TEAMS: 'Teams', + NOTION: 'Notion', + POSTMAN: 'Postman', + RAMBOX: 'Rambox', + ROCKETCHAT: 'Rocket.Chat', + SLACK: 'Slack', + TIKTOK_LITE: 'TikTok Lite', + VSCODE: 'VS Code', + YAHOO_JAPAN: 'Yahoo! Japan' + }, + Library: { + ADOBE_AIR: 'AdobeAIR', + AIOHTTP: 'aiohttp', + APACHE_HTTPCLIENT: 'Apache-HttpClient', + AXIOS: 'axios', + GO_HTTP_CLIENT: 'go-http-client', + GOT: 'got', + GUZZLEHTTP: 'GuzzleHttp', + JAVA: 'Java', + JAVA_HTTPCLIENT: 'Java-http-client', + JSDOM: 'jsdom', + LIBWWW_PERL: 'libwww-perl', + LUA_RESTY_HTTP: 'lua-resty-http', + NEEDLE: 'Needle', + NUTCH: 'Nutch', + OKHTTP: 'OkHttp', + NODE_FETCH: 'node-fetch', + NODE_SUPERAGENT: 'node-superagent', + PHP_SOAP: 'PHP-SOAP', + POSTMAN_RUNTIME: 'PostmanRuntime', + PYTHON_HTTPX: 'python-httpx', + PYTHON_URLLIB: 'python-urllib', + PYTHON_URLLIB3: 'python-urllib3', + PYTHON_REQUESTS: 'python-requests', + SCRAPY: 'Scrapy' + } + }, + DeviceVendor: { + Vehicle: { + BMW: 'BMW', + BYD: 'BYD', + JEEP: 'Jeep', + RIVIAN: 'Rivian', + TESLA: 'Tesla', + VOLVO: 'Volvo' + } + } +}); export { - Browser, + Browser,// deprecated + CPU, // deprecated + Device, // deprecated + Vendor, // deprecated + Engine, // deprecated + OS, // deprecated + BrowserName, BrowserType, - CPU, - Device, - Vendor, - Engine, - OS + CPUArch, + DeviceType, + DeviceVendor, + EngineName, + OSName, + Extension }; \ No newline at end of file diff --git a/src/extensions/ua-parser-extensions.d.ts b/src/extensions/ua-parser-extensions.d.ts index 4ee31dd..3438970 100644 --- a/src/extensions/ua-parser-extensions.d.ts +++ b/src/extensions/ua-parser-extensions.d.ts @@ -1,4 +1,4 @@ -// Type definitions for Helpers submodule of UAParser.js v2.0.4 +// Type definitions for Helpers submodule of UAParser.js v2.0.5 // Project: https://github.com/faisalman/ua-parser-js // Definitions by: Faisal Salman diff --git a/src/extensions/ua-parser-extensions.js b/src/extensions/ua-parser-extensions.js index 8fb1e04..59d8606 100644 --- a/src/extensions/ua-parser-extensions.js +++ b/src/extensions/ua-parser-extensions.js @@ -1,5 +1,5 @@ /////////////////////////////////////////////// -/* Extensions for UAParser.js v2.0.4 +/* Extensions for UAParser.js v2.0.5 https://github.com/faisalman/ua-parser-js Author: Faisal Salman UAParser.js PRO Personal License */ @@ -43,20 +43,31 @@ const Crawlers = Object.freeze({ // AhrefsBot - https://ahrefs.com/robot // Amazonbot - https://developer.amazon.com/amazonbot // Bingbot / AdIdxBot - https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0 + // Bravebot - https://search.brave.com/help/brave-search-crawler // CCBot - https://commoncrawl.org/faq + // contxbot - https://affiliate-program.amazon.com/help/node/topic/GT98G5PPRERNVZ2C + // Coveobot - https://connect.coveo.com/s/article/19648 + // CriteoBot - https://www.criteo.com/criteo-crawler/ // Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot // DuckDuckBot - http://duckduckgo.com/duckduckbot.html // FacebookBot - https://developers.facebook.com/docs/sharing/bot/ // GPTBot - https://platform.openai.com/docs/gptbot // iAskBot - https://iask.ai + // Kagibot - https://kagi.com/bot + // Kangaroo Bot - https://kangaroollm.com.au/kangaroo-bot/ // LinkedInBot - http://www.linkedin.com // MJ12bot - https://mj12bot.com/ // MojeekBot - https://www.mojeek.com/bot.html // Onespot - https://www.onespot.com/identifying-traffic.html // OpenAI's SearchGPT - https://platform.openai.com/docs/bots // PerplexityBot - https://perplexity.ai/perplexitybot + // SBIntuitionsBot - https://www.sbintuitions.co.jp/bot/ // SeznamBot - http://napoveda.seznam.cz/seznambot-intro - /((?:adidx|ahrefs|amazon|bing|cc|dot|duckduck|exa|facebook|gpt|iask|linkedin|mj12|mojeek|oai-search|onespot-scraper|perplexity|semrush|seznam)bot)\/([\w\.-]+)/i, + // YepBot - https://yep.com/yepbot/ + /((?:adidx|ahrefs|amazon|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|oai-search|onespot-scraper|perplexity|sbintuitions|semrush|seznam|yep)bot)\/([\w\.-]+)/i, + + // Algolia Crawler + /(algolia crawler(?: renderscript)?)\/?([\w\.]*)/i, // Applebot - http://apple.com/go/applebot /(applebot(?:-extended)?)\/?([\w\.]*)/i, @@ -65,7 +76,7 @@ const Crawlers = Object.freeze({ /(baiduspider[-imagevdonwsfcpr]{0,7})\/?([\w\.]*)/i, // ClaudeBot (Anthropic) - /(claude(?:bot|-web)|anthropic-ai)\/?([\w\.]*)/i, + /(claude(?:bot|-searchbot|-web)|anthropic-ai)\/?([\w\.]*)/i, // Coc Coc Bot - https://help.coccoc.com/en/search-engine /(coccocbot-(?:image|web))\/([\w\.]+)/i, @@ -83,6 +94,9 @@ const Crawlers = Object.freeze({ // Internet Archive (archive.org) /(ia_archiver|archive\.org_bot)\/?([\w\.]*)/i, + // OnCrawl + /(oncrawl) mobile\/([\w\.]+)/i, + // Qwantbot - https://help.qwant.com/bot /(qwantbot)[-\w]*\/?([\w\.]*)/i, @@ -96,30 +110,38 @@ const Crawlers = Object.freeze({ /(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\/([\w\.]+)/i, // Yandex Bots - https://yandex.com/bots - /(yandex(?:(?:mobile)?(?:accessibility|additional|renderresources|screenshot|sprav)?bot|image(?:s|resizer)|video(?:parser)?|blogs|adnet|favicons|fordomain|market|media|metrika|news|ontodb(?:api)?|pagechecker|partner|rca|tracker|turbo|vertis|webmaster|antivirus))\/([\w\.]+)/i, + /(yandex(?:(?:mobile)?(?:accessibility|additional|com|renderresources|screenshot|sprav)?bot(?!.+mirror)|image(?:s|resizer)|adnet|blogs|favicons|market|media|metrika|news|ontodb(?:api)?|partner|rca|tracker|turbo|verti(?:cal)?s|webmaster|video(?:parser)?))\/([\w\.]+)/i, // Yeti (Naver) /(yeti)\/([\w\.]+)/i, - // aiHitBot / Diffbot / Linespider / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / VelenPublicWebCrawler / YisouSpider / YouBot - /((?:aihit|diff|timpi|you)bot|omgili(?:bot)?|openai image downloader|(?:magpie-|velenpublicweb)crawler|startpageprivateimageproxy|webzio-extended|(?:chatglm-|line|screaming frog seo |yisou)spider)\/?([\w\.]*)/i + // aiHitBot / Algolia Crawler / BLEXBot / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot + // Cotoyogi - https://ds.rois.ac.jp/en_center8/en_crawler/ + // Freespoke - https://docs.freespoke.com/search/bot/ + /((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cotoyogi|firecrawlagent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|twinagent|webzio-extended)\/?([\w\.]*)/i ], - [NAME, VERSION, [TYPE, CRAWLER]], + [ + // YandexBot MirrorDetector + /(yandexbot\/([\w\.]+); mirrordetector)/i + ], + [[NAME, /\/.+;/ig, ''], VERSION, [TYPE, CRAWLER]], + [ // Google Bots /((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|safety))/i, // AI2Bot - https://allenai.org/crawler - // Bytespider // DataForSeoBot - https://dataforseo.com/dataforseo-bot // Huawei AspiegelBot / PetalBot https://aspiegel.com/petalbot // ImagesiftBot - https://imagesift.com/about - // Qihoo 360Spider + // Siteimprove - https://help.siteimprove.com/support/solutions/articles/80000448553 // TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html + // v0bot - https://vercel.com/docs/bot-management // Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp - /\b(360spider-?(?:image|video)?|bytespider|(?:ai2|aspiegel|dataforseo|imagesift|petal|turnitin)bot|teoma|yahoo! slurp)/i + // Botify / Bytespider / DeepSeekBot / Qihoo 360Spider / SeekportBot / TikTokSpider + /\b((ai2|aspiegel|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i ], [NAME, [TYPE, CRAWLER]] ] @@ -234,16 +256,17 @@ const Emails = Object.freeze({ const Fetchers = Object.freeze({ browser : [ [ + // Asana / Bitlybot / Better Uptime / BingPreview / Blueno / Cohere-AI / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot // AhrefsSiteAudit - https://ahrefs.com/robot/site-audit + // Buffer Link Preview Bot - https://scraper.buffer.com/about/bots/link-preview-bot // ChatGPT-User - https://platform.openai.com/docs/plugins/bot // DuckAssistBot - https://duckduckgo.com/duckassistbot/ - // Better Uptime / BingPreview / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot // Google Site Verifier / Meta / Yahoo! Japan // Iframely - https://iframely.com/docs/about // Perplexity-User - https://docs.perplexity.ai/guides/bots // MistralAI-User - https://docs.mistral.ai/robots/ // Yandex Bots - https://yandex.com/bots - /(ahrefssiteaudit|(?:bing|microsoft)preview|(?:chatgpt|mistralai|perplexity)-user|mastodon|(?:discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero)bot|google-site-verification|iframely|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|searchshop)|yadirectfetcher)\/([\w\.]+)/i, + /(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher)\/([\w\.]+)/i, // Bluesky /(bluesky) cardyb\/([\w\.]+)/i, @@ -260,8 +283,8 @@ const Fetchers = Object.freeze({ [NAME, VERSION, [TYPE, FETCHER]], [ - // Google Bots / Cohere / Snapchat / Vercelbot / Yandex Bots - /((?:better uptime |telegram|vercel)bot|cohere-ai|feedfetcher-google|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|yandex(?:sitelinks|userproxy))/i + // Google Bots / Chrome-Lighthouse / Gemini-Deep-Research / Snapchat / Vercelbot / Yandex Bots + /((?:better uptime |telegram|vercel)bot|chrome-lighthouse|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i ], [NAME, [TYPE, FETCHER]], ], @@ -404,8 +427,8 @@ const Vehicles = Object.freeze({ const Bots = Object.freeze({ browser : [ ...CLIs.browser, - ...Crawlers.browser, ...Fetchers.browser, + ...Crawlers.browser, ...Libraries.browser ], os : [ diff --git a/src/extensions/ua-parser-extensions.mjs b/src/extensions/ua-parser-extensions.mjs index 85d8225..b73ed95 100644 --- a/src/extensions/ua-parser-extensions.mjs +++ b/src/extensions/ua-parser-extensions.mjs @@ -3,7 +3,7 @@ // Source: /src/extensions/ua-parser-extensions.js /////////////////////////////////////////////// -/* Extensions for UAParser.js v2.0.4 +/* Extensions for UAParser.js v2.0.5 https://github.com/faisalman/ua-parser-js Author: Faisal Salman UAParser.js PRO Personal License */ @@ -47,20 +47,31 @@ const Crawlers = Object.freeze({ // AhrefsBot - https://ahrefs.com/robot // Amazonbot - https://developer.amazon.com/amazonbot // Bingbot / AdIdxBot - https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0 + // Bravebot - https://search.brave.com/help/brave-search-crawler // CCBot - https://commoncrawl.org/faq + // contxbot - https://affiliate-program.amazon.com/help/node/topic/GT98G5PPRERNVZ2C + // Coveobot - https://connect.coveo.com/s/article/19648 + // CriteoBot - https://www.criteo.com/criteo-crawler/ // Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot // DuckDuckBot - http://duckduckgo.com/duckduckbot.html // FacebookBot - https://developers.facebook.com/docs/sharing/bot/ // GPTBot - https://platform.openai.com/docs/gptbot // iAskBot - https://iask.ai + // Kagibot - https://kagi.com/bot + // Kangaroo Bot - https://kangaroollm.com.au/kangaroo-bot/ // LinkedInBot - http://www.linkedin.com // MJ12bot - https://mj12bot.com/ // MojeekBot - https://www.mojeek.com/bot.html // Onespot - https://www.onespot.com/identifying-traffic.html // OpenAI's SearchGPT - https://platform.openai.com/docs/bots // PerplexityBot - https://perplexity.ai/perplexitybot + // SBIntuitionsBot - https://www.sbintuitions.co.jp/bot/ // SeznamBot - http://napoveda.seznam.cz/seznambot-intro - /((?:adidx|ahrefs|amazon|bing|cc|dot|duckduck|exa|facebook|gpt|iask|linkedin|mj12|mojeek|oai-search|onespot-scraper|perplexity|semrush|seznam)bot)\/([\w\.-]+)/i, + // YepBot - https://yep.com/yepbot/ + /((?:adidx|ahrefs|amazon|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|oai-search|onespot-scraper|perplexity|sbintuitions|semrush|seznam|yep)bot)\/([\w\.-]+)/i, + + // Algolia Crawler + /(algolia crawler(?: renderscript)?)\/?([\w\.]*)/i, // Applebot - http://apple.com/go/applebot /(applebot(?:-extended)?)\/?([\w\.]*)/i, @@ -69,7 +80,7 @@ const Crawlers = Object.freeze({ /(baiduspider[-imagevdonwsfcpr]{0,7})\/?([\w\.]*)/i, // ClaudeBot (Anthropic) - /(claude(?:bot|-web)|anthropic-ai)\/?([\w\.]*)/i, + /(claude(?:bot|-searchbot|-web)|anthropic-ai)\/?([\w\.]*)/i, // Coc Coc Bot - https://help.coccoc.com/en/search-engine /(coccocbot-(?:image|web))\/([\w\.]+)/i, @@ -87,6 +98,9 @@ const Crawlers = Object.freeze({ // Internet Archive (archive.org) /(ia_archiver|archive\.org_bot)\/?([\w\.]*)/i, + // OnCrawl + /(oncrawl) mobile\/([\w\.]+)/i, + // Qwantbot - https://help.qwant.com/bot /(qwantbot)[-\w]*\/?([\w\.]*)/i, @@ -100,30 +114,38 @@ const Crawlers = Object.freeze({ /(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\/([\w\.]+)/i, // Yandex Bots - https://yandex.com/bots - /(yandex(?:(?:mobile)?(?:accessibility|additional|renderresources|screenshot|sprav)?bot|image(?:s|resizer)|video(?:parser)?|blogs|adnet|favicons|fordomain|market|media|metrika|news|ontodb(?:api)?|pagechecker|partner|rca|tracker|turbo|vertis|webmaster|antivirus))\/([\w\.]+)/i, + /(yandex(?:(?:mobile)?(?:accessibility|additional|com|renderresources|screenshot|sprav)?bot(?!.+mirror)|image(?:s|resizer)|adnet|blogs|favicons|market|media|metrika|news|ontodb(?:api)?|partner|rca|tracker|turbo|verti(?:cal)?s|webmaster|video(?:parser)?))\/([\w\.]+)/i, // Yeti (Naver) /(yeti)\/([\w\.]+)/i, - // aiHitBot / Diffbot / Linespider / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / VelenPublicWebCrawler / YisouSpider / YouBot - /((?:aihit|diff|timpi|you)bot|omgili(?:bot)?|openai image downloader|(?:magpie-|velenpublicweb)crawler|startpageprivateimageproxy|webzio-extended|(?:chatglm-|line|screaming frog seo |yisou)spider)\/?([\w\.]*)/i + // aiHitBot / Algolia Crawler / BLEXBot / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot + // Cotoyogi - https://ds.rois.ac.jp/en_center8/en_crawler/ + // Freespoke - https://docs.freespoke.com/search/bot/ + /((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cotoyogi|firecrawlagent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|twinagent|webzio-extended)\/?([\w\.]*)/i ], - [NAME, VERSION, [TYPE, CRAWLER]], + [ + // YandexBot MirrorDetector + /(yandexbot\/([\w\.]+); mirrordetector)/i + ], + [[NAME, /\/.+;/ig, ''], VERSION, [TYPE, CRAWLER]], + [ // Google Bots /((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|safety))/i, // AI2Bot - https://allenai.org/crawler - // Bytespider // DataForSeoBot - https://dataforseo.com/dataforseo-bot // Huawei AspiegelBot / PetalBot https://aspiegel.com/petalbot // ImagesiftBot - https://imagesift.com/about - // Qihoo 360Spider + // Siteimprove - https://help.siteimprove.com/support/solutions/articles/80000448553 // TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html + // v0bot - https://vercel.com/docs/bot-management // Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp - /\b(360spider-?(?:image|video)?|bytespider|(?:ai2|aspiegel|dataforseo|imagesift|petal|turnitin)bot|teoma|yahoo! slurp)/i + // Botify / Bytespider / DeepSeekBot / Qihoo 360Spider / SeekportBot / TikTokSpider + /\b((ai2|aspiegel|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i ], [NAME, [TYPE, CRAWLER]] ] @@ -238,16 +260,17 @@ const Emails = Object.freeze({ const Fetchers = Object.freeze({ browser : [ [ + // Asana / Bitlybot / Better Uptime / BingPreview / Blueno / Cohere-AI / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot // AhrefsSiteAudit - https://ahrefs.com/robot/site-audit + // Buffer Link Preview Bot - https://scraper.buffer.com/about/bots/link-preview-bot // ChatGPT-User - https://platform.openai.com/docs/plugins/bot // DuckAssistBot - https://duckduckgo.com/duckassistbot/ - // Better Uptime / BingPreview / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot // Google Site Verifier / Meta / Yahoo! Japan // Iframely - https://iframely.com/docs/about // Perplexity-User - https://docs.perplexity.ai/guides/bots // MistralAI-User - https://docs.mistral.ai/robots/ // Yandex Bots - https://yandex.com/bots - /(ahrefssiteaudit|(?:bing|microsoft)preview|(?:chatgpt|mistralai|perplexity)-user|mastodon|(?:discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero)bot|google-site-verification|iframely|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|searchshop)|yadirectfetcher)\/([\w\.]+)/i, + /(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher)\/([\w\.]+)/i, // Bluesky /(bluesky) cardyb\/([\w\.]+)/i, @@ -264,8 +287,8 @@ const Fetchers = Object.freeze({ [NAME, VERSION, [TYPE, FETCHER]], [ - // Google Bots / Cohere / Snapchat / Vercelbot / Yandex Bots - /((?:better uptime |telegram|vercel)bot|cohere-ai|feedfetcher-google|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|yandex(?:sitelinks|userproxy))/i + // Google Bots / Chrome-Lighthouse / Gemini-Deep-Research / Snapchat / Vercelbot / Yandex Bots + /((?:better uptime |telegram|vercel)bot|chrome-lighthouse|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i ], [NAME, [TYPE, FETCHER]], ], @@ -408,8 +431,8 @@ const Vehicles = Object.freeze({ const Bots = Object.freeze({ browser : [ ...CLIs.browser, - ...Crawlers.browser, ...Fetchers.browser, + ...Crawlers.browser, ...Libraries.browser ], os : [ diff --git a/src/helpers/ua-parser-helpers.d.ts b/src/helpers/ua-parser-helpers.d.ts index fc53c61..caee9cb 100644 --- a/src/helpers/ua-parser-helpers.d.ts +++ b/src/helpers/ua-parser-helpers.d.ts @@ -1,27 +1,15 @@ -// Type definitions for Helpers submodule of UAParser.js v2.0.4 +// Type definitions for Helpers submodule of UAParser.js v2.0.5 // Project: https://github.com/faisalman/ua-parser-js // Definitions by: Faisal Salman import type { IResult } from "../main/ua-parser"; -declare function getDeviceVendor(model: string): string | undefined; -declare function isAppleSilicon(resultOrUA: IResult | string): boolean; -declare function isAIBot(resultOrUA: IResult | string): boolean; -declare function isBot(resultOrUA: IResult | string): boolean; -declare function isChromeFamily(resultOrUA: IResult | string): boolean; -declare function isElectron(): boolean; -declare function isFromEU(): boolean; -declare function isFrozenUA(ua: string): boolean; -declare function isStandalonePWA(): boolean; - -export { - getDeviceVendor, - isAppleSilicon, - isAIBot, - isBot, - isChromeFamily, - isElectron, - isFromEU, - isFrozenUA, - isStandalonePWA -} \ No newline at end of file +export function getDeviceVendor(model: string): string | undefined; +export function isAppleSilicon(resultOrUA: IResult | string): boolean; +export function isAIBot(resultOrUA: IResult | string): boolean; +export function isBot(resultOrUA: IResult | string): boolean; +export function isChromeFamily(resultOrUA: IResult | string): boolean; +export function isElectron(): boolean; +export function isFromEU(): boolean; +export function isFrozenUA(ua: string): boolean; +export function isStandalonePWA(): boolean; diff --git a/src/helpers/ua-parser-helpers.js b/src/helpers/ua-parser-helpers.js index b6e57b3..b2e227d 100644 --- a/src/helpers/ua-parser-helpers.js +++ b/src/helpers/ua-parser-helpers.js @@ -1,5 +1,5 @@ /////////////////////////////////////////////// -/* Helpers for UAParser.js v2.0.4 +/* Helpers for UAParser.js v2.0.5 https://github.com/faisalman/ua-parser-js Author: Faisal Salman UAParser.js PRO Personal License */ @@ -8,11 +8,12 @@ /*jshint esversion: 6 */ const { UAParser } = require('../main/ua-parser'); -const { CPU, OS, Engine } = require('../enums/ua-parser-enums'); -const { Bots } = require('../extensions/ua-parser-extensions'); +const { CPUArch, OSName, EngineName, Extension, BrowserType } = require('../enums/ua-parser-enums'); +const { Bots, Crawlers } = require('../extensions/ua-parser-extensions'); const { isFromEU } = require('detect-europe-js'); const { isFrozenUA } = require('ua-is-frozen'); const { isStandalonePWA } = require('is-standalone-pwa'); +const { Crawler } = Extension.BrowserName; const toResult = (value, head, ext) => typeof value === 'string' ? UAParser(value, head, ext) : value; @@ -20,8 +21,8 @@ const getDeviceVendor = (model) => UAParser(`Mozilla/5.0 (Linux; Android 10; ${m const isAppleSilicon = (resultOrUA) => { const res = toResult(resultOrUA); - if (res.os.is(OS.MACOS)) { - if (res.cpu.is(CPU.ARM)) { + if (res.os.is(OSName.MACOS)) { + if (res.cpu.is(CPUArch.ARM)) { return true; } if (typeof resultOrUA !== 'string' && typeof window !== 'undefined') { @@ -44,88 +45,129 @@ const isAppleSilicon = (resultOrUA) => { const isAIBot = (resultOrUA) => [ // AI2 - 'ai2bot', + Crawler.AI2_BOT, // Amazon - 'amazonbot', + Crawler.AMAZON_BOT, // Anthropic - 'anthropic-ai', - 'claude-web', - 'claudebot', + Crawler.ANTHROPIC_AI, + Crawler.ANTHROPIC_CLAUDE_BOT, + Crawler.ANTHROPIC_CLAUDE_SEARCHBOT, + Crawler.ANTHROPIC_CLAUDE_WEB, // Apple - 'applebot', - 'applebot-extended', + Crawler.APPLE_BOT, + Crawler.APPLE_BOT_EXTENDED, + + // Brave + Crawler.BRAVE_BOT, // ByteDance - 'bytespider', + Crawler.BYTEDANCE_BYTESPIDER, + Crawler.BYTEDANCE_TIKTOKSPIDER, + + // Cohere + Crawler.COHERE_TRAINING_DATA_CRAWLER, // Common Crawl - 'ccbot', + Crawler.COMMON_CRAWL_CCBOT, + + // Coveo + Crawler.COVEO_BOT, // DataForSeo - 'dataforseobot', + Crawler.DATAFORSEO_BOT, + + // DeepSeek + Crawler.DEEPSEEK_BOT, // Diffbot - 'diffbot', + Crawler.DIFFBOT, // Google - 'googleother', - 'googleother-image', - 'googleother-video', - 'google-extended', + Crawler.GOOGLE_EXTENDED, + Crawler.GOOGLE_OTHER, + Crawler.GOOGLE_OTHER_IMAGE, + Crawler.GOOGLE_OTHER_VIDEO, + Crawler.GOOGLE_CLOUDVERTEXBOT, // Hive AI - 'imagesiftbot', + Crawler.HIVE_IMAGESIFTBOT, // Huawei - 'petalbot', + Crawler.HUAWEI_PETALBOT, + Crawler.HUAWEI_PANGUBOT, + + // Hugging Face + Crawler.HUGGINGFACE_BOT, + + // Kangaroo + Crawler.KANGAROO_BOT, + + // Mendable.ai + Crawler.FIRECRAWL_AGENT, // Meta - 'facebookbot', - 'meta-externalagent', + Crawler.META_FACEBOOKBOT, + Crawler.META_EXTERNALAGENT, // OpenAI - 'gptbot', - 'oai-searchbot', + Crawler.OPENAI_GPTBOT, + Crawler.OPENAI_SEARCH_BOT, // Perplexity - 'perplexitybot', + Crawler.PERPLEXITY_BOT, + + // Replicate + Crawler.REPLICATE_BOT, + + // Runpod + Crawler.RUNPOD_BOT, + + // SB Intuitions + Crawler.SB_INTUITIONS_BOT, // Semrush - 'semrushbot-ocob', + Crawler.SEMRUSH_BOT_CONTENTSHAKE, // Timpi - 'timpibot', + Crawler.TIMPI_BOT, + + // Together AI + Crawler.TOGETHER_BOT, // Velen.io - 'velenpublicwebcrawler', + Crawler.HUNTER_VELENPUBLICWEBCRAWLER, + + // Vercel + Crawler.VERCEL_V0BOT, // Webz.io - 'omgili', - 'omgilibot', - 'webzio-extended', + Crawler.WEBZIO_OMGILI, + Crawler.WEBZIO_OMGILI_BOT, + Crawler.WEBZIO_EXTENDED, + + // X + Crawler.XAI_BOT, // You.com - 'youbot', + Crawler.YOU_BOT, // Zhipu AI - 'chatglm-spider', - - // Zyte - 'scrapy' - - ].includes(String(toResult(resultOrUA, Bots).browser.name).toLowerCase()); + Crawler.ZHIPU_CHATGLM_SPIDER + ] + .map((s) => s.toLowerCase()) + .includes(String(toResult(resultOrUA, Crawlers).browser.name).toLowerCase()); const isBot = (resultOrUA) => [ - 'cli', - 'crawler', - 'fetcher', - 'library' + BrowserType.CLI, + BrowserType.CRAWLER, + BrowserType.FETCHER, + BrowserType.LIBRARY ].includes(toResult(resultOrUA, Bots).browser.type); -const isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(Engine.BLINK); +const isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(EngineName.BLINK); const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js / electron\//i.test(navigator?.userAgent)); // browser diff --git a/src/helpers/ua-parser-helpers.mjs b/src/helpers/ua-parser-helpers.mjs index 7316fd4..443283e 100644 --- a/src/helpers/ua-parser-helpers.mjs +++ b/src/helpers/ua-parser-helpers.mjs @@ -3,7 +3,7 @@ // Source: /src/helpers/ua-parser-helpers.js /////////////////////////////////////////////// -/* Helpers for UAParser.js v2.0.4 +/* Helpers for UAParser.js v2.0.5 https://github.com/faisalman/ua-parser-js Author: Faisal Salman UAParser.js PRO Personal License */ @@ -12,11 +12,12 @@ /*jshint esversion: 6 */ import { UAParser } from '../main/ua-parser.mjs'; -import { CPU, OS, Engine } from '../enums/ua-parser-enums.mjs'; -import { Bots } from '../extensions/ua-parser-extensions.mjs'; +import { CPUArch, OSName, EngineName, Extension, BrowserType } from '../enums/ua-parser-enums.mjs'; +import { Bots, Crawlers } from '../extensions/ua-parser-extensions.mjs'; import { isFromEU } from 'detect-europe-js'; import { isFrozenUA } from 'ua-is-frozen'; import { isStandalonePWA } from 'is-standalone-pwa'; +const { Crawler } = Extension.BrowserName; const toResult = (value, head, ext) => typeof value === 'string' ? UAParser(value, head, ext) : value; @@ -24,8 +25,8 @@ const getDeviceVendor = (model) => UAParser(`Mozilla/5.0 (Linux; Android 10; ${m const isAppleSilicon = (resultOrUA) => { const res = toResult(resultOrUA); - if (res.os.is(OS.MACOS)) { - if (res.cpu.is(CPU.ARM)) { + if (res.os.is(OSName.MACOS)) { + if (res.cpu.is(CPUArch.ARM)) { return true; } if (typeof resultOrUA !== 'string' && typeof window !== 'undefined') { @@ -48,88 +49,129 @@ const isAppleSilicon = (resultOrUA) => { const isAIBot = (resultOrUA) => [ // AI2 - 'ai2bot', + Crawler.AI2_BOT, // Amazon - 'amazonbot', + Crawler.AMAZON_BOT, // Anthropic - 'anthropic-ai', - 'claude-web', - 'claudebot', + Crawler.ANTHROPIC_AI, + Crawler.ANTHROPIC_CLAUDE_BOT, + Crawler.ANTHROPIC_CLAUDE_SEARCHBOT, + Crawler.ANTHROPIC_CLAUDE_WEB, // Apple - 'applebot', - 'applebot-extended', + Crawler.APPLE_BOT, + Crawler.APPLE_BOT_EXTENDED, + + // Brave + Crawler.BRAVE_BOT, // ByteDance - 'bytespider', + Crawler.BYTEDANCE_BYTESPIDER, + Crawler.BYTEDANCE_TIKTOKSPIDER, + + // Cohere + Crawler.COHERE_TRAINING_DATA_CRAWLER, // Common Crawl - 'ccbot', + Crawler.COMMON_CRAWL_CCBOT, + + // Coveo + Crawler.COVEO_BOT, // DataForSeo - 'dataforseobot', + Crawler.DATAFORSEO_BOT, + + // DeepSeek + Crawler.DEEPSEEK_BOT, // Diffbot - 'diffbot', + Crawler.DIFFBOT, // Google - 'googleother', - 'googleother-image', - 'googleother-video', - 'google-extended', + Crawler.GOOGLE_EXTENDED, + Crawler.GOOGLE_OTHER, + Crawler.GOOGLE_OTHER_IMAGE, + Crawler.GOOGLE_OTHER_VIDEO, + Crawler.GOOGLE_CLOUDVERTEXBOT, // Hive AI - 'imagesiftbot', + Crawler.HIVE_IMAGESIFTBOT, // Huawei - 'petalbot', + Crawler.HUAWEI_PETALBOT, + Crawler.HUAWEI_PANGUBOT, + + // Hugging Face + Crawler.HUGGINGFACE_BOT, + + // Kangaroo + Crawler.KANGAROO_BOT, + + // Mendable.ai + Crawler.FIRECRAWL_AGENT, // Meta - 'facebookbot', - 'meta-externalagent', + Crawler.META_FACEBOOKBOT, + Crawler.META_EXTERNALAGENT, // OpenAI - 'gptbot', - 'oai-searchbot', + Crawler.OPENAI_GPTBOT, + Crawler.OPENAI_SEARCH_BOT, // Perplexity - 'perplexitybot', + Crawler.PERPLEXITY_BOT, + + // Replicate + Crawler.REPLICATE_BOT, + + // Runpod + Crawler.RUNPOD_BOT, + + // SB Intuitions + Crawler.SB_INTUITIONS_BOT, // Semrush - 'semrushbot-ocob', + Crawler.SEMRUSH_BOT_CONTENTSHAKE, // Timpi - 'timpibot', + Crawler.TIMPI_BOT, + + // Together AI + Crawler.TOGETHER_BOT, // Velen.io - 'velenpublicwebcrawler', + Crawler.HUNTER_VELENPUBLICWEBCRAWLER, + + // Vercel + Crawler.VERCEL_V0BOT, // Webz.io - 'omgili', - 'omgilibot', - 'webzio-extended', + Crawler.WEBZIO_OMGILI, + Crawler.WEBZIO_OMGILI_BOT, + Crawler.WEBZIO_EXTENDED, + + // X + Crawler.XAI_BOT, // You.com - 'youbot', + Crawler.YOU_BOT, // Zhipu AI - 'chatglm-spider', - - // Zyte - 'scrapy' - - ].includes(String(toResult(resultOrUA, Bots).browser.name).toLowerCase()); + Crawler.ZHIPU_CHATGLM_SPIDER + ] + .map((s) => s.toLowerCase()) + .includes(String(toResult(resultOrUA, Crawlers).browser.name).toLowerCase()); const isBot = (resultOrUA) => [ - 'cli', - 'crawler', - 'fetcher', - 'library' + BrowserType.CLI, + BrowserType.CRAWLER, + BrowserType.FETCHER, + BrowserType.LIBRARY ].includes(toResult(resultOrUA, Bots).browser.type); -const isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(Engine.BLINK); +const isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(EngineName.BLINK); const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js / electron\//i.test(navigator?.userAgent)); // browser diff --git a/src/main/ua-parser.d.ts b/src/main/ua-parser.d.ts index 9533b68..09c11ee 100644 --- a/src/main/ua-parser.d.ts +++ b/src/main/ua-parser.d.ts @@ -1,9 +1,9 @@ -// Type definitions for UAParser.js v2.0.4 +// Type definitions for UAParser.js v2.0.5 // Project: https://github.com/faisalman/ua-parser-js // Definitions by: Faisal Salman -import type { IncomingHttpHeaders } from 'http'; -import type { Headers as FetchAPIHeaders } from 'node-fetch'; +import type { Headers } from "undici"; +import { BrowserType, CPUArch, DeviceType, EngineName } from "../enums/ua-parser-enums"; declare namespace UAParser { @@ -18,21 +18,21 @@ declare namespace UAParser { name?: string; version?: string; major?: string; - type?: 'crawler' | 'cli' | 'email' | 'fetcher' | 'inapp' | 'mediaplayer' | 'library'; + type?: typeof BrowserType[keyof typeof BrowserType]; } interface ICPU extends IData { - architecture?: 'ia32' | 'ia64' | 'amd64' | 'arm' | 'arm64' | 'armhf' | 'avr' | 'avr32' | 'irix' | 'irix64' | 'mips' | 'mips64' | '68k' | 'pa-risc' | 'ppc' | 'sparc' | 'sparc64'; + architecture?: typeof CPUArch[keyof typeof CPUArch]; } interface IDevice extends IData { - type?: 'mobile' | 'tablet' | 'console' | 'smarttv' | 'wearable' | 'xr' | 'embedded'; + type?: typeof DeviceType[keyof typeof DeviceType]; vendor?: string; model?: string; } interface IEngine extends IData { - name?: 'Amaya' | 'ArkWeb' | 'Blink' | 'EdgeHTML' | 'Flow' | 'Gecko' | 'Goanna' | 'iCab' | 'KHTML' | 'LibWeb' | 'Links' | 'Lynx' | 'NetFront' | 'NetSurf' | 'Presto' | 'Servo' | 'Tasman' | 'Trident' | 'w3m' | 'WebKit'; + name?: typeof EngineName[keyof typeof EngineName]; version?: string; } @@ -53,7 +53,7 @@ declare namespace UAParser { type RegexMap = ((RegExp | string | (string | RegExp | Function)[])[])[]; type UAParserProps = 'browser' | 'cpu' | 'device' | 'engine' | 'os'; type UAParserExt = Partial> | Partial>[]; - type UAParserHeaders = Record | IncomingHttpHeaders | FetchAPIHeaders; + export type UAParserHeaders = Record | Headers; export function UAParser(uastring?: string, extensions?: UAParserExt, headers?: UAParserHeaders): IResult; export function UAParser(uastring?: string, headers?: UAParserHeaders): IResult; diff --git a/src/main/ua-parser.js b/src/main/ua-parser.js index 42bb100..ea2bdb6 100755 --- a/src/main/ua-parser.js +++ b/src/main/ua-parser.js @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////////// -/* UAParser.js v2.0.4 +/* UAParser.js v2.0.5 Copyright © 2012-2025 Faisal Salman UAParser.js PRO Personal License *//* Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data. @@ -19,7 +19,7 @@ // Constants ///////////// - var LIBVERSION = '2.0.4', + var LIBVERSION = '2.0.5', UA_MAX_LENGTH = 500, USER_AGENT = 'user-agent', EMPTY = '', @@ -188,6 +188,8 @@ }, setProps = function (arr) { for (var i in arr) { + if (!arr.hasOwnProperty(i)) continue; + var propName = arr[i]; if (typeof propName == OBJ_TYPE && propName.length == 2) { this[propName[0]] = propName[1]; @@ -455,6 +457,8 @@ ], [VERSION, [NAME, 'TikTok'], [TYPE, INAPP]], [ /\[(linkedin)app\]/i // LinkedIn App for iOS & Android ], [NAME, [TYPE, INAPP]], [ + /(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i // Zalo + ], [[NAME, /(.+)/, 'Zalo'], VERSION, [TYPE, INAPP]], [ /(chromium)[\/ ]([-\w\.]+)/i // Chromium ], [NAME, VERSION], [ @@ -536,15 +540,15 @@ /( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i ], [[ARCHITECTURE, 'arm']], [ - /((ppc|powerpc)(64)?)( mac|;|\))/i // PowerPC - ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [ - / sun4\w[;\)]/i // SPARC ], [[ARCHITECTURE, 'sparc']], [ - - /\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC - ], [[ARCHITECTURE, lowerize]] + /\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i, + /((ppc|powerpc)(64)?)( mac|;|\))/i, // PowerPC + /(?:osf1|[freopnt]{3,4}bsd) (alpha)/i // Alpha + ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [ + /winnt.+\[axp/i + ], [[ARCHITECTURE, 'alpha']] ], device : [[ @@ -768,7 +772,8 @@ /; (blu|hmd|imo|infinix|lava|oneplus|tcl)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i, // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL /(hp) ([\w ]+\w)/i, // HP iPAQ /(microsoft); (lumia[\w ]+)/i, // Microsoft Lumia - /(oppo) ?([\w ]+) bui/i // OPPO + /(oppo) ?([\w ]+) bui/i, // OPPO + /droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i // Philips ], [VENDOR, MODEL, [TYPE, MOBILE]], [ /(kobo)\s(ereader|touch)/i, // Kobo @@ -795,6 +800,7 @@ // SMARTTVS /////////////////// + /(philips)[\w ]+tv/i, // Philips /smart-tv.+(samsung)/i // Samsung ], [VENDOR, [TYPE, SMARTTV]], [ /hbbtv.+maple;(\d+)/i @@ -832,11 +838,6 @@ /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, // Roku /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices ], [[VENDOR, /.+\/(\w+)/, '$1', strMapper, {'LG':'lge'}], [MODEL, trim], [TYPE, SMARTTV]], [ - // SmartTV from Unidentified Vendors - /droid.+; ([\w- ]+) (?:android tv|smart[- ]?tv)/i - ], [MODEL, [TYPE, SMARTTV]], [ - /\b(android tv|smart[- ]?tv|opera tv|tv; rv:|large screen[\w ]+safari)\b/i - ], [[TYPE, SMARTTV]], [ /////////////////// // CONSOLES @@ -883,7 +884,7 @@ /droid.+; (glass) \d/i // Google Glass ], [MODEL, [VENDOR, GOOGLE], [TYPE, XR]], [ - /(pico) (4|neo3(?: link|pro)?)/i // Pico + /(pico) ([\w ]+) os\d/i // Pico ], [VENDOR, MODEL, [TYPE, XR]], [ /(quest( \d| pro)?s?).+vr/i // Meta Quest ], [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]], [ @@ -907,6 +908,10 @@ // MIXED (GENERIC) /////////////////// + /droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i // Unidentifiable SmartTV + ], [MODEL, [TYPE, SMARTTV]], [ + /\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i + ], [[TYPE, SMARTTV]], [ /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+?(mobile|vr|\d) safari/i ], [MODEL, [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]], [ /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet @@ -1263,7 +1268,7 @@ case UA_ENGINE: var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName; if (brands) { - for (var i in brands) { + for (var i=0; i UAParser.js PRO Personal License *//* Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data. @@ -21,7 +21,7 @@ // Constants ///////////// - var LIBVERSION = '2.0.4', + var LIBVERSION = '2.0.5', UA_MAX_LENGTH = 500, USER_AGENT = 'user-agent', EMPTY = '', @@ -190,6 +190,8 @@ }, setProps = function (arr) { for (var i in arr) { + if (!arr.hasOwnProperty(i)) continue; + var propName = arr[i]; if (typeof propName == OBJ_TYPE && propName.length == 2) { this[propName[0]] = propName[1]; @@ -457,6 +459,8 @@ ], [VERSION, [NAME, 'TikTok'], [TYPE, INAPP]], [ /\[(linkedin)app\]/i // LinkedIn App for iOS & Android ], [NAME, [TYPE, INAPP]], [ + /(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i // Zalo + ], [[NAME, /(.+)/, 'Zalo'], VERSION, [TYPE, INAPP]], [ /(chromium)[\/ ]([-\w\.]+)/i // Chromium ], [NAME, VERSION], [ @@ -538,15 +542,15 @@ /( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i ], [[ARCHITECTURE, 'arm']], [ - /((ppc|powerpc)(64)?)( mac|;|\))/i // PowerPC - ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [ - / sun4\w[;\)]/i // SPARC ], [[ARCHITECTURE, 'sparc']], [ - - /\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC - ], [[ARCHITECTURE, lowerize]] + /\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i, + /((ppc|powerpc)(64)?)( mac|;|\))/i, // PowerPC + /(?:osf1|[freopnt]{3,4}bsd) (alpha)/i // Alpha + ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [ + /winnt.+\[axp/i + ], [[ARCHITECTURE, 'alpha']] ], device : [[ @@ -770,7 +774,8 @@ /; (blu|hmd|imo|infinix|lava|oneplus|tcl)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i, // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL /(hp) ([\w ]+\w)/i, // HP iPAQ /(microsoft); (lumia[\w ]+)/i, // Microsoft Lumia - /(oppo) ?([\w ]+) bui/i // OPPO + /(oppo) ?([\w ]+) bui/i, // OPPO + /droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i // Philips ], [VENDOR, MODEL, [TYPE, MOBILE]], [ /(kobo)\s(ereader|touch)/i, // Kobo @@ -797,6 +802,7 @@ // SMARTTVS /////////////////// + /(philips)[\w ]+tv/i, // Philips /smart-tv.+(samsung)/i // Samsung ], [VENDOR, [TYPE, SMARTTV]], [ /hbbtv.+maple;(\d+)/i @@ -834,11 +840,6 @@ /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, // Roku /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices ], [[VENDOR, /.+\/(\w+)/, '$1', strMapper, {'LG':'lge'}], [MODEL, trim], [TYPE, SMARTTV]], [ - // SmartTV from Unidentified Vendors - /droid.+; ([\w- ]+) (?:android tv|smart[- ]?tv)/i - ], [MODEL, [TYPE, SMARTTV]], [ - /\b(android tv|smart[- ]?tv|opera tv|tv; rv:|large screen[\w ]+safari)\b/i - ], [[TYPE, SMARTTV]], [ /////////////////// // CONSOLES @@ -885,7 +886,7 @@ /droid.+; (glass) \d/i // Google Glass ], [MODEL, [VENDOR, GOOGLE], [TYPE, XR]], [ - /(pico) (4|neo3(?: link|pro)?)/i // Pico + /(pico) ([\w ]+) os\d/i // Pico ], [VENDOR, MODEL, [TYPE, XR]], [ /(quest( \d| pro)?s?).+vr/i // Meta Quest ], [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]], [ @@ -909,6 +910,10 @@ // MIXED (GENERIC) /////////////////// + /droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i // Unidentifiable SmartTV + ], [MODEL, [TYPE, SMARTTV]], [ + /\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i + ], [[TYPE, SMARTTV]], [ /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+?(mobile|vr|\d) safari/i ], [MODEL, [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]], [ /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet @@ -1265,7 +1270,7 @@ case UA_ENGINE: var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName; if (brands) { - for (var i in brands) { + for (var i=0; i { @@ -19,8 +19,8 @@ describe('Returns', () => { describe('Enums', () => { it('Can use enum', () => { const { cpu, device, engine } = UAParser('Mozilla/5.0 (X11; U; Linux armv7l; en-GB; rv:1.9.2a1pre) Gecko/20090928 Firefox/3.5 Maemo Browser 1.4.1.22 RX-51 N900'); - assert.strictEqual(cpu.is(CPU.ARM), true); - assert.strictEqual(device.is(Device.MOBILE), true); - assert.strictEqual(engine.is(Engine.GECKO), true); + assert.strictEqual(cpu.is(CPUArch.ARM), true); + assert.strictEqual(device.is(DeviceType.MOBILE), true); + assert.strictEqual(engine.is(EngineName.GECKO), true); }); }); \ No newline at end of file diff --git a/test/unit/extensions.js b/test/unit/extensions.js index 9f1fa96..c3acfa2 100644 --- a/test/unit/extensions.js +++ b/test/unit/extensions.js @@ -5,6 +5,8 @@ const traverse = require('@babel/traverse').default; const safe = require('safe-regex'); const { UAParser } = require('../../src/main/ua-parser'); const { Bots, CLIs, Crawlers, Emails, Fetchers, InApps, Libraries, Vehicles } = require('../../src/extensions/ua-parser-extensions'); +const { BrowserType, OSName, Extension } = require('../../src/enums/ua-parser-enums'); +const { CLI, Crawler, Email, Fetcher, Library } = Extension.BrowserName; describe('Extensions', () => { [ @@ -42,29 +44,29 @@ describe('Extensions', () => { const jsdom = 'Mozilla/5.0 (darwin) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/20.0.3'; const scrapy = 'Scrapy/1.5.0 (+https://scrapy.org)'; - assert.equal(UAParser(scrapy, Bots).browser.name, 'Scrapy'); + assert.equal(UAParser(scrapy, Bots).browser.name, Library.SCRAPY); const emailParser = new UAParser(Emails); - assert.deepEqual(emailParser.setUA(outlook).getBrowser(), {name: "Microsoft Outlook", version: "16.0.9126", major: "16", type: "email"}); - assert.deepEqual(emailParser.setUA(thunderbird).getBrowser(), {name: "Thunderbird", version: "78.13.0", major: "78", type: "email"}); + assert.deepEqual(emailParser.setUA(outlook).getBrowser(), {name: Email.MICROSOFT_OUTLOOK, version: "16.0.9126", major: "16", type: BrowserType.EMAIL}); + assert.deepEqual(emailParser.setUA(thunderbird).getBrowser(), {name: Email.THUNDERBIRD, version: "78.13.0", major: "78", type: BrowserType.EMAIL}); const libraryParser = new UAParser(Libraries); - assert.deepEqual(libraryParser.setUA(axios).getBrowser(), {name: "axios", version: "1.3.5", major: "1", type: "library"}); - assert.deepEqual(libraryParser.setUA(jsdom).getBrowser(), {name: "jsdom", version: "20.0.3", major: "20", type: "library"}); - assert.deepEqual(libraryParser.setUA(scrapy).getBrowser(), {name: "Scrapy", version: "1.5.0", major: "1", type: "library"}); + assert.deepEqual(libraryParser.setUA(axios).getBrowser(), {name: Library.AXIOS, version: "1.3.5", major: "1", type: BrowserType.LIBRARY}); + assert.deepEqual(libraryParser.setUA(jsdom).getBrowser(), {name: Library.JSDOM, version: "20.0.3", major: "20", type: BrowserType.LIBRARY}); + assert.deepEqual(libraryParser.setUA(scrapy).getBrowser(), {name: Library.SCRAPY, version: "1.5.0", major: "1", type: BrowserType.LIBRARY}); // Bluesky const bluesky = 'Mozilla/5.0 (compatible; Bluesky Cardyb/1.1; +mailto:support@bsky.app)'; assert.deepEqual(new UAParser(bluesky, Bots).getBrowser(), { - name: 'Bluesky', + name: Fetcher.BLUESKY, version: '1.1', major: '1', - type: 'fetcher' + type: BrowserType.FETCHER }); const whatsapp = "WhatsApp/2.0 A"; assert.deepEqual(new UAParser(whatsapp, Fetchers).getOS(), { - name : 'Android', + name : OSName.ANDROID, version : undefined }); }); @@ -77,14 +79,14 @@ describe('Merge', () => { // try merging crawlers & CLIs const crawlersAndCLIs = { browser : [...Crawlers.browser, ...CLIs.browser]}; const crawlersAndCLIsParser = new UAParser(crawlersAndCLIs); - assert.deepEqual(crawlersAndCLIsParser.setUA(wget).getBrowser(), {name: "Wget", version: "1.21.1", major: "1", type:"cli"}); - assert.deepEqual(crawlersAndCLIsParser.setUA(facebookBot).getBrowser(), {name: "FacebookBot", version: "1.0", major: "1", type:"crawler"}); + assert.deepEqual(crawlersAndCLIsParser.setUA(wget).getBrowser(), {name: CLI.WGET, version: "1.21.1", major: "1", type: BrowserType.CLI}); + assert.deepEqual(crawlersAndCLIsParser.setUA(facebookBot).getBrowser(), {name: Crawler.META_FACEBOOKBOT, version: "1.0", major: "1", type: BrowserType.CRAWLER}); // alternative merge options const crawlersAndCLIsParser2 = new UAParser([Crawlers, CLIs]); const crawlersAndCLIsParser3 = new UAParser(facebookBot, [Crawlers, CLIs]); - assert.deepEqual(crawlersAndCLIsParser2.setUA(wget).getBrowser(), {name: "Wget", version: "1.21.1", major: "1", type:"cli"}); - assert.deepEqual(crawlersAndCLIsParser3.getBrowser(), {name: "FacebookBot", version: "1.0", major: "1", type:"crawler"}); + assert.deepEqual(crawlersAndCLIsParser2.setUA(wget).getBrowser(), {name: CLI.WGET, version: "1.21.1", major: "1", type: BrowserType.CLI}); + assert.deepEqual(crawlersAndCLIsParser3.getBrowser(), {name: Crawler.META_FACEBOOKBOT, version: "1.0", major: "1", type: BrowserType.CRAWLER}); }); }); diff --git a/test/unit/helpers.js b/test/unit/helpers.js index 127133b..3fa7925 100644 --- a/test/unit/helpers.js +++ b/test/unit/helpers.js @@ -2,6 +2,7 @@ const assert = require('assert'); const { UAParser } = require('../../src/main/ua-parser'); const { getDeviceVendor, isAppleSilicon, isAIBot, isBot, isChromeFamily } = require('../../src/helpers/ua-parser-helpers'); const { Bots, Emails } = require('../../src/extensions/ua-parser-extensions'); +const { DeviceVendor } = require('../../src/enums/ua-parser-enums'); describe('getDeviceVendor', () => { it('Can guess the device vendor from a model name', () => { @@ -11,10 +12,10 @@ describe('getDeviceVendor', () => { const modelNexus = 'Nexus 6P'; const modelAquos = 'AQUOS-TVX19B'; - assert.equal(getDeviceVendor(modelSM), 'Samsung'); - assert.equal(getDeviceVendor(modelRedmi), 'Xiaomi'); - assert.equal(getDeviceVendor(modelNexus), 'Huawei'); - assert.equal(getDeviceVendor(modelAquos), 'Sharp'); + assert.equal(getDeviceVendor(modelSM), DeviceVendor.SAMSUNG); + assert.equal(getDeviceVendor(modelRedmi), DeviceVendor.XIAOMI); + assert.equal(getDeviceVendor(modelNexus), DeviceVendor.HUAWEI); + assert.equal(getDeviceVendor(modelAquos), DeviceVendor.SHARP); }); }); diff --git a/test/unit/main.js b/test/unit/main.js index 3f01d19..b99e832 100644 --- a/test/unit/main.js +++ b/test/unit/main.js @@ -10,7 +10,7 @@ var cpus = require('../data/ua/cpu/cpu-all.json'); var devices = readJsonFiles('test/data/ua/device'); var engines = require('../data/ua/engine/engine-all.json'); var os = readJsonFiles('test/data/ua/os'); -var { Headers } = require('node-fetch'); +var { Headers } = require('undici'); function readJsonFiles(dir) { var list = []; @@ -91,6 +91,34 @@ describe('Returns', function () { }); done(); }); + + it('works even when Array.prototype has been mangled', function(done) { + const result = withMangledArrayProto(() => new UAParser('').getResult()); + + function withMangledArrayProto(fn, key = 'isEmpty', value = function() { return this.length === 0; }) { + const originalValue = Array.prototype[key]; + const restore = Object.hasOwnProperty.call(Array.prototype, key) + ? () => Array.prototype[key] = originalValue + : () => delete Array.prototype[key]; + + Array.prototype[key] = value; + const result = fn(); + restore(); + + return result; + } + + assert.deepEqual(result, + { + ua : '', + browser: { name: undefined, version: undefined, major: undefined, type: undefined }, + cpu: { architecture: undefined }, + device: { vendor: undefined, model: undefined, type: undefined }, + engine: { name: undefined, version: undefined}, + os: { name: undefined, version: undefined } + }); + done(); + }); }); describe('Extending Regex', function () { @@ -353,4 +381,18 @@ describe('Read user-agent data from req.headers', function () { const { browser } = UAParser(reqHeaders); assert.strictEqual(browser.is('Midori'), true); }); -}); \ No newline at end of file + + it('Headers field name should be case insensitive', function () { + const hEaDeRs = { + 'uSeR-aGenT' : 'Midori/0.2.2 (X11; Linux i686; U; en-us) WebKit/531.2+' + }; + const { browser } = UAParser(hEaDeRs); + assert.strictEqual(browser.toString(), "Midori 0.2.2"); + }); + + it('Empty headers should not raise any error', function () { + const emptyHeaders = {}; + const { browser } = UAParser(emptyHeaders); + assert.strictEqual(browser.toString(), "undefined"); + }); +}); diff --git a/test/unit/ua-ch.js b/test/unit/ua-ch.js index 7d12d50..fd49f72 100644 --- a/test/unit/ua-ch.js +++ b/test/unit/ua-ch.js @@ -1,5 +1,7 @@ const assert = require('assert'); const { UAParser } = require('../../src/main/ua-parser'); +const { BrowserName, CPUArch, DeviceType, DeviceVendor, EngineName, OSName } = require('../../src/enums/ua-parser-enums'); +const UACHTests = require('../data/ua-ch/headers'); describe('Map UA-CH headers', () => { @@ -25,27 +27,27 @@ describe('Map UA-CH headers', () => { it('Can read from client-hints headers using `withClientHints()`', () => { assert.strictEqual(uap.ua, "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"); - assert.strictEqual(uap.browser.name, "Chrome"); + assert.strictEqual(uap.browser.name, BrowserName.CHROME); assert.strictEqual(uap.browser.version, "93.0.1.2"); assert.strictEqual(uap.browser.major, "93"); - assert.strictEqual(browser.name, "Chrome"); + assert.strictEqual(browser.name, BrowserName.CHROME); assert.strictEqual(browser.version, "93.0.1.2"); assert.strictEqual(browser.major, "93"); - assert.strictEqual(uap.cpu.architecture, "arm64"); - assert.strictEqual(cpu.architecture, "arm64"); - assert.strictEqual(uap.device.type, "mobile"); + assert.strictEqual(uap.cpu.architecture, CPUArch.ARM_64); + assert.strictEqual(cpu.architecture, CPUArch.ARM_64); + assert.strictEqual(uap.device.type, DeviceType.MOBILE); assert.strictEqual(uap.device.model, "Pixel 99"); - assert.strictEqual(uap.device.vendor, "Google"); - assert.strictEqual(device.type, "mobile"); + assert.strictEqual(uap.device.vendor, DeviceVendor.GOOGLE); + assert.strictEqual(device.type, DeviceType.MOBILE); assert.strictEqual(device.model, "Pixel 99"); - assert.strictEqual(device.vendor, "Google"); - assert.strictEqual(uap.engine.name, 'Blink'); + assert.strictEqual(device.vendor, DeviceVendor.GOOGLE); + assert.strictEqual(uap.engine.name, EngineName.BLINK); assert.strictEqual(uap.engine.version, '93.0.1.2'); - assert.strictEqual(engine.name, 'Blink'); + assert.strictEqual(engine.name, EngineName.BLINK); assert.strictEqual(engine.version, '93.0.1.2'); - assert.strictEqual(uap.os.name, "Windows"); + assert.strictEqual(uap.os.name, OSName.WINDOWS); assert.strictEqual(uap.os.version, "11"); - assert.strictEqual(os.name, "Windows"); + assert.strictEqual(os.name, OSName.WINDOWS); assert.strictEqual(os.version, "11"); }); @@ -58,16 +60,16 @@ describe('Map UA-CH headers', () => { engine = new UAParser(headers).getEngine(); os = new UAParser(headers).getOS(); - assert.strictEqual(uap.browser.name, "Chrome"); + assert.strictEqual(uap.browser.name, BrowserName.CHROME); assert.strictEqual(uap.browser.version, "110.0.0.0"); assert.strictEqual(uap.browser.major, "110"); - assert.strictEqual(uap.cpu.architecture, "amd64"); + assert.strictEqual(uap.cpu.architecture, CPUArch.X86_64); assert.strictEqual(uap.device.type, undefined); assert.strictEqual(uap.device.model, undefined); assert.strictEqual(uap.device.vendor, undefined); - assert.strictEqual(uap.engine.name, 'Blink'); + assert.strictEqual(uap.engine.name, EngineName.BLINK); assert.strictEqual(uap.engine.version, '110.0.0.0'); - assert.strictEqual(uap.os.name, "Linux"); + assert.strictEqual(uap.os.name, OSName.LINUX); assert.strictEqual(uap.os.version, undefined); }); @@ -80,16 +82,16 @@ describe('Map UA-CH headers', () => { uap = UAParser(headers2).withClientHints(); - assert.strictEqual(uap.browser.name, "Chrome"); + assert.strictEqual(uap.browser.name, BrowserName.CHROME); assert.strictEqual(uap.browser.version, "110.0.0.0"); assert.strictEqual(uap.browser.major, "110"); - assert.strictEqual(uap.cpu.architecture, "amd64"); - assert.strictEqual(uap.device.type, "mobile"); + assert.strictEqual(uap.cpu.architecture, CPUArch.X86_64); + assert.strictEqual(uap.device.type, DeviceType.MOBILE); assert.strictEqual(uap.device.model, undefined); assert.strictEqual(uap.device.vendor, undefined); - assert.strictEqual(uap.engine.name, 'Blink'); + assert.strictEqual(uap.engine.name, EngineName.BLINK); assert.strictEqual(uap.engine.version, '110.0.0.0'); - assert.strictEqual(uap.os.name, "Linux"); + assert.strictEqual(uap.os.name, OSName.LINUX); assert.strictEqual(uap.os.version, undefined); }); @@ -116,10 +118,10 @@ describe('Map UA-CH headers', () => { } */ - assert.strictEqual(ua.os.is("macOS"), true); - assert.strictEqual(ua.cpu.is("arm"), true); - assert.strictEqual(ua.device.is("mobile"), false); - assert.strictEqual(ua.device.is("tablet"), false); + assert.strictEqual(ua.os.is(OSName.MACOS), true); + assert.strictEqual(ua.cpu.is(CPUArch.ARM), true); + assert.strictEqual(ua.device.is(DeviceType.MOBILE), false); + assert.strictEqual(ua.device.is(DeviceType.TABLET), false); }); }); @@ -138,11 +140,11 @@ describe('Map UA-CH headers', () => { }; UAParser(FFVR).withClientHints().then(ua => { - assert.strictEqual(ua.device.type, 'xr'); + assert.strictEqual(ua.device.type, DeviceType.XR); }); UAParser(FFEInk).withClientHints().then(ua => { - assert.strictEqual(ua.device.type, 'tablet'); + assert.strictEqual(ua.device.type, DeviceType.TABLET); }); @@ -168,7 +170,7 @@ describe('Map UA-CH headers', () => { uap = UAParser(headers2).withClientHints(); - assert.strictEqual(uap.browser.name, "Chrome"); + assert.strictEqual(uap.browser.name, BrowserName.CHROME); assert.strictEqual(uap.browser.version, undefined); assert.strictEqual(uap.browser.major, undefined); }); @@ -195,258 +197,37 @@ describe('Map UA-CH headers', () => { }; uap = UAParser(headers3a).withClientHints(); - assert.strictEqual(uap.browser.name, "Chrome"); + assert.strictEqual(uap.browser.name, BrowserName.CHROME); assert.strictEqual(uap.browser.version, "120.0.6099.132"); uap = UAParser(headers3b).withClientHints(); - assert.strictEqual(uap.browser.name, "Chrome"); + assert.strictEqual(uap.browser.name, BrowserName.CHROME); assert.strictEqual(uap.browser.version, "120.0.6099.132"); uap = UAParser(headers3c).withClientHints(); - assert.strictEqual(uap.browser.name, "Chrome"); + assert.strictEqual(uap.browser.name, BrowserName.CHROME); assert.strictEqual(uap.browser.version, "120.0.6099.132"); uap = UAParser(headers3d).withClientHints(); - assert.strictEqual(uap.browser.name, "Edge"); + assert.strictEqual(uap.browser.name, BrowserName.EDGE); assert.strictEqual(uap.browser.version, "120.0.6099.133"); uap = UAParser(headers3e).withClientHints(); - assert.strictEqual(uap.browser.name, "Edge"); + assert.strictEqual(uap.browser.name, BrowserName.EDGE); assert.strictEqual(uap.browser.version, "120.0.6099.133"); uap = UAParser(headers3f).withClientHints(); - assert.strictEqual(uap.browser.name, "Edge"); + assert.strictEqual(uap.browser.name, BrowserName.EDGE); assert.strictEqual(uap.browser.version, "120.0.6099.133"); }); }); describe('UA-CH Headers tests', () => { - [ - { - headers : { - 'sec-ch-ua': '"Avast Secure Browser";v="131", "Chromium";v="131", "Not_A Brand";v="24"' - }, - expect: { - browser : { - name : 'Avast Secure Browser', - version : '131', - major : '131', - type : undefined - } - } - }, - { - headers : { - 'sec-ch-ua': '"Not A(Brand";v="8", "Chromium";v="132", "Brave";v="132"' - }, - expect: { - browser : { - name : 'Brave', - version : '132', - major : '132', - type : undefined - } - } - }, - { - headers : { - 'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"' - }, - expect: { - browser : { - name : 'Chrome', - version : '111', - major : '111', - type : undefined - } - } - }, - { - headers : { - 'sec-ch-ua': '"Chromium";v="124", "HeadlessChrome";v="124", "Not-A.Brand";v="99"' - }, - expect: { - browser : { - name : 'Chrome Headless', - version : '124', - major : '124', - type : undefined - } - } - }, - { - headers : { - 'sec-ch-ua': '"Android WebView";v="123", "Not:A-Brand";v="8", "Chromium";v="123"' - }, - expect: { - browser : { - name : 'Chrome WebView', - version : '123', - major : '123', - type : undefined - } - } - }, - { - headers : { - 'sec-ch-ua': '"DuckDuckGo";v="131", "Chromium";v="131", "Not_A Brand";v="24"' - }, - expect : { - browser : { - name : 'DuckDuckGo', - version : '131', - major : '131', - type : undefined - } - } - }, - { - headers : { - 'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Microsoft Edge";v="120"' - }, - expect: { - browser : { - name : 'Edge', - version : '120', - major : '120', - type : undefined - } - } - }, - { - headers : { - 'sec-ch-ua': '" Not;A Brand";v="99", "Microsoft Edge";v="103", "Chromium";v="103", "Microsoft Edge WebView2";v="104"' - }, - expect: { - browser : { - name : 'Edge WebView2', - version : '104', - major : '104', - type : undefined - } - } - }, - { - headers : { - 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "HuaweiBrowser";v="114"' - }, - expect: { - browser : { - name : 'Huawei Browser', - version : '114', - major : '114', - type : undefined - } - } - }, - { - headers : { - 'sec-ch-ua': '"Miui Browser";v="123", "Not:A-Brand";v="8", "Chromium";v="123"' - }, - expect: { - browser : { - name : 'MIUI Browser', - version : '123', - major : '123', - type : undefined - } - } - }, - { - headers : { - 'sec-ch-ua': '"Chromium";v="130", "Oculus Browser";v="36", "Not?A_Brand";v="99"' - }, - expect: { - browser : { - name : 'Oculus Browser', - version : '36', - major : '36', - type : undefined - } - } - }, - { - headers : { - 'sec-ch-ua': '"Opera";v="116", "Chromium";v="131", "Not_A Brand";v="24"' - }, - expect: { - browser : { - name : 'Opera', - version : '116', - major : '116', - type : undefined - } - } - }, - { - headers : { - 'sec-ch-ua': '"Chromium";v="128", "Not;A=Brand";v="24", "Opera GX";v="114"' - }, - expect: { - browser : { - name : 'Opera GX', - version : '114', - major : '114', - type : undefined - } - } - }, - { - headers : { - 'sec-ch-ua': '"OperaMobile";v="86", ";Not A Brand";v="99", "Opera";v="115", "Chromium";v="130"' - }, - expect: { - browser : { - name : 'Opera Mobi', - version : '86', - major : '86', - type : undefined - } - } - }, - { - headers : { - 'sec-ch-ua': '"Chromium";v="132", "OperaMobile";v="87", "Opera";v="117", " Not A;Brand";v="99"' - }, - expect: { - browser : { - name : 'Opera Mobi', - version : '87', - major : '87', - type : undefined - } - } - }, - { - headers : { - 'sec-ch-ua': '"Chromium";v="125", "Not.A/Brand";v="24", "Samsung Internet";v="27.0"' - }, - expect: { - browser : { - name : 'Samsung Internet', - version : '27.0', - major : '27', - type : undefined - } - } - }, - { - headers : { - 'sec-ch-ua': '"Chromium";v="130", "YaBrowser";v="24.12", "Not?A_Brand";v="99", "Yowser";v="2.5"' - }, - expect: { - browser : { - name : 'Yandex', - version : '24.12', - major : '24', - type : undefined - } - } - }, - ] - .forEach(test => { - const { browser } = UAParser(test.headers).withClientHints(); - assert.deepEqual(browser, test.expect.browser); + UACHTests.forEach(test => { + it(`Test for ${test.desc}`, () => { + const { browser } = UAParser(test.headers).withClientHints(); + assert.deepEqual(browser, test.expect.browser); + }); }); }); @@ -455,169 +236,169 @@ describe('Identify vendor & type of device from given model name', () => { { model: '220733SG', expect: { - vendor : 'Xiaomi', - type : 'mobile' + vendor : DeviceVendor.XIAOMI, + type : DeviceType.MOBILE } }, { model: '5087Z', expect: { - vendor : 'TCL', - type : 'mobile' + vendor : DeviceVendor.TCL, + type : DeviceType.MOBILE } }, { model: '9137W', expect: { - vendor : 'TCL', - type : 'tablet' + vendor : DeviceVendor.TCL, + type : DeviceType.TABLET } }, { model: 'BE2015', expect: { - vendor : 'OnePlus', - type : 'mobile' + vendor : DeviceVendor.ONEPLUS, + type : DeviceType.MOBILE } }, { model: 'CPH2389', expect: { - vendor : 'OnePlus', - type : 'mobile' + vendor : DeviceVendor.ONEPLUS, + type : DeviceType.MOBILE } }, { model: 'Infinix X669C', expect: { - vendor : 'Infinix', - type : 'mobile' + vendor : DeviceVendor.INFINIX, + type : DeviceType.MOBILE } }, { model: 'itel L6502', expect: { - vendor : 'itel', - type : 'mobile' + vendor : DeviceVendor.ITEL, + type : DeviceType.MOBILE } }, { model: 'Lenovo TB-X606F', expect: { - vendor : 'Lenovo', - type : 'tablet' + vendor : DeviceVendor.LENOVO, + type : DeviceType.TABLET } }, { model: 'LM-Q720', expect: { - vendor : 'LG', - type : 'mobile' + vendor : DeviceVendor.LG, + type : DeviceType.MOBILE } }, { model: 'M2003J15SC', expect: { - vendor : 'Xiaomi', - type : 'mobile' + vendor : DeviceVendor.XIAOMI, + type : DeviceType.MOBILE } }, { model: 'MAR-LX1A', expect: { - vendor : 'Huawei', - type : 'mobile' + vendor : DeviceVendor.HUAWEI, + type : DeviceType.MOBILE } }, { model: 'moto g(20)', expect: { - vendor : 'Motorola', - type : 'mobile' + vendor : DeviceVendor.MOTOROLA, + type : DeviceType.MOBILE } }, { model: 'Nokia C210', expect: { - vendor : 'Nokia', - type : 'mobile' + vendor : DeviceVendor.NOKIA, + type : DeviceType.MOBILE } }, { model: 'Pixel 8', expect: { - vendor : 'Google', - type : 'mobile' + vendor : DeviceVendor.GOOGLE, + type : DeviceType.MOBILE } }, { model: 'Redmi Note 9S', expect: { - vendor : 'Xiaomi', - type : 'mobile' + vendor : DeviceVendor.XIAOMI, + type : DeviceType.MOBILE } }, { model: 'RMX3830', expect: { - vendor : 'Realme', - type : 'mobile' + vendor : DeviceVendor.REALME, + type : DeviceType.MOBILE } }, { model: 'SM-S536DL', expect: { - vendor : 'Samsung', - type : 'mobile' + vendor : DeviceVendor.SAMSUNG, + type : DeviceType.MOBILE } }, { model: 'SM-S546VL', expect: { - vendor : 'Samsung', - type : 'mobile' + vendor : DeviceVendor.SAMSUNG, + type : DeviceType.MOBILE } }, { model: 'SM-T875', expect: { - vendor : 'Samsung', - type : 'tablet' + vendor : DeviceVendor.SAMSUNG, + type : DeviceType.TABLET } }, { model: 'STK-L21', expect: { - vendor : 'Huawei', - type : 'mobile' + vendor : DeviceVendor.HUAWEI, + type : DeviceType.MOBILE } }, { model: 'T430W', expect: { - vendor : 'TCL', - type : 'mobile' + vendor : DeviceVendor.TCL, + type : DeviceType.MOBILE } }, { model: 'TECNO KI5k', expect: { - vendor : 'TECNO', - type : 'mobile' + vendor : DeviceVendor.TECNO, + type : DeviceType.MOBILE } }, { model: 'vivo 1820', expect: { - vendor : 'Vivo', - type : 'mobile' + vendor : DeviceVendor.VIVO, + type : DeviceType.MOBILE } }, { model: 'Xbox', expect: { - vendor : 'Microsoft', - type : 'console' + vendor : DeviceVendor.MICROSOFT, + type : DeviceType.CONSOLE } } ]