misc/os.js

import { release, arch } from 'os';
import { getBrowser } from './browser.js';
/**
* Find the OS information (includes code from [this SO post](https://stackoverflow.com/a/18706818/14828697)). (PS This is nowhere as polished as libraries dedicated to only detecting the OS details)
*
* @since v2.11.0
* @category Misc
* @returns String
* @example
* await getOS();
*/

const getOS = async () => {
	if (typeof navigator !== 'undefined') {
		const nAgt = navigator.userAgent;
		const {
			version,
			name: browser,
		} = getBrowser();
		const nVer = navigator.appVersion;
		let os = 'Unknown OS';
		const clientStrings = [
			{
				s: 'Windows 10',
				r: /(Windows 10.0|Windows NT 10.0)/,
			},
			{
				s: 'Windows 8.1',
				r: /(Windows 8.1|Windows NT 6.3)/,
			},
			{
				s: 'Windows 8',
				r: /(Windows 8|Windows NT 6.2)/,
			},
			{
				s: 'Windows 7',
				r: /(Windows 7|Windows NT 6.1)/,
			},
			{
				s: 'Windows Vista',
				r: /Windows NT 6.0/,
			},
			{
				s: 'Windows Server 2003',
				r: /Windows NT 5.2/,
			},
			{
				s: 'Windows XP',
				r: /(Windows NT 5.1|Windows XP)/,
			},
			{
				s: 'Windows 2000',
				r: /(Windows NT 5.0|Windows 2000)/,
			},
			{
				s: 'Windows ME',
				r: /(Win 9x 4.90|Windows ME)/,
			},
			{
				s: 'Windows 98',
				r: /(Windows 98|Win98)/,
			},
			{
				s: 'Windows 95',
				r: /(Windows 95|Win95|Windows_95)/,
			},
			{
				s: 'Windows NT 4.0',
				r: /(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/,
			},
			{
				s: 'Windows CE',
				r: /Windows CE/,
			},
			{
				s: 'Windows 3.11',
				r: /Win16/,
			},
			{
				s: 'Android',
				r: /Android/,
			},
			{
				s: 'Open BSD',
				r: /OpenBSD/,
			},
			{
				s: 'Sun OS',
				r: /SunOS/,
			},
			{
				s: 'Chrome OS',
				r: /CrOS/,
			},
			{
				s: 'Linux',
				r: /(Linux|X11(?!.*CrOS))/,
			},
			{
				s: 'iOS',
				r: /(iPhone|iPad|iPod)/,
			},
			{
				s: 'Mac OS X',
				r: /Mac OS X/,
			},
			{
				s: 'Mac OS',
				r: /(Mac OS|MacPPC|MacIntel|Mac_PowerPC|Macintosh)/,
			},
			{
				s: 'QNX',
				r: /QNX/,
			},
			{
				s: 'UNIX',
				r: /UNIX/,
			},
			{
				s: 'BeOS',
				r: /BeOS/,
			},
			{
				s: 'OS/2',
				r: /OS\/2/,
			},
			{
				s: 'Search Bot',
				r: /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/,
			},
		];
		for (let id = 0; id < clientStrings.length; id++) {
			var cs = clientStrings[id];
			if (cs.r.test(nAgt)) {
				os = cs.s;
				break;
			}
		}

		let osVersion = 'Unknown OS Version';

		if (/Windows/.test(os)) {
			osVersion = /Windows (.*)/.exec(os)[1];
			os = 'Windows';
		}

		switch (os) {
		case 'Mac OS':
		case 'Mac OS X':
		case 'Android':
			/* eslint-disable no-useless-escape */
			osVersion = /(?:Android|Mac OS|Mac OS X|MacPPC|MacIntel|Mac_PowerPC|Macintosh) ([\.\_\d]+)/.exec(nAgt)[1];
			/* eslint-enable no-useless-escape */
			break;

		case 'iOS':
			osVersion = /OS (\d+)_(\d+)_?(\d+)?/.exec(nVer);
			osVersion = osVersion[1] + '.' + osVersion[2] + '.' + (osVersion[3] | 0);
			break;
		}
		// console.log((browser === 'Chrome' && parseFloat(version) >= 95) || (browser === 'Microsoft Edge' && parseFloat(version) >= 94), parseFloat(version), browser);
		if((browser === 'Chrome' && parseFloat(version) >= 95) || (browser === 'Microsoft Edge' && parseFloat(version) >= 94) || browser === 'Opera') {
			return navigator.userAgentData.getHighEntropyValues(['platformVersion'])
				.then(ua => {
					if (navigator.userAgentData.platform === 'Windows') {
						const majorPlatformVersion = parseInt(ua.platformVersion.split('.')[0]);
						if (majorPlatformVersion >= 13) {
							return 'Windows 11 or later';
						}
						else if (majorPlatformVersion > 0) {
							return 'Windows 10';
						}
						else {
							return 'Windows 8 or later';
						}
					}
				});
		}
		else {
			return os + ' ' + osVersion;
		}
	}
	if(typeof window === 'undefined') {
		return `${process.platform === 'win32' ? 'Windows' : process.platform} ${release} (${arch})`;
	}
};

export { getOS };