Skip to content

wan2land/typeorm-paginator

Repository files navigation

TypeORM Paginator

Build Downloads Version License
dependencies Status devDependencies Status

It provides cursor-based pagination and page-based pagination. Even if there is a transformer in the column, it works perfectly.

Installation

npm install typeorm-paginator --save

Usage

Cursor-based Pagination

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),
})

Page-based Pagination

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,
})

About

TypeORM query builder pagination library. (cursor / page both)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published