Bump version 2.0.8

This commit is contained in:
Faisal Salman
2026-01-13 15:56:31 +07:00
parent f1eed9e0b0
commit 7abb90bf3b
28 changed files with 1081 additions and 56 deletions

View File

@@ -76,6 +76,21 @@
--- ---
## Version 2.0.8
- Resolve syntax error related to import renaming in ESM build
- Add new browser: HiBrowser, Opera Neon
- Add new engine: Dillo
- Improve browser detection: Brave, TikTok
- Improve device detection: OnePlus
- Improve OS detection: Firefox OS
- `extensions` submodule:
- Add new CLI: PowerShell
- Add new email: Alpine, Android, AquaMail, Balsa, Barca, Canary, Claws Mail, eM Client, Eudora, FairEmail, Geary, Gnus, Horde::IMP, Lotus-Notes, IncrediMail, K-9 Mail, Mailbird, MailMate, Mailspring, Mutt, Newton, Nine, NylasMail, Outlook-Express, Pegasus Mail, PocoMail, Postbox, ProtonMail Bridge, Quala, R2Mail2, Rainloop, Roundcube Webmail, SamsungEmail, Spicebird, SquirrelMail, Sylpheed, The Bat!, Trojita, Turnpike, tutanota-desktop, Wanderlust, Windows-Live-Mail
- Add new library: http.rb, Jetty, ocaml-cohttp
- `helpers` submodule:
- Add new method: `getOutlookEdition()` to map Outlook versions to their marketing editions
## Version 2.0.7 ## Version 2.0.7
- Add support for chaining `withClientHints()` & `withFeatureCheck()` - Add support for chaining `withClientHints()` & `withFeatureCheck()`

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1001
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{ {
"title": "UAParser.js", "title": "UAParser.js",
"name": "ua-parser-js", "name": "ua-parser-js",
"version": "2.0.7", "version": "2.0.8",
"author": "Faisal Salman <f@faisalman.com> (http://faisalman.com)", "author": "Faisal Salman <f@faisalman.com> (http://faisalman.com)",
"description": "Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent & Client Hints data. Supports browser & node.js environment", "description": "Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent & Client Hints data. Supports browser & node.js environment",
"keywords": [ "keywords": [

View File

@@ -1,4 +1,4 @@
// Type definitions for bot-detection submodule of UAParser.js v2.0.7 // Type definitions for bot-detection submodule of UAParser.js v2.0.8
// Project: https://github.com/faisalman/ua-parser-js // Project: https://github.com/faisalman/ua-parser-js
// Definitions by: Faisal Salman <https://github.com/faisalman> // Definitions by: Faisal Salman <https://github.com/faisalman>

View File

@@ -1,5 +1,5 @@
////////////////////////////////////////////////// //////////////////////////////////////////////////
/* bot-detection submodule of UAParser.js v2.0.7 /* bot-detection submodule of UAParser.js v2.0.8
https://github.com/faisalman/ua-parser-js https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com> Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */ AGPLv3 License */

View File

@@ -3,7 +3,7 @@
// Source: /src/bot-detection/bot-detection.js // Source: /src/bot-detection/bot-detection.js
////////////////////////////////////////////////// //////////////////////////////////////////////////
/* bot-detection submodule of UAParser.js v2.0.7 /* bot-detection submodule of UAParser.js v2.0.8
https://github.com/faisalman/ua-parser-js https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com> Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */ AGPLv3 License */

View File

@@ -1,4 +1,4 @@
// Type definitions for browser-detection submodule of UAParser.js v2.0.7 // Type definitions for browser-detection submodule of UAParser.js v2.0.8
// Project: https://github.com/faisalman/ua-parser-js // Project: https://github.com/faisalman/ua-parser-js
// Definitions by: Faisal Salman <https://github.com/faisalman> // Definitions by: Faisal Salman <https://github.com/faisalman>

View File

@@ -1,5 +1,5 @@
////////////////////////////////////////////////////// //////////////////////////////////////////////////////
/* browser-detection submodule of UAParser.js v2.0.7 /* browser-detection submodule of UAParser.js v2.0.8
https://github.com/faisalman/ua-parser-js https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com> Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */ AGPLv3 License */

View File

@@ -3,7 +3,7 @@
// Source: /src/browser-detection/browser-detection.js // Source: /src/browser-detection/browser-detection.js
////////////////////////////////////////////////////// //////////////////////////////////////////////////////
/* browser-detection submodule of UAParser.js v2.0.7 /* browser-detection submodule of UAParser.js v2.0.8
https://github.com/faisalman/ua-parser-js https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com> Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */ AGPLv3 License */

View File

@@ -1,4 +1,4 @@
// Type definitions for device-detection submodule of UAParser.js v2.0.7 // Type definitions for device-detection submodule of UAParser.js v2.0.8
// Project: https://github.com/faisalman/ua-parser-js // Project: https://github.com/faisalman/ua-parser-js
// Definitions by: Faisal Salman <https://github.com/faisalman> // Definitions by: Faisal Salman <https://github.com/faisalman>

View File

@@ -1,5 +1,5 @@
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
/* device-detection submodule of UAParser.js v2.0.7 /* device-detection submodule of UAParser.js v2.0.8
https://github.com/faisalman/ua-parser-js https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com> Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */ AGPLv3 License */

View File

@@ -3,7 +3,7 @@
// Source: /src/device-detection/device-detection.js // Source: /src/device-detection/device-detection.js
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
/* device-detection submodule of UAParser.js v2.0.7 /* device-detection submodule of UAParser.js v2.0.8
https://github.com/faisalman/ua-parser-js https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com> Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */ AGPLv3 License */

View File

@@ -3,7 +3,7 @@
// Source: /src/enums/ua-parser-enums.js // Source: /src/enums/ua-parser-enums.js
/////////////////////////////////////////////// ///////////////////////////////////////////////
/* Enums for UAParser.js v2.0.7 /* Enums for UAParser.js v2.0.8
https://github.com/faisalman/ua-parser-js https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com> Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */ AGPLv3 License */
@@ -66,6 +66,7 @@ export const BrowserName: Readonly<{
GOOGLE_SEARCH: 'GSA', GOOGLE_SEARCH: 'GSA',
HELIO: 'Helio', HELIO: 'Helio',
HEYTAP: 'HeyTap', HEYTAP: 'HeyTap',
HIBROWSER: 'HiBrowser',
HONOR: 'Honor', HONOR: 'Honor',
HUAWEI: 'Huawei Browser', HUAWEI: 'Huawei Browser',
ICAB: 'iCab', ICAB: 'iCab',
@@ -116,6 +117,7 @@ export const BrowserName: Readonly<{
OPERA_GX: 'Opera GX', OPERA_GX: 'Opera GX',
OPERA_MINI: 'Opera Mini', OPERA_MINI: 'Opera Mini',
OPERA_MOBI: 'Opera Mobi', OPERA_MOBI: 'Opera Mobi',
OPERA_NEON: 'Opera Neon',
OPERA_TABLET: 'Opera Tablet', OPERA_TABLET: 'Opera Tablet',
OPERA_TOUCH: 'Opera Touch', OPERA_TOUCH: 'Opera Touch',
OTTER: 'Otter', OTTER: 'Otter',
@@ -316,6 +318,7 @@ export const EngineName: Readonly<{
AMAYA: 'Amaya', AMAYA: 'Amaya',
ARKWEB: 'ArkWeb', ARKWEB: 'ArkWeb',
BLINK: 'Blink', BLINK: 'Blink',
DILLO: 'Dillo',
EDGEHTML: 'EdgeHTML', EDGEHTML: 'EdgeHTML',
FLOW: 'Flow', FLOW: 'Flow',
GECKO: 'Gecko', GECKO: 'Gecko',
@@ -451,6 +454,7 @@ export const Extension: Readonly<{
ELINKS: 'ELinks', ELINKS: 'ELinks',
HTTPIE: 'HTTPie', HTTPIE: 'HTTPie',
LYNX: 'Lynx', LYNX: 'Lynx',
POWERSHELL: 'PowerShell',
WGET: 'Wget' WGET: 'Wget'
}, },
Crawler: { Crawler: {
@@ -763,8 +767,10 @@ export const Extension: Readonly<{
GOT: 'got', GOT: 'got',
GUZZLEHTTP: 'GuzzleHttp', GUZZLEHTTP: 'GuzzleHttp',
HACKNEY: 'hackney', HACKNEY: 'hackney',
HTTP_RB: 'http.rb',
JAVA: 'Java', JAVA: 'Java',
JAVA_HTTPCLIENT: 'Java-http-client', JAVA_HTTPCLIENT: 'Java-http-client',
JETTY: 'Jetty',
JSDOM: 'jsdom', JSDOM: 'jsdom',
LIBWWW_PERL: 'libwww-perl', LIBWWW_PERL: 'libwww-perl',
LUA_RESTY_HTTP: 'lua-resty-http', LUA_RESTY_HTTP: 'lua-resty-http',
@@ -774,6 +780,7 @@ export const Extension: Readonly<{
NODE_JS: 'Node.js', NODE_JS: 'Node.js',
NODE_SUPERAGENT: 'node-superagent', NODE_SUPERAGENT: 'node-superagent',
OKHTTP: 'OkHttp', OKHTTP: 'OkHttp',
OCAML_COHTTP: 'ocaml-cohttp',
PHP_SOAP: 'PHP-SOAP', PHP_SOAP: 'PHP-SOAP',
POSTMAN_RUNTIME: 'PostmanRuntime', POSTMAN_RUNTIME: 'PostmanRuntime',
PYTHON_HTTPX: 'python-httpx', PYTHON_HTTPX: 'python-httpx',

View File

@@ -1,5 +1,5 @@
/////////////////////////////////////////////// ///////////////////////////////////////////////
/* Enums for UAParser.js v2.0.7 /* Enums for UAParser.js v2.0.8
https://github.com/faisalman/ua-parser-js https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com> Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */ AGPLv3 License */

View File

@@ -3,7 +3,7 @@
// Source: /src/enums/ua-parser-enums.js // Source: /src/enums/ua-parser-enums.js
/////////////////////////////////////////////// ///////////////////////////////////////////////
/* Enums for UAParser.js v2.0.7 /* Enums for UAParser.js v2.0.8
https://github.com/faisalman/ua-parser-js https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com> Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */ AGPLv3 License */
@@ -66,6 +66,7 @@ const BrowserName = Object.freeze({
GOOGLE_SEARCH: 'GSA', GOOGLE_SEARCH: 'GSA',
HELIO: 'Helio', HELIO: 'Helio',
HEYTAP: 'HeyTap', HEYTAP: 'HeyTap',
HIBROWSER: 'HiBrowser',
HONOR: 'Honor', HONOR: 'Honor',
HUAWEI: 'Huawei Browser', HUAWEI: 'Huawei Browser',
ICAB: 'iCab', ICAB: 'iCab',
@@ -116,6 +117,7 @@ const BrowserName = Object.freeze({
OPERA_GX: 'Opera GX', OPERA_GX: 'Opera GX',
OPERA_MINI: 'Opera Mini', OPERA_MINI: 'Opera Mini',
OPERA_MOBI: 'Opera Mobi', OPERA_MOBI: 'Opera Mobi',
OPERA_NEON: 'Opera Neon',
OPERA_TABLET: 'Opera Tablet', OPERA_TABLET: 'Opera Tablet',
OPERA_TOUCH: 'Opera Touch', OPERA_TOUCH: 'Opera Touch',
OTTER: 'Otter', OTTER: 'Otter',
@@ -316,6 +318,7 @@ const EngineName = Object.freeze({
AMAYA: 'Amaya', AMAYA: 'Amaya',
ARKWEB: 'ArkWeb', ARKWEB: 'ArkWeb',
BLINK: 'Blink', BLINK: 'Blink',
DILLO: 'Dillo',
EDGEHTML: 'EdgeHTML', EDGEHTML: 'EdgeHTML',
FLOW: 'Flow', FLOW: 'Flow',
GECKO: 'Gecko', GECKO: 'Gecko',
@@ -451,6 +454,7 @@ const Extension = Object.freeze({
ELINKS: 'ELinks', ELINKS: 'ELinks',
HTTPIE: 'HTTPie', HTTPIE: 'HTTPie',
LYNX: 'Lynx', LYNX: 'Lynx',
POWERSHELL: 'PowerShell',
WGET: 'Wget' WGET: 'Wget'
}, },
Crawler: { Crawler: {
@@ -763,8 +767,10 @@ const Extension = Object.freeze({
GOT: 'got', GOT: 'got',
GUZZLEHTTP: 'GuzzleHttp', GUZZLEHTTP: 'GuzzleHttp',
HACKNEY: 'hackney', HACKNEY: 'hackney',
HTTP_RB: 'http.rb',
JAVA: 'Java', JAVA: 'Java',
JAVA_HTTPCLIENT: 'Java-http-client', JAVA_HTTPCLIENT: 'Java-http-client',
JETTY: 'Jetty',
JSDOM: 'jsdom', JSDOM: 'jsdom',
LIBWWW_PERL: 'libwww-perl', LIBWWW_PERL: 'libwww-perl',
LUA_RESTY_HTTP: 'lua-resty-http', LUA_RESTY_HTTP: 'lua-resty-http',
@@ -774,6 +780,7 @@ const Extension = Object.freeze({
NODE_JS: 'Node.js', NODE_JS: 'Node.js',
NODE_SUPERAGENT: 'node-superagent', NODE_SUPERAGENT: 'node-superagent',
OKHTTP: 'OkHttp', OKHTTP: 'OkHttp',
OCAML_COHTTP: 'ocaml-cohttp',
PHP_SOAP: 'PHP-SOAP', PHP_SOAP: 'PHP-SOAP',
POSTMAN_RUNTIME: 'PostmanRuntime', POSTMAN_RUNTIME: 'PostmanRuntime',
PYTHON_HTTPX: 'python-httpx', PYTHON_HTTPX: 'python-httpx',

View File

@@ -1,4 +1,4 @@
// Type definitions for Helpers submodule of UAParser.js v2.0.5 // Type definitions for Helpers submodule of UAParser.js v2.0.8
// Project: https://github.com/faisalman/ua-parser-js // Project: https://github.com/faisalman/ua-parser-js
// Definitions by: Faisal Salman <https://github.com/faisalman> // Definitions by: Faisal Salman <https://github.com/faisalman>

View File

@@ -1,5 +1,5 @@
/////////////////////////////////////////////// ///////////////////////////////////////////////
/* Extensions for UAParser.js v2.0.7 /* Extensions for UAParser.js v2.0.8
https://github.com/faisalman/ua-parser-js https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com> Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */ AGPLv3 License */

View File

@@ -3,7 +3,7 @@
// Source: /src/extensions/ua-parser-extensions.js // Source: /src/extensions/ua-parser-extensions.js
/////////////////////////////////////////////// ///////////////////////////////////////////////
/* Extensions for UAParser.js v2.0.7 /* Extensions for UAParser.js v2.0.8
https://github.com/faisalman/ua-parser-js https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com> Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */ AGPLv3 License */
@@ -45,8 +45,8 @@ const normalizeEmailName = function (str) {
const CLIs = Object.freeze({ const CLIs = Object.freeze({
browser : [ browser : [
// wget / curl / Lynx / ELinks / HTTPie // wget / curl / Lynx / ELinks / HTTPie / PowerShell
[/(wget|curl|lynx|elinks|httpie)[\/ ]\(?([\w\.-]+)/i], [NAME, VERSION, [TYPE, CLI]] [/(wget|curl|lynx|elinks|httpie|powershell)[\/ ]\(?([\w\.-]+)/i], [NAME, VERSION, [TYPE, CLI]]
] ]
}); });
@@ -437,8 +437,8 @@ const MediaPlayers = Object.freeze({
const Libraries = Object.freeze({ const Libraries = Object.freeze({
browser : [ browser : [
[ [
// Apache-HttpClient/Axios/Bun/Dart/go-http-client/got/GuzzleHttp/hackney/Java[-HttpClient]/jsdom/libwww-perl/lua-resty-http/Needle/Node.js/node-fetch/OkHttp/PHP-SOAP/PostmanRuntime/python-urllib/python-requests/rest-client/Scrapy/superagent // Apache-HttpClient/Axios/Bun/Dart/go-http-client/got/GuzzleHttp/hackney/http.rb/Java[-HttpClient]/Jetty/jsdom/libwww-perl/lua-resty-http/Needle/Node.js/node-fetch/ocaml-cohttp/OkHttp/PHP-SOAP/PostmanRuntime/python-urllib/python-requests/rest-client/Scrapy/superagent
/^(apache-httpclient|axios|bun|dart|deno|(?:go|java)-http-client|got|guzzlehttp|hackney|java|libwww-perl|lua-resty-http|needle|node(?:\.js|-fetch|-superagent)|okhttp|php-soap|postmanruntime|python-(?:httpx|urllib[23]?|requests)|rest-client|scrapy)\/([\w\.]+)/i, /^((?:apache|go|java)-http-?client|axios|bun|dart|deno|got|(?:guzzle|lua-resty-|ocaml-co|ok)http|hackney|http\.rb|java|jetty|libwww-perl|needle|node(?:\.js|-fetch|-superagent)|php-soap|postmanruntime|python-(?:httpx|urllib[23]?|requests)|rest-client|scrapy)\/([\w\.]+)/i,
/(adobeair|aiohttp|jsdom)\/([\w\.]+)/i, /(adobeair|aiohttp|jsdom)\/([\w\.]+)/i,
/(nutch)-([\w\.-]+)(\(|$)/i, /(nutch)-([\w\.-]+)(\(|$)/i,
/\((java)\/([\w\.]+)/i /\((java)\/([\w\.]+)/i

View File

@@ -1,9 +1,10 @@
// Type definitions for Helpers submodule of UAParser.js v2.0.5 // Type definitions for Helpers submodule of UAParser.js v2.0.8
// Project: https://github.com/faisalman/ua-parser-js // Project: https://github.com/faisalman/ua-parser-js
// Definitions by: Faisal Salman <https://github.com/faisalman> // Definitions by: Faisal Salman <https://github.com/faisalman>
import type { IResult } from "../main/ua-parser"; import type { IResult } from "../main/ua-parser";
export function getOutlookEdition(name: string, version: string): string;
export function isFrozenUA(ua: string): boolean; export function isFrozenUA(ua: string): boolean;
/** /**

View File

@@ -1,5 +1,5 @@
/////////////////////////////////////////////// ///////////////////////////////////////////////
/* Helpers for UAParser.js v2.0.7 /* Helpers for UAParser.js v2.0.8
https://github.com/faisalman/ua-parser-js https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com> Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */ AGPLv3 License */
@@ -7,8 +7,6 @@
/*jshint esversion: 6 */ /*jshint esversion: 6 */
const { UAParser } = require('../main/ua-parser');
const { EngineName } = require('../enums/ua-parser-enums');
const { getDeviceVendor: _getDeviceVendor, isAppleSilicon: _isAppleSilicon } = require('../device-detection/device-detection'); const { getDeviceVendor: _getDeviceVendor, isAppleSilicon: _isAppleSilicon } = require('../device-detection/device-detection');
const { isBot: _isBot, isAICrawler } = require('../bot-detection/bot-detection'); const { isBot: _isBot, isAICrawler } = require('../bot-detection/bot-detection');
const { isChromeFamily: _isChromeFamily, isElectron: _isElectron, isStandalonePWA: _isStandalonePWA } = require('../browser-detection/browser-detection'); const { isChromeFamily: _isChromeFamily, isElectron: _isElectron, isStandalonePWA: _isStandalonePWA } = require('../browser-detection/browser-detection');

View File

@@ -3,7 +3,7 @@
// Source: /src/helpers/ua-parser-helpers.js // Source: /src/helpers/ua-parser-helpers.js
/////////////////////////////////////////////// ///////////////////////////////////////////////
/* Helpers for UAParser.js v2.0.7 /* Helpers for UAParser.js v2.0.8
https://github.com/faisalman/ua-parser-js https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com> Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */ AGPLv3 License */
@@ -11,12 +11,10 @@
/*jshint esversion: 6 */ /*jshint esversion: 6 */
import { UAParser } from '../main/ua-parser.mjs'; import { getDeviceVendor as _getDeviceVendor, isAppleSilicon as _isAppleSilicon } from '../device-detection/device-detection.mjs';
import { EngineName } from '../enums/ua-parser-enums.mjs'; import { isBot as _isBot, isAICrawler } from '../bot-detection/bot-detection.mjs';
import { getDeviceVendor: _getDeviceVendor, isAppleSilicon: _isAppleSilicon } from '../device-detection/device-detection.mjs'; import { isChromeFamily as _isChromeFamily, isElectron as _isElectron, isStandalonePWA as _isStandalonePWA } from '../browser-detection/browser-detection.mjs';
import { isBot: _isBot, isAICrawler } from '../bot-detection/bot-detection.mjs'; import { isFromEU as _isFromEU } from '../browser-detection/browser-detection.mjs';
import { isChromeFamily: _isChromeFamily, isElectron: _isElectron, isStandalonePWA: _isStandalonePWA } from '../browser-detection/browser-detection.mjs';
import { isFromEU: _isFromEU } from '../browser-detection/browser-detection.mjs';
import { isFrozenUA } from 'ua-is-frozen'; import { isFrozenUA } from 'ua-is-frozen';
/** /**

View File

@@ -1,4 +1,4 @@
// Type definitions for UAParser.js v2.0.7 // Type definitions for UAParser.js v2.0.8
// Project: https://github.com/faisalman/ua-parser-js // Project: https://github.com/faisalman/ua-parser-js
// Definitions by: Faisal Salman <https://github.com/faisalman> // Definitions by: Faisal Salman <https://github.com/faisalman>

View File

@@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////
/* UAParser.js v2.0.7 /* UAParser.js v2.0.8
Copyright © 2012-2025 Faisal Salman <f@faisalman.com> Copyright © 2012-2025 Faisal Salman <f@faisalman.com>
AGPLv3 License *//* AGPLv3 License *//*
Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data. Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
@@ -19,7 +19,7 @@
// Constants // Constants
///////////// /////////////
var LIBVERSION = '2.0.7', var LIBVERSION = '2.0.8',
UA_MAX_LENGTH = 500, UA_MAX_LENGTH = 500,
USER_AGENT = 'user-agent', USER_AGENT = 'user-agent',
EMPTY = '', EMPTY = '',

View File

@@ -3,7 +3,7 @@
// Source: /src/main/ua-parser.js // Source: /src/main/ua-parser.js
///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////
/* UAParser.js v2.0.7 /* UAParser.js v2.0.8
Copyright © 2012-2025 Faisal Salman <f@faisalman.com> Copyright © 2012-2025 Faisal Salman <f@faisalman.com>
AGPLv3 License *//* AGPLv3 License *//*
Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data. Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
@@ -21,7 +21,7 @@
// Constants // Constants
///////////// /////////////
var LIBVERSION = '2.0.7', var LIBVERSION = '2.0.8',
UA_MAX_LENGTH = 500, UA_MAX_LENGTH = 500,
USER_AGENT = 'user-agent', USER_AGENT = 'user-agent',
EMPTY = '', EMPTY = '',
@@ -377,9 +377,10 @@
/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet /(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet
/(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer /(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
// Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble/Palemoon // Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble/Palemoon/HiBrowser
/(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser|palemoon)\/([-\w\.]+)/i, /(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:hi|lg |ovi|qute)browser|palemoon)\/v?([-\w\.]+)/i,
// Atlas/Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon // Atlas/Rekonq/Puffin/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
/(brave)(?: chrome)?\/([\d\.]+)/i, // Brave
/(heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i, // HeyTap/Ovi/115/Surf /(heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i, // HeyTap/Ovi/115/Surf
/(qwant)(?:ios|mobile)\/([\d\.]+)/i, // Qwant /(qwant)(?:ios|mobile)\/([\d\.]+)/i, // Qwant
/(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i // Ecosia/Weibo /(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i // Ecosia/Weibo
@@ -406,7 +407,9 @@
], [[NAME, /(.+)/, '$1 Secure' + SUFFIX_BROWSER], VERSION], [ ], [[NAME, /(.+)/, '$1 Secure' + SUFFIX_BROWSER], VERSION], [
/\bfocus\/([\w\.]+)/i // Firefox Focus /\bfocus\/([\w\.]+)/i // Firefox Focus
], [VERSION, [NAME, FIREFOX+' Focus']], [ ], [VERSION, [NAME, FIREFOX+' Focus']], [
/\bopt\/([\w\.]+)/i // Opera Touch / mms\/([\w\.]+)$/i // Opera Neon
], [VERSION, [NAME, OPERA+' Neon']], [
/ opt\/([\w\.]+)$/i // Opera Touch
], [VERSION, [NAME, OPERA+' Touch']], [ ], [VERSION, [NAME, OPERA+' Touch']], [
/coc_coc\w+\/([\w\.]+)/i // Coc Coc Browser /coc_coc\w+\/([\w\.]+)/i // Coc Coc Browser
], [VERSION, [NAME, 'Coc Coc']], [ ], [VERSION, [NAME, 'Coc Coc']], [
@@ -455,7 +458,7 @@
], [NAME, VERSION, [TYPE, INAPP]], [ ], [NAME, VERSION, [TYPE, INAPP]], [
/\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS /\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
], [VERSION, [NAME, 'GSA'], [TYPE, INAPP]], [ ], [VERSION, [NAME, 'GSA'], [TYPE, INAPP]], [
/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i // TikTok /(?:musical_ly|trill)(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
], [VERSION, [NAME, 'TikTok'], [TYPE, INAPP]], [ ], [VERSION, [NAME, 'TikTok'], [TYPE, INAPP]], [
/\[(linkedin)app\]/i // LinkedIn App for iOS & Android /\[(linkedin)app\]/i // LinkedIn App for iOS & Android
], [NAME, [TYPE, INAPP]], [ ], [NAME, [TYPE, INAPP]], [
@@ -610,7 +613,7 @@
], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [ ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
// OnePlus // OnePlus
/droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-k]\w[1m]10)\b/i, /droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-l]\w[1m]10)\b/i,
/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
], [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]], [ ], [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]], [
@@ -650,7 +653,7 @@
], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [ ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [
// LG // LG
/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i /\b(?:lg)?([vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [ ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [
/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i, /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
/\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i, /\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,
@@ -941,7 +944,7 @@
/(presto)\/([\w\.]+)/i, // Presto /(presto)\/([\w\.]+)/i, // Presto
/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo
/ekioh(flow)\/([\w\.]+)/i, // Flow /ekioh(flow)\/([\w\.]+)/i, // Flow
/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links /(khtml|tasman|links|dillo)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links/Dillo
/(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab /(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab
/\b(libweb)/i // LibWeb /\b(libweb)/i // LibWeb
@@ -1003,7 +1006,7 @@
], [VERSION, [NAME, BLACKBERRY]], [ ], [VERSION, [NAME, BLACKBERRY]], [
/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i // Symbian /(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i // Symbian
], [VERSION, [NAME, 'Symbian']], [ ], [VERSION, [NAME, 'Symbian']], [
/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i // Firefox OS /mozilla\/[\d\.]+ \((?:mobile[;\w ]*|tablet|tv|[^\)]*(?:viera|lg(?:l25|-d300)|alcatel ?o.+|y300-f1)); rv:([\w\.]+)\).+gecko\//i // Firefox OS
], [VERSION, [NAME, FIREFOX+' OS']], [ ], [VERSION, [NAME, FIREFOX+' OS']], [
/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i, // WebOS /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i, // WebOS
/webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i /webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i
@@ -1019,7 +1022,6 @@
], [[NAME, "Chrome OS"], VERSION],[ ], [[NAME, "Chrome OS"], VERSION],[
// Smart TVs // Smart TVs
/panasonic;(viera)/i, // Panasonic Viera
/(netrange)mmh/i, // Netrange /(netrange)mmh/i, // Netrange
/(nettv)\/(\d+\.[\w\.]+)/i, // NetTV /(nettv)\/(\d+\.[\w\.]+)/i, // NetTV