Fixed better update

This commit is contained in:
Warky 2024-12-03 14:32:28 +02:00
parent 6aef0da6c4
commit 9851a91bb3

View File

@ -474,69 +474,79 @@ class DependencyChecker {
async updateDependencies(dryRun = false) { async updateDependencies(dryRun = false) {
console.log(chalk.bold('\nUpdating dependencies...\n')); console.log(chalk.bold('\nUpdating dependencies...\n'));
// Read the main app's package.json
const appPackageJson = JSON.parse(fs.readFileSync(this.appPackageJsonPath, 'utf8'));
const appDependencies = {
...appPackageJson.dependencies,
...appPackageJson.devDependencies,
...appPackageJson.peerDependencies
};
const updates = []; const updates = [];
this.dependencyMap.forEach((depInfo, dep) => {
const allVersions = Array.from(depInfo.versions.keys()).filter(
(v) => !v.startsWith('workspace:')
); // Skip workspace dependencies
if (allVersions.length === 0) return; // Skip if only workspace versions exist // Process each package.json except the main app
this.packageJsonFiles
const cleanVersions = allVersions.map((v) => this.getSemverVersion(v)).filter(Boolean); .filter(filePath => filePath !== this.appPackageJsonPath)
.forEach(filePath => {
if (cleanVersions.length === 0) return; // Skip if no valid versions
const highestVersion = semver.maxSatisfying(cleanVersions, '*');
if (highestVersion) {
this.packageJsonFiles.forEach((filePath) => {
const packageJson = JSON.parse(fs.readFileSync(filePath, 'utf8')); const packageJson = JSON.parse(fs.readFileSync(filePath, 'utf8'));
let updated = false; let hasUpdates = false;
// Don't update workspace dependencies // Helper function to update dependencies of a specific type
if ( const updateDependencySection = (section) => {
packageJson.dependencies?.[dep] && if (!packageJson[section]) return;
!packageJson.dependencies[dep].startsWith('workspace:')
) {
if (!dryRun) {
packageJson.dependencies[dep] = `^${highestVersion}`;
}
updated = true;
}
if ( Object.entries(packageJson[section]).forEach(([dep, version]) => {
packageJson.peerDependencies?.[dep] && // Skip workspace dependencies
!packageJson.peerDependencies[dep].startsWith('workspace:') if (version.startsWith('workspace:')) return;
) {
if (!dryRun) {
packageJson.peerDependencies[dep] = `^${highestVersion}`;
}
updated = true;
}
if (updated) { // If the dependency exists in the main app, sync the version
if (appDependencies[dep]) {
const appVersion = appDependencies[dep];
if (version !== appVersion) {
if (!dryRun) { if (!dryRun) {
fs.writeFileSync(filePath, JSON.stringify(packageJson, null, 2)); packageJson[section][dep] = appVersion;
} }
updates.push({ updates.push({
package: packageJson.name, package: packageJson.name,
dependency: dep, dependency: dep,
version: highestVersion, from: version,
to: appVersion,
type: section
}); });
hasUpdates = true;
}
} }
}); });
};
// Update all dependency sections
updateDependencySection('dependencies');
updateDependencySection('devDependencies');
updateDependencySection('peerDependencies');
// Write updated package.json if there were changes
if (hasUpdates && !dryRun) {
fs.writeFileSync(filePath, JSON.stringify(packageJson, null, 2) + '\n');
} }
}); });
updates.forEach(({ package: pkgName, dependency, version }) => { // Display updates
if (updates.length === 0) {
console.log(chalk.green('No updates needed - all versions match the main app'));
} else {
updates.forEach(({ package: pkgName, dependency, from, to, type }) => {
console.log( console.log(
chalk.green( chalk.green(
`${dryRun ? '[DRY RUN] Would update' : 'Updated'} ${dependency} to ^${version} in ${pkgName}` `${dryRun ? '[DRY RUN] Would update' : 'Updated'} ${dependency} in ${pkgName} (${type})\n` +
` ${chalk.red(from)}${chalk.green(to)}`
) )
); );
}); });
} }
return updates;
}
async run({ async run({
update = false, update = false,
dryRun = false, dryRun = false,