// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import { CloudflareError } from './error'; import { FinalRequestOptions } from '../internal/request-options'; import { defaultParseResponse } from '../internal/parse'; import { type BaseCloudflare } from '../client'; import { APIPromise } from './api-promise'; import { type APIResponseProps } from '../internal/parse'; import { maybeObj } from '../internal/utils/values'; export type PageRequestOptions = Pick; export abstract class AbstractPage implements AsyncIterable { #client: BaseCloudflare; protected options: FinalRequestOptions; protected response: Response; protected body: unknown; constructor(client: BaseCloudflare, response: Response, body: unknown, options: FinalRequestOptions) { this.#client = client; this.options = options; this.response = response; this.body = body; } abstract nextPageRequestOptions(): PageRequestOptions | null; abstract getPaginatedItems(): Item[]; hasNextPage(): boolean { const items = this.getPaginatedItems(); if (!items.length) return false; return this.nextPageRequestOptions() != null; } async getNextPage(): Promise { const nextOptions = this.nextPageRequestOptions(); if (!nextOptions) { throw new CloudflareError( 'No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.', ); } return await this.#client.requestAPIList(this.constructor as any, nextOptions); } async *iterPages(): AsyncGenerator { let page: this = this; yield page; while (page.hasNextPage()) { page = await page.getNextPage(); yield page; } } async *[Symbol.asyncIterator](): AsyncGenerator { for await (const page of this.iterPages()) { for (const item of page.getPaginatedItems()) { yield item; } } } } /** * This subclass of Promise will resolve to an instantiated Page once the request completes. * * It also implements AsyncIterable to allow auto-paginating iteration on an unawaited list call, eg: * * for await (const item of client.items.list()) { * console.log(item) * } */ export class PagePromise< PageClass extends AbstractPage, Item = ReturnType[number], > extends APIPromise implements AsyncIterable { constructor( client: BaseCloudflare, request: Promise, Page: new (...args: ConstructorParameters) => PageClass, ) { super( client, request, async (client, props) => new Page(client, props.response, await defaultParseResponse(client, props), props.options), ); } /** * Allow auto-paginating iteration on an unawaited list call, eg: * * for await (const item of client.items.list()) { * console.log(item) * } */ async *[Symbol.asyncIterator](): AsyncGenerator { const page = await this; for await (const item of page) { yield item; } } } export interface V4PagePaginationResponse { result: V4PagePaginationResponse.Result; result_info: V4PagePaginationResponse.ResultInfo; } export namespace V4PagePaginationResponse { export interface Result { items?: Array; } export interface ResultInfo { page?: number; per_page?: number; } } export interface V4PagePaginationParams { page?: number; per_page?: number; } export class V4PagePagination extends AbstractPage implements V4PagePaginationResponse { result: V4PagePaginationResponse.Result; result_info: V4PagePaginationResponse.ResultInfo; constructor( client: BaseCloudflare, response: Response, body: V4PagePaginationResponse, options: FinalRequestOptions, ) { super(client, response, body, options); this.result = body.result || {}; this.result_info = body.result_info || {}; } getPaginatedItems(): Item[] { return this.result?.items ?? []; } nextPageRequestOptions(): PageRequestOptions | null { const query = this.options.query as V4PagePaginationParams; const currentPage = query?.page ?? 1; return { ...this.options, query: { ...maybeObj(this.options.query), page: currentPage + 1, }, }; } } export interface V4PagePaginationArrayResponse { result: Array; result_info: V4PagePaginationArrayResponse.ResultInfo; } export namespace V4PagePaginationArrayResponse { export interface ResultInfo { page?: number; per_page?: number; } } export interface V4PagePaginationArrayParams { page?: number; per_page?: number; } export class V4PagePaginationArray extends AbstractPage implements V4PagePaginationArrayResponse { result: Array; result_info: V4PagePaginationArrayResponse.ResultInfo; constructor( client: BaseCloudflare, response: Response, body: V4PagePaginationArrayResponse, options: FinalRequestOptions, ) { super(client, response, body, options); this.result = body.result || []; this.result_info = body.result_info || {}; } getPaginatedItems(): Item[] { return this.result ?? []; } nextPageRequestOptions(): PageRequestOptions | null { const query = this.options.query as V4PagePaginationArrayParams; const currentPage = query?.page ?? 1; return { ...this.options, query: { ...maybeObj(this.options.query), page: currentPage + 1, }, }; } } export interface CursorPaginationResponse { result: Array; result_info: CursorPaginationResponse.ResultInfo; } export namespace CursorPaginationResponse { export interface ResultInfo { count?: number; cursor?: string; per_page?: number; } } export interface CursorPaginationParams { per_page?: number; cursor?: string; } export class CursorPagination extends AbstractPage implements CursorPaginationResponse { result: Array; result_info: CursorPaginationResponse.ResultInfo; constructor( client: BaseCloudflare, response: Response, body: CursorPaginationResponse, options: FinalRequestOptions, ) { super(client, response, body, options); this.result = body.result || []; this.result_info = body.result_info || {}; } getPaginatedItems(): Item[] { return this.result ?? []; } nextPageRequestOptions(): PageRequestOptions | null { const cursor = this.result_info?.cursor; if (!cursor) { return null; } return { ...this.options, query: { ...maybeObj(this.options.query), cursor, }, }; } } export interface CursorPaginationAfterResponse { result: Array; result_info: CursorPaginationAfterResponse.ResultInfo; } export namespace CursorPaginationAfterResponse { export interface ResultInfo { cursors?: ResultInfo.Cursors; } export namespace ResultInfo { export interface Cursors { after?: string; } } } export interface CursorPaginationAfterParams { cursor?: string; } export class CursorPaginationAfter extends AbstractPage implements CursorPaginationAfterResponse { result: Array; result_info: CursorPaginationAfterResponse.ResultInfo; constructor( client: BaseCloudflare, response: Response, body: CursorPaginationAfterResponse, options: FinalRequestOptions, ) { super(client, response, body, options); this.result = body.result || []; this.result_info = body.result_info || {}; } getPaginatedItems(): Item[] { return this.result ?? []; } nextPageRequestOptions(): PageRequestOptions | null { const cursor = this.result_info?.cursors?.after; if (!cursor) { return null; } return { ...this.options, query: { ...maybeObj(this.options.query), cursor, }, }; } } export interface CursorLimitPaginationResponse { result: Array; result_info: CursorLimitPaginationResponse.ResultInfo; } export namespace CursorLimitPaginationResponse { export interface ResultInfo { count?: number; cursor?: string; per_page?: number; } } export interface CursorLimitPaginationParams { limit?: number; cursor?: string; } export class CursorLimitPagination extends AbstractPage implements CursorLimitPaginationResponse { result: Array; result_info: CursorLimitPaginationResponse.ResultInfo; constructor( client: BaseCloudflare, response: Response, body: CursorLimitPaginationResponse, options: FinalRequestOptions, ) { super(client, response, body, options); this.result = body.result || []; this.result_info = body.result_info || {}; } getPaginatedItems(): Item[] { return this.result ?? []; } nextPageRequestOptions(): PageRequestOptions | null { const cursor = this.result_info?.cursor; if (!cursor) { return null; } return { ...this.options, query: { ...maybeObj(this.options.query), cursor, }, }; } } export interface SinglePageResponse { result: Array; } export class SinglePage extends AbstractPage implements SinglePageResponse { result: Array; constructor( client: BaseCloudflare, response: Response, body: SinglePageResponse, options: FinalRequestOptions, ) { super(client, response, body, options); this.result = body.result || []; } getPaginatedItems(): Item[] { return this.result ?? []; } nextPageRequestOptions(): PageRequestOptions | null { return null; } }