@hedhog/pagination 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/constants/pagination.constants.d.ts +3 -0
  2. package/dist/constants/pagination.constants.d.ts.map +1 -0
  3. package/dist/constants/pagination.constants.js +6 -0
  4. package/dist/constants/pagination.constants.js.map +1 -0
  5. package/dist/decorator/pagination.decorator.d.ts +3 -0
  6. package/dist/decorator/pagination.decorator.d.ts.map +1 -0
  7. package/dist/decorator/pagination.decorator.js +54 -0
  8. package/dist/decorator/pagination.decorator.js.map +1 -0
  9. package/dist/dto/pagination.dto.d.ts +10 -0
  10. package/dist/dto/pagination.dto.d.ts.map +1 -0
  11. package/dist/dto/pagination.dto.js +52 -0
  12. package/dist/dto/pagination.dto.js.map +1 -0
  13. package/dist/enums/patination.enums.d.ts +12 -0
  14. package/dist/enums/patination.enums.d.ts.map +1 -0
  15. package/dist/enums/patination.enums.js +17 -0
  16. package/dist/enums/patination.enums.js.map +1 -0
  17. package/dist/index.d.ts +8 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +23 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/pagination.module.d.ts +3 -0
  22. package/dist/pagination.module.d.ts.map +1 -0
  23. package/dist/pagination.module.js +22 -0
  24. package/dist/pagination.module.js.map +1 -0
  25. package/dist/pagination.service.d.ts +7 -0
  26. package/dist/pagination.service.d.ts.map +1 -0
  27. package/dist/pagination.service.js +104 -0
  28. package/dist/pagination.service.js.map +1 -0
  29. package/dist/pagination.service.spec.d.ts +2 -0
  30. package/dist/pagination.service.spec.d.ts.map +1 -0
  31. package/dist/pagination.service.spec.js +17 -0
  32. package/dist/pagination.service.spec.js.map +1 -0
  33. package/dist/types/pagination.types.d.ts +33 -0
  34. package/dist/types/pagination.types.d.ts.map +1 -0
  35. package/dist/types/pagination.types.js +3 -0
  36. package/dist/types/pagination.types.js.map +1 -0
  37. package/package.json +2 -2
  38. package/src/decorator/pagination.decorator.ts +35 -13
  39. package/src/dto/pagination.dto.ts +2 -2
  40. package/src/enums/patination.enums.ts +2 -2
  41. package/src/pagination.service.ts +1 -1
