diff --git a/CHANGELOG.md b/CHANGELOG.md
index 52575f0..3a16881 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,6 @@
# UAParser.js Changelog
+# Version 2.0
## Migrating from v1 to v2
- What's breaking:
@@ -8,28 +9,38 @@
- OS detection: `"Mac OS" => "macOS"`, `"Chromium OS" => "Chrome OS"`
- What's new:
- New device type: `xr`, to identify AR/VR devices
- - New browser property: `browser.type`, to identify the type of the browser: `crawler`, `cli`, `email`, `fetcher`, `inapp`, `mediaplayer`, `module`
+ - New browser property: `browser.type`, to identify the type of the browser: `crawler`, `cli`, `email`, `fetcher`, `inapp`, `library`, `mediaplayer`
- New methods in result object (all of `get*()` return value):
- - Support for client hints: `withClientHints()`
- - Support for feature detection: `withFeatureCheck()`
+ - Enhance detection using client hints: `withClientHints()`
+ - Enhance detection using feature check: `withFeatureCheck()`
- Utility for easy comparison: `is()`
- Utility to print full-name: `toString()`
- - Parse directly from command line using `npx ua-parser-js`
+ - Parse user-agent directly from command line using `npx ua-parser-js "[User-Agent]"`
- Extensions can be passed as a list to `UAParser()`
- Support for ES module & TypeScript `import { UAParser } from 'ua-parser-js'`
- Provided Enums submodule `'ua-parser-js/enums'`
- Provided Extensions submodule `'ua-parser-js/extensions'`
- Provided Helpers submodule `'ua-parser-js/helpers'`:
- - `getDeviceVendor()` to guess for a device vendor based on its model name
- - `isAppleSilicon()` to check if the device has Apple Silicon Mac device properties
- - `isBot()` to check if the browser is identified as a bot
- - `isChromeFamily()` to check if the browser is Chrome-based / has Blink engine (i.e: New Opera, New Edge, Vivaldi, Brave, Arc, etc.)
- - `isElectron()` to check if current window is running inside Electron
- - `isFromEU()` to check if current window is from an EU (European Union) country
- - `isFrozenUA()` to check if a user-agent string match with the reduced/frozen user-agent pattern
- - `isStandalonePWA()` to check if current window is a standalone PWA
+ - `getDeviceVendor()`: guess for a device vendor based on its model name
+ - `isAppleSilicon()`: check if the device has Apple Silicon Mac device properties
+ - `isBot()`: check if the browser is identified as a bot
+ - `isChromeFamily()`: check if the browser is Chrome-based (has Blink engine, i.e: New Opera, New Edge, Vivaldi, Brave, Arc, etc.)
+ - `isElectron()`: check if current window is running inside Electron
+ - `isFromEU()`: check if current window is from an EU (European Union) country
+ - `isFrozenUA()`: check if a user-agent string match with the reduced/frozen user-agent pattern
+ - `isStandalonePWA()`: check if current window is a standalone PWA
---
+---
+
+## Version 2.0.0-rc.3
+
+- Add support for Headers object
+- Add new device: Advan, Cat, Energizer, Honor, IMO, Micromax, Smartfren
+- Add new engine: Servo
+- `ua-parser-js/extensions` submodule:
+ - Breaking change: rename `module` to `library`
+ - Add new email clients: Evolution, KMail, Kontact
+ - Add new bots: 360Spider, Archive.org Bots, CCBot, DataForSeoBot, DuckAssistBot, Exabot, Google Bots, Meta Bots, MojeekBot, PerplexityBot, PetalBot, TurnitinBot, Yeti, YisouSpider
## Version 2.0.0-rc.2
@@ -59,7 +70,7 @@
- Rename `isChromiumBased()` to `isChromeFamily()`
- Update `isAppleSilicon()` to also checks for WebGL renderer info
- `ua-parser-js/extensions` submodule:
- - Restore `bots` as a compilation of all these browser types: `clis`, `crawlers`, `fetchers`, and `modules`
+ - Restore `Bots` as a compilation of all these browser types: `cli`, `crawler`, `fetcher`, and `library`
## Version 2.0.0-beta.3
diff --git a/README.md b/README.md
index 701add0..7b0aa5f 100644
--- a/README.md
+++ b/README.md
@@ -44,15 +44,15 @@ see what's new & breaking.
License options |
- MIT (v1.x) |
- AGPL (v2.x) |
+ MIT (v0.7~v1.0) |
+ AGPL (>=v2.0) |
PRO Personal |
PRO Business |
PRO Enterprise |
Browser detection |
- ⚠️ |
+ ⚠️ |
✅ |
✅ |
✅ |
@@ -60,7 +60,7 @@ see what's new & breaking.
CPU detection |
- ⚠️ |
+ ⚠️ |
✅ |
✅ |
✅ |
@@ -68,7 +68,7 @@ see what's new & breaking.
Device detection |
- ⚠️ |
+ ⚠️ |
✅ |
✅ |
✅ |
@@ -76,7 +76,7 @@ see what's new & breaking.
Engine detection |
- ⚠️ |
+ ⚠️ |
✅ |
✅ |
✅ |
@@ -84,15 +84,31 @@ see what's new & breaking.
OS detection |
- ⚠️ |
+ ⚠️ |
✅ |
✅ |
✅ |
✅ |
- Enhanced detection |
- ⛔️ |
+ Bot detection |
+ ❌ |
+ ✅ |
+ ✅ |
+ ✅ |
+ ✅ |
+
+
+ Extras (Apps, Libs, Emails, Media Players, etc) |
+ ❌ |
+ ✅ |
+ ✅ |
+ ✅ |
+ ✅ |
+
+
+ Enhanced detection result |
+ ❌ |
✅ |
✅ |
✅ |
@@ -100,15 +116,7 @@ see what's new & breaking.
Client Hints support |
- ⛔️ |
- ✅ |
- ✅ |
- ✅ |
- ✅ |
-
-
- Extras (Apps, Bots, Libs, Emails, Media Players, etc) |
- ⛔️ |
+ ❌ |
✅ |
✅ |
✅ |
@@ -124,14 +132,14 @@ see what's new & breaking.
ES modules support |
- ⛔️ |
+ ❌ |
✅ |
✅ |
✅ |
✅ |
- npm module available |
+ npm module |
✅ |
✅ |
✅ |
@@ -139,25 +147,25 @@ see what's new & breaking.
✅ |
- TypeScript declarations available |
- ⚠️ |
+ TypeScript declarations |
+ ⚠️ |
✅ |
✅ |
✅ |
✅ |
- Allowed for commercial use |
+ Allows commercial use |
✅ |
✅ |
- ⛔️ |
+ ❌ |
✅ |
✅ |
Permissive (non-copyleft) license |
✅ |
- ⛔️ |
+ ❌ |
✅ |
✅ |
✅ |
@@ -167,13 +175,13 @@ see what's new & breaking.
✅ |
✅ |
✅ |
- ⛔️ |
+ ❌ |
✅ |
- 1-year support |
- ⛔️ |
- ⛔️ |
+ 1-year product support |
+ ❌ |
+ ❌ |
✅ |
✅ |
✅ |
@@ -192,13 +200,13 @@ see what's new & breaking.
FREE (License) |
$14 (License) |
$29 (License) |
- $588 (License) |
+ $599 (License) |
- GET THE PRO PACKAGES 📥
+
|
@@ -221,4 +229,4 @@ Made with [contributors-img](https://contrib.rocks).
-Support the open-source versions of UAParser.js on [OpenCollective](https://opencollective.com/ua-parser-js) or [GitHub Sponsors](https://github.com/sponsors/faisalman).
+Support the open-source editions of UAParser.js on [OpenCollective](https://opencollective.com/ua-parser-js) or [GitHub Sponsors](https://github.com/sponsors/faisalman).
diff --git a/dist/ua-parser.min.js b/dist/ua-parser.min.js
index 1851203..bfc76aa 100644
--- a/dist/ua-parser.min.js
+++ b/dist/ua-parser.min.js
@@ -1,4 +1,4 @@
-/* UAParser.js v2.0.0-rc.2
+/* UAParser.js v2.0.0-rc.3
Copyright © 2012-2024 Faisal Salman
AGPLv3 License */
-(function(window,undefined){"use strict";var LIBVERSION="2.0.0-rc.2",EMPTY="",UNKNOWN="?",FUNC_TYPE="function",UNDEF_TYPE="undefined",OBJ_TYPE="object",STR_TYPE="string",MAJOR="major",MODEL="model",NAME="name",TYPE="type",VENDOR="vendor",VERSION="version",ARCHITECTURE="architecture",CONSOLE="console",MOBILE="mobile",TABLET="tablet",SMARTTV="smarttv",WEARABLE="wearable",XR="xr",EMBEDDED="embedded",INAPP="inapp",USER_AGENT="user-agent",UA_MAX_LENGTH=500,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],UA_BROWSER="browser",UA_CPU="cpu",UA_DEVICE="device",UA_ENGINE="engine",UA_OS="os",UA_RESULT="result",AMAZON="Amazon",APPLE="Apple",ASUS="ASUS",BLACKBERRY="BlackBerry",GOOGLE="Google",HUAWEI="Huawei",LENOVO="Lenovo",LG="LG",MICROSOFT="Microsoft",MOTOROLA="Motorola",SAMSUNG="Samsung",SHARP="Sharp",SONY="Sony",XIAOMI="Xiaomi",ZEBRA="Zebra",PREFIX_MOBILE="Mobile ",SUFFIX_BROWSER=" Browser",CHROME="Chrome",CHROMECAST="Chromecast",EDGE="Edge",FIREFOX="Firefox",OPERA="Opera",FACEBOOK="Facebook",SOGOU="Sogou",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(str1[i])==lowerize(str2))return true}return false}return isString(str1)?lowerize(str2).indexOf(lowerize(str1))!==-1: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)){this[q[0]]=match?q[1].call(this,match,q[2]):undefined}else{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{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