UNPKG

mercadopago

Version:
93 lines (92 loc) 4.12 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createAutoPagingIterable = createAutoPagingIterable; const DEFAULT_PAGE_SIZE = 100; /** * Creates an `AsyncIterable<TResult>` that auto-fetches all pages. * * Supports both offset/limit pagination (Pattern A) and page/page_size * pagination (Pattern B, used by some Order endpoints). * * @param searchFn Callable that accepts search options and returns one page. * @param baseOptions Initial search options. `limit`/`offset` are managed automatically. * @param pageSize Items per page. Defaults to 100. */ function createAutoPagingIterable(searchFn, baseOptions, pageSize = DEFAULT_PAGE_SIZE) { return { [Symbol.asyncIterator]() { var _a; let offset = (_a = baseOptions === null || baseOptions === void 0 ? void 0 : baseOptions.offset) !== null && _a !== void 0 ? _a : 0; let page = 1; let buffer = []; let bufferIndex = 0; let done = false; let total = null; const fetchNextPage = async () => { var _a, _b, _c, _d, _e; if (done) return; const options = Object.assign(Object.assign({}, baseOptions), { limit: pageSize, offset }); const result = await searchFn(options); // Pattern A: offset/limit with paging.total if (result.results !== undefined) { const items = (_a = result.results) !== null && _a !== void 0 ? _a : []; buffer = items; bufferIndex = 0; if (total === null && result.paging) { total = result.paging.total; } offset += items.length; if (items.length === 0 || (total !== null && offset >= total)) { done = true; } return; } // Pattern B: page/page_size with elements (Orders) if (result.elements !== undefined) { const items = (_b = result.elements) !== null && _b !== void 0 ? _b : []; buffer = items; bufferIndex = 0; if (total === null) total = (_c = result.total) !== null && _c !== void 0 ? _c : 0; page++; offset = (page - 1) * pageSize; if (items.length === 0 || offset >= (total !== null && total !== void 0 ? total : 0)) { done = true; } return; } // Pattern C: data key with string paging (Orders v2 API) if (result.data !== undefined) { const items = (_d = result.data) !== null && _d !== void 0 ? _d : []; buffer = items; bufferIndex = 0; if (total === null && result.paging) { total = parseInt(String((_e = result.paging.total) !== null && _e !== void 0 ? _e : '0'), 10); } offset += items.length; if (items.length === 0 || (total !== null && offset >= total)) { done = true; } return; } done = true; }; return { async next() { if (bufferIndex < buffer.length) { return { value: buffer[bufferIndex++], done: false }; } if (done) { return { value: undefined, done: true }; } await fetchNextPage(); if (bufferIndex < buffer.length) { return { value: buffer[bufferIndex++], done: false }; } return { value: undefined, done: true }; }, }; }, }; }