@@ -0,0 +1,3 @@
1
+ export declare const DEFAULT_PAGE = 1;
2
+ export declare const DEFAULT_PAGE_SIZE = 20;
3
+ //# sourceMappingURL=pagination.constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.constants.d.ts","sourceRoot":"","sources":["../../src/constants/pagination.constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,iBAAiB,KAAK,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_PAGE_SIZE = exports.DEFAULT_PAGE = void 0;
4
+ exports.DEFAULT_PAGE = 1;
5
+ exports.DEFAULT_PAGE_SIZE = 20;
6
+ //# sourceMappingURL=pagination.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.constants.js","sourceRoot":"","sources":["../../src/constants/pagination.constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,YAAY,GAAG,CAAC,CAAC;AACjB,QAAA,iBAAiB,GAAG,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { PaginationField } from '../enums/patination.enums';
2
+ export declare const Pagination: (...dataOrPipes: (import("@nestjs/common").PipeTransform<any, any> | import("@nestjs/common").Type<import("@nestjs/common").PipeTransform<any, any>> | PaginationField)[]) => ParameterDecorator;
3
+ //# sourceMappingURL=pagination.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.decorator.d.ts","sourceRoot":"","sources":["../../src/decorator/pagination.decorator.ts"],"names":[],"mappings":"AASA,OAAO,EAAsB,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAMhF,eAAO,MAAM,UAAU,kMAoEtB,CAAC"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Pagination = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const pagination_constants_1 = require("../constants/pagination.constants");
6
+ const patination_enums_1 = require("../enums/patination.enums");
7
+ const class_transformer_1 = require("class-transformer");
8
+ const pagination_dto_1 = require("../dto/pagination.dto");
9
+ const class_validator_1 = require("class-validator");
10
+ exports.Pagination = (0, common_1.createParamDecorator)((data, ctx) => {
11
+ const request = ctx.switchToHttp().getRequest();
12
+ const defaultOptions = {
13
+ page: pagination_constants_1.DEFAULT_PAGE,
14
+ pageSize: pagination_constants_1.DEFAULT_PAGE_SIZE,
15
+ search: '',
16
+ sortField: 'id',
17
+ sortOrder: patination_enums_1.PageOrderDirection.Asc,
18
+ fields: '',
19
+ };
20
+ const requestData = Object.assign(Object.assign(Object.assign({}, defaultOptions), (request.body || {})), (request.query || {}));
21
+ const { page = defaultOptions.page, pageSize = defaultOptions.pageSize, search = defaultOptions.search, sortField = defaultOptions.sortField, sortOrder = defaultOptions.sortOrder, fields = defaultOptions.fields, } = requestData;
22
+ const validSortOrder = Object.values(patination_enums_1.PageOrderDirection).includes(sortOrder)
23
+ ? sortOrder
24
+ : defaultOptions.sortOrder;
25
+ const finalData = {
26
+ page,
27
+ pageSize,
28
+ search,
29
+ sortField,
30
+ sortOrder: validSortOrder,
31
+ fields,
32
+ };
33
+ const paginationDtoInstance = (0, class_transformer_1.plainToClass)(pagination_dto_1.PaginationDTO, finalData);
34
+ const errors = (0, class_validator_1.validateSync)(paginationDtoInstance);
35
+ if (errors.length > 0) {
36
+ throw new common_1.BadRequestException('Pagination data is not valid according to PaginationDto: ' +
37
+ errors
38
+ .map((error) => Object.values(error.constraints).join(', '))
39
+ .join(', '));
40
+ }
41
+ if (data) {
42
+ switch (data) {
43
+ case patination_enums_1.PaginationField.Page:
44
+ case patination_enums_1.PaginationField.PageSize:
45
+ return finalData[data] ? +finalData[data] : defaultOptions[data];
46
+ case patination_enums_1.PaginationField.SortOrder:
47
+ return validSortOrder || defaultOptions[data];
48
+ default:
49
+ return finalData[data];
50
+ }
51
+ }
52
+ return finalData;
53
+ });
54
+ //# sourceMappingURL=pagination.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.decorator.js","sourceRoot":"","sources":["../../src/decorator/pagination.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAIwB;AACxB,4EAG2C;AAC3C,gEAAgF;AAEhF,yDAAiD;AACjD,0DAAsD;AACtD,qDAA+C;AAElC,QAAA,UAAU,GAAG,IAAA,6BAAoB,EAC5C,CAAC,IAAqB,EAAE,GAAqB,EAAkB,EAAE;IAC/D,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;IAEhD,MAAM,cAAc,GAAmB;QACrC,IAAI,EAAE,mCAAY;QAClB,QAAQ,EAAE,wCAAiB;QAC3B,MAAM,EAAE,EAAE;QACV,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,qCAAkB,CAAC,GAAG;QACjC,MAAM,EAAE,EAAE;KACX,CAAC;IAEF,MAAM,WAAW,iDACZ,cAAc,GACd,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,GACpB,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CACzB,CAAC;IAEF,MAAM,EACJ,IAAI,GAAG,cAAc,CAAC,IAAI,EAC1B,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAClC,MAAM,GAAG,cAAc,CAAC,MAAM,EAC9B,SAAS,GAAG,cAAc,CAAC,SAAS,EACpC,SAAS,GAAG,cAAc,CAAC,SAAS,EACpC,MAAM,GAAG,cAAc,CAAC,MAAM,GAC/B,GAAG,WAAW,CAAC;IAEhB,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,qCAAkB,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC1E,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC;IAE7B,MAAM,SAAS,GAAG;QAChB,IAAI;QACJ,QAAQ;QACR,MAAM;QACN,SAAS;QACT,SAAS,EAAE,cAAc;QACzB,MAAM;KACP,CAAC;IAEF,MAAM,qBAAqB,GAAG,IAAA,gCAAY,EAAC,8BAAa,EAAE,SAAS,CAAC,CAAC;IAErE,MAAM,MAAM,GAAG,IAAA,8BAAY,EAAC,qBAAqB,CAAC,CAAC;IAEnD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,4BAAmB,CAC3B,2DAA2D;YACzD,MAAM;iBACH,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBAC3D,IAAI,CAAC,IAAI,CAAC,CAChB,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,kCAAe,CAAC,IAAI,CAAC;YAC1B,KAAK,kCAAe,CAAC,QAAQ;gBAC3B,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YACnE,KAAK,kCAAe,CAAC,SAAS;gBAC5B,OAAO,cAAc,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;YAChD;gBACE,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CACF,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { PageOrderDirection } from '../enums/patination.enums';
2
+ export declare class PaginationDTO {
3
+ page: number;
4
+ pageSize: number;
5
+ search: string;
6
+ sortField: string;
7
+ sortOrder: PageOrderDirection;
8
+ fields: string;
9
+ }
10
+ //# sourceMappingURL=pagination.dto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.dto.d.ts","sourceRoot":"","sources":["../../src/dto/pagination.dto.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,qBAAa,aAAa;IAIxB,IAAI,EAAE,MAAM,CAAC;IAKb,QAAQ,EAAE,MAAM,CAAC;IAIjB,MAAM,EAAE,MAAM,CAAC;IAIf,SAAS,EAAE,MAAM,CAAC;IAKlB,SAAS,EAAE,kBAAkB,CAAC;IAI9B,MAAM,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.PaginationDTO = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const patination_enums_1 = require("../enums/patination.enums");
16
+ class PaginationDTO {
17
+ }
18
+ exports.PaginationDTO = PaginationDTO;
19
+ __decorate([
20
+ (0, class_validator_1.IsOptional)(),
21
+ (0, class_transformer_1.Transform)(({ value }) => Number(value)),
22
+ (0, class_validator_1.IsInt)({ message: 'page must be an integer' }),
23
+ __metadata("design:type", Number)
24
+ ], PaginationDTO.prototype, "page", void 0);
25
+ __decorate([
26
+ (0, class_validator_1.IsOptional)(),
27
+ (0, class_transformer_1.Transform)(({ value }) => Number(value)),
28
+ (0, class_validator_1.IsInt)({ message: 'pageSize must be an integer' }),
29
+ __metadata("design:type", Number)
30
+ ], PaginationDTO.prototype, "pageSize", void 0);
31
+ __decorate([
32
+ (0, class_validator_1.IsOptional)(),
33
+ (0, class_validator_1.IsString)({ message: 'search must be a string' }),
34
+ __metadata("design:type", String)
35
+ ], PaginationDTO.prototype, "search", void 0);
36
+ __decorate([
37
+ (0, class_validator_1.IsOptional)(),
38
+ (0, class_validator_1.IsString)({ message: 'field must be a string' }),
39
+ __metadata("design:type", String)
40
+ ], PaginationDTO.prototype, "sortField", void 0);
41
+ __decorate([
42
+ (0, class_validator_1.IsOptional)(),
43
+ (0, class_validator_1.IsString)({ message: 'sortOrder must be a string' }),
44
+ (0, class_validator_1.IsEnum)(patination_enums_1.PageOrderDirection, { message: 'sortOrder is not valid' }),
45
+ __metadata("design:type", String)
46
+ ], PaginationDTO.prototype, "sortOrder", void 0);
47
+ __decorate([
48
+ (0, class_validator_1.IsOptional)(),
49
+ (0, class_validator_1.IsString)({ message: 'fields must be a string' }),
50
+ __metadata("design:type", String)
51
+ ], PaginationDTO.prototype, "fields", void 0);
52
+ //# sourceMappingURL=pagination.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.dto.js","sourceRoot":"","sources":["../../src/dto/pagination.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yDAA8C;AAC9C,qDAAsE;AACtE,gEAA+D;AAC/D,MAAa,aAAa;CA2BzB;AA3BD,sCA2BC;AAvBC;IAHC,IAAA,4BAAU,GAAE;IACZ,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,IAAA,uBAAK,EAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;;2CACjC;AAKb;IAHC,IAAA,4BAAU,GAAE;IACZ,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,IAAA,uBAAK,EAAC,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC;;+CACjC;AAIjB;IAFC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,EAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;;6CAClC;AAIf;IAFC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,EAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC;;gDAC9B;AAKlB;IAHC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,EAAC,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC;IACnD,IAAA,wBAAM,EAAC,qCAAkB,EAAE,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC;;gDACpC;AAI9B;IAFC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,EAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;;6CAClC"}
@@ -0,0 +1,12 @@
1
+ export declare enum PageOrderDirection {
2
+ Asc = "asc",
3
+ Desc = "desc"
4
+ }
5
+ export declare enum PaginationField {
6
+ Page = "page",
7
+ PageSize = "pageSize",
8
+ SortField = "sortOrder",
9
+ SortOrder = "sortOrder",
10
+ Search = "search"
11
+ }
12
+ //# sourceMappingURL=patination.enums.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patination.enums.d.ts","sourceRoot":"","sources":["../../src/enums/patination.enums.ts"],"names":[],"mappings":"AAAA,oBAAY,kBAAkB;IAC5B,GAAG,QAAQ;IACX,IAAI,SAAS;CACd;AAED,oBAAY,eAAe;IACzB,IAAI,SAAS;IACb,QAAQ,aAAa;IACrB,SAAS,cAAc;IACvB,SAAS,cAAc;IACvB,MAAM,WAAW;CAClB"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PaginationField = exports.PageOrderDirection = void 0;
4
+ var PageOrderDirection;
5
+ (function (PageOrderDirection) {
6
+ PageOrderDirection["Asc"] = "asc";
7
+ PageOrderDirection["Desc"] = "desc";
8
+ })(PageOrderDirection || (exports.PageOrderDirection = PageOrderDirection = {}));
9
+ var PaginationField;
10
+ (function (PaginationField) {
11
+ PaginationField["Page"] = "page";
12
+ PaginationField["PageSize"] = "pageSize";
13
+ PaginationField["SortField"] = "sortOrder";
14
+ PaginationField["SortOrder"] = "sortOrder";
15
+ PaginationField["Search"] = "search";
16
+ })(PaginationField || (exports.PaginationField = PaginationField = {}));
17
+ //# sourceMappingURL=patination.enums.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patination.enums.js","sourceRoot":"","sources":["../../src/enums/patination.enums.ts"],"names":[],"mappings":";;;AAAA,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC5B,iCAAW,CAAA;IACX,mCAAa,CAAA;AACf,CAAC,EAHW,kBAAkB,kCAAlB,kBAAkB,QAG7B;AAED,IAAY,eAMX;AAND,WAAY,eAAe;IACzB,gCAAa,CAAA;IACb,wCAAqB,CAAA;IACrB,0CAAuB,CAAA;IACvB,0CAAuB,CAAA;IACvB,oCAAiB,CAAA;AACnB,CAAC,EANW,eAAe,+BAAf,eAAe,QAM1B"}
@@ -0,0 +1,8 @@
1
+ export * from './constants/pagination.constants';
2
+ export * from './decorator/pagination.decorator';
3
+ export * from './dto/pagination.dto';
4
+ export * from './enums/patination.enums';
5
+ export * from './pagination.module';
6
+ export * from './pagination.service';
7
+ export type * from './types/pagination.types';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,mBAAmB,0BAA0B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./constants/pagination.constants"), exports);
18
+ __exportStar(require("./decorator/pagination.decorator"), exports);
19
+ __exportStar(require("./dto/pagination.dto"), exports);
20
+ __exportStar(require("./enums/patination.enums"), exports);
21
+ __exportStar(require("./pagination.module"), exports);
22
+ __exportStar(require("./pagination.service"), exports);
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mEAAiD;AACjD,mEAAiD;AACjD,uDAAqC;AACrC,2DAAyC;AACzC,sDAAoC;AACpC,uDAAqC"}
@@ -0,0 +1,3 @@
1
+ export declare class PaginationModule {
2
+ }
3
+ //# sourceMappingURL=pagination.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.module.d.ts","sourceRoot":"","sources":["../src/pagination.module.ts"],"names":[],"mappings":"AAGA,qBAKa,gBAAgB;CAAG"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.PaginationModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const pagination_service_1 = require("./pagination.service");
12
+ let PaginationModule = class PaginationModule {
13
+ };
14
+ exports.PaginationModule = PaginationModule;
15
+ exports.PaginationModule = PaginationModule = __decorate([
16
+ (0, common_1.Module)({
17
+ imports: [],
18
+ providers: [pagination_service_1.PaginationService],
19
+ exports: [pagination_service_1.PaginationService],
20
+ })
21
+ ], PaginationModule);
22
+ //# sourceMappingURL=pagination.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.module.js","sourceRoot":"","sources":["../src/pagination.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,6DAAyD;AAOlD,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;CAAG,CAAA;AAAnB,4CAAgB;2BAAhB,gBAAgB;IAL5B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,CAAC,sCAAiB,CAAC;QAC9B,OAAO,EAAE,CAAC,sCAAiB,CAAC;KAC7B,CAAC;GACW,gBAAgB,CAAG"}
@@ -0,0 +1,7 @@
1
+ import type { BaseModel, FindManyArgs, PaginatedResult, PaginationParams } from './types/pagination.types';
2
+ export declare class PaginationService {
3
+ private readonly logger;
4
+ paginate<T, M extends BaseModel>(model: M, paginationParams: PaginationParams, customQuery?: FindManyArgs<M>): Promise<PaginatedResult<T>>;
5
+ extractFieldNames(model: Record<string, any>): string[];
6
+ }
7
+ //# sourceMappingURL=pagination.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.service.d.ts","sourceRoot":"","sources":["../src/pagination.service.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,eAAe,EACf,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAElC,qBACa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAEvD,QAAQ,CAAC,CAAC,EAAE,CAAC,SAAS,SAAS,EACnC,KAAK,EAAE,CAAC,EACR,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IA6F9B,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,EAAE;CAaxD"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var PaginationService_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.PaginationService = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const pagination_constants_1 = require("./constants/pagination.constants");
13
+ const patination_enums_1 = require("./enums/patination.enums");
14
+ let PaginationService = PaginationService_1 = class PaginationService {
15
+ constructor() {
16
+ this.logger = new common_1.Logger(PaginationService_1.name);
17
+ }
18
+ async paginate(model, paginationParams, customQuery) {
19
+ try {
20
+ const page = Number(paginationParams.page || pagination_constants_1.DEFAULT_PAGE);
21
+ const pageSize = Number(paginationParams.pageSize || pagination_constants_1.DEFAULT_PAGE_SIZE);
22
+ const search = paginationParams.search || null;
23
+ const sortField = paginationParams.sortField || null;
24
+ const sortOrder = paginationParams.sortOrder || patination_enums_1.PageOrderDirection.Asc;
25
+ const fields = paginationParams.fields
26
+ ? paginationParams.fields.split(',')
27
+ : null;
28
+ if (page < 1 || pageSize < 1) {
29
+ throw new common_1.BadRequestException('Page and pageSize must be greater than 0');
30
+ }
31
+ let selectCondition = undefined;
32
+ let sortOrderCondition = {
33
+ id: paginationParams.sortOrder || patination_enums_1.PageOrderDirection.Asc,
34
+ };
35
+ if (search && sortField) {
36
+ const fieldNames = this.extractFieldNames(model);
37
+ if (!fieldNames.includes(sortField)) {
38
+ throw new common_1.BadRequestException(`Invalid field: ${sortField}. Valid columns are: ${fieldNames.join(', ')}`);
39
+ }
40
+ if (typeof sortField !== 'string') {
41
+ throw new common_1.BadRequestException('Field must be a string');
42
+ }
43
+ }
44
+ if (sortField) {
45
+ sortOrderCondition = { [sortField]: sortOrder };
46
+ }
47
+ if (fields) {
48
+ const fieldNames = this.extractFieldNames(model);
49
+ const invalidFields = fields.filter((field) => !fieldNames.includes(field));
50
+ if (invalidFields.length > 0) {
51
+ throw new common_1.BadRequestException(`Invalid fields: ${invalidFields.join(', ')}. Valid columns are: ${fieldNames.join(', ')}`);
52
+ }
53
+ selectCondition = fields.reduce((acc, field) => {
54
+ acc[field] = true;
55
+ return acc;
56
+ }, {});
57
+ }
58
+ const skip = page > 0 ? pageSize * (page - 1) : 0;
59
+ const query = {
60
+ select: selectCondition,
61
+ where: (customQuery === null || customQuery === void 0 ? void 0 : customQuery.where) || {},
62
+ orderBy: sortOrderCondition,
63
+ take: pageSize,
64
+ skip,
65
+ };
66
+ const [total, data] = await Promise.all([
67
+ model.count({ where: (customQuery === null || customQuery === void 0 ? void 0 : customQuery.where) || {} }),
68
+ model.findMany(query),
69
+ ]);
70
+ const lastPage = Math.ceil(total / pageSize);
71
+ return {
72
+ total,
73
+ lastPage,
74
+ currentPage: page,
75
+ pageSize,
76
+ prev: page > 1 ? page - 1 : null,
77
+ next: page < lastPage ? page + 1 : null,
78
+ data,
79
+ };
80
+ }
81
+ catch (error) {
82
+ this.logger.error('Pagination Error:', error);
83
+ if (error instanceof common_1.BadRequestException) {
84
+ throw error;
85
+ }
86
+ throw new common_1.BadRequestException(`Failed to paginate: ${error}`);
87
+ }
88
+ }
89
+ extractFieldNames(model) {
90
+ const fieldNames = [];
91
+ const fields = model.fields;
92
+ for (const key in fields) {
93
+ if (fields.hasOwnProperty(key)) {
94
+ fieldNames.push(key);
95
+ }
96
+ }
97
+ return fieldNames;
98
+ }
99
+ };
100
+ exports.PaginationService = PaginationService;
101
+ exports.PaginationService = PaginationService = PaginationService_1 = __decorate([
102
+ (0, common_1.Injectable)()
103
+ ], PaginationService);
104
+ //# sourceMappingURL=pagination.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.service.js","sourceRoot":"","sources":["../src/pagination.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pagination.service.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.service.spec.d.ts","sourceRoot":"","sources":["../src/pagination.service.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const testing_1 = require("@nestjs/testing");
4
+ const pagination_service_1 = require("./pagination.service");
5
+ describe('PaginationService', () => {
6
+ let service;
7
+ beforeEach(async () => {
8
+ const module = await testing_1.Test.createTestingModule({
9
+ providers: [pagination_service_1.PaginationService],
10
+ }).compile();
11
+ service = module.get(pagination_service_1.PaginationService);
12
+ });
13
+ it('should be defined', () => {
14
+ expect(service).toBeDefined();
15
+ });
16
+ });
17
+ //# sourceMappingURL=pagination.service.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.service.spec.js","sourceRoot":"","sources":["../src/pagination.service.spec.ts"],"names":[],"mappings":";;AAAA,6CAAsD;AACtD,6DAAyD;AAEzD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,OAA0B,CAAC;IAE/B,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,MAAM,GAAkB,MAAM,cAAI,CAAC,mBAAmB,CAAC;YAC3D,SAAS,EAAE,CAAC,sCAAiB,CAAC;SAC/B,CAAC,CAAC,OAAO,EAAE,CAAC;QAEb,OAAO,GAAG,MAAM,CAAC,GAAG,CAAoB,sCAAiB,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { PageOrderDirection } from '../enums/patination.enums';
2
+ export type PaginatedResult<T> = {
3
+ total: number;
4
+ lastPage: number;
5
+ currentPage: number;
6
+ pageSize: number;
7
+ prev: number | null;
8
+ next: number | null;
9
+ data: T[];
10
+ };
11
+ export type PaginationType = string | number | PaginationParams;
12
+ export type PaginateFunction = <K, T>(model: any, args?: K, options?: PaginateOptions) => Promise<PaginatedResult<T>>;
13
+ export type PaginationParams = {
14
+ page?: number;
15
+ pageSize?: number;
16
+ search?: string;
17
+ sortField?: string;
18
+ sortOrder?: PageOrderDirection;
19
+ fields: string;
20
+ };
21
+ export type PaginateOptions = {
22
+ page?: number | string;
23
+ pageSize?: number | string;
24
+ };
25
+ export type BaseModel = {
26
+ findMany: (args: any) => Promise<any[]>;
27
+ count: (args: any) => Promise<number>;
28
+ fields?: Record<string, any>;
29
+ };
30
+ export type FindManyArgs<M> = M extends {
31
+ findMany: (args: infer A) => any;
32
+ } ? A : never;
33
+ //# sourceMappingURL=pagination.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.types.d.ts","sourceRoot":"","sources":["../../src/types/pagination.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,CAAC,EAAE,CAAC;CACX,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,gBAAgB,CAAC;AAEhE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EAClC,KAAK,EAAE,GAAG,EACV,IAAI,CAAC,EAAE,CAAC,EACR,OAAO,CAAC,EAAE,eAAe,KACtB,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;AAEjC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACxC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,GAAG,CAAA;CAAE,GACxE,CAAC,GACD,KAAK,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=pagination.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.types.js","sourceRoot":"","sources":["../../src/types/pagination.types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@hedhog/pagination",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "private": false,
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
7
- "build": "tsc && npm version patch",
7
+ "build": "tsc --project tsconfig.production.json && npm version patch",
8
8
  "prod": "npm run build && npm publish --access public"
