Skip to content

Pagination

Arkorm provides both length-aware and simple pagination.

Length-aware pagination

ts
const page = await User.query().paginate(15, 2, {
  path: '/users',
  query: { role: 'admin' },
  fragment: 'list',
});

page.data.all();
page.meta.total;
page.meta.currentPage;
page.meta.lastPage;
page.nextPageUrl();

Simple pagination

ts
const page = await User.query().simplePaginate(15, 2, {
  path: '/users',
  pageName: 'p',
});

page.data.all();
page.meta.hasMorePages;
page.nextPageUrl();

URL driver customization

ts
import { URLDriver, defineConfig } from 'arkormx';

class AppURLDriver extends URLDriver {
  override url(page: number): string {
    return `/app${super.url(page)}`;
  }
}

export default defineConfig({
  adapter,
  pagination: {
    urlDriver: (options) => new AppURLDriver(options),
  },
});

Runtime current page resolution

If your framework already stores the active request context elsewhere, you can let Arkorm derive the current page when paginate() or simplePaginate() is called without an explicit page argument.

ts
import { defineConfig } from 'arkormx';

export default defineConfig({
  adapter,
  pagination: {
    resolveCurrentPage: (pageName) => {
      const value = getCurrentRequestQueryValue(pageName);
      const page = Number(value);

      return Number.isInteger(page) && page > 0 ? page : undefined;
    },
  },
});

const page = await User.query().paginate(15);

An explicit page argument still wins over the runtime resolver.