ua-parser-js 1.0.2 → 1.0.35

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.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`