diff --git a/src/AnyPackage.Npm.psm1 b/src/AnyPackage.Npm.psm1 index 2ec2edc..c9c5979 100644 --- a/src/AnyPackage.Npm.psm1 +++ b/src/AnyPackage.Npm.psm1 @@ -3,7 +3,7 @@ using namespace AnyPackage.Provider using namespace System.Management.Automation [PackageProvider('Npm')] -class NpmProvider : PackageProvider, IGetPackage, IFindPackage, IInstallPackage { +class NpmProvider : PackageProvider, IGetPackage, IFindPackage, IInstallPackage, IUninstallPackage { [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPositionalParameters', '')] [void] FindPackage ([PackageRequest] $request) { $npmPackages = npm search $request.Name --json | ConvertFrom-Json @@ -74,6 +74,38 @@ class NpmProvider : PackageProvider, IGetPackage, IFindPackage, IInstallPackage $request.WritePackage($package) } } + + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '')] + [void] UninstallPackage ([PackageRequest] $request) { + $getPackageParameters = @{ + Name = $request.Name + Provider = $request.ProviderInfo.FullName + ErrorAction = 'SilentlyContinue' + } + + if ($request.Version) { + $getPackageParameters['Version'] = $request.Version + } + + $package = Get-Package @getPackageParameters + + if (!$package) { + return + } + + npm uninstall $request.Name -g 2>&1 | + ForEach-Object { + if ($_ -is [ErrorRecord]) { + $request.WriteError($_) + } else { + $request.WriteVerbose($_) + } + } + + if ($LASTEXITCODE -eq 0) { + $request.WritePackage($package) + } + } } [guid] $id = '977f95d8-f85d-4ae3-95fd-d6b5b55ae70e' diff --git a/test/Uninstall-Package.Tests.ps1 b/test/Uninstall-Package.Tests.ps1 new file mode 100644 index 0000000..bee6a7e --- /dev/null +++ b/test/Uninstall-Package.Tests.ps1 @@ -0,0 +1,14 @@ +#Requires -Modules AnyPackage.Npm + +Describe Uninstall-Package { + BeforeEach { + npm install posh-gulp -g + } + + Context 'with -Name parameter' { + It 'should uninstall' { + Uninstall-Package -Name posh-gulp -PassThru | + Should -Not -BeNullOrEmpty + } + } +}