@@ -8,36 +8,38 @@ const props = defineProps<{
88
99const loading = shallowRef (false )
1010
11+ async function getDownloadUrl(tarballUrl : string ) {
12+ try {
13+ const response = await fetch (tarballUrl )
14+ if (! response .ok ) {
15+ throw new Error (` Failed to fetch tarball (${response .status }) ` )
16+ }
17+ const blob = await response .blob ()
18+ return URL .createObjectURL (blob )
19+ } catch (error ) {
20+ console .error (' failed to fetch tarball' , { cause: error })
21+ return null
22+ }
23+ }
24+
1125async function downloadPackage() {
1226 const tarballUrl = props .version .dist .tarball
1327 if (! tarballUrl ) return
1428
1529 if (loading .value ) return
1630 loading .value = true
1731
18- try {
19- const response = await fetch (tarballUrl )
20- if (! response .ok ) {
21- loading .value = false
22- throw new Error (` Failed to fetch tarball (${response .status }) ` )
23- }
24- const blob = await response .blob ()
25- const url = URL .createObjectURL (blob )
26- const link = document .createElement (' a' )
27- link .href = url
28- link .download = ` ${props .packageName .replace (/ \/ / g , ' __' )}-${props .version .version }.tgz `
29- document .body .appendChild (link )
30- link .click ()
31- document .body .removeChild (link )
32- URL .revokeObjectURL (url )
33- } catch {
34- // Fallback to direct link for non-CORS or other issues, though download attribute may be ignored
35- const link = document .createElement (' a' )
36- link .href = tarballUrl
37- link .download = ` ${props .packageName .replace (/ \/ / g , ' __' )}-${props .version .version }.tgz `
38- document .body .appendChild (link )
39- link .click ()
40- document .body .removeChild (link )
32+ const downloadUrl = await getDownloadUrl (tarballUrl )
33+
34+ const link = document .createElement (' a' )
35+ link .href = downloadUrl ?? tarballUrl
36+ link .download = ` ${props .packageName .replace (/ \/ / g , ' __' )}-${props .version .version }.tgz `
37+ document .body .appendChild (link )
38+ link .click ()
39+ document .body .removeChild (link )
40+
41+ if (downloadUrl ) {
42+ URL .revokeObjectURL (downloadUrl )
4143 }
4244
4345 loading .value = false
0 commit comments