igir
Version:
🕹 A zero-setup ROM collection manager that sorts, filters, extracts or archives, patches, and reports on collections of any size on any OS.
70 lines (69 loc) • 3.19 kB
JavaScript
/**
* This script outputs dependencies that are being held back because their `engines.node` require a
* newer version of Node.js.
*/
import { spawnSync } from 'node:child_process';
import fs from 'node:fs';
import path from 'node:path';
import url from 'node:url';
import util from 'node:util';
import semver from 'semver';
const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
const packageJson = JSON.parse((await util.promisify(fs.readFile)(path.join(__dirname, '..', 'package.json'))).toString());
const enginesNode = packageJson.engines?.node;
if (!enginesNode) {
throw new Error('No engines.node defined in package.json');
}
const dependencyTypes = new Set([
'dependencies',
'devDependencies',
'peerDependencies',
'optionalDependencies',
]);
const heldBackDependencies = Object.entries(packageJson)
.filter(([dependencyType]) => dependencyTypes.has(dependencyType))
.map(([dependencyType, dependencies]) => {
const heldBackDependencies = Object.entries(dependencies)
.map(([depPackageName, depPackageVersion]) => {
const depPackageNameVersion = `${depPackageName}@${depPackageVersion}`;
process.stderr.write(`${dependencyType}: ${depPackageNameVersion} ... `);
const depPackageJsonLatest = JSON.parse(spawnSync('npm', ['view', '--json', `${depPackageName}@latest`], {
windowsHide: true,
}).stdout.toString());
const depPackageNewerVersions = semver
.sort(depPackageJsonLatest.versions ?? [])
.filter((remoteVersion) => semver.gt(remoteVersion, depPackageVersion) &&
semver.parse(remoteVersion)?.prerelease.length === 0);
if (depPackageNewerVersions.length === 0) {
process.stderr.write('✅\n');
return undefined;
}
process.stderr.write('⬆️\n');
const depPackageHeldVersions = depPackageNewerVersions
.map((remoteVersion) => {
process.stderr.write(` ${depPackageName}@${remoteVersion} ... `);
const depPackageJson = JSON.parse(spawnSync('npm', ['view', '--json', `${depPackageName}@${remoteVersion}`], {
windowsHide: true,
}).stdout.toString());
if (!depPackageJson.engines?.node) {
process.stderr.write('❓\n');
return undefined;
}
process.stderr.write(`${depPackageJson.engines.node} `);
if (semver.subset(enginesNode, depPackageJson.engines.node)) {
process.stderr.write('✅\n');
return undefined;
}
process.stderr.write('✋\n');
return [remoteVersion, depPackageJson.engines.node];
})
.filter((value) => value !== undefined);
if (depPackageHeldVersions.length === 0) {
return undefined;
}
return [depPackageNameVersion, Object.fromEntries(depPackageHeldVersions)];
})
.filter((value) => value !== undefined);
return [dependencyType, Object.fromEntries(heldBackDependencies)];
});
process.stdout.write(`${JSON.stringify(Object.fromEntries(heldBackDependencies), undefined, 2)}\n`);