UNPKG

quasar-framework

Version:

Build responsive SPA, SSR, PWA, Hybrid Mobile Apps and Electron apps, all simultaneously using the same codebase

244 lines (206 loc) 6.52 kB
/* eslint-disable no-useless-escape */ /* eslint-disable no-unused-expressions */ /* eslint-disable no-mixed-operators */ export const isSSR = typeof window === 'undefined' export let fromSSR = false export let onSSR = isSSR function getMatch (userAgent, platformMatch) { const match = /(edge)\/([\w.]+)/.exec(userAgent) || /(opr)[\/]([\w.]+)/.exec(userAgent) || /(vivaldi)[\/]([\w.]+)/.exec(userAgent) || /(chrome)[\/]([\w.]+)/.exec(userAgent) || /(iemobile)[\/]([\w.]+)/.exec(userAgent) || /(version)(applewebkit)[\/]([\w.]+).*(safari)[\/]([\w.]+)/.exec(userAgent) || /(webkit)[\/]([\w.]+).*(version)[\/]([\w.]+).*(safari)[\/]([\w.]+)/.exec(userAgent) || /(webkit)[\/]([\w.]+)/.exec(userAgent) || /(opera)(?:.*version|)[\/]([\w.]+)/.exec(userAgent) || /(msie) ([\w.]+)/.exec(userAgent) || userAgent.indexOf('trident') >= 0 && /(rv)(?::| )([\w.]+)/.exec(userAgent) || userAgent.indexOf('compatible') < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(userAgent) || [] return { browser: match[5] || match[3] || match[1] || '', version: match[2] || match[4] || '0', versionNumber: match[4] || match[2] || '0', platform: platformMatch[0] || '' } } function getPlatformMatch (userAgent) { return /(ipad)/.exec(userAgent) || /(ipod)/.exec(userAgent) || /(windows phone)/.exec(userAgent) || /(iphone)/.exec(userAgent) || /(kindle)/.exec(userAgent) || /(silk)/.exec(userAgent) || /(android)/.exec(userAgent) || /(win)/.exec(userAgent) || /(mac)/.exec(userAgent) || /(linux)/.exec(userAgent) || /(cros)/.exec(userAgent) || /(playbook)/.exec(userAgent) || /(bb)/.exec(userAgent) || /(blackberry)/.exec(userAgent) || [] } function getPlatform (userAgent) { userAgent = (userAgent || navigator.userAgent || navigator.vendor || window.opera).toLowerCase() const platformMatch = getPlatformMatch(userAgent), matched = getMatch(userAgent, platformMatch), browser = {} if (matched.browser) { browser[matched.browser] = true browser.version = matched.version browser.versionNumber = parseInt(matched.versionNumber, 10) } if (matched.platform) { browser[matched.platform] = true } // These are all considered mobile platforms, meaning they run a mobile browser if (browser.android || browser.bb || browser.blackberry || browser.ipad || browser.iphone || browser.ipod || browser.kindle || browser.playbook || browser.silk || browser['windows phone']) { browser.mobile = true } // Set iOS if on iPod, iPad or iPhone if (browser.ipod || browser.ipad || browser.iphone) { browser.ios = true } if (browser['windows phone']) { browser.winphone = true delete browser['windows phone'] } // These are all considered desktop platforms, meaning they run a desktop browser if (browser.cros || browser.mac || browser.linux || browser.win) { browser.desktop = true } // Chrome, Opera 15+, Vivaldi and Safari are webkit based browsers if (browser.chrome || browser.opr || browser.safari || browser.vivaldi) { browser.webkit = true } // IE11 has a new token so we will assign it msie to avoid breaking changes if (browser.rv || browser.iemobile) { matched.browser = 'ie' browser.ie = true } // Edge is officially known as Microsoft Edge, so rewrite the key to match if (browser.edge) { matched.browser = 'edge' browser.edge = true } // Blackberry browsers are marked as Safari on BlackBerry if (browser.safari && browser.blackberry || browser.bb) { matched.browser = 'blackberry' browser.blackberry = true } // Playbook browsers are marked as Safari on Playbook if (browser.safari && browser.playbook) { matched.browser = 'playbook' browser.playbook = true } // Opera 15+ are identified as opr if (browser.opr) { matched.browser = 'opera' browser.opera = true } // Stock Android browsers are marked as Safari on Android. if (browser.safari && browser.android) { matched.browser = 'android' browser.android = true } // Kindle browsers are marked as Safari on Kindle if (browser.safari && browser.kindle) { matched.browser = 'kindle' browser.kindle = true } // Kindle Silk browsers are marked as Safari on Kindle if (browser.safari && browser.silk) { matched.browser = 'silk' browser.silk = true } if (browser.vivaldi) { matched.browser = 'vivaldi' browser.vivaldi = true } // Assign the name and platform variable browser.name = matched.browser browser.platform = matched.platform if (!isSSR) { if (window.process && window.process.versions && window.process.versions.electron) { browser.electron = true } else if (document.location.href.indexOf('chrome-extension://') === 0) { browser.chromeExt = true } else if (window._cordovaNative || window.cordova) { browser.cordova = true } fromSSR = browser.cordova === void 0 && browser.electron === void 0 && !!document.querySelector('[data-server-rendered]') fromSSR && (onSSR = true) } return browser } let webStorage export function hasWebStorage () { if (webStorage !== void 0) { return webStorage } try { if (window.localStorage) { webStorage = true return true } } catch (e) {} webStorage = false return false } function getClientProperties () { return { has: { touch: (() => !!('ontouchstart' in document.documentElement) || window.navigator.msMaxTouchPoints > 0)(), webStorage: hasWebStorage() }, within: { iframe: window.self !== window.top } } } export default { has: { touch: false, webStorage: false }, within: { iframe: false }, parseSSR (/* ssrContext */ ssr) { return ssr ? { is: getPlatform(ssr.req.headers['user-agent']), has: this.has, within: this.within } : { is: getPlatform(), ...getClientProperties() } }, install ($q, queues, Vue) { if (isSSR) { queues.server.push((q, ctx) => { q.platform = this.parseSSR(ctx.ssr) }) return } this.is = getPlatform() if (fromSSR) { queues.takeover.push(q => { onSSR = fromSSR = false Object.assign(q.platform, getClientProperties()) }) Vue.util.defineReactive($q, 'platform', this) } else { Object.assign(this, getClientProperties()) $q.platform = this } } }