Skip to content

Commit

Permalink
Add ability to use legacy-peer-deps for npm (#52)
Browse files Browse the repository at this point in the history
* Add ability to use legacy-peer-deps for npm

* fix
  • Loading branch information
torbacz authored Jan 10, 2025
1 parent a12ced5 commit a7589b4
Show file tree
Hide file tree
Showing 8 changed files with 60 additions and 36 deletions.
4 changes: 3 additions & 1 deletion src/DependencyUpdated.Core/Config/Project.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,10 @@ public sealed record Project : IValidatableObject

public string Name { get; set; } = default!;

public bool EachDirectoryAsSeparate { get; set; } = false;
public bool EachDirectoryAsSeparate { get; set; }

public bool UseLegacyDependencies { get; set; }

public IReadOnlyList<string> DependencyConfigurations { get; set; } = [];

public IReadOnlyList<string> Directories { get; set; } = [];
Expand Down
2 changes: 1 addition & 1 deletion src/DependencyUpdated.Core/Interfaces/IProjectUpdater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ public interface IProjectUpdater

IReadOnlyCollection<string> GetAllProjectFiles(string searchPath);

IReadOnlyCollection<UpdateResult> HandleProjectUpdate(IReadOnlyCollection<string> fullPath,
IReadOnlyCollection<UpdateResult> HandleProjectUpdate(Project project, IReadOnlyCollection<string> fullPath,
ICollection<DependencyDetails> dependenciesToUpdate);

Task<IReadOnlyCollection<DependencyDetails>> GetVersions(DependencyDetails package,
Expand Down
2 changes: 1 addition & 1 deletion src/DependencyUpdated.Core/Updater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public async Task DoUpdate()
}

logger.Verbose("Found new versions: {Packages}", allDependenciesToUpdate);
var allUpdates = updater.HandleProjectUpdate(projectFiles, allDependenciesToUpdate);
var allUpdates = updater.HandleProjectUpdate(project, projectFiles, allDependenciesToUpdate);
if (allUpdates.Count == 0)
{
continue;
Expand Down
7 changes: 5 additions & 2 deletions src/DependencyUpdated.Projects.DotNet/DotNetUpdater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public IReadOnlyCollection<string> GetAllProjectFiles(string searchPath)
.ToList();
}

public IReadOnlyCollection<UpdateResult> HandleProjectUpdate(IReadOnlyCollection<string> fullPath,
public IReadOnlyCollection<UpdateResult> HandleProjectUpdate(Project project, IReadOnlyCollection<string> fullPath,
ICollection<DependencyDetails> dependenciesToUpdate)
{
return UpdateCsProj(fullPath, dependenciesToUpdate);
Expand Down Expand Up @@ -101,7 +101,10 @@ public async Task<IReadOnlyCollection<DependencyDetails>> GetVersions(Dependency

var result = allVersions
.DistinctBy(x => x.Version)
.Select(x => package with { Version = x.Version })
.Select(x => package with
{
Version = x.Version
})
.ToHashSet();
return result;
}
Expand Down
40 changes: 29 additions & 11 deletions src/DependencyUpdated.Projects.Npm/NpmUpdater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public IReadOnlyCollection<string> GetAllProjectFiles(string searchPath)
.ToList();
}

public IReadOnlyCollection<UpdateResult> HandleProjectUpdate(IReadOnlyCollection<string> fullPath,
public IReadOnlyCollection<UpdateResult> HandleProjectUpdate(Project project, IReadOnlyCollection<string> fullPath,
ICollection<DependencyDetails> dependenciesToUpdate)
{
if (!IsNpmInstalled())
Expand All @@ -57,7 +57,7 @@ public IReadOnlyCollection<UpdateResult> HandleProjectUpdate(IReadOnlyCollection
continue;
}

var process = GetProcess(directory, dependency);
var process = GetProcess(project, directory, dependency);
process.WaitForExit();
var oldDep = projectDeps.First(x => x.Name == dependency.Name);
updates.Add(new UpdateResult(dependency.Name, oldDep.Version.ToString(), dependency.Version.ToString()));
Expand Down Expand Up @@ -134,37 +134,52 @@ public async Task<IReadOnlyCollection<DependencyDetails>> GetVersions(Dependency
return data;
}

private static Process GetProcess(string? directory, DependencyDetails dependency)
private static Process GetProcess(Project project, string? directory, DependencyDetails dependency)
{
if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform
.Windows))
{
return ProcessPackageWindows(directory, dependency);
return ProcessPackageWindows(project, directory, dependency);
}

return ProcessPackageGeneric(directory, dependency);
return ProcessPackageGeneric(project, directory, dependency);
}

private static Process ProcessPackageGeneric(string? directory, DependencyDetails dependency)
private static Process ProcessPackageGeneric(Project project, string? directory, DependencyDetails dependency)
{
var command = $"install {dependency.Name}@{dependency.Version}";
if (project.UseLegacyDependencies)
{
command += " --legacy-peer-deps";
}

var psi = new ProcessStartInfo
{
FileName = "npm",
RedirectStandardOutput = true,
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardError = true,
Arguments = $"install {dependency.Name}@{dependency.Version}",
Arguments = command,
WorkingDirectory = directory
};

var process = new Process { StartInfo = psi };
var process = new Process
{
StartInfo = psi
};
process.Start();
return process;
}

private static Process ProcessPackageWindows(string? directory, DependencyDetails dependency)
private static Process ProcessPackageWindows(Project project, string? directory, DependencyDetails dependency)
{
var command = $"npm install {dependency.Name}@{dependency.Version}";
if (project.UseLegacyDependencies)
{
command += " --legacy-peer-deps";
}

var psi = new ProcessStartInfo
{
FileName = "cmd.exe",
Expand All @@ -176,10 +191,13 @@ private static Process ProcessPackageWindows(string? directory, DependencyDetail
WorkingDirectory = directory
};

var process = new Process { StartInfo = psi };
var process = new Process
{
StartInfo = psi
};
process.Start();
using var sw = process.StandardInput;
sw.WriteLine($"npm install {dependency.Name}@{dependency.Version}");
sw.WriteLine(command);
sw.WriteLine("exit");
return process;
}
Expand Down
36 changes: 18 additions & 18 deletions tests/DependencyUpdated.Core.UnitTests/UpdaterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public async Task Update_Should_UpdateOnlyMinorVersion()
});
var expectedUpdateResult = new List<UpdateResult> { new(projectDependencies[0].Name, "1.0.0", "1.1.0") };
_projectUpdater
.HandleProjectUpdate(projectList,
.HandleProjectUpdate(_config.Value.Projects[0], projectList,
Arg.Is<ICollection<DependencyDetails>>(detailsCollection =>
detailsCollection.SequenceEqual(expectedDependencyUpdate)))
.Returns(expectedUpdateResult);
Expand All @@ -86,7 +86,7 @@ public async Task Update_Should_UpdateOnlyMinorVersion()
// Assert
using (new AssertionScope())
{
_projectUpdater.Received(1).HandleProjectUpdate(projectList,
_projectUpdater.Received(1).HandleProjectUpdate(_config.Value.Projects[0], projectList,
Arg.Is<ICollection<DependencyDetails>>(detailsCollection =>
detailsCollection.SequenceEqual(expectedDependencyUpdate)));
_repositoryProvider.Received(1).CommitChanges(_currentDir, _config.Value.Projects[0].Name,
Expand Down Expand Up @@ -123,7 +123,7 @@ public async Task Update_Should_UpdateOnlyPatchVersion()
});
var expectedUpdateResult = new List<UpdateResult> { new(projectDependencies[0].Name, "1.0.0", "1.0.2") };
_projectUpdater
.HandleProjectUpdate(projectList,
.HandleProjectUpdate(_config.Value.Projects[0], projectList,
Arg.Is<ICollection<DependencyDetails>>(detailsCollection =>
detailsCollection.SequenceEqual(expectedDependencyUpdate)))
.Returns(expectedUpdateResult);
Expand All @@ -134,7 +134,7 @@ public async Task Update_Should_UpdateOnlyPatchVersion()
// Assert
using (new AssertionScope())
{
_projectUpdater.Received(1).HandleProjectUpdate(projectList,
_projectUpdater.Received(1).HandleProjectUpdate(_config.Value.Projects[0], projectList,
Arg.Is<ICollection<DependencyDetails>>(detailsCollection =>
detailsCollection.SequenceEqual(expectedDependencyUpdate)));
_repositoryProvider.Received(1).CommitChanges(_currentDir, _config.Value.Projects[0].Name,
Expand Down Expand Up @@ -171,7 +171,7 @@ public async Task Update_Should_UpdateMajorVersion()
});
var expectedUpdateResult = new List<UpdateResult> { new(projectDependencies[0].Name, "1.0.0", "2.0.0") };
_projectUpdater
.HandleProjectUpdate(projectList,
.HandleProjectUpdate(_config.Value.Projects[0], projectList,
Arg.Is<ICollection<DependencyDetails>>(detailsCollection =>
detailsCollection.SequenceEqual(expectedDependencyUpdate)))
.Returns(expectedUpdateResult);
Expand All @@ -182,7 +182,7 @@ public async Task Update_Should_UpdateMajorVersion()
// Assert
using (new AssertionScope())
{
_projectUpdater.Received(1).HandleProjectUpdate(projectList,
_projectUpdater.Received(1).HandleProjectUpdate(_config.Value.Projects[0], projectList,
Arg.Is<ICollection<DependencyDetails>>(detailsCollection =>
detailsCollection.SequenceEqual(expectedDependencyUpdate)));
_repositoryProvider.Received(1).CommitChanges(_currentDir, _config.Value.Projects[0].Name,
Expand Down Expand Up @@ -230,7 +230,7 @@ public async Task Update_Should_FilterGroups()
});
var expectedUpdateResult = new List<UpdateResult> { new(projectDependencies[1].Name, "1.0.0", "2.0.0") };
_projectUpdater
.HandleProjectUpdate(projectList,
.HandleProjectUpdate(_config.Value.Projects[0], projectList,
Arg.Is<ICollection<DependencyDetails>>(detailsCollection =>
detailsCollection.SequenceEqual(expectedDependencyUpdate)))
.Returns(expectedUpdateResult);
Expand All @@ -241,7 +241,7 @@ public async Task Update_Should_FilterGroups()
// Assert
using (new AssertionScope())
{
_projectUpdater.Received(1).HandleProjectUpdate(projectList,
_projectUpdater.Received(1).HandleProjectUpdate(_config.Value.Projects[0], projectList,
Arg.Is<ICollection<DependencyDetails>>(detailsCollection =>
detailsCollection.SequenceEqual(expectedDependencyUpdate)));
_repositoryProvider.Received(1).CommitChanges(_currentDir, _config.Value.Projects[0].Name,
Expand Down Expand Up @@ -288,7 +288,7 @@ public async Task Update_Should_Include()
});
var expectedUpdateResult = new List<UpdateResult> { new(projectDependencies[1].Name, "1.0.0", "2.0.0") };
_projectUpdater
.HandleProjectUpdate(projectList,
.HandleProjectUpdate(_config.Value.Projects[0], projectList,
Arg.Is<ICollection<DependencyDetails>>(detailsCollection =>
detailsCollection.SequenceEqual(expectedDependencyUpdate)))
.Returns(expectedUpdateResult);
Expand All @@ -299,7 +299,7 @@ public async Task Update_Should_Include()
// Assert
using (new AssertionScope())
{
_projectUpdater.Received(1).HandleProjectUpdate(projectList,
_projectUpdater.Received(1).HandleProjectUpdate(_config.Value.Projects[0], projectList,
Arg.Is<ICollection<DependencyDetails>>(detailsCollection =>
detailsCollection.SequenceEqual(expectedDependencyUpdate)));
_repositoryProvider.Received(1).CommitChanges(_currentDir, _config.Value.Projects[0].Name,
Expand Down Expand Up @@ -346,7 +346,7 @@ public async Task Update_Should_Exclude()
});
var expectedUpdateResult = new List<UpdateResult> { new(projectDependencies[0].Name, "1.0.0", "2.0.0") };
_projectUpdater
.HandleProjectUpdate(projectList,
.HandleProjectUpdate(_config.Value.Projects[0], projectList,
Arg.Is<ICollection<DependencyDetails>>(detailsCollection =>
detailsCollection.SequenceEqual(expectedDependencyUpdate)))
.Returns(expectedUpdateResult);
Expand All @@ -357,7 +357,7 @@ public async Task Update_Should_Exclude()
// Assert
using (new AssertionScope())
{
_projectUpdater.Received(1).HandleProjectUpdate(projectList,
_projectUpdater.Received(1).HandleProjectUpdate(_config.Value.Projects[0], projectList,
Arg.Is<ICollection<DependencyDetails>>(detailsCollection =>
detailsCollection.SequenceEqual(expectedDependencyUpdate)));
_repositoryProvider.Received(1).CommitChanges(_currentDir, _config.Value.Projects[0].Name,
Expand Down Expand Up @@ -386,7 +386,7 @@ public async Task Update_Should_GetPackageFromCacheIfExists()
_target.AddToCache(expectedDependencyUpdate[0], expectedDependencyUpdate);
var expectedUpdateResult = new List<UpdateResult> { new(projectDependencies[0].Name, "1.0.0", "2.0.0") };
_projectUpdater
.HandleProjectUpdate(projectList,
.HandleProjectUpdate(_config.Value.Projects[0], projectList,
Arg.Is<ICollection<DependencyDetails>>(detailsCollection =>
detailsCollection.SequenceEqual(expectedDependencyUpdate)))
.Returns(expectedUpdateResult);
Expand All @@ -397,7 +397,7 @@ public async Task Update_Should_GetPackageFromCacheIfExists()
// Assert
using (new AssertionScope())
{
_projectUpdater.Received(1).HandleProjectUpdate(projectList,
_projectUpdater.Received(1).HandleProjectUpdate(_config.Value.Projects[0], projectList,
Arg.Is<ICollection<DependencyDetails>>(detailsCollection =>
detailsCollection.SequenceEqual(expectedDependencyUpdate)));
_repositoryProvider.Received(1).CommitChanges(_currentDir, _config.Value.Projects[0].Name,
Expand Down Expand Up @@ -445,7 +445,7 @@ public async Task Update_Should_SkipPackageIfAlreadyProcessed()
});
var expectedUpdateResultFirst = new List<UpdateResult> { new(projectDependencies[1].Name, "1.0.0", "2.0.0") };
_projectUpdater
.HandleProjectUpdate(projectList,
.HandleProjectUpdate(_config.Value.Projects[0], projectList,
Arg.Is<ICollection<DependencyDetails>>(detailsCollection =>
detailsCollection.SequenceEqual(expectedDependencyUpdateFirst)))
.Returns(expectedUpdateResultFirst);
Expand All @@ -455,7 +455,7 @@ public async Task Update_Should_SkipPackageIfAlreadyProcessed()
});
var expectedUpdateResultSecond = new List<UpdateResult> { new(projectDependencies[0].Name, "1.0.0", "2.0.0") };
_projectUpdater
.HandleProjectUpdate(projectList,
.HandleProjectUpdate(_config.Value.Projects[0], projectList,
Arg.Is<ICollection<DependencyDetails>>(detailsCollection =>
detailsCollection.SequenceEqual(expectedDependencyUpdateSecond)))
.Returns(expectedUpdateResultSecond);
Expand All @@ -466,10 +466,10 @@ public async Task Update_Should_SkipPackageIfAlreadyProcessed()
// Assert
using (new AssertionScope())
{
_projectUpdater.Received(1).HandleProjectUpdate(projectList,
_projectUpdater.Received(1).HandleProjectUpdate(_config.Value.Projects[0], projectList,
Arg.Is<ICollection<DependencyDetails>>(detailsCollection =>
detailsCollection.SequenceEqual(expectedDependencyUpdateFirst)));
_projectUpdater.Received(1).HandleProjectUpdate(projectList,
_projectUpdater.Received(1).HandleProjectUpdate(_config.Value.Projects[0], projectList,
Arg.Is<ICollection<DependencyDetails>>(detailsCollection =>
detailsCollection.SequenceEqual(expectedDependencyUpdateSecond)));
_repositoryProvider.Received(1).CommitChanges(_currentDir, _config.Value.Projects[0].Name,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ public async Task GetVersions_Should_GetPackagesFromSource()
public async Task UpdateCsProj_Should_UpdateVersion()
{
// Arrange
var projectConfiguration = new Project() { Type = ProjectType.DotNet };
var projectToUpdate = "testProj.csproj";
if (File.Exists(projectToUpdate))
{
Expand All @@ -120,7 +121,7 @@ public async Task UpdateCsProj_Should_UpdateVersion()
File.Copy("./Projects/SampleProject.csproj", projectToUpdate);

// Act
var result = _target.HandleProjectUpdate([projectToUpdate],
var result = _target.HandleProjectUpdate(projectConfiguration, [projectToUpdate],
new List<DependencyDetails>() { new("Serilog", new Version(4, 0, 0)) });

// Assert
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public void HandleProjectUpdate_Should_UpdateProjectFile()
var depsToUpdate = new List<DependencyDetails>() { new("@angular/core", new Version(9, 0, 0)), };

// Act
var updateResult = _target.HandleProjectUpdate([projectToUpdate], depsToUpdate);
var updateResult = _target.HandleProjectUpdate(config, [projectToUpdate], depsToUpdate);

// Assert
using (new AssertionScope())
Expand Down

0 comments on commit a7589b4

Please sign in to comment.