@@ -141,6 +141,47 @@ export function usePackageDownloads(
141141 )
142142}
143143
144+ type NpmDownloadsRangeResponse = {
145+ start : string
146+ end : string
147+ package : string
148+ downloads : Array < { day : string ; downloads : number } >
149+ }
150+
151+ async function fetchNpmDownloadsRange (
152+ packageName : string ,
153+ start : string ,
154+ end : string ,
155+ ) : Promise < NpmDownloadsRangeResponse > {
156+ const encodedName = encodePackageName ( packageName )
157+ return await $fetch < NpmDownloadsRangeResponse > (
158+ `${ NPM_API } /downloads/range/${ start } :${ end } /${ encodedName } ` ,
159+ )
160+ }
161+
162+ export function usePackageWeeklyDownloadEvolution (
163+ name : MaybeRefOrGetter < string > ,
164+ options : MaybeRefOrGetter < {
165+ weeks ?: number
166+ endDate ?: string
167+ } > = { } ,
168+ ) {
169+ return useLazyAsyncData (
170+ ( ) => `downloads-weekly-evolution:${ toValue ( name ) } :${ JSON . stringify ( toValue ( options ) ) } ` ,
171+ async ( ) => {
172+ const packageName = toValue ( name )
173+ const { weeks = 12 , endDate } = toValue ( options ) ?? { }
174+ const end = endDate ? new Date ( `${ endDate } T00:00:00.000Z` ) : new Date ( )
175+ const start = addDays ( end , - ( weeks * 7 ) + 1 )
176+ const startIso = toIsoDateString ( start )
177+ const endIso = toIsoDateString ( end )
178+ const range = await fetchNpmDownloadsRange ( packageName , startIso , endIso )
179+ const sortedDaily = [ ...range . downloads ] . sort ( ( a , b ) => a . day . localeCompare ( b . day ) )
180+ return buildWeeklyEvolutionFromDaily ( sortedDaily )
181+ } ,
182+ )
183+ }
184+
144185const emptySearchResponse = {
145186 objects : [ ] ,
146187 total : 0 ,
0 commit comments