@tapjs/run
Version:
Command-line interface for the node-tap runner
45 lines • 1.82 kB
JavaScript
import { readFileSync } from 'fs';
import pacote from 'pacote';
import { resolveImportSync } from 'resolve-import/resolve-import-sync';
import { gt, satisfies } from 'semver';
import { fileURLToPath } from 'url';
const corePJ = resolveImportSync('@tapjs/core/package.json', import.meta.url);
const { version: coreVersion } = JSON.parse(readFileSync(fileURLToPath(corePJ), 'utf8'));
/**
* Select the highest version acceptable, preferring @latest and non-pre
* versions over prereleases.
*
* Filter by the ones whose peerDependencies will allow the current
* @tapjs/core. Returns `undefined` if no version matches.
*/
export const selectVersion = async (name, range = '', _config) => {
const packu = await pacote.packument(name);
let acceptable = undefined;
let acceptablePre = undefined;
for (const [ver, mani] of Object.entries(packu.versions)) {
const { '@tapjs/core': corePeerDep } = mani.peerDependencies || {
'@tapjs/core': undefined,
};
if (typeof corePeerDep === 'string' &&
!satisfies(coreVersion, corePeerDep)) {
continue;
}
if (satisfies(ver, range)) {
acceptable = newIfGt(acceptable, ver);
acceptablePre = newIfGt(acceptablePre, ver);
}
else if (satisfies(ver, range, { includePrerelease: true })) {
acceptablePre = newIfGt(acceptablePre, ver);
}
else {
continue;
}
// if the @latest is acceptable, use that always
if (ver === packu['dist-tags'].latest)
return ver;
}
return acceptable || acceptablePre;
};
// use the new version if it's newer than the older version
const newIfGt = (old, neu) => old === undefined || gt(neu, old) ? neu : old;
//# sourceMappingURL=select-version.js.map