diff --git a/src/AnyPackage.Npm.psm1 b/src/AnyPackage.Npm.psm1 index c9c5979..ff2feb8 100644 --- a/src/AnyPackage.Npm.psm1 +++ b/src/AnyPackage.Npm.psm1 @@ -9,10 +9,20 @@ class NpmProvider : PackageProvider, IGetPackage, IFindPackage, IInstallPackage, $npmPackages = npm search $request.Name --json | ConvertFrom-Json foreach ($item in $npmPackages) { - if ($request.IsMatch($item.name, $item.version)) { - $metadata = $item | ConvertTo-Metadata - $package = [PackageInfo]::new($item.name, $item.version, $null, $item.description, $null, $metadata, $request.ProviderInfo) - $request.WritePackage($package) + if ($request.IsMatch($item.name)) { + $config = npm config list registry -g --json | ConvertFrom-Json + $url = "{0}/{1}" -f $config.registry, $item.name + $packages = Invoke-WebRequest -Uri $url | Select-Object -ExpandProperty Content | ConvertFrom-Json | Select-Object -ExpandProperty versions + $versions = $packages | Get-Member -MemberType Properties | Select-Object -ExpandProperty Name + + foreach ($version in $versions) { + if ($request.IsMatch([PackageVersion]$version)) { + $package = $packages.$version + $metadata = $package | ConvertTo-Metadata + $packageInfo = [PackageInfo]::new($package.name, $version, $null, $package.description, $null, $metadata, $request.ProviderInfo) + $request.WritePackage($packageInfo) + } + } } } } diff --git a/test/Find-Package.Tests.ps1 b/test/Find-Package.Tests.ps1 index 57fe51b..3ead635 100644 --- a/test/Find-Package.Tests.ps1 +++ b/test/Find-Package.Tests.ps1 @@ -6,10 +6,19 @@ Describe Find-Package { Find-Package -Name cspell-dict-powershell | Should -Not -BeNullOrEmpty } + } + + Context 'with -Version parameter' { + It 'Explicit version' { + $package = Find-Package -Name cspell-dict-powershell -Version 1.0.1 + $package.Name | Should -Be cspell-dict-powershell + $package.Version | Should -Be 1.0.1 + } - It 'multiple names' { - Find-Package -Name cspell-dict-powershell, posh-gulp | - Should -HaveCount 2 + It 'Version range' { + $range = [AnyPackage.Provider.PackageVersionRange]::new('[1.0, 1.0.5)') + Find-Package -Name cspell-dict-powershell -Version '[1.0, 1.0.5)' | + ForEach-Object { $range.Satisfies($_.Version) | Should -BeTrue } } } }