native-fn
Version:
694 lines (688 loc) • 26.4 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Platform = factory());
})(this, (function () { 'use strict';
function compareVersion(lhs, rhs) {
var pa = lhs.split('.');
var pb = rhs.split('.');
var length = Math.max(pa.length, pb.length);
for (var i = 0; i < length; i++) {
var a = void 0;
var b = void 0;
if (i < pa.length)
a = parseInt(pa[i], 10);
else
a = 0;
if (i < pb.length)
b = parseInt(pb[i], 10);
else
b = 0;
if (a > b)
return 1;
if (a < b)
return -1;
}
return 0;
}
function resolveWindowsVersion(string) {
if (typeof string === 'undefined')
return '';
var mapped = {
'4.90': 'ME',
'NT3.51': 'NT 3.11',
'NT4.0': 'NT 4.0',
'NT 5.0': '2000',
'NT 5.1': 'XP',
'NT 5.2': 'XP',
'NT 6.0': 'Vista',
'NT 6.1': '7',
'NT 6.2': '8',
'NT 6.3': '8.1',
'NT 6.4': '10',
'NT 10.0': '10',
'ARM': 'RT'
}[string];
if (typeof mapped !== 'undefined')
return mapped;
return string;
}
function resolveUnderscoreVersion(string) {
if (typeof string === 'undefined')
return '';
return string.replace(/_/g, '.');
}
var OS;
(function (OS) {
OS["Unknown"] = "Unknown";
OS["Android"] = "Android";
OS["iOS"] = "iOS";
OS["Windows"] = "Windows";
OS["MacOS"] = "MacOS";
})(OS || (OS = {}));
var Devices;
(function (Devices) {
Devices["Unknown"] = "Unknown";
Devices["Mobile"] = "Mobile";
Devices["Desktop"] = "Desktop";
})(Devices || (Devices = {}));
var Engines;
(function (Engines) {
Engines["Unknown"] = "Unknown";
Engines["EdgeHTML"] = "EdgeHTML";
Engines["ArkWeb"] = "ArkWeb";
Engines["Blink"] = "Blink";
Engines["Presto"] = "Presto";
Engines["WebKit"] = "WebKit";
Engines["Trident"] = "Trident";
Engines["NetFront"] = "NetFront";
Engines["KHTML"] = "KHTML";
Engines["Tasman"] = "Tasman";
Engines["Gecko"] = "Gecko";
})(Engines || (Engines = {}));
var Browsers;
(function (Browsers) {
Browsers["Unknown"] = "Unknown";
Browsers["Chrome"] = "Chrome";
Browsers["Safari"] = "Safari";
Browsers["Edge"] = "Edge";
Browsers["Firefox"] = "Firefox";
Browsers["Opera"] = "Opera";
Browsers["IE"] = "IE";
Browsers["SamsungInternet"] = "SamsungInternet";
})(Browsers || (Browsers = {}));
var USER_AGENT = typeof globalThis.navigator !== 'undefined' && typeof globalThis.navigator.userAgent === 'string' ? globalThis.navigator.userAgent : '';
var HIGH_ENTROPY_BRAND_NAME_MAP = {
'Google Chrome': 'Chrome',
'Microsoft Edge': 'Edge',
'Microsoft Edge WebView2': 'Edge WebView2',
'Android WebView': 'Chrome WebView',
'HeadlessChrome': 'Chrome Headless',
'OperaMobile': 'Opera Mobi',
};
var RTL_LANGUAGES = ['ae', 'ar', 'arc', 'bcc', 'bqi', 'ckb', 'dv', 'fa', 'glk', 'he', 'iw', 'ku', 'mzn', 'nqo', 'pnb', 'ps', 'sd', 'ug', 'ur', 'yi'];
var OS_RESOLVER_MAP = [
[/windows nt (6\.[23]); arm/i, OS.Windows, resolveWindowsVersion],
[/windows (?:phone|mobile|iot)(?: os)?[\/ ]?([\d.]*( se)?)/i, OS.Windows, resolveWindowsVersion],
[/windows[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i, OS.Windows, resolveWindowsVersion],
[/windows nt ?([\d.)]*)(?!.+xbox)/i, OS.Windows, resolveWindowsVersion],
[/\bwin(?=3| ?9|n)(?:nt| 9x )?([\d.;]*)/i, OS.Windows, resolveWindowsVersion],
[/windows ce\/?([\d.]*)/i, OS.Windows, resolveWindowsVersion],
[/[adehimnop]{4,7}\b(?:.*os (\w+) like mac|; opera)/i, OS.iOS, resolveUnderscoreVersion],
[/(?:ios;fbsv|ios(?=.+ip(?:ad|hone))|ip(?:ad|hone)(?: |.+i(?:pad)?)os)[\/ ]([\w.]+)/i, OS.iOS, resolveUnderscoreVersion],
[/cfnetwork\/.+darwin/i, OS.iOS, resolveUnderscoreVersion],
[/mac os x ?([\w. ]*)/i, OS.MacOS, resolveUnderscoreVersion],
[/(?:macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i, OS.MacOS, resolveUnderscoreVersion],
[/droid ([\w.]+)\b.+(android[- ]x86)/i, OS.Android],
[/android\w*[-\/.; ]?([\d.]*)/i, OS.Android],
];
var ENGINE_RESOLVER_MAP = [
[/windows.+ edge\/([\w.]+)/i, Engines.EdgeHTML],
[/arkweb\/([\w.]+)/i, Engines.ArkWeb],
[/webkit\/537\.36.+chrome\/(?!27)([\w.]+)/i, Engines.Blink],
[/presto\/([\w.]+)/i, Engines.Presto],
[/webkit\/([\w.]+)/i, Engines.WebKit],
[/trident\/([\w.]+)/i, Engines.Trident],
[/netfront\/([\w.]+)/i, Engines.NetFront],
[/khtml[\/ ]\(?([\w.]+)/i, Engines.KHTML],
[/tasman[\/ ]\(?([\w.]+)/i, Engines.Tasman],
[/rv:([\w.]{1,9})\b.+gecko/i, Engines.Gecko]
];
var BROWSER_RESOLVER_MAP = [
[/\b(?:crmo|crios)\/([\w.]+)/i, Browsers.Chrome],
[/webview.+edge\/([\w.]+)/i, Browsers.Edge],
[/edg(?:e|ios|a)?\/([\w.]+)/i, Browsers.Edge],
[/opera mini\/([-\w.]+)/i, Browsers.Opera],
[/opera [mobileta]{3,6}\b.+version\/([-\w.]+)/i, Browsers.Opera],
[/opera(?:.+version\/|[\/ ]+)([\w.]+)/i, Browsers.Opera],
[/opios[\/ ]+([\w.]+)/i, Browsers.Opera],
[/\bop(?:rg)?x\/([\w.]+)/i, Browsers.Opera],
[/\bopr\/([\w.]+)/i, Browsers.Opera],
[/iemobile(?:browser|boat|jet)[\/ ]?([\d.]*)/i, Browsers.IE],
[/(?:ms|\()ie ([\w.]+)/i, Browsers.IE],
[/trident.+rv[: ]([\w.]{1,9})\b.+like gecko/i, Browsers.IE],
[/\bfocus\/([\w.]+)/i, Browsers.Firefox],
[/\bopt\/([\w.]+)/i, Browsers.Opera],
[/coast\/([\w.]+)/i, Browsers.Opera],
[/fxios\/([\w.-]+)/i, Browsers.Firefox],
[/samsungbrowser\/([\w.]+)/i, Browsers.SamsungInternet],
[/headlesschrome(?:\/([\w.]+)| )/i, Browsers.Chrome],
[/wv\).+chrome\/([\w.]+).+edgw\//i, Browsers.Edge],
[/ wv\).+(chrome)\/([\w.]+)/i, Browsers.Chrome],
[/chrome\/([\w.]+) mobile/i, Browsers.Chrome],
[/chrome\/v?([\w.]+)/i, Browsers.Chrome],
[/version\/([\w.,]+) .*mobile(?:\/\w+ | ?)safari/i, Browsers.Safari],
[/iphone .*mobile(?:\/\w+ | ?)safari/i, Browsers.Safari],
[/version\/([\w.,]+) .*safari/i, Browsers.Safari],
[/webkit.+?(?:mobile ?safari|safari)(\/[\w.]+)/i, Browsers.Safari, '1'],
[/(?:mobile|tablet);.*firefox\/([\w.-]+)/i, Browsers.Firefox],
[/mobile vr; rv:([\w.]+)\).+firefox/i, Browsers.Firefox],
[/firefox\/([\w.]+)/i, Browsers.Firefox],
];
var BOT_REGEXP = [
/ daum[ /]/i,
/ deusu\//i,
/(?:^|[^g])news(?!sapphire)/i,
/(?<! (?:channel\/|google\/))google(?!(app|\/google| pixel))/i,
/(?<! cu)bots?(?:\b|_)/i,
/(?= 26)
result.version = version[1];
}
if (Platform.userAgent === USER_AGENT) {
if (typeof parsedFromHighEntropyValuesOS.name !== 'undefined')
result.name = parsedFromHighEntropyValuesOS.name;
if (typeof parsedFromHighEntropyValuesOS.version !== 'undefined')
result.version = parsedFromHighEntropyValuesOS.version;
}
return result;
}
function getEngine() {
var result = { name: Engines.Unknown, version: '' };
for (var i = 0; i < ENGINE_RESOLVER_MAP.length; i++) {
var map = ENGINE_RESOLVER_MAP[i];
var regexp = map[0];
var engine = map[1];
var resolver = map[2];
var matched = Platform.userAgent.match(regexp);
if (matched !== null) {
result.name = engine;
result.version = resolveVersion(matched[1], resolver);
break;
}
}
if (Platform.userAgent === USER_AGENT) {
if (typeof parsedFromHighEntropyValuesEngine.name !== 'undefined')
result.name = parsedFromHighEntropyValuesEngine.name;
if (typeof parsedFromHighEntropyValuesEngine.version !== 'undefined')
result.version = parsedFromHighEntropyValuesEngine.version;
}
return result;
}
function getBrowser() {
var result = { name: Browsers.Unknown, version: '' };
for (var i = 0; i < BROWSER_RESOLVER_MAP.length; i++) {
var map = BROWSER_RESOLVER_MAP[i];
var regexp = map[0];
var browser = map[1];
var resolver = map[2];
var matched = Platform.userAgent.match(regexp);
if (matched !== null) {
result.name = browser;
result.version = resolveVersion(matched[1], resolver);
break;
}
}
if (Platform.userAgent === USER_AGENT) {
if (typeof parsedFromHighEntropyValuesBrowser.name !== 'undefined')
result.name = parsedFromHighEntropyValuesBrowser.name;
if (typeof parsedFromHighEntropyValuesBrowser.version !== 'undefined')
result.version = parsedFromHighEntropyValuesBrowser.version;
}
return result;
}
function getDevice() {
if (Platform.userAgent === USER_AGENT && parsedFromHighEntropyValuesDevice !== null)
return parsedFromHighEntropyValuesDevice;
if (Platform.os.name === OS.iOS || Platform.os.name === OS.Android)
return Devices.Mobile;
if (Platform.os.name === OS.Windows || Platform.os.name === OS.MacOS)
return Devices.Desktop;
return Devices.Unknown;
}
function getIsWebview() {
return /; ?wv|applewebkit(?!.*safari)/i.test(Platform.userAgent);
}
function getIsNode() {
return typeof globalThis.process !== 'undefined' && typeof globalThis.process.versions !== 'undefined' && typeof globalThis.process.versions.node !== 'undefined';
}
function getIsStandalone() {
if (Platform.os.name === OS.iOS)
return 'standalone' in globalThis.navigator && !!globalThis.navigator.standalone;
if (!('matchMedia' in globalThis))
return false;
return globalThis.matchMedia('(display-mode: standalone)').matches;
}
function getIsBot() {
for (var i = 0; i < BOT_REGEXP.length; i++)
if (BOT_REGEXP[i].test(Platform.userAgent))
return true;
return false;
}
function parseFromHighEntropyValues() {
if (typeof globalThis.navigator !== 'undefined' && typeof globalThis.navigator.userAgentData !== 'undefined' && typeof globalThis.navigator.userAgentData.getHighEntropyValues !== 'undefined') {
globalThis.navigator.userAgentData.getHighEntropyValues(['brands', 'fullVersionList', 'mobile', 'model', 'platform', 'platformVersion', 'architecture', 'formFactors', 'bitness', 'uaFullVersion', 'wow64'])
.then(function (result) {
try {
var brands = result.fullVersionList || result.brands || [];
var platformVersion = result.platformVersion;
var platform = result.platform;
var browserName = Platform.browser.name;
var prevBrandName = null;
for (var i = 0; i < brands.length; i++) {
var brand = normalizeBrand(brands[i]);
var brandVersion = brand.version;
var brandName = brand.brand;
if (/not.a.brand/i.test(brandName))
continue;
if (prevBrandName === null || (/Chrom/.test(prevBrandName) && brandName !== 'Chromium') || (prevBrandName === 'Edge' && /WebView2/.test(brandName))) {
brandName = HIGH_ENTROPY_BRAND_NAME_MAP[brandName] || brandName;
prevBrandName = browserName;
if (prevBrandName === null || /Chrom/.test(prevBrandName) || !/Chrom/.test(brandName)) {
browserName = brandName;
if (browserName === 'Chrome' || browserName === 'Chrome WebView' || browserName === 'Chrome Headless')
parsedFromHighEntropyValuesBrowser.name = Browsers.Chrome;
else if (browserName === 'Edge' || browserName === 'Edge WebView2')
parsedFromHighEntropyValuesBrowser.name = Browsers.Edge;
else if (browserName === 'Opera Mobi')
parsedFromHighEntropyValuesBrowser.name = Browsers.Opera;
parsedFromHighEntropyValuesBrowser.version = brandVersion;
}
prevBrandName = brandName;
}
if (brandName === 'Chromium')
parsedFromHighEntropyValuesEngine.version = brandVersion;
}
if (typeof platformVersion === 'string') {
if (Platform.os.name === OS.Windows)
parsedFromHighEntropyValuesOS.version = parseInt(platformVersion.split('.')[0], 10) >= 13 ? '11' : '10';
else
parsedFromHighEntropyValuesOS.version = platformVersion;
}
if (typeof platform === 'string') {
if (/android/i.test(platform))
parsedFromHighEntropyValuesOS.name = OS.Android;
else if (/ios|iphone|ipad/i.test(platform))
parsedFromHighEntropyValuesOS.name = OS.iOS;
else if (/windows|win32/i.test(platform))
parsedFromHighEntropyValuesOS.name = OS.Windows;
else if (/macos|macintel/i.test(platform))
parsedFromHighEntropyValuesOS.name = OS.MacOS;
}
if (result.mobile === true)
parsedFromHighEntropyValuesDevice = Devices.Mobile;
}
catch (_) {
}
});
}
}
parseFromHighEntropyValues();
return Platform;
}));