Created
June 15, 2024 09:31
-
-
Save DATADEER/7a5cf6111d345586c518378607b085da to your computer and use it in GitHub Desktop.
Find NPM Package Versions explicitly mention another package in their peer dependencies
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const { exec } = require("child_process"); | |
const semver = require("semver"); | |
const { program } = require("commander"); | |
// Define the command-line arguments using commander | |
program | |
.option("--upgrade <package>", "The package to upgrade") | |
.option("--required <dependency>", "The required version of the dependency"); | |
program.parse(process.argv); | |
const options = program.opts(); | |
if (!options.upgrade || !options.required) { | |
console.error("Please provide both --upgrade and --required options."); | |
process.exit(1); | |
} | |
const [upgradePackage, upgradeVersion] = options.upgrade.split("@"); | |
const [requiredPackage, requiredVersion] = options.required.split("@"); | |
console.log( | |
`Checking for ${upgradePackage} versions newer than ${upgradeVersion} that support ${requiredPackage}@${requiredVersion}` | |
); | |
// Function to fetch all versions of a package | |
function fetchAllVersions(packageName, callback) { | |
exec(`npm show ${packageName} versions --json`, (err, stdout, stderr) => { | |
if (err) { | |
console.error(`Error fetching versions for ${packageName}:`, stderr); | |
return; | |
} | |
try { | |
const versions = JSON.parse(stdout); | |
console.log(`Fetched versions for ${packageName}:`, versions); | |
callback(versions); | |
} catch (parseError) { | |
console.error( | |
`Error parsing JSON for versions of ${packageName}:`, | |
parseError | |
); | |
} | |
}); | |
} | |
// Fetch all versions of the package and filter the ones newer than the specified version | |
fetchAllVersions(upgradePackage, (versions) => { | |
const versionsToCheck = versions.filter((version) => | |
semver.gt(version, upgradeVersion) | |
); | |
if (versionsToCheck.length === 0) { | |
console.log( | |
`No versions found for ${upgradePackage} newer than ${upgradeVersion}` | |
); | |
return; | |
} | |
console.log(`Versions to check:`, versionsToCheck); | |
versionsToCheck.forEach((version) => { | |
console.log(`Checking version ${version} of ${upgradePackage}...`); | |
exec( | |
`npm show ${upgradePackage}@${version} --json`, | |
(err, stdout, stderr) => { | |
if (err) { | |
console.error(`Error fetching info for version ${version}:`, stderr); | |
return; | |
} | |
try { | |
const packageInfo = JSON.parse(stdout); | |
const peerDependencies = packageInfo.peerDependencies || {}; | |
/*console.log( | |
`Peer dependencies for version ${version}:`, | |
peerDependencies | |
);*/ | |
if (peerDependencies[requiredPackage]) { | |
const satisfies = semver.satisfies( | |
requiredVersion, | |
peerDependencies[requiredPackage] | |
); | |
console.log( | |
`Version ${version} of ${upgradePackage} supports ${requiredPackage} ${requiredVersion}: ${satisfies}` | |
); | |
} else { | |
console.log( | |
`Version ${version} of ${upgradePackage} does not specify peer dependencies for ${requiredPackage}.` | |
); | |
} | |
} catch (parseError) { | |
console.error( | |
`Error parsing JSON for version ${version}:`, | |
parseError | |
); | |
} | |
} | |
); | |
}); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment