epd
Version:
Enhanced peer dependency resolution for npm, yarn, and pnpm
70 lines • 2.44 kB
JavaScript
import fs from 'fs/promises';
import { fetchPackageVersions } from './registry.js';
export async function planSafeUpdates(packageJson) {
const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };
const plans = [];
for (const [pkg, currentVersion] of Object.entries(deps)) {
const plan = await createUpdatePlan(pkg, currentVersion);
if (plan)
plans.push(plan);
}
return plans.filter(p => p.safe);
}
export async function applyUpdates(plans, breakingChanges = false) {
const packageJson = JSON.parse(await fs.readFile('package.json', 'utf-8'));
let updated = false;
for (const plan of plans) {
if (plan.safe || (breakingChanges && plan.breaking)) {
if (packageJson.dependencies?.[plan.package]) {
packageJson.dependencies[plan.package] = plan.target;
updated = true;
}
if (packageJson.devDependencies?.[plan.package]) {
packageJson.devDependencies[plan.package] = plan.target;
updated = true;
}
}
}
if (updated) {
await fs.writeFile('package.json', JSON.stringify(packageJson, null, 2));
console.log(`✅ Updated ${plans.length} packages`);
}
}
async function createUpdatePlan(pkg, currentVersion) {
try {
const versions = await fetchPackageVersions(pkg);
const latest = versions[0];
if (!latest || latest === currentVersion.replace(/[\^~]/, '')) {
return null;
}
const current = parseVersion(currentVersion);
const target = parseVersion(latest);
const type = getUpdateType(current, target);
const breaking = type === 'major';
const safe = type === 'patch' || (type === 'minor' && !breaking);
return {
package: pkg,
current: currentVersion,
target: latest,
type,
breaking,
safe
};
}
catch {
return null;
}
}
function parseVersion(version) {
const clean = version.replace(/[\^~]/, '');
const parts = clean.split('.').map(Number);
return [parts[0] || 0, parts[1] || 0, parts[2] || 0];
}
function getUpdateType(current, target) {
if (target[0] > current[0])
return 'major';
if (target[1] > current[1])
return 'minor';
return 'patch';
}
//# sourceMappingURL=auto-updater.js.map