ua-parser-js 2.0.0-beta.3 → 2.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -17
- package/dist/icons/color/LICENSE.md +3 -0
- package/dist/icons/color/browser/android-browser.svg +1 -0
- package/dist/icons/color/browser/avant.png +0 -0
- package/dist/icons/color/browser/basilisk.png +0 -0
- package/dist/icons/color/browser/basilisk.svg +1 -0
- package/dist/icons/color/browser/brave.png +0 -0
- package/dist/icons/color/browser/brave.svg +1 -0
- package/dist/icons/color/browser/chrome.png +0 -0
- package/dist/icons/color/browser/chrome.svg +1 -0
- package/dist/icons/color/browser/chromium.png +0 -0
- package/dist/icons/color/browser/chromium.svg +1 -0
- package/dist/icons/color/browser/coc-coc.png +0 -0
- package/dist/icons/color/browser/default.png +0 -0
- package/dist/icons/color/browser/default.svg +1 -0
- package/dist/icons/color/browser/dolphin.png +0 -0
- package/dist/icons/color/browser/edge.png +0 -0
- package/dist/icons/color/browser/edge.svg +1 -0
- package/dist/icons/color/browser/electron.png +0 -0
- package/dist/icons/color/browser/electron.svg +1 -0
- package/dist/icons/color/browser/falkon.png +0 -0
- package/dist/icons/color/browser/falkon.svg +1 -0
- package/dist/icons/color/browser/firefox-reality.png +0 -0
- package/dist/icons/color/browser/firefox-reality.svg +1 -0
- package/dist/icons/color/browser/firefox.png +0 -0
- package/dist/icons/color/browser/firefox.svg +1 -0
- package/dist/icons/color/browser/gsa.svg +9 -0
- package/dist/icons/color/browser/icecat.png +0 -0
- package/dist/icons/color/browser/ie.svg +6 -0
- package/dist/icons/color/browser/konqueror.png +0 -0
- package/dist/icons/color/browser/konqueror.svg +1 -0
- package/dist/icons/color/browser/maxthon.png +0 -0
- package/dist/icons/color/browser/midori.png +0 -0
- package/dist/icons/color/browser/midori.svg +1 -0
- package/dist/icons/color/browser/netsurf.png +0 -0
- package/dist/icons/color/browser/netsurf.svg +1 -0
- package/dist/icons/color/browser/opera-gx.png +0 -0
- package/dist/icons/color/browser/opera-gx.svg +1 -0
- package/dist/icons/color/browser/opera-mini.png +0 -0
- package/dist/icons/color/browser/opera-touch.png +0 -0
- package/dist/icons/color/browser/opera.png +0 -0
- package/dist/icons/color/browser/opera.svg +1 -0
- package/dist/icons/color/browser/palemoon.png +0 -0
- package/dist/icons/color/browser/puffin.png +0 -0
- package/dist/icons/color/browser/safari.png +0 -0
- package/dist/icons/color/browser/safari.svg +1 -0
- package/dist/icons/color/browser/samsung-internet.png +0 -0
- package/dist/icons/color/browser/samsung-internet.svg +1 -0
- package/dist/icons/color/browser/seamonkey.png +0 -0
- package/dist/icons/color/browser/silk.png +0 -0
- package/dist/icons/color/browser/sogou-mobile.png +0 -0
- package/dist/icons/color/browser/ucbrowser.png +0 -0
- package/dist/icons/color/browser/ucbrowser.svg +1 -0
- package/dist/icons/color/browser/vivaldi.png +0 -0
- package/dist/icons/color/browser/vivaldi.svg +1 -0
- package/dist/icons/color/browser/webkit.png +0 -0
- package/dist/icons/color/browser/webkit.svg +1 -0
- package/dist/icons/color/browser/yandex.png +0 -0
- package/dist/icons/color/os/centos.svg +1 -0
- package/dist/icons/mono/LICENSE.md +3 -0
- package/dist/icons/mono/browser/alipay.svg +1 -0
- package/dist/icons/mono/browser/android-browser.svg +1 -0
- package/dist/icons/mono/browser/avast-secure-browser.svg +1 -0
- package/dist/icons/mono/browser/baidu-browser.svg +1 -0
- package/dist/icons/mono/browser/brave.svg +1 -0
- package/dist/icons/mono/browser/chrome-headless.svg +1 -0
- package/dist/icons/mono/browser/chrome-webview.svg +1 -0
- package/dist/icons/mono/browser/chrome.svg +1 -0
- package/dist/icons/mono/browser/chromium.svg +1 -0
- package/dist/icons/mono/browser/duckduckgo.svg +1 -0
- package/dist/icons/mono/browser/edge.svg +1 -0
- package/dist/icons/mono/browser/electron.svg +1 -0
- package/dist/icons/mono/browser/facebook.svg +1 -0
- package/dist/icons/mono/browser/firefox-focus.svg +1 -0
- package/dist/icons/mono/browser/firefox-reality.svg +1 -0
- package/dist/icons/mono/browser/firefox.svg +1 -0
- package/dist/icons/mono/browser/gsa.svg +1 -0
- package/dist/icons/mono/browser/huawei-browser.svg +1 -0
- package/dist/icons/mono/browser/icecat.svg +1 -0
- package/dist/icons/mono/browser/ie.svg +1 -0
- package/dist/icons/mono/browser/instagram.svg +1 -0
- package/dist/icons/mono/browser/jasmine.svg +1 -0
- package/dist/icons/mono/browser/kakaotalk.svg +1 -0
- package/dist/icons/mono/browser/klarna.svg +1 -0
- package/dist/icons/mono/browser/line.svg +1 -0
- package/dist/icons/mono/browser/linkedin.svg +1 -0
- package/dist/icons/mono/browser/miui-browser.svg +1 -0
- package/dist/icons/mono/browser/mobile-chrome.svg +1 -0
- package/dist/icons/mono/browser/mobile-firefox.svg +1 -0
- package/dist/icons/mono/browser/mobile-safari.svg +1 -0
- package/dist/icons/mono/browser/mozilla.svg +1 -0
- package/dist/icons/mono/browser/naver.svg +1 -0
- package/dist/icons/mono/browser/nokia-browser.svg +1 -0
- package/dist/icons/mono/browser/oculus-browser.svg +1 -0
- package/dist/icons/mono/browser/opera-coast.svg +1 -0
- package/dist/icons/mono/browser/opera-gx.svg +1 -0
- package/dist/icons/mono/browser/opera-mini.svg +1 -0
- package/dist/icons/mono/browser/opera-mobi.svg +1 -0
- package/dist/icons/mono/browser/opera-tablet.svg +1 -0
- package/dist/icons/mono/browser/opera-touch.svg +1 -0
- package/dist/icons/mono/browser/opera.svg +1 -0
- package/dist/icons/mono/browser/qqbrowser.svg +1 -0
- package/dist/icons/mono/browser/qqbrowserlite.svg +1 -0
- package/dist/icons/mono/browser/safari.svg +1 -0
- package/dist/icons/mono/browser/sailfish-browser.svg +1 -0
- package/dist/icons/mono/browser/samsung-internet.svg +1 -0
- package/dist/icons/mono/browser/smart-lenovo-browser.svg +1 -0
- package/dist/icons/mono/browser/snapchat.svg +1 -0
- package/dist/icons/mono/browser/sogou-explorer.svg +1 -0
- package/dist/icons/mono/browser/sogou-mobile.svg +1 -0
- package/dist/icons/mono/browser/tesla.svg +1 -0
- package/dist/icons/mono/browser/tiktok.svg +1 -0
- package/dist/icons/mono/browser/twitter.svg +1 -0
- package/dist/icons/mono/browser/vivaldi.svg +1 -0
- package/dist/icons/mono/browser/vivo-browser.svg +1 -0
- package/dist/icons/mono/browser/wechat.svg +1 -0
- package/dist/icons/mono/browser/weibo.svg +1 -0
- package/dist/icons/mono/browser/yandex.svg +1 -0
- package/dist/icons/mono/device/acer.svg +1 -0
- package/dist/icons/mono/device/amazon.svg +1 -0
- package/dist/icons/mono/device/apple.svg +1 -0
- package/dist/icons/mono/device/asus.svg +1 -0
- package/dist/icons/mono/device/att.svg +1 -0
- package/dist/icons/mono/device/blackberry.svg +1 -0
- package/dist/icons/mono/device/dell.svg +1 -0
- package/dist/icons/mono/device/facebook.svg +1 -0
- package/dist/icons/mono/device/fairphone.svg +1 -0
- package/dist/icons/mono/device/google.svg +1 -0
- package/dist/icons/mono/device/hp.svg +1 -0
- package/dist/icons/mono/device/huawei.svg +1 -0
- package/dist/icons/mono/device/lenovo.svg +1 -0
- package/dist/icons/mono/device/lg.svg +1 -0
- package/dist/icons/mono/device/meizu.svg +1 -0
- package/dist/icons/mono/device/microsoft.svg +1 -0
- package/dist/icons/mono/device/motorola.svg +1 -0
- package/dist/icons/mono/device/nintendo.svg +1 -0
- package/dist/icons/mono/device/nokia.svg +1 -0
- package/dist/icons/mono/device/nvidia.svg +1 -0
- package/dist/icons/mono/device/oneplus.svg +1 -0
- package/dist/icons/mono/device/oppo.svg +1 -0
- package/dist/icons/mono/device/panasonic.svg +1 -0
- package/dist/icons/mono/device/roku.svg +1 -0
- package/dist/icons/mono/device/samsung.svg +1 -0
- package/dist/icons/mono/device/siemens.svg +1 -0
- package/dist/icons/mono/device/sony.svg +1 -0
- package/dist/icons/mono/device/tesla.svg +1 -0
- package/dist/icons/mono/device/vivo.svg +1 -0
- package/dist/icons/mono/device/vodafone.svg +1 -0
- package/dist/icons/mono/device/xiaomi.svg +1 -0
- package/dist/icons/mono/device/zebra.svg +1 -0
- package/dist/icons/mono/os/android.svg +1 -0
- package/dist/icons/mono/os/arch.svg +1 -0
- package/dist/icons/mono/os/blackberry.svg +1 -0
- package/dist/icons/mono/os/centos.svg +1 -0
- package/dist/icons/mono/os/chrome-os.svg +1 -0
- package/dist/icons/mono/os/chromecast.svg +1 -0
- package/dist/icons/mono/os/debian.svg +1 -0
- package/dist/icons/mono/os/deepin.svg +1 -0
- package/dist/icons/mono/os/elementary-os.svg +1 -0
- package/dist/icons/mono/os/fedora.svg +1 -0
- package/dist/icons/mono/os/firefox.svg +1 -0
- package/dist/icons/mono/os/freebsd.svg +1 -0
- package/dist/icons/mono/os/gentoo.svg +1 -0
- package/dist/icons/mono/os/gnu.svg +1 -0
- package/dist/icons/mono/os/harmonyos.svg +1 -0
- package/dist/icons/mono/os/ios.svg +1 -0
- package/dist/icons/mono/os/kaios.svg +1 -0
- package/dist/icons/mono/os/linux.svg +1 -0
- package/dist/icons/mono/os/macos.svg +1 -0
- package/dist/icons/mono/os/manjaro.svg +1 -0
- package/dist/icons/mono/os/mint.svg +1 -0
- package/dist/icons/mono/os/netbsd.svg +1 -0
- package/dist/icons/mono/os/nintendo.svg +1 -0
- package/dist/icons/mono/os/openbsd.svg +1 -0
- package/dist/icons/mono/os/playstation.svg +1 -0
- package/dist/icons/mono/os/raspbian.svg +1 -0
- package/dist/icons/mono/os/redhat.svg +1 -0
- package/dist/icons/mono/os/sailfish.svg +1 -0
- package/dist/icons/mono/os/slackware.svg +1 -0
- package/dist/icons/mono/os/suse.svg +1 -0
- package/dist/icons/mono/os/ubuntu.svg +1 -0
- package/dist/icons/mono/os/windows.svg +1 -0
- package/dist/icons/mono/os/xbox.svg +1 -0
- package/dist/ua-parser.min.js +2 -2
- package/dist/ua-parser.pack.js +2 -2
- package/package.json +7 -4
- package/src/enums/ua-parser-enums.js +13 -5
- package/src/enums/ua-parser-enums.mjs +13 -5
- package/src/extensions/ua-parser-extensions.d.ts +1 -0
- package/src/extensions/ua-parser-extensions.js +100 -75
- package/src/extensions/ua-parser-extensions.mjs +100 -75
- package/src/helpers/ua-parser-helpers.d.ts +11 -3
- package/src/helpers/ua-parser-helpers.js +44 -5
- package/src/helpers/ua-parser-helpers.mjs +45 -6
- package/src/main/ua-parser.d.ts +2 -2
- package/src/main/ua-parser.js +59 -17
- package/src/main/ua-parser.mjs +59 -17
@@ -1,5 +1,5 @@
|
|
1
1
|
///////////////////////////////////////////////
|
2
|
-
/* Helpers for UAParser.js v2.0.0-
|
2
|
+
/* Helpers for UAParser.js v2.0.0-rc.1
|
3
3
|
https://github.com/faisalman/ua-parser-js
|
4
4
|
Author: Faisal Salman <f@faisalman.com>
|
5
5
|
AGPLv3 License */
|
@@ -8,15 +8,54 @@
|
|
8
8
|
/*jshint esversion: 6 */
|
9
9
|
|
10
10
|
const { CPU, OS, Engine } = require('../enums/ua-parser-enums');
|
11
|
+
const { UAParser } = require('../main/ua-parser');
|
12
|
+
const { isFromEU } = require('detect-europe-js');
|
11
13
|
|
12
|
-
const
|
14
|
+
const getDeviceVendor = (model) => UAParser(`Mozilla/5.0 (Linux; Android 10; ${model}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36`).device.vendor;
|
13
15
|
|
14
|
-
const
|
16
|
+
const isAppleSilicon = (res) => {
|
17
|
+
if (res.os.is(OS.MACOS)) {
|
18
|
+
if (res.cpu.is(CPU.ARM)) {
|
19
|
+
return true;
|
20
|
+
}
|
21
|
+
try {
|
22
|
+
const canvas = document.createElement('canvas');
|
23
|
+
const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
|
24
|
+
const debug = webgl.getExtension('WEBGL_debug_renderer_info');
|
25
|
+
const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);
|
26
|
+
if (renderer.match(/apple m\d/i)) {
|
27
|
+
return true;
|
28
|
+
}
|
29
|
+
} catch {
|
30
|
+
return false;
|
31
|
+
}
|
32
|
+
}
|
33
|
+
return false;
|
34
|
+
}
|
35
|
+
|
36
|
+
const isChromeFamily = (res) => res.engine.is(Engine.BLINK);
|
37
|
+
|
38
|
+
const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
|
39
|
+
/ electron\//i.test(navigator?.userAgent)); // browser
|
15
40
|
|
16
41
|
const isFrozenUA = (ua) => /^Mozilla\/5\.0 \((Windows NT 10\.0; Win64; x64|Macintosh; Intel Mac OS X 10_15_7|X11; Linux x86_64|X11; CrOS x86_64 14541\.0\.0|Fuchsia|Linux; Android 10; K)\) AppleWebKit\/537\.36 \(KHTML, like Gecko\) Chrome\/\d+\.0\.0\.0 (Mobile )?Safari\/537\.36/.test(ua);
|
17
42
|
|
43
|
+
const isStandalonePWA = () => window && (window.matchMedia('(display-mode: standalone)').matches ||
|
44
|
+
// iOS
|
45
|
+
navigator.standalone ||
|
46
|
+
// Android
|
47
|
+
document.referrer.startsWith('android-app://') ||
|
48
|
+
// Windows
|
49
|
+
window.Windows ||
|
50
|
+
/trident.+(msapphost|webview)\//i.test(navigator.userAgent) ||
|
51
|
+
document.referrer.startsWith('app-info://platform/microsoft-store'));
|
52
|
+
|
18
53
|
module.exports = {
|
54
|
+
getDeviceVendor,
|
19
55
|
isAppleSilicon,
|
20
|
-
|
21
|
-
|
56
|
+
isChromeFamily,
|
57
|
+
isElectron,
|
58
|
+
isFromEU,
|
59
|
+
isFrozenUA,
|
60
|
+
isStandalonePWA
|
22
61
|
}
|
@@ -3,7 +3,7 @@
|
|
3
3
|
// Source: /src/helpers/ua-parser-helpers.js
|
4
4
|
|
5
5
|
///////////////////////////////////////////////
|
6
|
-
/* Helpers for UAParser.js v2.0.0-
|
6
|
+
/* Helpers for UAParser.js v2.0.0-rc.1
|
7
7
|
https://github.com/faisalman/ua-parser-js
|
8
8
|
Author: Faisal Salman <f@faisalman.com>
|
9
9
|
AGPLv3 License */
|
@@ -11,16 +11,55 @@
|
|
11
11
|
|
12
12
|
/*jshint esversion: 6 */
|
13
13
|
|
14
|
-
import { CPU, OS, Engine } from '
|
14
|
+
import { CPU, OS, Engine } from './enums/ua-parser-enums.mjs';
|
15
|
+
import { UAParser } from './main/ua-parser.mjs';
|
16
|
+
import { isFromEU } from 'detect-europe-js';
|
15
17
|
|
16
|
-
const
|
18
|
+
const getDeviceVendor = (model) => UAParser(`Mozilla/5.0 (Linux; Android 10; ${model}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36`).device.vendor;
|
17
19
|
|
18
|
-
const
|
20
|
+
const isAppleSilicon = (res) => {
|
21
|
+
if (res.os.is(OS.MACOS)) {
|
22
|
+
if (res.cpu.is(CPU.ARM)) {
|
23
|
+
return true;
|
24
|
+
}
|
25
|
+
try {
|
26
|
+
const canvas = document.createElement('canvas');
|
27
|
+
const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
|
28
|
+
const debug = webgl.getExtension('WEBGL_debug_renderer_info');
|
29
|
+
const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);
|
30
|
+
if (renderer.match(/apple m\d/i)) {
|
31
|
+
return true;
|
32
|
+
}
|
33
|
+
} catch {
|
34
|
+
return false;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
return false;
|
38
|
+
}
|
39
|
+
|
40
|
+
const isChromeFamily = (res) => res.engine.is(Engine.BLINK);
|
41
|
+
|
42
|
+
const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
|
43
|
+
/ electron\//i.test(navigator?.userAgent)); // browser
|
19
44
|
|
20
45
|
const isFrozenUA = (ua) => /^Mozilla\/5\.0 \((Windows NT 10\.0; Win64; x64|Macintosh; Intel Mac OS X 10_15_7|X11; Linux x86_64|X11; CrOS x86_64 14541\.0\.0|Fuchsia|Linux; Android 10; K)\) AppleWebKit\/537\.36 \(KHTML, like Gecko\) Chrome\/\d+\.0\.0\.0 (Mobile )?Safari\/537\.36/.test(ua);
|
21
46
|
|
47
|
+
const isStandalonePWA = () => window && (window.matchMedia('(display-mode: standalone)').matches ||
|
48
|
+
// iOS
|
49
|
+
navigator.standalone ||
|
50
|
+
// Android
|
51
|
+
document.referrer.startsWith('android-app://') ||
|
52
|
+
// Windows
|
53
|
+
window.Windows ||
|
54
|
+
/trident.+(msapphost|webview)\//i.test(navigator.userAgent) ||
|
55
|
+
document.referrer.startsWith('app-info://platform/microsoft-store'));
|
56
|
+
|
22
57
|
export {
|
58
|
+
getDeviceVendor,
|
23
59
|
isAppleSilicon,
|
24
|
-
|
25
|
-
|
60
|
+
isChromeFamily,
|
61
|
+
isElectron,
|
62
|
+
isFromEU,
|
63
|
+
isFrozenUA,
|
64
|
+
isStandalonePWA
|
26
65
|
}
|
package/src/main/ua-parser.d.ts
CHANGED
@@ -8,14 +8,14 @@ declare namespace UAParser {
|
|
8
8
|
is(val: string): boolean;
|
9
9
|
toString(): string;
|
10
10
|
withClientHints(): PromiseLike<T> | T;
|
11
|
-
withFeatureCheck(): T;
|
11
|
+
withFeatureCheck(): PromiseLike<T> | T;
|
12
12
|
}
|
13
13
|
|
14
14
|
interface IBrowser extends IData<IBrowser> {
|
15
15
|
name?: string;
|
16
16
|
version?: string;
|
17
17
|
major?: string;
|
18
|
-
type?: 'crawler' | 'cli' | 'email' | 'fetcher' | 'inapp' | 'module';
|
18
|
+
type?: 'crawler' | 'cli' | 'email' | 'fetcher' | 'inapp' | 'mediaplayer' | 'module';
|
19
19
|
}
|
20
20
|
|
21
21
|
interface ICPU extends IData<ICPU> {
|
package/src/main/ua-parser.js
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
/////////////////////////////////////////////////////////////////////////////////
|
2
|
-
/* UAParser.js v2.0.0-
|
2
|
+
/* UAParser.js v2.0.0-rc.1
|
3
3
|
Copyright © 2012-2024 Faisal Salman <f@faisalman.com>
|
4
4
|
AGPLv3 License *//*
|
5
5
|
Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
|
6
6
|
Supports browser & node.js environment.
|
7
|
-
Demo : https://
|
7
|
+
Demo : https://uaparser.dev
|
8
8
|
Source : https://github.com/faisalman/ua-parser-js */
|
9
9
|
/////////////////////////////////////////////////////////////////////////////////
|
10
10
|
|
@@ -19,7 +19,7 @@
|
|
19
19
|
// Constants
|
20
20
|
/////////////
|
21
21
|
|
22
|
-
var LIBVERSION = '2.0.0-
|
22
|
+
var LIBVERSION = '2.0.0-rc.1',
|
23
23
|
EMPTY = '',
|
24
24
|
UNKNOWN = '?',
|
25
25
|
FUNC_TYPE = 'function',
|
@@ -82,6 +82,7 @@
|
|
82
82
|
PREFIX_MOBILE = 'Mobile ',
|
83
83
|
SUFFIX_BROWSER = ' Browser',
|
84
84
|
CHROME = 'Chrome',
|
85
|
+
CHROMECAST = 'Chromecast',
|
85
86
|
EDGE = 'Edge',
|
86
87
|
FIREFOX = 'Firefox',
|
87
88
|
OPERA = 'Opera',
|
@@ -327,11 +328,13 @@
|
|
327
328
|
/(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
|
328
329
|
|
329
330
|
// Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
|
330
|
-
/(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|
|
331
|
-
// Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar
|
331
|
+
/(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio)\/([-\w\.]+)/i,
|
332
|
+
// Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio
|
332
333
|
/(heytap|ovi)browser\/([\d\.]+)/i, // HeyTap/Ovi
|
333
334
|
/(weibo)__([\d\.]+)/i // Weibo
|
334
335
|
], [NAME, VERSION], [
|
336
|
+
/quark(?:pc)?\/([-\w\.]+)/i // Quark
|
337
|
+
], [VERSION, [NAME, 'Quark']], [
|
335
338
|
/\bddg\/([\w\.]+)/i // DuckDuckGo
|
336
339
|
], [VERSION, [NAME, 'DuckDuckGo']], [
|
337
340
|
/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser
|
@@ -497,8 +500,8 @@
|
|
497
500
|
// Samsung
|
498
501
|
/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i
|
499
502
|
], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [
|
500
|
-
/\b((?:s[cgp]h|gt|sm)
|
501
|
-
/samsung[- ]([-\w]+)/i,
|
503
|
+
/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
|
504
|
+
/samsung[- ]((?!sm-[lr])[-\w]+)/i,
|
502
505
|
/sec-(sgh\w+)/i
|
503
506
|
], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [
|
504
507
|
|
@@ -529,7 +532,7 @@
|
|
529
532
|
/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
|
530
533
|
/\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi
|
531
534
|
/oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i, // Xiaomi Redmi 'numeric' models
|
532
|
-
/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i // Xiaomi Mi
|
535
|
+
/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite|pro)?)(?: bui|\))/i // Xiaomi Mi
|
533
536
|
], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
|
534
537
|
/oid[^\)]+; (2\d{4}(283|rpbf)[cgl])( bui|\))/i, // Redmi Pad
|
535
538
|
/\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i // Mi Pad tablets
|
@@ -597,7 +600,7 @@
|
|
597
600
|
|
598
601
|
// Amazon
|
599
602
|
/(alexa)webm/i,
|
600
|
-
/(kf[a-z]{2}wi|aeo
|
603
|
+
/(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i, // Kindle Fire without Silk / Echo Show
|
601
604
|
/(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD
|
602
605
|
], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [
|
603
606
|
/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i // Fire Phone
|
@@ -626,6 +629,17 @@
|
|
626
629
|
/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
|
627
630
|
], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
|
628
631
|
|
632
|
+
// TCL
|
633
|
+
/tcl (xess p17aa)/i,
|
634
|
+
/droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i
|
635
|
+
], [MODEL, [VENDOR, 'TCL'], [TYPE, TABLET]], [
|
636
|
+
/droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i
|
637
|
+
], [MODEL, [VENDOR, 'TCL'], [TYPE, MOBILE]], [
|
638
|
+
|
639
|
+
// itel
|
640
|
+
/(itel) ((\w+))/i
|
641
|
+
], [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { 'tablet' : ['p10001l', 'w7001'], '*' : 'mobile' }]], [
|
642
|
+
|
629
643
|
// Acer
|
630
644
|
/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
|
631
645
|
], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
|
@@ -639,6 +653,10 @@
|
|
639
653
|
/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
|
640
654
|
], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [
|
641
655
|
|
656
|
+
// Nothing
|
657
|
+
/droid.+; (a(?:015|06[35]|142p?))/i
|
658
|
+
], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [
|
659
|
+
|
642
660
|
// MIXED
|
643
661
|
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron|infinix|tecno)[-_ ]?([-\w]*)/i,
|
644
662
|
// BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
|
@@ -683,8 +701,14 @@
|
|
683
701
|
], [[VENDOR, LG], [TYPE, SMARTTV]], [
|
684
702
|
/(apple) ?tv/i // Apple TV
|
685
703
|
], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [
|
686
|
-
/crkey/i
|
687
|
-
], [[MODEL,
|
704
|
+
/crkey.*devicetype\/chromecast/i // Google Chromecast Third Generation
|
705
|
+
], [[MODEL, CHROMECAST+' Third Generation'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
|
706
|
+
/crkey.*devicetype\/([^/]*)/i // Google Chromecast with specific device type
|
707
|
+
], [[MODEL, /^/, 'Chromecast '], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
|
708
|
+
/fuchsia.*crkey/i // Google Chromecast Nest Hub
|
709
|
+
], [[MODEL, CHROMECAST+' Nest Hub'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
|
710
|
+
/crkey/i // Google Chromecast, Linux-based or unknown
|
711
|
+
], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
|
688
712
|
/droid.+aft(\w+)( bui|\))/i // Fire TV
|
689
713
|
], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
|
690
714
|
/\(dtv[\);].+(aquos)/i,
|
@@ -720,6 +744,8 @@
|
|
720
744
|
// WEARABLES
|
721
745
|
///////////////////
|
722
746
|
|
747
|
+
/\b(sm-[lr]\d\d[05][fnuw]?s?)\b/i // Samsung Galaxy Watch
|
748
|
+
], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [
|
723
749
|
/((pebble))app/i // Pebble
|
724
750
|
], [VENDOR, MODEL, [TYPE, WEARABLE]], [
|
725
751
|
/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch
|
@@ -733,7 +759,9 @@
|
|
733
759
|
|
734
760
|
/droid.+; (glass) \d/i // Google Glass
|
735
761
|
], [MODEL, [VENDOR, GOOGLE], [TYPE, XR]], [
|
736
|
-
/(
|
762
|
+
/(pico) (4|neo3(?: link|pro)?)/i // Pico
|
763
|
+
], [VENDOR, MODEL, [TYPE, XR]], [
|
764
|
+
/; (quest( \d| pro)?)/i // Oculus Quest
|
737
765
|
], [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]], [
|
738
766
|
|
739
767
|
///////////////////
|
@@ -766,6 +794,9 @@
|
|
766
794
|
/windows.+ edge\/([\w\.]+)/i // EdgeHTML
|
767
795
|
], [VERSION, [NAME, EDGE+'HTML']], [
|
768
796
|
|
797
|
+
/(arkweb)\/([\w\.]+)/i // ArkWeb
|
798
|
+
], [NAME, VERSION], [
|
799
|
+
|
769
800
|
/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
|
770
801
|
], [VERSION, [NAME, 'Blink']], [
|
771
802
|
|
@@ -802,10 +833,22 @@
|
|
802
833
|
/(macintosh|mac_powerpc\b)(?!.+haiku)/i // Mac OS
|
803
834
|
], [[NAME, 'macOS'], [VERSION, /_/g, '.']], [
|
804
835
|
|
836
|
+
// Google Chromecast
|
837
|
+
/android ([\d\.]+).*crkey/i // Google Chromecast, Android-based
|
838
|
+
], [VERSION, [NAME, CHROMECAST + ' Android']], [
|
839
|
+
/fuchsia.*crkey\/([\d\.]+)/i // Google Chromecast, Fuchsia-based
|
840
|
+
], [VERSION, [NAME, CHROMECAST + ' Fuchsia']], [
|
841
|
+
/crkey\/([\d\.]+).*devicetype\/smartspeaker/i // Google Chromecast, Linux-based Smart Speaker
|
842
|
+
], [VERSION, [NAME, CHROMECAST + ' SmartSpeaker']], [
|
843
|
+
/linux.*crkey\/([\d\.]+)/i // Google Chromecast, Legacy Linux-based
|
844
|
+
], [VERSION, [NAME, CHROMECAST + ' Linux']], [
|
845
|
+
/crkey\/([\d\.]+)/i // Google Chromecast, unknown
|
846
|
+
], [VERSION, [NAME, CHROMECAST]], [
|
847
|
+
|
805
848
|
// Mobile OSes
|
806
849
|
/droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS
|
807
|
-
], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS
|
808
|
-
/(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\/ ]?([\w\.]*)/i,
|
850
|
+
], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS/OpenHarmony
|
851
|
+
/(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish|openharmony)[-\/ ]?([\w\.]*)/i,
|
809
852
|
/(blackberry)\w*\/([\w\.]*)/i, // Blackberry
|
810
853
|
/(tizen|kaios)[\/ ]([\w\.]+)/i, // Tizen/KaiOS
|
811
854
|
/\((series40);/i // Series 40
|
@@ -822,9 +865,7 @@
|
|
822
865
|
/watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i // watchOS
|
823
866
|
], [VERSION, [NAME, 'watchOS']], [
|
824
867
|
|
825
|
-
// Google
|
826
|
-
/crkey\/([\d\.]+)/i // Google Chromecast
|
827
|
-
], [VERSION, [NAME, CHROME+'cast']], [
|
868
|
+
// Google ChromeOS
|
828
869
|
/(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
|
829
870
|
], [[NAME, "Chrome OS"], VERSION],[
|
830
871
|
|
@@ -836,6 +877,7 @@
|
|
836
877
|
// Console
|
837
878
|
/(nintendo|playstation) (\w+)/i, // Nintendo/Playstation
|
838
879
|
/(xbox); +xbox ([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
|
880
|
+
/(pico) .+os([\w\.]+)/i, // Pico
|
839
881
|
|
840
882
|
// Other
|
841
883
|
/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i, // Joli/Palm
|
package/src/main/ua-parser.mjs
CHANGED
@@ -3,12 +3,12 @@
|
|
3
3
|
// Source: /src/main/ua-parser.js
|
4
4
|
|
5
5
|
/////////////////////////////////////////////////////////////////////////////////
|
6
|
-
/* UAParser.js v2.0.0-
|
6
|
+
/* UAParser.js v2.0.0-rc.1
|
7
7
|
Copyright © 2012-2024 Faisal Salman <f@faisalman.com>
|
8
8
|
AGPLv3 License *//*
|
9
9
|
Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
|
10
10
|
Supports browser & node.js environment.
|
11
|
-
Demo : https://
|
11
|
+
Demo : https://uaparser.dev
|
12
12
|
Source : https://github.com/faisalman/ua-parser-js */
|
13
13
|
/////////////////////////////////////////////////////////////////////////////////
|
14
14
|
|
@@ -21,7 +21,7 @@
|
|
21
21
|
// Constants
|
22
22
|
/////////////
|
23
23
|
|
24
|
-
var LIBVERSION = '2.0.0-
|
24
|
+
var LIBVERSION = '2.0.0-rc.1',
|
25
25
|
EMPTY = '',
|
26
26
|
UNKNOWN = '?',
|
27
27
|
FUNC_TYPE = 'function',
|
@@ -84,6 +84,7 @@
|
|
84
84
|
PREFIX_MOBILE = 'Mobile ',
|
85
85
|
SUFFIX_BROWSER = ' Browser',
|
86
86
|
CHROME = 'Chrome',
|
87
|
+
CHROMECAST = 'Chromecast',
|
87
88
|
EDGE = 'Edge',
|
88
89
|
FIREFOX = 'Firefox',
|
89
90
|
OPERA = 'Opera',
|
@@ -329,11 +330,13 @@
|
|
329
330
|
/(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
|
330
331
|
|
331
332
|
// Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
|
332
|
-
/(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|
|
333
|
-
// Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar
|
333
|
+
/(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio)\/([-\w\.]+)/i,
|
334
|
+
// Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio
|
334
335
|
/(heytap|ovi)browser\/([\d\.]+)/i, // HeyTap/Ovi
|
335
336
|
/(weibo)__([\d\.]+)/i // Weibo
|
336
337
|
], [NAME, VERSION], [
|
338
|
+
/quark(?:pc)?\/([-\w\.]+)/i // Quark
|
339
|
+
], [VERSION, [NAME, 'Quark']], [
|
337
340
|
/\bddg\/([\w\.]+)/i // DuckDuckGo
|
338
341
|
], [VERSION, [NAME, 'DuckDuckGo']], [
|
339
342
|
/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser
|
@@ -499,8 +502,8 @@
|
|
499
502
|
// Samsung
|
500
503
|
/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i
|
501
504
|
], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [
|
502
|
-
/\b((?:s[cgp]h|gt|sm)
|
503
|
-
/samsung[- ]([-\w]+)/i,
|
505
|
+
/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
|
506
|
+
/samsung[- ]((?!sm-[lr])[-\w]+)/i,
|
504
507
|
/sec-(sgh\w+)/i
|
505
508
|
], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [
|
506
509
|
|
@@ -531,7 +534,7 @@
|
|
531
534
|
/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
|
532
535
|
/\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi
|
533
536
|
/oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i, // Xiaomi Redmi 'numeric' models
|
534
|
-
/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i // Xiaomi Mi
|
537
|
+
/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite|pro)?)(?: bui|\))/i // Xiaomi Mi
|
535
538
|
], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
|
536
539
|
/oid[^\)]+; (2\d{4}(283|rpbf)[cgl])( bui|\))/i, // Redmi Pad
|
537
540
|
/\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i // Mi Pad tablets
|
@@ -599,7 +602,7 @@
|
|
599
602
|
|
600
603
|
// Amazon
|
601
604
|
/(alexa)webm/i,
|
602
|
-
/(kf[a-z]{2}wi|aeo
|
605
|
+
/(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i, // Kindle Fire without Silk / Echo Show
|
603
606
|
/(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD
|
604
607
|
], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [
|
605
608
|
/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i // Fire Phone
|
@@ -628,6 +631,17 @@
|
|
628
631
|
/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
|
629
632
|
], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
|
630
633
|
|
634
|
+
// TCL
|
635
|
+
/tcl (xess p17aa)/i,
|
636
|
+
/droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i
|
637
|
+
], [MODEL, [VENDOR, 'TCL'], [TYPE, TABLET]], [
|
638
|
+
/droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i
|
639
|
+
], [MODEL, [VENDOR, 'TCL'], [TYPE, MOBILE]], [
|
640
|
+
|
641
|
+
// itel
|
642
|
+
/(itel) ((\w+))/i
|
643
|
+
], [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { 'tablet' : ['p10001l', 'w7001'], '*' : 'mobile' }]], [
|
644
|
+
|
631
645
|
// Acer
|
632
646
|
/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
|
633
647
|
], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
|
@@ -641,6 +655,10 @@
|
|
641
655
|
/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
|
642
656
|
], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [
|
643
657
|
|
658
|
+
// Nothing
|
659
|
+
/droid.+; (a(?:015|06[35]|142p?))/i
|
660
|
+
], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [
|
661
|
+
|
644
662
|
// MIXED
|
645
663
|
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron|infinix|tecno)[-_ ]?([-\w]*)/i,
|
646
664
|
// BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
|
@@ -685,8 +703,14 @@
|
|
685
703
|
], [[VENDOR, LG], [TYPE, SMARTTV]], [
|
686
704
|
/(apple) ?tv/i // Apple TV
|
687
705
|
], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [
|
688
|
-
/crkey/i
|
689
|
-
], [[MODEL,
|
706
|
+
/crkey.*devicetype\/chromecast/i // Google Chromecast Third Generation
|
707
|
+
], [[MODEL, CHROMECAST+' Third Generation'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
|
708
|
+
/crkey.*devicetype\/([^/]*)/i // Google Chromecast with specific device type
|
709
|
+
], [[MODEL, /^/, 'Chromecast '], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
|
710
|
+
/fuchsia.*crkey/i // Google Chromecast Nest Hub
|
711
|
+
], [[MODEL, CHROMECAST+' Nest Hub'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
|
712
|
+
/crkey/i // Google Chromecast, Linux-based or unknown
|
713
|
+
], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
|
690
714
|
/droid.+aft(\w+)( bui|\))/i // Fire TV
|
691
715
|
], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
|
692
716
|
/\(dtv[\);].+(aquos)/i,
|
@@ -722,6 +746,8 @@
|
|
722
746
|
// WEARABLES
|
723
747
|
///////////////////
|
724
748
|
|
749
|
+
/\b(sm-[lr]\d\d[05][fnuw]?s?)\b/i // Samsung Galaxy Watch
|
750
|
+
], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [
|
725
751
|
/((pebble))app/i // Pebble
|
726
752
|
], [VENDOR, MODEL, [TYPE, WEARABLE]], [
|
727
753
|
/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch
|
@@ -735,7 +761,9 @@
|
|
735
761
|
|
736
762
|
/droid.+; (glass) \d/i // Google Glass
|
737
763
|
], [MODEL, [VENDOR, GOOGLE], [TYPE, XR]], [
|
738
|
-
/(
|
764
|
+
/(pico) (4|neo3(?: link|pro)?)/i // Pico
|
765
|
+
], [VENDOR, MODEL, [TYPE, XR]], [
|
766
|
+
/; (quest( \d| pro)?)/i // Oculus Quest
|
739
767
|
], [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]], [
|
740
768
|
|
741
769
|
///////////////////
|
@@ -768,6 +796,9 @@
|
|
768
796
|
/windows.+ edge\/([\w\.]+)/i // EdgeHTML
|
769
797
|
], [VERSION, [NAME, EDGE+'HTML']], [
|
770
798
|
|
799
|
+
/(arkweb)\/([\w\.]+)/i // ArkWeb
|
800
|
+
], [NAME, VERSION], [
|
801
|
+
|
771
802
|
/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
|
772
803
|
], [VERSION, [NAME, 'Blink']], [
|
773
804
|
|
@@ -804,10 +835,22 @@
|
|
804
835
|
/(macintosh|mac_powerpc\b)(?!.+haiku)/i // Mac OS
|
805
836
|
], [[NAME, 'macOS'], [VERSION, /_/g, '.']], [
|
806
837
|
|
838
|
+
// Google Chromecast
|
839
|
+
/android ([\d\.]+).*crkey/i // Google Chromecast, Android-based
|
840
|
+
], [VERSION, [NAME, CHROMECAST + ' Android']], [
|
841
|
+
/fuchsia.*crkey\/([\d\.]+)/i // Google Chromecast, Fuchsia-based
|
842
|
+
], [VERSION, [NAME, CHROMECAST + ' Fuchsia']], [
|
843
|
+
/crkey\/([\d\.]+).*devicetype\/smartspeaker/i // Google Chromecast, Linux-based Smart Speaker
|
844
|
+
], [VERSION, [NAME, CHROMECAST + ' SmartSpeaker']], [
|
845
|
+
/linux.*crkey\/([\d\.]+)/i // Google Chromecast, Legacy Linux-based
|
846
|
+
], [VERSION, [NAME, CHROMECAST + ' Linux']], [
|
847
|
+
/crkey\/([\d\.]+)/i // Google Chromecast, unknown
|
848
|
+
], [VERSION, [NAME, CHROMECAST]], [
|
849
|
+
|
807
850
|
// Mobile OSes
|
808
851
|
/droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS
|
809
|
-
], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS
|
810
|
-
/(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\/ ]?([\w\.]*)/i,
|
852
|
+
], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS/OpenHarmony
|
853
|
+
/(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish|openharmony)[-\/ ]?([\w\.]*)/i,
|
811
854
|
/(blackberry)\w*\/([\w\.]*)/i, // Blackberry
|
812
855
|
/(tizen|kaios)[\/ ]([\w\.]+)/i, // Tizen/KaiOS
|
813
856
|
/\((series40);/i // Series 40
|
@@ -824,9 +867,7 @@
|
|
824
867
|
/watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i // watchOS
|
825
868
|
], [VERSION, [NAME, 'watchOS']], [
|
826
869
|
|
827
|
-
// Google
|
828
|
-
/crkey\/([\d\.]+)/i // Google Chromecast
|
829
|
-
], [VERSION, [NAME, CHROME+'cast']], [
|
870
|
+
// Google ChromeOS
|
830
871
|
/(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
|
831
872
|
], [[NAME, "Chrome OS"], VERSION],[
|
832
873
|
|
@@ -838,6 +879,7 @@
|
|
838
879
|
// Console
|
839
880
|
/(nintendo|playstation) (\w+)/i, // Nintendo/Playstation
|
840
881
|
/(xbox); +xbox ([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
|
882
|
+
/(pico) .+os([\w\.]+)/i, // Pico
|
841
883
|
|
842
884
|
// Other
|
843
885
|
/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i, // Joli/Palm
|