import type { Options, RequestResult } from "@hey-api/client-fetch"; interface PaginatedResponse { count: number; next: string | null; previous: string | null; results: T[]; } interface PaginatedRequest { query?: { page?: number; // biome-ignore lint/style/useNamingConvention: api is in snake_case page_size?: number; }; } type PaginatedEndpoint = ( options?: Options, ) => RequestResult, unknown, ThrowOnError>; // TODO : If one day a test workflow is made for JS in this project // please test this function. A all cost. export const paginated = async ( endpoint: PaginatedEndpoint, options?: PaginatedRequest, ) => { const maxPerPage = 199; options.query.page_size = maxPerPage; options.query.page = 1; const firstPage = (await endpoint(options)).data; const results = firstPage.results; const nbElements = firstPage.count; const nbPages = Math.ceil(nbElements / maxPerPage); if (nbPages > 1) { const promises: Promise[] = []; for (let i = 2; i <= nbPages; i++) { const nextPage = structuredClone(options); nextPage.query.page = i; promises.push(endpoint(nextPage).then((res) => res.data.results)); } results.push(...(await Promise.all(promises)).flat()); } return results; };