UNPKG

@enact/core

Version:

Enact is an open source JavaScript framework containing everything you need to create a fast, scalable mobile or web application.

168 lines (155 loc) 6.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.platform = exports.parseUserAgent = exports.detect = exports["default"] = void 0; var _deprecate = _interopRequireDefault(require("../internal/deprecate")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; } /** * Utilities for detecting basic platform capabilities. * * @module core/platform * @exports detect * @exports platform * @public */ // Refer the following for more details: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis var browserEnvironment = function browserEnvironment() { return !!globalThis.window; }; // Note: Always true for Chrome v70 or higher: https://chromestatus.com/feature/4764225348042752 var featureTouchEvent = function featureTouchEvent() { return browserEnvironment() && 'TouchEvent' in globalThis; }; // Refer https://patrickhlauke.github.io/touch/touchscreen-detection/ var deviceTouchScreen = function deviceTouchScreen() { var _globalThis$navigator, _globalThis$matchMedi; return browserEnvironment() && ( // check if maxTouchPoints is greater than 0 first ((_globalThis$navigator = globalThis.navigator) === null || _globalThis$navigator === void 0 ? void 0 : _globalThis$navigator.maxTouchPoints) > 0 || (// check for any-pointer: coarse which mostly means touchscreen (_globalThis$matchMedi = globalThis.matchMedia) === null || _globalThis$matchMedi === void 0 || (_globalThis$matchMedi = _globalThis$matchMedi.call(globalThis, "(any-pointer: coarse)")) === null || _globalThis$matchMedi === void 0 ? void 0 : _globalThis$matchMedi.matches)); }; // Refer https://www.whatismybrowser.com/guides/the-latest-user-agent/ for latest user agents of major browsers var userAgentPatterns = [ // Normal cases except iOS { browserName: 'safari', regex: /\s+Version\/(\d+)(?:\.(\d+))?\s+Safari/ }, { browserName: 'chrome', regex: /\s+Chrome\/(\d+)[.\d]+/ }, { browserName: 'firefox', regex: /\s+Firefox\/(\d+)[.\d]+/ }, // iOS { browserName: 'safari', regex: /\((?:iPhone|iPad);.+\sOS\s(\d+)_(\d+)/ }]; // The base supported versions: Used in DEPRECATED warning var supportedVersions = { safari: 16.4, chrome: 119, firefox: 128 }; var parseUserAgent = exports.parseUserAgent = function parseUserAgent(userAgent) { var detectedInfo = { type: 'unknown', browserName: 'unknown', browserVersion: 0 }; var index; for (index = 0; index < userAgentPatterns.length; index++) { var testPlatform = userAgentPatterns[index]; var match = testPlatform.regex.exec(userAgent); if (match) { detectedInfo.browserName = testPlatform.browserName; detectedInfo.browserVersion = Number("".concat(match[1], ".").concat(match[2] || 0)); break; } } if (index < userAgentPatterns.length) { if (userAgent.includes('Web0S;')) { detectedInfo.type = 'webos'; } else if (userAgent.includes(' Mobile')) { // Note that we don't catch 'Tablet' of Firefox as it can't be normalized with other browsers detectedInfo.type = 'mobile'; } else { detectedInfo.type = 'desktop'; } detectedInfo[detectedInfo.browserName] = detectedInfo.browserVersion; } // deprecation warning for browser versions older than our support policy if (supportedVersions[detectedInfo.browserName] > detectedInfo.browserVersion) { (0, _deprecate["default"])({ name: "supporting ".concat(detectedInfo.browserName, " version older than ").concat(supportedVersions[detectedInfo.browserName]), until: '5.0.0' }); } return detectedInfo; }; /** * @typedef {Object} PlatformDescription * @property {String} browserName - The name of the detected browser * @property {Number} browserVersion - The version of the detected browser * @property {Number} chrome - The version of the detected browser, if chrome browser is detected * @property {Number} firefox - The version of the detected browser, if firefox browser is detected * @property {Number} safari - The version of the detected browser, if safari browser is detected * @property {Boolean} touchEvent - `true` if the browser has native touch events * @property {Boolean} touchScreen - `true` if the platform has a touch screen * @property {String} type - The type of the detected platform. One of 'desktop', 'mobile', 'webos', 'node', or 'unknown' * * @memberof core/platform * @public */ var detectedPlatform = null; /** * Returns the {@link core/platform.platform} object. * * @function detect * @returns {PlatformDescription} The {@link core/platform.platform} object * @memberof core/platform * @public */ var detect = exports.detect = function detect() { if (detectedPlatform !== null && !(process.env.NODE_ENV !== "production")) { // once detected, don't bother detecting again return detectedPlatform; } // Parse User Agent string first if (browserEnvironment()) { var _globalThis$navigator2; detectedPlatform = parseUserAgent(((_globalThis$navigator2 = globalThis.navigator) === null || _globalThis$navigator2 === void 0 ? void 0 : _globalThis$navigator2.userAgent) || ''); } else { // node or compatible environment (e.g. prerendering or snapshot runs) detectedPlatform = { type: 'node', browserName: 'unknown', browserVersion: 0 /* magic number for unknown */ }; } // Detect features detectedPlatform.touchEvent = featureTouchEvent(); // Detect devices detectedPlatform.touchScreen = deviceTouchScreen(); return detectedPlatform; }; /** * Provides basic information about the running platform. * * @type {PlatformDescription} * @memberof core/platform * @public */ var platform = exports.platform = {}; ['browserName', 'browserVersion', 'chrome', 'firefox', 'safari', 'touchEvent', 'touchScreen', 'type'].forEach(function (name) { Object.defineProperty(platform, name, { enumerable: true, get: function get() { var p = detect(); return p[name]; } }); }); var _default = exports["default"] = platform;