It provides cursor-based pagination and page-based pagination. Even if there is a transformer in the column, it works perfectly.
npm install typeorm-paginator --save
import { CursorPaginator } from 'typeorm-paginator'
Single cursor-based pagination.
const paginator = new CursorPaginator(User, {
orderBy: {
id: false,
},
})
const pagination = await paginator.paginate(repoUsers.createQueryBuilder())
expect(pagination).toEqual({
nodes: [
/*
User { id: 3 },
User { id: 2 },
User { id: 1 },
*/
],
hasPrev: false,
hasNext: false,
nextCursor: expect.any(String),
prevCursor: expect.any(String),
})
Multi cursor-based pagination.
const paginator = new CursorPaginator(User, {
orderBy: [
{ name: true },
{ id: false },
],
})
const result = await paginator.paginate(repoUsers.createQueryBuilder(), { take: 2 })
expect(result).toEqual({
nodes: [
User { id: 3, name: 'a' },
User { id: 5, name: 'b' },
],
hasPrev: false,
hasNext: true,
prevCursor: expect.any(String),
nextCursor: expect.any(String),
})
const resultNext = await paginator.paginate(repoUsers.createQueryBuilder(), { take: 2, nextCursor: result.nextCursor })
expect(resultNext).toEqual({
nodes: [
User { id: 2, name: 'b' },
User { id: 6, name: 'c' },
],
hasPrev: true,
hasNext: true,
prevCursor: expect.any(String),
nextCursor: expect.any(String),
})
const resultNextNext = await paginator.paginate(repoUsers.createQueryBuilder(), { take: 2, nextCursor: resultNext.nextCursor })
expect(resultNextNext).toEqual({
nodes: [
User { id: 4, name: 'c' },
User { id: 1, name: 'c' },
],
hasPrev: true,
hasNext: false,
prevCursor: expect.any(String),
nextCursor: expect.any(String),
})
const resultNextNextPrev = await paginator.paginate(repoUsers.createQueryBuilder(), { take: 2, prevCursor: resultNextNext.prevCursor })
expect(resultNextNextPrev).toEqual({
nodes: [
User { id: 2, name: 'b' },
User { id: 6, name: 'c' },
],
hasPrev: true,
hasNext: true,
prevCursor: expect.any(String),
nextCursor: expect.any(String),
})
import { PagePaginator } from 'typeorm-paginator'
Single cursor-based pagination.
const paginator = new PagePaginator(User, {
orderBy: {
id: false,
},
take: 3,
})
const pagination1 = await paginator.paginate(repoUsers.createQueryBuilder())
expect(pagination1).toEqual({
nodes: [
/*
User { id: 5 },
User { id: 4 },
User { id: 3 },
*/
],
hasNext: true,
})
const pagination1 = await paginator.paginate(repoUsers.createQueryBuilder(), { page: 2 })
expect(pagination1).toEqual({
nodes: [
/*
User { id: 2 },
User { id: 1 },
*/
],
hasNext: false,
})