ua-parser-js 2.0.8 → 2.0.10

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 (209) hide show
  1. package/README.md +6 -10
  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 +3 -3
  185. package/dist/ua-parser.min.mjs +3 -3
  186. package/dist/ua-parser.pack.js +3 -3
  187. package/dist/ua-parser.pack.mjs +3 -3
  188. package/package.json +20 -2
  189. package/src/bot-detection/bot-detection.d.ts +6 -4
  190. package/src/bot-detection/bot-detection.js +10 -1
  191. package/src/bot-detection/bot-detection.mjs +10 -1
  192. package/src/browser-detection/browser-detection.d.ts +1 -1
  193. package/src/browser-detection/browser-detection.js +6 -3
  194. package/src/browser-detection/browser-detection.mjs +6 -3
  195. package/src/device-detection/device-detection.d.ts +1 -1
  196. package/src/device-detection/device-detection.js +1 -1
  197. package/src/device-detection/device-detection.mjs +1 -1
  198. package/src/enums/ua-parser-enums.d.ts +40 -4
  199. package/src/enums/ua-parser-enums.js +40 -4
  200. package/src/enums/ua-parser-enums.mjs +40 -4
  201. package/src/extensions/ua-parser-extensions.d.ts +1 -1
  202. package/src/extensions/ua-parser-extensions.js +24 -12
  203. package/src/extensions/ua-parser-extensions.mjs +24 -12
  204. package/src/helpers/ua-parser-helpers.d.ts +1 -1
  205. package/src/helpers/ua-parser-helpers.js +2 -2
  206. package/src/helpers/ua-parser-helpers.mjs +2 -2
  207. package/src/main/ua-parser.d.ts +11 -5
  208. package/src/main/ua-parser.js +69 -38
  209. package/src/main/ua-parser.mjs +69 -38
@@ -3,8 +3,8 @@
3
3
  // Source: /src/main/ua-parser.js
4
4
 
5
5
  /////////////////////////////////////////////////////////////////////////////////
6
- /* UAParser.js v2.0.8
7
- Copyright © 2012-2025 Faisal Salman <f@faisalman.com>
6
+ /* UAParser.js v2.0.10
7
+ Copyright © 2012-2026 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.
@@ -21,7 +21,7 @@
21
21
  // Constants
22
22
  /////////////
23
23
 
24
- var LIBVERSION = '2.0.8',
24
+ var LIBVERSION = '2.0.10',
25
25
  UA_MAX_LENGTH = 500,
26
26
  USER_AGENT = 'user-agent',
27
27
  EMPTY = '',
@@ -59,6 +59,7 @@
59
59
  EMBEDDED = 'embedded',
60
60
 
61
61
  // browser types
62
+ FETCHER = 'fetcher',
62
63
  INAPP = 'inapp',
63
64
 
64
65
  // client hints
@@ -171,7 +172,7 @@
171
172
  itemListToArray = function (header) {
172
173
  if (!header) return undefined;
173
174
  var arr = [];
174
- var tokens = strip(/\\?\"/g, header).split(',');
175
+ var tokens = normalizeHeaderValue(header).split(',');
175
176
  for (var i = 0; i < tokens.length; i++) {
176
177
  if (tokens[i].indexOf(';') > -1) {
177
178
  var token = trim(tokens[i]).split(';v=');
@@ -188,6 +189,9 @@
188
189
  majorize = function (version) {
189
190
  return isString(version) ? strip(/[^\d\.]/g, version).split('.')[0] : undefined;
190
191
  },
192
+ normalizeHeaderValue = function (str) {
193
+ return isString(str) ? trim(strip(/\\?\"/g, str), UA_MAX_LENGTH) : undefined;
194
+ },
191
195
  setProps = function (arr) {
192
196
  for (var i in arr) {
193
197
  if (!arr.hasOwnProperty(i)) continue;
@@ -204,9 +208,6 @@
204
208
  strip = function (pattern, str) {
205
209
  return isString(str) ? str.replace(pattern, EMPTY) : str;
206
210
  },
207
- stripQuotes = function (str) {
208
- return strip(/\\?\"/g, str);
209
- },
210
211
  trim = function (str, len) {
211
212
  str = strip(/^\s\s*/, String(str));
212
213
  return typeof len === TYPEOF.UNDEFINED ? str : str.substring(0, len);
@@ -279,6 +280,10 @@
279
280
  }
280
281
  },
281
282
 
