123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- "use strict";
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
- if (ar || !(i in from)) {
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
- ar[i] = from[i];
- }
- }
- return to.concat(ar || Array.prototype.slice.call(from));
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.getNodeVersion = exports.detectOS = exports.parseUserAgent = exports.browserName = exports.detect = exports.ReactNativeInfo = exports.BotInfo = exports.SearchBotDeviceInfo = exports.NodeInfo = exports.BrowserInfo = void 0;
- var BrowserInfo = /** @class */ (function () {
- function BrowserInfo(name, version, os) {
- this.name = name;
- this.version = version;
- this.os = os;
- this.type = 'browser';
- }
- return BrowserInfo;
- }());
- exports.BrowserInfo = BrowserInfo;
- var NodeInfo = /** @class */ (function () {
- function NodeInfo(version) {
- this.version = version;
- this.type = 'node';
- this.name = 'node';
- this.os = process.platform;
- }
- return NodeInfo;
- }());
- exports.NodeInfo = NodeInfo;
- var SearchBotDeviceInfo = /** @class */ (function () {
- function SearchBotDeviceInfo(name, version, os, bot) {
- this.name = name;
- this.version = version;
- this.os = os;
- this.bot = bot;
- this.type = 'bot-device';
- }
- return SearchBotDeviceInfo;
- }());
- exports.SearchBotDeviceInfo = SearchBotDeviceInfo;
- var BotInfo = /** @class */ (function () {
- function BotInfo() {
- this.type = 'bot';
- this.bot = true; // NOTE: deprecated test name instead
- this.name = 'bot';
- this.version = null;
- this.os = null;
- }
- return BotInfo;
- }());
- exports.BotInfo = BotInfo;
- var ReactNativeInfo = /** @class */ (function () {
- function ReactNativeInfo() {
- this.type = 'react-native';
- this.name = 'react-native';
- this.version = null;
- this.os = null;
- }
- return ReactNativeInfo;
- }());
- exports.ReactNativeInfo = ReactNativeInfo;
- // tslint:disable-next-line:max-line-length
- var SEARCHBOX_UA_REGEX = /alexa|bot|crawl(er|ing)|facebookexternalhit|feedburner|google web preview|nagios|postrank|pingdom|slurp|spider|yahoo!|yandex/;
- var SEARCHBOT_OS_REGEX = /(nuhk|curl|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask\ Jeeves\/Teoma|ia_archiver)/;
- var REQUIRED_VERSION_PARTS = 3;
- var userAgentRules = [
- ['aol', /AOLShield\/([0-9\._]+)/],
- ['edge', /Edge\/([0-9\._]+)/],
- ['edge-ios', /EdgiOS\/([0-9\._]+)/],
- ['yandexbrowser', /YaBrowser\/([0-9\._]+)/],
- ['kakaotalk', /KAKAOTALK\s([0-9\.]+)/],
- ['samsung', /SamsungBrowser\/([0-9\.]+)/],
- ['silk', /\bSilk\/([0-9._-]+)\b/],
- ['miui', /MiuiBrowser\/([0-9\.]+)$/],
- ['beaker', /BeakerBrowser\/([0-9\.]+)/],
- ['edge-chromium', /EdgA?\/([0-9\.]+)/],
- [
- 'chromium-webview',
- /(?!Chrom.*OPR)wv\).*Chrom(?:e|ium)\/([0-9\.]+)(:?\s|$)/,
- ],
- ['chrome', /(?!Chrom.*OPR)Chrom(?:e|ium)\/([0-9\.]+)(:?\s|$)/],
- ['phantomjs', /PhantomJS\/([0-9\.]+)(:?\s|$)/],
- ['crios', /CriOS\/([0-9\.]+)(:?\s|$)/],
- ['firefox', /Firefox\/([0-9\.]+)(?:\s|$)/],
- ['fxios', /FxiOS\/([0-9\.]+)/],
- ['opera-mini', /Opera Mini.*Version\/([0-9\.]+)/],
- ['opera', /Opera\/([0-9\.]+)(?:\s|$)/],
- ['opera', /OPR\/([0-9\.]+)(:?\s|$)/],
- ['pie', /^Microsoft Pocket Internet Explorer\/(\d+\.\d+)$/],
- ['pie', /^Mozilla\/\d\.\d+\s\(compatible;\s(?:MSP?IE|MSInternet Explorer) (\d+\.\d+);.*Windows CE.*\)$/],
- ['netfront', /^Mozilla\/\d\.\d+.*NetFront\/(\d.\d)/],
- ['ie', /Trident\/7\.0.*rv\:([0-9\.]+).*\).*Gecko$/],
- ['ie', /MSIE\s([0-9\.]+);.*Trident\/[4-7].0/],
- ['ie', /MSIE\s(7\.0)/],
- ['bb10', /BB10;\sTouch.*Version\/([0-9\.]+)/],
- ['android', /Android\s([0-9\.]+)/],
- ['ios', /Version\/([0-9\._]+).*Mobile.*Safari.*/],
- ['safari', /Version\/([0-9\._]+).*Safari/],
- ['facebook', /FB[AS]V\/([0-9\.]+)/],
- ['instagram', /Instagram\s([0-9\.]+)/],
- ['ios-webview', /AppleWebKit\/([0-9\.]+).*Mobile/],
- ['ios-webview', /AppleWebKit\/([0-9\.]+).*Gecko\)$/],
- ['curl', /^curl\/([0-9\.]+)$/],
- ['searchbot', SEARCHBOX_UA_REGEX],
- ];
- var operatingSystemRules = [
- ['iOS', /iP(hone|od|ad)/],
- ['Android OS', /Android/],
- ['BlackBerry OS', /BlackBerry|BB10/],
- ['Windows Mobile', /IEMobile/],
- ['Amazon OS', /Kindle/],
- ['Windows 3.11', /Win16/],
- ['Windows 95', /(Windows 95)|(Win95)|(Windows_95)/],
- ['Windows 98', /(Windows 98)|(Win98)/],
- ['Windows 2000', /(Windows NT 5.0)|(Windows 2000)/],
- ['Windows XP', /(Windows NT 5.1)|(Windows XP)/],
- ['Windows Server 2003', /(Windows NT 5.2)/],
- ['Windows Vista', /(Windows NT 6.0)/],
- ['Windows 7', /(Windows NT 6.1)/],
- ['Windows 8', /(Windows NT 6.2)/],
- ['Windows 8.1', /(Windows NT 6.3)/],
- ['Windows 10', /(Windows NT 10.0)/],
- ['Windows ME', /Windows ME/],
- ['Windows CE', /Windows CE|WinCE|Microsoft Pocket Internet Explorer/],
- ['Open BSD', /OpenBSD/],
- ['Sun OS', /SunOS/],
- ['Chrome OS', /CrOS/],
- ['Linux', /(Linux)|(X11)/],
- ['Mac OS', /(Mac_PowerPC)|(Macintosh)/],
- ['QNX', /QNX/],
- ['BeOS', /BeOS/],
- ['OS/2', /OS\/2/],
- ];
- function detect(userAgent) {
- if (!!userAgent) {
- return parseUserAgent(userAgent);
- }
- if (typeof document === 'undefined' &&
- typeof navigator !== 'undefined' &&
- navigator.product === 'ReactNative') {
- return new ReactNativeInfo();
- }
- if (typeof navigator !== 'undefined') {
- return parseUserAgent(navigator.userAgent);
- }
- return getNodeVersion();
- }
- exports.detect = detect;
- function matchUserAgent(ua) {
- // opted for using reduce here rather than Array#first with a regex.test call
- // this is primarily because using the reduce we only perform the regex
- // execution once rather than once for the test and for the exec again below
- // probably something that needs to be benchmarked though
- return (ua !== '' &&
- userAgentRules.reduce(function (matched, _a) {
- var browser = _a[0], regex = _a[1];
- if (matched) {
- return matched;
- }
- var uaMatch = regex.exec(ua);
- return !!uaMatch && [browser, uaMatch];
- }, false));
- }
- function browserName(ua) {
- var data = matchUserAgent(ua);
- return data ? data[0] : null;
- }
- exports.browserName = browserName;
- function parseUserAgent(ua) {
- var matchedRule = matchUserAgent(ua);
- if (!matchedRule) {
- return null;
- }
- var name = matchedRule[0], match = matchedRule[1];
- if (name === 'searchbot') {
- return new BotInfo();
- }
- // Do not use RegExp for split operation as some browser do not support it (See: http://blog.stevenlevithan.com/archives/cross-browser-split)
- var versionParts = match[1] && match[1].split('.').join('_').split('_').slice(0, 3);
- if (versionParts) {
- if (versionParts.length < REQUIRED_VERSION_PARTS) {
- versionParts = __spreadArray(__spreadArray([], versionParts, true), createVersionParts(REQUIRED_VERSION_PARTS - versionParts.length), true);
- }
- }
- else {
- versionParts = [];
- }
- var version = versionParts.join('.');
- var os = detectOS(ua);
- var searchBotMatch = SEARCHBOT_OS_REGEX.exec(ua);
- if (searchBotMatch && searchBotMatch[1]) {
- return new SearchBotDeviceInfo(name, version, os, searchBotMatch[1]);
- }
- return new BrowserInfo(name, version, os);
- }
- exports.parseUserAgent = parseUserAgent;
- function detectOS(ua) {
- for (var ii = 0, count = operatingSystemRules.length; ii < count; ii++) {
- var _a = operatingSystemRules[ii], os = _a[0], regex = _a[1];
- var match = regex.exec(ua);
- if (match) {
- return os;
- }
- }
- return null;
- }
- exports.detectOS = detectOS;
- function getNodeVersion() {
- var isNode = typeof process !== 'undefined' && process.version;
- return isNode ? new NodeInfo(process.version.slice(1)) : null;
- }
- exports.getNodeVersion = getNodeVersion;
- function createVersionParts(count) {
- var output = [];
- for (var ii = 0; ii < count; ii++) {
- output.push('0');
- }
- return output;
- }
|