UNPKG

weex-nuke

Version:

基于 Rax 、Weex 的高性能组件体系 ~~

246 lines (227 loc) 11.7 kB
/** * UAParser.js v0.7.17 * Lightweight JavaScript-based User-Agent string parser * https://github.com/faisalman/ua-parser-js * * Copyright © 2012-2016 Faisal Salman <fyzlman@gmail.com> * Dual licensed under GPLv2 or MIT * 2018-04-24 modified by dubu * @description reduce size of ua judge * 移除对windows平台、amazon的判断逻辑、浏览器内核判断逻辑,各种没有听说过的平板判断与系统判断 */ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var LIBVERSION = '0.7.17'; var EMPTY = ''; var UNKNOWN = '?'; var MAJOR = 'major'; // deprecated var MODEL = 'model'; var NAME = 'name'; var TYPE = 'type'; var VENDOR = 'vendor'; var VERSION = 'version'; var CONSOLE = 'console'; var MOBILE = 'mobile'; var TABLET = 'tablet'; var SMARTTV = 'smarttv'; var WEARABLE = 'wearable'; var EMBEDDED = 'embedded'; var util = { extend: function extend(regexes, extensions) { var margedRegexes = {}; for (var i in regexes) { if (extensions[i] && extensions[i].length % 2 === 0) { margedRegexes[i] = extensions[i].concat(regexes[i]); } else { margedRegexes[i] = regexes[i]; } } return margedRegexes; }, has: function has(str1, str2) { if (typeof str1 === 'string') { return str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1; } return false; }, lowerize: function lowerize(str) { return str.toLowerCase(); }, major: function major(version) { return typeof version === 'string' ? version.replace(/[^\d.]/g, '').split('.')[0] : undefined; }, trim: function trim(str) { return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); } }; var mapper = { rgx: function rgx(ua, arrays) { // var result = {}, var i = 0; var j = void 0; var k = void 0; var p = void 0; var q = void 0; var matches = void 0; var match = void 0; // , args = arguments; while (i < arrays.length && !matches) { var regex = arrays[i]; // even sequence (0,2,4,..) var props = arrays[i + 1]; // odd sequence (1,3,5,..) j = k = 0; // try matching uastring with regexes while (j < regex.length && !matches) { matches = regex[j++].exec(ua); if (matches && typeof props !== 'undefined') { for (p = 0; p < props.length; p++) { match = matches[++k]; q = props[p]; // check if given property is actually array if ((typeof q === 'undefined' ? 'undefined' : _typeof(q)) === 'object' && q.length > 0) { if (q.length == 2) { if (typeof q[1] === 'function') { // assign modified match this[q[0]] = q[1].call(this, match); } else { // assign given value, ignore regex match this[q[0]] = q[1]; } } else if (q.length == 3) { // check whether function or regex if (typeof q[1] === 'function' && !(q[1].exec && q[1].test)) { // call function (usually string mapper) this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined; } else { // sanitize match using given regex this[q[0]] = match ? match.replace(q[1], q[2]) : undefined; } } else if (q.length === 4) { this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined; } } else { this[q] = match || undefined; } } } } i += 2; } // console.log(this); // return this; }, str: function str(_str, map) { for (var i in map) { // check if array if (_typeof(map[i]) === 'object' && map[i].length > 0) { for (var j = 0; j < map[i].length; j++) { if (util.has(map[i][j], _str)) { return i === UNKNOWN ? undefined : i; } } } else if (util.has(map[i], _str)) { return i === UNKNOWN ? undefined : i; } } return _str; } }; var regexes = { browser: [[ // Presto based /(opera\smini)\/([\w.-]+)/i, // Opera Mini /(opera\s[mobiletab]+).+version\/([\w.-]+)/i, // Opera Mobi/Tablet /(opera).+version\/([\w.]+)/i, // Opera > 9.80 /(opera)[/\s]+([\w.]+)/i], [NAME, VERSION], [/(opios)[/\s]+([\w.]+)/i], [[NAME, 'Opera Mini'], VERSION], [/\s(opr)\/([\w.]+)/i], [[NAME, 'Opera'], VERSION], [/((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i], [[NAME, 'UCBrowser'], VERSION], [/(micromessenger)\/([\w\.]+)/i], [[NAME, 'WeChat'], VERSION], [/(QQ)\/([\d\.]+)/i], [NAME, VERSION], [/m?(qqbrowser)[\/\s]?([\w\.]+)/i], [NAME, VERSION], [/xiaomi\/miuibrowser\/([\w\.]+)/i], [VERSION, [NAME, 'MIUI Browser']], [/;fbav\/([\w\.]+);/i], [VERSION, [NAME, 'Facebook']], [/headlesschrome(?:\/([\w\.]+)|\s)/i], [VERSION, [NAME, 'Chrome Headless']], [/\swv\).+(chrome)\/([\w\.]+)/i], [[NAME, /(.+)/, '$1 WebView'], VERSION], [/((?:oculus|samsung)browser)\/([\w\.]+)/i], [[NAME, /(.+(?:g|us))(.+)/, '$1 $2'], VERSION], [ // Oculus / Samsung Browser /android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i], [VERSION, [NAME, 'Android Browser']], [/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i], [[NAME, 'Dolphin'], VERSION], [/(dolfin)\/([\w\.]+)/i], [[NAME, 'Chrome'], VERSION], [/((?:android.+)crmo|crios)\/([\w\.]+)/i], [[NAME, 'Opera Coast'], VERSION], [/(coast)\/([\w\.]+)/i], [VERSION, [NAME, 'Firefox']], [/fxios\/([\w\.-]+)/i], [VERSION, [NAME, 'Mobile Safari']], [/version\/([\w\.]+).+?mobile\/\w+\s(safari)/i], [VERSION, NAME], [/version\/([\w\.]+).+?(mobile\s?safari|safari)/i], [[NAME, 'GSA'], VERSION], [/webkit.+?(gsa)\/([\w\.]+).+?(mobile\s?safari|safari)(\/[\w\.]+)/i], [[NAME, 'Netscape'], VERSION], [ // Gecko based /(navigator|netscape)\/([\w\.-]+)/i], [NAME, VERSION], [/(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i]], device: [[/\((ipad|playbook);[\w\s\);-]+(rim|apple)/i], [MODEL, VENDOR, [TYPE, TABLET]], [/applecoremedia\/[\w\.]+ \((ipad)/], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [/\((ip[honed|\s\w*]+);.+(apple)/i], [MODEL, VENDOR, [TYPE, MOBILE]], [/\((ip[honed|\s\w*]+);/i], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [/(sony)\s(tablet\s[ps])\sbuild\//i, // Sony /(sony)?(?:sgp.+)\sbuild\//i], [[VENDOR, 'Sony'], [MODEL, 'Xperia Tablet'], [TYPE, TABLET]], [/android.+\s([c-g]\d{4}|so[-l]\w+)\sbuild\//i], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [/(lenovo)\s?(S(?:5000|6000)+(?:[-][\w+]))/i], [VENDOR, MODEL, [TYPE, TABLET]], [/(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i, // HTC /(zte)-(\w+)*/i, // ZTE /(alcatel|geeksphone|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]+)*/i], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [/(nexus\s9)/i], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [/d\/huawei([\w\s-]+)[;\)]/i, /(nexus\s6p)/i], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [/(microsoft);\s(lumia[\s\w]+)/i], [VENDOR, MODEL, [TYPE, MOBILE]], [/android.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [/\(dtv[\);].+(aquos)/i], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [/android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10))/i, /((SM-T\w+))/i], [[VENDOR, 'Samsung'], MODEL, [TYPE, TABLET]], [ // Samsung /smart-tv.+(samsung)/i], [VENDOR, [TYPE, SMARTTV], MODEL], [/((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i, /(sam[sung]*)[\s-]*(\w+-?[\w-]*)*/i, /sec-((sgh\w+))/i], [[VENDOR, 'Samsung'], MODEL, [TYPE, MOBILE]], [/(maemo|nokia).*(n900|lumia\s\d+)/i, // Nokia /(nokia)[\s_-]?([\w-]+)*/i], [[VENDOR, 'Nokia'], MODEL, [TYPE, MOBILE]], [/(nexus\s[45])/i, // LG /lg[e;\s\/-]+(\w+)*/i, /android.+lg(\-?[\d\w]+)\s+build/i], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [/android.+(ideatab[a-z0-9\-\s]+)/i], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [/android.+;\s(oppo)\s?([\w\s]+)\sbuild/i], [VENDOR, MODEL, [TYPE, MOBILE]], [/crkey/i], [[MODEL, 'Chromecast'], [VENDOR, 'Google']], [/android.+(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models /android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Hongmi /android.+(mi[\s\-_]*(?:one|one[\s_]plus|note lte)?[\s_]*(?:\d\w?)?[\s_]*(?:plus)?)\s+build/i, // Xiaomi Mi /android.+(redmi[\s\-_]*(?:note)?(?:[\s_]*[\w\s]+)?)\s+build/i], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [/android.+(mi[\s\-_]*(?:pad)(?:[\s_]*[\w\s]+)?)\s+build/i], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [/android.+;\s(m[1-5]\snote)\sbuild/i], [MODEL, [VENDOR, 'Meizu'], [TYPE, TABLET]], [/android.+a000(1)\s+build/i, // OnePlus /android.+oneplus\s(a\d{4})\s+build/i], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [/android.+[;\/]\s*(zte)?.+(k\d{2})\s+build/i], [[VENDOR, 'ZTE'], MODEL, [TYPE, TABLET]], [/\s(tablet|tab)[;\/]/i, // Unidentifiable Tablet /\s(mobile)(?:[;\/]|\ssafari)/i], [[TYPE, util.lowerize], VENDOR, MODEL]], os: [[/(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]+)*/i], [NAME, VERSION], [/(cros)\s[\w]+\s([\w\.]+\w)/i], [[NAME, 'Chromium OS'], VERSION], [/cfnetwork\/.+darwin/i, /ip[honead]+(?:.*os\s([\w]+)\slike\smac|;\sopera)/i], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [/(mac\sos\sx)\s?([\w\s\.]+\w)*/i, /(macintosh|mac(?=_powerpc)\s)/i], [NAME], [/mozilla.+\(mobile;.+gecko.+firefox/i], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']]] }; var UAParser = function UAParser(uastring, extensions) { if ((typeof uastring === 'undefined' ? 'undefined' : _typeof(uastring)) === 'object') { extensions = uastring; uastring = undefined; } if (!(this instanceof UAParser)) { return new UAParser(uastring, extensions).getResult(); } var ua = uastring || (window && window.navigator && window.navigator.userAgent ? window.navigator.userAgent : EMPTY); var rgxmap = extensions ? util.extend(regexes, extensions) : regexes; // var browser = new Browser(); // var device = new Device(); // var os = new OS(); this.getBrowser = function () { var browser = { name: undefined, version: undefined }; mapper.rgx.call(browser, ua, rgxmap.browser); browser.major = util.major(browser.version); // deprecated return browser; }; this.getDevice = function () { var device = { vendor: undefined, model: undefined, type: undefined }; mapper.rgx.call(device, ua, rgxmap.device); return device; }; this.getOS = function () { var os = { name: undefined, version: undefined }; mapper.rgx.call(os, ua, rgxmap.os); return os; }; this.getResult = function () { return { ua: this.getUA(), browser: this.getBrowser(), os: this.getOS(), device: this.getDevice() }; }; this.getUA = function () { return ua; }; this.setUA = function (uastring) { ua = uastring; // browser = new Browser(); // device = new Device(); // os = new OS(); return this; }; return this; }; UAParser.VERSION = LIBVERSION; UAParser.BROWSER = { NAME: NAME, MAJOR: MAJOR, // deprecated VERSION: VERSION }; UAParser.DEVICE = { MODEL: MODEL, VENDOR: VENDOR, TYPE: TYPE, CONSOLE: CONSOLE, MOBILE: MOBILE, SMARTTV: SMARTTV, TABLET: TABLET, WEARABLE: WEARABLE, EMBEDDED: EMBEDDED }; UAParser.OS = { NAME: NAME, VERSION: VERSION }; // UAParser.Utils = util; exports.UAParser = UAParser;