9
9
  },
10
10
  "keywords": [],
@@ -1,10 +1,17 @@
1
- import { createParamDecorator, ExecutionContext } from '@nestjs/common';
1
+ import {
2
+ BadRequestException,
3
+ createParamDecorator,
4
+ ExecutionContext,
5
+ } from '@nestjs/common';
2
6
  import {
3
7
  DEFAULT_PAGE,
4
8
  DEFAULT_PAGE_SIZE,
5
9
  } from '../constants/pagination.constants';
6
10
  import { PageOrderDirection, PaginationField } from '../enums/patination.enums';
7
11
  import { PaginationType } from '../types/pagination.types';
12
+ import { plainToClass } from 'class-transformer';
13
+ import { PaginationDTO } from '../dto/pagination.dto';
14
+ import { validateSync } from 'class-validator';
8
15
 
9
16
  export const Pagination = createParamDecorator(
10
17
  (data: PaginationField, ctx: ExecutionContext): PaginationType => {
@@ -38,25 +45,40 @@ export const Pagination = createParamDecorator(
38
45
  ? sortOrder
39
46
  : defaultOptions.sortOrder;
40
47
 
48
+ const finalData = {
49
+ page,
50
+ pageSize,
51
+ search,
52
+ sortField,
53
+ sortOrder: validSortOrder,
54
+ fields,
55
+ };
56
+
57
+ const paginationDtoInstance = plainToClass(PaginationDTO, finalData);
58
+
59
+ const errors = validateSync(paginationDtoInstance);
60
+
61
+ if (errors.length > 0) {
62
+ throw new BadRequestException(
63
+ 'Pagination data is not valid according to PaginationDto: ' +
64
+ errors
65
+ .map((error) => Object.values(error.constraints).join(', '))
66
+ .join(', '),
67
+ );
68
+ }
69
+
41
70
  if (data) {
42
71
  switch (data) {
43
72
  case PaginationField.Page:
44
73
  case PaginationField.PageSize:
45
- return requestData[data] ? +requestData[data] : defaultOptions[data];
46
- case PaginationField.OrderDirection:
47
- return requestData[data] || defaultOptions[data];
74
+ return finalData[data] ? +finalData[data] : defaultOptions[data];
75
+ case PaginationField.SortOrder:
76
+ return validSortOrder || defaultOptions[data];
48
77
  default:
49
- return requestData[data];
78
+ return finalData[data];
50
79
  }
51
80
  }
52
81
 
53
- return {
54
- page: +page,
55
- pageSize: +pageSize,
56
- search,
57
- sortField,
58
- sortOrder: validSortOrder,
59
- fields,
60
- };
82
+ return finalData;
61
83
  },
62
84
  );
@@ -3,12 +3,12 @@ import { IsEnum, IsInt, IsOptional, IsString } from 'class-validator';
3
3
  import { PageOrderDirection } from '../enums/patination.enums';
4
4
  export class PaginationDTO {
5
5
  @IsOptional()
6
- @Transform((value) => Number(value))
6
+ @Transform(({ value }) => Number(value))
7
7
  @IsInt({ message: 'page must be an integer' })
8
8
  page: number;
9
9
 
10
10
  @IsOptional()
11
- @Transform((value) => Number(value))
11
+ @Transform(({ value }) => Number(value))
12
12
  @IsInt({ message: 'pageSize must be an integer' })
13
13
  pageSize: number;
14
14
 
@@ -6,7 +6,7 @@ export enum PageOrderDirection {
6
6
  export enum PaginationField {
7
7
  Page = 'page',
8
8
  PageSize = 'pageSize',
9
- OrderField = 'orderField',
10
- OrderDirection = 'orderDirection',
9
+ SortField = 'sortOrder',
10
+ SortOrder = 'sortOrder',
11
11
  Search = 'search',
12
12
  }
@@ -108,7 +108,7 @@ export class PaginationService {
108
108
  throw error;
109
109
  }
110
110
 
111
- throw new BadRequestException(`Failed to paginate: ${error.message}`);
111
+ throw new BadRequestException(`Failed to paginate: ${error}`);
112
112
  }
113
113
  }
114
114