45 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			45 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | const os = require('os'); | ||
|  | const execa = require('execa'); | ||
|  | 
 | ||
|  | // Reference: https://www.gaijin.at/en/lstwinver.php
 | ||
|  | const names = new Map([ | ||
|  | 	['10.0', '10'], | ||
|  | 	['6.3', '8.1'], | ||
|  | 	['6.2', '8'], | ||
|  | 	['6.1', '7'], | ||
|  | 	['6.0', 'Vista'], | ||
|  | 	['5.2', 'Server 2003'], | ||
|  | 	['5.1', 'XP'], | ||
|  | 	['5.0', '2000'], | ||
|  | 	['4.9', 'ME'], | ||
|  | 	['4.1', '98'], | ||
|  | 	['4.0', '95'] | ||
|  | ]); | ||
|  | 
 | ||
|  | const windowsRelease = release => { | ||
|  | 	const version = /\d+\.\d/.exec(release || os.release()); | ||
|  | 
 | ||
|  | 	if (release && !version) { | ||
|  | 		throw new Error('`release` argument doesn\'t match `n.n`'); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	const ver = (version || [])[0]; | ||
|  | 
 | ||
|  | 	// Server 2008, 2012 and 2016 versions are ambiguous with desktop versions and must be detected at runtime.
 | ||
|  | 	// If `release` is omitted or we're on a Windows system, and the version number is an ambiguous version
 | ||
|  | 	// then use `wmic` to get the OS caption: https://msdn.microsoft.com/en-us/library/aa394531(v=vs.85).aspx
 | ||
|  | 	// If the resulting caption contains the year 2008, 2012 or 2016, it is a server version, so return a server OS name.
 | ||
|  | 	if ((!release || release === os.release()) && ['6.1', '6.2', '6.3', '10.0'].includes(ver)) { | ||
|  | 		const stdout = execa.sync('wmic', ['os', 'get', 'Caption']).stdout || ''; | ||
|  | 		const year = (stdout.match(/2008|2012|2016/) || [])[0]; | ||
|  | 		if (year) { | ||
|  | 			return `Server ${year}`; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return names.get(ver); | ||
|  | }; | ||
|  | 
 | ||
|  | module.exports = windowsRelease; |