Last active
October 10, 2022 16:20
-
-
Save flakey5/a719d0dc0ebdb08eaf479dc531ea13d8 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict'; | |
const { getOptionValue } = require('internal/options'); | |
const { get } = require('https'); | |
const { gt: semverGt, clean: semverClean, major: semverMajor } = require('semver'); | |
function compareVersions(current, other, security) { | |
if (semverGt(other, current)) { | |
let message = `New version available! v${current} (current) -> v${other} (new)`; | |
if (security) | |
message += ' (security release)'; | |
process.emitWarning(message); | |
} | |
} | |
// Marked w/ default value just for testing | |
const checkUpdate = 'same'; /* = getOptionValue('--check-update');*/ | |
if (checkUpdate) { | |
const versionsUrl = getOptionValue('--version-checker-url') ?? 'https://nodejs.org/dist/index.json'; | |
get(versionsUrl, res => { | |
const { statusCode, headers } = res; | |
if (statusCode !== 200) { | |
process.emitWarning(`Version checker failed: received status code ${statusCode}`); | |
res.resume(); | |
return; | |
} | |
if (headers['content-type'] !== 'application/json') { | |
process.emitWarning('Version checker failed: content-type not application/json'); | |
res.resume(); | |
return; | |
} | |
res.setEncoding('utf8'); | |
let releasesString = ''; | |
res.on('data', chunk => releasesString += chunk); | |
res.on('error', e => process.emitWarning(`Version checker failed: ${e.message}`)); | |
res.on('end', () => { | |
try { | |
const releases = JSON.parse(releasesString); | |
if (releases.length === 0) | |
return; | |
const nodeVersion = '16.0.0'; //semverClean(process.version); | |
switch (checkUpdate.toLowerCase()) { | |
case true: // When it's passed w/o value | |
case 'current': { | |
const latestVersion = semverClean(releases[0].version); | |
compareVersions(nodeVersion, latestVersion, releases[0].security); | |
break; | |
} | |
case 'lts': { | |
for (const release of releases) { | |
if (!release.lts) | |
continue; | |
const version = semverClean(release.version); | |
compareVersions(nodeVersion, version, release.security); | |
break; | |
} | |
break; | |
} | |
case 'same': { | |
const nodeMajor = semverMajor(nodeVersion); | |
for (const release of releases) { | |
const version = semverClean(release.version); | |
const releaseMajor = semverMajor(version); | |
if (releaseMajor !== nodeMajor) | |
continue; | |
compareVersions(nodeVersion, version, release.security); | |
break; | |
} | |
break; | |
} | |
case 'off': | |
break; | |
default: | |
process.emitWarning('Version checker failed: invalid value of --check-update. Valid options: current, lts, same, and off.'); | |
break; | |
} | |
} catch (e) { | |
process.emitWarning(`Version checker failed: ${e.message}`); | |
} | |
}); | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment