Skip to content

H3aven-Labs/h3-prisma-pagination

 
 

Repository files navigation

Prisma Pagination

Helper library for Prisma offset pagination with Typescript support.

Version License

Installation

npm i prisma-pagination

Usage

import { createPaginator } from 'prisma-pagination'
import { User, Prisma } from '@prisma/client'

// ...

const paginate = createPaginator({ perPage: 20 })

app.get('/', async ({ query, prisma }, res) => {
  
  // Generic types can be passed to "paginate",
  // so args and result will be typed and autocompleted :)
  const result = await paginate<User, Prisma.UserFindManyArgs>(
    prisma.user,
    {
      where: {
        name: {
          contains: 'Alice'
        }
      }
      orderBy: {
        id: 'desc',
      }
    }, 
    { page: query.page }
  })

  /* Result structure:
  {
    data: User[]
    meta: {
      total: number
      lastPage: number
      currentPage: number
      perPage: number
      prev: number | null
      next: number | null
    }
  }
  */
})

For Express-like frameworks, page and perPage can be initialized in the middleware:

import { createPaginator } from 'prisma-pagination'

const pagination = (req, res, next) => {
  req.paginate = createPaginator({ page: req.query.page, perPage: 20 })

  next()
}

app.use(pagination)

so there is no need to pass page value in each handler:

app.get('/', async ({ paginate, prisma }, res) => {
  return await paginate(prisma.user)
})

To have proper Typescript support, Request interface can be extended this way:

import { PaginateFunction } from 'prisma-pagination'

declare global {
  namespace Express {
    export interface Request {
      paginate: PaginateFunction
    }
  }
}

Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

License

MIT

Packages

No packages published

Languages

  • TypeScript 100.0%