pagination.ts
Raw
1/**
2 * Compute pagination state for a list view.
3 *
4 * Clamps `page` into [1, totalPages] so an out-of-range query string
5 * (?page=999) lands on the last page instead of an empty offset.
6 */
7export function paginate(
8 rawPage: number | undefined,
9 totalCount: number,
10 perPage: number,
11): { page: number; totalPages: number; offset: number } {
12 const totalPages = Math.max(1, Math.ceil(totalCount / perPage));
13 const page = Math.min(Math.max(1, rawPage ?? 1), totalPages);
14 return { page, totalPages, offset: (page - 1) * perPage };
15}
16