@@ -8,36 +8,39 @@ 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+ // oxlint-disable-next-line no-console -- error logging
21+ console .error (' failed to fetch tarball' , { cause: error })
22+ return null
23+ }
24+ }
25+
1126async function downloadPackage() {
1227 const tarballUrl = props .version .dist .tarball
1328 if (! tarballUrl ) return
1429
1530 if (loading .value ) return
1631 loading .value = true
1732
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 )
33+ const downloadUrl = await getDownloadUrl (tarballUrl )
34+
35+ const link = document .createElement (' a' )
36+ link .href = downloadUrl ?? 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 )
41+
42+ if (downloadUrl ) {
43+ URL .revokeObjectURL (downloadUrl )
4144 }
4245
4346 loading .value = false
0 commit comments