Skip to content

Instantly share code, notes, and snippets.

@DATADEER
Created June 15, 2024 09:31
Show Gist options
  • Save DATADEER/7a5cf6111d345586c518378607b085da to your computer and use it in GitHub Desktop.
Save DATADEER/7a5cf6111d345586c518378607b085da to your computer and use it in GitHub Desktop.
Find NPM Package Versions explicitly mention another package in their peer dependencies
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