UNPKG

woothee

Version:

User-Agent string parser (js implementation)

219 lines (186 loc) 5.85 kB
/* HEADER BEGIN */ var util = require('./util'), updateMap = util.updateMap, updateVersion = util.updateVersion, updateCategory = util.updateCategory, updateOs = util.updateOs, dataset = require('./dataset'); /* HEADER END */ var msiePattern = /MSIE ([.0-9]+);/; var tridentPattern = /Trident\/[.0-9]+;/; var tridentVersionPattern = / rv:([.0-9]+)/; var iemobilePattern = /IEMobile\/([.0-9]+);/; var challengeMSIE = exports.challengeMSIE = function(ua, result) { if (ua.indexOf('compatible; MSIE') < 0 && ua.indexOf('Trident/') < 0 && ua.indexOf('IEMobile/')) return false; var version; var match = msiePattern.exec(ua); if (!match) if (tridentPattern.exec(ua)) match = tridentVersionPattern.exec(ua); if (!match) match = iemobilePattern.exec(ua); if (match) version = match[1]; else version = dataset.VALUE_UNKNOWN; updateMap(result, dataset.get('MSIE')); updateVersion(result, version); return true; }; var yandexBrowserPattern = /YaBrowser\/([.0-9]+)/; var challengeYandexBrowser = exports.challengeYandexBrowser = function(ua, result) { if (ua.indexOf('YaBrowser/') < 0) return false; var version; var match = yandexBrowserPattern.exec(ua); if (match) { version = match[1]; } else { version = dataset.VALUE_UNKNOWN; } updateMap(result, dataset.get('YaBrowser')); updateVersion(result, version); return true; }; var edgePattern = /(?:Edge|Edg|EdgiOS|EdgA)\/([.0-9]+)/; var firefoxiOSPattern = /FxiOS\/([.0-9]+)/; var chromePattern = /(?:Chrome|CrMo|CriOS)\/([.0-9]+)/; var operaBlinkPattern = /OPR\/([.0-9]+)/; var gsaPattern = /GSA\/([.0-9]+)/; var safariPattern = /Version\/([.0-9]+)/; var challengeSafariChrome = exports.challengeSafariChrome = function(ua, result) { if (ua.indexOf('Safari/') < 0) return false; if (ua.indexOf('Chrome') >= 0 && ua.indexOf('wv') >= 0) return false; var version = dataset.VALUE_UNKNOWN; var match; if ((match = edgePattern.exec(ua))) { version = match[1]; updateMap(result, dataset.get('Edge')); updateVersion(result, version); return true; } if ((match = firefoxiOSPattern.exec(ua))) { version = match[1]; updateMap(result, dataset.get('Firefox')); updateVersion(result, version); return true; } if ((match = chromePattern.exec(ua))) { var matchOpera; if ((matchOpera = operaBlinkPattern.exec(ua))) { // Opera w/ blink version = matchOpera[1]; updateMap(result, dataset.get('Opera')); updateVersion(result, version); return true; } // Chrome version = match[1]; updateMap(result, dataset.get('Chrome')); updateVersion(result, version); return true; } if ((match = gsaPattern.exec(ua))) { version = match[1]; updateMap(result, dataset.get('GSA')); updateVersion(result, version); return true; } if ((match = safariPattern.exec(ua))) { version = match[1]; } updateMap(result, dataset.get('Safari')); updateVersion(result, version); return true; }; var firefoxPattern = /Firefox\/([.0-9]+)/; var challengeFirefox = exports.challengeFirefox = function(ua, result) { if (ua.indexOf('Firefox/') < 0) return false; var version = dataset.VALUE_UNKNOWN; var match = firefoxPattern.exec(ua); if (match) version = match[1]; updateMap(result, dataset.get('Firefox')); updateVersion(result, version); return true; }; var operaPattern1 = /Version\/([.0-9]+)/; var operaPattern2 = /Opera[\/ ]([.0-9]+)/; var challengeOpera = exports.challengeOpera = function(ua, result) { if (ua.indexOf('Opera') < 0) return false; var version = dataset.VALUE_UNKNOWN; var match = operaPattern1.exec(ua); if (match) { version = match[1]; } else { match = operaPattern2.exec(ua); if (match) version = match[1]; } updateMap(result, dataset.get('Opera')); updateVersion(result, version); return true; }; var webviewPattern = /iP(hone;|ad;|od) .*like Mac OS X/; var webviewVersionPattern = /Version\/([.0-9]+)/; var challengeWebview = exports.challengeWebview = function(ua, result) { var version = dataset.VALUE_UNKNOWN; // Android(Lollipop and Above) if (ua.indexOf('Chrome') >= 0 && ua.indexOf('wv') >= 0) { var vmatch = webviewVersionPattern.exec(ua); if (vmatch) version = vmatch[1]; updateMap(result, dataset.get('Webview')); updateVersion(result, version); return true; } // iOS var match = webviewPattern.exec(ua); if (match) { if (ua.indexOf('Safari/') > -1) return false; var vmatch = webviewVersionPattern.exec(ua); if (vmatch) version = vmatch[1]; updateMap(result, dataset.get('Webview')); updateVersion(result, version); return true; } return false; }; var sleipnirPattern = /Sleipnir\/([.0-9]+)/; var challengeSleipnir = exports.challengeSleipnir = function(ua, result) { if (ua.indexOf('Sleipnir/') < 0) return false; var version = dataset.VALUE_UNKNOWN; var match = sleipnirPattern.exec(ua); if (match) version = match[1]; updateMap(result, dataset.get('Sleipnir')); updateVersion(result, version); /* Sleipnir's user-agent doesn't contain Windows version, so put 'Windows UNKNOWN Ver'. Sleipnir is IE component browser, so for Windows only. */ var win = dataset.get('Win'); updateCategory(result, win[dataset.KEY_CATEGORY]); updateOs(result, win[dataset.KEY_NAME]); return true; }; var vivaldiPattern = /Vivaldi\/([.0-9]+)/; var challengeVivaldi = exports.challengeVivaldi = function(ua, result) { if (ua.indexOf('Vivaldi/') < 0) return false; var version = dataset.VALUE_UNKNOWN; var match = vivaldiPattern.exec(ua); if (match) version = match[1]; updateMap(result, dataset.get('Vivaldi')); updateVersion(result, version); return true; };