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.
Files changed (197) hide show
  1. package/README.md +22 -17
  2. package/dist/icons/color/LICENSE.md +3 -0
  3. package/dist/icons/color/browser/android-browser.svg +1 -0
  4. package/dist/icons/color/browser/avant.png +0 -0
  5. package/dist/icons/color/browser/basilisk.png +0 -0
  6. package/dist/icons/color/browser/basilisk.svg +1 -0
  7. package/dist/icons/color/browser/brave.png +0 -0
  8. package/dist/icons/color/browser/brave.svg +1 -0
  9. package/dist/icons/color/browser/chrome.png +0 -0
  10. package/dist/icons/color/browser/chrome.svg +1 -0
  11. package/dist/icons/color/browser/chromium.png +0 -0
  12. package/dist/icons/color/browser/chromium.svg +1 -0
  13. package/dist/icons/color/browser/coc-coc.png +0 -0
  14. package/dist/icons/color/browser/default.png +0 -0
  15. package/dist/icons/color/browser/default.svg +1 -0
  16. package/dist/icons/color/browser/dolphin.png +0 -0
  17. package/dist/icons/color/browser/edge.png +0 -0
  18. package/dist/icons/color/browser/edge.svg +1 -0
  19. package/dist/icons/color/browser/electron.png +0 -0
  20. package/dist/icons/color/browser/electron.svg +1 -0
  21. package/dist/icons/color/browser/falkon.png +0 -0
  22. package/dist/icons/color/browser/falkon.svg +1 -0
  23. package/dist/icons/color/browser/firefox-reality.png +0 -0
  24. package/dist/icons/color/browser/firefox-reality.svg +1 -0
  25. package/dist/icons/color/browser/firefox.png +0 -0
  26. package/dist/icons/color/browser/firefox.svg +1 -0
  27. package/dist/icons/color/browser/gsa.svg +9 -0
  28. package/dist/icons/color/browser/icecat.png +0 -0
  29. package/dist/icons/color/browser/ie.svg +6 -0
  30. package/dist/icons/color/browser/konqueror.png +0 -0
  31. package/dist/icons/color/browser/konqueror.svg +1 -0
  32. package/dist/icons/color/browser/maxthon.png +0 -0
  33. package/dist/icons/color/browser/midori.png +0 -0
  34. package/dist/icons/color/browser/midori.svg +1 -0
  35. package/dist/icons/color/browser/netsurf.png +0 -0
  36. package/dist/icons/color/browser/netsurf.svg +1 -0
  37. package/dist/icons/color/browser/opera-gx.png +0 -0
  38. package/dist/icons/color/browser/opera-gx.svg +1 -0
  39. package/dist/icons/color/browser/opera-mini.png +0 -0
  40. package/dist/icons/color/browser/opera-touch.png +0 -0
  41. package/dist/icons/color/browser/opera.png +0 -0
  42. package/dist/icons/color/browser/opera.svg +1 -0
  43. package/dist/icons/color/browser/palemoon.png +0 -0
  44. package/dist/icons/color/browser/puffin.png +0 -0
  45. package/dist/icons/color/browser/safari.png +0 -0
  46. package/dist/icons/color/browser/safari.svg +1 -0
  47. package/dist/icons/color/browser/samsung-internet.png +0 -0
  48. package/dist/icons/color/browser/samsung-internet.svg +1 -0
  49. package/dist/icons/color/browser/seamonkey.png +0 -0
  50. package/dist/icons/color/browser/silk.png +0 -0
  51. package/dist/icons/color/browser/sogou-mobile.png +0 -0
  52. package/dist/icons/color/browser/ucbrowser.png +0 -0
  53. package/dist/icons/color/browser/ucbrowser.svg +1 -0
  54. package/dist/icons/color/browser/vivaldi.png +0 -0
  55. package/dist/icons/color/browser/vivaldi.svg +1 -0
  56. package/dist/icons/color/browser/webkit.png +0 -0
  57. package/dist/icons/color/browser/webkit.svg +1 -0
  58. package/dist/icons/color/browser/yandex.png +0 -0
  59. package/dist/icons/color/os/centos.svg +1 -0
  60. package/dist/icons/mono/LICENSE.md +3 -0
  61. package/dist/icons/mono/browser/alipay.svg +1 -0
  62. package/dist/icons/mono/browser/android-browser.svg +1 -0
  63. package/dist/icons/mono/browser/avast-secure-browser.svg +1 -0
  64. package/dist/icons/mono/browser/baidu-browser.svg +1 -0
  65. package/dist/icons/mono/browser/brave.svg +1 -0
  66. package/dist/icons/mono/browser/chrome-headless.svg +1 -0
  67. package/dist/icons/mono/browser/chrome-webview.svg +1 -0
  68. package/dist/icons/mono/browser/chrome.svg +1 -0
  69. package/dist/icons/mono/browser/chromium.svg +1 -0
  70. package/dist/icons/mono/browser/duckduckgo.svg +1 -0
  71. package/dist/icons/mono/browser/edge.svg +1 -0
  72. package/dist/icons/mono/browser/electron.svg +1 -0
  73. package/dist/icons/mono/browser/facebook.svg +1 -0
  74. package/dist/icons/mono/browser/firefox-focus.svg +1 -0
  75. package/dist/icons/mono/browser/firefox-reality.svg +1 -0
  76. package/dist/icons/mono/browser/firefox.svg +1 -0
  77. package/dist/icons/mono/browser/gsa.svg +1 -0
  78. package/dist/icons/mono/browser/huawei-browser.svg +1 -0
  79. package/dist/icons/mono/browser/icecat.svg +1 -0
  80. package/dist/icons/mono/browser/ie.svg +1 -0
  81. package/dist/icons/mono/browser/instagram.svg +1 -0
  82. package/dist/icons/mono/browser/jasmine.svg +1 -0
  83. package/dist/icons/mono/browser/kakaotalk.svg +1 -0
  84. package/dist/icons/mono/browser/klarna.svg +1 -0
  85. package/dist/icons/mono/browser/line.svg +1 -0
  86. package/dist/icons/mono/browser/linkedin.svg +1 -0
  87. package/dist/icons/mono/browser/miui-browser.svg +1 -0
  88. package/dist/icons/mono/browser/mobile-chrome.svg +1 -0
  89. package/dist/icons/mono/browser/mobile-firefox.svg +1 -0
  90. package/dist/icons/mono/browser/mobile-safari.svg +1 -0
  91. package/dist/icons/mono/browser/mozilla.svg +1 -0
  92. package/dist/icons/mono/browser/naver.svg +1 -0
  93. package/dist/icons/mono/browser/nokia-browser.svg +1 -0
  94. package/dist/icons/mono/browser/oculus-browser.svg +1 -0
  95. package/dist/icons/mono/browser/opera-coast.svg +1 -0
  96. package/dist/icons/mono/browser/opera-gx.svg +1 -0
  97. package/dist/icons/mono/browser/opera-mini.svg +1 -0
  98. package/dist/icons/mono/browser/opera-mobi.svg +1 -0
  99. package/dist/icons/mono/browser/opera-tablet.svg +1 -0
  100. package/dist/icons/mono/browser/opera-touch.svg +1 -0
  101. package/dist/icons/mono/browser/opera.svg +1 -0
  102. package/dist/icons/mono/browser/qqbrowser.svg +1 -0
  103. package/dist/icons/mono/browser/qqbrowserlite.svg +1 -0
  104. package/dist/icons/mono/browser/safari.svg +1 -0
  105. package/dist/icons/mono/browser/sailfish-browser.svg +1 -0
  106. package/dist/icons/mono/browser/samsung-internet.svg +1 -0
  107. package/dist/icons/mono/browser/smart-lenovo-browser.svg +1 -0
  108. package/dist/icons/mono/browser/snapchat.svg +1 -0
  109. package/dist/icons/mono/browser/sogou-explorer.svg +1 -0
  110. package/dist/icons/mono/browser/sogou-mobile.svg +1 -0
  111. package/dist/icons/mono/browser/tesla.svg +1 -0
  112. package/dist/icons/mono/browser/tiktok.svg +1 -0
  113. package/dist/icons/mono/browser/twitter.svg +1 -0
  114. package/dist/icons/mono/browser/vivaldi.svg +1 -0
  115. package/dist/icons/mono/browser/vivo-browser.svg +1 -0
  116. package/dist/icons/mono/browser/wechat.svg +1 -0
  117. package/dist/icons/mono/browser/weibo.svg +1 -0
  118. package/dist/icons/mono/browser/yandex.svg +1 -0
  119. package/dist/icons/mono/device/acer.svg +1 -0
  120. package/dist/icons/mono/device/amazon.svg +1 -0
  121. package/dist/icons/mono/device/apple.svg +1 -0
  122. package/dist/icons/mono/device/asus.svg +1 -0
  123. package/dist/icons/mono/device/att.svg +1 -0
  124. package/dist/icons/mono/device/blackberry.svg +1 -0
  125. package/dist/icons/mono/device/dell.svg +1 -0
  126. package/dist/icons/mono/device/facebook.svg +1 -0
  127. package/dist/icons/mono/device/fairphone.svg +1 -0
  128. package/dist/icons/mono/device/google.svg +1 -0
  129. package/dist/icons/mono/device/hp.svg +1 -0
  130. package/dist/icons/mono/device/huawei.svg +1 -0
  131. package/dist/icons/mono/device/lenovo.svg +1 -0
  132. package/dist/icons/mono/device/lg.svg +1 -0
  133. package/dist/icons/mono/device/meizu.svg +1 -0
  134. package/dist/icons/mono/device/microsoft.svg +1 -0
  135. package/dist/icons/mono/device/motorola.svg +1 -0
  136. package/dist/icons/mono/device/nintendo.svg +1 -0
  137. package/dist/icons/mono/device/nokia.svg +1 -0
  138. package/dist/icons/mono/device/nvidia.svg +1 -0
  139. package/dist/icons/mono/device/oneplus.svg +1 -0
  140. package/dist/icons/mono/device/oppo.svg +1 -0
  141. package/dist/icons/mono/device/panasonic.svg +1 -0
  142. package/dist/icons/mono/device/roku.svg +1 -0
  143. package/dist/icons/mono/device/samsung.svg +1 -0
  144. package/dist/icons/mono/device/siemens.svg +1 -0
  145. package/dist/icons/mono/device/sony.svg +1 -0
  146. package/dist/icons/mono/device/tesla.svg +1 -0
  147. package/dist/icons/mono/device/vivo.svg +1 -0
  148. package/dist/icons/mono/device/vodafone.svg +1 -0
  149. package/dist/icons/mono/device/xiaomi.svg +1 -0
  150. package/dist/icons/mono/device/zebra.svg +1 -0
  151. package/dist/icons/mono/os/android.svg +1 -0
  152. package/dist/icons/mono/os/arch.svg +1 -0
  153. package/dist/icons/mono/os/blackberry.svg +1 -0
  154. package/dist/icons/mono/os/centos.svg +1 -0
  155. package/dist/icons/mono/os/chrome-os.svg +1 -0
  156. package/dist/icons/mono/os/chromecast.svg +1 -0
  157. package/dist/icons/mono/os/debian.svg +1 -0
  158. package/dist/icons/mono/os/deepin.svg +1 -0
  159. package/dist/icons/mono/os/elementary-os.svg +1 -0
  160. package/dist/icons/mono/os/fedora.svg +1 -0
  161. package/dist/icons/mono/os/firefox.svg +1 -0
  162. package/dist/icons/mono/os/freebsd.svg +1 -0
  163. package/dist/icons/mono/os/gentoo.svg +1 -0
  164. package/dist/icons/mono/os/gnu.svg +1 -0
  165. package/dist/icons/mono/os/harmonyos.svg +1 -0
  166. package/dist/icons/mono/os/ios.svg +1 -0
  167. package/dist/icons/mono/os/kaios.svg +1 -0
  168. package/dist/icons/mono/os/linux.svg +1 -0
  169. package/dist/icons/mono/os/macos.svg +1 -0
  170. package/dist/icons/mono/os/manjaro.svg +1 -0
  171. package/dist/icons/mono/os/mint.svg +1 -0
  172. package/dist/icons/mono/os/netbsd.svg +1 -0
  173. package/dist/icons/mono/os/nintendo.svg +1 -0
  174. package/dist/icons/mono/os/openbsd.svg +1 -0
  175. package/dist/icons/mono/os/playstation.svg +1 -0
  176. package/dist/icons/mono/os/raspbian.svg +1 -0
  177. package/dist/icons/mono/os/redhat.svg +1 -0
  178. package/dist/icons/mono/os/sailfish.svg +1 -0
  179. package/dist/icons/mono/os/slackware.svg +1 -0
  180. package/dist/icons/mono/os/suse.svg +1 -0
  181. package/dist/icons/mono/os/ubuntu.svg +1 -0
  182. package/dist/icons/mono/os/windows.svg +1 -0
  183. package/dist/icons/mono/os/xbox.svg +1 -0
  184. package/dist/ua-parser.min.js +2 -2
  185. package/dist/ua-parser.pack.js +2 -2
  186. package/package.json +9 -4
  187. package/src/enums/ua-parser-enums.js +22 -6
  188. package/src/enums/ua-parser-enums.mjs +22 -6
  189. package/src/extensions/ua-parser-extensions.d.ts +2 -1
  190. package/src/extensions/ua-parser-extensions.js +100 -75
  191. package/src/extensions/ua-parser-extensions.mjs +100 -75
  192. package/src/helpers/ua-parser-helpers.d.ts +14 -4
  193. package/src/helpers/ua-parser-helpers.js +38 -6
  194. package/src/helpers/ua-parser-helpers.mjs +39 -7
  195. package/src/main/ua-parser.d.ts +3 -3
  196. package/src/main/ua-parser.js +83 -33
  197. package/src/main/ua-parser.mjs +83 -33
