ua-parser-js 2.0.0-beta.3 → 2.0.0-rc.2
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 +9 -4
- package/src/enums/ua-parser-enums.js +22 -6
- package/src/enums/ua-parser-enums.mjs +22 -6
- package/src/extensions/ua-parser-extensions.d.ts +2 -1
- 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 +14 -4
- package/src/helpers/ua-parser-helpers.js +38 -6
- package/src/helpers/ua-parser-helpers.mjs +39 -7
- package/src/main/ua-parser.d.ts +3 -3
- package/src/main/ua-parser.js +83 -33
- package/src/main/ua-parser.mjs +83 -33
@@ -1,15 +1,25 @@
|
|
1
|
-
// Type definitions for Helpers submodule of UAParser.js v2.0.0-
|
1
|
+
// Type definitions for Helpers submodule of UAParser.js v2.0.0-rc.2
|
2
2
|
// Project: https://github.com/faisalman/ua-parser-js
|
3
3
|
// Definitions by: Faisal Salman <https://github.com/faisalman>
|
4
4
|
|
5
5
|
import { IResult } from "../main/ua-parser";
|
6
6
|
|
7
|
+
declare function getDeviceVendor(model: string): string | undefined;
|
7
8
|
declare function isAppleSilicon(res: IResult): boolean;
|
8
|
-
declare function
|
9
|
+
declare function isBot(res: IResult): boolean;
|
10
|
+
declare function isChromeFamily(res: IResult): boolean;
|
11
|
+
declare function isElectron(): boolean;
|
12
|
+
declare function isFromEU(): boolean;
|
9
13
|
declare function isFrozenUA(ua: string): boolean;
|
14
|
+
declare function isStandalonePWA(): boolean;
|
10
15
|
|
11
16
|
export {
|
17
|
+
getDeviceVendor,
|
12
18
|
isAppleSilicon,
|
13
|
-
|
14
|
-
|
19
|
+
isBot,
|
20
|
+
isChromeFamily,
|
21
|
+
isElectron,
|
22
|
+
isFromEU,
|
23
|
+
isFrozenUA,
|
24
|
+
isStandalonePWA
|
15
25
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
///////////////////////////////////////////////
|
2
|
-
/* Helpers for UAParser.js v2.0.0-
|
2
|
+
/* Helpers for UAParser.js v2.0.0-rc.2
|
3
3
|
https://github.com/faisalman/ua-parser-js
|
4
4
|
Author: Faisal Salman <f@faisalman.com>
|
5
5
|
AGPLv3 License */
|
@@ -7,16 +7,48 @@
|
|
7
7
|
|
8
8
|
/*jshint esversion: 6 */
|
9
9
|
|
10
|
+
const { UAParser } = require('../main/ua-parser');
|
10
11
|
const { CPU, OS, Engine } = require('../enums/ua-parser-enums');
|
12
|
+
const { isFromEU } = require('detect-europe-js');
|
13
|
+
const { isFrozenUA } = require('ua-is-frozen');
|
14
|
+
const { isStandalonePWA } = require('is-standalone-pwa');
|
11
15
|
|
12
|
-
const
|
16
|
+
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
17
|
|
14
|
-
const
|
18
|
+
const isAppleSilicon = (res) => {
|
19
|
+
if (res.os.is(OS.MACOS)) {
|
20
|
+
if (res.cpu.is(CPU.ARM)) {
|
21
|
+
return true;
|
22
|
+
}
|
23
|
+
try {
|
24
|
+
const canvas = document.createElement('canvas');
|
25
|
+
const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
|
26
|
+
const debug = webgl.getExtension('WEBGL_debug_renderer_info');
|
27
|
+
const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);
|
28
|
+
if (renderer.match(/apple m\d/i)) {
|
29
|
+
return true;
|
30
|
+
}
|
31
|
+
} catch {
|
32
|
+
return false;
|
33
|
+
}
|
34
|
+
}
|
35
|
+
return false;
|
36
|
+
}
|
15
37
|
|
16
|
-
const
|
38
|
+
const isBot = (res) => ['cli', 'crawler', 'fetcher', 'module'].includes(res.browser.type);
|
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
|
17
44
|
|
18
45
|
module.exports = {
|
46
|
+
getDeviceVendor,
|
19
47
|
isAppleSilicon,
|
20
|
-
|
21
|
-
|
48
|
+
isBot,
|
49
|
+
isChromeFamily,
|
50
|
+
isElectron,
|
51
|
+
isFromEU,
|
52
|
+
isFrozenUA,
|
53
|
+
isStandalonePWA
|
22
54
|
}
|
@@ -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.2
|
7
7
|
https://github.com/faisalman/ua-parser-js
|
8
8
|
Author: Faisal Salman <f@faisalman.com>
|
9
9
|
AGPLv3 License */
|
@@ -11,16 +11,48 @@
|
|
11
11
|
|
12
12
|
/*jshint esversion: 6 */
|
13
13
|
|
14
|
-
import {
|
14
|
+
import { UAParser } from '../main/ua-parser.mjs';
|
15
|
+
import { CPU, OS, Engine } from '../enums/ua-parser-enums.mjs';
|
16
|
+
import { isFromEU } from 'detect-europe-js';
|
17
|
+
import { isFrozenUA } from 'ua-is-frozen';
|
18
|
+
import { isStandalonePWA } from 'is-standalone-pwa';
|
15
19
|
|
16
|
-
const
|
20
|
+
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
21
|
|
18
|
-
const
|
22
|
+
const isAppleSilicon = (res) => {
|
23
|
+
if (res.os.is(OS.MACOS)) {
|
24
|
+
if (res.cpu.is(CPU.ARM)) {
|
25
|
+
return true;
|
26
|
+
}
|
27
|
+
try {
|
28
|
+
const canvas = document.createElement('canvas');
|
29
|
+
const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
|
30
|
+
const debug = webgl.getExtension('WEBGL_debug_renderer_info');
|
31
|
+
const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);
|
32
|
+
if (renderer.match(/apple m\d/i)) {
|
33
|
+
return true;
|
34
|
+
}
|
35
|
+
} catch {
|
36
|
+
return false;
|
37
|
+
}
|
38
|
+
}
|
39
|
+
return false;
|
40
|
+
}
|
19
41
|
|
20
|
-
const
|
42
|
+
const isBot = (res) => ['cli', 'crawler', 'fetcher', 'module'].includes(res.browser.type);
|
43
|
+
|
44
|
+
const isChromeFamily = (res) => res.engine.is(Engine.BLINK);
|
45
|
+
|
46
|
+
const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
|
47
|
+
/ electron\//i.test(navigator?.userAgent)); // browser
|
21
48
|
|
22
49
|
export {
|
50
|
+
getDeviceVendor,
|
23
51
|
isAppleSilicon,
|
24
|
-
|
25
|
-
|
52
|
+
isBot,
|
53
|
+
isChromeFamily,
|
54
|
+
isElectron,
|
55
|
+
isFromEU,
|
56
|
+
isFrozenUA,
|
57
|
+
isStandalonePWA
|
26
58
|
}
|
package/src/main/ua-parser.d.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
// Type definitions for UAParser.js v2.0.0-
|
1
|
+
// Type definitions for UAParser.js v2.0.0-rc.2
|
2
2
|
// Project: https://github.com/faisalman/ua-parser-js
|
3
3
|
// Definitions by: Faisal Salman <https://github.com/faisalman>
|
4
4
|
|
@@ -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.2
|
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.2',
|
23
23
|
EMPTY = '',
|
24
24
|
UNKNOWN = '?',
|
25
25
|
FUNC_TYPE = 'function',
|
@@ -40,6 +40,7 @@
|
|
40
40
|
WEARABLE = 'wearable',
|
41
41
|
XR = 'xr',
|
42
42
|
EMBEDDED = 'embedded',
|
43
|
+
INAPP = 'inapp',
|
43
44
|
USER_AGENT = 'user-agent',
|
44
45
|
UA_MAX_LENGTH = 500,
|
45
46
|
BRANDS = 'brands',
|
@@ -82,6 +83,7 @@
|
|
82
83
|
PREFIX_MOBILE = 'Mobile ',
|
83
84
|
SUFFIX_BROWSER = ' Browser',
|
84
85
|
CHROME = 'Chrome',
|
86
|
+
CHROMECAST = 'Chromecast',
|
85
87
|
EDGE = 'Edge',
|
86
88
|
FIREFOX = 'Firefox',
|
87
89
|
OPERA = 'Opera',
|
@@ -319,19 +321,23 @@
|
|
319
321
|
// Mixed
|
320
322
|
/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i // Baidu
|
321
323
|
], [VERSION, [NAME, 'Baidu']], [
|
324
|
+
/\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i // Maxthon
|
325
|
+
], [VERSION, [NAME, 'Maxthon']], [
|
322
326
|
/(kindle)\/([\w\.]+)/i, // Kindle
|
323
327
|
/(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,
|
324
328
|
// Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir
|
325
329
|
// Trident based
|
326
|
-
/(avant|iemobile|slim
|
330
|
+
/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet
|
327
331
|
/(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
|
328
332
|
|
329
|
-
// Webkit/KHTML based
|
330
|
-
/(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|
|
331
|
-
// Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar
|
332
|
-
/(heytap|ovi)browser\/([\d\.]+)/i,
|
333
|
+
// Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
|
334
|
+
/(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)\/([-\w\.]+)/i,
|
335
|
+
// Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
|
336
|
+
/(heytap|ovi|115)browser\/([\d\.]+)/i, // HeyTap/Ovi/115
|
333
337
|
/(weibo)__([\d\.]+)/i // Weibo
|
334
338
|
], [NAME, VERSION], [
|
339
|
+
/quark(?:pc)?\/([-\w\.]+)/i // Quark
|
340
|
+
], [VERSION, [NAME, 'Quark']], [
|
335
341
|
/\bddg\/([\w\.]+)/i // DuckDuckGo
|
336
342
|
], [VERSION, [NAME, 'DuckDuckGo']], [
|
337
343
|
/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser
|
@@ -364,31 +370,31 @@
|
|
364
370
|
], [VERSION, [NAME, 'MIUI' + SUFFIX_BROWSER]], [
|
365
371
|
/fxios\/([\w\.-]+)/i // Firefox for iOS
|
366
372
|
], [VERSION, [NAME, PREFIX_MOBILE + FIREFOX]], [
|
367
|
-
/\
|
368
|
-
], [[NAME, '360'
|
373
|
+
/\bqihoobrowser\/?([\w\.]*)/i // 360
|
374
|
+
], [VERSION, [NAME, '360']], [
|
369
375
|
/\b(qq)\/([\w\.]+)/i // QQ
|
370
376
|
], [[NAME, /(.+)/, '$1Browser'], VERSION], [
|
371
377
|
/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i
|
372
378
|
], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser
|
373
379
|
/samsungbrowser\/([\w\.]+)/i // Samsung Internet
|
374
380
|
], [VERSION, [NAME, SAMSUNG + ' Internet']], [
|
375
|
-
/(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
|
376
|
-
], [[NAME, /_/g, ' '], VERSION], [
|
377
381
|
/metasr[\/ ]?([\d\.]+)/i // Sogou Explorer
|
378
382
|
], [VERSION, [NAME, SOGOU + ' Explorer']], [
|
379
383
|
/(sogou)mo\w+\/([\d\.]+)/i // Sogou Mobile
|
380
384
|
], [[NAME, SOGOU + ' Mobile'], VERSION], [
|
381
385
|
/(electron)\/([\w\.]+) safari/i, // Electron-based App
|
382
386
|
/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i, // Tesla
|
383
|
-
/m?(qqbrowser|
|
387
|
+
/m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i // QQ/2345
|
384
388
|
], [NAME, VERSION], [
|
385
|
-
/(lbbrowser|rekonq)/i
|
386
|
-
/\[(linkedin)app\]/i // LinkedIn App for iOS & Android
|
389
|
+
/(lbbrowser|rekonq)/i // LieBao Browser/Rekonq
|
387
390
|
], [NAME], [
|
391
|
+
/ome\/([\w\.]+) \w* ?(iron) saf/i, // Iron
|
392
|
+
/ome\/([\w\.]+).+qihu (360)[es]e/i // 360
|
393
|
+
], [VERSION, NAME], [
|
388
394
|
|
389
395
|
// WebView
|
390
396
|
/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i // Facebook App for iOS & Android
|
391
|
-
], [[NAME, FACEBOOK], VERSION], [
|
397
|
+
], [[NAME, FACEBOOK], VERSION, [TYPE, INAPP]], [
|
392
398
|
/(Klarna)\/([\w\.]+)/i, // Klarna Shopping Browser for iOS & Android
|
393
399
|
/(kakao(?:talk|story))[\/ ]([\w\.]+)/i, // Kakao App
|
394
400
|
/(naver)\(.*?(\d+\.[\w\.]+).*\)/i, // Naver InApp
|
@@ -396,12 +402,17 @@
|
|
396
402
|
/\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
|
397
403
|
/(alipay)client\/([\w\.]+)/i, // Alipay
|
398
404
|
/(twitter)(?:and| f.+e\/([\w\.]+))/i, // Twitter
|
399
|
-
/(
|
400
|
-
], [NAME, VERSION], [
|
405
|
+
/(instagram|snapchat)[\/ ]([-\w\.]+)/i // Instagram/Snapchat
|
406
|
+
], [NAME, VERSION, [TYPE, INAPP]], [
|
401
407
|
/\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
|
402
|
-
], [VERSION, [NAME, 'GSA']], [
|
408
|
+
], [VERSION, [NAME, 'GSA'], [TYPE, INAPP]], [
|
403
409
|
/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
|
404
|
-
], [VERSION, [NAME, 'TikTok']], [
|
410
|
+
], [VERSION, [NAME, 'TikTok'], [TYPE, INAPP]], [
|
411
|
+
/\[(linkedin)app\]/i // LinkedIn App for iOS & Android
|
412
|
+
], [NAME, [TYPE, INAPP]], [
|
413
|
+
|
414
|
+
/(chromium)[\/ ]([-\w\.]+)/i // Chromium
|
415
|
+
], [NAME, VERSION], [
|
405
416
|
|
406
417
|
/headlesschrome(?:\/([\w\.]+)| )/i // Chrome Headless
|
407
418
|
], [VERSION, [NAME, CHROME+' Headless']], [
|
@@ -435,7 +446,7 @@
|
|
435
446
|
], [[NAME, PREFIX_MOBILE + FIREFOX], VERSION], [
|
436
447
|
/(navigator|netscape\d?)\/([-\w\.]+)/i // Netscape
|
437
448
|
], [[NAME, 'Netscape'], VERSION], [
|
438
|
-
/(wolvic)\/([\w\.]+)/i
|
449
|
+
/(wolvic|librewolf)\/([\w\.]+)/i // Wolvic/LibreWolf
|
439
450
|
], [NAME, VERSION], [
|
440
451
|
/mobile vr; rv:([\w\.]+)\).+firefox/i // Firefox Reality
|
441
452
|
], [VERSION, [NAME, FIREFOX+' Reality']], [
|
@@ -497,8 +508,8 @@
|
|
497
508
|
// Samsung
|
498
509
|
/\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
510
|
], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [
|
500
|
-
/\b((?:s[cgp]h|gt|sm)
|
501
|
-
/samsung[- ]([-\w]+)/i,
|
511
|
+
/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
|
512
|
+
/samsung[- ]((?!sm-[lr])[-\w]+)/i,
|
502
513
|
/sec-(sgh\w+)/i
|
503
514
|
], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [
|
504
515
|
|
@@ -529,7 +540,7 @@
|
|
529
540
|
/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
|
530
541
|
/\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi
|
531
542
|
/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
|
543
|
+
/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite|pro)?)(?: bui|\))/i // Xiaomi Mi
|
533
544
|
], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
|
534
545
|
/oid[^\)]+; (2\d{4}(283|rpbf)[cgl])( bui|\))/i, // Redmi Pad
|
535
546
|
/\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i // Mi Pad tablets
|
@@ -597,7 +608,7 @@
|
|
597
608
|
|
598
609
|
// Amazon
|
599
610
|
/(alexa)webm/i,
|
600
|
-
/(kf[a-z]{2}wi|aeo
|
611
|
+
/(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i, // Kindle Fire without Silk / Echo Show
|
601
612
|
/(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD
|
602
613
|
], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [
|
603
614
|
/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i // Fire Phone
|
@@ -626,6 +637,17 @@
|
|
626
637
|
/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
|
627
638
|
], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
|
628
639
|
|
640
|
+
// TCL
|
641
|
+
/tcl (xess p17aa)/i,
|
642
|
+
/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
|
643
|
+
], [MODEL, [VENDOR, 'TCL'], [TYPE, TABLET]], [
|
644
|
+
/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
|
645
|
+
], [MODEL, [VENDOR, 'TCL'], [TYPE, MOBILE]], [
|
646
|
+
|
647
|
+
// itel
|
648
|
+
/(itel) ((\w+))/i
|
649
|
+
], [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { 'tablet' : ['p10001l', 'w7001'], '*' : 'mobile' }]], [
|
650
|
+
|
629
651
|
// Acer
|
630
652
|
/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
|
631
653
|
], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
|
@@ -639,6 +661,10 @@
|
|
639
661
|
/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
|
640
662
|
], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [
|
641
663
|
|
664
|
+
// Nothing
|
665
|
+
/droid.+; (a(?:015|06[35]|142p?))/i
|
666
|
+
], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [
|
667
|
+
|
642
668
|
// MIXED
|
643
669
|
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron|infinix|tecno)[-_ ]?([-\w]*)/i,
|
644
670
|
// BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
|
@@ -683,8 +709,14 @@
|
|
683
709
|
], [[VENDOR, LG], [TYPE, SMARTTV]], [
|
684
710
|
/(apple) ?tv/i // Apple TV
|
685
711
|
], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [
|
686
|
-
/crkey/i
|
687
|
-
], [[MODEL,
|
712
|
+
/crkey.*devicetype\/chromecast/i // Google Chromecast Third Generation
|
713
|
+
], [[MODEL, CHROMECAST+' Third Generation'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
|
714
|
+
/crkey.*devicetype\/([^/]*)/i // Google Chromecast with specific device type
|
715
|
+
], [[MODEL, /^/, 'Chromecast '], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
|
716
|
+
/fuchsia.*crkey/i // Google Chromecast Nest Hub
|
717
|
+
], [[MODEL, CHROMECAST+' Nest Hub'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
|
718
|
+
/crkey/i // Google Chromecast, Linux-based or unknown
|
719
|
+
], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
|
688
720
|
/droid.+aft(\w+)( bui|\))/i // Fire TV
|
689
721
|
], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
|
690
722
|
/\(dtv[\);].+(aquos)/i,
|
@@ -720,6 +752,8 @@
|
|
720
752
|
// WEARABLES
|
721
753
|
///////////////////
|
722
754
|
|
755
|
+
/\b(sm-[lr]\d\d[05][fnuw]?s?)\b/i // Samsung Galaxy Watch
|
756
|
+
], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [
|
723
757
|
/((pebble))app/i // Pebble
|
724
758
|
], [VENDOR, MODEL, [TYPE, WEARABLE]], [
|
725
759
|
/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch
|
@@ -733,7 +767,9 @@
|
|
733
767
|
|
734
768
|
/droid.+; (glass) \d/i // Google Glass
|
735
769
|
], [MODEL, [VENDOR, GOOGLE], [TYPE, XR]], [
|
736
|
-
/(
|
770
|
+
/(pico) (4|neo3(?: link|pro)?)/i // Pico
|
771
|
+
], [VENDOR, MODEL, [TYPE, XR]], [
|
772
|
+
/; (quest( \d| pro)?)/i // Oculus Quest
|
737
773
|
], [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]], [
|
738
774
|
|
739
775
|
///////////////////
|
@@ -766,6 +802,9 @@
|
|
766
802
|
/windows.+ edge\/([\w\.]+)/i // EdgeHTML
|
767
803
|
], [VERSION, [NAME, EDGE+'HTML']], [
|
768
804
|
|
805
|
+
/(arkweb)\/([\w\.]+)/i // ArkWeb
|
806
|
+
], [NAME, VERSION], [
|
807
|
+
|
769
808
|
/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
|
770
809
|
], [VERSION, [NAME, 'Blink']], [
|
771
810
|
|
@@ -802,10 +841,22 @@
|
|
802
841
|
/(macintosh|mac_powerpc\b)(?!.+haiku)/i // Mac OS
|
803
842
|
], [[NAME, 'macOS'], [VERSION, /_/g, '.']], [
|
804
843
|
|
844
|
+
// Google Chromecast
|
845
|
+
/android ([\d\.]+).*crkey/i // Google Chromecast, Android-based
|
846
|
+
], [VERSION, [NAME, CHROMECAST + ' Android']], [
|
847
|
+
/fuchsia.*crkey\/([\d\.]+)/i // Google Chromecast, Fuchsia-based
|
848
|
+
], [VERSION, [NAME, CHROMECAST + ' Fuchsia']], [
|
849
|
+
/crkey\/([\d\.]+).*devicetype\/smartspeaker/i // Google Chromecast, Linux-based Smart Speaker
|
850
|
+
], [VERSION, [NAME, CHROMECAST + ' SmartSpeaker']], [
|
851
|
+
/linux.*crkey\/([\d\.]+)/i // Google Chromecast, Legacy Linux-based
|
852
|
+
], [VERSION, [NAME, CHROMECAST + ' Linux']], [
|
853
|
+
/crkey\/([\d\.]+)/i // Google Chromecast, unknown
|
854
|
+
], [VERSION, [NAME, CHROMECAST]], [
|
855
|
+
|
805
856
|
// Mobile OSes
|
806
857
|
/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,
|
858
|
+
], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS/OpenHarmony
|
859
|
+
/(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish|openharmony)[-\/ ]?([\w\.]*)/i,
|
809
860
|
/(blackberry)\w*\/([\w\.]*)/i, // Blackberry
|
810
861
|
/(tizen|kaios)[\/ ]([\w\.]+)/i, // Tizen/KaiOS
|
811
862
|
/\((series40);/i // Series 40
|
@@ -822,9 +873,7 @@
|
|
822
873
|
/watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i // watchOS
|
823
874
|
], [VERSION, [NAME, 'watchOS']], [
|
824
875
|
|
825
|
-
// Google
|
826
|
-
/crkey\/([\d\.]+)/i // Google Chromecast
|
827
|
-
], [VERSION, [NAME, CHROME+'cast']], [
|
876
|
+
// Google ChromeOS
|
828
877
|
/(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
|
829
878
|
], [[NAME, "Chrome OS"], VERSION],[
|
830
879
|
|
@@ -836,6 +885,7 @@
|
|
836
885
|
// Console
|
837
886
|
/(nintendo|playstation) (\w+)/i, // Nintendo/Playstation
|
838
887
|
/(xbox); +xbox ([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
|
888
|
+
/(pico) .+os([\w\.]+)/i, // Pico
|
839
889
|
|
840
890
|
// Other
|
841
891
|
/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i, // Joli/Palm
|