Compare commits

..

6 Commits

Author SHA1 Message Date
Faisal Salman
a1cfca47ab Fix #815 - Improve device detection: OnePlus device misidentified as LG tablet 2025-12-16 18:06:14 +07:00
Faisal Salman
1816450040 Add new browser: Opera Neon - https://www.operaneon.com/ 2025-12-15 21:57:00 +07:00
Faisal Salman
634e13f627 [extensions] Add new CLI: Windows' PowerShell 2025-12-15 21:13:13 +07:00
Faisal Salman
37d9b3c981 Improve OS detection: Firefox OS 2025-12-15 18:13:45 +07:00
Faisal Salman
9fc460ed40 Add new engine: Dillo - https://dillo-browser.org/ 2025-12-15 14:00:11 +07:00
Faisal Salman
41dd83f27a Fix #814 - Resolve syntax error related to import renaming in ESM version build 2025-12-10 11:27:02 +07:00
33 changed files with 265 additions and 2064 deletions

View File

@@ -76,21 +76,6 @@
---
## 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
- 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

1007
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{
"title": "UAParser.js",
"name": "ua-parser-js",
"version": "2.0.8",
"version": "2.0.7",
"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",
"keywords": [
@@ -222,7 +222,7 @@
}
},
"files": [
"dist/*.?(m)js",
"dist",
"src"
],
"bin": "./script/cli.js",

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -3,7 +3,7 @@
// Source: /src/enums/ua-parser-enums.js
///////////////////////////////////////////////
/* Enums for UAParser.js v2.0.8
/* Enums for UAParser.js v2.0.7
https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */
@@ -66,7 +66,6 @@ export const BrowserName: Readonly<{
GOOGLE_SEARCH: 'GSA',
HELIO: 'Helio',
HEYTAP: 'HeyTap',
HIBROWSER: 'HiBrowser',
HONOR: 'Honor',
HUAWEI: 'Huawei Browser',
ICAB: 'iCab',
@@ -117,7 +116,6 @@ export const BrowserName: Readonly<{
OPERA_GX: 'Opera GX',
OPERA_MINI: 'Opera Mini',
OPERA_MOBI: 'Opera Mobi',
OPERA_NEON: 'Opera Neon',
OPERA_TABLET: 'Opera Tablet',
OPERA_TOUCH: 'Opera Touch',
OTTER: 'Otter',
@@ -318,7 +316,6 @@ export const EngineName: Readonly<{
AMAYA: 'Amaya',
ARKWEB: 'ArkWeb',
BLINK: 'Blink',
DILLO: 'Dillo',
EDGEHTML: 'EdgeHTML',
FLOW: 'Flow',
GECKO: 'Gecko',
@@ -454,7 +451,6 @@ export const Extension: Readonly<{
ELINKS: 'ELinks',
HTTPIE: 'HTTPie',
LYNX: 'Lynx',
POWERSHELL: 'PowerShell',
WGET: 'Wget'
},
Crawler: {
@@ -617,66 +613,24 @@ export const Extension: Readonly<{
},
Email: {
AIRMAIL: 'Airmail',
ALPINE: 'Alpine',
ANDROID_MAIL: 'Android',
APPLE_MAIL: 'Mail',
AQUA_MAIL: 'AquaMail',
BALSA: 'Balsa',
BARCA: 'Barca',
BLUEMAIL: 'BlueMail',
CANARY: 'Canary',
CLAWS_MAIL: 'Claws Mail',
DAUM_MAIL: 'DaumMail',
EM_CLIENT: 'eM Client',
EUDORA: 'Eudora',
EVOLUTION: 'Evolution',
FAIR_EMAIL: 'FairEmail',
EM_CLIENT: 'eM Client',
FOXMAIL: 'Foxmail',
GEARY: 'Geary',
GNUS: 'Gnus',
HORDE_IMP: 'Horde::IMP',
IBM_NOTES: 'Lotus-Notes',
INCREDIMAIL: 'IncrediMail',
K9_MAIL: 'K-9 Mail',
KMAIL: 'KMail',
KMAIL2: 'kmail2',
KONTACT: 'Kontact',
MAILBIRD: 'Mailbird',
MAILMATE: 'MailMate',
MAILSPRING: 'Mailspring',
MICROSOFT_OUTLOOK: 'Microsoft Outlook',
MICROSOFT_OUTLOOK_MAC: 'MacOutlook',
MUTT: 'Mutt',
NAVER_MAILAPP: 'NaverMailApp',
NEWTON: 'Newton',
NINE: 'Nine',
NYLAS_MAIL: 'NylasMail',
OUTLOOK_EXPRESS: 'Outlook-Express',
PEGASUS_MAIL: 'Pegasus Mail',
POCOMAIL: 'PocoMail',
POLYMAIL: 'Polymail',
POSTBOX: 'Postbox',
PROTON_MAIL: 'ProtonMail',
PROTON_MAIL_BRIDGE: 'ProtonMail Bridge',
QUALA_MAIL: 'Quala',
R2MAIL2: 'R2Mail2',
RAINLOOP: 'RainLoop',
ROUNDCUBE: 'Roundcube Webmail',
SAMSUNG_EMAIL: 'SamsungEmail',
SPARK_MAIL: 'SparkDesktop',
SPARROW: 'Sparrow',
SPICEBIRD: 'Spicebird',
SQUIRRELMAIL: 'SquirrelMail',
SYLPHEED: 'Sylpheed',
THE_BAT: 'The Bat!',
THUNDERBIRD: 'Thunderbird',
TROJITA: 'Trojita',
TURNPIKE: 'Turnpike',
TUTANOTA: 'tutanota-desktop',
WANDERLUST: 'Wanderlust',
WINDOWS_LIVE_MAIL: 'Windows-Live-Mail',
YAHOO_MAIL: 'Yahoo Mail',
YAHOO_MAIL_IOS: 'Yahoo Mail',
YAHOO_MAIL: 'Yahoo',
ZIMBRA: 'Zimbra',
ZOHO_MAIL: 'ZohoMail-Desktop'
},
@@ -767,10 +721,8 @@ export const Extension: Readonly<{
GOT: 'got',
GUZZLEHTTP: 'GuzzleHttp',
HACKNEY: 'hackney',
HTTP_RB: 'http.rb',
JAVA: 'Java',
JAVA_HTTPCLIENT: 'Java-http-client',
JETTY: 'Jetty',
JSDOM: 'jsdom',
LIBWWW_PERL: 'libwww-perl',
LUA_RESTY_HTTP: 'lua-resty-http',
@@ -780,7 +732,6 @@ export const Extension: Readonly<{
NODE_JS: 'Node.js',
NODE_SUPERAGENT: 'node-superagent',
OKHTTP: 'OkHttp',
OCAML_COHTTP: 'ocaml-cohttp',
PHP_SOAP: 'PHP-SOAP',
POSTMAN_RUNTIME: 'PostmanRuntime',
PYTHON_HTTPX: 'python-httpx',

View File

@@ -1,5 +1,5 @@
///////////////////////////////////////////////
/* Enums for UAParser.js v2.0.8
/* Enums for UAParser.js v2.0.7
https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */
@@ -62,7 +62,6 @@ const BrowserName = Object.freeze({
GOOGLE_SEARCH: 'GSA',
HELIO: 'Helio',
HEYTAP: 'HeyTap',
HIBROWSER: 'HiBrowser',
HONOR: 'Honor',
HUAWEI: 'Huawei Browser',
ICAB: 'iCab',
@@ -613,66 +612,24 @@ const Extension = Object.freeze({
},
Email: {
AIRMAIL: 'Airmail',
ALPINE: 'Alpine',
ANDROID_MAIL: 'Android',
APPLE_MAIL: 'Mail',
AQUA_MAIL: 'AquaMail',
BALSA: 'Balsa',
BARCA: 'Barca',
BLUEMAIL: 'BlueMail',
CANARY: 'Canary',
CLAWS_MAIL: 'Claws Mail',
DAUM_MAIL: 'DaumMail',
EM_CLIENT: 'eM Client',
EUDORA: 'Eudora',
EVOLUTION: 'Evolution',
FAIR_EMAIL: 'FairEmail',
EM_CLIENT: 'eM Client',
FOXMAIL: 'Foxmail',
GEARY: 'Geary',
GNUS: 'Gnus',
HORDE_IMP: 'Horde::IMP',
IBM_NOTES: 'Lotus-Notes',
INCREDIMAIL: 'IncrediMail',
K9_MAIL: 'K-9 Mail',
KMAIL: 'KMail',
KMAIL2: 'kmail2',
KONTACT: 'Kontact',
MAILBIRD: 'Mailbird',
MAILMATE: 'MailMate',
MAILSPRING: 'Mailspring',
MICROSOFT_OUTLOOK: 'Microsoft Outlook',
MICROSOFT_OUTLOOK_MAC: 'MacOutlook',
MUTT: 'Mutt',
NAVER_MAILAPP: 'NaverMailApp',
NEWTON: 'Newton',
NINE: 'Nine',
NYLAS_MAIL: 'NylasMail',
OUTLOOK_EXPRESS: 'Outlook-Express',
PEGASUS_MAIL: 'Pegasus Mail',
POCOMAIL: 'PocoMail',
POLYMAIL: 'Polymail',
POSTBOX: 'Postbox',
PROTON_MAIL: 'ProtonMail',
PROTON_MAIL_BRIDGE: 'ProtonMail Bridge',
QUALA_MAIL: 'Quala',
R2MAIL2: 'R2Mail2',
RAINLOOP: 'RainLoop',
ROUNDCUBE: 'Roundcube Webmail',
SAMSUNG_EMAIL: 'SamsungEmail',
SPARK_MAIL: 'SparkDesktop',
SPARROW: 'Sparrow',
SPICEBIRD: 'Spicebird',
SQUIRRELMAIL: 'SquirrelMail',
SYLPHEED: 'Sylpheed',
THE_BAT: 'The Bat!',
THUNDERBIRD: 'Thunderbird',
TROJITA: 'Trojita',
TURNPIKE: 'Turnpike',
TUTANOTA: 'tutanota-desktop',
WANDERLUST: 'Wanderlust',
WINDOWS_LIVE_MAIL: 'Windows-Live-Mail',
YAHOO_MAIL: 'Yahoo Mail',
YAHOO_MAIL_IOS: 'Yahoo Mail',
YAHOO_MAIL: 'Yahoo',
ZIMBRA: 'Zimbra',
ZOHO_MAIL: 'ZohoMail-Desktop'
},
@@ -763,10 +720,8 @@ const Extension = Object.freeze({
GOT: 'got',
GUZZLEHTTP: 'GuzzleHttp',
HACKNEY: 'hackney',
HTTP_RB: 'http.rb',
JAVA: 'Java',
JAVA_HTTPCLIENT: 'Java-http-client',
JETTY: 'Jetty',
JSDOM: 'jsdom',
LIBWWW_PERL: 'libwww-perl',
LUA_RESTY_HTTP: 'lua-resty-http',
@@ -776,7 +731,6 @@ const Extension = Object.freeze({
NODE_JS: 'Node.js',
NODE_SUPERAGENT: 'node-superagent',
OKHTTP: 'OkHttp',
OCAML_COHTTP: 'ocaml-cohttp',
PHP_SOAP: 'PHP-SOAP',
POSTMAN_RUNTIME: 'PostmanRuntime',
PYTHON_HTTPX: 'python-httpx',

View File

@@ -3,7 +3,7 @@
// Source: /src/enums/ua-parser-enums.js
///////////////////////////////////////////////
/* Enums for UAParser.js v2.0.8
/* Enums for UAParser.js v2.0.7
https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */
@@ -66,7 +66,6 @@ const BrowserName = Object.freeze({
GOOGLE_SEARCH: 'GSA',
HELIO: 'Helio',
HEYTAP: 'HeyTap',
HIBROWSER: 'HiBrowser',
HONOR: 'Honor',
HUAWEI: 'Huawei Browser',
ICAB: 'iCab',
@@ -117,7 +116,6 @@ const BrowserName = Object.freeze({
OPERA_GX: 'Opera GX',
OPERA_MINI: 'Opera Mini',
OPERA_MOBI: 'Opera Mobi',
OPERA_NEON: 'Opera Neon',
OPERA_TABLET: 'Opera Tablet',
OPERA_TOUCH: 'Opera Touch',
OTTER: 'Otter',
@@ -318,7 +316,6 @@ const EngineName = Object.freeze({
AMAYA: 'Amaya',
ARKWEB: 'ArkWeb',
BLINK: 'Blink',
DILLO: 'Dillo',
EDGEHTML: 'EdgeHTML',
FLOW: 'Flow',
GECKO: 'Gecko',
@@ -454,7 +451,6 @@ const Extension = Object.freeze({
ELINKS: 'ELinks',
HTTPIE: 'HTTPie',
LYNX: 'Lynx',
POWERSHELL: 'PowerShell',
WGET: 'Wget'
},
Crawler: {
@@ -617,66 +613,24 @@ const Extension = Object.freeze({
},
Email: {
AIRMAIL: 'Airmail',
ALPINE: 'Alpine',
ANDROID_MAIL: 'Android',
APPLE_MAIL: 'Mail',
AQUA_MAIL: 'AquaMail',
BALSA: 'Balsa',
BARCA: 'Barca',
BLUEMAIL: 'BlueMail',
CANARY: 'Canary',
CLAWS_MAIL: 'Claws Mail',
DAUM_MAIL: 'DaumMail',
EM_CLIENT: 'eM Client',
EUDORA: 'Eudora',
EVOLUTION: 'Evolution',
FAIR_EMAIL: 'FairEmail',
EM_CLIENT: 'eM Client',
FOXMAIL: 'Foxmail',
GEARY: 'Geary',
GNUS: 'Gnus',
HORDE_IMP: 'Horde::IMP',
IBM_NOTES: 'Lotus-Notes',
INCREDIMAIL: 'IncrediMail',
K9_MAIL: 'K-9 Mail',
KMAIL: 'KMail',
KMAIL2: 'kmail2',
KONTACT: 'Kontact',
MAILBIRD: 'Mailbird',
MAILMATE: 'MailMate',
MAILSPRING: 'Mailspring',
MICROSOFT_OUTLOOK: 'Microsoft Outlook',
MICROSOFT_OUTLOOK_MAC: 'MacOutlook',
MUTT: 'Mutt',
NAVER_MAILAPP: 'NaverMailApp',
NEWTON: 'Newton',
NINE: 'Nine',
NYLAS_MAIL: 'NylasMail',
OUTLOOK_EXPRESS: 'Outlook-Express',
PEGASUS_MAIL: 'Pegasus Mail',
POCOMAIL: 'PocoMail',
POLYMAIL: 'Polymail',
POSTBOX: 'Postbox',
PROTON_MAIL: 'ProtonMail',
PROTON_MAIL_BRIDGE: 'ProtonMail Bridge',
QUALA_MAIL: 'Quala',
R2MAIL2: 'R2Mail2',
RAINLOOP: 'RainLoop',
ROUNDCUBE: 'Roundcube Webmail',
SAMSUNG_EMAIL: 'SamsungEmail',
SPARK_MAIL: 'SparkDesktop',
SPARROW: 'Sparrow',
SPICEBIRD: 'Spicebird',
SQUIRRELMAIL: 'SquirrelMail',
SYLPHEED: 'Sylpheed',
THE_BAT: 'The Bat!',
THUNDERBIRD: 'Thunderbird',
TROJITA: 'Trojita',
TURNPIKE: 'Turnpike',
TUTANOTA: 'tutanota-desktop',
WANDERLUST: 'Wanderlust',
WINDOWS_LIVE_MAIL: 'Windows-Live-Mail',
YAHOO_MAIL: 'Yahoo Mail',
YAHOO_MAIL_IOS: 'Yahoo Mail',
YAHOO_MAIL: 'Yahoo',
ZIMBRA: 'Zimbra',
ZOHO_MAIL: 'ZohoMail-Desktop'
},
@@ -767,10 +721,8 @@ const Extension = Object.freeze({
GOT: 'got',
GUZZLEHTTP: 'GuzzleHttp',
HACKNEY: 'hackney',
HTTP_RB: 'http.rb',
JAVA: 'Java',
JAVA_HTTPCLIENT: 'Java-http-client',
JETTY: 'Jetty',
JSDOM: 'jsdom',
LIBWWW_PERL: 'libwww-perl',
LUA_RESTY_HTTP: 'lua-resty-http',
@@ -780,7 +732,6 @@ const Extension = Object.freeze({
NODE_JS: 'Node.js',
NODE_SUPERAGENT: 'node-superagent',
OKHTTP: 'OkHttp',
OCAML_COHTTP: 'ocaml-cohttp',
PHP_SOAP: 'PHP-SOAP',
POSTMAN_RUNTIME: 'PostmanRuntime',
PYTHON_HTTPX: 'python-httpx',

View File

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

View File

@@ -1,5 +1,5 @@
///////////////////////////////////////////////
/* Extensions for UAParser.js v2.0.8
/* Extensions for UAParser.js v2.0.7
https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */
@@ -22,19 +22,6 @@ const INAPP = 'inapp';
const MEDIAPLAYER = 'mediaplayer';
const LIBRARY = 'library';
// Helper to normalize specific email client names
const normalizeEmailName = function (str) {
const map = {
'YahooMobile': 'Yahoo Mail',
'YahooMail': 'Yahoo Mail',
'K-9': 'K-9 Mail',
'K-9 Mail': 'K-9 Mail',
'Zdesktop': 'Zimbra',
'zdesktop': 'Zimbra'
};
return map[str] || str;
};
//////////////////////
// COMMAND LINE APPS
/////////////////////
@@ -242,55 +229,25 @@ const ExtraDevices = Object.freeze({
]
});
//////////////
///////////////
// EMAIL APPS
//////////////
const Emails = Object.freeze({
browser : [
// 1. Specific Android Mail Rule
[/(android)\/([\w\.-]+email)/i],
[NAME, VERSION, [TYPE, EMAIL]],
// 2. Standard Email Clients
[
new RegExp(
'(' +
// Clients ending in 'mail' (Case 1: Prefix + optional space + [e]mail)
// Covers: AirMail, Claws Mail, FairEmail, SamsungEmail, Yahoo Mail, etc.
'(?:air|aqua|blue|claws|daum|fair|fox|k-9|mac|nylas|pegasus|poco|poly|proton|samsung|squirrel|yahoo) ?e?mail(?:-desktop| app| bridge)?|' +
// Standalone / Specific Names
'microsoft outlook|r2mail2|spicebird|turnpike|yahoomobile|' +
// Microsoft & Outlook Variants
'(?:microsoft )?outlook(?:-express)?|macoutlook|windows-live-mail|' +
// Specific Clients
'alpine|balsa|barca|canary|emclient|eudora|evolution|geary|gnus|' +
'horde::imp|incredimail|kmail2?|kontact|lotus-notes|' +
'mail(?:bird|mate|spring)|mutt|navermailapp|newton|nine|postbox|' +
'rainloop|roundcube webmail|spar(?:row|kdesktop)|sylpheed|' +
'the bat!|thunderbird|trojita|tutanota-desktop|wanderlust|' +
'zdesktop|zohomail-desktop' +
')' +
// Separator
'(?:m.+ail; |[\\/ ])' +
// Version (Updated to allow hyphens for Turnpike)
'([\\w\\.-]+)',
'i'
)
],
[
[NAME, normalizeEmailName],
VERSION,
[TYPE, EMAIL]
],
// Evolution / Kontact/KMail[2] / [Microsoft/Mac] Outlook / Thunderbird
// Airmail / BlueMail / DaumMail / eMClient / Foxmail / NaverMailApp / Polymail
// ProtonMail / SparkDesktop / Sparrow / Yahoo! Mail / Zimbra / ZohoMail-Desktop
/((?:air|blue|daum|fox|poly|proton)mail|emclient|evolution|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|sparkdesktop|thunderbird|yahoo|zohomail-desktop)(?:m.+ail; |[\/ ])([\w\.]+)/i,
// 3. Apple Mail Context
[/(mail)\/([\w\.]+) cf/i],
[NAME, VERSION, [TYPE, EMAIL]],
// Apple's Mail
/(mail)\/([\w\.]+) cf/i
], [NAME, VERSION, [TYPE, EMAIL]], [
// 4. Zimbra Server
[/(zimbra)\/([\w\.-]+)/i],
[NAME, VERSION, [TYPE, EMAIL]]
// Zimbra
/zdesktop\/([\w\.]+)/i
], [VERSION, [NAME, 'Zimbra'], [TYPE, EMAIL]]
]
});
@@ -433,8 +390,8 @@ const MediaPlayers = Object.freeze({
const Libraries = Object.freeze({
browser : [
[
// 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|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,
// 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|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,
/(adobeair|aiohttp|jsdom)\/([\w\.]+)/i,
/(nutch)-([\w\.-]+)(\(|$)/i,
/\((java)\/([\w\.]+)/i

View File

@@ -3,7 +3,7 @@
// Source: /src/extensions/ua-parser-extensions.js
///////////////////////////////////////////////
/* Extensions for UAParser.js v2.0.8
/* Extensions for UAParser.js v2.0.7
https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */
@@ -26,27 +26,14 @@ const INAPP = 'inapp';
const MEDIAPLAYER = 'mediaplayer';
const LIBRARY = 'library';
// Helper to normalize specific email client names
const normalizeEmailName = function (str) {
const map = {
'YahooMobile': 'Yahoo Mail',
'YahooMail': 'Yahoo Mail',
'K-9': 'K-9 Mail',
'K-9 Mail': 'K-9 Mail',
'Zdesktop': 'Zimbra',
'zdesktop': 'Zimbra'
};
return map[str] || str;
};
//////////////////////
// COMMAND LINE APPS
/////////////////////
const CLIs = Object.freeze({
browser : [
// wget / curl / Lynx / ELinks / HTTPie / PowerShell
[/(wget|curl|lynx|elinks|httpie|powershell)[\/ ]\(?([\w\.-]+)/i], [NAME, VERSION, [TYPE, CLI]]
// wget / curl / Lynx / ELinks / HTTPie
[/(wget|curl|lynx|elinks|httpie)[\/ ]\(?([\w\.-]+)/i], [NAME, VERSION, [TYPE, CLI]]
]
});
@@ -246,55 +233,25 @@ const ExtraDevices = Object.freeze({
]
});
//////////////
///////////////
// EMAIL APPS
//////////////
const Emails = Object.freeze({
browser : [
// 1. Specific Android Mail Rule
[/(android)\/([\w\.-]+email)/i],
[NAME, VERSION, [TYPE, EMAIL]],
// 2. Standard Email Clients
[
new RegExp(
'(' +
// Clients ending in 'mail' (Case 1: Prefix + optional space + [e]mail)
// Covers: AirMail, Claws Mail, FairEmail, SamsungEmail, Yahoo Mail, etc.
'(?:air|aqua|blue|claws|daum|fair|fox|k-9|mac|nylas|pegasus|poco|poly|proton|samsung|squirrel|yahoo) ?e?mail(?:-desktop| app| bridge)?|' +
// Standalone / Specific Names
'microsoft outlook|r2mail2|spicebird|turnpike|yahoomobile|' +
// Microsoft & Outlook Variants
'(?:microsoft )?outlook(?:-express)?|macoutlook|windows-live-mail|' +
// Specific Clients
'alpine|balsa|barca|canary|emclient|eudora|evolution|geary|gnus|' +
'horde::imp|incredimail|kmail2?|kontact|lotus-notes|' +
'mail(?:bird|mate|spring)|mutt|navermailapp|newton|nine|postbox|' +
'rainloop|roundcube webmail|spar(?:row|kdesktop)|sylpheed|' +
'the bat!|thunderbird|trojita|tutanota-desktop|wanderlust|' +
'zdesktop|zohomail-desktop' +
')' +
// Separator
'(?:m.+ail; |[\\/ ])' +
// Version (Updated to allow hyphens for Turnpike)
'([\\w\\.-]+)',
'i'
)
],
[
[NAME, normalizeEmailName],
VERSION,
[TYPE, EMAIL]
],
// Evolution / Kontact/KMail[2] / [Microsoft/Mac] Outlook / Thunderbird
// Airmail / BlueMail / DaumMail / eMClient / Foxmail / NaverMailApp / Polymail
// ProtonMail / SparkDesktop / Sparrow / Yahoo! Mail / Zimbra / ZohoMail-Desktop
/((?:air|blue|daum|fox|poly|proton)mail|emclient|evolution|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|sparkdesktop|thunderbird|yahoo|zohomail-desktop)(?:m.+ail; |[\/ ])([\w\.]+)/i,
// 3. Apple Mail Context
[/(mail)\/([\w\.]+) cf/i],
[NAME, VERSION, [TYPE, EMAIL]],
// Apple's Mail
/(mail)\/([\w\.]+) cf/i
], [NAME, VERSION, [TYPE, EMAIL]], [
// 4. Zimbra Server
[/(zimbra)\/([\w\.-]+)/i],
[NAME, VERSION, [TYPE, EMAIL]]
// Zimbra
/zdesktop\/([\w\.]+)/i
], [VERSION, [NAME, 'Zimbra'], [TYPE, EMAIL]]
]
});
@@ -437,8 +394,8 @@ const MediaPlayers = Object.freeze({
const Libraries = Object.freeze({
browser : [
[
// 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|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,
// 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|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,
/(adobeair|aiohttp|jsdom)\/([\w\.]+)/i,
/(nutch)-([\w\.-]+)(\(|$)/i,
/\((java)\/([\w\.]+)/i

View File

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

View File

@@ -1,5 +1,5 @@
///////////////////////////////////////////////
/* Helpers for UAParser.js v2.0.8
/* Helpers for UAParser.js v2.0.7
https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */
@@ -7,6 +7,8 @@
/*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 { isBot: _isBot, isAICrawler } = require('../bot-detection/bot-detection');
const { isChromeFamily: _isChromeFamily, isElectron: _isElectron, isStandalonePWA: _isStandalonePWA } = require('../browser-detection/browser-detection');
@@ -53,50 +55,6 @@ const isFromEU = _isFromEU;
*/
const isStandalonePWA = _isStandalonePWA;
/**
* Translates a raw Outlook User-Agent name/version into a
* Developer-friendly Edition (e.g., "Outlook 2019 (Modern Word)").
*/
const getOutlookEdition = (name, version) => {
if (!name || !version) return name;
const cleanName = name.toLowerCase().replace(/microsoft\s+/, '');
// 1. Handle Mac Separately (Different Rendering Engine)
if (cleanName === 'macoutlook') {
const major = parseInt(version.split('.')[0], 10);
if (major >= 16) return "Outlook for Mac (Modern)";
return "Outlook for Mac (Legacy)";
}
// 2. Handle Windows Outlook
if (cleanName === 'outlook') {
const parts = version.split('.').map(Number);
const major = parts[0];
const build = parts[2] || 0; // Build number is usually the 3rd part
// Pre-2016 Versions (Clear Major Version mapping)
if (major === 15) return "Outlook 2013";
if (major === 14) return "Outlook 2010";
if (major === 12) return "Outlook 2007";
if (major < 12) return "Outlook (Legacy)";
// The Version 16.0 Confusion
if (major === 16) {
// Build < 10000 = MSI (Volume License 2016/2019)
// These render poorly (No SVG, older bugs)
if (build < 10000) {
return "Outlook 2016 (MSI / Volume License)";
}
// Build >= 10000 = Click-to-Run (Retail 2016 / 2019 / 365)
// These render well (SVG support, modern CSS)
return "Outlook 365 / 2019+ (Modern)";
}
}
// 3. Fallback for 'Outlook Express' or 'New Outlook' (Browser)
return name;
};
module.exports = {
getDeviceVendor,
isAppleSilicon,
@@ -106,6 +64,5 @@ module.exports = {
isElectron,
isFromEU,
isFrozenUA,
isStandalonePWA,
getOutlookEdition
isStandalonePWA
}

View File

@@ -3,7 +3,7 @@
// Source: /src/helpers/ua-parser-helpers.js
///////////////////////////////////////////////
/* Helpers for UAParser.js v2.0.8
/* Helpers for UAParser.js v2.0.7
https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */
@@ -11,10 +11,12 @@
/*jshint esversion: 6 */
import { getDeviceVendor as _getDeviceVendor, isAppleSilicon as _isAppleSilicon } from '../device-detection/device-detection.mjs';
import { isBot as _isBot, isAICrawler } from '../bot-detection/bot-detection.mjs';
import { isChromeFamily as _isChromeFamily, isElectron as _isElectron, isStandalonePWA as _isStandalonePWA } from '../browser-detection/browser-detection.mjs';
import { isFromEU as _isFromEU } from '../browser-detection/browser-detection.mjs';
import { UAParser } from '../main/ua-parser.mjs';
import { EngineName } from '../enums/ua-parser-enums.mjs';
import { getDeviceVendor: _getDeviceVendor, isAppleSilicon: _isAppleSilicon } from '../device-detection/device-detection.mjs';
import { isBot: _isBot, isAICrawler } from '../bot-detection/bot-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';
/**
@@ -57,50 +59,6 @@ const isFromEU = _isFromEU;
*/
const isStandalonePWA = _isStandalonePWA;
/**
* Translates a raw Outlook User-Agent name/version into a
* Developer-friendly Edition (e.g., "Outlook 2019 (Modern Word)").
*/
const getOutlookEdition = (name, version) => {
if (!name || !version) return name;
const cleanName = name.toLowerCase().replace(/microsoft\s+/, '');
// 1. Handle Mac Separately (Different Rendering Engine)
if (cleanName === 'macoutlook') {
const major = parseInt(version.split('.')[0], 10);
if (major >= 16) return "Outlook for Mac (Modern)";
return "Outlook for Mac (Legacy)";
}
// 2. Handle Windows Outlook
if (cleanName === 'outlook') {
const parts = version.split('.').map(Number);
const major = parts[0];
const build = parts[2] || 0; // Build number is usually the 3rd part
// Pre-2016 Versions (Clear Major Version mapping)
if (major === 15) return "Outlook 2013";
if (major === 14) return "Outlook 2010";
if (major === 12) return "Outlook 2007";
if (major < 12) return "Outlook (Legacy)";
// The Version 16.0 Confusion
if (major === 16) {
// Build < 10000 = MSI (Volume License 2016/2019)
// These render poorly (No SVG, older bugs)
if (build < 10000) {
return "Outlook 2016 (MSI / Volume License)";
}
// Build >= 10000 = Click-to-Run (Retail 2016 / 2019 / 365)
// These render well (SVG support, modern CSS)
return "Outlook 365 / 2019+ (Modern)";
}
}
// 3. Fallback for 'Outlook Express' or 'New Outlook' (Browser)
return name;
};
export {
getDeviceVendor,
isAppleSilicon,
@@ -110,6 +68,5 @@ export {
isElectron,
isFromEU,
isFrozenUA,
isStandalonePWA,
getOutlookEdition
isStandalonePWA
}

View File

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

View File

@@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////////////
/* UAParser.js v2.0.8
/* UAParser.js v2.0.7
Copyright © 2012-2025 Faisal Salman <f@faisalman.com>
AGPLv3 License *//*
Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
@@ -19,7 +19,7 @@
// Constants
/////////////
var LIBVERSION = '2.0.8',
var LIBVERSION = '2.0.7',
UA_MAX_LENGTH = 500,
USER_AGENT = 'user-agent',
EMPTY = '',
@@ -375,10 +375,9 @@
/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet
/(?: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/HiBrowser
/(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/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
/(brave)(?: chrome)?\/([\d\.]+)/i, // Brave
// Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble/Palemoon
/(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/Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
/(heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i, // HeyTap/Ovi/115/Surf
/(qwant)(?:ios|mobile)\/([\d\.]+)/i, // Qwant
/(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i // Ecosia/Weibo
@@ -456,7 +455,7 @@
], [NAME, VERSION, [TYPE, INAPP]], [
/\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
], [VERSION, [NAME, 'GSA'], [TYPE, INAPP]], [
/(?:musical_ly|trill)(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
], [VERSION, [NAME, 'TikTok'], [TYPE, INAPP]], [
/\[(linkedin)app\]/i // LinkedIn App for iOS & Android
], [NAME, [TYPE, INAPP]], [

View File

@@ -3,7 +3,7 @@
// Source: /src/main/ua-parser.js
/////////////////////////////////////////////////////////////////////////////////
/* UAParser.js v2.0.8
/* UAParser.js v2.0.7
Copyright © 2012-2025 Faisal Salman <f@faisalman.com>
AGPLv3 License *//*
Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
@@ -21,7 +21,7 @@
// Constants
/////////////
var LIBVERSION = '2.0.8',
var LIBVERSION = '2.0.7',
UA_MAX_LENGTH = 500,
USER_AGENT = 'user-agent',
EMPTY = '',
@@ -377,10 +377,9 @@
/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet
/(?: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/HiBrowser
/(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/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
/(brave)(?: chrome)?\/([\d\.]+)/i, // Brave
// Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble/Palemoon
/(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/Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
/(heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i, // HeyTap/Ovi/115/Surf
/(qwant)(?:ios|mobile)\/([\d\.]+)/i, // Qwant
/(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i // Ecosia/Weibo
@@ -407,9 +406,7 @@
], [[NAME, /(.+)/, '$1 Secure' + SUFFIX_BROWSER], VERSION], [
/\bfocus\/([\w\.]+)/i // Firefox Focus
], [VERSION, [NAME, FIREFOX+' Focus']], [
/ mms\/([\w\.]+)$/i // Opera Neon
], [VERSION, [NAME, OPERA+' Neon']], [
/ opt\/([\w\.]+)$/i // Opera Touch
/\bopt\/([\w\.]+)/i // Opera Touch
], [VERSION, [NAME, OPERA+' Touch']], [
/coc_coc\w+\/([\w\.]+)/i // Coc Coc Browser
], [VERSION, [NAME, 'Coc Coc']], [
@@ -458,7 +455,7 @@
], [NAME, VERSION, [TYPE, INAPP]], [
/\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
], [VERSION, [NAME, 'GSA'], [TYPE, INAPP]], [
/(?:musical_ly|trill)(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
], [VERSION, [NAME, 'TikTok'], [TYPE, INAPP]], [
/\[(linkedin)app\]/i // LinkedIn App for iOS & Android
], [NAME, [TYPE, INAPP]], [
@@ -613,7 +610,7 @@
], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
// 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-l]\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-k]\w[1m]10)\b/i,
/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
], [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]], [
@@ -653,7 +650,7 @@
], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [
// LG
/\b(?:lg)?([vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [
/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
/\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,
@@ -944,7 +941,7 @@
/(presto)\/([\w\.]+)/i, // Presto
/(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
/(khtml|tasman|links|dillo)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links/Dillo
/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links
/(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab
/\b(libweb)/i // LibWeb
@@ -1006,7 +1003,7 @@
], [VERSION, [NAME, BLACKBERRY]], [
/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i // Symbian
], [VERSION, [NAME, 'Symbian']], [
/mozilla\/[\d\.]+ \((?:mobile[;\w ]*|tablet|tv|[^\)]*(?:viera|lg(?:l25|-d300)|alcatel ?o.+|y300-f1)); rv:([\w\.]+)\).+gecko\//i // Firefox OS
/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i // Firefox OS
], [VERSION, [NAME, FIREFOX+' OS']], [
/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i, // WebOS
/webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i
@@ -1022,6 +1019,7 @@
], [[NAME, "Chrome OS"], VERSION],[
// Smart TVs
/panasonic;(viera)/i, // Panasonic Viera
/(netrange)mmh/i, // Netrange
/(nettv)\/(\d+\.[\w\.]+)/i, // NetTV

View File

@@ -866,16 +866,6 @@
"major" : "40"
}
},
{
"desc" : "Hi Browser",
"ua" : "Mozilla/5.0 (Linux; Android 14; en; TECNO BG6m Build/SP1A.210812.016) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 HiBrowser/v2.25.6.3;lang=es;nation=DO;locale=es_DO UWS/ Mobile Safari/537.36",
"expect" :
{
"name" : "HiBrowser",
"version" : "2.25.6.3",
"major" : "2"
}
},
{
"desc" : "HuaweiBrowser",
"ua" : "Mozilla/5.0 (Linux; Android 6.0.1; LYA-AL00HMSCore/4.0.0 GMS/10.4 ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.64 HuaweiBrowser/10.0.3.102 Mobile Safari/537.36",
@@ -2518,26 +2508,6 @@
"major" : "1"
}
},
{
"desc" : "Brave",
"ua" : "Mozilla/5.0 (Linux; Android 11; SM-T870) AppleWebKit/537.36 (KHTML, like Gecko) Brave Chrome/88.0.4324.96 Safari/537.36",
"expect" :
{
"name" : "Brave",
"version" : "88.0.4324.96",
"major" : "88"
}
},
{
"desc" : "Brave",
"ua" : "Mozilla/5.0 (Linux; Android 11; Samsung Galaxy F62 SM-E625F Build/SME625F512091028;) AppleWebKit/537.36 (KHTML, like Gecko) Brave/1.75.110 Mobile Safari/537.36",
"expect" :
{
"name" : "Brave",
"version" : "1.75.110",
"major" : "1"
}
},
{
"desc" : "Brave Browser",
"ua" : "Brave/4.5.16 CFNetwork/893.13.1 Darwin/17.3.0 (x86_64)",
@@ -2782,16 +2752,6 @@
"major" : "28",
"type" : "inapp"
}
},
{
"desc" : "TikTok",
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 18_6_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Safari/604.1 trill_43.0.0 BytedanceWebview/d8a21c6",
"expect" : {
"name" : "TikTok",
"version": "43.0.0",
"major" : "43",
"type" : "inapp"
}
},
{
"desc" : "Chrome Mobile",

View File

@@ -2,214 +2,88 @@
{
"desc" : "Airmail",
"ua" : "Airmail 1.0 rv:148 (Macintosh; Mac OS X 10.8.3; en_BE)",
"expect": {
"expect" :
{
"name" : "Airmail",
"version" : "1.0",
"type" : "email"
}
},
{
"desc": "Alpine",
"ua": "Alpine/2.21 (Linux; x86_64)",
"expect": {
"name": "Alpine",
"version": "2.21",
"type": "email"
}
},
{
"desc": "Android Mail (AOSP)",
"ua": "Android/9-email",
"expect": {
"name": "Android",
"version": "9-email",
"type": "email"
}
},
{
"desc" : "Apple Mail",
"ua" : "Mail/3826.500.181.1.5 CFNetwork/3826.500.111.1.1 Darwin/24.4.0",
"expect": {
"expect" :
{
"name" : "Mail",
"version" : "3826.500.181.1.5",
"type" : "email"
}
},
{
"desc": "Aqua Mail",
"ua": "AquaMail/1.16.0-1081 (build: 101600003)",
"expect": {
"name": "AquaMail",
"version": "1.16.0-1081",
"type": "email"
}
},
{
"desc": "Balsa",
"ua": "Balsa/2.6.4",
"expect": {
"name": "Balsa",
"version": "2.6.4",
"type": "email"
}
},
{
"desc": "Barca",
"ua": "Barca/2.8 (Windows NT 5.1)",
"expect": {
"name": "Barca",
"version": "2.8",
"type": "email"
}
},
{
"desc" : "BlueMail",
"ua" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) BlueMail/0.10.31 Chrome/61.0.3163.100 Electron/2.0.18 Safari/537.36",
"expect": {
"expect" :
{
"name" : "BlueMail",
"version" : "0.10.31",
"type" : "email"
}
},
{
"desc": "BlueMail (iOS)",
"desc" : "BlueMail",
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16A405 BlueMail iOS",
"expect": {
"expect" :
{
"name" : "BlueMail",
"version" : "iOS",
"type" : "email"
}
},
{
"desc": "Canary Mail",
"ua": "Canary/413 (Macintosh; OS X 14.2.1)",
"expect": {
"name": "Canary",
"version": "413",
"type": "email"
}
},
{
"desc": "Claws Mail",
"ua": "Claws Mail/3.17.5 (x86_64-pc-linux-gnu)",
"expect": {
"name": "Claws Mail",
"version": "3.17.5",
"type": "email"
}
},
{
"desc" : "DaumMail",
"ua" : "DaumMobileApp (LG-KU5400; U; Android 2.3.7|10; ko-kr) DaumMail/1.0.8 ",
"expect": {
"expect" :
{
"name" : "DaumMail",
"version" : "1.0.8",
"type" : "email"
}
},
{
"desc": "eM Client",
"ua": "eMClient/9.2.2157.0",
"expect": {
"name": "eMClient",
"version": "9.2.2157.0",
"type": "email"
}
},
{
"desc": "Eudora OSE",
"ua": "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.19) Gecko/20110420 Eudora/3.0.4",
"expect": {
"name": "Eudora",
"version": "3.0.4",
"type": "email"
}
},
{
"desc" : "Evolution",
"ua" : "Evolution/3.52.3",
"expect": {
"expect" :
{
"name" : "Evolution",
"version" : "3.52.3",
"type" : "email"
}
},
{
"desc": "FairEmail",
"ua": "FairEmail/1.2066 (Android 13; Pixel 7)",
"expect": {
"name": "FairEmail",
"version": "1.2066",
"desc" : "eM Client",
"ua" : "eMClient/9.2.2157.0",
"expect" :
{
"name" : "eMClient",
"version" : "9.2.2157.0",
"type" : "email"
}
},
{
"desc" : "Foxmail",
"ua" : "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36 foxmail/7.2.15.80",
"expect": {
"expect" :
{
"name" : "foxmail",
"version" : "7.2.15.80",
"type" : "email"
}
},
{
"desc": "Geary",
"ua": "Geary/40.0 (Linux; x86_64)",
"expect": {
"name": "Geary",
"version": "40.0",
"type": "email"
}
},
{
"desc": "Gnus",
"ua": "Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux)",
"expect": {
"name": "Gnus",
"version": "5.13",
"type": "email"
}
},
{
"desc": "Horde IMP",
"ua": "Horde::IMP/6.2.27 (Linux)",
"expect": {
"name": "Horde::IMP",
"version": "6.2.27",
"type": "email"
}
},
{
"desc": "IBM Notes",
"ua": "Lotus-Notes/8.5.3",
"expect": {
"name": "Lotus-Notes",
"version": "8.5.3",
"type": "email"
}
},
{
"desc": "IncrediMail",
"ua": "IncrediMail/6.29.5126",
"expect": {
"name": "IncrediMail",
"version": "6.29.5126",
"type": "email"
}
},
{
"desc": "K-9 Mail",
"ua": "K-9 Mail/5.600",
"expect": {
"name": "K-9 Mail",
"version": "5.600",
"type": "email"
}
},
{
"desc" : "KMail",
"ua" : "KMail/4.14.10 (FreeBSD/12.0-CURRENT; KDE/4.14.10; amd64; ; )",
"expect": {
"expect" :
{
"name" : "KMail",
"version" : "4.14.10",
"type" : "email"
@@ -218,7 +92,8 @@
{
"desc" : "KMail2",
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) kmail2/5.7.3 Safari/534.34",
"expect": {
"expect" :
{
"name" : "kmail2",
"version" : "5.7.3",
"type" : "email"
@@ -227,43 +102,18 @@
{
"desc" : "Kontact",
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) kontact/4.13.3 Safari/534.34",
"expect": {
"expect" :
{
"name" : "kontact",
"version" : "4.13.3",
"type" : "email"
}
},
{
"desc": "Mailbird",
"ua": "Mailbird/2.9.0.0",
"expect": {
"name": "Mailbird",
"version": "2.9.0.0",
"type": "email"
}
},
{
"desc": "MailMate",
"ua": "MailMate/5663 (Macintosh; Intel Mac OS X 10.15.7)",
"expect": {
"name": "MailMate",
"version": "5663",
"type": "email"
}
},
{
"desc": "Mailspring",
"ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Mailspring/1.7.8 Chrome/69.0.3497.128 Electron/4.2.12 Safari/537.36",
"expect": {
"name": "Mailspring",
"version": "1.7.8",
"type": "email"
}
},
{
"desc" : "Microsoft Outlook",
"ua" : "Microsoft Office/16.0 (Windows NT 10.0; Microsoft Outlook 16.0.5431; Pro)",
"expect": {
"expect" :
{
"name" : "Microsoft Outlook",
"version" : "16.0.5431",
"type" : "email"
@@ -272,160 +122,48 @@
{
"desc" : "Microsoft Outlook for Mac",
"ua" : "MacOutlook/14.7.1.161129 (Intel Mac OS X 10.9.6)",
"expect": {
"expect" :
{
"name" : "MacOutlook",
"version" : "14.7.1.161129",
"type" : "email"
}
},
{
"desc": "Mutt",
"ua": "Mutt/1.5.21 (2010-09-15)",
"expect": {
"name": "Mutt",
"version": "1.5.21",
"type": "email"
}
},
{
"desc" : "NaverMailApp",
"ua" : "NaverMailApp/2.1.23 (Android 10; SM-N960N)",
"expect": {
"expect" :
{
"name" : "NaverMailApp",
"version" : "2.1.23",
"type" : "email"
}
},
{
"desc": "Newton Mail",
"ua": "Newton/10.0.52 (Android 10; K)",
"expect": {
"name": "Newton",
"version": "10.0.52",
"type": "email"
}
},
{
"desc": "Nine",
"ua": "Nine/4.5.3a",
"expect": {
"name": "Nine",
"version": "4.5.3a",
"type": "email"
}
},
{
"desc": "Nylas Mail",
"ua": "NylasMail/2.0.32 (Macintosh; OS X 10.12.6)",
"expect": {
"name": "NylasMail",
"version": "2.0.32",
"type": "email"
}
},
{
"desc": "Outlook Express",
"ua": "Outlook-Express/6.0 (MSIE 6.0; Windows NT 5.1; SV1)",
"expect": {
"name": "Outlook-Express",
"version": "6.0",
"type": "email"
}
},
{
"desc": "Pegasus Mail",
"ua": "Pegasus Mail/4.70",
"expect": {
"name": "Pegasus Mail",
"version": "4.70",
"type": "email"
}
},
{
"desc": "PocoMail",
"ua": "PocoMail 4.8 (4320) - Licensed Version",
"expect": {
"name": "PocoMail",
"version": "4.8",
"type": "email"
}
},
{
"desc" : "Polymail",
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Polymail/2.3.12 Chrome/114.0.5735.134 Electron/25.2.0 Safari/537.36",
"expect": {
"expect" :
{
"name" : "Polymail",
"version" : "2.3.12",
"type" : "email"
}
},
{
"desc": "Postbox",
"ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:60.0) Gecko/20100101 Postbox/7.0.26",
"expect": {
"name": "Postbox",
"version": "7.0.26",
"type": "email"
}
},
{
"desc" : "ProtonMail",
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) ProtonMail/1.4.0 Chrome/122.0.6261.156 Electron/29.4.6 Safari/537.36",
"expect": {
"expect" :
{
"name" : "ProtonMail",
"version" : "1.4.0",
"type" : "email"
}
},
{
"desc": "ProtonMail Bridge",
"ua": "ProtonMail Bridge/3.8.2 (Macintosh; Intel Mac OS X 10_15_7)",
"expect": {
"name": "ProtonMail Bridge",
"version": "3.8.2",
"type": "email"
}
},
{
"desc": "R2Mail2",
"ua": "R2Mail2/2.50 (Android)",
"expect": {
"name": "R2Mail2",
"version": "2.50",
"type": "email"
}
},
{
"desc": "RainLoop",
"ua": "RainLoop/1.17.0",
"expect": {
"name": "RainLoop",
"version": "1.17.0",
"type": "email"
}
},
{
"desc": "Roundcube Webmail",
"ua": "Roundcube Webmail/1.6.0",
"expect": {
"name": "Roundcube Webmail",
"version": "1.6.0",
"type": "email"
}
},
{
"desc": "Samsung Email",
"ua": "SamsungEmail/6.1.80.12",
"expect": {
"name": "SamsungEmail",
"version": "6.1.80.12",
"type": "email"
}
},
{
"desc" : "SparkDesktop",
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) SparkDesktop/3.0.30 Chrome/102.0.5005.63 Electron/19.0.4 Safari/537.36",
"expect": {
"expect" :
{
"name" : "SparkDesktop",
"version" : "3.0.30",
"type" : "email"
@@ -434,151 +172,58 @@
{
"desc" : "Sparrow",
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/604.5.6 (KHTML, like Gecko) Sparrow/1043.1",
"expect": {
"expect" :
{
"name" : "Sparrow",
"version" : "1043.1",
"type" : "email"
}
},
{
"desc": "Spicebird",
"ua": "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.9pre) Gecko/20100216 Spicebird/0.8",
"expect": {
"name": "Spicebird",
"version": "0.8",
"type": "email"
}
},
{
"desc": "SquirrelMail",
"ua": "SquirrelMail/1.4.23 [SVN]",
"expect": {
"name": "SquirrelMail",
"version": "1.4.23",
"type": "email"
}
},
{
"desc": "Sylpheed",
"ua": "Sylpheed/3.7.0 (MinGW32; Windows NT 6.1; x86_64)",
"expect": {
"name": "Sylpheed",
"version": "3.7.0",
"type": "email"
}
},
{
"desc": "The Bat!",
"ua": "The Bat! 9.2.1",
"expect": {
"name": "The Bat!",
"version": "9.2.1",
"type": "email"
}
},
{
"desc" : "Thunderbird",
"ua" : "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0",
"expect": {
"expect" :
{
"name" : "Thunderbird",
"version" : "78.13.0",
"type" : "email"
}
},
{
"desc": "Trojita",
"ua": "Trojita/0.7",
"expect": {
"name": "Trojita",
"version": "0.7",
"type": "email"
}
},
{
"desc": "Turnpike",
"ua": "Turnpike/6.07-U",
"expect": {
"name": "Turnpike",
"version": "6.07-U",
"type": "email"
}
},
{
"desc": "Tuta Desktop (Tutanota)",
"ua": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) tutanota-desktop/3.110.1 Chrome/110.0.5481.179 Electron/23.1.3 Safari/537.36",
"expect": {
"name": "tutanota-desktop",
"version": "3.110.1",
"type": "email"
}
},
{
"desc": "Wanderlust",
"ua": "Wanderlust/2.15.9 (Almost Unreal) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (Gojō) APEL/10.8 Emacs/23.1 (i486-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO)",
"expect": {
"name": "Wanderlust",
"version": "2.15.9",
"type": "email"
}
},
{
"desc": "Windows Live Mail",
"ua": "Windows-Live-Mail/15.4.3508.1109",
"expect": {
"name": "Windows-Live-Mail",
"version": "15.4.3508.1109",
"type": "email"
}
},
{
"desc": "Yahoo! Mail (Android)",
"desc" : "Yahoo! Mail",
"ua" : "YahooMobile/1.0 (mail; 3.0.5.1311380); (Linux; U; Android 4.0.3; htc_runnymede Build/ICE_CREAM_SANDWICH_MR1);",
"expect": {
"name": "Yahoo Mail",
"version": "1.0",
"expect" :
{
"name" : "Yahoo",
"version" : "3.0.5.1311380",
"type" : "email"
}
},
{
"desc": "Yahoo! Mail (Legacy)",
"desc" : "Yahoo! Mail",
"ua" : "YahooMobileMail/1.0 (Android Mail; 1.3.10) (supersonic;HTC;PC36100;2.3.5/GRJ90) ",
"expect": {
"name": "Yahoo Mail",
"version": "1.3.10",
"type": "email"
}
},
"expect" :
{
"desc": "Yahoo! Mail (iOS)",
"ua": "YahooMail/1.0 (iOS; 1.0.0; en_US)",
"expect": {
"name": "Yahoo Mail",
"version": "1.0",
"name" : "Yahoo",
"version" : "1.3.10",
"type" : "email"
}
},
{
"desc" : "Zimbra",
"ua" : "Mozilla/5.0 (Windows; U; Windows NT 6.2; it; rv:1.9.2.19pre) Gecko/20110902 Prism zdesktop/7.2.8",
"expect": {
"expect" :
{
"name" : "Zimbra",
"version" : "7.2.8",
"type" : "email"
}
},
{
"desc": "Zimbra (Server)",
"ua": "Zimbra/9.0.0_GA_4138",
"expect": {
"name": "Zimbra",
"version": "9.0.0_GA_4138",
"type": "email"
}
},
{
"desc" : "ZohoMail",
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) ZohoMail-Desktop/1.6.3 Chrome/124.0.6367.207 Electron/30.0.6 Safari/537.36",
"expect": {
"expect" :
{
"name" : "ZohoMail-Desktop",
"version" : "1.6.3",
"type" : "email"

View File

@@ -89,16 +89,6 @@
"type" : "library"
}
},
{
"desc" : "GuzzleHttp",
"ua" : "GuzzleHttp/6.5.5 curl/7.70.0 PHP/7.4.22",
"expect" :
{
"name" : "GuzzleHttp",
"version" : "6.5.5",
"type" : "library"
}
},
{
"desc" : "hackney",
"ua" : "hackney/1.20.1",
@@ -110,12 +100,12 @@
}
},
{
"desc" : "http.rb",
"ua" : "http.rb/4.2.0",
"desc" : "GuzzleHttp",
"ua" : "GuzzleHttp/6.5.5 curl/7.70.0 PHP/7.4.22",
"expect" :
{
"name" : "http.rb",
"version" : "4.2.0",
"name" : "GuzzleHttp",
"version" : "6.5.5",
"type" : "library"
}
},
@@ -139,16 +129,6 @@
"type" : "library"
}
},
{
"desc" : "Jetty",
"ua" : "Jetty/11.0.13",
"expect" :
{
"name" : "Jetty",
"version" : "11.0.13",
"type" : "library"
}
},
{
"desc" : "jsdom",
"ua" : "Mozilla/5.0 (unknown OS) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/11.12.0",
@@ -219,16 +199,6 @@
"type" : "library"
}
},
{
"desc" : "ocaml-cohttp",
"ua" : "ocaml-cohttp/1.2.00",
"expect" :
{
"name" : "ocaml-cohttp",
"version" : "1.2.00",
"type" : "library"
}
},
{
"desc" : "OkHttp",
"ua" : "okhttp/3.2.0",

View File

@@ -38,34 +38,18 @@ describe('Extensions', () => {
});
});
// Existing test cases
const outlook = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Microsoft Outlook 16.0.9126; Microsoft Outlook 16.0.9126; ms-office; MSOffice 16)';
const thunderbird = 'Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0';
const axios = 'axios/1.3.5';
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)';
// New test cases for updated Regex logic
const macOutlook = 'MacOutlook/16.61.22041701 (Intel Mac OS X 10.15.7)';
const yahooMobile = 'YahooMobile/1.0 (mail; 3.0.5.1311380)';
assert.equal(UAParser(scrapy, Bots).browser.name, Library.SCRAPY);
const emailParser = new UAParser(Emails);
// Verify Standard Outlook
assert.deepEqual(emailParser.setUA(outlook).getBrowser(), {name: Email.MICROSOFT_OUTLOOK, version: "16.0.9126", major: "16", type: BrowserType.EMAIL});
// Verify Thunderbird
assert.deepEqual(emailParser.setUA(thunderbird).getBrowser(), {name: Email.THUNDERBIRD, version: "78.13.0", major: "78", type: BrowserType.EMAIL});
// Verify New MacOutlook Logic (Distinguishing it from Windows Outlook)
assert.deepEqual(emailParser.setUA(macOutlook).getBrowser(), {name: Email.MICROSOFT_OUTLOOK_MAC, version: "16.61.22041701", major: "16", type: BrowserType.EMAIL});
// Verify Yahoo Mobile Logic (Tightened Regex)
// Note: We expect 'Yahoo Mail' (Email.YAHOO_MAIL) because of the normalization helper.
assert.deepEqual(emailParser.setUA(yahooMobile).getBrowser(), {name: Email.YAHOO_MAIL, version: "1.0", major: "1", type: BrowserType.EMAIL});
const libraryParser = new UAParser(Libraries);
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});

View File

@@ -1,5 +1,5 @@
const assert = require('assert');
const { isFrozenUA, getOutlookEdition } = require('../../../src/helpers/ua-parser-helpers');
const { isFrozenUA } = require('../../../src/helpers/ua-parser-helpers');
describe('isFrozenUA()', () => {
it('matches supplied user-agent string with known frozen user-agent pattern', () => {
@@ -11,29 +11,3 @@ describe('isFrozenUA()', () => {
assert.equal(isFrozenUA(frozenMobileUA), true);
});
});
describe('getOutlookEdition()', () => {
it('identifies Windows versions correctly', () => {
// MSI Version (Older engine)
assert.equal(getOutlookEdition('Microsoft Outlook', '16.0.4266.1001'), 'Outlook 2016 (MSI / Volume License)');
// Click-to-Run (Modern engine)
assert.equal(getOutlookEdition('Microsoft Outlook', '16.0.14326.20000'), 'Outlook 365 / 2019+ (Modern)');
// Legacy Major Version
assert.equal(getOutlookEdition('Microsoft Outlook', '15.0.4569.1506'), 'Outlook 2013');
});
it('identifies Mac versions correctly', () => {
assert.equal(getOutlookEdition('MacOutlook', '16.61'), 'Outlook for Mac (Modern)');
assert.equal(getOutlookEdition('MacOutlook', '15.4'), 'Outlook for Mac (Legacy)');
});
it('returns original name for unknown inputs', () => {
assert.equal(getOutlookEdition('Thunderbird', '91.0'), 'Thunderbird');
});
it('handles New Outlook (OneOutlook) correctly', () => {
// New Outlook usually sends a browser UA, but if it sends "Outlook" without version info matches,
// it shouldn't trigger the Legacy/MSI logic.
assert.equal(getOutlookEdition('Microsoft Outlook', 'SomeRandomString'), 'Microsoft Outlook');
});
});