123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- '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;
|