ua-parser-js 1.0.2 → 1.0.35

Sign up to get free protection for your applications and to get access to all the features.
package/src/ua-parser.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /////////////////////////////////////////////////////////////////////////////////
2
- /* UAParser.js v1.0.2
2
+ /* UAParser.js v1.0.35
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.35',
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 = 350;
41
41
 
42
42
  var AMAZON = 'Amazon',
43
43
  APPLE = 'Apple',
@@ -54,10 +54,14 @@
54
54
  MOTOROLA = 'Motorola',
55
55
  OPERA = 'Opera',
56
56
  SAMSUNG = 'Samsung',
57
+ SHARP = 'Sharp',
57
58
  SONY = 'Sony',
59
+ VIERA = 'Viera',
58
60
  XIAOMI = 'Xiaomi',
59
61
  ZEBRA = 'Zebra',
60
- FACEBOOK = 'Facebook';
62
+ FACEBOOK = 'Facebook',
63
+ CHROMIUM_OS = 'Chromium OS',
64
+ MAC_OS = 'Mac OS';
61
65
 
62
66
  ///////////
63
67
  // Helper
@@ -92,7 +96,7 @@
92
96
  },
93
97
  trim = function (str, len) {
94
98
  if (typeof(str) === STR_TYPE) {
95
- str = str.replace(/^\s\s*/, EMPTY).replace(/\s\s*$/, EMPTY);
99
+ str = str.replace(/^\s\s*/, EMPTY);
96
100
  return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
97
101
  }
98
102
  };
@@ -115,6 +119,7 @@
115
119
  // try matching uastring with regexes
