axe-api 0.30.3 → 0.31.1

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Release Notes
2
2
 
3
+ ## [0.31.1 (2023-05-08)](https://github.com/axe-api/axe-api/compare/0.31.1...0.31.0)
4
+
5
+ ### Fixed
6
+
7
+ - The app crashes on database errors [#155](https://github.com/axe-api/axe-api/issues/155)
8
+ - We should return 404 if the record is not found [#169](https://github.com/axe-api/axe-api/issues/169)
9
+ - An error should be thrown if the per_page value is not acceptable [#172](https://github.com/axe-api/axe-api/issues/172)
10
+
11
+ ## [0.31.0 (2023-05-05)](https://github.com/axe-api/axe-api/compare/0.31.0...0.30.3)
12
+
13
+ ### Features
14
+
15
+ - Added new auto-created documentation values [#179](https://github.com/axe-api/axe-api/issues/179)
16
+
17
+ ### Fixed
18
+
19
+ - Fixed PostgreSQL-related issues [#204](https://github.com/axe-api/axe-api/issues/204)
20
+
3
21
  ## [0.30.3 (2023-05-05)](https://github.com/axe-api/axe-api/compare/0.30.3...0.30.2)
4
22
 
5
23
  ### Fixed
@@ -125,41 +125,47 @@ class RouterBuilder {
125
125
  return __awaiter(this, void 0, void 0, function* () {
126
126
  const docs = Services_1.DocumentationService.getInstance();
127
127
  const app = yield Services_1.IoCService.useByType("App");
128
- const handler = (req, res) => {
129
- this.requestHandler(handlerType, req, res, model, parentModel, relation);
130
- };
128
+ const handler = (req, res, next) => __awaiter(this, void 0, void 0, function* () {
129
+ try {
130
+ yield this.requestHandler(handlerType, req, res, model, parentModel, relation);
131
+ }
132
+ catch (error) {
133
+ // Catch error then pass it to the express error handler
134
+ next(error);
135
+ }
136
+ });
131
137
  switch (handlerType) {
132
138
  case Enums_1.HandlerTypes.ALL:
133
139
  app.get(url, middlewares, handler);
134
- docs.push(Enums_1.HttpMethods.GET, url, model);
140
+ docs.push(this.version, Enums_1.HandlerTypes.ALL, Enums_1.HttpMethods.GET, url, model);
135
141
  break;
136
142
  case Enums_1.HandlerTypes.DELETE:
137
143
  app.delete(url, middlewares, handler);
138
- docs.push(Enums_1.HttpMethods.DELETE, url, model);
144
+ docs.push(this.version, Enums_1.HandlerTypes.DELETE, Enums_1.HttpMethods.DELETE, url, model);
139
145
  break;
140
146
  case Enums_1.HandlerTypes.FORCE_DELETE:
141
147
  app.delete(url, middlewares, handler);
142
- docs.push(Enums_1.HttpMethods.DELETE, url, model);
148
+ docs.push(this.version, Enums_1.HandlerTypes.FORCE_DELETE, Enums_1.HttpMethods.DELETE, url, model);
143
149
  break;
144
150
  case Enums_1.HandlerTypes.INSERT:
145
151
  app.post(url, middlewares, handler);
146
- docs.push(Enums_1.HttpMethods.POST, url, model);
152
+ docs.push(this.version, Enums_1.HandlerTypes.INSERT, Enums_1.HttpMethods.POST, url, model);
147
153
  break;
148
154
  case Enums_1.HandlerTypes.PAGINATE:
149
155
  app.get(url, middlewares, handler);
150
- docs.push(Enums_1.HttpMethods.GET, url, model);
156
+ docs.push(this.version, Enums_1.HandlerTypes.PAGINATE, Enums_1.HttpMethods.GET, url, model);
151
157
  break;
152
158
  case Enums_1.HandlerTypes.PATCH:
153
159
  app.patch(url, middlewares, handler);
154
- docs.push(Enums_1.HttpMethods.PATCH, url, model);
160
+ docs.push(this.version, Enums_1.HandlerTypes.PATCH, Enums_1.HttpMethods.PATCH, url, model);
155
161
  break;
156
162
  case Enums_1.HandlerTypes.SHOW:
157
163
  app.get(url, middlewares, handler);
158
- docs.push(Enums_1.HttpMethods.GET, url, model);
164
+ docs.push(this.version, Enums_1.HandlerTypes.SHOW, Enums_1.HttpMethods.GET, url, model);
159
165
  break;
160
166
  case Enums_1.HandlerTypes.UPDATE:
161
167
  app.put(url, middlewares, handler);
162
- docs.push(Enums_1.HttpMethods.PUT, url, model);
168
+ docs.push(this.version, Enums_1.HandlerTypes.UPDATE, Enums_1.HttpMethods.PUT, url, model);
163
169
  break;
164
170
  default:
165
171
  throw new Error("Undefined handler type");
@@ -213,12 +219,8 @@ class RouterBuilder {
213
219
  });
214
220
  break;
215
221
  default:
216
- // We should not show the real errors on production
217
- if (process.env.NODE_ENV === "production") {
218
- res.status(Enums_1.StatusCodes.INTERNAL_SERVER_ERROR).json({
219
- error: "An error occurredxx.",
220
- });
221
- }
222
+ // We should log error and send general error response
223
+ Services_1.LogService.getInstance().error(`SERVER ERROR: ${JSON.stringify(Object.assign(Object.assign({}, error), { message: error.message }), null, " ")}`);
222
224
  throw error;
223
225
  }
224
226
  }
@@ -3,6 +3,6 @@ declare class ApiError extends Error {
3
3
  type: string;
4
4
  status: StatusCodes;
5
5
  message: string;
6
- constructor(message: string);
6
+ constructor(message: string, status?: StatusCodes);
7
7
  }
8
8
  export default ApiError;
@@ -2,10 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const Enums_1 = require("../Enums");
4
4
  class ApiError extends Error {
5
- constructor(message) {
5
+ constructor(message, status = Enums_1.StatusCodes.BAD_REQUEST) {
6
6
  super(message);
7
7
  this.type = "ApiError";
8
- this.status = Enums_1.StatusCodes.BAD_REQUEST;
8
+ this.status = status;
9
9
  this.message = message;
10
10
  }
11
11
  }
@@ -15,11 +15,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  const Helpers_1 = require("./Helpers");
16
16
  const Enums_1 = require("../Enums");
17
17
  const ApiError_1 = __importDefault(require("../Exceptions/ApiError"));
18
+ const Enums_2 = require("../Enums");
18
19
  exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
19
20
  const { model, req, res, database, relation, parentModel } = pack;
21
+ // We should check the parameter type
22
+ const value = req.params[model.instance.primaryKey];
23
+ (0, Helpers_1.checkPrimaryKeyValueType)(model, value);
24
+ // Adding the main query
20
25
  const query = database
21
26
  .from(model.instance.table)
22
- .where(model.instance.primaryKey, req.params[model.instance.primaryKey]);
27
+ .where(model.instance.primaryKey, value);
23
28
  // If there is a deletedAtColumn, it means that this table support soft-delete
24
29
  (0, Helpers_1.addSoftDeleteQuery)(model, null, query);
25
30
  // If there is a relation, we should bind it
@@ -27,7 +32,7 @@ exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
27
32
  yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onBeforeDeleteQuery, Object.assign(Object.assign({}, pack), { query }));
28
33
  const item = yield query.first();
29
34
  if (!item) {
30
- throw new ApiError_1.default(`The item is not found on ${model.name}.`);
35
+ throw new ApiError_1.default(`The item is not found on ${model.name}.`, Enums_2.StatusCodes.NOT_FOUND);
31
36
  }
32
37
  yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onAfterDeleteQuery, Object.assign(Object.assign({}, pack), { query,
33
38
  item }));
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const CLOUD_FRONT_DOMAIN = "https://dw7lgbuj348m4.cloudfront.net/v1";
13
+ exports.default = (req, res) => __awaiter(void 0, void 0, void 0, function* () {
14
+ try {
15
+ const result = yield fetch(`${CLOUD_FRONT_DOMAIN}/index.html`);
16
+ const content = (yield result.text())
17
+ .replaceAll(`src="`, `src="${CLOUD_FRONT_DOMAIN}`)
18
+ .replaceAll(`href="`, `href="${CLOUD_FRONT_DOMAIN}`);
19
+ res.send(content);
20
+ }
21
+ catch (error) {
22
+ res.send("404");
23
+ }
24
+ });
@@ -15,14 +15,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  const Helpers_1 = require("./Helpers");
16
16
  const Enums_1 = require("../Enums");
17
17
  const ApiError_1 = __importDefault(require("../Exceptions/ApiError"));
18
+ const Enums_2 = require("../Enums");
18
19
  exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
19
20
  const { model, req, res, database, relation, parentModel } = pack;
21
+ // We should check the parameter type
22
+ const value = req.params[model.instance.primaryKey];
23
+ (0, Helpers_1.checkPrimaryKeyValueType)(model, value);
24
+ // Adding the main query
20
25
  const query = database
21
26
  .from(model.instance.table)
22
- .where(model.instance.primaryKey, req.params[model.instance.primaryKey]);
27
+ .where(model.instance.primaryKey, value);
23
28
  // If there is a deletedAtColumn, it means that this table support soft-delete
24
29
  if (model.instance.deletedAtColumn === null) {
25
- throw new ApiError_1.default("You can use force delete only soft-delete supported models.");
30
+ throw new ApiError_1.default("You can use force delete only soft-delete supported models.", Enums_2.StatusCodes.NOT_FOUND);
26
31
  }
27
32
  // If there is a relation, we should bind it
28
33
  (0, Helpers_1.addForeignKeyQuery)(req, query, relation, parentModel);
@@ -9,6 +9,7 @@ export declare const bindTimestampValues: (formData: Record<string, any>, column
9
9
  export declare const getMergedFormData: (req: Request, fillables: string[]) => Record<string, any>;
10
10
  export declare const callHooks: (model: IModelService, type: HookFunctionTypes, params: IHookParameter) => Promise<void>;
11
11
  export declare const getParentColumn: (relation: IRelation | null) => string | null;
12
+ export declare const checkPrimaryKeyValueType: (model: IModelService, value: any) => void;
12
13
  export declare const addForeignKeyQuery: (request: Request, query: Knex.QueryBuilder, relation: IRelation | null, parentModel: IModelService | null) => void;
13
14
  export declare const serializeData: (version: IVersion, itemArray: any[] | any, modelSerializer: SerializationFunction | null, handler: HandlerTypes, request: Request) => Promise<any[]>;
14
15
  export declare const filterHiddenFields: (itemArray: any[], hiddens: string[] | null) => void;
@@ -12,7 +12,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.isBoolean = exports.getRelatedData = exports.addSoftDeleteQuery = exports.filterHiddenFields = exports.serializeData = exports.addForeignKeyQuery = exports.getParentColumn = exports.callHooks = exports.getMergedFormData = exports.bindTimestampValues = void 0;
15
+ exports.isBoolean = exports.getRelatedData = exports.addSoftDeleteQuery = exports.filterHiddenFields = exports.serializeData = exports.addForeignKeyQuery = exports.checkPrimaryKeyValueType = exports.getParentColumn = exports.callHooks = exports.getMergedFormData = exports.bindTimestampValues = void 0;
16
16
  const change_case_1 = require("change-case");
17
17
  const Enums_1 = require("../Enums");
18
18
  const ApiError_1 = __importDefault(require("../Exceptions/ApiError"));
@@ -63,6 +63,14 @@ const getParentColumn = (relation) => {
63
63
  return (0, change_case_1.camelCase)(relation.foreignKey);
64
64
  };
65
65
  exports.getParentColumn = getParentColumn;
66
+ const checkPrimaryKeyValueType = (model, value) => {
67
+ // We should check the parameter type
68
+ const primaryColumn = model.columns.find((column) => column.name === model.instance.primaryKey);
69
+ if ((primaryColumn === null || primaryColumn === void 0 ? void 0 : primaryColumn.data_type) === "integer" && isNaN(parseInt(value))) {
70
+ throw new ApiError_1.default(`Unacceptable parameter: ${value}`);
71
+ }
72
+ };
73
+ exports.checkPrimaryKeyValueType = checkPrimaryKeyValueType;
66
74
  const addForeignKeyQuery = (request, query, relation, parentModel) => {
67
75
  if (relation && parentModel) {
68
76
  const parentColumn = (0, exports.getParentColumn)(relation);
@@ -0,0 +1,3 @@
1
+ import { Request, Response } from "express";
2
+ declare const _default: (req: Request, res: Response) => Promise<void>;
3
+ export default _default;
@@ -16,6 +16,7 @@ const validatorjs_1 = __importDefault(require("validatorjs"));
16
16
  const Helpers_1 = require("./Helpers");
17
17
  const Enums_1 = require("../Enums");
18
18
  const ApiError_1 = __importDefault(require("../Exceptions/ApiError"));
19
+ const Enums_2 = require("../Enums");
19
20
  exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
20
21
  const { version, model, req, res, database, relation, parentModel } = pack;
21
22
  const query = database.from(model.instance.table);
@@ -24,11 +25,13 @@ exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
24
25
  // If there is a deletedAtColumn, it means that this table support soft-delete
25
26
  (0, Helpers_1.addSoftDeleteQuery)(model, null, query);
26
27
  yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onBeforeUpdateQuery, Object.assign(Object.assign({}, pack), { query }));
27
- let item = yield query
28
- .where(model.instance.primaryKey, req.params[model.instance.primaryKey])
29
- .first();
28
+ // We should check the parameter type
29
+ const value = req.params[model.instance.primaryKey];
30
+ (0, Helpers_1.checkPrimaryKeyValueType)(model, value);
31
+ // Adding the main query
32
+ let item = yield query.where(model.instance.primaryKey, value).first();
30
33
  if (!item) {
31
- throw new ApiError_1.default(`The item is not found on ${model.name}.`);
34
+ throw new ApiError_1.default(`The item is not found on ${model.name}.`, Enums_2.StatusCodes.NOT_FOUND);
32
35
  }
33
36
  yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onAfterUpdateQuery, Object.assign(Object.assign({}, pack), { item,
34
37
  query }));
@@ -16,6 +16,7 @@ const Helpers_1 = require("./Helpers");
16
16
  const Enums_1 = require("../Enums");
17
17
  const ApiError_1 = __importDefault(require("../Exceptions/ApiError"));
18
18
  const Services_1 = require("../Services");
19
+ const Enums_2 = require("../Enums");
19
20
  exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
20
21
  const { version, model, req, res, database, relation, parentModel } = pack;
21
22
  const queryParser = new Services_1.QueryService(model, version.modelList.get(), version.config);
@@ -29,15 +30,18 @@ exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
29
30
  queryParser.applyFields(query, conditions.fields);
30
31
  // If there is a relation, we should bind it
31
32
  (0, Helpers_1.addForeignKeyQuery)(req, query, relation, parentModel);
32
- // We should add this condition in here because of performance.
33
- query.where(model.instance.primaryKey, req.params[model.instance.primaryKey]);
33
+ // We should check the parameter type
34
+ const value = req.params[model.instance.primaryKey];
35
+ (0, Helpers_1.checkPrimaryKeyValueType)(model, value);
36
+ // Adding the main query
37
+ query.where(model.instance.primaryKey, value);
34
38
  yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onBeforeShow, Object.assign(Object.assign({}, pack), { query,
35
39
  conditions }));
36
40
  // Users should be able to filter records
37
41
  queryParser.applyWheres(query, conditions.q);
38
42
  let item = yield query.first();
39
43
  if (!item) {
40
- throw new ApiError_1.default(`The item is not found on ${model.name}.`);
44
+ throw new ApiError_1.default(`The item is not found on ${model.name}.`, Enums_2.StatusCodes.NOT_FOUND);
41
45
  }
42
46
  // We should try to get related data if there is any
43
47
  yield (0, Helpers_1.getRelatedData)(version, [item], conditions.with, model, version.modelList, database, Enums_1.HandlerTypes.ALL, req);
@@ -16,6 +16,7 @@ const validatorjs_1 = __importDefault(require("validatorjs"));
16
16
  const Helpers_1 = require("./Helpers");
17
17
  const Enums_1 = require("../Enums");
18
18
  const ApiError_1 = __importDefault(require("../Exceptions/ApiError"));
19
+ const Enums_2 = require("../Enums");
19
20
  exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
20
21
  const { version, model, req, res, database, relation, parentModel } = pack;
21
22
  const query = database.from(model.instance.table);
@@ -24,11 +25,13 @@ exports.default = (pack) => __awaiter(void 0, void 0, void 0, function* () {
24
25
  // If there is a deletedAtColumn, it means that this table support soft-delete
25
26
  (0, Helpers_1.addSoftDeleteQuery)(model, null, query);
26
27
  yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onBeforeUpdateQuery, Object.assign(Object.assign({}, pack), { query }));
27
- let item = yield query
28
- .where(model.instance.primaryKey, req.params[model.instance.primaryKey])
29
- .first();
28
+ // We should check the parameter type
29
+ const value = req.params[model.instance.primaryKey];
30
+ (0, Helpers_1.checkPrimaryKeyValueType)(model, value);
31
+ // Adding the main query
32
+ let item = yield query.where(model.instance.primaryKey, value).first();
30
33
  if (!item) {
31
- throw new ApiError_1.default(`The item is not found on ${model.name}.`);
34
+ throw new ApiError_1.default(`The item is not found on ${model.name}.`, Enums_2.StatusCodes.NOT_FOUND);
32
35
  }
33
36
  yield (0, Helpers_1.callHooks)(model, Enums_1.HookFunctionTypes.onAfterUpdateQuery, Object.assign(Object.assign({}, pack), { item,
34
37
  query }));
@@ -145,13 +145,19 @@ export interface IRequestPack {
145
145
  database: Knex | Knex.Transaction;
146
146
  }
147
147
  export interface IRouteDocumentation {
148
+ version: string;
149
+ handler: string;
148
150
  model: string;
149
151
  table: string;
150
152
  columns: IColumn[];
153
+ hiddens: string[];
154
+ relations: IRelation[];
151
155
  method: HttpMethods;
152
156
  url: string;
153
157
  fillables: string[];
154
158
  validations: Record<string, string> | null;
159
+ queryLimits: IQueryLimitConfig[];
160
+ queryDefaults: IQueryDefaultConfig;
155
161
  }
156
162
  export interface IRawQuery {
157
163
  q: string | null;
@@ -44,7 +44,8 @@ const knex_schema_inspector_1 = __importDefault(require("knex-schema-inspector")
44
44
  const knex_paginate_1 = require("knex-paginate");
45
45
  const Builders_1 = require("./Builders");
46
46
  const Services_1 = require("./Services");
47
- const DocsHandler_1 = __importDefault(require("./Handlers/DocsHandler"));
47
+ const MetadataHandler_1 = __importDefault(require("./Handlers/MetadataHandler"));
48
+ const DocsHTMLHandler_1 = __importDefault(require("./Handlers/DocsHTMLHandler"));
48
49
  const RoutesHandler_1 = __importDefault(require("./Handlers/RoutesHandler"));
49
50
  const Helpers_1 = require("./Helpers");
50
51
  class Server {
@@ -118,7 +119,8 @@ class Server {
118
119
  const logger = Services_1.LogService.getInstance();
119
120
  const api = Services_1.APIService.getInstance();
120
121
  if (api.config.env === "development") {
121
- app.get("/docs", DocsHandler_1.default);
122
+ app.get("/metadata", MetadataHandler_1.default);
123
+ app.get("/docs", DocsHTMLHandler_1.default);
122
124
  app.get("/routes", RoutesHandler_1.default);
123
125
  }
124
126
  app.listen(api.config.port, () => {
@@ -1,11 +1,11 @@
1
- import { IModelService, IRouteDocumentation } from "../Interfaces";
2
- import { HttpMethods } from "../Enums";
1
+ import { IModelService, IRouteDocumentation, IVersion } from "../Interfaces";
2
+ import { HandlerTypes, HttpMethods } from "../Enums";
3
3
  declare class DocumentationService {
4
4
  private static instance;
5
5
  private routes;
6
6
  constructor();
7
7
  static getInstance(): DocumentationService;
8
- push(method: HttpMethods, url: string, model: IModelService): void;
8
+ push(version: IVersion, handler: HandlerTypes, method: HttpMethods, url: string, model: IModelService): void;
9
9
  get(): IRouteDocumentation[];
10
10
  }
11
11
  export default DocumentationService;
@@ -10,15 +10,22 @@ class DocumentationService {
10
10
  }
11
11
  return DocumentationService.instance;
12
12
  }
13
- push(method, url, model) {
13
+ push(version, handler, method, url, model) {
14
+ var _a, _b;
14
15
  this.routes.push({
16
+ version: version.name,
17
+ handler,
15
18
  model: model.name,
16
19
  table: model.instance.table,
17
20
  columns: model.columns,
21
+ hiddens: model.instance.hiddens,
22
+ relations: model.relations,
18
23
  method,
19
24
  url,
20
25
  fillables: model.instance.getFillableFields(method),
21
26
  validations: model.instance.getValidationRules(method),
27
+ queryLimits: model.queryLimits,
28
+ queryDefaults: ((_b = (_a = version.config) === null || _a === void 0 ? void 0 : _a.query) === null || _b === void 0 ? void 0 : _b.defaults) || {},
22
29
  });
23
30
  }
24
31
  get() {
@@ -205,7 +205,7 @@ class QueryService {
205
205
  return value;
206
206
  }
207
207
  parsePerPage(content) {
208
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
208
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
209
209
  const value = parseInt(content ||
210
210
  ((_b = (_a = this.config.query) === null || _a === void 0 ? void 0 : _a.defaults) === null || _b === void 0 ? void 0 : _b.perPage) ||
211
211
  ((_c = constants_1.DEFAULT_VERSION_CONFIG.query.defaults) === null || _c === void 0 ? void 0 : _c.perPage) ||
@@ -216,10 +216,8 @@ class QueryService {
216
216
  const maxPerPage = ((_h = (_g = this.config.query) === null || _g === void 0 ? void 0 : _g.defaults) === null || _h === void 0 ? void 0 : _h.maxPerPage) ||
217
217
  ((_j = constants_1.DEFAULT_VERSION_CONFIG.query.defaults) === null || _j === void 0 ? void 0 : _j.maxPerPage) ||
218
218
  100;
219
- if (isNaN(value) || value <= minPerPage || value > maxPerPage) {
220
- return (((_l = (_k = this.config.query) === null || _k === void 0 ? void 0 : _k.defaults) === null || _l === void 0 ? void 0 : _l.perPage) ||
221
- ((_m = constants_1.DEFAULT_VERSION_CONFIG.query.defaults) === null || _m === void 0 ? void 0 : _m.perPage) ||
222
- 10);
219
+ if (isNaN(value) || value < minPerPage || value > maxPerPage) {
220
+ throw new ApiError_1.default(`Unacceptable 'per_page' value! Current value is '${value}'. It should be between ${minPerPage}-${maxPerPage}`);
223
221
  }
224
222
  return value;
225
223
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "axe-api",
3
- "version": "0.30.3",
3
+ "version": "0.31.1",
4
4
  "description": "AXE API is a simple tool which has been created based on Express and Knex.js to create Rest APIs quickly.",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",