@@ -2,7 +2,7 @@ import { untar } from "@andrewbranch/untar.js";
22import { gunzipSync } from "fflate" ;
33import ts from "typescript" ;
44import { parsePackageSpec , type ParsedPackageSpec } from "./utils.js" ;
5- import { maxSatisfying , major , minor , valid , validRange } from "semver" ;
5+ import { maxSatisfying , major , minor , valid , validRange , coerce } from "semver" ;
66
77export class Package {
88 #files: Record < string , string | Uint8Array > = { } ;
@@ -106,16 +106,16 @@ export async function createPackageFromNpm(
106106 throw new Error ( parsed . error ) ;
107107 }
108108 const packageName = parsed . data . name ;
109+ const typesPackageName = ts . getTypesPackageName ( packageName ) ;
109110 const { tarballUrl, packageVersion } =
110111 parsed . data . versionKind === "none" && typeof definitelyTyped === "string"
111- ? await resolveImplementationPackageForTypesPackage ( packageName , definitelyTyped , { before } )
112+ ? await resolveImplementationPackageForTypesPackage ( typesPackageName , definitelyTyped , { before } )
112113 : await getNpmTarballUrl ( [ parsed . data ] , before ) ;
113114 const pkg = await createPackageFromTarballUrl ( tarballUrl ) ;
114115 if ( ! definitelyTyped || pkg . containsTypes ( ) ) {
115116 return pkg ;
116117 }
117118
118- const typesPackageName = ts . getTypesPackageName ( packageName ) ;
119119 let typesPackageData ;
120120 if ( definitelyTyped === true ) {
121121 typesPackageData = await resolveTypesPackageForPackage ( packageName , packageVersion , before ) ;
@@ -147,14 +147,30 @@ export async function resolveImplementationPackageForTypesPackage(
147147 throw new Error ( `'resolveImplementationPackageForTypesPackage' expects an @types package name and version` ) ;
148148 }
149149 const packageName = ts . unmangleScopedPackageName ( typesPackageName . slice ( "@types/" . length ) ) ;
150- return getNpmTarballUrl (
151- [
152- parsePackageSpec ( `${ packageName } @${ major ( typesPackageVersion ) } .${ minor ( typesPackageVersion ) } ` ) . data ! ,
153- parsePackageSpec ( `${ packageName } @${ major ( typesPackageVersion ) } ` ) . data ! ,
154- parsePackageSpec ( `${ packageName } @latest` ) . data ! ,
155- ] ,
156- options ?. before ,
157- ) ;
150+ const version = valid ( typesPackageVersion ) ;
151+ if ( version ) {
152+ return getNpmTarballUrl (
153+ [
154+ parsePackageSpec ( `${ packageName } @${ major ( version ) } .${ minor ( version ) } ` ) . data ! ,
155+ parsePackageSpec ( `${ packageName } @${ major ( version ) } ` ) . data ! ,
156+ parsePackageSpec ( `${ packageName } @latest` ) . data ! ,
157+ ] ,
158+ options ?. before ,
159+ ) ;
160+ }
161+
162+ const range = validRange ( typesPackageVersion ) ;
163+ if ( range ) {
164+ return getNpmTarballUrl (
165+ [
166+ { name : packageName , versionKind : "range" , version : range } ,
167+ { name : packageName , versionKind : "tag" , version : "latest" } ,
168+ ] ,
169+ options ?. before ,
170+ ) ;
171+ }
172+
173+ throw new Error ( `'resolveImplementationPackageForTypesPackage' expects a valid SemVer version or range` ) ;
158174}
159175
160176export async function resolveTypesPackageForPackage (
0 commit comments