Skip to content

Commit

Permalink
🐛 Fix types declarations
Browse files Browse the repository at this point in the history
  • Loading branch information
Sukaato committed Mar 2, 2021
1 parent 9eb0a4f commit 6a627a2
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 76 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "mongoose-plugin-paginate",
"version": "1.0.0-pre2",
"version": "1.0.0-pre3",
"description": "Pagination plugin for mongoose",
"main": "dist/index.js",
"types": "dist/index.d.ts",
Expand Down
66 changes: 22 additions & 44 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,52 +1,30 @@
import { Document, Model, PaginateOption, PaginateResult, Schema } from 'mongoose';
import 'mongoose';

const defaultOptions: PaginateOption<any> = {
query: {},
page: 1,
limit: 10
}

async function paginate<T extends Document>(options: PaginateOption<T> = defaultOptions): Promise<PaginateResult<T>> {
const model = this as Model<T>;
const documentCount = await model.estimatedDocumentCount();
const query = options.query ?? defaultOptions.query;
const page = parse(options?.page, defaultOptions.page);
const limit = parse(options?.limit, defaultOptions.limit);
const pages = parse(Math.ceil(documentCount / limit));
const hasPrev = page > 1;
const hasNext = page < pages;
const skip = limit * (page - 1);
const documentsQuery = model.find(query).skip(skip).limit(limit);
declare module 'mongoose' {

if (options.populate) {
if (!Array.isArray(options.populate)) options.populate = [ options.populate ];

options.populate.forEach(populate => {
documentsQuery.populate(populate);
});
export interface PaginateOption<T extends Document> {
query?: FilterQuery<T>;
page?: number;
limit?: number;
populate?: PopulateOptions | PopulateOptions[];
}
const documents = await documentsQuery.exec();

return {
docs: documents,
docsCount: documentCount,
page: page,
limit: limit,
pagesCount: pages,
hasPrev: hasPrev,
hasNext: hasNext,
};
}

function parse(value: any, defaultValue: number = 1): number {
const number = +value;
export interface PaginateResult<T extends Document> {
docs: T[];
docsCount: number;
page: number,
limit: number;
pagesCount: number;
hasPrev: boolean;
hasNext: boolean;
}

if (isNaN(number) || number < 1) return defaultValue;
return number;
}
export interface PaginateModel<T extends Document> extends Model<T> {
paginate(): Promise<PaginateResult<T>>;
paginate(options: PaginateOption<T>): Promise<PaginateResult<T>>;
}

export function mongoosePaginate(schema: Schema) {
schema.statics.paginate = paginate;
export function model<T extends Document>(name: string, schema?: Schema<T>, collection?: string, skipInit?: boolean): PaginateModel<T>;
}

export default mongoosePaginate;
export * from './plugin';
28 changes: 0 additions & 28 deletions src/module.ts

This file was deleted.

50 changes: 50 additions & 0 deletions src/plugin.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { Document, Model, PaginateOption, PaginateResult, Schema } from 'mongoose';

const defaultOptions: PaginateOption<any> = {
query: {},
page: 1,
limit: 10
}

async function paginate<T extends Document>(options: PaginateOption<T> = defaultOptions): Promise<PaginateResult<T>> {
const model = this as Model<T>;
const documentCount = await model.estimatedDocumentCount();
const query = options.query ?? defaultOptions.query;
const page = parse(options?.page, defaultOptions.page);
const limit = parse(options?.limit, defaultOptions.limit);
const pages = parse(Math.ceil(documentCount / limit));
const hasPrev = page > 1;
const hasNext = page < pages;
const skip = limit * (page - 1);
const documentsQuery = model.find(query).skip(skip).limit(limit);

if (options.populate) {
if (!Array.isArray(options.populate)) options.populate = [ options.populate ];

options.populate.forEach(populate => {
documentsQuery.populate(populate);
});
}
const documents = await documentsQuery.exec();

return {
docs: documents,
docsCount: documentCount,
page: page,
limit: limit,
pagesCount: pages,
hasPrev: hasPrev,
hasNext: hasNext,
};
}

function parse(value: any, defaultValue: number = 1): number {
const number = +value;

if (isNaN(number) || number < 1) return defaultValue;
return number;
}

export function mongoosePaginate(schema: Schema) {
schema.statics.paginate = paginate;
}
6 changes: 3 additions & 3 deletions test/utils/schema.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Document, model, PaginateModel, Schema } from 'mongoose';
import mongoosePaginate from '../../src';
import { Document, Model, model, PaginateModel, Schema } from 'mongoose';
import { mongoosePaginate } from '../../src';

export interface Tag extends Document {
name: string;
Expand All @@ -15,7 +15,7 @@ export const TagsSchema = new Schema<Tag>({
name: { type: String },
description: { type: String }
});
export const TagModel = model('Tag', TagsSchema);
export const TagModel: Model<Tag> = model('Tag', TagsSchema);

export const VideoSchema = new Schema<Video>({
name: { type: String },
Expand Down

0 comments on commit 6a627a2

Please sign in to comment.