Paginación
list() devuelve una página. Page<T> es una unión del sobre por offset (total_count, next) y el sobre por
cursor (has_more, next_cursor), y cuál de los dos obtienes depende del parámetro paginate de la petición.
Restríngelo con v2.isCursorPage / v2.isOffsetPage antes de leer un campo propio de un sobre concreto. Leer
uno sin restringir antes es un error de compilación, ya que puede no existir en la otra mitad de la unión:
import { v2 } from "@hoyasumii/plane";
const page = await client.v2.workspaces.projects.states.list("acme", "ENG");
if (v2.isOffsetPage(page)) {
console.log(page.total_count); // solo accesible una vez restringido
} else if (v2.isCursorPage(page)) {
console.log(page.next_cursor);
}
Toda página tiene data, las propias filas.
Los controles de paginación
Los params de list aceptan per_page, más offset (paginación por offset) o paginate: "cursor" con el
cursor de la página anterior. count: false omite calcular total_count en una página por offset.
const first = await client.v2.workspaces.projects.workItems.list("acme", "ENG", { per_page: 50, paginate: "cursor" });
if (v2.isCursorPage(first) && first.has_more) {
await client.v2.workspaces.projects.workItems.list("acme", "ENG", {
per_page: 50,
paginate: "cursor",
cursor: first.next_cursor ?? undefined,
});
}
iterate
iterate recorre las páginas por ti y devuelve filas, así que no acepta los controles que su propio bucle ya
gestiona. Las filas de un recurso navegable siguen siendo navegables:
for await (const item of client.v2.workspaces.projects.workItems.iterate("acme", "ENG", { per_page: 100 })) {
console.log(item.name);
}