UNPKG

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
/** * 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`);