1- /* eslint-disable */ 
1+ /* eslint-disable @typescript-eslint/ban-ts-comment */ 
2+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ 
3+ import  type  {  Prisma ,  PrismaClient  }  from  '@prisma/client' ; 
4+ 
25export  interface  PaginatedResult < T >  { 
36  data : T [ ] ; 
47  meta : { 
@@ -11,35 +14,48 @@ export interface PaginatedResult<T> {
1114  } ; 
1215} 
1316
14- export  type  PaginateOptions  =  {  page ?: number  |  string ;  perPage ?: number  |  string  } ; 
15- export  type  PaginateFunction  =  < T ,  K > ( model : any ,  args ?: K ,  options ?: PaginateOptions )  =>  Promise < PaginatedResult < T > > ; 
16- 
17- export  const  createPaginator  =  ( defaultOptions : PaginateOptions ) : PaginateFunction  =>  { 
18-   return  async  ( model ,  args : any  =  {  where : undefined  } ,  options )  =>  { 
19-     const  page  =  Number ( options ?. page  ||  defaultOptions ?. page )  ||  1 ; 
20-     const  perPage  =  Number ( options ?. perPage  ||  defaultOptions ?. perPage )  ||  10 ; 
21- 
22-     const  skip  =  page  >  0  ? perPage  *  ( page  -  1 )  : 0 ; 
23-     const  [ total ,  data ]  =  await  Promise . all ( [ 
24-       model . count ( {  where : args . where  } ) , 
25-       model . findMany ( { 
26-         ...args , 
27-         take : perPage , 
28-         skip, 
29-       } ) , 
30-     ] ) ; 
31-     const  lastPage  =  Math . ceil ( total  /  perPage ) ; 
32- 
33-     return  { 
34-       data, 
35-       meta : { 
36-         total, 
37-         lastPage, 
38-         currentPage : page , 
39-         perPage, 
40-         prev : page  >  1  ? page  -  1  : null , 
41-         next : page  <  lastPage  ? page  +  1  : null , 
42-       } , 
43-     } ; 
17+ // see: https://github.com/prisma/prisma/issues/6980 
18+ type  ModelDelegates  =  { 
19+   [ K  in  Prisma . ModelName ] : PrismaClient [ Uncapitalize < K > ] ; 
20+ } ; 
21+ 
22+ export  type  PaginateOptions  =  {  page ?: number ;  perPage ?: number  } ; 
23+ export  type  PaginateFunction  =  < T ,  K  extends  Prisma . ModelName > ( 
24+   model : ModelDelegates [ K ] , 
25+   args ?: Parameters < ModelDelegates [ K ] [ 'findMany' ] > [ 0 ] , 
26+   options ?: PaginateOptions 
27+ )  =>  Promise < PaginatedResult < T > > ; 
28+ 
29+ export  const  calcSkip  =  ( page : number ,  perPage : number ) : number  =>  { 
30+   return  page  >  0  ? perPage  *  ( page  -  1 )  : 0 ; 
31+ } ; 
32+ 
33+ export  const  getMeta  =  ( total : number ,  page : number ,  perPage : number )  =>  { 
34+   const  lastPage  =  Math . ceil ( total  /  perPage ) ; 
35+ 
36+   return  { 
37+     total, 
38+     lastPage, 
39+     currentPage : page , 
40+     perPage, 
41+     prev : page  >  1  ? page  -  1  : null , 
42+     next : page  <  lastPage  ? page  +  1  : null , 
4443  } ; 
4544} ; 
45+ 
46+ export  const  paginate : PaginateFunction  =  async  ( model ,  args ,  options )  =>  { 
47+   const  {  page =  1 ,  perPage =  20  }  =  options  ||  { } ; 
48+ 
49+   const  [ total ,  data ]  =  await  Promise . all ( [ 
50+     // @ts -expect-error 
51+     model . count ( {  where : args ?. where  } ) , 
52+     // @ts -expect-error 
53+     model . findMany ( { 
54+       ...args , 
55+       take : perPage , 
56+       skip : calcSkip ( page ,  perPage ) , 
57+     } ) , 
58+   ] ) ; 
59+ 
60+   return  {  data,  meta : getMeta ( total  as  number ,  page ,  perPage )  } ; 
61+ } ; 
0 commit comments