283
+ strTest = function (str, map) {
284
+ return map.test.test(str) ? map.ifTrue : map.ifFalse;
285
+ },
286
+
282
287
  strMapper = function (str, map) {
283
288
 
284
289
  for (var i in map) {
@@ -349,7 +354,7 @@
349
354
  /\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
350
355
  ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [
351
356
  /webview.+edge\/([\w\.]+)/i // Microsoft Edge
352
- ], [VERSION, [NAME, EDGE+' WebView']], [
357
+ ], [VERSION, [NAME, EDGE+' WebView'], [TYPE, INAPP]], [
353
358
  /edg(?:e|ios|a)?\/([\w\.]+)/i
354
359
  ], [VERSION, [NAME, 'Edge']], [
355
360
 
@@ -381,7 +386,7 @@
381
386
  /(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:hi|lg |ovi|qute)browser|palemoon)\/v?([-\w\.]+)/i,
382
387
  // Atlas/Rekonq/Puffin/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
383
388
  /(brave)(?: chrome)?\/([\d\.]+)/i, // Brave
384
- /(heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i, // HeyTap/Ovi/115/Surf
389
+ /(aloha|heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i, // Aloha/HeyTap/Ovi/115/Surf
385
390
  /(qwant)(?:ios|mobile)\/([\d\.]+)/i, // Qwant
386
391
  /(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i // Ecosia/Weibo
387
392
  ], [NAME, VERSION], [
@@ -389,7 +394,7 @@
389
394
  ], [VERSION, [NAME, 'Quark']], [
390
395
  /\bddg\/([\w\.]+)/i // DuckDuckGo
391
396
  ], [VERSION, [NAME, 'DuckDuckGo']], [
392
- /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser
397
+ /(?:\buc? ?browser|(?:juc.+)ucweb| ucpc)[\/ ]?([\w\.]+)/i // UCBrowser
393
398
  ], [VERSION, [NAME, 'UCBrowser']], [
394
399
  /microm.+\bqbcore\/([\w\.]+)/i, // WeChat Desktop for Windows Built-in Browser
395
400
  /\bqbcore\/([\w\.]+).+microm/i,
@@ -403,8 +408,10 @@
403
408
  ], [VERSION, [NAME, 'Yandex']], [
404
409
  /slbrowser\/([\w\.]+)/i // Smart Lenovo Browser
405
410
  ], [VERSION, [NAME, 'Smart ' + LENOVO + SUFFIX_BROWSER]], [
406
- /(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
411
+ /(av(?:ast|g|ira))\/([\w\.]+)/i // Avast/AVG/Avira Secure Browser
407
412
  ], [[NAME, /(.+)/, '$1 Secure' + SUFFIX_BROWSER], VERSION], [
413
+ /norton\/([\w\.]+)/i // Norton Private Browser
414
+ ], [VERSION, [NAME, 'Norton Private' + SUFFIX_BROWSER]], [
408
415
  /\bfocus\/([\w\.]+)/i // Firefox Focus
409
416
  ], [VERSION, [NAME, FIREFOX+' Focus']], [
410
417
  / mms\/([\w\.]+)$/i // Opera Neon
@@ -426,7 +433,9 @@
426
433
  /\b(qq)\/([\w\.]+)/i // QQ
427
434
  ], [[NAME, /(.+)/, '$1Browser'], VERSION], [
428
435
  /(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i
429
- ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser
436
+ ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/VivoBrowser/PicoBrowser
437
+ / HBPC\/([\w\.]+)/ // Huawei Browser
438
+ ], [VERSION, [NAME, HUAWEI + SUFFIX_BROWSER]], [
430
439
  /samsungbrowser\/([\w\.]+)/i // Samsung Internet
431
440
  ], [VERSION, [NAME, SAMSUNG + ' Internet']], [
432
441
  /metasr[\/ ]?([\d\.]+)/i // Sogou Explorer
@@ -437,10 +446,9 @@
437
446
  /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i, // Tesla
438
447
  /m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i // QQ/2345
439
448
  ], [NAME, VERSION], [
440
- /(lbbrowser|rekonq|steam(?= (clie|tenf|gameo)))/i // LieBao Browser/Rekonq/Steam
449
+ /(lbbrowser|luakit|rekonq|steam(?= (clie|tenf|gameo)))/i // LieBao Browser/Luakit/Rekonq/Steam
441
450
  ], [NAME], [
442
- /ome\/([\w\.]+) \w* ?(iron) saf/i, // Iron
443
- /ome\/([\w\.]+).+qihu (360)[es]e/i // 360
451
+ /ome\/([\w\.]+).+(iron(?= saf)|360(?=[es]e$))/i // Iron / 360
444
452
  ], [VERSION, NAME], [
445
453
 
446
454
  // WebView
@@ -468,14 +476,17 @@
468
476
  /(chromium)[\/ ]([-\w\.]+)/i // Chromium
469
477
  ], [NAME, VERSION], [
470
478
 
479
+ /ome-(lighthouse)$/i // Chrome Lighthouse
480
+ ], [NAME, [TYPE, FETCHER]], [
481
+
471
482
  /headlesschrome(?:\/([\w\.]+)| )/i // Chrome Headless
472
483
  ], [VERSION, [NAME, CHROME+' Headless']], [
473
484
 
474
485
  /wv\).+chrome\/([\w\.]+).+edgw\//i // Edge WebView2
475
- ], [VERSION, [NAME, EDGE+' WebView2']], [
486
+ ], [VERSION, [NAME, EDGE+' WebView2'], [TYPE, INAPP]], [
476
487
 
477
- / wv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
478
- ], [[NAME, CHROME+' WebView'], VERSION], [
488
+ /; wv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
489
+ ], [[NAME, CHROME+' WebView'], VERSION, [TYPE, INAPP]], [
479
490
 
480
491
  /droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i // Android Browser
481
492
  ], [VERSION, [NAME, 'Android' + SUFFIX_BROWSER]], [
@@ -609,7 +620,7 @@
609
620
  /oid[^\)]+; (redmi[\-_ ]?(?:note|k)?[\w_ ]+|m?[12]\d[01]\d\w{3,6}|poco[\w ]+|(shark )?\w{3}-[ah]0|qin ?[1-3](s\+|ultra| pro)?)( bui|; wv|\))/i,
610
621
  // Xiaomi Mi
611
622
  /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,
612
- / ([\w ]+) miui\/v?\d/i
623
+ /; ([\w ]+) miui\/v?\d/i
613
624
  ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
614
625
 
615
626
  // OnePlus
@@ -764,10 +775,19 @@
764
775
  /; (ac[3-6]\d\w{2,8})( b|\))/i
765
776
  ], [MODEL, [VENDOR, 'Archos'], [TYPE, MOBILE]], [
766
777
 
778
+ // Blackview
779
+ /blackview ([-\w ]+)( b|\))/i,
780
+ /; (bv\d{4}[-\w ]*)( b|\))/i
781
+ ], [MODEL, [VENDOR, 'Blackview'], [TYPE, MOBILE]], [
782
+
767
783
  // HMD
768
784
  /; (n159v)/i
769
785
  ], [MODEL, [VENDOR, 'HMD'], [TYPE, MOBILE]], [
770
786
 
787
+ // T-Mobile
788
+ /((revvl[ \w\+]+|tm(?:rv|af)\w*[45]g(?:tb)?))( b|\))/i
789
+ ], [MODEL, [TYPE, strTest, { 'test': /ta?b/i, 'ifTrue': TABLET, 'ifFalse': MOBILE }], [VENDOR, 'T-Mobile']], [
790
+
771
791
  // MIXED
772
792
  /(imo) (tab \w+)/i, // IMO
773
793
  /(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i // Infinix XPad / Tecno
@@ -775,8 +795,8 @@
775
795
 
776
796
  /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
777
797
  // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan
778
- // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko
779
- /; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,
798
+ // BLU/Coolpad/CUBOT/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko
799
+ /; (blu|coolpad|cubot|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([-\w\+ ]+?)(?: bui|\)|; r)/i,
780
800
  /(hp) ([\w ]+\w)/i, // HP iPAQ
781
801
  /(microsoft); (lumia[\w ]+)/i, // Microsoft Lumia
782
802
  /(oppo) ?([\w ]+) bui/i, // OPPO
@@ -1014,14 +1034,16 @@
1014
1034
  /web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i
1015
1035
  // https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine
1016
1036
  ], [[VERSION, strMapper, {'25':'120','24':'108','23':'94','22':'87','6':'79','5':'68','4':'53','3':'38','2':'538','1':'537','*':'TV'}], [NAME, 'webOS']], [
1017
- /watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i // watchOS
1037
+ /watch(?: ?os[,\/ ]|\d,\d\/)([\d\.]+)/i // watchOS
1018
1038
  ], [VERSION, [NAME, 'watchOS']], [
1019
1039
 
1020
1040
  // Google ChromeOS
1021
- /(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
1022
- ], [[NAME, "Chrome OS"], VERSION],[
1041
+ /cros [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
1042
+ ], [VERSION, [NAME, 'Chrome OS']],[
1023
1043
 
1024
1044
  // Smart TVs
1045
+ /kepler ([\w\.]+); (aft|aeo)/i // Vega OS
1046
+ ], [VERSION, [NAME, 'Vega OS']],[
1025
1047
  /(netrange)mmh/i, // Netrange
1026
1048
  /(nettv)\/(\d+\.[\w\.]+)/i, // NetTV
1027
1049
 
@@ -1182,12 +1204,12 @@
1182
1204
  [BRANDS, itemListToArray(uach[CH])],
1183
1205
  [FULLVERLIST, itemListToArray(uach[CH_FULL_VER_LIST])],
1184
1206
  [MOBILE, /\?1/.test(uach[CH_MOBILE])],
1185
- [MODEL, stripQuotes(uach[CH_MODEL])],
1186
- [PLATFORM, stripQuotes(uach[CH_PLATFORM])],
1187
- [PLATFORMVER, stripQuotes(uach[CH_PLATFORM_VER])],
1188
- [ARCHITECTURE, stripQuotes(uach[CH_ARCH])],
1207
+ [MODEL, normalizeHeaderValue(uach[CH_MODEL])],
1208
+ [PLATFORM, normalizeHeaderValue(uach[CH_PLATFORM])],
1209
+ [PLATFORMVER, normalizeHeaderValue(uach[CH_PLATFORM_VER])],
1210
+ [ARCHITECTURE, normalizeHeaderValue(uach[CH_ARCH])],
1189
1211
  [FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],
1190
- [BITNESS, stripQuotes(uach[CH_BITNESS])]
1212
+ [BITNESS, normalizeHeaderValue(uach[CH_BITNESS])]
1191
1213
  ]);
1192
1214
  } else {
1193
1215
  for (var prop in uach) {
@@ -1275,11 +1297,17 @@
1275
1297
  this.set(MAJOR, majorize(this.get(VERSION)));
1276
1298
  break;
1277
1299
  case OS:
1278
- if (this.get(NAME) == 'iOS' && this.get(VERSION) == '18.6') {
1279
- // Based on the assumption that iOS version is tightly coupled with Safari version
1280
- var realVersion = /\) Version\/([\d\.]+)/.exec(this.ua); // Get Safari version
1281
- if (realVersion && parseInt(realVersion[1].substring(0,2), 10) >= 26) {
1282
- this.set(VERSION, realVersion[1]); // Set as iOS version
1300
+ // Since iOS 26, Safari's UA reports the OS version as frozen at 18:
1301
+ // https://webkit.org/blog/17333/webkit-features-in-safari-26-0/#update-to-ua-string
1302
+ if (this.get(NAME) == 'iOS' && this.get(VERSION)) {
1303
+ // Only perform this if iOS version is 18/19
1304
+ if (/^1[89][^\d]/.exec(this.get(VERSION))) {
1305
+ // Based on the assumption that "iOS" version is tightly coupled with "Safari" version
1306
+ var realVersion = /\) Version\/((\d+)[\d\.]*)/.exec(this.ua);
1307
+ if (realVersion && parseInt(realVersion[2], 10) >= 26) {
1308
+ // iOS version = Safari version
1309
+ this.set(VERSION, realVersion[1]);
1310
+ }
1283
1311
  }
1284
1312
  }
1285
1313
  break;
@@ -1435,9 +1463,7 @@
1435
1463
  EMPTY)), // empty string
1436
1464
 
1437
1465
  httpUACH = new UACHData(headers, true),
1438
- regexMap = extensions ?
1439
- extend(defaultRegexes, extensions) :
1440
- defaultRegexes,
1466
+ regexMap = defaultRegexes,
1441
1467
 
1442
1468
  createItemFunc = function (itemType) {
1443
1469
  if (itemType == RESULT) {
@@ -1472,9 +1498,14 @@
1472
1498
  ['setUA', function (ua) {
1473
1499
  if (isString(ua)) userAgent = trim(ua, UA_MAX_LENGTH);
1474
1500
  return this;
1501
+ }],
1502
+ ['useExtension', function (exts) {
1503
+ if (exts) regexMap = extend(regexMap, exts);
1504
+ return this;
1475
1505
  }]
1476
1506
  ])
1477
- .setUA(userAgent);
1507
+ .setUA(userAgent)
1508
+ .useExtension(extensions);
1478
1509
 
1479
1510
  return this;
1480
1511
  }