@@ -35,9 +35,7 @@ interface PackageJson {
3535async function fetchPackageJson ( packageName : string , version : string ) : Promise < PackageJson | null > {
3636 try {
3737 const url = `https://cdn.jsdelivr.net/npm/${ packageName } @${ version } /package.json`
38- const response = await fetch ( url )
39- if ( ! response . ok ) return null
40- return ( await response . json ( ) ) as PackageJson
38+ return await $fetch < PackageJson > ( url )
4139 } catch {
4240 return null
4341 }
@@ -52,38 +50,45 @@ async function fetchFileContent(
5250 filePath : string ,
5351) : Promise < string > {
5452 const url = `https://cdn.jsdelivr.net/npm/${ packageName } @${ version } /${ filePath } `
55- const response = await fetch ( url )
5653
57- if ( ! response . ok ) {
58- if ( response . status === 404 ) {
54+ try {
55+ const content = await $fetch < string > ( url , {
56+ responseType : 'text' ,
57+ onResponse ( { response } ) {
58+ const contentLength = response . headers . get ( 'content-length' )
59+ if ( contentLength && parseInt ( contentLength , 10 ) > MAX_FILE_SIZE ) {
60+ throw createError ( {
61+ statusCode : 413 ,
62+ message : `File too large (${ ( parseInt ( contentLength , 10 ) / 1024 / 1024 ) . toFixed ( 1 ) } MB). Maximum size is ${ MAX_FILE_SIZE / 1024 } KB.` ,
63+ } )
64+ }
65+ } ,
66+ } )
67+
68+ // Double-check size after fetching (in case content-length wasn't set)
69+ if ( content . length > MAX_FILE_SIZE ) {
70+ throw createError ( {
71+ statusCode : 413 ,
72+ message : `File too large (${ ( content . length / 1024 / 1024 ) . toFixed ( 1 ) } MB). Maximum size is ${ MAX_FILE_SIZE / 1024 } KB.` ,
73+ } )
74+ }
75+
76+ return content
77+ } catch ( error : unknown ) {
78+ // Re-throw H3 errors (including our 413 from above)
79+ if ( error && typeof error === 'object' && 'statusCode' in error ) {
80+ throw error
81+ }
82+ // ofetch throws FetchError for non-2xx responses
83+ const fetchError = error as { response ?: { status ?: number } }
84+ if ( fetchError . response ?. status === 404 ) {
5985 throw createError ( { statusCode : 404 , message : 'File not found' } )
6086 }
6187 throw createError ( {
6288 statusCode : 502 ,
6389 message : 'Failed to fetch file from jsDelivr' ,
6490 } )
6591 }
66-
67- // Check content-length header if available
68- const contentLength = response . headers . get ( 'content-length' )
69- if ( contentLength && parseInt ( contentLength , 10 ) > MAX_FILE_SIZE ) {
70- throw createError ( {
71- statusCode : 413 ,
72- message : `File too large (${ ( parseInt ( contentLength , 10 ) / 1024 / 1024 ) . toFixed ( 1 ) } MB). Maximum size is ${ MAX_FILE_SIZE / 1024 } KB.` ,
73- } )
74- }
75-
76- const content = await response . text ( )
77-
78- // Double-check size after fetching (in case content-length wasn't set)
79- if ( content . length > MAX_FILE_SIZE ) {
80- throw createError ( {
81- statusCode : 413 ,
82- message : `File too large (${ ( content . length / 1024 / 1024 ) . toFixed ( 1 ) } MB). Maximum size is ${ MAX_FILE_SIZE / 1024 } KB.` ,
83- } )
84- }
85-
86- return content
8792}
8893
8994/**
0 commit comments