Skip to content

Instantly share code, notes, and snippets.

@flakey5
Last active October 10, 2022 16:20
Show Gist options
  • Save flakey5/a719d0dc0ebdb08eaf479dc531ea13d8 to your computer and use it in GitHub Desktop.
Save flakey5/a719d0dc0ebdb08eaf479dc531ea13d8 to your computer and use it in GitHub Desktop.
'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