@@ -227,20 +227,22 @@ async function getNpmTarballUrl(
227
227
for ( const packageSpec of packageSpecs ) {
228
228
const manifestUrl = `https://registry.npmjs.org/${ packageSpec . name } /${ packageSpec . version || "latest" } ` ;
229
229
const doc = packument || ( await fetch ( manifestUrl ) . then ( ( r ) => r . json ( ) ) ) ;
230
- if ( typeof doc !== "object" ) {
231
- continue ;
230
+ if ( typeof doc !== "object" || ( doc . error && doc . error !== "Not found" ) ) {
231
+ throw new Error ( `Unexpected response from ${ manifestUrl } : ${ JSON . stringify ( doc ) } ` ) ;
232
232
}
233
233
const isManifest = ! ! doc . version ;
234
234
let tarballUrl , packageVersion ;
235
235
if ( packageSpec . versionKind === "range" ) {
236
- packageVersion = maxSatisfying (
237
- Object . keys ( doc . versions ) . filter (
238
- ( v ) =>
239
- ( allowDeprecated || ! doc . versions [ v ] . deprecated ) &&
240
- ( ! before || ! doc . time || new Date ( doc . time [ v ] ) <= before ) ,
241
- ) ,
242
- packageSpec . version ,
243
- ) ;
236
+ packageVersion =
237
+ doc . versions &&
238
+ maxSatisfying (
239
+ Object . keys ( doc . versions ) . filter (
240
+ ( v ) =>
241
+ ( allowDeprecated || ! doc . versions [ v ] . deprecated ) &&
242
+ ( ! before || ! doc . time || new Date ( doc . time [ v ] ) <= before ) ,
243
+ ) ,
244
+ packageSpec . version ,
245
+ ) ;
244
246
if ( ! packageVersion ) {
245
247
continue ;
246
248
}
@@ -256,17 +258,24 @@ async function getNpmTarballUrl(
256
258
tarballUrl = doc . versions [ packageVersion ] . dist . tarball ;
257
259
} else if ( isManifest ) {
258
260
packageVersion = doc . version ;
259
- tarballUrl = doc . dist . tarball ;
261
+ tarballUrl = doc . dist ? .tarball ;
260
262
} else {
261
- packageVersion = doc [ "dist-tags" ] . latest ;
262
- tarballUrl = doc . versions [ packageVersion ] . dist . tarball ;
263
+ packageVersion = doc [ "dist-tags" ] ? .latest ;
264
+ tarballUrl = doc . versions ?. [ packageVersion ] . dist . tarball ;
263
265
}
264
266
265
267
if ( packageVersion && tarballUrl ) {
266
268
return { packageName : packageSpec . name , packageVersion, tarballUrl } ;
267
269
}
268
270
}
269
- throw new Error ( `Failed to find a matching version for ${ packageSpecs [ 0 ] . name } ` ) ;
271
+ throw new Npm404Error ( packageSpecs ) ;
272
+ }
273
+
274
+ export class Npm404Error extends Error {
275
+ kind = "Npm404Error" ;
276
+ constructor ( public packageSpecs : readonly ParsedPackageSpec [ ] ) {
277
+ super ( `Failed to find a matching version for ${ packageSpecs [ 0 ] . name } ` ) ;
278
+ }
270
279
}
271
280
272
281
export async function createPackageFromTarballUrl ( tarballUrl : string ) : Promise < Package > {
0 commit comments