ua-parser-js 1.0.2 → 1.0.37

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/src/ua-parser.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /////////////////////////////////////////////////////////////////////////////////
2
- /* UAParser.js v1.0.2
2
+ /* UAParser.js v1.0.37
3
3
  Copyright © 2012-2021 Faisal Salman <f@faisalman.com>
4
4
  MIT License *//*
5
5
  Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
@@ -17,7 +17,7 @@
17
17
  /////////////
18
18
 
19
19
 
20
- var LIBVERSION = '1.0.2',
20
+ var LIBVERSION = '1.0.37',
21
21
  EMPTY = '',
22
22
  UNKNOWN = '?',
23
23
  FUNC_TYPE = 'function',
@@ -37,7 +37,7 @@
37
37
  SMARTTV = 'smarttv',
38
38
  WEARABLE = 'wearable',
39
39
  EMBEDDED = 'embedded',
40
- UA_MAX_LENGTH = 255;
40
+ UA_MAX_LENGTH = 500;
41
41
 
42
42
  var AMAZON = 'Amazon',
43
43
  APPLE = 'Apple',
@@ -54,10 +54,13 @@
54
54
  MOTOROLA = 'Motorola',
55
55
  OPERA = 'Opera',
56
56
  SAMSUNG = 'Samsung',
57
+ SHARP = 'Sharp',
57
58
  SONY = 'Sony',
58
59
  XIAOMI = 'Xiaomi',
59
60
  ZEBRA = 'Zebra',
60
- FACEBOOK = 'Facebook';
61
+ FACEBOOK = 'Facebook',
62
+ CHROMIUM_OS = 'Chromium OS',
63
+ MAC_OS = 'Mac OS';
61
64
 
62
65
  ///////////
63
66
  // Helper
@@ -92,7 +95,7 @@
92
95
  },
93
96
  trim = function (str, len) {
94
97
  if (typeof(str) === STR_TYPE) {
95
- str = str.replace(/^\s\s*/, EMPTY).replace(/\s\s*$/, EMPTY);
98
+ str = str.replace(/^\s\s*/, EMPTY);
96
99
  return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
97
100
  }
98
101
  };
@@ -115,6 +118,7 @@
115
118
  // try matching uastring with regexes
