@metamask/onboarding
Advanced tools
Comparing version 0.3.0 to 0.4.0
var MetamaskOnboarding = (function () { | ||
'use strict'; | ||
'use strict'; | ||
// NOTE: this list must be up-to-date with browsers listed in | ||
// test/acceptance/useragentstrings.yml | ||
const BROWSER_ALIASES_MAP = { | ||
'Amazon Silk': 'amazon_silk', | ||
'Android Browser': 'android', | ||
Bada: 'bada', | ||
BlackBerry: 'blackberry', | ||
Chrome: 'chrome', | ||
Chromium: 'chromium', | ||
Epiphany: 'epiphany', | ||
Firefox: 'firefox', | ||
Focus: 'focus', | ||
Generic: 'generic', | ||
Googlebot: 'googlebot', | ||
'Internet Explorer': 'ie', | ||
'K-Meleon': 'k_meleon', | ||
Maxthon: 'maxthon', | ||
'Microsoft Edge': 'edge', | ||
'MZ Browser': 'mz', | ||
'NAVER Whale Browser': 'naver', | ||
Opera: 'opera', | ||
'Opera Coast': 'opera_coast', | ||
PhantomJS: 'phantomjs', | ||
Puffin: 'puffin', | ||
QupZilla: 'qupzilla', | ||
Safari: 'safari', | ||
Sailfish: 'sailfish', | ||
'Samsung Internet for Android': 'samsung_internet', | ||
SeaMonkey: 'seamonkey', | ||
Sleipnir: 'sleipnir', | ||
Swing: 'swing', | ||
Tizen: 'tizen', | ||
'UC Browser': 'uc', | ||
Vivaldi: 'vivaldi', | ||
'WebOS Browser': 'webos', | ||
WeChat: 'wechat', | ||
'Yandex Browser': 'yandex', | ||
Roku: 'roku', | ||
}; | ||
/*! ***************************************************************************** | ||
Copyright (c) Microsoft Corporation. | ||
const BROWSER_MAP = { | ||
amazon_silk: 'Amazon Silk', | ||
android: 'Android Browser', | ||
bada: 'Bada', | ||
blackberry: 'BlackBerry', | ||
chrome: 'Chrome', | ||
chromium: 'Chromium', | ||
epiphany: 'Epiphany', | ||
firefox: 'Firefox', | ||
focus: 'Focus', | ||
generic: 'Generic', | ||
googlebot: 'Googlebot', | ||
ie: 'Internet Explorer', | ||
k_meleon: 'K-Meleon', | ||
maxthon: 'Maxthon', | ||
edge: 'Microsoft Edge', | ||
mz: 'MZ Browser', | ||
naver: 'NAVER Whale Browser', | ||
opera: 'Opera', | ||
opera_coast: 'Opera Coast', | ||
phantomjs: 'PhantomJS', | ||
puffin: 'Puffin', | ||
qupzilla: 'QupZilla', | ||
safari: 'Safari', | ||
sailfish: 'Sailfish', | ||
samsung_internet: 'Samsung Internet for Android', | ||
seamonkey: 'SeaMonkey', | ||
sleipnir: 'Sleipnir', | ||
swing: 'Swing', | ||
tizen: 'Tizen', | ||
uc: 'UC Browser', | ||
vivaldi: 'Vivaldi', | ||
webos: 'WebOS Browser', | ||
wechat: 'WeChat', | ||
yandex: 'Yandex Browser', | ||
}; | ||
Permission to use, copy, modify, and/or distribute this software for any | ||
purpose with or without fee is hereby granted. | ||
const PLATFORMS_MAP = { | ||
tablet: 'tablet', | ||
mobile: 'mobile', | ||
desktop: 'desktop', | ||
tv: 'tv', | ||
}; | ||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | ||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY | ||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | ||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | ||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
PERFORMANCE OF THIS SOFTWARE. | ||
***************************************************************************** */ | ||
const OS_MAP = { | ||
WindowsPhone: 'Windows Phone', | ||
Windows: 'Windows', | ||
MacOS: 'macOS', | ||
iOS: 'iOS', | ||
Android: 'Android', | ||
WebOS: 'WebOS', | ||
BlackBerry: 'BlackBerry', | ||
Bada: 'Bada', | ||
Tizen: 'Tizen', | ||
Linux: 'Linux', | ||
ChromeOS: 'Chrome OS', | ||
PlayStation4: 'PlayStation 4', | ||
Roku: 'Roku', | ||
}; | ||
const ENGINE_MAP = { | ||
EdgeHTML: 'EdgeHTML', | ||
Blink: 'Blink', | ||
Trident: 'Trident', | ||
Presto: 'Presto', | ||
Gecko: 'Gecko', | ||
WebKit: 'WebKit', | ||
}; | ||
class Utils { | ||
/** | ||
* Get first matched item for a string | ||
* @param {RegExp} regexp | ||
* @param {String} ua | ||
* @return {Array|{index: number, input: string}|*|boolean|string} | ||
*/ | ||
static getFirstMatch(regexp, ua) { | ||
const match = ua.match(regexp); | ||
return (match && match.length > 0 && match[1]) || ''; | ||
function __awaiter(thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
} | ||
/** | ||
* Get second matched item for a string | ||
* @param regexp | ||
* @param {String} ua | ||
* @return {Array|{index: number, input: string}|*|boolean|string} | ||
*/ | ||
static getSecondMatch(regexp, ua) { | ||
const match = ua.match(regexp); | ||
return (match && match.length > 1 && match[2]) || ''; | ||
} | ||
/** | ||
* Match a regexp and return a constant or undefined | ||
* @param {RegExp} regexp | ||
* @param {String} ua | ||
* @param {*} _const Any const that will be returned if regexp matches the string | ||
* @return {*} | ||
*/ | ||
static matchAndReturnConst(regexp, ua, _const) { | ||
if (regexp.test(ua)) { | ||
return _const; | ||
} | ||
return void (0); | ||
} | ||
static getWindowsVersionName(version) { | ||
switch (version) { | ||
case 'NT': return 'NT'; | ||
case 'XP': return 'XP'; | ||
case 'NT 5.0': return '2000'; | ||
case 'NT 5.1': return 'XP'; | ||
case 'NT 5.2': return '2003'; | ||
case 'NT 6.0': return 'Vista'; | ||
case 'NT 6.1': return '7'; | ||
case 'NT 6.2': return '8'; | ||
case 'NT 6.3': return '8.1'; | ||
case 'NT 10.0': return '10'; | ||
default: return undefined; | ||
} | ||
} | ||
/** | ||
* Get macOS version name | ||
* 10.5 - Leopard | ||
* 10.6 - Snow Leopard | ||
* 10.7 - Lion | ||
* 10.8 - Mountain Lion | ||
* 10.9 - Mavericks | ||
* 10.10 - Yosemite | ||
* 10.11 - El Capitan | ||
* 10.12 - Sierra | ||
* 10.13 - High Sierra | ||
* 10.14 - Mojave | ||
* 10.15 - Catalina | ||
* | ||
* @example | ||
* getMacOSVersionName("10.14") // 'Mojave' | ||
* | ||
* @param {string} version | ||
* @return {string} versionName | ||
*/ | ||
static getMacOSVersionName(version) { | ||
const v = version.split('.').splice(0, 2).map(s => parseInt(s, 10) || 0); | ||
v.push(0); | ||
if (v[0] !== 10) return undefined; | ||
switch (v[1]) { | ||
case 5: return 'Leopard'; | ||
case 6: return 'Snow Leopard'; | ||
case 7: return 'Lion'; | ||
case 8: return 'Mountain Lion'; | ||
case 9: return 'Mavericks'; | ||
case 10: return 'Yosemite'; | ||
case 11: return 'El Capitan'; | ||
case 12: return 'Sierra'; | ||
case 13: return 'High Sierra'; | ||
case 14: return 'Mojave'; | ||
case 15: return 'Catalina'; | ||
default: return undefined; | ||
} | ||
} | ||
/** | ||
* Get Android version name | ||
* 1.5 - Cupcake | ||
* 1.6 - Donut | ||
* 2.0 - Eclair | ||
* 2.1 - Eclair | ||
* 2.2 - Froyo | ||
* 2.x - Gingerbread | ||
* 3.x - Honeycomb | ||
* 4.0 - Ice Cream Sandwich | ||
* 4.1 - Jelly Bean | ||
* 4.4 - KitKat | ||
* 5.x - Lollipop | ||
* 6.x - Marshmallow | ||
* 7.x - Nougat | ||
* 8.x - Oreo | ||
* 9.x - Pie | ||
* | ||
* @example | ||
* getAndroidVersionName("7.0") // 'Nougat' | ||
* | ||
* @param {string} version | ||
* @return {string} versionName | ||
*/ | ||
static getAndroidVersionName(version) { | ||
const v = version.split('.').splice(0, 2).map(s => parseInt(s, 10) || 0); | ||
v.push(0); | ||
if (v[0] === 1 && v[1] < 5) return undefined; | ||
if (v[0] === 1 && v[1] < 6) return 'Cupcake'; | ||
if (v[0] === 1 && v[1] >= 6) return 'Donut'; | ||
if (v[0] === 2 && v[1] < 2) return 'Eclair'; | ||
if (v[0] === 2 && v[1] === 2) return 'Froyo'; | ||
if (v[0] === 2 && v[1] > 2) return 'Gingerbread'; | ||
if (v[0] === 3) return 'Honeycomb'; | ||
if (v[0] === 4 && v[1] < 1) return 'Ice Cream Sandwich'; | ||
if (v[0] === 4 && v[1] < 4) return 'Jelly Bean'; | ||
if (v[0] === 4 && v[1] >= 4) return 'KitKat'; | ||
if (v[0] === 5) return 'Lollipop'; | ||
if (v[0] === 6) return 'Marshmallow'; | ||
if (v[0] === 7) return 'Nougat'; | ||
if (v[0] === 8) return 'Oreo'; | ||
if (v[0] === 9) return 'Pie'; | ||
return undefined; | ||
} | ||
/** | ||
* Get version precisions count | ||
* | ||
* @example | ||
* getVersionPrecision("1.10.3") // 3 | ||
* | ||
* @param {string} version | ||
* @return {number} | ||
*/ | ||
static getVersionPrecision(version) { | ||
return version.split('.').length; | ||
} | ||
/** | ||
* Calculate browser version weight | ||
* | ||
* @example | ||
* compareVersions('1.10.2.1', '1.8.2.1.90') // 1 | ||
* compareVersions('1.010.2.1', '1.09.2.1.90'); // 1 | ||
* compareVersions('1.10.2.1', '1.10.2.1'); // 0 | ||
* compareVersions('1.10.2.1', '1.0800.2'); // -1 | ||
* compareVersions('1.10.2.1', '1.10', true); // 0 | ||
* | ||
* @param {String} versionA versions versions to compare | ||
* @param {String} versionB versions versions to compare | ||
* @param {boolean} [isLoose] enable loose comparison | ||
* @return {Number} comparison result: -1 when versionA is lower, | ||
* 1 when versionA is bigger, 0 when both equal | ||
*/ | ||
/* eslint consistent-return: 1 */ | ||
static compareVersions(versionA, versionB, isLoose = false) { | ||
// 1) get common precision for both versions, for example for "10.0" and "9" it should be 2 | ||
const versionAPrecision = Utils.getVersionPrecision(versionA); | ||
const versionBPrecision = Utils.getVersionPrecision(versionB); | ||
let precision = Math.max(versionAPrecision, versionBPrecision); | ||
let lastPrecision = 0; | ||
const chunks = Utils.map([versionA, versionB], (version) => { | ||
const delta = precision - Utils.getVersionPrecision(version); | ||
// 2) "9" -> "9.0" (for precision = 2) | ||
const _version = version + new Array(delta + 1).join('.0'); | ||
// 3) "9.0" -> ["000000000"", "000000009"] | ||
return Utils.map(_version.split('.'), chunk => new Array(20 - chunk.length).join('0') + chunk).reverse(); | ||
}); | ||
// adjust precision for loose comparison | ||
if (isLoose) { | ||
lastPrecision = precision - Math.min(versionAPrecision, versionBPrecision); | ||
} | ||
// iterate in reverse order by reversed chunks array | ||
precision -= 1; | ||
while (precision >= lastPrecision) { | ||
// 4) compare: "000000009" > "000000010" = false (but "9" > "10" = true) | ||
if (chunks[0][precision] > chunks[1][precision]) { | ||
return 1; | ||
function __generator(thisArg, body) { | ||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; | ||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; | ||
function verb(n) { return function (v) { return step([n, v]); }; } | ||
function step(op) { | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
if (y = 0, t) op = [op[0] & 2, t.value]; | ||
switch (op[0]) { | ||
case 0: case 1: t = op; break; | ||
case 4: _.label++; return { value: op[1], done: false }; | ||
case 5: _.label++; y = op[1]; op = [0]; continue; | ||
case 7: op = _.ops.pop(); _.trys.pop(); continue; | ||
default: | ||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } | ||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } | ||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } | ||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } | ||
if (t[2]) _.ops.pop(); | ||
_.trys.pop(); continue; | ||
} | ||
op = body.call(thisArg, _); | ||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } | ||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; | ||
} | ||
if (chunks[0][precision] === chunks[1][precision]) { | ||
if (precision === lastPrecision) { | ||
// all version chunks are same | ||
return 0; | ||
} | ||
precision -= 1; | ||
} else if (chunks[0][precision] < chunks[1][precision]) { | ||
return -1; | ||
} | ||
} | ||
} | ||
/** | ||
* Array::map polyfill | ||
* | ||
* @param {Array} arr | ||
* @param {Function} iterator | ||
* @return {Array} | ||
*/ | ||
static map(arr, iterator) { | ||
const result = []; | ||
let i; | ||
if (Array.prototype.map) { | ||
return Array.prototype.map.call(arr, iterator); | ||
} | ||
for (i = 0; i < arr.length; i += 1) { | ||
result.push(iterator(arr[i])); | ||
} | ||
return result; | ||
} | ||
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; | ||
/** | ||
* Get short version/alias for a browser name | ||
* | ||
* @example | ||
* getBrowserAlias('Microsoft Edge') // edge | ||
* | ||
* @param {string} browserName | ||
* @return {string} | ||
*/ | ||
static getBrowserAlias(browserName) { | ||
return BROWSER_ALIASES_MAP[browserName]; | ||
function unwrapExports (x) { | ||
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; | ||
} | ||
/** | ||
* Get short version/alias for a browser name | ||
* | ||
* @example | ||
* getBrowserAlias('edge') // Microsoft Edge | ||
* | ||
* @param {string} browserName | ||
* @return {string} | ||
*/ | ||
static getBrowserTypeByAlias(browserAlia) { | ||
return BROWSER_MAP[browserAlia] || ''; | ||
function createCommonjsModule(fn, module) { | ||
return module = { exports: {} }, fn(module, module.exports), module.exports; | ||
} | ||
} | ||
/** | ||
* Browsers' descriptors | ||
* | ||
* The idea of descriptors is simple. You should know about them two simple things: | ||
* 1. Every descriptor has a method or property called `test` and a `describe` method. | ||
* 2. Order of descriptors is important. | ||
* | ||
* More details: | ||
* 1. Method or property `test` serves as a way to detect whether the UA string | ||
* matches some certain browser or not. The `describe` method helps to make a result | ||
* object with params that show some browser-specific things: name, version, etc. | ||
* 2. Order of descriptors is important because a Parser goes through them one by one | ||
* in course. For example, if you insert Chrome's descriptor as the first one, | ||
* more then a half of browsers will be described as Chrome, because they will pass | ||
* the Chrome descriptor's test. | ||
* | ||
* Descriptor's `test` could be a property with an array of RegExps, where every RegExp | ||
* will be applied to a UA string to test it whether it matches or not. | ||
* If a descriptor has two or more regexps in the `test` array it tests them one by one | ||
* with a logical sum operation. Parser stops if it has found any RegExp that matches the UA. | ||
* | ||
* Or `test` could be a method. In that case it gets a Parser instance and should | ||
* return true/false to get the Parser know if this browser descriptor matches the UA or not. | ||
*/ | ||
var es5 = createCommonjsModule(function (module, exports) { | ||
!function(e,t){module.exports=t();}(commonjsGlobal,function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n});},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0});},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=90)}({17:function(e,t,r){t.__esModule=!0,t.default=void 0;var n=r(18),i=function(){function e(){}return e.getFirstMatch=function(e,t){var r=t.match(e);return r&&r.length>0&&r[1]||""},e.getSecondMatch=function(e,t){var r=t.match(e);return r&&r.length>1&&r[2]||""},e.matchAndReturnConst=function(e,t,r){if(e.test(t))return r},e.getWindowsVersionName=function(e){switch(e){case"NT":return "NT";case"XP":return "XP";case"NT 5.0":return "2000";case"NT 5.1":return "XP";case"NT 5.2":return "2003";case"NT 6.0":return "Vista";case"NT 6.1":return "7";case"NT 6.2":return "8";case"NT 6.3":return "8.1";case"NT 10.0":return "10";default:return}},e.getMacOSVersionName=function(e){var t=e.split(".").splice(0,2).map(function(e){return parseInt(e,10)||0});if(t.push(0),10===t[0])switch(t[1]){case 5:return "Leopard";case 6:return "Snow Leopard";case 7:return "Lion";case 8:return "Mountain Lion";case 9:return "Mavericks";case 10:return "Yosemite";case 11:return "El Capitan";case 12:return "Sierra";case 13:return "High Sierra";case 14:return "Mojave";case 15:return "Catalina";default:return}},e.getAndroidVersionName=function(e){var t=e.split(".").splice(0,2).map(function(e){return parseInt(e,10)||0});if(t.push(0),!(1===t[0]&&t[1]<5))return 1===t[0]&&t[1]<6?"Cupcake":1===t[0]&&t[1]>=6?"Donut":2===t[0]&&t[1]<2?"Eclair":2===t[0]&&2===t[1]?"Froyo":2===t[0]&&t[1]>2?"Gingerbread":3===t[0]?"Honeycomb":4===t[0]&&t[1]<1?"Ice Cream Sandwich":4===t[0]&&t[1]<4?"Jelly Bean":4===t[0]&&t[1]>=4?"KitKat":5===t[0]?"Lollipop":6===t[0]?"Marshmallow":7===t[0]?"Nougat":8===t[0]?"Oreo":9===t[0]?"Pie":void 0},e.getVersionPrecision=function(e){return e.split(".").length},e.compareVersions=function(t,r,n){void 0===n&&(n=!1);var i=e.getVersionPrecision(t),s=e.getVersionPrecision(r),a=Math.max(i,s),o=0,u=e.map([t,r],function(t){var r=a-e.getVersionPrecision(t),n=t+new Array(r+1).join(".0");return e.map(n.split("."),function(e){return new Array(20-e.length).join("0")+e}).reverse()});for(n&&(o=a-Math.min(i,s)),a-=1;a>=o;){if(u[0][a]>u[1][a])return 1;if(u[0][a]===u[1][a]){if(a===o)return 0;a-=1;}else if(u[0][a]<u[1][a])return -1}},e.map=function(e,t){var r,n=[];if(Array.prototype.map)return Array.prototype.map.call(e,t);for(r=0;r<e.length;r+=1)n.push(t(e[r]));return n},e.getBrowserAlias=function(e){return n.BROWSER_ALIASES_MAP[e]},e.getBrowserTypeByAlias=function(e){return n.BROWSER_MAP[e]||""},e}();t.default=i,e.exports=t.default;},18:function(e,t,r){t.__esModule=!0,t.ENGINE_MAP=t.OS_MAP=t.PLATFORMS_MAP=t.BROWSER_MAP=t.BROWSER_ALIASES_MAP=void 0;t.BROWSER_ALIASES_MAP={"Amazon Silk":"amazon_silk","Android Browser":"android",Bada:"bada",BlackBerry:"blackberry",Chrome:"chrome",Chromium:"chromium",Epiphany:"epiphany",Firefox:"firefox",Focus:"focus",Generic:"generic",Googlebot:"googlebot","Internet Explorer":"ie","K-Meleon":"k_meleon",Maxthon:"maxthon","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver",Opera:"opera","Opera Coast":"opera_coast",PhantomJS:"phantomjs",Puffin:"puffin",QupZilla:"qupzilla",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SeaMonkey:"seamonkey",Sleipnir:"sleipnir",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat","Yandex Browser":"yandex",Roku:"roku"};t.BROWSER_MAP={amazon_silk:"Amazon Silk",android:"Android Browser",bada:"Bada",blackberry:"BlackBerry",chrome:"Chrome",chromium:"Chromium",epiphany:"Epiphany",firefox:"Firefox",focus:"Focus",generic:"Generic",googlebot:"Googlebot",ie:"Internet Explorer",k_meleon:"K-Meleon",maxthon:"Maxthon",edge:"Microsoft Edge",mz:"MZ Browser",naver:"NAVER Whale Browser",opera:"Opera",opera_coast:"Opera Coast",phantomjs:"PhantomJS",puffin:"Puffin",qupzilla:"QupZilla",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",sleipnir:"Sleipnir",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yandex:"Yandex Browser"};t.PLATFORMS_MAP={tablet:"tablet",mobile:"mobile",desktop:"desktop",tv:"tv"};t.OS_MAP={WindowsPhone:"Windows Phone",Windows:"Windows",MacOS:"macOS",iOS:"iOS",Android:"Android",WebOS:"WebOS",BlackBerry:"BlackBerry",Bada:"Bada",Tizen:"Tizen",Linux:"Linux",ChromeOS:"Chrome OS",PlayStation4:"PlayStation 4",Roku:"Roku"};t.ENGINE_MAP={EdgeHTML:"EdgeHTML",Blink:"Blink",Trident:"Trident",Presto:"Presto",Gecko:"Gecko",WebKit:"WebKit"};},90:function(e,t,r){t.__esModule=!0,t.default=void 0;var n,i=(n=r(91))&&n.__esModule?n:{default:n},s=r(18);function a(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n);}}var o=function(){function e(){}var t,r,n;return e.getParser=function(e,t){if(void 0===t&&(t=!1),"string"!=typeof e)throw new Error("UserAgent should be a string");return new i.default(e,t)},e.parse=function(e){return new i.default(e).getResult()},t=e,n=[{key:"BROWSER_MAP",get:function(){return s.BROWSER_MAP}},{key:"ENGINE_MAP",get:function(){return s.ENGINE_MAP}},{key:"OS_MAP",get:function(){return s.OS_MAP}},{key:"PLATFORMS_MAP",get:function(){return s.PLATFORMS_MAP}}],(r=null)&&a(t.prototype,r),n&&a(t,n),e}();t.default=o,e.exports=t.default;},91:function(e,t,r){t.__esModule=!0,t.default=void 0;var n=u(r(92)),i=u(r(93)),s=u(r(94)),a=u(r(95)),o=u(r(17));function u(e){return e&&e.__esModule?e:{default:e}}var d=function(){function e(e,t){if(void 0===t&&(t=!1),null==e||""===e)throw new Error("UserAgent parameter can't be empty");this._ua=e,this.parsedResult={},!0!==t&&this.parse();}var t=e.prototype;return t.getUA=function(){return this._ua},t.test=function(e){return e.test(this._ua)},t.parseBrowser=function(){var e=this;this.parsedResult.browser={};var t=n.default.find(function(t){if("function"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some(function(t){return e.test(t)});throw new Error("Browser's test function is not valid")});return t&&(this.parsedResult.browser=t.describe(this.getUA())),this.parsedResult.browser},t.getBrowser=function(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()},t.getBrowserName=function(e){return e?String(this.getBrowser().name).toLowerCase()||"":this.getBrowser().name||""},t.getBrowserVersion=function(){return this.getBrowser().version},t.getOS=function(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()},t.parseOS=function(){var e=this;this.parsedResult.os={};var t=i.default.find(function(t){if("function"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some(function(t){return e.test(t)});throw new Error("Browser's test function is not valid")});return t&&(this.parsedResult.os=t.describe(this.getUA())),this.parsedResult.os},t.getOSName=function(e){var t=this.getOS().name;return e?String(t).toLowerCase()||"":t||""},t.getOSVersion=function(){return this.getOS().version},t.getPlatform=function(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()},t.getPlatformType=function(e){void 0===e&&(e=!1);var t=this.getPlatform().type;return e?String(t).toLowerCase()||"":t||""},t.parsePlatform=function(){var e=this;this.parsedResult.platform={};var t=s.default.find(function(t){if("function"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some(function(t){return e.test(t)});throw new Error("Browser's test function is not valid")});return t&&(this.parsedResult.platform=t.describe(this.getUA())),this.parsedResult.platform},t.getEngine=function(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()},t.getEngineName=function(e){return e?String(this.getEngine().name).toLowerCase()||"":this.getEngine().name||""},t.parseEngine=function(){var e=this;this.parsedResult.engine={};var t=a.default.find(function(t){if("function"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some(function(t){return e.test(t)});throw new Error("Browser's test function is not valid")});return t&&(this.parsedResult.engine=t.describe(this.getUA())),this.parsedResult.engine},t.parse=function(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this},t.getResult=function(){return Object.assign({},this.parsedResult)},t.satisfies=function(e){var t=this,r={},n=0,i={},s=0;if(Object.keys(e).forEach(function(t){var a=e[t];"string"==typeof a?(i[t]=a,s+=1):"object"==typeof a&&(r[t]=a,n+=1);}),n>0){var a=Object.keys(r),o=a.find(function(e){return t.isOS(e)});if(o){var u=this.satisfies(r[o]);if(void 0!==u)return u}var d=a.find(function(e){return t.isPlatform(e)});if(d){var c=this.satisfies(r[d]);if(void 0!==c)return c}}if(s>0){var f=Object.keys(i).find(function(e){return t.isBrowser(e,!0)});if(void 0!==f)return this.compareVersion(i[f])}},t.isBrowser=function(e,t){void 0===t&&(t=!1);var r=this.getBrowserName().toLowerCase(),n=e.toLowerCase(),i=o.default.getBrowserTypeByAlias(n);return t&&i&&(n=i.toLowerCase()),n===r},t.compareVersion=function(e){var t=[0],r=e,n=!1,i=this.getBrowserVersion();if("string"==typeof i)return ">"===e[0]||"<"===e[0]?(r=e.substr(1),"="===e[1]?(n=!0,r=e.substr(2)):t=[],">"===e[0]?t.push(1):t.push(-1)):"="===e[0]?r=e.substr(1):"~"===e[0]&&(n=!0,r=e.substr(1)),t.indexOf(o.default.compareVersions(i,r,n))>-1},t.isOS=function(e){return this.getOSName(!0)===String(e).toLowerCase()},t.isPlatform=function(e){return this.getPlatformType(!0)===String(e).toLowerCase()},t.isEngine=function(e){return this.getEngineName(!0)===String(e).toLowerCase()},t.is=function(e){return this.isBrowser(e)||this.isOS(e)||this.isPlatform(e)},t.some=function(e){var t=this;return void 0===e&&(e=[]),e.some(function(e){return t.is(e)})},e}();t.default=d,e.exports=t.default;},92:function(e,t,r){t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n};var s=/version\/(\d+(\.?_?\d+)+)/i,a=[{test:[/googlebot/i],describe:function(e){var t={name:"Googlebot"},r=i.default.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/opera/i],describe:function(e){var t={name:"Opera"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:opera)[\s\/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/opr\/|opios/i],describe:function(e){var t={name:"Opera"},r=i.default.getFirstMatch(/(?:opr|opios)[\s\/](\S+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/SamsungBrowser/i],describe:function(e){var t={name:"Samsung Internet for Android"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:SamsungBrowser)[\s\/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Whale/i],describe:function(e){var t={name:"NAVER Whale Browser"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:whale)[\s\/](\d+(?:\.\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MZBrowser/i],describe:function(e){var t={name:"MZ Browser"},r=i.default.getFirstMatch(/(?:MZBrowser)[\s\/](\d+(?:\.\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/focus/i],describe:function(e){var t={name:"Focus"},r=i.default.getFirstMatch(/(?:focus)[\s\/](\d+(?:\.\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/swing/i],describe:function(e){var t={name:"Swing"},r=i.default.getFirstMatch(/(?:swing)[\s\/](\d+(?:\.\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/coast/i],describe:function(e){var t={name:"Opera Coast"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:coast)[\s\/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/yabrowser/i],describe:function(e){var t={name:"Yandex Browser"},r=i.default.getFirstMatch(/(?:yabrowser)[\s\/](\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/ucbrowser/i],describe:function(e){var t={name:"UC Browser"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:ucbrowser)[\s\/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Maxthon|mxios/i],describe:function(e){var t={name:"Maxthon"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:Maxthon|mxios)[\s\/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/epiphany/i],describe:function(e){var t={name:"Epiphany"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:epiphany)[\s\/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/puffin/i],describe:function(e){var t={name:"Puffin"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:puffin)[\s\/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sleipnir/i],describe:function(e){var t={name:"Sleipnir"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:sleipnir)[\s\/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/k-meleon/i],describe:function(e){var t={name:"K-Meleon"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/(?:k-meleon)[\s\/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/micromessenger/i],describe:function(e){var t={name:"WeChat"},r=i.default.getFirstMatch(/(?:micromessenger)[\s\/](\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/msie|trident/i],describe:function(e){var t={name:"Internet Explorer"},r=i.default.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/\sedg\//i],describe:function(e){var t={name:"Microsoft Edge"},r=i.default.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/edg([ea]|ios)/i],describe:function(e){var t={name:"Microsoft Edge"},r=i.default.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/vivaldi/i],describe:function(e){var t={name:"Vivaldi"},r=i.default.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/seamonkey/i],describe:function(e){var t={name:"SeaMonkey"},r=i.default.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sailfish/i],describe:function(e){var t={name:"Sailfish"},r=i.default.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,e);return r&&(t.version=r),t}},{test:[/silk/i],describe:function(e){var t={name:"Amazon Silk"},r=i.default.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/phantom/i],describe:function(e){var t={name:"PhantomJS"},r=i.default.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/slimerjs/i],describe:function(e){var t={name:"SlimerJS"},r=i.default.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(e){var t={name:"BlackBerry"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t={name:"WebOS Browser"},r=i.default.getFirstMatch(s,e)||i.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/bada/i],describe:function(e){var t={name:"Bada"},r=i.default.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/tizen/i],describe:function(e){var t={name:"Tizen"},r=i.default.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/qupzilla/i],describe:function(e){var t={name:"QupZilla"},r=i.default.getFirstMatch(/(?:qupzilla)[\s\/](\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/firefox|iceweasel|fxios/i],describe:function(e){var t={name:"Firefox"},r=i.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s\/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/chromium/i],describe:function(e){var t={name:"Chromium"},r=i.default.getFirstMatch(/(?:chromium)[\s\/](\d+(\.?_?\d+)+)/i,e)||i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/chrome|crios|crmo/i],describe:function(e){var t={name:"Chrome"},r=i.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t={name:"Android Browser"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/playstation 4/i],describe:function(e){var t={name:"PlayStation 4"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/safari|applewebkit/i],describe:function(e){var t={name:"Safari"},r=i.default.getFirstMatch(s,e);return r&&(t.version=r),t}},{test:[/.*/i],describe:function(e){var t=-1!==e.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return {name:i.default.getFirstMatch(t,e),version:i.default.getSecondMatch(t,e)}}}];t.default=a,e.exports=t.default;},93:function(e,t,r){t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var a=[{test:[/Roku\/DVP/],describe:function(e){var t=i.default.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,e);return {name:s.OS_MAP.Roku,version:t}}},{test:[/windows phone/i],describe:function(e){var t=i.default.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,e);return {name:s.OS_MAP.WindowsPhone,version:t}}},{test:[/windows/i],describe:function(e){var t=i.default.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,e),r=i.default.getWindowsVersionName(t);return {name:s.OS_MAP.Windows,version:t,versionName:r}}},{test:[/macintosh/i],describe:function(e){var t=i.default.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,e).replace(/[_\s]/g,"."),r=i.default.getMacOSVersionName(t),n={name:s.OS_MAP.MacOS,version:t};return r&&(n.versionName=r),n}},{test:[/(ipod|iphone|ipad)/i],describe:function(e){var t=i.default.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,e).replace(/[_\s]/g,".");return {name:s.OS_MAP.iOS,version:t}}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t=i.default.getFirstMatch(/android[\s\/-](\d+(\.\d+)*)/i,e),r=i.default.getAndroidVersionName(t),n={name:s.OS_MAP.Android,version:t};return r&&(n.versionName=r),n}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t=i.default.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,e),r={name:s.OS_MAP.WebOS};return t&&t.length&&(r.version=t),r}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(e){var t=i.default.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,e)||i.default.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,e)||i.default.getFirstMatch(/\bbb(\d+)/i,e);return {name:s.OS_MAP.BlackBerry,version:t}}},{test:[/bada/i],describe:function(e){var t=i.default.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,e);return {name:s.OS_MAP.Bada,version:t}}},{test:[/tizen/i],describe:function(e){var t=i.default.getFirstMatch(/tizen[\/\s](\d+(\.\d+)*)/i,e);return {name:s.OS_MAP.Tizen,version:t}}},{test:[/linux/i],describe:function(){return {name:s.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return {name:s.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(e){var t=i.default.getFirstMatch(/PlayStation 4[\/\s](\d+(\.\d+)*)/i,e);return {name:s.OS_MAP.PlayStation4,version:t}}}];t.default=a,e.exports=t.default;},94:function(e,t,r){t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var a=[{test:[/googlebot/i],describe:function(){return {type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe:function(e){var t=i.default.getFirstMatch(/(can-l01)/i,e)&&"Nova",r={type:s.PLATFORMS_MAP.mobile,vendor:"Huawei"};return t&&(r.model=t),r}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:function(){return {type:s.PLATFORMS_MAP.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe:function(){return {type:s.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe:function(){return {type:s.PLATFORMS_MAP.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe:function(){return {type:s.PLATFORMS_MAP.tablet,vendor:"Amazon"}}},{test:[/tablet/i],describe:function(){return {type:s.PLATFORMS_MAP.tablet}}},{test:function(e){var t=e.test(/ipod|iphone/i),r=e.test(/like (ipod|iphone)/i);return t&&!r},describe:function(e){var t=i.default.getFirstMatch(/(ipod|iphone)/i,e);return {type:s.PLATFORMS_MAP.mobile,vendor:"Apple",model:t}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return {type:s.PLATFORMS_MAP.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe:function(){return {type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return "blackberry"===e.getBrowserName(!0)},describe:function(){return {type:s.PLATFORMS_MAP.mobile,vendor:"BlackBerry"}}},{test:function(e){return "bada"===e.getBrowserName(!0)},describe:function(){return {type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return "windows phone"===e.getBrowserName()},describe:function(){return {type:s.PLATFORMS_MAP.mobile,vendor:"Microsoft"}}},{test:function(e){var t=Number(String(e.getOSVersion()).split(".")[0]);return "android"===e.getOSName(!0)&&t>=3},describe:function(){return {type:s.PLATFORMS_MAP.tablet}}},{test:function(e){return "android"===e.getOSName(!0)},describe:function(){return {type:s.PLATFORMS_MAP.mobile}}},{test:function(e){return "macos"===e.getOSName(!0)},describe:function(){return {type:s.PLATFORMS_MAP.desktop,vendor:"Apple"}}},{test:function(e){return "windows"===e.getOSName(!0)},describe:function(){return {type:s.PLATFORMS_MAP.desktop}}},{test:function(e){return "linux"===e.getOSName(!0)},describe:function(){return {type:s.PLATFORMS_MAP.desktop}}},{test:function(e){return "playstation 4"===e.getOSName(!0)},describe:function(){return {type:s.PLATFORMS_MAP.tv}}},{test:function(e){return "roku"===e.getOSName(!0)},describe:function(){return {type:s.PLATFORMS_MAP.tv}}}];t.default=a,e.exports=t.default;},95:function(e,t,r){t.__esModule=!0,t.default=void 0;var n,i=(n=r(17))&&n.__esModule?n:{default:n},s=r(18);var a=[{test:function(e){return "microsoft edge"===e.getBrowserName(!0)},describe:function(e){if(/\sedg\//i.test(e))return {name:s.ENGINE_MAP.Blink};var t=i.default.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,e);return {name:s.ENGINE_MAP.EdgeHTML,version:t}}},{test:[/trident/i],describe:function(e){var t={name:s.ENGINE_MAP.Trident},r=i.default.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){return e.test(/presto/i)},describe:function(e){var t={name:s.ENGINE_MAP.Presto},r=i.default.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=e.test(/gecko/i),r=e.test(/like gecko/i);return t&&!r},describe:function(e){var t={name:s.ENGINE_MAP.Gecko},r=i.default.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(apple)?webkit\/537\.36/i],describe:function(){return {name:s.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(e){var t={name:s.ENGINE_MAP.WebKit},r=i.default.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}}];t.default=a,e.exports=t.default;}})}); | ||
}); | ||
const commonVersionIdentifier = /version\/(\d+(\.?_?\d+)+)/i; | ||
unwrapExports(es5); | ||
var es5_1 = es5.parse; | ||
var es5_2 = es5.bowser; | ||
const browsersList = [ | ||
/* Googlebot */ | ||
{ | ||
test: [/googlebot/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Googlebot', | ||
}; | ||
const version = Utils.getFirstMatch(/googlebot\/(\d+(\.\d+))/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); | ||
if (version) { | ||
browser.version = version; | ||
var ONBOARDING_STATE = { | ||
INSTALLED: 'INSTALLED', | ||
NOT_INSTALLED: 'NOT_INSTALLED', | ||
REGISTERED: 'REGISTERED', | ||
REGISTERING: 'REGISTERING', | ||
RELOADING: 'RELOADING', | ||
}; | ||
var EXTENSION_DOWNLOAD_URL = { | ||
CHROME: 'https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn', | ||
FIREFOX: 'https://addons.mozilla.org/en-US/firefox/addon/ether-metamask/', | ||
DEFAULT: 'https://metamask.io', | ||
}; | ||
var FORWARDER_MODE = { | ||
INJECT: 'INJECT', | ||
OPEN_TAB: 'OPEN_TAB', | ||
}; | ||
// sessionStorage key | ||
var REGISTRATION_IN_PROGRESS = 'REGISTRATION_IN_PROGRESS'; | ||
// forwarder iframe id | ||
var FORWARDER_ID = 'FORWARDER_ID'; | ||
var Onboarding = /** @class */ (function () { | ||
function Onboarding(_a) { | ||
var _b = _a === void 0 ? {} : _a, _c = _b.forwarderOrigin, forwarderOrigin = _c === void 0 ? 'https://fwd.metamask.io' : _c, _d = _b.forwarderMode, forwarderMode = _d === void 0 ? FORWARDER_MODE.INJECT : _d; | ||
this.forwarderOrigin = forwarderOrigin; | ||
this.forwarderMode = forwarderMode; | ||
this.state = Onboarding.isMetaMaskInstalled() ? | ||
ONBOARDING_STATE.INSTALLED : | ||
ONBOARDING_STATE.NOT_INSTALLED; | ||
var browser = Onboarding._detectBrowser(); | ||
if (browser) { | ||
this.downloadUrl = EXTENSION_DOWNLOAD_URL[browser]; | ||
} | ||
else { | ||
this.downloadUrl = EXTENSION_DOWNLOAD_URL.DEFAULT; | ||
} | ||
this._onMessage = this._onMessage.bind(this); | ||
this._onMessageFromForwarder = this._onMessageFromForwarder.bind(this); | ||
this._openForwarder = this._openForwarder.bind(this); | ||
this._openDownloadPage = this._openDownloadPage.bind(this); | ||
this.startOnboarding = this.startOnboarding.bind(this); | ||
this.stopOnboarding = this.stopOnboarding.bind(this); | ||
window.addEventListener('message', this._onMessage); | ||
if (forwarderMode === FORWARDER_MODE.INJECT && sessionStorage.getItem(REGISTRATION_IN_PROGRESS) === 'true') { | ||
Onboarding._injectForwarder(this.forwarderOrigin); | ||
} | ||
} | ||
return browser; | ||
}, | ||
}, | ||
/* Opera < 13.0 */ | ||
{ | ||
test: [/opera/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Opera', | ||
Onboarding.prototype._onMessage = function (event) { | ||
if (event.origin !== this.forwarderOrigin) { | ||
// Ignoring non-forwarder message | ||
return undefined; | ||
} | ||
if (event.data.type === 'metamask:reload') { | ||
return this._onMessageFromForwarder(event); | ||
} | ||
console.debug("Unknown message from '" + event.origin + "' with data " + JSON.stringify(event.data)); | ||
return undefined; | ||
}; | ||
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
/* Opera > 13.0 */ | ||
{ | ||
test: [/opr\/|opios/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Opera', | ||
Onboarding.prototype._onMessageFromForwarder = function (event) { | ||
var _a; | ||
return __awaiter(this, void 0, void 0, function () { | ||
return __generator(this, function (_b) { | ||
switch (_b.label) { | ||
case 0: | ||
if (!(this.state === ONBOARDING_STATE.RELOADING)) return [3 /*break*/, 1]; | ||
console.debug('Ignoring message while reloading'); | ||
return [3 /*break*/, 5]; | ||
case 1: | ||
if (!(this.state === ONBOARDING_STATE.NOT_INSTALLED)) return [3 /*break*/, 2]; | ||
console.debug('Reloading now to register with MetaMask'); | ||
this.state = ONBOARDING_STATE.RELOADING; | ||
return [2 /*return*/, location.reload()]; | ||
case 2: | ||
if (!(this.state === ONBOARDING_STATE.INSTALLED)) return [3 /*break*/, 4]; | ||
console.debug('Registering with MetaMask'); | ||
this.state = ONBOARDING_STATE.REGISTERING; | ||
return [4 /*yield*/, Onboarding._register()]; | ||
case 3: | ||
_b.sent(); | ||
this.state = ONBOARDING_STATE.REGISTERED; | ||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment | ||
// @ts-ignore | ||
(_a = event.source) === null || _a === void 0 ? void 0 : _a.postMessage({ type: 'metamask:registrationCompleted' }, event.origin); | ||
this.stopOnboarding(); | ||
return [3 /*break*/, 5]; | ||
case 4: | ||
if (this.state === ONBOARDING_STATE.REGISTERING) { | ||
console.debug('Already registering - ignoring reload message'); | ||
} | ||
else if (this.state === ONBOARDING_STATE.REGISTERED) { | ||
console.debug('Already registered - ignoring reload message'); | ||
} | ||
else { | ||
throw new Error("Unknown state: '" + this.state + "'"); | ||
} | ||
_b.label = 5; | ||
case 5: return [2 /*return*/, undefined]; | ||
} | ||
}); | ||
}); | ||
}; | ||
const version = Utils.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/SamsungBrowser/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Samsung Internet for Android', | ||
/** | ||
* Starts onboarding by opening the MetaMask download page and the Onboarding forwarder | ||
*/ | ||
Onboarding.prototype.startOnboarding = function () { | ||
sessionStorage.setItem(REGISTRATION_IN_PROGRESS, 'true'); | ||
this._openDownloadPage(); | ||
this._openForwarder(); | ||
}; | ||
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/Whale/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'NAVER Whale Browser', | ||
/** | ||
* Stops onboarding registration, including removing the injected forwarder (if any) | ||
* | ||
* Typically this function is not necessary, but it can be useful for cases where | ||
* onboarding completes before the forwarder has registered. | ||
*/ | ||
Onboarding.prototype.stopOnboarding = function () { | ||
if (sessionStorage.getItem(REGISTRATION_IN_PROGRESS) === 'true') { | ||
if (this.forwarderMode === FORWARDER_MODE.INJECT) { | ||
console.debug('Removing forwarder'); | ||
Onboarding._removeForwarder(); | ||
} | ||
sessionStorage.setItem(REGISTRATION_IN_PROGRESS, 'false'); | ||
} | ||
}; | ||
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/MZBrowser/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'MZ Browser', | ||
Onboarding.prototype._openForwarder = function () { | ||
if (this.forwarderMode === FORWARDER_MODE.OPEN_TAB) { | ||
window.open(this.forwarderOrigin, '_blank'); | ||
} | ||
else { | ||
Onboarding._injectForwarder(this.forwarderOrigin); | ||
} | ||
}; | ||
const version = Utils.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/focus/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Focus', | ||
Onboarding.prototype._openDownloadPage = function () { | ||
window.open(this.downloadUrl, '_blank'); | ||
}; | ||
const version = Utils.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/swing/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Swing', | ||
}; | ||
const version = Utils.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/coast/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Opera Coast', | ||
}; | ||
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/yabrowser/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Yandex Browser', | ||
}; | ||
const version = Utils.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/ucbrowser/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'UC Browser', | ||
}; | ||
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/Maxthon|mxios/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Maxthon', | ||
}; | ||
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/epiphany/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Epiphany', | ||
}; | ||
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/puffin/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Puffin', | ||
}; | ||
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/sleipnir/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Sleipnir', | ||
}; | ||
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/k-meleon/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'K-Meleon', | ||
}; | ||
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/micromessenger/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'WeChat', | ||
}; | ||
const version = Utils.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/msie|trident/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Internet Explorer', | ||
}; | ||
const version = Utils.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/\sedg\//i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Microsoft Edge', | ||
}; | ||
const version = Utils.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/edg([ea]|ios)/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Microsoft Edge', | ||
}; | ||
const version = Utils.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/vivaldi/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Vivaldi', | ||
}; | ||
const version = Utils.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/seamonkey/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'SeaMonkey', | ||
}; | ||
const version = Utils.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/sailfish/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Sailfish', | ||
}; | ||
const version = Utils.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/silk/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Amazon Silk', | ||
}; | ||
const version = Utils.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/phantom/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'PhantomJS', | ||
}; | ||
const version = Utils.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/slimerjs/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'SlimerJS', | ||
}; | ||
const version = Utils.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/blackberry|\bbb\d+/i, /rim\stablet/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'BlackBerry', | ||
}; | ||
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/(web|hpw)[o0]s/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'WebOS Browser', | ||
}; | ||
const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/bada/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Bada', | ||
}; | ||
const version = Utils.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/tizen/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Tizen', | ||
}; | ||
const version = Utils.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/qupzilla/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'QupZilla', | ||
}; | ||
const version = Utils.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/firefox|iceweasel|fxios/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Firefox', | ||
}; | ||
const version = Utils.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/chromium/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Chromium', | ||
}; | ||
const version = Utils.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
{ | ||
test: [/chrome|crios|crmo/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Chrome', | ||
}; | ||
const version = Utils.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
/* Android Browser */ | ||
{ | ||
test(parser) { | ||
const notLikeAndroid = !parser.test(/like android/i); | ||
const butAndroid = parser.test(/android/i); | ||
return notLikeAndroid && butAndroid; | ||
}, | ||
describe(ua) { | ||
const browser = { | ||
name: 'Android Browser', | ||
}; | ||
const version = Utils.getFirstMatch(commonVersionIdentifier, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
/* PlayStation 4 */ | ||
{ | ||
test: [/playstation 4/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'PlayStation 4', | ||
}; | ||
const version = Utils.getFirstMatch(commonVersionIdentifier, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
/* Safari */ | ||
{ | ||
test: [/safari|applewebkit/i], | ||
describe(ua) { | ||
const browser = { | ||
name: 'Safari', | ||
}; | ||
const version = Utils.getFirstMatch(commonVersionIdentifier, ua); | ||
if (version) { | ||
browser.version = version; | ||
} | ||
return browser; | ||
}, | ||
}, | ||
/* Something else */ | ||
{ | ||
test: [/.*/i], | ||
describe(ua) { | ||
/* Here we try to make sure that there are explicit details about the device | ||
* in order to decide what regexp exactly we want to apply | ||
* (as there is a specific decision based on that conclusion) | ||
/** | ||
* Checks whether the MetaMask extension is installed | ||
*/ | ||
const regexpWithoutDeviceSpec = /^(.*)\/(.*) /; | ||
const regexpWithDeviceSpec = /^(.*)\/(.*)[ \t]\((.*)/; | ||
const hasDeviceSpec = ua.search('\\(') !== -1; | ||
const regexp = hasDeviceSpec ? regexpWithDeviceSpec : regexpWithoutDeviceSpec; | ||
return { | ||
name: Utils.getFirstMatch(regexp, ua), | ||
version: Utils.getSecondMatch(regexp, ua), | ||
Onboarding.isMetaMaskInstalled = function () { | ||
return Boolean(window.ethereum && window.ethereum.isMetaMask); | ||
}; | ||
}, | ||
}, | ||
]; | ||
var osParsersList = [ | ||
/* Roku */ | ||
{ | ||
test: [/Roku\/DVP/], | ||
describe(ua) { | ||
const version = Utils.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i, ua); | ||
return { | ||
name: OS_MAP.Roku, | ||
version, | ||
Onboarding._register = function () { | ||
return window.ethereum.request({ | ||
method: 'wallet_registerOnboarding', | ||
}); | ||
}; | ||
}, | ||
}, | ||
/* Windows Phone */ | ||
{ | ||
test: [/windows phone/i], | ||
describe(ua) { | ||
const version = Utils.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i, ua); | ||
return { | ||
name: OS_MAP.WindowsPhone, | ||
version, | ||
Onboarding._injectForwarder = function (forwarderOrigin) { | ||
var container = document.body; | ||
var iframe = document.createElement('iframe'); | ||
iframe.setAttribute('height', '0'); | ||
iframe.setAttribute('width', '0'); | ||
iframe.setAttribute('style', 'display: none;'); | ||
iframe.setAttribute('src', forwarderOrigin); | ||
iframe.setAttribute('id', FORWARDER_ID); | ||
container.insertBefore(iframe, container.children[0]); | ||
}; | ||
}, | ||
}, | ||
/* Windows */ | ||
{ | ||
test: [/windows/i], | ||
describe(ua) { | ||
const version = Utils.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i, ua); | ||
const versionName = Utils.getWindowsVersionName(version); | ||
return { | ||
name: OS_MAP.Windows, | ||
version, | ||
versionName, | ||
Onboarding._removeForwarder = function () { | ||
var _a; | ||
(_a = document.getElementById(FORWARDER_ID)) === null || _a === void 0 ? void 0 : _a.remove(); | ||
}; | ||
}, | ||
}, | ||
/* macOS */ | ||
{ | ||
test: [/macintosh/i], | ||
describe(ua) { | ||
const version = Utils.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i, ua).replace(/[_\s]/g, '.'); | ||
const versionName = Utils.getMacOSVersionName(version); | ||
const os = { | ||
name: OS_MAP.MacOS, | ||
version, | ||
Onboarding._detectBrowser = function () { | ||
var browserInfo = es5_1(window.navigator.userAgent); | ||
if (browserInfo.browser.name === 'Firefox') { | ||
return 'FIREFOX'; | ||
} | ||
else if (['Chrome', 'Chromium'].includes(browserInfo.browser.name || '')) { | ||
return 'CHROME'; | ||
} | ||
return null; | ||
}; | ||
if (versionName) { | ||
os.versionName = versionName; | ||
} | ||
return os; | ||
}, | ||
}, | ||
return Onboarding; | ||
}()); | ||
/* iOS */ | ||
{ | ||
test: [/(ipod|iphone|ipad)/i], | ||
describe(ua) { | ||
const version = Utils.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i, ua).replace(/[_\s]/g, '.'); | ||
return Onboarding; | ||
return { | ||
name: OS_MAP.iOS, | ||
version, | ||
}; | ||
}, | ||
}, | ||
/* Android */ | ||
{ | ||
test(parser) { | ||
const notLikeAndroid = !parser.test(/like android/i); | ||
const butAndroid = parser.test(/android/i); | ||
return notLikeAndroid && butAndroid; | ||
}, | ||
describe(ua) { | ||
const version = Utils.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i, ua); | ||
const versionName = Utils.getAndroidVersionName(version); | ||
const os = { | ||
name: OS_MAP.Android, | ||
version, | ||
}; | ||
if (versionName) { | ||
os.versionName = versionName; | ||
} | ||
return os; | ||
}, | ||
}, | ||
/* WebOS */ | ||
{ | ||
test: [/(web|hpw)[o0]s/i], | ||
describe(ua) { | ||
const version = Utils.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i, ua); | ||
const os = { | ||
name: OS_MAP.WebOS, | ||
}; | ||
if (version && version.length) { | ||
os.version = version; | ||
} | ||
return os; | ||
}, | ||
}, | ||
/* BlackBerry */ | ||
{ | ||
test: [/blackberry|\bbb\d+/i, /rim\stablet/i], | ||
describe(ua) { | ||
const version = Utils.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i, ua) | ||
|| Utils.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i, ua) | ||
|| Utils.getFirstMatch(/\bbb(\d+)/i, ua); | ||
return { | ||
name: OS_MAP.BlackBerry, | ||
version, | ||
}; | ||
}, | ||
}, | ||
/* Bada */ | ||
{ | ||
test: [/bada/i], | ||
describe(ua) { | ||
const version = Utils.getFirstMatch(/bada\/(\d+(\.\d+)*)/i, ua); | ||
return { | ||
name: OS_MAP.Bada, | ||
version, | ||
}; | ||
}, | ||
}, | ||
/* Tizen */ | ||
{ | ||
test: [/tizen/i], | ||
describe(ua) { | ||
const version = Utils.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i, ua); | ||
return { | ||
name: OS_MAP.Tizen, | ||
version, | ||
}; | ||
}, | ||
}, | ||
/* Linux */ | ||
{ | ||
test: [/linux/i], | ||
describe() { | ||
return { | ||
name: OS_MAP.Linux, | ||
}; | ||
}, | ||
}, | ||
/* Chrome OS */ | ||
{ | ||
test: [/CrOS/], | ||
describe() { | ||
return { | ||
name: OS_MAP.ChromeOS, | ||
}; | ||
}, | ||
}, | ||
/* Playstation 4 */ | ||
{ | ||
test: [/PlayStation 4/], | ||
describe(ua) { | ||
const version = Utils.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i, ua); | ||
return { | ||
name: OS_MAP.PlayStation4, | ||
version, | ||
}; | ||
}, | ||
}, | ||
]; | ||
/* | ||
* Tablets go first since usually they have more specific | ||
* signs to detect. | ||
*/ | ||
var platformParsersList = [ | ||
/* Googlebot */ | ||
{ | ||
test: [/googlebot/i], | ||
describe() { | ||
return { | ||
type: 'bot', | ||
vendor: 'Google', | ||
}; | ||
}, | ||
}, | ||
/* Huawei */ | ||
{ | ||
test: [/huawei/i], | ||
describe(ua) { | ||
const model = Utils.getFirstMatch(/(can-l01)/i, ua) && 'Nova'; | ||
const platform = { | ||
type: PLATFORMS_MAP.mobile, | ||
vendor: 'Huawei', | ||
}; | ||
if (model) { | ||
platform.model = model; | ||
} | ||
return platform; | ||
}, | ||
}, | ||
/* Nexus Tablet */ | ||
{ | ||
test: [/nexus\s*(?:7|8|9|10).*/i], | ||
describe() { | ||
return { | ||
type: PLATFORMS_MAP.tablet, | ||
vendor: 'Nexus', | ||
}; | ||
}, | ||
}, | ||
/* iPad */ | ||
{ | ||
test: [/ipad/i], | ||
describe() { | ||
return { | ||
type: PLATFORMS_MAP.tablet, | ||
vendor: 'Apple', | ||
model: 'iPad', | ||
}; | ||
}, | ||
}, | ||
/* Amazon Kindle Fire */ | ||
{ | ||
test: [/kftt build/i], | ||
describe() { | ||
return { | ||
type: PLATFORMS_MAP.tablet, | ||
vendor: 'Amazon', | ||
model: 'Kindle Fire HD 7', | ||
}; | ||
}, | ||
}, | ||
/* Another Amazon Tablet with Silk */ | ||
{ | ||
test: [/silk/i], | ||
describe() { | ||
return { | ||
type: PLATFORMS_MAP.tablet, | ||
vendor: 'Amazon', | ||
}; | ||
}, | ||
}, | ||
/* Tablet */ | ||
{ | ||
test: [/tablet/i], | ||
describe() { | ||
return { | ||
type: PLATFORMS_MAP.tablet, | ||
}; | ||
}, | ||
}, | ||
/* iPod/iPhone */ | ||
{ | ||
test(parser) { | ||
const iDevice = parser.test(/ipod|iphone/i); | ||
const likeIDevice = parser.test(/like (ipod|iphone)/i); | ||
return iDevice && !likeIDevice; | ||
}, | ||
describe(ua) { | ||
const model = Utils.getFirstMatch(/(ipod|iphone)/i, ua); | ||
return { | ||
type: PLATFORMS_MAP.mobile, | ||
vendor: 'Apple', | ||
model, | ||
}; | ||
}, | ||
}, | ||
/* Nexus Mobile */ | ||
{ | ||
test: [/nexus\s*[0-6].*/i, /galaxy nexus/i], | ||
describe() { | ||
return { | ||
type: PLATFORMS_MAP.mobile, | ||
vendor: 'Nexus', | ||
}; | ||
}, | ||
}, | ||
/* Mobile */ | ||
{ | ||
test: [/[^-]mobi/i], | ||
describe() { | ||
return { | ||
type: PLATFORMS_MAP.mobile, | ||
}; | ||
}, | ||
}, | ||
/* BlackBerry */ | ||
{ | ||
test(parser) { | ||
return parser.getBrowserName(true) === 'blackberry'; | ||
}, | ||
describe() { | ||
return { | ||
type: PLATFORMS_MAP.mobile, | ||
vendor: 'BlackBerry', | ||
}; | ||
}, | ||
}, | ||
/* Bada */ | ||
{ | ||
test(parser) { | ||
return parser.getBrowserName(true) === 'bada'; | ||
}, | ||
describe() { | ||
return { | ||
type: PLATFORMS_MAP.mobile, | ||
}; | ||
}, | ||
}, | ||
/* Windows Phone */ | ||
{ | ||
test(parser) { | ||
return parser.getBrowserName() === 'windows phone'; | ||
}, | ||
describe() { | ||
return { | ||
type: PLATFORMS_MAP.mobile, | ||
vendor: 'Microsoft', | ||
}; | ||
}, | ||
}, | ||
/* Android Tablet */ | ||
{ | ||
test(parser) { | ||
const osMajorVersion = Number(String(parser.getOSVersion()).split('.')[0]); | ||
return parser.getOSName(true) === 'android' && (osMajorVersion >= 3); | ||
}, | ||
describe() { | ||
return { | ||
type: PLATFORMS_MAP.tablet, | ||
}; | ||
}, | ||
}, | ||
/* Android Mobile */ | ||
{ | ||
test(parser) { | ||
return parser.getOSName(true) === 'android'; | ||
}, | ||
describe() { | ||
return { | ||
type: PLATFORMS_MAP.mobile, | ||
}; | ||
}, | ||
}, | ||
/* desktop */ | ||
{ | ||
test(parser) { | ||
return parser.getOSName(true) === 'macos'; | ||
}, | ||
describe() { | ||
return { | ||
type: PLATFORMS_MAP.desktop, | ||
vendor: 'Apple', | ||
}; | ||
}, | ||
}, | ||
/* Windows */ | ||
{ | ||
test(parser) { | ||
return parser.getOSName(true) === 'windows'; | ||
}, | ||
describe() { | ||
return { | ||
type: PLATFORMS_MAP.desktop, | ||
}; | ||
}, | ||
}, | ||
/* Linux */ | ||
{ | ||
test(parser) { | ||
return parser.getOSName(true) === 'linux'; | ||
}, | ||
describe() { | ||
return { | ||
type: PLATFORMS_MAP.desktop, | ||
}; | ||
}, | ||
}, | ||
/* PlayStation 4 */ | ||
{ | ||
test(parser) { | ||
return parser.getOSName(true) === 'playstation 4'; | ||
}, | ||
describe() { | ||
return { | ||
type: PLATFORMS_MAP.tv, | ||
}; | ||
}, | ||
}, | ||
/* Roku */ | ||
{ | ||
test(parser) { | ||
return parser.getOSName(true) === 'roku'; | ||
}, | ||
describe() { | ||
return { | ||
type: PLATFORMS_MAP.tv, | ||
}; | ||
}, | ||
}, | ||
]; | ||
/* | ||
* More specific goes first | ||
*/ | ||
var enginesParsersList = [ | ||
/* EdgeHTML */ | ||
{ | ||
test(parser) { | ||
return parser.getBrowserName(true) === 'microsoft edge'; | ||
}, | ||
describe(ua) { | ||
const isBlinkBased = /\sedg\//i.test(ua); | ||
// return blink if it's blink-based one | ||
if (isBlinkBased) { | ||
return { | ||
name: ENGINE_MAP.Blink, | ||
}; | ||
} | ||
// otherwise match the version and return EdgeHTML | ||
const version = Utils.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i, ua); | ||
return { | ||
name: ENGINE_MAP.EdgeHTML, | ||
version, | ||
}; | ||
}, | ||
}, | ||
/* Trident */ | ||
{ | ||
test: [/trident/i], | ||
describe(ua) { | ||
const engine = { | ||
name: ENGINE_MAP.Trident, | ||
}; | ||
const version = Utils.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
engine.version = version; | ||
} | ||
return engine; | ||
}, | ||
}, | ||
/* Presto */ | ||
{ | ||
test(parser) { | ||
return parser.test(/presto/i); | ||
}, | ||
describe(ua) { | ||
const engine = { | ||
name: ENGINE_MAP.Presto, | ||
}; | ||
const version = Utils.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
engine.version = version; | ||
} | ||
return engine; | ||
}, | ||
}, | ||
/* Gecko */ | ||
{ | ||
test(parser) { | ||
const isGecko = parser.test(/gecko/i); | ||
const likeGecko = parser.test(/like gecko/i); | ||
return isGecko && !likeGecko; | ||
}, | ||
describe(ua) { | ||
const engine = { | ||
name: ENGINE_MAP.Gecko, | ||
}; | ||
const version = Utils.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
engine.version = version; | ||
} | ||
return engine; | ||
}, | ||
}, | ||
/* Blink */ | ||
{ | ||
test: [/(apple)?webkit\/537\.36/i], | ||
describe() { | ||
return { | ||
name: ENGINE_MAP.Blink, | ||
}; | ||
}, | ||
}, | ||
/* WebKit */ | ||
{ | ||
test: [/(apple)?webkit/i], | ||
describe(ua) { | ||
const engine = { | ||
name: ENGINE_MAP.WebKit, | ||
}; | ||
const version = Utils.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i, ua); | ||
if (version) { | ||
engine.version = version; | ||
} | ||
return engine; | ||
}, | ||
}, | ||
]; | ||
/** | ||
* The main class that arranges the whole parsing process. | ||
*/ | ||
class Parser { | ||
/** | ||
* Create instance of Parser | ||
* | ||
* @param {String} UA User-Agent string | ||
* @param {Boolean} [skipParsing=false] parser can skip parsing in purpose of performance | ||
* improvements if you need to make a more particular parsing | ||
* like {@link Parser#parseBrowser} or {@link Parser#parsePlatform} | ||
* | ||
* @throw {Error} in case of empty UA String | ||
* | ||
* @constructor | ||
*/ | ||
constructor(UA, skipParsing = false) { | ||
if (UA === void (0) || UA === null || UA === '') { | ||
throw new Error("UserAgent parameter can't be empty"); | ||
} | ||
this._ua = UA; | ||
/** | ||
* @typedef ParsedResult | ||
* @property {Object} browser | ||
* @property {String|undefined} [browser.name] | ||
* Browser name, like `"Chrome"` or `"Internet Explorer"` | ||
* @property {String|undefined} [browser.version] Browser version as a String `"12.01.45334.10"` | ||
* @property {Object} os | ||
* @property {String|undefined} [os.name] OS name, like `"Windows"` or `"macOS"` | ||
* @property {String|undefined} [os.version] OS version, like `"NT 5.1"` or `"10.11.1"` | ||
* @property {String|undefined} [os.versionName] OS name, like `"XP"` or `"High Sierra"` | ||
* @property {Object} platform | ||
* @property {String|undefined} [platform.type] | ||
* platform type, can be either `"desktop"`, `"tablet"` or `"mobile"` | ||
* @property {String|undefined} [platform.vendor] Vendor of the device, | ||
* like `"Apple"` or `"Samsung"` | ||
* @property {String|undefined} [platform.model] Device model, | ||
* like `"iPhone"` or `"Kindle Fire HD 7"` | ||
* @property {Object} engine | ||
* @property {String|undefined} [engine.name] | ||
* Can be any of this: `WebKit`, `Blink`, `Gecko`, `Trident`, `Presto`, `EdgeHTML` | ||
* @property {String|undefined} [engine.version] String version of the engine | ||
*/ | ||
this.parsedResult = {}; | ||
if (skipParsing !== true) { | ||
this.parse(); | ||
} | ||
} | ||
/** | ||
* Get UserAgent string of current Parser instance | ||
* @return {String} User-Agent String of the current <Parser> object | ||
* | ||
* @public | ||
*/ | ||
getUA() { | ||
return this._ua; | ||
} | ||
/** | ||
* Test a UA string for a regexp | ||
* @param {RegExp} regex | ||
* @return {Boolean} | ||
*/ | ||
test(regex) { | ||
return regex.test(this._ua); | ||
} | ||
/** | ||
* Get parsed browser object | ||
* @return {Object} | ||
*/ | ||
parseBrowser() { | ||
this.parsedResult.browser = {}; | ||
const browserDescriptor = browsersList.find((_browser) => { | ||
if (typeof _browser.test === 'function') { | ||
return _browser.test(this); | ||
} | ||
if (_browser.test instanceof Array) { | ||
return _browser.test.some(condition => this.test(condition)); | ||
} | ||
throw new Error("Browser's test function is not valid"); | ||
}); | ||
if (browserDescriptor) { | ||
this.parsedResult.browser = browserDescriptor.describe(this.getUA()); | ||
} | ||
return this.parsedResult.browser; | ||
} | ||
/** | ||
* Get parsed browser object | ||
* @return {Object} | ||
* | ||
* @public | ||
*/ | ||
getBrowser() { | ||
if (this.parsedResult.browser) { | ||
return this.parsedResult.browser; | ||
} | ||
return this.parseBrowser(); | ||
} | ||
/** | ||
* Get browser's name | ||
* @return {String} Browser's name or an empty string | ||
* | ||
* @public | ||
*/ | ||
getBrowserName(toLowerCase) { | ||
if (toLowerCase) { | ||
return String(this.getBrowser().name).toLowerCase() || ''; | ||
} | ||
return this.getBrowser().name || ''; | ||
} | ||
/** | ||
* Get browser's version | ||
* @return {String} version of browser | ||
* | ||
* @public | ||
*/ | ||
getBrowserVersion() { | ||
return this.getBrowser().version; | ||
} | ||
/** | ||
* Get OS | ||
* @return {Object} | ||
* | ||
* @example | ||
* this.getOS(); | ||
* { | ||
* name: 'macOS', | ||
* version: '10.11.12' | ||
* } | ||
*/ | ||
getOS() { | ||
if (this.parsedResult.os) { | ||
return this.parsedResult.os; | ||
} | ||
return this.parseOS(); | ||
} | ||
/** | ||
* Parse OS and save it to this.parsedResult.os | ||
* @return {*|{}} | ||
*/ | ||
parseOS() { | ||
this.parsedResult.os = {}; | ||
const os = osParsersList.find((_os) => { | ||
if (typeof _os.test === 'function') { | ||
return _os.test(this); | ||
} | ||
if (_os.test instanceof Array) { | ||
return _os.test.some(condition => this.test(condition)); | ||
} | ||
throw new Error("Browser's test function is not valid"); | ||
}); | ||
if (os) { | ||
this.parsedResult.os = os.describe(this.getUA()); | ||
} | ||
return this.parsedResult.os; | ||
} | ||
/** | ||
* Get OS name | ||
* @param {Boolean} [toLowerCase] return lower-cased value | ||
* @return {String} name of the OS — macOS, Windows, Linux, etc. | ||
*/ | ||
getOSName(toLowerCase) { | ||
const { name } = this.getOS(); | ||
if (toLowerCase) { | ||
return String(name).toLowerCase() || ''; | ||
} | ||
return name || ''; | ||
} | ||
/** | ||
* Get OS version | ||
* @return {String} full version with dots ('10.11.12', '5.6', etc) | ||
*/ | ||
getOSVersion() { | ||
return this.getOS().version; | ||
} | ||
/** | ||
* Get parsed platform | ||
* @return {{}} | ||
*/ | ||
getPlatform() { | ||
if (this.parsedResult.platform) { | ||
return this.parsedResult.platform; | ||
} | ||
return this.parsePlatform(); | ||
} | ||
/** | ||
* Get platform name | ||
* @param {Boolean} [toLowerCase=false] | ||
* @return {*} | ||
*/ | ||
getPlatformType(toLowerCase = false) { | ||
const { type } = this.getPlatform(); | ||
if (toLowerCase) { | ||
return String(type).toLowerCase() || ''; | ||
} | ||
return type || ''; | ||
} | ||
/** | ||
* Get parsed platform | ||
* @return {{}} | ||
*/ | ||
parsePlatform() { | ||
this.parsedResult.platform = {}; | ||
const platform = platformParsersList.find((_platform) => { | ||
if (typeof _platform.test === 'function') { | ||
return _platform.test(this); | ||
} | ||
if (_platform.test instanceof Array) { | ||
return _platform.test.some(condition => this.test(condition)); | ||
} | ||
throw new Error("Browser's test function is not valid"); | ||
}); | ||
if (platform) { | ||
this.parsedResult.platform = platform.describe(this.getUA()); | ||
} | ||
return this.parsedResult.platform; | ||
} | ||
/** | ||
* Get parsed engine | ||
* @return {{}} | ||
*/ | ||
getEngine() { | ||
if (this.parsedResult.engine) { | ||
return this.parsedResult.engine; | ||
} | ||
return this.parseEngine(); | ||
} | ||
/** | ||
* Get engines's name | ||
* @return {String} Engines's name or an empty string | ||
* | ||
* @public | ||
*/ | ||
getEngineName(toLowerCase) { | ||
if (toLowerCase) { | ||
return String(this.getEngine().name).toLowerCase() || ''; | ||
} | ||
return this.getEngine().name || ''; | ||
} | ||
/** | ||
* Get parsed platform | ||
* @return {{}} | ||
*/ | ||
parseEngine() { | ||
this.parsedResult.engine = {}; | ||
const engine = enginesParsersList.find((_engine) => { | ||
if (typeof _engine.test === 'function') { | ||
return _engine.test(this); | ||
} | ||
if (_engine.test instanceof Array) { | ||
return _engine.test.some(condition => this.test(condition)); | ||
} | ||
throw new Error("Browser's test function is not valid"); | ||
}); | ||
if (engine) { | ||
this.parsedResult.engine = engine.describe(this.getUA()); | ||
} | ||
return this.parsedResult.engine; | ||
} | ||
/** | ||
* Parse full information about the browser | ||
*/ | ||
parse() { | ||
this.parseBrowser(); | ||
this.parseOS(); | ||
this.parsePlatform(); | ||
this.parseEngine(); | ||
return this; | ||
} | ||
/** | ||
* Get parsed result | ||
* @return {ParsedResult} | ||
*/ | ||
getResult() { | ||
return Object.assign({}, this.parsedResult); | ||
} | ||
/** | ||
* Check if parsed browser matches certain conditions | ||
* | ||
* @param {Object} checkTree It's one or two layered object, | ||
* which can include a platform or an OS on the first layer | ||
* and should have browsers specs on the bottom-laying layer | ||
* | ||
* @returns {Boolean|undefined} Whether the browser satisfies the set conditions or not. | ||
* Returns `undefined` when the browser is no described in the checkTree object. | ||
* | ||
* @example | ||
* const browser = Bowser.getParser(window.navigator.userAgent); | ||
* if (browser.satisfies({chrome: '>118.01.1322' })) | ||
* // or with os | ||
* if (browser.satisfies({windows: { chrome: '>118.01.1322' } })) | ||
* // or with platforms | ||
* if (browser.satisfies({desktop: { chrome: '>118.01.1322' } })) | ||
*/ | ||
satisfies(checkTree) { | ||
const platformsAndOSes = {}; | ||
let platformsAndOSCounter = 0; | ||
const browsers = {}; | ||
let browsersCounter = 0; | ||
const allDefinitions = Object.keys(checkTree); | ||
allDefinitions.forEach((key) => { | ||
const currentDefinition = checkTree[key]; | ||
if (typeof currentDefinition === 'string') { | ||
browsers[key] = currentDefinition; | ||
browsersCounter += 1; | ||
} else if (typeof currentDefinition === 'object') { | ||
platformsAndOSes[key] = currentDefinition; | ||
platformsAndOSCounter += 1; | ||
} | ||
}); | ||
if (platformsAndOSCounter > 0) { | ||
const platformsAndOSNames = Object.keys(platformsAndOSes); | ||
const OSMatchingDefinition = platformsAndOSNames.find(name => (this.isOS(name))); | ||
if (OSMatchingDefinition) { | ||
const osResult = this.satisfies(platformsAndOSes[OSMatchingDefinition]); | ||
if (osResult !== void 0) { | ||
return osResult; | ||
} | ||
} | ||
const platformMatchingDefinition = platformsAndOSNames.find(name => (this.isPlatform(name))); | ||
if (platformMatchingDefinition) { | ||
const platformResult = this.satisfies(platformsAndOSes[platformMatchingDefinition]); | ||
if (platformResult !== void 0) { | ||
return platformResult; | ||
} | ||
} | ||
} | ||
if (browsersCounter > 0) { | ||
const browserNames = Object.keys(browsers); | ||
const matchingDefinition = browserNames.find(name => (this.isBrowser(name, true))); | ||
if (matchingDefinition !== void 0) { | ||
return this.compareVersion(browsers[matchingDefinition]); | ||
} | ||
} | ||
return undefined; | ||
} | ||
/** | ||
* Check if the browser name equals the passed string | ||
* @param browserName The string to compare with the browser name | ||
* @param [includingAlias=false] The flag showing whether alias will be included into comparison | ||
* @returns {boolean} | ||
*/ | ||
isBrowser(browserName, includingAlias = false) { | ||
const defaultBrowserName = this.getBrowserName().toLowerCase(); | ||
let browserNameLower = browserName.toLowerCase(); | ||
const alias = Utils.getBrowserTypeByAlias(browserNameLower); | ||
if (includingAlias && alias) { | ||
browserNameLower = alias.toLowerCase(); | ||
} | ||
return browserNameLower === defaultBrowserName; | ||
} | ||
compareVersion(version) { | ||
let expectedResults = [0]; | ||
let comparableVersion = version; | ||
let isLoose = false; | ||
const currentBrowserVersion = this.getBrowserVersion(); | ||
if (typeof currentBrowserVersion !== 'string') { | ||
return void 0; | ||
} | ||
if (version[0] === '>' || version[0] === '<') { | ||
comparableVersion = version.substr(1); | ||
if (version[1] === '=') { | ||
isLoose = true; | ||
comparableVersion = version.substr(2); | ||
} else { | ||
expectedResults = []; | ||
} | ||
if (version[0] === '>') { | ||
expectedResults.push(1); | ||
} else { | ||
expectedResults.push(-1); | ||
} | ||
} else if (version[0] === '=') { | ||
comparableVersion = version.substr(1); | ||
} else if (version[0] === '~') { | ||
isLoose = true; | ||
comparableVersion = version.substr(1); | ||
} | ||
return expectedResults.indexOf( | ||
Utils.compareVersions(currentBrowserVersion, comparableVersion, isLoose), | ||
) > -1; | ||
} | ||
isOS(osName) { | ||
return this.getOSName(true) === String(osName).toLowerCase(); | ||
} | ||
isPlatform(platformType) { | ||
return this.getPlatformType(true) === String(platformType).toLowerCase(); | ||
} | ||
isEngine(engineName) { | ||
return this.getEngineName(true) === String(engineName).toLowerCase(); | ||
} | ||
/** | ||
* Is anything? Check if the browser is called "anything", | ||
* the OS called "anything" or the platform called "anything" | ||
* @param {String} anything | ||
* @returns {Boolean} | ||
*/ | ||
is(anything) { | ||
return this.isBrowser(anything) || this.isOS(anything) || this.isPlatform(anything); | ||
} | ||
/** | ||
* Check if any of the given values satisfies this.is(anything) | ||
* @param {String[]} anythings | ||
* @returns {Boolean} | ||
*/ | ||
some(anythings = []) { | ||
return anythings.some(anything => this.is(anything)); | ||
} | ||
} | ||
/*! | ||
* Bowser - a browser detector | ||
* https://github.com/lancedikson/bowser | ||
* MIT License | (c) Dustin Diaz 2012-2015 | ||
* MIT License | (c) Denis Demchenko 2015-2019 | ||
*/ | ||
/** | ||
* Bowser class. | ||
* Keep it simple as much as it can be. | ||
* It's supposed to work with collections of {@link Parser} instances | ||
* rather then solve one-instance problems. | ||
* All the one-instance stuff is located in Parser class. | ||
* | ||
* @class | ||
* @classdesc Bowser is a static object, that provides an API to the Parsers | ||
* @hideconstructor | ||
*/ | ||
class Bowser { | ||
/** | ||
* Creates a {@link Parser} instance | ||
* | ||
* @param {String} UA UserAgent string | ||
* @param {Boolean} [skipParsing=false] Will make the Parser postpone parsing until you ask it | ||
* explicitly. Same as `skipParsing` for {@link Parser}. | ||
* @returns {Parser} | ||
* @throws {Error} when UA is not a String | ||
* | ||
* @example | ||
* const parser = Bowser.getParser(window.navigator.userAgent); | ||
* const result = parser.getResult(); | ||
*/ | ||
static getParser(UA, skipParsing = false) { | ||
if (typeof UA !== 'string') { | ||
throw new Error('UserAgent should be a string'); | ||
} | ||
return new Parser(UA, skipParsing); | ||
} | ||
/** | ||
* Creates a {@link Parser} instance and runs {@link Parser.getResult} immediately | ||
* | ||
* @param UA | ||
* @return {ParsedResult} | ||
* | ||
* @example | ||
* const result = Bowser.parse(window.navigator.userAgent); | ||
*/ | ||
static parse(UA) { | ||
return (new Parser(UA)).getResult(); | ||
} | ||
static get BROWSER_MAP() { | ||
return BROWSER_MAP; | ||
} | ||
static get ENGINE_MAP() { | ||
return ENGINE_MAP; | ||
} | ||
static get OS_MAP() { | ||
return OS_MAP; | ||
} | ||
static get PLATFORMS_MAP() { | ||
return PLATFORMS_MAP; | ||
} | ||
} | ||
/** @enum {string} */ | ||
const ONBOARDING_STATE = { | ||
INSTALLED: 'INSTALLED', | ||
NOT_INSTALLED: 'NOT_INSTALLED', | ||
REGISTERED: 'REGISTERED', | ||
REGISTERING: 'REGISTERING', | ||
RELOADING: 'RELOADING', | ||
}; | ||
/** @enum {string} */ | ||
const EXTENSION_DOWNLOAD_URL = { | ||
CHROME: 'https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn', | ||
FIREFOX: 'https://addons.mozilla.org/en-US/firefox/addon/ether-metamask/', | ||
DEFAULT: 'https://metamask.io', | ||
}; | ||
/** @enum {string} */ | ||
const FORWARDER_MODE = { | ||
INJECT: 'INJECT', | ||
OPEN_TAB: 'OPEN_TAB', | ||
}; | ||
// sessionStorage key | ||
const REGISTRATION_IN_PROGRESS = 'REGISTRATION_IN_PROGRESS'; | ||
// forwarder iframe id | ||
const FORWARDER_ID = 'FORWARDER_ID'; | ||
/** | ||
* @typedef {Object} OnboardingOptions - Options for configuring onboarding | ||
* @property {string} [forwarderOrigin] - The origin of the forwarder page | ||
* @property {string} [forwarderMode] - The method used for opening the forwarder ('TAB' or 'INJECT') | ||
*/ | ||
class Onboarding { | ||
/** | ||
* | ||
* @param {OnboardingOptions} [options] - Options for configuring onboarding | ||
*/ | ||
constructor ({ forwarderOrigin = 'https://fwd.metamask.io', forwarderMode = FORWARDER_MODE.INJECT } = {}) { | ||
this.forwarderOrigin = forwarderOrigin; | ||
this.forwarderMode = forwarderMode; | ||
this.state = Onboarding.isMetaMaskInstalled() ? | ||
ONBOARDING_STATE.INSTALLED : | ||
ONBOARDING_STATE.NOT_INSTALLED; | ||
const browser = Onboarding._detectBrowser(); | ||
if (browser) { | ||
this.downloadUrl = EXTENSION_DOWNLOAD_URL[browser]; | ||
} else { | ||
this.downloadUrl = EXTENSION_DOWNLOAD_URL.DEFAULT; | ||
} | ||
this._onMessage = this._onMessage.bind(this); | ||
this._onMessageFromForwarder = this._onMessageFromForwarder.bind(this); | ||
this._openForwarder = this._openForwarder.bind(this); | ||
this._openDownloadPage = this._openDownloadPage.bind(this); | ||
this.startOnboarding = this.startOnboarding.bind(this); | ||
this.stopOnboarding = this.stopOnboarding.bind(this); | ||
window.addEventListener('message', this._onMessage); | ||
if (forwarderMode === FORWARDER_MODE.INJECT && sessionStorage.getItem(REGISTRATION_IN_PROGRESS)) { | ||
Onboarding._injectForwarder(this.forwarderOrigin); | ||
} | ||
} | ||
_onMessage (event) { | ||
if (event.origin !== this.forwarderOrigin) { | ||
// Ignoring non-forwarder message | ||
return undefined | ||
} | ||
if (event.data.type === 'metamask:reload') { | ||
return this._onMessageFromForwarder(event) | ||
} | ||
console.debug(`Unknown message from '${event.origin}' with data ${JSON.stringify(event.data)}`); | ||
return undefined | ||
} | ||
async _onMessageFromForwarder (event) { | ||
if (this.state === ONBOARDING_STATE.RELOADING) { | ||
console.debug('Ignoring message while reloading'); | ||
} else if (this.state === ONBOARDING_STATE.NOT_INSTALLED) { | ||
console.debug('Reloading now to register with MetaMask'); | ||
this.state = ONBOARDING_STATE.RELOADING; | ||
return location.reload() | ||
} else if (this.state === ONBOARDING_STATE.INSTALLED) { | ||
console.debug('Registering with MetaMask'); | ||
this.state = ONBOARDING_STATE.REGISTERING; | ||
await Onboarding._register(); | ||
this.state = ONBOARDING_STATE.REGISTERED; | ||
event.source.postMessage({ type: 'metamask:registrationCompleted' }, event.origin); | ||
this.stopOnboarding(); | ||
} else if (this.state === ONBOARDING_STATE.REGISTERING) { | ||
console.debug('Already registering - ignoring reload message'); | ||
} else if (this.state === ONBOARDING_STATE.REGISTERED) { | ||
console.debug('Already registered - ignoring reload message'); | ||
} else { | ||
throw new Error(`Unknown state: '${this.state}'`) | ||
} | ||
return undefined | ||
} | ||
/** | ||
* Starts onboarding by opening the MetaMask download page and the Onboarding forwarder | ||
*/ | ||
startOnboarding () { | ||
sessionStorage.setItem(REGISTRATION_IN_PROGRESS, true); | ||
this._openDownloadPage(); | ||
this._openForwarder(); | ||
} | ||
/** | ||
* Stops onboarding registration, including removing the injected forwarder (if any) | ||
* | ||
* Typically this function is not necessary, but it can be useful for cases where | ||
* onboarding completes before the forwarder has registered. | ||
*/ | ||
stopOnboarding () { | ||
if (sessionStorage.getItem(REGISTRATION_IN_PROGRESS)) { | ||
if (this.forwarderMode === FORWARDER_MODE.INJECT) { | ||
console.debug('Removing forwarder'); | ||
Onboarding._removeForwarder(); | ||
} | ||
sessionStorage.setItem(REGISTRATION_IN_PROGRESS, false); | ||
} | ||
} | ||
_openForwarder () { | ||
if (this.forwarderMode === FORWARDER_MODE.OPEN_TAB) { | ||
window.open(this.forwarderOrigin, '_blank'); | ||
} else { | ||
Onboarding._injectForwarder(this.forwarderOrigin); | ||
} | ||
} | ||
_openDownloadPage () { | ||
window.open(this.downloadUrl, '_blank'); | ||
} | ||
/** | ||
* Checks whether the MetaMask extension is installed | ||
* | ||
* @returns {boolean} - `true` if MetaMask is installed, `false` otherwise. | ||
*/ | ||
static isMetaMaskInstalled () { | ||
return Boolean(window.ethereum && window.ethereum.isMetaMask) | ||
} | ||
static _register () { | ||
return window.ethereum.request({ | ||
method: 'wallet_registerOnboarding', | ||
}) | ||
} | ||
static _injectForwarder (forwarderOrigin) { | ||
const container = document.body; | ||
const iframe = document.createElement('iframe'); | ||
iframe.setAttribute('height', 0); | ||
iframe.setAttribute('width', 0); | ||
iframe.setAttribute('src', forwarderOrigin); | ||
iframe.setAttribute('id', FORWARDER_ID); | ||
container.insertBefore(iframe, container.children[0]); | ||
} | ||
static _removeForwarder () { | ||
document.getElementById(FORWARDER_ID).remove(); | ||
} | ||
static _detectBrowser () { | ||
const browserInfo = Bowser.parse(window.navigator.userAgent); | ||
if (browserInfo.browser.name === 'Firefox') { | ||
return 'FIREFOX' | ||
} else if (['Chrome', 'Chromium'].includes(browserInfo.browser.name)) { | ||
return 'CHROME' | ||
} | ||
return null | ||
} | ||
} | ||
return Onboarding; | ||
}()); |
'use strict'; | ||
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } | ||
var Bowser = require('bowser'); | ||
var Bowser = _interopDefault(require('bowser/src/bowser')); | ||
/*! ***************************************************************************** | ||
Copyright (c) Microsoft Corporation. | ||
/** @enum {string} */ | ||
const ONBOARDING_STATE = { | ||
INSTALLED: 'INSTALLED', | ||
NOT_INSTALLED: 'NOT_INSTALLED', | ||
REGISTERED: 'REGISTERED', | ||
REGISTERING: 'REGISTERING', | ||
RELOADING: 'RELOADING', | ||
}; | ||
Permission to use, copy, modify, and/or distribute this software for any | ||
purpose with or without fee is hereby granted. | ||
/** @enum {string} */ | ||
const EXTENSION_DOWNLOAD_URL = { | ||
CHROME: 'https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn', | ||
FIREFOX: 'https://addons.mozilla.org/en-US/firefox/addon/ether-metamask/', | ||
DEFAULT: 'https://metamask.io', | ||
}; | ||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | ||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY | ||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | ||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | ||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | ||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
PERFORMANCE OF THIS SOFTWARE. | ||
***************************************************************************** */ | ||
/** @enum {string} */ | ||
const FORWARDER_MODE = { | ||
INJECT: 'INJECT', | ||
OPEN_TAB: 'OPEN_TAB', | ||
function __awaiter(thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
} | ||
function __generator(thisArg, body) { | ||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; | ||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; | ||
function verb(n) { return function (v) { return step([n, v]); }; } | ||
function step(op) { | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
if (y = 0, t) op = [op[0] & 2, t.value]; | ||
switch (op[0]) { | ||
case 0: case 1: t = op; break; | ||
case 4: _.label++; return { value: op[1], done: false }; | ||
case 5: _.label++; y = op[1]; op = [0]; continue; | ||
case 7: op = _.ops.pop(); _.trys.pop(); continue; | ||
default: | ||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } | ||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } | ||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } | ||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } | ||
if (t[2]) _.ops.pop(); | ||
_.trys.pop(); continue; | ||
} | ||
op = body.call(thisArg, _); | ||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } | ||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; | ||
} | ||
} | ||
var ONBOARDING_STATE = { | ||
INSTALLED: 'INSTALLED', | ||
NOT_INSTALLED: 'NOT_INSTALLED', | ||
REGISTERED: 'REGISTERED', | ||
REGISTERING: 'REGISTERING', | ||
RELOADING: 'RELOADING', | ||
}; | ||
var EXTENSION_DOWNLOAD_URL = { | ||
CHROME: 'https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn', | ||
FIREFOX: 'https://addons.mozilla.org/en-US/firefox/addon/ether-metamask/', | ||
DEFAULT: 'https://metamask.io', | ||
}; | ||
var FORWARDER_MODE = { | ||
INJECT: 'INJECT', | ||
OPEN_TAB: 'OPEN_TAB', | ||
}; | ||
// sessionStorage key | ||
const REGISTRATION_IN_PROGRESS = 'REGISTRATION_IN_PROGRESS'; | ||
var REGISTRATION_IN_PROGRESS = 'REGISTRATION_IN_PROGRESS'; | ||
// forwarder iframe id | ||
const FORWARDER_ID = 'FORWARDER_ID'; | ||
/** | ||
* @typedef {Object} OnboardingOptions - Options for configuring onboarding | ||
* @property {string} [forwarderOrigin] - The origin of the forwarder page | ||
* @property {string} [forwarderMode] - The method used for opening the forwarder ('TAB' or 'INJECT') | ||
*/ | ||
class Onboarding { | ||
/** | ||
* | ||
* @param {OnboardingOptions} [options] - Options for configuring onboarding | ||
*/ | ||
constructor ({ forwarderOrigin = 'https://fwd.metamask.io', forwarderMode = FORWARDER_MODE.INJECT } = {}) { | ||
this.forwarderOrigin = forwarderOrigin; | ||
this.forwarderMode = forwarderMode; | ||
this.state = Onboarding.isMetaMaskInstalled() ? | ||
ONBOARDING_STATE.INSTALLED : | ||
ONBOARDING_STATE.NOT_INSTALLED; | ||
const browser = Onboarding._detectBrowser(); | ||
if (browser) { | ||
this.downloadUrl = EXTENSION_DOWNLOAD_URL[browser]; | ||
} else { | ||
this.downloadUrl = EXTENSION_DOWNLOAD_URL.DEFAULT; | ||
var FORWARDER_ID = 'FORWARDER_ID'; | ||
var Onboarding = /** @class */ (function () { | ||
function Onboarding(_a) { | ||
var _b = _a === void 0 ? {} : _a, _c = _b.forwarderOrigin, forwarderOrigin = _c === void 0 ? 'https://fwd.metamask.io' : _c, _d = _b.forwarderMode, forwarderMode = _d === void 0 ? FORWARDER_MODE.INJECT : _d; | ||
this.forwarderOrigin = forwarderOrigin; | ||
this.forwarderMode = forwarderMode; | ||
this.state = Onboarding.isMetaMaskInstalled() ? | ||
ONBOARDING_STATE.INSTALLED : | ||
ONBOARDING_STATE.NOT_INSTALLED; | ||
var browser = Onboarding._detectBrowser(); | ||
if (browser) { | ||
this.downloadUrl = EXTENSION_DOWNLOAD_URL[browser]; | ||
} | ||
else { | ||
this.downloadUrl = EXTENSION_DOWNLOAD_URL.DEFAULT; | ||
} | ||
this._onMessage = this._onMessage.bind(this); | ||
this._onMessageFromForwarder = this._onMessageFromForwarder.bind(this); | ||
this._openForwarder = this._openForwarder.bind(this); | ||
this._openDownloadPage = this._openDownloadPage.bind(this); | ||
this.startOnboarding = this.startOnboarding.bind(this); | ||
this.stopOnboarding = this.stopOnboarding.bind(this); | ||
window.addEventListener('message', this._onMessage); | ||
if (forwarderMode === FORWARDER_MODE.INJECT && sessionStorage.getItem(REGISTRATION_IN_PROGRESS) === 'true') { | ||
Onboarding._injectForwarder(this.forwarderOrigin); | ||
} | ||
} | ||
Onboarding.prototype._onMessage = function (event) { | ||
if (event.origin !== this.forwarderOrigin) { | ||
// Ignoring non-forwarder message | ||
return undefined; | ||
} | ||
if (event.data.type === 'metamask:reload') { | ||
return this._onMessageFromForwarder(event); | ||
} | ||
console.debug("Unknown message from '" + event.origin + "' with data " + JSON.stringify(event.data)); | ||
return undefined; | ||
}; | ||
Onboarding.prototype._onMessageFromForwarder = function (event) { | ||
var _a; | ||
return __awaiter(this, void 0, void 0, function () { | ||
return __generator(this, function (_b) { | ||
switch (_b.label) { | ||
case 0: | ||
if (!(this.state === ONBOARDING_STATE.RELOADING)) return [3 /*break*/, 1]; | ||
console.debug('Ignoring message while reloading'); | ||
return [3 /*break*/, 5]; | ||
case 1: | ||
if (!(this.state === ONBOARDING_STATE.NOT_INSTALLED)) return [3 /*break*/, 2]; | ||
console.debug('Reloading now to register with MetaMask'); | ||
this.state = ONBOARDING_STATE.RELOADING; | ||
return [2 /*return*/, location.reload()]; | ||
case 2: | ||
if (!(this.state === ONBOARDING_STATE.INSTALLED)) return [3 /*break*/, 4]; | ||
console.debug('Registering with MetaMask'); | ||
this.state = ONBOARDING_STATE.REGISTERING; | ||
return [4 /*yield*/, Onboarding._register()]; | ||
case 3: | ||
_b.sent(); | ||
this.state = ONBOARDING_STATE.REGISTERED; | ||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment | ||
// @ts-ignore | ||
(_a = event.source) === null || _a === void 0 ? void 0 : _a.postMessage({ type: 'metamask:registrationCompleted' }, event.origin); | ||
this.stopOnboarding(); | ||
return [3 /*break*/, 5]; | ||
case 4: | ||
if (this.state === ONBOARDING_STATE.REGISTERING) { | ||
console.debug('Already registering - ignoring reload message'); | ||
} | ||
else if (this.state === ONBOARDING_STATE.REGISTERED) { | ||
console.debug('Already registered - ignoring reload message'); | ||
} | ||
else { | ||
throw new Error("Unknown state: '" + this.state + "'"); | ||
} | ||
_b.label = 5; | ||
case 5: return [2 /*return*/, undefined]; | ||
} | ||
}); | ||
}); | ||
}; | ||
/** | ||
* Starts onboarding by opening the MetaMask download page and the Onboarding forwarder | ||
*/ | ||
Onboarding.prototype.startOnboarding = function () { | ||
sessionStorage.setItem(REGISTRATION_IN_PROGRESS, 'true'); | ||
this._openDownloadPage(); | ||
this._openForwarder(); | ||
}; | ||
/** | ||
* Stops onboarding registration, including removing the injected forwarder (if any) | ||
* | ||
* Typically this function is not necessary, but it can be useful for cases where | ||
* onboarding completes before the forwarder has registered. | ||
*/ | ||
Onboarding.prototype.stopOnboarding = function () { | ||
if (sessionStorage.getItem(REGISTRATION_IN_PROGRESS) === 'true') { | ||
if (this.forwarderMode === FORWARDER_MODE.INJECT) { | ||
console.debug('Removing forwarder'); | ||
Onboarding._removeForwarder(); | ||
} | ||
sessionStorage.setItem(REGISTRATION_IN_PROGRESS, 'false'); | ||
} | ||
}; | ||
Onboarding.prototype._openForwarder = function () { | ||
if (this.forwarderMode === FORWARDER_MODE.OPEN_TAB) { | ||
window.open(this.forwarderOrigin, '_blank'); | ||
} | ||
else { | ||
Onboarding._injectForwarder(this.forwarderOrigin); | ||
} | ||
}; | ||
Onboarding.prototype._openDownloadPage = function () { | ||
window.open(this.downloadUrl, '_blank'); | ||
}; | ||
/** | ||
* Checks whether the MetaMask extension is installed | ||
*/ | ||
Onboarding.isMetaMaskInstalled = function () { | ||
return Boolean(window.ethereum && window.ethereum.isMetaMask); | ||
}; | ||
Onboarding._register = function () { | ||
return window.ethereum.request({ | ||
method: 'wallet_registerOnboarding', | ||
}); | ||
}; | ||
Onboarding._injectForwarder = function (forwarderOrigin) { | ||
var container = document.body; | ||
var iframe = document.createElement('iframe'); | ||
iframe.setAttribute('height', '0'); | ||
iframe.setAttribute('width', '0'); | ||
iframe.setAttribute('style', 'display: none;'); | ||
iframe.setAttribute('src', forwarderOrigin); | ||
iframe.setAttribute('id', FORWARDER_ID); | ||
container.insertBefore(iframe, container.children[0]); | ||
}; | ||
Onboarding._removeForwarder = function () { | ||
var _a; | ||
(_a = document.getElementById(FORWARDER_ID)) === null || _a === void 0 ? void 0 : _a.remove(); | ||
}; | ||
Onboarding._detectBrowser = function () { | ||
var browserInfo = Bowser.parse(window.navigator.userAgent); | ||
if (browserInfo.browser.name === 'Firefox') { | ||
return 'FIREFOX'; | ||
} | ||
else if (['Chrome', 'Chromium'].includes(browserInfo.browser.name || '')) { | ||
return 'CHROME'; | ||
} | ||
return null; | ||
}; | ||
return Onboarding; | ||
}()); | ||
this._onMessage = this._onMessage.bind(this); | ||
this._onMessageFromForwarder = this._onMessageFromForwarder.bind(this); | ||
this._openForwarder = this._openForwarder.bind(this); | ||
this._openDownloadPage = this._openDownloadPage.bind(this); | ||
this.startOnboarding = this.startOnboarding.bind(this); | ||
this.stopOnboarding = this.stopOnboarding.bind(this); | ||
window.addEventListener('message', this._onMessage); | ||
if (forwarderMode === FORWARDER_MODE.INJECT && sessionStorage.getItem(REGISTRATION_IN_PROGRESS)) { | ||
Onboarding._injectForwarder(this.forwarderOrigin); | ||
} | ||
} | ||
_onMessage (event) { | ||
if (event.origin !== this.forwarderOrigin) { | ||
// Ignoring non-forwarder message | ||
return undefined | ||
} | ||
if (event.data.type === 'metamask:reload') { | ||
return this._onMessageFromForwarder(event) | ||
} | ||
console.debug(`Unknown message from '${event.origin}' with data ${JSON.stringify(event.data)}`); | ||
return undefined | ||
} | ||
async _onMessageFromForwarder (event) { | ||
if (this.state === ONBOARDING_STATE.RELOADING) { | ||
console.debug('Ignoring message while reloading'); | ||
} else if (this.state === ONBOARDING_STATE.NOT_INSTALLED) { | ||
console.debug('Reloading now to register with MetaMask'); | ||
this.state = ONBOARDING_STATE.RELOADING; | ||
return location.reload() | ||
} else if (this.state === ONBOARDING_STATE.INSTALLED) { | ||
console.debug('Registering with MetaMask'); | ||
this.state = ONBOARDING_STATE.REGISTERING; | ||
await Onboarding._register(); | ||
this.state = ONBOARDING_STATE.REGISTERED; | ||
event.source.postMessage({ type: 'metamask:registrationCompleted' }, event.origin); | ||
this.stopOnboarding(); | ||
} else if (this.state === ONBOARDING_STATE.REGISTERING) { | ||
console.debug('Already registering - ignoring reload message'); | ||
} else if (this.state === ONBOARDING_STATE.REGISTERED) { | ||
console.debug('Already registered - ignoring reload message'); | ||
} else { | ||
throw new Error(`Unknown state: '${this.state}'`) | ||
} | ||
return undefined | ||
} | ||
/** | ||
* Starts onboarding by opening the MetaMask download page and the Onboarding forwarder | ||
*/ | ||
startOnboarding () { | ||
sessionStorage.setItem(REGISTRATION_IN_PROGRESS, true); | ||
this._openDownloadPage(); | ||
this._openForwarder(); | ||
} | ||
/** | ||
* Stops onboarding registration, including removing the injected forwarder (if any) | ||
* | ||
* Typically this function is not necessary, but it can be useful for cases where | ||
* onboarding completes before the forwarder has registered. | ||
*/ | ||
stopOnboarding () { | ||
if (sessionStorage.getItem(REGISTRATION_IN_PROGRESS)) { | ||
if (this.forwarderMode === FORWARDER_MODE.INJECT) { | ||
console.debug('Removing forwarder'); | ||
Onboarding._removeForwarder(); | ||
} | ||
sessionStorage.setItem(REGISTRATION_IN_PROGRESS, false); | ||
} | ||
} | ||
_openForwarder () { | ||
if (this.forwarderMode === FORWARDER_MODE.OPEN_TAB) { | ||
window.open(this.forwarderOrigin, '_blank'); | ||
} else { | ||
Onboarding._injectForwarder(this.forwarderOrigin); | ||
} | ||
} | ||
_openDownloadPage () { | ||
window.open(this.downloadUrl, '_blank'); | ||
} | ||
/** | ||
* Checks whether the MetaMask extension is installed | ||
* | ||
* @returns {boolean} - `true` if MetaMask is installed, `false` otherwise. | ||
*/ | ||
static isMetaMaskInstalled () { | ||
return Boolean(window.ethereum && window.ethereum.isMetaMask) | ||
} | ||
static _register () { | ||
return window.ethereum.request({ | ||
method: 'wallet_registerOnboarding', | ||
}) | ||
} | ||
static _injectForwarder (forwarderOrigin) { | ||
const container = document.body; | ||
const iframe = document.createElement('iframe'); | ||
iframe.setAttribute('height', 0); | ||
iframe.setAttribute('width', 0); | ||
iframe.setAttribute('src', forwarderOrigin); | ||
iframe.setAttribute('id', FORWARDER_ID); | ||
container.insertBefore(iframe, container.children[0]); | ||
} | ||
static _removeForwarder () { | ||
document.getElementById(FORWARDER_ID).remove(); | ||
} | ||
static _detectBrowser () { | ||
const browserInfo = Bowser.parse(window.navigator.userAgent); | ||
if (browserInfo.browser.name === 'Firefox') { | ||
return 'FIREFOX' | ||
} else if (['Chrome', 'Chromium'].includes(browserInfo.browser.name)) { | ||
return 'CHROME' | ||
} | ||
return null | ||
} | ||
} | ||
module.exports = Onboarding; |
{ | ||
"name": "@metamask/onboarding", | ||
"version": "0.3.0", | ||
"version": "0.4.0", | ||
"description": "Tools to support MetaMask one-click onboarding", | ||
"main": "dist/metamask-onboarding.cjs.js", | ||
"module": "src/index.js", | ||
"module": "dist/metamask-onboarding.es.js", | ||
"types": "dist/index.d.ts", | ||
"homepage": "https://github.com/MetaMask/metamask-onboarding#readme", | ||
@@ -26,17 +27,22 @@ "bugs": { | ||
"prepublishOnly": "npm run build", | ||
"lint": "eslint .", | ||
"build": "rollup --config && rollup --config rollup.config.standalone.js" | ||
"lint": "eslint --ext .ts,.js .", | ||
"build": "rollup --config" | ||
}, | ||
"dependencies": { | ||
"bowser": "^2.5.4" | ||
"bowser": "^2.5.4", | ||
"tslib": "^1.11.0" | ||
}, | ||
"devDependencies": { | ||
"@metamask/eslint-config": "^2.0.0", | ||
"@rollup/plugin-commonjs": "^11.0.2", | ||
"@rollup/plugin-node-resolve": "^7.1.1", | ||
"@typescript-eslint/eslint-plugin": "^2.20.0", | ||
"@typescript-eslint/parser": "^2.20.0", | ||
"eslint": "^6.8.0", | ||
"eslint-plugin-import": "^2.20.1", | ||
"rollup": "^1.20.3", | ||
"rollup-plugin-commonjs": "^10.1.0", | ||
"rollup-plugin-node-resolve": "^5.2.0", | ||
"static-server": "^2.2.1" | ||
"rollup": "^2.18.0", | ||
"rollup-plugin-typescript2": "^0.27.1", | ||
"static-server": "^2.2.1", | ||
"typescript": "^3.9.2" | ||
} | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
8
70926
2
11
955
1
+ Addedtslib@^1.11.0
+ Addedtslib@1.14.1(transitive)