116
120
  while (j < regex.length && !matches) {
117
121
 
122
+ if (!regex[j]) { break; }
118
123
  matches = regex[j++].exec(ua);
119
124
 
120
125
  if (!!matches) {
@@ -231,13 +236,15 @@
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
246
+ /microm.+\bqbcore\/([\w\.]+)/i, // WeChat Desktop for Windows Built-in Browser
247
+ /\bqbcore\/([\w\.]+).+microm/i
241
248
  ], [VERSION, [NAME, 'WeChat(Win) Desktop']], [
242
249
  /micromessenger\/([\w\.]+)/i // WeChat
243
250
  ], [VERSION, [NAME, 'WeChat']], [
@@ -245,7 +252,7 @@
245
252
  ], [VERSION, [NAME, 'Konqueror']], [
246
253
  /trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i // IE11
247
254
  ], [VERSION, [NAME, 'IE']], [
248
- /yabrowser\/([\w\.]+)/i // Yandex
255
+ /ya(?:search)?browser\/([\w\.]+)/i // Yandex
249
256
  ], [VERSION, [NAME, 'Yandex']], [
250
257
  /(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
251
258
  ], [[NAME, /(.+)/, '$1 Secure '+BROWSER], VERSION], [
@@ -265,8 +272,8 @@
265
272
  ], [VERSION, [NAME, FIREFOX]], [
266
273
  /\bqihu|(qi?ho?o?|360)browser/i // 360
267
274
  ], [[NAME, '360 '+BROWSER]], [
268
- /(oculus|samsung|sailfish)browser\/([\w\.]+)/i
269
- ], [[NAME, /(.+)/, '$1 '+BROWSER], VERSION], [ // Oculus/Samsung/Sailfish Browser
275
+ /(oculus|samsung|sailfish|huawei)browser\/([\w\.]+)/i
276
+ ], [[NAME, /(.+)/, '$1 '+BROWSER], VERSION], [ // Oculus/Samsung/Sailfish/Huawei Browser
270
277
  /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
271
278
  ], [[NAME, /_/g, ' '], VERSION], [
272
279
  /(electron)\/([\w\.]+) safari/i, // Electron-based App
@@ -274,18 +281,23 @@
274
281
  /m?(qqbrowser|baiduboxapp|2345Explorer)[\/ ]?([\w\.]+)/i // QQBrowser/Baidu App/2345 Browser
275
282
  ], [NAME, VERSION], [
276
283
  /(metasr)[\/ ]?([\w\.]+)/i, // SouGouBrowser
277
- /(lbbrowser)/i // LieBao Browser
284
+ /(lbbrowser)/i, // LieBao Browser
285
+ /\[(linkedin)app\]/i // LinkedIn App for iOS & Android
278
286
  ], [NAME], [
279
287
 
280
288
  // WebView
281
289
  /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i // Facebook App for iOS & Android
282
290
  ], [[NAME, FACEBOOK], VERSION], [
291
+ /(kakao(?:talk|story))[\/ ]([\w\.]+)/i, // Kakao App
292
+ /(naver)\(.*?(\d+\.[\w\.]+).*\)/i, // Naver InApp
283
293
  /safari (line)\/([\w\.]+)/i, // Line App for iOS
284
294
  /\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
285
295
  /(chromium|instagram)[\/ ]([-\w\.]+)/i // Chromium/Instagram
286
296
  ], [NAME, VERSION], [
287
297
  /\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
288
298
  ], [VERSION, [NAME, 'GSA']], [
299
+ /musical_ly(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
300
+ ], [VERSION, [NAME, 'TikTok']], [
289
301
 
290
302
  /headlesschrome(?:\/([\w\.]+)| )/i // Chrome Headless
291
303
  ], [VERSION, [NAME, CHROME+' Headless']], [
@@ -299,9 +311,9 @@
299
311
  /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
300
312
  ], [NAME, VERSION], [
301
313
 
302
- /version\/([\w\.]+) .*mobile\/\w+ (safari)/i // Mobile Safari
314
+ /version\/([\w\.\,]+) .*mobile\/\w+ (safari)/i // Mobile Safari
303
315
  ], [VERSION, [NAME, 'Mobile Safari']], [
304
- /version\/([\w\.]+) .*(mobile ?safari|safari)/i // Safari & Safari Mobile
316
+ /version\/([\w(\.|\,)]+) .*(mobile ?safari|safari)/i // Safari & Safari Mobile
305
317
  ], [VERSION, NAME], [
306
318
  /webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
307
319
  ], [NAME, [VERSION, strMapper, oldSafariMap]], [
@@ -326,8 +338,12 @@
326
338
  // Other
327
339
  /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
328
340
  // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir/Obigo/Mosaic/Go/ICE/UP.Browser
329
- /(links) \(([\w\.]+)/i // Links
330
- ], [NAME, VERSION]
341
+ /(links) \(([\w\.]+)/i, // Links
342
+ /panasonic;(viera)/i // Panasonic Viera
343
+ ], [NAME, VERSION], [
344
+
345
+ /(cobalt)\/([\w\.]+)/i // Cobalt
346
+ ], [NAME, [VERSION, /master.|lts./, ""]]
331
347
  ],
332
348
 
333
349
  cpu : [[
@@ -366,30 +382,35 @@
366
382
 
367
383
  //////////////////////////
368
384
  // MOBILES & TABLETS
369
- // Ordered by popularity
370
385
  /////////////////////////
371
386
 
372
387
  // 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
388
+ /\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
389
  ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [
375
- /\b((?:s[cgp]h|gt|sm)-\w+|galaxy nexus)/i,
390
+ /\b((?:s[cgp]h|gt|sm)-\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
376
391
  /samsung[- ]([-\w]+)/i,
377
392
  /sec-(sgh\w+)/i
378
393
  ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [
379
394
 
380
395
  // Apple
381
- /\((ip(?:hone|od)[\w ]*);/i // iPod/iPhone
396
+ /(?:\/|\()(ip(?:hone|od)[\w, ]*)(?:\/|;)/i // iPod/iPhone
382
397
  ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [
383
398
  /\((ipad);[-\w\),; ]+apple/i, // iPad
384
399
  /applecoremedia\/[\w\.]+ \((ipad)/i,
385
400
  /\b(ipad)\d\d?,\d\d?[;\]].+ios/i
386
401
  ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [
402
+ /(macintosh);/i
403
+ ], [MODEL, [VENDOR, APPLE]], [
404
+
405
+ // Sharp
406
+ /\b(sh-?[altvz]?\d\d[a-ekm]?)/i
407
+ ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [
387
408
 
388
409
  // Huawei
389
410
  /\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i
390
411
  ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [
391
412
  /(?:huawei|honor)([-\w ]+)[;\)]/i,
392
- /\b(nexus 6p|\w{2,4}-[atu]?[ln][01259x][012359][an]?)\b(?!.+d\/s)/i
413
+ /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i
393
414
  ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [
394
415
 
395
416
  // Xiaomi
@@ -397,7 +418,7 @@
397
418
  /\b; (\w+) build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
398
419
  /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
399
420
  /\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
421
+ /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i // Xiaomi Mi
401
422
  ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
402
423
  /\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i // Mi Pad tablets
403
424
  ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [
@@ -449,7 +470,7 @@
449
470
  ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [
450
471
 
451
472
  // Sony
452
- /droid.+ ([c-g]\d{4}|so[-gl]\w+|xq-a\w[4-7][12])(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i
473
+ /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
474
  ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [
454
475
  /sony tablet [ps]/i,
455
476
  /\b(?:sony)?sgp\w+(?: bui|\))/i
@@ -462,7 +483,7 @@
462
483
 
463
484
  // Amazon
464
485
  /(alexa)webm/i,
465
- /(kf[a-z]{2}wi)( bui|\))/i, // Kindle Fire without Silk
486
+ /(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\))/i, // Kindle Fire without Silk / Echo Show
466
487
  /(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD
467
488
  ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [
468
489
  /((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i // Fire Phone
@@ -488,7 +509,7 @@
488
509
 
489
510
  // ZTE
490
511
  /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
491
- /(alcatel|geeksphone|nexian|panasonic|sony)[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
512
+ /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
492
513
  ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
493
514
 
494
515
  // Acer
@@ -500,10 +521,6 @@
500
521
  /\bmz-([-\w]{2,})/i
501
522
  ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
502
523
 
503
- // Sharp
504
- /\b(sh-?[altvz]?\d\d[a-ekm]?)/i
505
- ], [MODEL, [VENDOR, 'Sharp'], [TYPE, MOBILE]], [
506
-
507
524
  // MIXED
508
525
  /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[-_ ]?([-\w]*)/i,
509
526
  // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
@@ -515,6 +532,7 @@
515
532
  /(oppo) ?([\w ]+) bui/i // OPPO
516
533
  ], [VENDOR, MODEL, [TYPE, MOBILE]], [
517
534
 
535
+ /(kobo)\s(ereader|touch)/i, // Kobo
518
536
  /(archos) (gamepad2?)/i, // Archos
519
537
  /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad
520
538
  /(kindle)\/([\w\.]+)/i, // Kindle
@@ -584,20 +602,6 @@
584
602
  /droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i
585
603
  ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [
586
604
 
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
605
  ///////////////////
602
606
  // SMARTTVS
603
607
  ///////////////////
@@ -614,25 +618,48 @@
614
618
  ], [[MODEL, CHROME+'cast'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
615
619
  /droid.+aft(\w)( bui|\))/i // Fire TV
616
620
  ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
617
- /\(dtv[\);].+(aquos)/i // Sharp
618
- ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
621
+ /\(dtv[\);].+(aquos)/i,
622
+ /(aquos-tv[\w ]+)\)/i // Sharp
623
+ ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[
624
+ /(bravia[\w ]+)( bui|\))/i // Sony
625
+ ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [
626
+ /(mitv-\w{5}) bui/i // Xiaomi
627
+ ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [
628
+ /Hbbtv.*(technisat) (.*);/i // TechniSAT
629
+ ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
619
630
  /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, // Roku
620
- /hbbtv\/\d+\.\d+\.\d+ +\([\w ]*; *(\w[^;]*);([^;]*)/i // HbbTV devices
631
+ /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices
621
632
  ], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [
622
633
  /\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i // SmartTV from Unidentified Vendors
623
634
  ], [[TYPE, SMARTTV]], [
624
635
 
636
+ ///////////////////
637
+ // CONSOLES
638
+ ///////////////////
639
+
640
+ /(ouya)/i, // Ouya
641
+ /(nintendo) ([wids3utch]+)/i // Nintendo
642
+ ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
643
+ /droid.+; (shield) bui/i // Nvidia
644
+ ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
645
+ /(playstation [345portablevi]+)/i // Playstation
646
+ ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [
647
+ /\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox
648
+ ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [
649
+
625
650
  ///////////////////
626
651
  // WEARABLES
627
652
  ///////////////////
628
653
 
629
654
  /((pebble))app/i // Pebble
630
655
  ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
656
+ /(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch
657
+ ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [
631
658
  /droid.+; (glass) \d/i // Google Glass
632
659
  ], [MODEL, [VENDOR, GOOGLE], [TYPE, WEARABLE]], [
633
660
  /droid.+; (wt63?0{2,3})\)/i
634
661
  ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [
635
- /(quest( 2)?)/i // Oculus Quest
662
+ /(quest( 2| pro)?)/i // Oculus Quest
636
663
  ], [MODEL, [VENDOR, FACEBOOK], [TYPE, WEARABLE]], [
637
664
 
638
665
  ///////////////////
@@ -641,6 +668,8 @@
641
668
 
642
669
  /(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i // Tesla
643
670
  ], [VENDOR, [TYPE, EMBEDDED]], [
671
+ /(aeobc)\b/i // Echo Dot
672
+ ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [
644
673
 
645
674
  ////////////////////
646
675
  // MIXED (GENERIC)
@@ -652,7 +681,7 @@
652
681
  ], [MODEL, [TYPE, TABLET]], [
653
682
  /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet
654
683
  ], [[TYPE, TABLET]], [
655
- /(phone|mobile(?:[;\/]| safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile
684
+ /(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile
656
685
  ], [[TYPE, MOBILE]], [
657
686
  /(android[-\w\. ]{0,9});.+buil/i // Generic Android Device
658
687
  ], [MODEL, [VENDOR, 'Generic']]
@@ -670,7 +699,8 @@
670
699
  /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
671
700
  /ekioh(flow)\/([\w\.]+)/i, // Flow
672
701
  /(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links
673
- /(icab)[\/ ]([23]\.[\d\.]+)/i // iCab
702
+ /(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab
703
+ /\b(libweb)/i
674
704
  ], [NAME, VERSION], [
675
705
 
676
706
  /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
@@ -691,14 +721,15 @@
691
721
 
692
722
  // iOS/macOS
693
723
  /ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS
724
+ /ios;fbsv\/([\d\.]+)/i,
694
725
  /cfnetwork\/.+darwin/i
695
726
  ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
696
727
  /(mac os x) ?([\w\. ]*)/i,
697
728
  /(macintosh|mac_powerpc\b)(?!.+haiku)/i // Mac OS
698
- ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
729
+ ], [[NAME, MAC_OS], [VERSION, /_/g, '.']], [
699
730
 
700
731
  // Mobile OSes
701
- /droid ([\w\.]+)\b.+(android[- ]x86)/i // Android-x86
732
+ /droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS
702
733
  ], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS
703
734
  /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\/ ]?([\w\.]*)/i,
704
735
  /(blackberry)\w*\/([\w\.]*)/i, // Blackberry
@@ -714,12 +745,19 @@
714
745
  /web0s;.+rt(tv)/i,
715
746
  /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i // WebOS
716
747
  ], [VERSION, [NAME, 'webOS']], [
748
+ /watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i // watchOS
749
+ ], [VERSION, [NAME, 'watchOS']], [
717
750
 
718
751
  // Google Chromecast
719
752
  /crkey\/([\d\.]+)/i // Google Chromecast
720
753
  ], [VERSION, [NAME, CHROME+'cast']], [
721
- /(cros) [\w]+ ([\w\.]+\w)/i // Chromium OS
722
- ], [[NAME, 'Chromium OS'], VERSION],[
754
+ /(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
755
+ ], [[NAME, CHROMIUM_OS], VERSION],[
756
+
757
+ // Smart TVs
758
+ /panasonic;(viera)/i, // Panasonic Viera
759
+ /(netrange)mmh/i, // Netrange
760
+ /(nettv)\/(\d+\.[\w\.]+)/i, // NetTV
723
761
 
724
762
  // Console
725
763
  /(nintendo|playstation) ([wids345portablevuch]+)/i, // Nintendo/Playstation
@@ -740,7 +778,7 @@
740
778
  ], [[NAME, 'Solaris'], VERSION], [
741
779
  /((?:open)?solaris)[-\/ ]?([\w\.]*)/i, // Solaris
742
780
  /(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
781
+ /\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX/SerenityOS
744
782
  /(unix) ?([\w\.]*)/i // UNIX
745
783
  ], [NAME, VERSION]
746
784
  ]
@@ -761,15 +799,22 @@
761
799
  return new UAParser(ua, extensions).getResult();
762
800
  }
763
801
 
764
- var _ua = ua || ((typeof window !== UNDEF_TYPE && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
802
+ var _navigator = (typeof window !== UNDEF_TYPE && window.navigator) ? window.navigator : undefined;
803
+ var _ua = ua || ((_navigator && _navigator.userAgent) ? _navigator.userAgent : EMPTY);
804
+ var _uach = (_navigator && _navigator.userAgentData) ? _navigator.userAgentData : undefined;
765
805
  var _rgxmap = extensions ? extend(regexes, extensions) : regexes;
806
+ var _isSelfNav = _navigator && _navigator.userAgent == _ua;
766
807
 
767
808
  this.getBrowser = function () {
768
809
  var _browser = {};
769
810
  _browser[NAME] = undefined;
770
811
  _browser[VERSION] = undefined;
771
812
  rgxMapper.call(_browser, _ua, _rgxmap.browser);
772
- _browser.major = majorize(_browser.version);
813
+ _browser[MAJOR] = majorize(_browser[VERSION]);
814
+ // Brave-specific detection
815
+ if (_isSelfNav && _navigator && _navigator.brave && typeof _navigator.brave.isBrave == FUNC_TYPE) {
816
+ _browser[NAME] = 'Brave';
817
+ }
773
818
  return _browser;
774
819
  };
775
820
  this.getCPU = function () {
@@ -784,6 +829,14 @@
784
829
  _device[MODEL] = undefined;
785
830
  _device[TYPE] = undefined;
786
831
  rgxMapper.call(_device, _ua, _rgxmap.device);
832
+ if (_isSelfNav && !_device[TYPE] && _uach && _uach.mobile) {
833
+ _device[TYPE] = MOBILE;
834
+ }
835
+ // iPadOS-specific detection: identified as Mac, but has some iOS-only properties
836
+ if (_isSelfNav && _device[MODEL] == 'Macintosh' && _navigator && typeof _navigator.standalone !== UNDEF_TYPE && _navigator.maxTouchPoints && _navigator.maxTouchPoints > 2) {
837
+ _device[MODEL] = 'iPad';
838
+ _device[TYPE] = TABLET;
839
+ }
787
840
  return _device;
788
841
  };
789
842
  this.getEngine = function () {
@@ -798,6 +851,11 @@
798
851
  _os[NAME] = undefined;
799
852
  _os[VERSION] = undefined;
800
853
  rgxMapper.call(_os, _ua, _rgxmap.os);
854
+ if (_isSelfNav && !_os[NAME] && _uach && _uach.platform != 'Unknown') {
855
+ _os[NAME] = _uach.platform
856
+ .replace(/chrome os/i, CHROMIUM_OS)
857
+ .replace(/macos/i, MAC_OS); // backward compatibility
858
+ }
801
859
  return _os;
802
860
  };
803
861
  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`