116
119
  while (j < regex.length && !matches) {
117
120
 
121
+ if (!regex[j]) { break; }
118
122
  matches = regex[j++].exec(ua);
119
123
 
120
124
  if (!!matches) {
@@ -223,30 +227,34 @@
223
227
  ], [VERSION, [NAME, OPERA]], [
224
228
 
225
229
  // Mixed
230
+ /\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i // Baidu
231
+ ], [VERSION, [NAME, 'Baidu']], [
226
232
  /(kindle)\/([\w\.]+)/i, // Kindle
227
233
  /(lunascape|maxthon|netfront|jasmine|blazer)[\/ ]?([\w\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer
228
234
  // Trident based
229
- /(avant |iemobile|slim)(?:browser)?[\/ ]?([\w\.]*)/i, // Avant/IEMobile/SlimBrowser
230
- /(ba?idubrowser)[\/ ]?([\w\.]+)/i, // Baidu Browser
235
+ /(avant|iemobile|slim)\s?(?:browser)?[\/ ]?([\w\.]*)/i, // Avant/IEMobile/SlimBrowser
231
236
  /(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
232
237
 
233
238
  // Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
234
- /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale|qqbrowserlite|qq)\/([-\w\.]+)/i,
239
+ /(flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|qq|duckduckgo)\/([-\w\.]+)/i,
235
240
  // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ
241
+ /(heytap|ovi)browser\/([\d\.]+)/i, // Heytap/Ovi
236
242
  /(weibo)__([\d\.]+)/i // Weibo
237
243
  ], [NAME, VERSION], [
238
244
  /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser
239
245
  ], [VERSION, [NAME, 'UC'+BROWSER]], [
240
- /\bqbcore\/([\w\.]+)/i // WeChat Desktop for Windows Built-in Browser
241
- ], [VERSION, [NAME, 'WeChat(Win) Desktop']], [
246
+ /microm.+\bqbcore\/([\w\.]+)/i, // WeChat Desktop for Windows Built-in Browser
247
+ /\bqbcore\/([\w\.]+).+microm/i,
242
248
  /micromessenger\/([\w\.]+)/i // WeChat
243
249
  ], [VERSION, [NAME, 'WeChat']], [
244
250
  /konqueror\/([\w\.]+)/i // Konqueror
245
251
  ], [VERSION, [NAME, 'Konqueror']], [
246
252
  /trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i // IE11
247
253
  ], [VERSION, [NAME, 'IE']], [
248
- /yabrowser\/([\w\.]+)/i // Yandex
254
+ /ya(?:search)?browser\/([\w\.]+)/i // Yandex
249
255
  ], [VERSION, [NAME, 'Yandex']], [
256
+ /slbrowser\/([\w\.]+)/i // Smart Lenovo Browser
257
+ ], [VERSION, [NAME, 'Smart Lenovo '+BROWSER]], [
250
258
  /(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
251
259
  ], [[NAME, /(.+)/, '$1 Secure '+BROWSER], VERSION], [
252
260
  /\bfocus\/([\w\.]+)/i // Firefox Focus
@@ -264,28 +272,40 @@
264
272
  /fxios\/([-\w\.]+)/i // Firefox for iOS
265
273
  ], [VERSION, [NAME, FIREFOX]], [
266
274
  /\bqihu|(qi?ho?o?|360)browser/i // 360
267
- ], [[NAME, '360 '+BROWSER]], [
268
- /(oculus|samsung|sailfish)browser\/([\w\.]+)/i
269
- ], [[NAME, /(.+)/, '$1 '+BROWSER], VERSION], [ // Oculus/Samsung/Sailfish Browser
275
+ ], [[NAME, '360 ' + BROWSER]], [
276
+ /(oculus|sailfish|huawei|vivo)browser\/([\w\.]+)/i
277
+ ], [[NAME, /(.+)/, '$1 ' + BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser
278
+ /samsungbrowser\/([\w\.]+)/i // Samsung Internet
279
+ ], [VERSION, [NAME, SAMSUNG + ' Internet']], [
270
280
  /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
271
281
  ], [[NAME, /_/g, ' '], VERSION], [
282
+ /metasr[\/ ]?([\d\.]+)/i // Sogou Explorer
283
+ ], [VERSION, [NAME, 'Sogou Explorer']], [
284
+ /(sogou)mo\w+\/([\d\.]+)/i // Sogou Mobile
285
+ ], [[NAME, 'Sogou Mobile'], VERSION], [
272
286
  /(electron)\/([\w\.]+) safari/i, // Electron-based App
273
287
  /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i, // Tesla
274
- /m?(qqbrowser|baiduboxapp|2345Explorer)[\/ ]?([\w\.]+)/i // QQBrowser/Baidu App/2345 Browser
288
+ /m?(qqbrowser|2345Explorer)[\/ ]?([\w\.]+)/i // QQBrowser/2345 Browser
275
289
  ], [NAME, VERSION], [
276
- /(metasr)[\/ ]?([\w\.]+)/i, // SouGouBrowser
277
- /(lbbrowser)/i // LieBao Browser
290
+ /(lbbrowser)/i, // LieBao Browser
291
+ /\[(linkedin)app\]/i // LinkedIn App for iOS & Android
278
292
  ], [NAME], [
279
293
 
280
294
  // WebView
281
295
  /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i // Facebook App for iOS & Android
282
296
  ], [[NAME, FACEBOOK], VERSION], [
297
+ /(Klarna)\/([\w\.]+)/i, // Klarna Shopping Browser for iOS & Android
298
+ /(kakao(?:talk|story))[\/ ]([\w\.]+)/i, // Kakao App
299
+ /(naver)\(.*?(\d+\.[\w\.]+).*\)/i, // Naver InApp
283
300
  /safari (line)\/([\w\.]+)/i, // Line App for iOS
284
301
  /\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
285
- /(chromium|instagram)[\/ ]([-\w\.]+)/i // Chromium/Instagram
302
+ /(alipay)client\/([\w\.]+)/i, // Alipay
303
+ /(chromium|instagram|snapchat)[\/ ]([-\w\.]+)/i // Chromium/Instagram/Snapchat
286
304
  ], [NAME, VERSION], [
287
305
  /\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
288
306
  ], [VERSION, [NAME, 'GSA']], [
307
+ /musical_ly(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
308
+ ], [VERSION, [NAME, 'TikTok']], [
289
309
 
290
310
  /headlesschrome(?:\/([\w\.]+)| )/i // Chrome Headless
291
311
  ], [VERSION, [NAME, CHROME+' Headless']], [
@@ -299,9 +319,9 @@
299
319
  /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
300
320
  ], [NAME, VERSION], [
301
321
 
302
- /version\/([\w\.]+) .*mobile\/\w+ (safari)/i // Mobile Safari
322
+ /version\/([\w\.\,]+) .*mobile\/\w+ (safari)/i // Mobile Safari
303
323
  ], [VERSION, [NAME, 'Mobile Safari']], [
304
- /version\/([\w\.]+) .*(mobile ?safari|safari)/i // Safari & Safari Mobile
324
+ /version\/([\w(\.|\,)]+) .*(mobile ?safari|safari)/i // Safari & Safari Mobile
305
325
  ], [VERSION, NAME], [
306
326
  /webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
307
327
  ], [NAME, [VERSION, strMapper, oldSafariMap]], [
@@ -326,8 +346,12 @@
326
346
  // Other
327
347
  /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
328
348
  // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir/Obigo/Mosaic/Go/ICE/UP.Browser
329
- /(links) \(([\w\.]+)/i // Links
330
- ], [NAME, VERSION]
349
+ /(links) \(([\w\.]+)/i, // Links
350
+ /panasonic;(viera)/i // Panasonic Viera
351
+ ], [NAME, VERSION], [
352
+
353
+ /(cobalt)\/([\w\.]+)/i // Cobalt
354
+ ], [NAME, [VERSION, /master.|lts./, ""]]
331
355
  ],
332
356
 
333
357
  cpu : [[
@@ -366,39 +390,46 @@
366
390
 
367
391
  //////////////////////////
368
392
  // MOBILES & TABLETS
369
- // Ordered by popularity
370
393
  /////////////////////////
371
394
 
372
395
  // Samsung
373
- /\b(sch-i[89]0\d|shw-m380s|sm-[pt]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i
396
+ /\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
374
397
  ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [
375
- /\b((?:s[cgp]h|gt|sm)-\w+|galaxy nexus)/i,
398
+ /\b((?:s[cgp]h|gt|sm)-\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
376
399
  /samsung[- ]([-\w]+)/i,
377
400
  /sec-(sgh\w+)/i
378
401
  ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [
379
402
 
380
403
  // Apple
381
- /\((ip(?:hone|od)[\w ]*);/i // iPod/iPhone
404
+ /(?:\/|\()(ip(?:hone|od)[\w, ]*)(?:\/|;)/i // iPod/iPhone
382
405
  ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [
383
406
  /\((ipad);[-\w\),; ]+apple/i, // iPad
384
407
  /applecoremedia\/[\w\.]+ \((ipad)/i,
385
408
  /\b(ipad)\d\d?,\d\d?[;\]].+ios/i
386
409
  ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [
410
+ /(macintosh);/i
411
+ ], [MODEL, [VENDOR, APPLE]], [
412
+
413
+ // Sharp
414
+ /\b(sh-?[altvz]?\d\d[a-ekm]?)/i
415
+ ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [
387
416
 
388
417
  // Huawei
389
418
  /\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i
390
419
  ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [
391
420
  /(?:huawei|honor)([-\w ]+)[;\)]/i,
392
- /\b(nexus 6p|\w{2,4}-[atu]?[ln][01259x][012359][an]?)\b(?!.+d\/s)/i
421
+ /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i
393
422
  ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [
394
423
 
395
424
  // Xiaomi
396
- /\b(poco[\w ]+)(?: bui|\))/i, // Xiaomi POCO
425
+ /\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i, // Xiaomi POCO
397
426
  /\b; (\w+) build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
398
427
  /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
399
428
  /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi
400
- /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i // Xiaomi Mi
429
+ /oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i, // Xiaomi Redmi 'numeric' models
430
+ /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i // Xiaomi Mi
401
431
  ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
432
+ /oid[^\)]+; (2\d{4}(283|rpbf)[cgl])( bui|\))/i, // Redmi Pad
402
433
  /\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i // Mi Pad tablets
403
434
  ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [
404
435
 
@@ -413,7 +444,7 @@
413
444
  ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
414
445
 
415
446
  // Realme
416
- /\b(rmx[12]\d{3})(?: bui|;|\))/i
447
+ /\b(rmx[1-3]\d{3})(?: bui|;|\))/i
417
448
  ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [
418
449
 
419
450
  // Motorola
@@ -449,7 +480,7 @@
449
480
  ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [
450
481
 
451
482
  // Sony
452
- /droid.+ ([c-g]\d{4}|so[-gl]\w+|xq-a\w[4-7][12])(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i
483
+ /droid.+ (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-a\w[4-7][12])(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i
453
484
  ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [
454
485
  /sony tablet [ps]/i,
455
486
  /\b(?:sony)?sgp\w+(?: bui|\))/i
@@ -462,7 +493,7 @@
462
493
 
463
494
  // Amazon
464
495
  /(alexa)webm/i,
465
- /(kf[a-z]{2}wi)( bui|\))/i, // Kindle Fire without Silk
496
+ /(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\))/i, // Kindle Fire without Silk / Echo Show
466
497
  /(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD
467
498
  ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [
468
499
  /((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i // Fire Phone
@@ -488,7 +519,7 @@
488
519
 
489
520
  // ZTE
490
521
  /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
491
- /(alcatel|geeksphone|nexian|panasonic|sony)[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
522
+ /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
492
523
  ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
493
524
 
494
525
  // Acer
@@ -499,13 +530,13 @@
499
530
  /droid.+; (m[1-5] note) bui/i,
500
531
  /\bmz-([-\w]{2,})/i
501
532
  ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
502
-
503
- // Sharp
504
- /\b(sh-?[altvz]?\d\d[a-ekm]?)/i
505
- ], [MODEL, [VENDOR, 'Sharp'], [TYPE, MOBILE]], [
533
+
534
+ // Ulefone
535
+ /; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
536
+ ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [
506
537
 
507
538
  // MIXED
508
- /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[-_ ]?([-\w]*)/i,
539
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron|infinix|tecno)[-_ ]?([-\w]*)/i,
509
540
  // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
510
541
  /(hp) ([\w ]+\w)/i, // HP iPAQ
511
542
  /(asus)-?(\w+)/i, // Asus
@@ -515,6 +546,7 @@
515
546
  /(oppo) ?([\w ]+) bui/i // OPPO
516
547
  ], [VENDOR, MODEL, [TYPE, MOBILE]], [
517
548
 
549
+ /(kobo)\s(ereader|touch)/i, // Kobo
518
550
  /(archos) (gamepad2?)/i, // Archos
519
551
  /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad
520
552
  /(kindle)\/([\w\.]+)/i, // Kindle
@@ -584,20 +616,6 @@
584
616
  /droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i
585
617
  ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [
586
618
 
587
- ///////////////////
588
- // CONSOLES
589
- ///////////////////
590
-
591
- /(ouya)/i, // Ouya
592
- /(nintendo) ([wids3utch]+)/i // Nintendo
593
- ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
594
- /droid.+; (shield) bui/i // Nvidia
595
- ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
596
- /(playstation [345portablevi]+)/i // Playstation
597
- ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [
598
- /\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox
599
- ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [
600
-
601
619
  ///////////////////
602
620
  // SMARTTVS
603
621
  ///////////////////
@@ -612,27 +630,50 @@
612
630
  ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [
613
631
  /crkey/i // Google Chromecast
614
632
  ], [[MODEL, CHROME+'cast'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
615
- /droid.+aft(\w)( bui|\))/i // Fire TV
633
+ /droid.+aft(\w+)( bui|\))/i // Fire TV
616
634
  ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
617
- /\(dtv[\);].+(aquos)/i // Sharp
618
- ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
635
+ /\(dtv[\);].+(aquos)/i,
636
+ /(aquos-tv[\w ]+)\)/i // Sharp
637
+ ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[
638
+ /(bravia[\w ]+)( bui|\))/i // Sony
639
+ ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [
640
+ /(mitv-\w{5}) bui/i // Xiaomi
641
+ ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [
642
+ /Hbbtv.*(technisat) (.*);/i // TechniSAT
643
+ ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
619
644
  /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, // Roku
620
- /hbbtv\/\d+\.\d+\.\d+ +\([\w ]*; *(\w[^;]*);([^;]*)/i // HbbTV devices
645
+ /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices
621
646
  ], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [
622
647
  /\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i // SmartTV from Unidentified Vendors
623
648
  ], [[TYPE, SMARTTV]], [
624
649
 
650
+ ///////////////////
651
+ // CONSOLES
652
+ ///////////////////
653
+
654
+ /(ouya)/i, // Ouya
655
+ /(nintendo) ([wids3utch]+)/i // Nintendo
656
+ ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
657
+ /droid.+; (shield) bui/i // Nvidia
658
+ ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
659
+ /(playstation [345portablevi]+)/i // Playstation
660
+ ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [
661
+ /\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox
662
+ ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [
663
+
625
664
  ///////////////////
626
665
  // WEARABLES
627
666
  ///////////////////
628
667
 
629
668
  /((pebble))app/i // Pebble
630
669
  ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
670
+ /(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch
671
+ ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [
631
672
  /droid.+; (glass) \d/i // Google Glass
632
673
  ], [MODEL, [VENDOR, GOOGLE], [TYPE, WEARABLE]], [
633
674
  /droid.+; (wt63?0{2,3})\)/i
634
675
  ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [
635
- /(quest( 2)?)/i // Oculus Quest
676
+ /(quest( 2| pro)?)/i // Oculus Quest
636
677
  ], [MODEL, [VENDOR, FACEBOOK], [TYPE, WEARABLE]], [
637
678
 
638
679
  ///////////////////
@@ -641,18 +682,20 @@
641
682
 
642
683
  /(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i // Tesla
643
684
  ], [VENDOR, [TYPE, EMBEDDED]], [
685
+ /(aeobc)\b/i // Echo Dot
686
+ ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [
644
687
 
645
688
  ////////////////////
646
689
  // MIXED (GENERIC)
647
690
  ///////////////////
648
691
 
649
- /droid .+?; ([^;]+?)(?: bui|\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors
692
+ /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors
650
693
  ], [MODEL, [TYPE, MOBILE]], [
651
694
  /droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors
652
695
  ], [MODEL, [TYPE, TABLET]], [
653
696
  /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet
654
697
  ], [[TYPE, TABLET]], [
655
- /(phone|mobile(?:[;\/]| safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile
698
+ /(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile
656
699
  ], [[TYPE, MOBILE]], [
657
700
  /(android[-\w\. ]{0,9});.+buil/i // Generic Android Device
658
701
  ], [MODEL, [VENDOR, 'Generic']]
@@ -670,7 +713,8 @@
670
713
  /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
671
714
  /ekioh(flow)\/([\w\.]+)/i, // Flow
672
715
  /(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links
673
- /(icab)[\/ ]([23]\.[\d\.]+)/i // iCab
716
+ /(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab
717
+ /\b(libweb)/i
674
718
  ], [NAME, VERSION], [
675
719
 
676
720
  /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
@@ -682,23 +726,24 @@
682
726
  // Windows
683
727
  /microsoft (windows) (vista|xp)/i // Windows (iTunes)
684
728
  ], [NAME, VERSION], [
685
- /(windows) nt 6\.2; (arm)/i, // Windows RT
686
- /(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i, // Windows Phone
687
- /(windows)[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i
729
+ /(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i // Windows Phone
688
730
  ], [NAME, [VERSION, strMapper, windowsVersionMap]], [
689
- /(win(?=3|9|n)|win 9x )([nt\d\.]+)/i
690
- ], [[NAME, 'Windows'], [VERSION, strMapper, windowsVersionMap]], [
731
+ /windows nt 6\.2; (arm)/i, // Windows RT
732
+ /windows[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i,
733
+ /(?:win(?=3|9|n)|win 9x )([nt\d\.]+)/i
734
+ ], [[VERSION, strMapper, windowsVersionMap], [NAME, 'Windows']], [
691
735
 
692
736
  // iOS/macOS
693
737
  /ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS
738
+ /(?:ios;fbsv\/|iphone.+ios[\/ ])([\d\.]+)/i,
694
739
  /cfnetwork\/.+darwin/i
695
740
  ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
696
741
  /(mac os x) ?([\w\. ]*)/i,
697
742
  /(macintosh|mac_powerpc\b)(?!.+haiku)/i // Mac OS
698
- ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
743
+ ], [[NAME, MAC_OS], [VERSION, /_/g, '.']], [
699
744
 
700
745
  // Mobile OSes
701
- /droid ([\w\.]+)\b.+(android[- ]x86)/i // Android-x86
746
+ /droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS
702
747
  ], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS
703
748
  /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\/ ]?([\w\.]*)/i,
704
749
  /(blackberry)\w*\/([\w\.]*)/i, // Blackberry
@@ -714,12 +759,19 @@
714
759
  /web0s;.+rt(tv)/i,
715
760
  /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i // WebOS
716
761
  ], [VERSION, [NAME, 'webOS']], [
762
+ /watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i // watchOS
763
+ ], [VERSION, [NAME, 'watchOS']], [
717
764
 
718
765
  // Google Chromecast
719
766
  /crkey\/([\d\.]+)/i // Google Chromecast
720
767
  ], [VERSION, [NAME, CHROME+'cast']], [
721
- /(cros) [\w]+ ([\w\.]+\w)/i // Chromium OS
722
- ], [[NAME, 'Chromium OS'], VERSION],[
768
+ /(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
769
+ ], [[NAME, CHROMIUM_OS], VERSION],[
770
+
771
+ // Smart TVs
772
+ /panasonic;(viera)/i, // Panasonic Viera
773
+ /(netrange)mmh/i, // Netrange
774
+ /(nettv)\/(\d+\.[\w\.]+)/i, // NetTV
723
775
 
724
776
  // Console
725
777
  /(nintendo|playstation) ([wids345portablevuch]+)/i, // Nintendo/Playstation
@@ -740,7 +792,7 @@
740
792
  ], [[NAME, 'Solaris'], VERSION], [
741
793
  /((?:open)?solaris)[-\/ ]?([\w\.]*)/i, // Solaris
742
794
  /(aix) ((\d)(?=\.|\)| )[\w\.])*/i, // AIX
743
- /\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux)/i, // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX
795
+ /\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX/SerenityOS
744
796
  /(unix) ?([\w\.]*)/i // UNIX
745
797
  ], [NAME, VERSION]
746
798
  ]
@@ -761,15 +813,22 @@
761
813
  return new UAParser(ua, extensions).getResult();
762
814
  }
763
815
 
764
- var _ua = ua || ((typeof window !== UNDEF_TYPE && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
816
+ var _navigator = (typeof window !== UNDEF_TYPE && window.navigator) ? window.navigator : undefined;
817
+ var _ua = ua || ((_navigator && _navigator.userAgent) ? _navigator.userAgent : EMPTY);
818
+ var _uach = (_navigator && _navigator.userAgentData) ? _navigator.userAgentData : undefined;
765
819
  var _rgxmap = extensions ? extend(regexes, extensions) : regexes;
820
+ var _isSelfNav = _navigator && _navigator.userAgent == _ua;
766
821
 
767
822
  this.getBrowser = function () {
768
823
  var _browser = {};
769
824
  _browser[NAME] = undefined;
770
825
  _browser[VERSION] = undefined;
771
826
  rgxMapper.call(_browser, _ua, _rgxmap.browser);
772
- _browser.major = majorize(_browser.version);
827
+ _browser[MAJOR] = majorize(_browser[VERSION]);
828
+ // Brave-specific detection
829
+ if (_isSelfNav && _navigator && _navigator.brave && typeof _navigator.brave.isBrave == FUNC_TYPE) {
830
+ _browser[NAME] = 'Brave';
831
+ }
773
832
  return _browser;
774
833
  };
775
834
  this.getCPU = function () {
@@ -784,6 +843,14 @@
784
843
  _device[MODEL] = undefined;
785
844
  _device[TYPE] = undefined;
786
845
  rgxMapper.call(_device, _ua, _rgxmap.device);
846
+ if (_isSelfNav && !_device[TYPE] && _uach && _uach.mobile) {
847
+ _device[TYPE] = MOBILE;
848
+ }
849
+ // iPadOS-specific detection: identified as Mac, but has some iOS-only properties
850
+ if (_isSelfNav && _device[MODEL] == 'Macintosh' && _navigator && typeof _navigator.standalone !== UNDEF_TYPE && _navigator.maxTouchPoints && _navigator.maxTouchPoints > 2) {
851
+ _device[MODEL] = 'iPad';
852
+ _device[TYPE] = TABLET;
853
+ }
787
854
  return _device;
788
855
  };
789
856
  this.getEngine = function () {
@@ -798,6 +865,11 @@
798
865
  _os[NAME] = undefined;
799
866
  _os[VERSION] = undefined;
800
867
  rgxMapper.call(_os, _ua, _rgxmap.os);
868
+ if (_isSelfNav && !_os[NAME] && _uach && _uach.platform != 'Unknown') {
869
+ _os[NAME] = _uach.platform
870
+ .replace(/chrome os/i, CHROMIUM_OS)
871
+ .replace(/macos/i, MAC_OS); // backward compatibility
872
+ }
801
873
  return _os;
802
874
  };
803
875
  this.getResult = function () {
@@ -1,12 +0,0 @@
1
- # These are supported funding model platforms
2
-
3
- github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4
- patreon: # Replace with a single Patreon username
5
- open_collective: ua-parser-js
6
- ko_fi: # Replace with a single Ko-fi username
7
- tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8
- community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9
- liberapay: # Replace with a single Liberapay username
10
- issuehunt: # Replace with a single IssueHunt username
11
- otechie: # Replace with a single Otechie username
12
- custom: ['https://www.paypal.me/faisalman/']
@@ -1,17 +0,0 @@
1
- name: ua-parser-js-run-test
2
-
3
- on: [push, pull_request]
4
-
5
- jobs:
6
- run-test:
7
- runs-on: ubuntu-latest
8
- strategy:
9
- matrix:
10
- arch: [amd64, ppc64le]
11
- steps:
12
- - uses: actions/checkout@v2
13
- - uses: actions/setup-node@v2
14
- - name: Run the test
15
- run: |
16
- npm install
17
- npm run test-ci
package/.jshintrc DELETED
@@ -1,3 +0,0 @@
1
- {
2
- "esversion": 3
3
- }
package/.travis.yml DELETED
@@ -1,18 +0,0 @@
1
- arch:
2
- - amd64
3
- - ppc64le
4
- language: node_js
5
- node_js:
6
- - stable
7
- - lts/*
8
-
9
- notifications:
10
- email: false
11
-
12
- cache:
13
- directories:
14
- - node_modules
15
-
16
- sudo: false
17
-
18
- script: npm run test-ci
package/bower.json DELETED
@@ -1,17 +0,0 @@
1
- {
2
- "name": "ua-parser-js",
3
- "version": "1.0.2",
4
- "authors": [
5
- "Faisal Salman <f@faisalman.com>"
6
- ],
7
- "private": false,
8
- "main": "src/ua-parser.js",
9
- "ignore": [
10
- "build",
11
- "node_modules",
12
- "bower_components",
13
- "test",
14
- "tests"
15
- ],
16
- "dependencies": {}
17
- }
package/changelog.md DELETED
@@ -1,3 +0,0 @@
1
- # UAParser.js Changelog
2
-
3
- ## Version 0.8.0
package/package.js DELETED
@@ -1,12 +0,0 @@
1
- Package.describe({
2
- name: 'faisalman:ua-parser-js',
3
- version: '1.0.2',
4
- summary: 'Lightweight JavaScript-based user-agent string parser',
5
- git: 'https://github.com/faisalman/ua-parser-js.git',
6
- documentation: 'readme.md'
7
- });
8
-
9
- Package.onUse(function (api) {
10
- api.addFiles("src/ua-parser.js");
11
- api.export("UAParser");
12
- });
package/security.md DELETED
@@ -1,5 +0,0 @@
1
- # Security Policy
2
-
3
- ## Reporting a Vulnerability
4
-
5
- Please report security issues to `f@faisalman.com`