@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
JavaScript
;
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;