'use strict'; var path = require('path'); var Releases = require('./releases.js'); var cache = {}; //var staleAge = 5 * 1000; //var expiredAge = 15 * 1000; var staleAge = 5 * 60 * 1000; var expiredAge = 15 * 60 * 1000; let installerDir = path.join(__dirname, '..'); // TODO needs a proper test, and more accurate (though perhaps far less simple) code function createFormatsSorter(formats) { return function sortByVerExt(a, b) { function lexver(semver) { // v1.20.156 => 00001.00020.00156.zzzzz // TODO BUG: v1.20.156-rc2 => 00001.00020.00156.rc2zz var parts = semver.split(/[+\.\-]/g); while (parts.length < 4) { parts.push(''); } return parts .map(function (num, i) { if (3 === i) { return num.toString().padEnd(10, 'z'); } return num.toString().padStart(10, '0'); }) .join('.'); } var aver = lexver(a.version); var bver = lexver(b.version); if (aver > bver) { //console.log(aver, '>', bver); return -1; } if (aver < bver) { //console.log(aver, '<', bver); return 1; } var aExtPri = formats.indexOf(a.ext.replace(/tar\..*/, 'tar')); var bExtPri = formats.indexOf(b.ext.replace(/tar\..*/, 'tar')); if (aExtPri > bExtPri) { //console.log(a.ext, aExtPri, '>', b.ext, bExtPri); return -1; } if (aExtPri < bExtPri) { //console.log(a.ext, aExtPri, '<', b.ext, bExtPri); return 1; } // Hacky-doo for linux: prefer musl if (a._musl && !b._musl) { return -1; } if (!a._musl && b._musl) { return 1; } return 0; }; } async function getCachedReleases(pkg) { // returns { download: '