From 3ea5721e86bc6d5860c9a53cc9d82b16791df54b Mon Sep 17 00:00:00 2001
From: Faisal Salman
Date: Fri, 5 Sep 2025 21:43:09 +0700
Subject: [PATCH] Bump version `2.0.5`
---
CHANGELOG.md | 39 +++
README.md | 71 +++--
dist/ua-parser.min.js | 4 +-
dist/ua-parser.min.mjs | 4 +-
dist/ua-parser.pack.js | 4 +-
dist/ua-parser.pack.mjs | 4 +-
package-lock.json | 46 +--
package.json | 2 +-
src/enums/ua-parser-enums.d.ts | 85 ++++--
src/enums/ua-parser-enums.js | 5 +-
src/enums/ua-parser-enums.mjs | 362 ++++++++++++++++++++++-
src/extensions/ua-parser-extensions.d.ts | 2 +-
src/extensions/ua-parser-extensions.js | 6 +-
src/extensions/ua-parser-extensions.mjs | 53 +++-
src/helpers/ua-parser-helpers.d.ts | 2 +-
src/helpers/ua-parser-helpers.js | 2 +-
src/helpers/ua-parser-helpers.mjs | 132 ++++++---
src/main/ua-parser.d.ts | 2 +-
src/main/ua-parser.js | 4 +-
src/main/ua-parser.mjs | 54 ++--
test/data/ua/extension/fetcher.json | 10 -
21 files changed, 678 insertions(+), 215 deletions(-)
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 0ea5465..79c1f73 100644
--- a/README.md
+++ b/README.md
@@ -12,13 +12,12 @@
+
# UAParser.js
-The most comprehensive, compact, & up-to-date isomorphic JavaScript library to detect
-user's Browser, Engine, OS, CPU, and Device type/model. Runs either in browser
-(client-side) or node.js (server-side).
+The most comprehensive, compact, and up-to-date JavaScript library to detect user's browser, OS, CPU, and device type/model. Also detect bots, apps, and more. Runs seamlessly in the browser (client-side) or Node.js (server-side).
# Demo
@@ -33,7 +32,7 @@ user's Browser, Engine, OS, CPU, and Device type/model. Runs either in browser
Before upgrading from `v0.7` / `v1.0`, please read [CHANGELOG](CHANGELOG.md) to
see what's new & breaking.
-# License Options
+# Package & Pricing
@@ -46,8 +45,8 @@ see what's new & breaking.
License options |
- MIT (v0.7~v1.0) |
- AGPL (>=v2.0) |
+ MIT (v1.x) |
+ AGPL (v2.x) |
PRO Personal |
PRO Business |
PRO Enterprise |
@@ -148,14 +147,6 @@ see what's new & breaking.
✅ |
✅ |
-
- npm module |
- ✅ |
- ✅ |
- ✅ |
- ✅ |
- ✅ |
-
TypeScript declarations |
⚠️ |
@@ -165,7 +156,23 @@ see what's new & breaking.
✅ |
- Allows commercial use |
+ npm module available |
+ ✅ |
+ ✅ |
+ ✅ |
+ ✅ |
+ ✅ |
+
+
+ Direct downloads available |
+ ✅ |
+ ✅ |
+ ✅ |
+ ✅ |
+ ✅ |
+
+
+ Allows commercial usage |
✅ |
✅ |
❌ |
@@ -181,11 +188,27 @@ see what's new & breaking.
✅ |
- Unlimited use per 1 license |
+ No open-source obligations |
+ ✅ |
+ ❌ |
✅ |
✅ |
✅ |
- ❌ |
+
+
+ Unlimited end-products |
+ ✅ |
+ ✅ |
+ ✅ |
+ ❌ |
+ ✅ |
+
+
+ Unlimited deployments |
+ ✅ |
+ ✅ |
+ ✅ |
+ ❌ |
✅ |
@@ -206,8 +229,8 @@ see what's new & breaking.
Price |
- FREE (License) |
- FREE (License) |
+ FREE* (License) |
+ FREE* (License) |
$14 (License) |
$29 (License) |
$599 (License) |
@@ -236,10 +259,7 @@ Made with [contributors-img](https://contrib.rocks).
## Backers & Sponsors
-
-
-
-You can support the open-source editions of UAParser.js through one of the following options:
+Support the **open-source editions** of UAParser.js through one of the following options:
[](https://opencollective.com/ua-parser-js)
@@ -248,4 +268,7 @@ You can support the open-source editions of UAParser.js through one of the follo
[](https://paypal.me/faisalman)
[](https://store.faisalman.com/buy/3d71f2f3-cf4d-473c-892a-9d4497c890be)
\ No newline at end of file
+)](https://store.faisalman.com/buy/3d71f2f3-cf4d-473c-892a-9d4497c890be)
+
+
+
\ No newline at end of file
diff --git a/dist/ua-parser.min.js b/dist/ua-parser.min.js
index 22782df..98f9ad6 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
AGPLv3 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){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;j