ua-parser-js 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  /////////////////////////////////////////////////////////////////////////////////
2
- /* UAParser.js v2.0.0
2
+ /* UAParser.js v2.0.2
3
3
  Copyright © 2012-2024 Faisal Salman <f@faisalman.com>
4
4
  AGPLv3 License *//*
5
5
  Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
@@ -19,20 +19,35 @@
19
19
  // Constants
20
20
  /////////////
21
21
 
22
- var LIBVERSION = '2.0.0',
22
+ var LIBVERSION = '2.0.2',
23
+ UA_MAX_LENGTH = 500,
24
+ USER_AGENT = 'user-agent',
23
25
  EMPTY = '',
24
26
  UNKNOWN = '?',
27
+
28
+ // typeof
25
29
  FUNC_TYPE = 'function',
26
30
  UNDEF_TYPE = 'undefined',
27
31
  OBJ_TYPE = 'object',
28
32
  STR_TYPE = 'string',
29
- MAJOR = 'major',
30
- MODEL = 'model',
33
+
34
+ // properties
35
+ UA_BROWSER = 'browser',
36
+ UA_CPU = 'cpu',
37
+ UA_DEVICE = 'device',
38
+ UA_ENGINE = 'engine',
39
+ UA_OS = 'os',
40
+ UA_RESULT = 'result',
41
+
31
42
  NAME = 'name',
32
43
  TYPE = 'type',
33
44
  VENDOR = 'vendor',
34
45
  VERSION = 'version',
35
46
  ARCHITECTURE= 'architecture',
47
+ MAJOR = 'major',
48
+ MODEL = 'model',
49
+
50
+ // device types
36
51
  CONSOLE = 'console',
37
52
  MOBILE = 'mobile',
38
53
  TABLET = 'tablet',
@@ -40,9 +55,11 @@
40
55
  WEARABLE = 'wearable',
41
56
  XR = 'xr',
42
57
  EMBEDDED = 'embedded',
58
+
59
+ // browser types
43
60
  INAPP = 'inapp',
44
- USER_AGENT = 'user-agent',
45
- UA_MAX_LENGTH = 500,
61
+
62
+ // client hints
46
63
  BRANDS = 'brands',
47
64
  FORMFACTORS = 'formFactors',
48
65
  FULLVERLIST = 'fullVersionList',
@@ -59,12 +76,8 @@
59
76
  CH_HEADER_PLATFORM = CH_HEADER + '-' + PLATFORM,
60
77
  CH_HEADER_PLATFORM_VER = CH_HEADER_PLATFORM + '-version',
61
78
  CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS],
62
- UA_BROWSER = 'browser',
63
- UA_CPU = 'cpu',
64
- UA_DEVICE = 'device',
65
- UA_ENGINE = 'engine',
66
- UA_OS = 'os',
67
- UA_RESULT = 'result',
79
+
80
+ // device vendors
68
81
  AMAZON = 'Amazon',
69
82
  APPLE = 'Apple',
70
83
  ASUS = 'ASUS',
@@ -76,20 +89,29 @@
76
89
  LG = 'LG',
77
90
  MICROSOFT = 'Microsoft',
78
91
  MOTOROLA = 'Motorola',
92
+ NVIDIA = 'Nvidia',
93
+ ONEPLUS = 'OnePlus',
94
+ OPPO = 'OPPO',
79
95
  SAMSUNG = 'Samsung',
80
96
  SHARP = 'Sharp',
81
97
  SONY = 'Sony',
82
98
  XIAOMI = 'Xiaomi',
83
99
  ZEBRA = 'Zebra',
84
- PREFIX_MOBILE = 'Mobile ',
85
- SUFFIX_BROWSER = ' Browser',
100
+
101
+ // browsers
86
102
  CHROME = 'Chrome',
103
+ CHROMIUM = 'Chromium',
87
104
  CHROMECAST = 'Chromecast',
88
105
  EDGE = 'Edge',
89
106
  FIREFOX = 'Firefox',
90
107
  OPERA = 'Opera',
91
108
  FACEBOOK = 'Facebook',
92
109
  SOGOU = 'Sogou',
110
+
111
+ PREFIX_MOBILE = 'Mobile ',
112
+ SUFFIX_BROWSER = ' Browser',
113
+
114
+ // os
93
115
  WINDOWS = 'Windows';
94
116
 
95
117
  var isWindow = typeof window !== UNDEF_TYPE,
@@ -399,6 +421,7 @@
399
421
  /(Klarna)\/([\w\.]+)/i, // Klarna Shopping Browser for iOS & Android
400
422
  /(kakao(?:talk|story))[\/ ]([\w\.]+)/i, // Kakao App
401
423
  /(naver)\(.*?(\d+\.[\w\.]+).*\)/i, // Naver InApp
424
+ /(daum)apps[\/ ]([\w\.]+)/i, // Daum App
402
425
  /safari (line)\/([\w\.]+)/i, // Line App for iOS
403
426
  /\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
404
427
  /(alipay)client\/([\w\.]+)/i, // Alipay
@@ -461,8 +484,8 @@
461
484
  /(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i, // Mozilla
462
485
 
463
486
  // Other
464
- /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
465
- // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser
487
+ /(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
488
+ // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser/Ladybird
466
489
  /\b(links) \(([\w\.]+)/i // Links
467
490
  ], [NAME, [VERSION, /_/g, '.']], [
468
491
 
@@ -472,30 +495,30 @@
472
495
 
473
496
  cpu : [[
474
497
 
475
- /\b(?:(amd|x|x86[-_]?|wow|win)64)\b/i // AMD64 (x64)
498
+ /\b((amd|x|x86[-_]?|wow|win)64)\b/i // AMD64 (x64)
476
499
  ], [[ARCHITECTURE, 'amd64']], [
477
500
 
478
501
  /(ia32(?=;))/i, // IA32 (quicktime)
479
- /((?:i[346]|x)86)[;\)]/i // IA32 (x86)
502
+ /\b((i[346]|x)86)(pc)?\b/i // IA32 (x86)
480
503
  ], [[ARCHITECTURE, 'ia32']], [
481
504
 
482
- /\b(aarch64|arm(v?8e?l?|_?64))\b/i // ARM64
505
+ /\b(aarch64|arm(v?[89]e?l?|_?64))\b/i // ARM64
483
506
  ], [[ARCHITECTURE, 'arm64']], [
484
507
 
485
- /\b(arm(?:v[67])?ht?n?[fl]p?)\b/i // ARMHF
508
+ /\b(arm(v[67])?ht?n?[fl]p?)\b/i // ARMHF
486
509
  ], [[ARCHITECTURE, 'armhf']], [
487
510
 
488
511
  // PocketPC mistakenly identified as PowerPC
489
- /windows (ce|mobile); ppc;/i
512
+ /( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i
490
513
  ], [[ARCHITECTURE, 'arm']], [
491
514
 
492
- /((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i // PowerPC
515
+ /((ppc|powerpc)(64)?)( mac|;|\))/i // PowerPC
493
516
  ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [
494
517
 
495
- /(sun4\w)[;\)]/i // SPARC
518
+ / sun4\w[;\)]/i // SPARC
496
519
  ], [[ARCHITECTURE, 'sparc']], [
497
520
 
498
- /((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i
521
+ /\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i
499
522
  // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
500
523
  ], [[ARCHITECTURE, lowerize]]
501
524
  ],
@@ -529,34 +552,38 @@
529
552
  ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [
530
553
 
531
554
  // Honor
532
- /(?:honor)([-\w ]+)[;\)]/i
555
+ /\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i
556
+ ], [MODEL, [VENDOR, HONOR], [TYPE, TABLET]], [
557
+ /honor([-\w ]+)[;\)]/i
533
558
  ], [MODEL, [VENDOR, HONOR], [TYPE, MOBILE]], [
534
559
 
535
560
  // Huawei
536
- /\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i
561
+ /\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i
537
562
  ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [
538
563
  /(?:huawei)([-\w ]+)[;\)]/i,
539
564
  /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i
540
565
  ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [
541
566
 
542
567
  // Xiaomi
568
+ /oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,
569
+ /\b((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i // Mi Pad tablets
570
+ ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [
571
+
543
572
  /\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i, // Xiaomi POCO
544
573
  /\b; (\w+) build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
545
574
  /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
546
575
  /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi
547
576
  /oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i, // Xiaomi Redmi 'numeric' models
548
- /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite|pro)?)(?: bui|\))/i // Xiaomi Mi
577
+ /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite|pro)?)(?: bui|\))/i, // Xiaomi Mi
578
+ / ([\w ]+) miui\/v?\d/i
549
579
  ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
550
- /oid[^\)]+; (2\d{4}(283|rpbf)[cgl])( bui|\))/i, // Redmi Pad
551
- /\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i // Mi Pad tablets
552
- ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [
553
580
 
554
581
  // OPPO
555
582
  /; (\w+) bui.+ oppo/i,
556
583
  /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i
557
- ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [
558
- /\b(opd2\d{3}a?) bui/i
559
- ], [MODEL, [VENDOR, 'OPPO'], [TYPE, TABLET]], [
584
+ ], [MODEL, [VENDOR, OPPO], [TYPE, MOBILE]], [
585
+ /\b(opd2(\d{3}a?))(?: bui|\))/i
586
+ ], [MODEL, [VENDOR, strMapper, { 'OnePlus' : ['304', '403', '203'], '*' : OPPO }], [TYPE, TABLET]], [
560
587
 
561
588
  // Vivo
562
589
  /vivo (\w+)(?: bui|\))/i,
@@ -570,7 +597,7 @@
570
597
  // Motorola
571
598
  /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
572
599
  /\bmot(?:orola)?[- ](\w*)/i,
573
- /((?:moto[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i
600
+ /((?:moto(?! 360)[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i
574
601
  ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [
575
602
  /\b(mz60\d|xoom[2 ]{0,2}) build\//i
576
603
  ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [
@@ -579,22 +606,24 @@
579
606
  /((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
580
607
  ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [
581
608
  /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
582
- /\blg[-e;\/ ]+((?!browser|netcast|android tv)\w+)/i,
609
+ /\blg[-e;\/ ]+((?!browser|netcast|android tv|watch)\w+)/i,
583
610
  /\blg-?([\d\w]+) bui/i
584
611
  ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [
585
612
 
586
613
  // Lenovo
587
- /(ideatab[-\w ]+)/i,
588
- /lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i
614
+ /(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,
615
+ /lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i
589
616
  ], [MODEL, [VENDOR, LENOVO], [TYPE, TABLET]], [
590
617
 
591
618
  // Nokia
592
- /(?:maemo|nokia).*(n900|lumia \d+)/i,
593
- /nokia[-_ ]?([-\w\.]*)/i
594
- ], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [
619
+ /(nokia) (t[12][01])/i
620
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
621
+ /(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,
622
+ /nokia[-_ ]?(([-\w\. ]*))/i
623
+ ], [[MODEL, /_/g, ' '], [TYPE, MOBILE], [VENDOR, 'Nokia']], [
595
624
 
596
625
  // Google
597
- /(pixel c)\b/i // Google Pixel C
626
+ /(pixel (c|tablet))\b/i // Google Pixel C/Tablet
598
627
  ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [
599
628
  /droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i // Google Pixel
600
629
  ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [
@@ -609,7 +638,7 @@
609
638
  // OnePlus
610
639
  / (kb2005|in20[12]5|be20[12][59])\b/i,
611
640
  /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
612
- ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
641
+ ], [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]], [
613
642
 
614
643
  // Amazon
615
644
  /(alexa)webm/i,
@@ -685,18 +714,19 @@
685
714
  ], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [
686
715
 
687
716
  // MIXED
688
- /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron|infinix|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
717
+ /(imo) (tab \w+)/i, // IMO
718
+ /(infinix) (x1101b?)/i // Infinix XPad
719
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
720
+
721
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|infinix|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
689
722
  // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Infinix/Tecno/Micromax/Advan
690
- /; (imo) ((?!tab)[\w ]+?)(?: bui|\))/i, // IMO
723
+ /; (hmd|imo) ([\w ]+?)(?: bui|\))/i, // HMD/IMO
691
724
  /(hp) ([\w ]+\w)/i, // HP iPAQ
692
- /(asus)-?(\w+)/i, // Asus
693
725
  /(microsoft); (lumia[\w ]+)/i, // Microsoft Lumia
694
- /(lenovo)[-_ ]?([-\w]+)/i, // Lenovo
695
- /(jolla)/i, // Jolla
726
+ /(lenovo)[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i, // Lenovo
696
727
  /(oppo) ?([\w ]+) bui/i // OPPO
697
728
  ], [VENDOR, MODEL, [TYPE, MOBILE]], [
698
729
 
699
- /(imo) (tab \w+)/i, // IMO
700
730
  /(kobo)\s(ereader|touch)/i, // Kobo
701
731
  /(archos) (gamepad2?)/i, // Archos
702
732
  /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad
@@ -707,8 +737,8 @@
707
737
  ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [
708
738
  /droid [\d\.]+; (fp\du?)(?: b|\))/i // Fairphone
709
739
  ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [
710
- /(shield[\w ]+) b/i // Nvidia Shield Tablets
711
- ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [
740
+ /((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i // Nvidia Tablets
741
+ ], [MODEL, [VENDOR, NVIDIA], [TYPE, TABLET]], [
712
742
  /(sprint) (\w+)/i // Sprint Phones
713
743
  ], [VENDOR, MODEL, [TYPE, MOBILE]], [
714
744
  /(kin\.[onetw]{3})/i // Microsoft Kin
@@ -740,19 +770,24 @@
740
770
  ], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
741
771
  /droid.+aft(\w+)( bui|\))/i // Fire TV
742
772
  ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
773
+ /(shield \w+ tv)/i // Nvidia Shield TV
774
+ ], [MODEL, [VENDOR, NVIDIA], [TYPE, SMARTTV]], [
743
775
  /\(dtv[\);].+(aquos)/i,
744
776
  /(aquos-tv[\w ]+)\)/i // Sharp
745
777
  ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[
746
778
  /(bravia[\w ]+)( bui|\))/i // Sony
747
779
  ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [
748
- /(mitv-\w{5}) bui/i // Xiaomi
780
+ /(mi(tv|box)-?\w+) bui/i // Xiaomi
749
781
  ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [
750
782
  /Hbbtv.*(technisat) (.*);/i // TechniSAT
751
783
  ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
752
784
  /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, // Roku
753
785
  /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices
754
786
  ], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [
755
- /\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i // SmartTV from Unidentified Vendors
787
+ // SmartTV from Unidentified Vendors
788
+ /droid.+; ([\w- ]+) (?:android tv|smart[- ]?tv)/i
789
+ ], [MODEL, [TYPE, SMARTTV]], [
790
+ /\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i
756
791
  ], [[TYPE, SMARTTV]], [
757
792
 
758
793
  ///////////////////
@@ -762,8 +797,8 @@
762
797
  /(ouya)/i, // Ouya
763
798
  /(nintendo) (\w+)/i // Nintendo
764
799
  ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
765
- /droid.+; (shield) bui/i // Nvidia
766
- ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
800
+ /droid.+; (shield)( bui|\))/i // Nvidia Portable
801
+ ], [MODEL, [VENDOR, NVIDIA], [TYPE, CONSOLE]], [
767
802
  /(playstation \w+)/i // Playstation
768
803
  ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [
769
804
  /\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox
@@ -773,12 +808,23 @@
773
808
  // WEARABLES
774
809
  ///////////////////
775
810
 
776
- /\b(sm-[lr]\d\d[05][fnuw]?s?)\b/i // Samsung Galaxy Watch
811
+ /\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i // Samsung Galaxy Watch
777
812
  ], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [
778
- /((pebble))app/i // Pebble
813
+ /((pebble))app/i, // Pebble
814
+ /(asus|google|lg|oppo) ((pixel |zen)?watch[\w ]*)( bui|\))/i // Asus ZenWatch / LG Watch / Pixel Watch
779
815
  ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
816
+ /(ow(?:19|20)?we?[1-3]{1,3})/i // Oppo Watch
817
+ ], [MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]], [
780
818
  /(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch
781
819
  ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [
820
+ /(opwwe\d{3})/i // OnePlus Watch
821
+ ], [MODEL, [VENDOR, ONEPLUS], [TYPE, WEARABLE]], [
822
+ /(moto 360)/i // Motorola 360
823
+ ], [MODEL, [VENDOR, MOTOROLA], [TYPE, WEARABLE]], [
824
+ /(smartwatch 3)/i // Sony SmartWatch
825
+ ], [MODEL, [VENDOR, SONY], [TYPE, WEARABLE]], [
826
+ /(g watch r)/i // LG G Watch R
827
+ ], [MODEL, [VENDOR, LG], [TYPE, WEARABLE]], [
782
828
  /droid.+; (wt63?0{2,3})\)/i
783
829
  ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [
784
830
 
@@ -801,20 +847,22 @@
801
847
  ], [VENDOR, [TYPE, EMBEDDED]], [
802
848
  /(aeobc)\b/i // Echo Dot
803
849
  ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [
850
+ /(homepod).+mac os/i // Apple HomePod
851
+ ], [MODEL, [VENDOR, APPLE], [TYPE, EMBEDDED]], [
852
+ /windows iot/i
853
+ ], [[TYPE, EMBEDDED]], [
804
854
 
805
855
  ////////////////////
806
856
  // MIXED (GENERIC)
807
857
  ///////////////////
808
858
 
809
- /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors
810
- ], [MODEL, [TYPE, MOBILE]], [
811
- /droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors
812
- ], [MODEL, [TYPE, TABLET]], [
859
+ /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+?(mobile|vr|\d) safari/i
860
+ ], [MODEL, [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]], [
813
861
  /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet
814
862
  ], [[TYPE, TABLET]], [
815
863
  /(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile
816
864
  ], [[TYPE, MOBILE]], [
817
- /(android[-\w\. ]{0,9});.+buil/i // Generic Android Device
865
+ /droid .+?; ([\w\. -]+)( bui|\))/i // Generic Android Device
818
866
  ], [MODEL, [VENDOR, 'Generic']]
819
867
  ],
820
868
 
@@ -834,8 +882,11 @@
834
882
  /ekioh(flow)\/([\w\.]+)/i, // Flow
835
883
  /(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links
836
884
  /(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab
837
- /\b(libweb)/i
885
+
886
+ /\b(libweb)/i // LibWeb
838
887
  ], [NAME, VERSION], [
888
+ /ladybird\//i
889
+ ], [[NAME, 'LibWeb']], [
839
890
 
840
891
  /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
841
892
  ], [VERSION, NAME]
@@ -846,15 +897,15 @@
846
897
  // Windows
847
898
  /microsoft (windows) (vista|xp)/i // Windows (iTunes)
848
899
  ], [NAME, VERSION], [
849
- /(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i // Windows Phone
900
+ /(windows (?:phone(?: os)?|mobile|iot))[\/ ]?([\d\.\w ]*)/i // Windows Phone
850
901
  ], [NAME, [VERSION, strMapper, windowsVersionMap]], [
851
- /windows nt 6\.2; (arm)/i, // Windows RT
852
- /windows[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i,
902
+ /windows nt 6\.2; (arm)/i, // Windows RT
903
+ /windows[\/ ]([ntce\d\. ]+\w)(?!.+xbox)/i,
853
904
  /(?:win(?=3|9|n)|win 9x )([nt\d\.]+)/i
854
905
  ], [[VERSION, strMapper, windowsVersionMap], [NAME, WINDOWS]], [
855
906
 
856
907
  // iOS/macOS
857
- /ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS
908
+ /[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS
858
909
  /(?:ios;fbsv\/|iphone.+ios[\/ ])([\d\.]+)/i,
859
910
  /cfnetwork\/.+darwin/i
860
911
  ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
@@ -876,15 +927,15 @@
876
927
 
877
928
  // Mobile OSes
878
929
  /droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS
879
- ], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS/OpenHarmony
880
- /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish|openharmony)[-\/ ]?([\w\.]*)/i,
881
- /(blackberry)\w*\/([\w\.]*)/i, // Blackberry
882
- /(tizen|kaios)[\/ ]([\w\.]+)/i, // Tizen/KaiOS
883
- /\((series40);/i // Series 40
930
+ ], [VERSION, NAME], [
931
+ /(ubuntu) ([\w\.]+) like android/i // Ubuntu Touch
932
+ ], [[NAME, /(.+)/, '$1 Touch'], VERSION], [
933
+ // Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen
934
+ /(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen|webos)\w*[-\/; ]?([\d\.]*)/i
884
935
  ], [NAME, VERSION], [
885
936
  /\(bb(10);/i // BlackBerry 10
886
937
  ], [VERSION, [NAME, BLACKBERRY]], [
887
- /(?:symbian ?os|symbos|s60(?=;)|series60)[-\/ ]?([\w\.]*)/i // Symbian
938
+ /(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i // Symbian
888
939
  ], [VERSION, [NAME, 'Symbian']], [
889
940
  /mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i // Firefox OS
890
941
  ], [VERSION, [NAME, FIREFOX+' OS']], [
@@ -914,7 +965,7 @@
914
965
  /(mageia|vectorlinux)[; ]/i, // Mageia/VectorLinux
915
966
  /([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,
916
967
  // Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire
917
- /(hurd|linux) ?([\w\.]*)/i, // Hurd/Linux
968
+ /(hurd|linux)(?: arm\w*| x86\w*| ?)([\w\.]*)/i, // Hurd/Linux
918
969
  /(gnu) ?([\w\.]*)/i, // GNU
919
970
  /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
920
971
  /(haiku) (\w+)/i // Haiku
@@ -1151,17 +1202,27 @@
1151
1202
 
1152
1203
  switch (this.itemType) {
1153
1204
  case UA_BROWSER:
1205
+ case UA_ENGINE:
1154
1206
  var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;
1155
1207
  if (brands) {
1156
1208
  for (var i in brands) {
1157
- var brandName = strip(/(Google|Microsoft) /, brands[i].brand || brands[i]),
1209
+ var brandName = brands[i].brand || brands[i],
1158
1210
  brandVersion = brands[i].version;
1159
- if (!/not.a.brand/i.test(brandName) && (!prevName || (/chrom/i.test(prevName) && !/chromi/i.test(brandName)))) {
1211
+ if (this.itemType == UA_BROWSER && !/not.a.brand/i.test(brandName) && (!prevName || (/chrom/i.test(prevName) && brandName != CHROMIUM))) {
1212
+ brandName = strMapper(brandName, {
1213
+ 'Chrome' : 'Google Chrome',
1214
+ 'Edge' : 'Microsoft Edge',
1215
+ 'Chrome WebView' : 'Android WebView',
1216
+ 'Chrome Headless' : 'HeadlessChrome'
1217
+ });
1160
1218
  this.set(NAME, brandName)
1161
1219
  .set(VERSION, brandVersion)
1162
1220
  .set(MAJOR, majorize(brandVersion));
1163
1221
  prevName = brandName;
1164
1222
  }
1223
+ if (this.itemType == UA_ENGINE && brandName == CHROMIUM) {
1224
+ this.set(VERSION, brandVersion);
1225
+ }
1165
1226
  }
1166
1227
  }
1167
1228
  break;
@@ -1178,11 +1239,16 @@
1178
1239
  }
1179
1240
  if (uaCH[MODEL]) {
1180
1241
  this.set(MODEL, uaCH[MODEL]);
1181
- }
1182
- // Xbox-Specific Detection
1183
- if (uaCH[MODEL] == 'Xbox') {
1184
- this.set(TYPE, CONSOLE)
1185
- .set(VENDOR, MICROSOFT);
1242
+ if (!this.get(TYPE) || !this.get(VENDOR)) {
1243
+ var reParse = {};
1244
+ rgxMapper.call(reParse, 'droid 9; ' + uaCH[MODEL] + ')', rgxMap);
1245
+ if (!this.get(TYPE) && !!reParse.type) {
1246
+ this.set(TYPE, reParse.type);
1247
+ }
1248
+ if (!this.get(VENDOR) && !!reParse.vendor) {
1249
+ this.set(VENDOR, reParse.vendor);
1250
+ }
1251
+ }
1186
1252
  }
1187
1253
  if (uaCH[FORMFACTORS]) {
1188
1254
  var ff;