@@ -1,15 +1,25 @@
1
- // Type definitions for Helpers submodule of UAParser.js v2.0.0-beta.3
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 isChromiumBased(res: IResult): boolean;
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
- isChromiumBased,
14
- isFrozenUA
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-beta.3
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 isAppleSilicon = (res) => res.os.is(OS.MACOS) && res.cpu.is(CPU.ARM);
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 isChromiumBased = (res) => res.engine.is(Engine.BLINK);
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 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);
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
- isChromiumBased,
21
- isFrozenUA
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-beta.3
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 { CPU, OS, Engine } from '../enums/ua-parser-enums';
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 isAppleSilicon = (res) => res.os.is(OS.MACOS) && res.cpu.is(CPU.ARM);
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 isChromiumBased = (res) => res.engine.is(Engine.BLINK);
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 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);
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
- isChromiumBased,
25
- isFrozenUA
52
+ isBot,
53
+ isChromeFamily,
54
+ isElectron,
55
+ isFromEU,
56
+ isFrozenUA,
57
+ isStandalonePWA
26
58
  }
@@ -1,4 +1,4 @@
1
- // Type definitions for UAParser.js v2.0.0-beta.3
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> {
@@ -1,10 +1,10 @@
1
1
  /////////////////////////////////////////////////////////////////////////////////
2
- /* UAParser.js v2.0.0-beta.3
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://faisalman.github.io/ua-parser-js
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-beta.3',
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)\s?(?:browser)?[\/ ]?([\w\.]*)/i, // Avant/IEMobile/SlimBrowser
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 // 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|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar)\/([-\w\.]+)/i,
331
- // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar
332
- /(heytap|ovi)browser\/([\d\.]+)/i, // HeyTap/Ovi
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
- /\bqihu|(qi?ho?o?|360)browser/i // 360
368
- ], [[NAME, '360' + SUFFIX_BROWSER]], [
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|2345Explorer)[\/ ]?([\w\.]+)/i // QQBrowser/2345 Browser
387
+ /m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i // QQ/2345
384
388
  ], [NAME, VERSION], [
385
- /(lbbrowser|rekonq)/i, // LieBao Browser/Rekonq
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
- /(chromium|instagram|snapchat)[\/ ]([-\w\.]+)/i // Chromium/Instagram/Snapchat
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 // Wolvic
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)-\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
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[c-r]{2})( bui|\))/i, // Kindle Fire without Silk / Echo Show
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 // Google Chromecast
687
- ], [[MODEL, CHROME+'cast'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
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
- /(quest( \d| pro)?)/i // Oculus Quest
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 Chromecast
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