ua-parser-js 2.0.0-rc.3 → 2.0.1

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