@@ -11,12 +11,15 @@ const ALGOLIA_BATCH_SIZE = 1000
1111export interface OrgPackagesResponse extends NpmSearchResponse {
1212 /** Total number of packages in the org (may exceed objects.length before loadAll) */
1313 totalPackages : number
14+ /** All package names in the org (used by loadMore to know what to fetch next) */
15+ allPackageNames : string [ ]
1416}
1517
1618function emptyOrgResponse ( ) : OrgPackagesResponse {
1719 return {
1820 ...emptySearchResponse ( ) ,
1921 totalPackages : 0 ,
22+ allPackageNames : [ ] ,
2023 }
2124}
2225
@@ -37,8 +40,6 @@ export function useOrgPackages(orgName: MaybeRefOrGetter<string>) {
3740 } )
3841 const { getPackagesByNameSlice } = useAlgoliaSearch ( )
3942
40- // Tracks all package names so loadAll() knows what to fetch
41- const allNames = shallowRef < string [ ] > ( [ ] )
4243 const loadedObjects = shallowRef < NpmSearchResult [ ] > ( [ ] )
4344
4445 // Promise lock — scoped inside the composable to avoid cross-instance sharing
@@ -76,12 +77,10 @@ export function useOrgPackages(orgName: MaybeRefOrGetter<string>) {
7677 }
7778
7879 if ( packageNames . length === 0 ) {
79- allNames . value = [ ]
8080 loadedObjects . value = [ ]
8181 return emptyOrgResponse ( )
8282 }
8383
84- allNames . value = packageNames
8584 const initialNames = packageNames . slice ( 0 , INITIAL_BATCH_SIZE )
8685
8786 // Fetch metadata for first batch
@@ -129,16 +128,22 @@ export function useOrgPackages(orgName: MaybeRefOrGetter<string>) {
129128 objects : initialObjects ,
130129 total : initialObjects . length ,
131130 totalPackages : packageNames . length ,
131+ allPackageNames : packageNames ,
132132 time : new Date ( ) . toISOString ( ) ,
133133 } satisfies OrgPackagesResponse
134134 } ,
135135 { default : emptyOrgResponse } ,
136136 )
137137
138+ /** Read allPackageNames from async data (survives SSR→client hydration via Nuxt payload). */
139+ function allPackageNames ( ) : string [ ] {
140+ return asyncData . data . value ?. allPackageNames ?? [ ]
141+ }
142+
138143 /** Load the next batch of packages (default: 1 Algolia batch of 1000). */
139144 async function loadMore ( count : number = ALGOLIA_BATCH_SIZE ) : Promise < void > {
140145 const loadedSet = new Set ( loadedObjects . value . map ( o => o . package . name ) )
141- if ( loadedSet . size >= allNames . value . length ) return
146+ if ( loadedSet . size >= allPackageNames ( ) . length ) return
142147
143148 // Reuse in-flight promise to prevent duplicate fetches
144149 if ( loadAllPromise ) {
@@ -156,13 +161,13 @@ export function useOrgPackages(orgName: MaybeRefOrGetter<string>) {
156161
157162 /** Load ALL remaining packages (used when filters need the full dataset). */
158163 async function loadAll ( ) : Promise < void > {
159- const remaining = allNames . value . length - loadedObjects . value . length
164+ const remaining = allPackageNames ( ) . length - loadedObjects . value . length
160165 if ( remaining <= 0 ) return
161166 await loadMore ( remaining )
162167 }
163168
164169 async function _doLoadMore ( count : number ) : Promise < void > {
165- const names = allNames . value
170+ const names = allPackageNames ( )
166171 const current = loadedObjects . value
167172 const loadedSet = new Set ( current . map ( o => o . package . name ) )
168173 const remainingNames = names . filter ( n => ! loadedSet . has ( n ) ) . slice ( 0 , count )
@@ -219,6 +224,7 @@ export function useOrgPackages(orgName: MaybeRefOrGetter<string>) {
219224 objects : all ,
220225 total : all . length ,
221226 totalPackages : names . length ,
227+ allPackageNames : names ,
222228 time : new Date ( ) . toISOString ( ) ,
223229 }
224230 }
0 commit comments