UNPKG

@planet-a/affinity-node

Version:
38 lines (37 loc) 1.3 kB
import { assert } from '../deps/jsr.io/@std/assert/1.0.16/mod.js'; /** * Given a function that returns a paged response, return an async generator that yields all pages. * * @example * ```ts * const paginatedCompanies = paginated(companiesApi.getV2Companies.bind(companiesApi)) * for await (const page of paginatedCompanies({ limit: 1 })) { * console.log(page) * } * ``` */ export const paginated = (pagedFn) => { return async function* (...args) { let page = await pagedFn(...args); if (!page.data || page.data.length === 0) { yield []; return; } while (page.data && page.data.length > 0) { const { data, pagination } = page; yield data; if (!pagination.nextUrl) { break; } // We could parse all query params here and mix them back in // for now we just grab the cursor and keep the others local const cursor = new URLSearchParams(new URL(pagination.nextUrl).search).get('cursor'); assert(cursor, 'Expected cursor to be present'); const [query, ...rest] = args; page = await pagedFn({ ...query || {}, cursor, }, ...rest); } }; };