diff --git a/CHANGELOG.md b/CHANGELOG.md
index 80dfe6423..63d6bf0f7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,25 @@
# UAParser.js Changelog
+## Version 2.0.0-rc.1
+
+- Fix Python Request mistakenly identified as Meta Quest
+- Add new browser: Helio
+- Add new device: itel, Nothing, Pico, TCL
+- Add new engine: ArkWeb
+- Add new OS: OpenHarmony, Pico
+- Improve browser detection: Quark
+- Improve device detection: Xiaomi, Amazon Echo Show, Google Chromecast, Samsung Galaxy Watch
+- `ua-parser-js/helpers` submodule:
+ - Add new method:
+ - `getDeviceVendor()` to guess for a device vendor based on its model name
+ - `isElectron()` to check if current window is running inside Electron
+ - `isFromEU()` to check if current window is from an EU (European Union) country
+ - `isStandalonePWA()` to check if current window is a standalone PWA
+ - 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`
+
## Version 2.0.0-beta.3
- Breaking:
diff --git a/README.md b/README.md
index 57e0473bf..701add0cd 100644
--- a/README.md
+++ b/README.md
@@ -19,81 +19,14 @@ The most comprehensive, compact, & up-to-date isomorphic JavaScript library to d
user's Browser, Engine, OS, CPU, and Device type/model. Runs either in browser
(client-side) or node.js (server-side).
-# Overview
-
-```js
-import { UAParser } from 'ua-parser-js';
-
-// 1. Problem:
-// Imagine getting this wild user-agent string from a visitor:
-const ua = `Mozilla/5.0 (Linux; Android 10; STK-LX1
-Build/HONORSTK-LX1; wv) AppleWebKit/537.36 (KHTML,
-like Gecko) Version/4.0 Chrome/110.0.5481.153 Mobile
-Safari/537.36 musical_ly_2022803040 JsSdk/1.0
-NetType/WIFI Channel/huaweiadsglobal_int
-AppName/musical_ly app_version/28.3.4 ByteLocale/en
-ByteFullLocale/en Region/IQ Spark/1.2.7-alpha.8
-AppVersion/28.3.4 PIA/1.5.11 BytedanceWebview/d8a21c6`;
-// Note: this is a real user-agent (what???)
-
-// 2. Solution:
-// Just pass the complex user-agent string to `UAParser`
-const parser = new UAParser(ua);
-
-// 3. Result:
-// And voila!
-console.log(parser.getBrowser());
-// { name : "TikTok", version : "28.3.4", major : "28", type: undefined }
-
-console.log(parser.getCPU());
-// { architecture : undefined }
-
-console.log(parser.getEngine());
-// { name : "Blink", version : "110.0.5481.153" }
-
-console.log(parser.getDevice());
-// { type : "mobile", vendor : "Huawei", model : "STK-LX1" }
-
-console.log(parser.getOS());
-// { name : "Android", version : "10" }
-
-console.log(parser.getResult());
-/*
-{
- ua: "Mozilla/5.0 (Linux; Android 10; STK-LX1 Build/HONORSTK-LX1; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/110.0.5481.153 Mobile Safari/537.36 musical_ly_2022803040 JsSdk/1.0 NetType/WIFI Channel/huaweiadsglobal_int AppName/musical_ly app_version/28.3.4 ByteLocale/en ByteFullLocale/en Region/IQ Spark/1.2.7-alpha.8 AppVersion/28.3.4 PIA/1.5.11 BytedanceWebview/d8a21c6",
- browser: {
- name: "TikTok",
- version: "28.3.4",
- major: "28"
- },
- cpu: {},
- device: {
- type: "mobile",
- model: "STK-LX1",
- vendor: "Huawei"
- },
- engine: {
- name: "Blink",
- version: "110.0.5481.153"
- },
- os: {
- name: "Android",
- version: "10"
- }
-}
-*/
-
-// 4. Conclusion:
-// The visitor is browsing from a TikTok app using an Android-powered Huawei device
-// Phew! Thanks, UAParser.js!
-```
+# Demo
* Live demo: https://uaparser.dev
# Documentation
- * v1.0: https://github.com/faisalman/ua-parser-js/tree/1.0.38#documentation
- * v2.0: https://docs.uaparser.dev
+ * `version 1.x` : https://github.com/faisalman/ua-parser-js/tree/1.0.x#documentation
+ * `version 2.x` : https://docs.uaparser.dev
Before upgrading from `v0.7` / `v1.0`, please read [CHANGELOG](CHANGELOG.md) to
see what's new & breaking.
@@ -234,7 +167,7 @@ see what's new & breaking.
✅ |
✅ |
✅ |
- ⚠️ |
+ ⛔️ |
✅ |
@@ -257,9 +190,9 @@ see what's new & breaking.
Price |
FREE (License) |
FREE (License) |
- $12 (License) |
- $25 (License) |
- $500 (License) |
+ $14 (License) |
+ $29 (License) |
+ $588 (License) |
@@ -287,3 +220,5 @@ 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).
diff --git a/dist/ua-parser.min.js b/dist/ua-parser.min.js
index 8819c5a6f..4187195e4 100644
--- a/dist/ua-parser.min.js
+++ b/dist/ua-parser.min.js
@@ -1,4 +1,4 @@
-/* UAParser.js v2.0.0-beta.3
+/* UAParser.js v2.0.0-rc.1
Copyright © 2012-2024 Faisal Salman
AGPLv3 License */
-(function(window,undefined){"use strict";var LIBVERSION="2.0.0-beta.3",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",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",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