From 3843578de9c3b909911d961a383efd39adced34d Mon Sep 17 00:00:00 2001 From: Faisal Salman Date: Thu, 1 Apr 2021 16:22:51 +0700 Subject: [PATCH] Small refactor --- src/ua-parser.js | 80 +++++++++++++++++-------------------------- test/device-test.json | 11 +++++- 2 files changed, 41 insertions(+), 50 deletions(-) diff --git a/src/ua-parser.js b/src/ua-parser.js index bf75300..ed14fe9 100755 --- a/src/ua-parser.js +++ b/src/ua-parser.js @@ -223,8 +223,7 @@ // Presto based /(opera\smini)\/([\w\.-]+)/i, // Opera Mini /(opera\s[mobiletab]{3,6})\b.+version\/([\w\.-]+)/i, // Opera Mobi/Tablet - /(opera).+version\/([\w\.]+)/i, // Opera > 9.80 - /(opera)[\/\s]+([\w\.]+)/i // Opera < 9.80 + /(opera)(?:.+version\/|[\/\s]+)([\w\.]+)/i, // Opera ], [NAME, VERSION], [ /opios[\/\s]+([\w\.]+)/i // Opera mini on iphone >= 8.0 ], [VERSION, [NAME, 'Opera Mini']], [ @@ -374,14 +373,15 @@ device : [[ - ////////////////////// + ////////////////////////// // MOBILES & TABLETS - ///////////////////// + // Ordered by popularity + ///////////////////////// // Samsung - /\b(sch-i[89]0\d|shw-m380s|sm-p(?:605|610|587)|sm-t\w+|sm-p\w+|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus\s10)/i, + /\b(sch-i[89]0\d|shw-m380s|sm-[pt]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus\s10)/i ], [MODEL, [VENDOR, 'Samsung'], [TYPE, TABLET]], [ - /(s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+)/i, + /\b((?:s[cgp]h|gt|sm)-\w+|galaxy\snexus)/i, /\ssamsung[\s-]([\w-]+)/i, /sec-(sgh\w+)/i ], [MODEL, [VENDOR, 'Samsung'], [TYPE, MOBILE]], [ @@ -389,18 +389,13 @@ // Apple /\((ip(?:hone|od)[\s\w]*);/i // iPod/iPhone ], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [ - /\((ipad);[\w\s\),;-]+(apple)/i // iPad - ], [MODEL, VENDOR, [TYPE, TABLET]], [ + /\((ipad);[\w\s\),;-]+apple/i, // iPad /applecoremedia\/[\w\.]+\s\((ipad)/i, + /\b(ipad)\d\d?,\d\d?[;\]].+ios/i ], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [ - /(iPad;FBSN\/iOS)/i - ], [[MODEL, 'iPad'], [VENDOR, 'Apple'], [TYPE, TABLET]], [ // Huawei - /\b(bah2?-a?[lw]\d{2})/i, // Huawei M Lite - /\b(sht?-a?[lw]\d{2})/i, // Huawei M - /\b(ags(2|3)?-a?[lw]\d{2})/i, // Huawei T - /\b(agr-a?[lw]\d{2})/i // Huawei T s + /\b((?:agr|ags[23]|bah2?|sht?)-a?[lw]\d{2})/i, ], [MODEL, [VENDOR, 'Huawei'], [TYPE, TABLET]], [ /d\/huawei([\w\s-]+)[;\)]/i, /\b(nexus\s6p|vog-[at]?l\d\d|ane-[at]?l[x\d]\d|eml-a?l\d\da?|lya-[at]?l\d[\dc]|clt-a?l\d\di?|ele-l\d\d)/i, @@ -408,8 +403,8 @@ ], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [ // Xiaomi - /\b(poco[\s\w]+)(?:\sbuild|\))/i, // Xiaomi POCO - /\b;\s(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models + /\b(poco[\s\w]+)(?:\sbuild|\))/i, // Xiaomi POCO + /\b;\s(\w+)\sbuild\/hm\1/i, // Xiaomi Hongmi 'numeric' models /\b(hm[\s\-_]?note?[\s_]?(?:\d\w)?)\sbuild/i, // Xiaomi Hongmi /\b(redmi[\s\-_]?(?:note|k)?[\w\s_]+)(?:\sbuild|\))/i, // Xiaomi Redmi /\b(mi[\s\-_]?(?:a\d|one|one[\s_]plus|note lte)?[\s_]?(?:\d?\w?)[\s_]?(?:plus)?)\sbuild/i // Xiaomi Mi @@ -434,19 +429,17 @@ // Motorola /\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)\b[\w\s]+build\//i, /\smot[\s-](\w*)/i, - /(moto[\s\w\(\)]+(?=\sbuild|\)))/i, - /(xt\d{3,4})\sbuild\//i, - /(nexus\s6)/i + /((?:moto[\s\w\(\)]+|xt\d{3,4}|nexus\s6)(?=\sbuild|\)))/i ], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [ /\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i ], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [ // LG - /((?=lg)?[vl]k\-?\d{3})\s+build|\s3\.[\s\w;-]{10}lg?-([06cv9]{3,4})/i + /((?=lg)?[vl]k\-?\d{3})\sbuild|\s3\.[\s\w;-]{10}lg?-([06cv9]{3,4})/i ], [MODEL, [VENDOR, 'LG'], [TYPE, TABLET]], [ /(nexus\s[45])/i, /lg[e;\s\/-]+((?!browser|netcast)\w+)/i, - /\blg(\-?[\d\w]+)\s+build/i + /\blg(\-?[\d\w]+)\sbuild/i ], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [ // Lenovo @@ -474,7 +467,7 @@ // OnePlus /\s(kb2005|in20[12]5|be20[12][59])\b/i, - /\ba000(1)\s+build/i, // OnePlus + /\ba000(1)\sbuild/i, // OnePlus /\boneplus\s(a\d{4})[\s)]/i ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [ @@ -493,7 +486,7 @@ ], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [ // Asus - /\b(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus\s7|padfone|p00c|asus_p00j)/i + /(?:\b|asus_)(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus\s7|padfone|p00[cj])/i ], [MODEL, [VENDOR, 'ASUS'], [TYPE, TABLET]], [ /\s(z[es]6[027][01][km][ls]|zenfone\s\d\w?)\b/i ], [MODEL, [VENDOR, 'ASUS'], [TYPE, MOBILE]], [ @@ -530,8 +523,7 @@ ], [VENDOR, MODEL, [TYPE, MOBILE]], [ /(archos)\s(gamepad2?)/i, // Archos - /(hp).+(touchpad)/i, // HP TouchPad - /(hp).+(tablet)/i, // HP Tablet + /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad /(kindle)\/([\w\.]+)/i, // Kindle /\s(nook)[\w\s]+build\/(\w+)/i, // Nook /(dell)\s(strea[kpr\s\d]*[\dko])/i, // Dell Streak @@ -616,12 +608,11 @@ /////////////////// /smart-tv.+(samsung)/i // Samsung - ], [VENDOR, [TYPE, SMARTTV], MODEL], [ + ], [VENDOR, [TYPE, SMARTTV]], [ /hbbtv.+maple;(\d+)/i ], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [ - /linux;\snetcast.+smarttv/i, // LG SmartTV - /lg\snetcast\.tv-201\d/i - ], [[VENDOR, 'LG'], MODEL, [TYPE, SMARTTV]], [ + /(?:linux;\snetcast.+smarttv|lg\snetcast\.tv-201\d)/i, // LG SmartTV + ], [[VENDOR, 'LG'], [TYPE, SMARTTV]], [ /(apple)\s?tv/i // Apple TV ], [VENDOR, [MODEL, 'Apple TV'], [TYPE, SMARTTV]], [ /crkey/i // Google Chromecast @@ -702,18 +693,16 @@ /(macintosh|mac(?=_powerpc)\s)(?!.+haiku)/i // Mac OS ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [ - // Mobile OSes + // Mobile OSes // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i, - // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS /(blackberry)\w*\/([\w\.]*)/i, // Blackberry - /(tizen|kaios)[\/\s]([\w\.]+)/i // Tizen/KaiOS + /(tizen|kaios)[\/\s]([\w\.]+)/i, // Tizen/KaiOS + /\((series40);/i // Series 40 ], [NAME, VERSION], [ /\(bb(10);/i // BlackBerry 10 ], [VERSION, [NAME, 'BlackBerry']], [ /(?:symbian\s?os|symbos|s60(?=;)|series60)[\/\s-]?([\w\.]*)/i // Symbian ], [VERSION, [NAME, 'Symbian']], [ - /\((series40);/i // Series 40 - ], [NAME], [ /mozilla.+\(mobile;.+gecko.+firefox/i // Firefox OS ], [[NAME, 'Firefox OS']], [ /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i // WebOS @@ -722,6 +711,8 @@ // Google Chromecast /crkey\/([\d\.]+)/i // Google Chromecast ], [VERSION, [NAME, 'Chromecast']], [ + /(cros)\s[\w]+\s([\w\.]+\w)/i // Chromium OS + ], [[NAME, 'Chromium OS'], VERSION],[ // Console /(nintendo|playstation)\s([wids345portablevuch]+)/i, // Nintendo/Playstation @@ -734,28 +725,19 @@ // Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware // Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus /(hurd|linux)\s?([\w\.]*)/i, // Hurd/Linux - /(gnu)\s?([\w\.]*)/i // GNU - ], [NAME, VERSION], [ - - /(cros)\s[\w]+\s([\w\.]+\w)/i // Chromium OS - ], [[NAME, 'Chromium OS'], VERSION],[ - - // Solaris - /(sunos)\s?([\w\.\d]*)/i // Solaris - ], [[NAME, 'Solaris'], VERSION], [ + /(gnu)\s?([\w\.]*)/i, // GNU // BSD based - /\s([frentopc-]{0,4}bsd|dragonfly)\s?(?!amd|[ix346]{1,2}86)([\w\.]*)/i // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly - ], [NAME, VERSION],[ - + /\s([frentopc-]{0,4}bsd|dragonfly)\s?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly /(haiku)\s(\w+)/i // Haiku - ], [NAME, VERSION],[ + ], [NAME, VERSION], [ // Other + /(sunos)\s?([\w\.\d]*)/i // Solaris + ], [[NAME, 'Solaris'], VERSION], [ /((?:open)?solaris)[\/\s-]?([\w\.]*)/i, // Solaris /(aix)\s((\d)(?=\.|\)|\s)[\w\.])*/i, // AIX - /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms|fuchsia)/i, - // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS/Fuchsia + /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms|fuchsia)/i, // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS/Fuchsia /(unix)\s?([\w\.]*)/i // UNIX ], [NAME, VERSION] ] diff --git a/test/device-test.json b/test/device-test.json index b5d9f84..c30cf8b 100644 --- a/test/device-test.json +++ b/test/device-test.json @@ -30,7 +30,7 @@ "ua": "Mozilla/5.0 (Linux; Android 7.0; ASUS_P00J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.111 Safari/537.36\n", "expect": { "vendor": "ASUS", - "model": "ASUS_P00J", + "model": "P00J", "type": "tablet" } }, @@ -441,6 +441,15 @@ "type": "mobile" } }, + { + "desc": "iPhone SE using Facebook App", + "ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 [FBAN/FBIOS;FBDV/iPhone8,4;FBMD/iPhone;FBSN/iOS;FBSV/13.3.1;FBSS/2;FBID/phone;FBLC/en_US;FBOP/5;FBCR/]", + "expect": { + "vendor": "Apple", + "model": "iPhone", + "type": "mobile" + } + }, { "desc": "iPhone 11 Pro Max", "ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 [FBAN/FBIOS;FBDV/iPhone12,5;FBMD/iPhone;FBSN/iOS;FBSV/13.3.1;FBSS/3;FBID/phone;FBLC/en_US;FBOP/5;FBCR/]",