@@ -156,7 +156,7 @@ export class PipPackageManager implements PackageManager, Disposable {
156156 }
157157 }
158158
159- async getAvailableVersions ( packageName : string , environment : PythonEnvironment ) : Promise < string [ ] | undefined > {
159+ async getAvailableVersions ( packageName : string , environment : PythonEnvironment ) : Promise < semver . SemVer [ ] | undefined > {
160160 try {
161161 const python = environment . execInfo ?. run ?. executable ;
162162 if ( ! python ) {
@@ -215,21 +215,22 @@ export class PipPackageManager implements PackageManager, Disposable {
215215 * No matching distribution found for <package>==__invalid__
216216 * ```
217217 */
218- export function parsePipInstallVersions ( output : string ) : string [ ] | undefined {
218+ export function parsePipInstallVersions ( output : string ) : semver . SemVer [ ] | undefined {
219219 const match = output . match ( / f r o m v e r s i o n s : \s * ( [ ^ \) ] + ) \) / ) ;
220220 if ( match && match [ 1 ] ) {
221221 return match [ 1 ]
222222 . split ( ',' )
223- . map ( ( v ) => v . trim ( ) )
224- . filter ( ( v ) => v . length > 0 ) ;
223+ . filter ( ( v ) => ! ! v . trim ( ) )
224+ . map ( ( v ) => semver . coerce ( v . trim ( ) ) as semver . SemVer )
225+ . sort ( ( a , b ) => semver . rcompare ( a , b ) ) ;
225226 }
226227}
227228
228229/**
229230 * Parses JSON output from `pip index versions <package> --json`.
230231 * Expected format: { "name": "...", "versions": ["1.2.3", "1.2.2", ...] }
231232 */
232- export function parsePipIndexVersionsJson ( output : string ) : string [ ] | undefined {
233+ export function parsePipIndexVersionsJson ( output : string ) : semver . SemVer [ ] | undefined {
233234 // Only capture output between braces
234235 const match = output . match ( / { [ \s \S ] * } / ) ;
235236 if ( ! match ) {
@@ -238,7 +239,10 @@ export function parsePipIndexVersionsJson(output: string): string[] | undefined
238239 try {
239240 const parsed = JSON . parse ( match [ 0 ] ) ;
240241 if ( parsed && Array . isArray ( parsed . versions ) && parsed . versions . length > 0 ) {
241- return parsed . versions ;
242+ return ( parsed . versions as string [ ] )
243+ . filter ( ( v ) => ! ! v . trim ( ) )
244+ . map ( ( v ) => semver . coerce ( v ) as semver . SemVer )
245+ . sort ( ( a , b ) => semver . rcompare ( a , b ) ) ;
242246 }
243247 return undefined ;
244248 } catch {
0 commit comments