11import fs from 'node:fs' ;
22import path from 'node:path' ;
33import { RockError } from '@rock-js/tools' ;
4- import packageJson from 'package-json' ;
54import * as tar from 'tar' ;
65import { getNameWithoutExtension } from './fs.js' ;
76
@@ -11,17 +10,17 @@ export async function downloadTarballFromNpm(
1110 targetDir : string ,
1211) {
1312 try {
14- const metadata = await packageJson ( packageName , { version } ) ;
13+ const versionData = await getPackageVersionData ( packageName , version ) ;
1514
16- const tarballUrl = metadata [ ' dist' ] ?. tarball ;
15+ const tarballUrl = versionData . dist ?. tarball ;
1716 if ( ! tarballUrl ) {
1817 throw new RockError ( 'Tarball URL not found.' ) ;
1918 }
2019
21- const response = await fetch ( tarballUrl ) ;
22- if ( ! response . ok ) {
20+ const tarballResponse = await fetch ( tarballUrl ) ;
21+ if ( ! tarballResponse . ok ) {
2322 throw new RockError (
24- `Failed to fetch package ${ packageName } : ${ response . statusText } ` ,
23+ `Failed to fetch package ${ packageName } : ${ tarballResponse . statusText } ` ,
2524 ) ;
2625 }
2726
@@ -30,7 +29,7 @@ export async function downloadTarballFromNpm(
3029 `${ packageName . replace ( '/' , '-' ) } .tgz` ,
3130 ) ;
3231 // Write the tarball to disk
33- const arrayBuffer = await response . arrayBuffer ( ) ;
32+ const arrayBuffer = await tarballResponse . arrayBuffer ( ) ;
3433 fs . writeFileSync ( tarballPath , new Uint8Array ( arrayBuffer ) ) ;
3534
3635 return tarballPath ;
@@ -41,6 +40,30 @@ export async function downloadTarballFromNpm(
4140 }
4241}
4342
43+ async function getPackageVersionData ( packageName : string , version : string ) {
44+ // Fetch package metadata from npm registry
45+ const registryUrl = `https://registry.npmjs.org/${ packageName } ` ;
46+ const response = await fetch ( registryUrl ) ;
47+
48+ if ( ! response . ok ) {
49+ throw new RockError (
50+ `Failed to fetch package metadata for ${ packageName } : ${ response . statusText } ` ,
51+ ) ;
52+ }
53+
54+ const metadata = await response . json ( ) ;
55+ const versionTag = metadata [ 'dist-tags' ] ?. [ version ] ;
56+ const versionData = versionTag
57+ ? metadata . versions ?. [ versionTag ]
58+ : metadata . versions ?. [ version ] ;
59+ if ( ! versionData ) {
60+ throw new RockError (
61+ `Version ${ version } not found for package ${ packageName } ` ,
62+ ) ;
63+ }
64+ return versionData ;
65+ }
66+
4467/**
4568 * Extracts a tarball to a temporary directory and returns the path to the extracted directory
4669 * @param tarballPath - Path to the tarball to extract
0 commit comments