@prosopo/api-express-router 2.3.2 → 2.4.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.
- package/dist/apiExpressRouterFactory.d.ts +0 -1
- package/dist/apiExpressRouterFactory.d.ts.map +1 -1
- package/dist/apiExpressRouterFactory.js +6 -7
- package/dist/apiExpressRouterFactory.js.map +1 -1
- package/dist/endpointAdapter/apiExpressDefaultEndpointAdapter.d.ts +3 -3
- package/dist/endpointAdapter/apiExpressDefaultEndpointAdapter.d.ts.map +1 -1
- package/dist/endpointAdapter/apiExpressDefaultEndpointAdapter.js +12 -3
- package/dist/endpointAdapter/apiExpressDefaultEndpointAdapter.js.map +1 -1
- package/dist/endpointAdapter/apiExpressEndpointAdapter.d.ts +2 -2
- package/dist/endpointAdapter/apiExpressEndpointAdapter.d.ts.map +1 -1
- package/dist/errorHandler.d.ts +5 -0
- package/dist/errorHandler.d.ts.map +1 -0
- package/dist/errorHandler.js +10 -0
- package/dist/errorHandler.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/tests/unit/errorHandler.unit.test.d.ts +2 -0
- package/dist/tests/unit/errorHandler.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/errorHandler.unit.test.js +140 -0
- package/dist/tests/unit/errorHandler.unit.test.js.map +1 -0
- package/package.json +5 -5
- package/vite.cjs.config.ts +1 -1
- package/vite.test.config.ts +33 -0
|
@@ -4,7 +4,6 @@ import type { ApiExpressEndpointAdapter } from "./endpointAdapter/apiExpressEndp
|
|
|
4
4
|
declare class ApiExpressRouterFactory {
|
|
5
5
|
createRouter(routersProvider: ApiRoutesProvider, apiEndpointAdapter: ApiExpressEndpointAdapter): Router;
|
|
6
6
|
protected registerRoutes(router: Router, routes: ApiRoute[], apiEndpointAdapter: ApiExpressEndpointAdapter): void;
|
|
7
|
-
protected registerRoute(router: Router, route: ApiRoute, apiEndpointAdapter: ApiExpressEndpointAdapter): void;
|
|
8
7
|
}
|
|
9
8
|
export { ApiExpressRouterFactory };
|
|
10
9
|
//# sourceMappingURL=apiExpressRouterFactory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiExpressRouterFactory.d.ts","sourceRoot":"","sources":["../src/apiExpressRouterFactory.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,
|
|
1
|
+
{"version":3,"file":"apiExpressRouterFactory.d.ts","sourceRoot":"","sources":["../src/apiExpressRouterFactory.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAIN,MAAM,EACN,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gDAAgD,CAAC;AAGhG,cAAM,uBAAuB;IACrB,YAAY,CAClB,eAAe,EAAE,iBAAiB,EAClC,kBAAkB,EAAE,yBAAyB,GAC3C,MAAM;IAcT,SAAS,CAAC,cAAc,CACvB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,QAAQ,EAAE,EAClB,kBAAkB,EAAE,yBAAyB,GAC3C,IAAI;CAmBP;AAED,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
|
|
@@ -1,21 +1,20 @@
|
|
|
1
|
-
import { Router } from "express";
|
|
1
|
+
import { Router, } from "express";
|
|
2
|
+
import { handleErrors } from "./errorHandler.js";
|
|
2
3
|
class ApiExpressRouterFactory {
|
|
3
4
|
createRouter(routersProvider, apiEndpointAdapter) {
|
|
4
5
|
const router = Router();
|
|
5
6
|
const apiRoutes = routersProvider.getRoutes();
|
|
6
7
|
this.registerRoutes(router, apiRoutes, apiEndpointAdapter);
|
|
8
|
+
router.use(handleErrors);
|
|
7
9
|
return router;
|
|
8
10
|
}
|
|
9
11
|
registerRoutes(router, routes, apiEndpointAdapter) {
|
|
10
12
|
for (const route of routes) {
|
|
11
|
-
|
|
13
|
+
router.post(route.path, async (request, response, next) => {
|
|
14
|
+
await apiEndpointAdapter.handleRequest(route.endpoint, request, response, next);
|
|
15
|
+
});
|
|
12
16
|
}
|
|
13
17
|
}
|
|
14
|
-
registerRoute(router, route, apiEndpointAdapter) {
|
|
15
|
-
router.post(route.path, async (request, response) => {
|
|
16
|
-
await apiEndpointAdapter.handleRequest(route.endpoint, request, response);
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
18
|
}
|
|
20
19
|
export { ApiExpressRouterFactory };
|
|
21
20
|
//# sourceMappingURL=apiExpressRouterFactory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiExpressRouterFactory.js","sourceRoot":"","sources":["../src/apiExpressRouterFactory.ts"],"names":[],"mappings":"AAeA,OAAO,
|
|
1
|
+
{"version":3,"file":"apiExpressRouterFactory.js","sourceRoot":"","sources":["../src/apiExpressRouterFactory.ts"],"names":[],"mappings":"AAeA,OAAO,EAIN,MAAM,GACN,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,uBAAuB;IACrB,YAAY,CAClB,eAAkC,EAClC,kBAA6C;QAE7C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,EAAE,CAAC;QAE9C,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;QAK3D,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAEzB,OAAO,MAAM,CAAC;IACf,CAAC;IAES,cAAc,CACvB,MAAc,EACd,MAAkB,EAClB,kBAA6C;QAE7C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CACV,KAAK,CAAC,IAAI,EACV,KAAK,EACJ,OAAgB,EAChB,QAAkB,EAClB,IAAkB,EACF,EAAE;gBAClB,MAAM,kBAAkB,CAAC,aAAa,CACrC,KAAK,CAAC,QAAQ,EACd,OAAO,EACP,QAAQ,EACR,IAAI,CACJ,CAAC;YACH,CAAC,CACD,CAAC;QACH,CAAC;IACF,CAAC;CACD;AAED,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { ApiEndpoint } from "@prosopo/api-route";
|
|
2
|
-
import type
|
|
3
|
-
import type { Request, Response } from "express";
|
|
2
|
+
import { type Logger } from "@prosopo/common";
|
|
3
|
+
import type { NextFunction, Request, Response } from "express";
|
|
4
4
|
import type { ZodType } from "zod";
|
|
5
5
|
import type { ApiExpressEndpointAdapter } from "./apiExpressEndpointAdapter.js";
|
|
6
6
|
declare class ApiExpressDefaultEndpointAdapter implements ApiExpressEndpointAdapter {
|
|
7
7
|
private readonly logger;
|
|
8
8
|
private readonly errorStatusCode;
|
|
9
9
|
constructor(logger: Logger, errorStatusCode: number);
|
|
10
|
-
handleRequest(endpoint: ApiEndpoint<ZodType | undefined>, request: Request, response: Response): Promise<void>;
|
|
10
|
+
handleRequest(endpoint: ApiEndpoint<ZodType | undefined>, request: Request, response: Response, next: NextFunction): Promise<void>;
|
|
11
11
|
}
|
|
12
12
|
export { ApiExpressDefaultEndpointAdapter };
|
|
13
13
|
//# sourceMappingURL=apiExpressDefaultEndpointAdapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiExpressDefaultEndpointAdapter.d.ts","sourceRoot":"","sources":["../../src/endpointAdapter/apiExpressDefaultEndpointAdapter.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"apiExpressDefaultEndpointAdapter.d.ts","sourceRoot":"","sources":["../../src/endpointAdapter/apiExpressDefaultEndpointAdapter.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,KAAK,MAAM,EAAmB,MAAM,iBAAiB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACnC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAEhF,cAAM,gCAAiC,YAAW,yBAAyB;IAEzE,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe;gBADf,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM;IAG5B,aAAa,CACzB,QAAQ,EAAE,WAAW,CAAC,OAAO,GAAG,SAAS,CAAC,EAC1C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,YAAY,GAChB,OAAO,CAAC,IAAI,CAAC;CAsBhB;AAED,OAAO,EAAE,gCAAgC,EAAE,CAAC"}
|
|
@@ -1,16 +1,25 @@
|
|
|
1
|
+
import { ProsopoApiError } from "@prosopo/common";
|
|
1
2
|
class ApiExpressDefaultEndpointAdapter {
|
|
2
3
|
constructor(logger, errorStatusCode) {
|
|
3
4
|
this.logger = logger;
|
|
4
5
|
this.errorStatusCode = errorStatusCode;
|
|
5
6
|
}
|
|
6
|
-
async handleRequest(endpoint, request, response) {
|
|
7
|
+
async handleRequest(endpoint, request, response, next) {
|
|
8
|
+
let args;
|
|
9
|
+
try {
|
|
10
|
+
args = endpoint.getRequestArgsSchema()?.parse(request.body);
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
return next(new ProsopoApiError("API.PARSE_ERROR", {
|
|
14
|
+
context: { code: 400, error: error },
|
|
15
|
+
}));
|
|
16
|
+
}
|
|
7
17
|
try {
|
|
8
|
-
const args = endpoint.getRequestArgsSchema()?.parse(request.body);
|
|
9
18
|
const apiEndpointResponse = await endpoint.processRequest(args);
|
|
10
19
|
response.json(apiEndpointResponse);
|
|
11
20
|
}
|
|
12
21
|
catch (error) {
|
|
13
|
-
this.logger.error(error);
|
|
22
|
+
this.logger.error(error.message);
|
|
14
23
|
response.status(500).send("An internal server error occurred.");
|
|
15
24
|
}
|
|
16
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiExpressDefaultEndpointAdapter.js","sourceRoot":"","sources":["../../src/endpointAdapter/apiExpressDefaultEndpointAdapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"apiExpressDefaultEndpointAdapter.js","sourceRoot":"","sources":["../../src/endpointAdapter/apiExpressDefaultEndpointAdapter.ts"],"names":[],"mappings":"AAeA,OAAO,EAAe,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAK/D,MAAM,gCAAgC;IACrC,YACkB,MAAc,EACd,eAAuB;QADvB,WAAM,GAAN,MAAM,CAAQ;QACd,oBAAe,GAAf,eAAe,CAAQ;IACtC,CAAC;IAEG,KAAK,CAAC,aAAa,CACzB,QAA0C,EAC1C,OAAgB,EAChB,QAAkB,EAClB,IAAkB;QAElB,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACJ,IAAI,GAAG,QAAQ,CAAC,oBAAoB,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,IAAI,CACV,IAAI,eAAe,CAAC,iBAAiB,EAAE;gBACtC,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;aACpC,CAAC,CACF,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,mBAAmB,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAEhE,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;YAE5C,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACjE,CAAC;IACF,CAAC;CACD;AAED,OAAO,EAAE,gCAAgC,EAAE,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { ApiEndpoint } from "@prosopo/api-route";
|
|
2
|
-
import type { Request, Response } from "express";
|
|
2
|
+
import type { NextFunction, Request, Response } from "express";
|
|
3
3
|
import type { ZodType } from "zod";
|
|
4
4
|
interface ApiExpressEndpointAdapter {
|
|
5
|
-
handleRequest(endpoint: ApiEndpoint<ZodType | undefined>, request: Request, response: Response): Promise<void>;
|
|
5
|
+
handleRequest(endpoint: ApiEndpoint<ZodType | undefined>, request: Request, response: Response, next: NextFunction): Promise<void>;
|
|
6
6
|
}
|
|
7
7
|
export type { ApiExpressEndpointAdapter };
|
|
8
8
|
//# sourceMappingURL=apiExpressEndpointAdapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiExpressEndpointAdapter.d.ts","sourceRoot":"","sources":["../../src/endpointAdapter/apiExpressEndpointAdapter.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"apiExpressEndpointAdapter.d.ts","sourceRoot":"","sources":["../../src/endpointAdapter/apiExpressEndpointAdapter.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAEnC,UAAU,yBAAyB;IAClC,aAAa,CACZ,QAAQ,EAAE,WAAW,CAAC,OAAO,GAAG,SAAS,CAAC,EAC1C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,YAAY,GAChB,OAAO,CAAC,IAAI,CAAC,CAAC;CACjB;AAED,YAAY,EAAE,yBAAyB,EAAE,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type ProsopoApiError } from "@prosopo/common";
|
|
2
|
+
import type { NextFunction, Request, Response } from "express";
|
|
3
|
+
import type { ZodError } from "zod";
|
|
4
|
+
export declare const handleErrors: (err: ProsopoApiError | SyntaxError | ZodError, request: Request, response: Response, next: NextFunction) => void;
|
|
5
|
+
//# sourceMappingURL=errorHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../src/errorHandler.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,eAAe,EAAe,MAAM,iBAAiB,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAEpC,eAAO,MAAM,YAAY,QACnB,eAAe,GAAG,WAAW,GAAG,QAAQ,WACpC,OAAO,YACN,QAAQ,QACZ,YAAY,SAQlB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { unwrapError } from "@prosopo/common";
|
|
2
|
+
export const handleErrors = (err, request, response, next) => {
|
|
3
|
+
const { code, statusMessage, jsonError } = unwrapError(err, request.i18n);
|
|
4
|
+
response.statusMessage = statusMessage;
|
|
5
|
+
response.set("content-type", "application/json");
|
|
6
|
+
response.status(code);
|
|
7
|
+
response.send({ error: jsonError });
|
|
8
|
+
response.end();
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=errorHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandler.js","sourceRoot":"","sources":["../src/errorHandler.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAwB,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAIpE,MAAM,CAAC,MAAM,YAAY,GAAG,CAC3B,GAA6C,EAC7C,OAAgB,EAChB,QAAkB,EAClB,IAAkB,EACjB,EAAE;IACH,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,QAAQ,CAAC,aAAa,GAAG,aAAa,CAAC;IACvC,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IACjD,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACpC,QAAQ,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,4 +4,5 @@ import type { ApiExpressEndpointAdapter } from "./endpointAdapter/apiExpressEndp
|
|
|
4
4
|
declare const apiExpressRouterFactory: ApiExpressRouterFactory;
|
|
5
5
|
declare const createApiExpressDefaultEndpointAdapter: (logger: Logger, errorStatusCode?: number) => ApiExpressEndpointAdapter;
|
|
6
6
|
export { apiExpressRouterFactory, createApiExpressDefaultEndpointAdapter, type ApiExpressEndpointAdapter, };
|
|
7
|
+
export * from "./errorHandler.js";
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gDAAgD,CAAC;AAEhG,QAAA,MAAM,uBAAuB,yBAAgC,CAAC;AAE9D,QAAA,MAAM,sCAAsC,WACnC,MAAM,+BAEZ,yBAEF,CAAC;AAEF,OAAO,EACN,uBAAuB,EACvB,sCAAsC,EACtC,KAAK,yBAAyB,GAC9B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gDAAgD,CAAC;AAEhG,QAAA,MAAM,uBAAuB,yBAAgC,CAAC;AAE9D,QAAA,MAAM,sCAAsC,WACnC,MAAM,+BAEZ,yBAEF,CAAC;AAEF,OAAO,EACN,uBAAuB,EACvB,sCAAsC,EACtC,KAAK,yBAAyB,GAC9B,CAAC;AAEF,cAAc,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,4 +5,5 @@ const createApiExpressDefaultEndpointAdapter = (logger, errorStatusCode = 500) =
|
|
|
5
5
|
return new ApiExpressDefaultEndpointAdapter(logger, errorStatusCode);
|
|
6
6
|
};
|
|
7
7
|
export { apiExpressRouterFactory, createApiExpressDefaultEndpointAdapter, };
|
|
8
|
+
export * from "./errorHandler.js";
|
|
8
9
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,gCAAgC,EAAE,MAAM,uDAAuD,CAAC;AAGzG,MAAM,uBAAuB,GAAG,IAAI,uBAAuB,EAAE,CAAC;AAE9D,MAAM,sCAAsC,GAAG,CAC9C,MAAc,EACd,eAAe,GAAG,GAAG,EACO,EAAE;IAC9B,OAAO,IAAI,gCAAgC,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AACtE,CAAC,CAAC;AAEF,OAAO,EACN,uBAAuB,EACvB,sCAAsC,GAEtC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,gCAAgC,EAAE,MAAM,uDAAuD,CAAC;AAGzG,MAAM,uBAAuB,GAAG,IAAI,uBAAuB,EAAE,CAAC;AAE9D,MAAM,sCAAsC,GAAG,CAC9C,MAAc,EACd,eAAe,GAAG,GAAG,EACO,EAAE;IAC9B,OAAO,IAAI,gCAAgC,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AACtE,CAAC,CAAC;AAEF,OAAO,EACN,uBAAuB,EACvB,sCAAsC,GAEtC,CAAC;AAEF,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandler.unit.test.d.ts","sourceRoot":"","sources":["../../../src/tests/unit/errorHandler.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { ProsopoApiError, ProsopoEnvError } from "@prosopo/common";
|
|
2
|
+
import { loadI18next } from "@prosopo/locale";
|
|
3
|
+
import { describe, expect, it, vi } from "vitest";
|
|
4
|
+
import { ZodError } from "zod";
|
|
5
|
+
import { handleErrors } from "../../errorHandler.js";
|
|
6
|
+
describe("handleErrors", async () => {
|
|
7
|
+
const i18n = await loadI18next(true);
|
|
8
|
+
await i18n.changeLanguage("en");
|
|
9
|
+
it("should handle ProsopoApiError", async () => {
|
|
10
|
+
const mockRequest = { i18n };
|
|
11
|
+
const mockResponse = {
|
|
12
|
+
writeHead: vi.fn().mockReturnThis(),
|
|
13
|
+
set: vi.fn().mockReturnThis(),
|
|
14
|
+
status: vi.fn().mockReturnThis(),
|
|
15
|
+
send: vi.fn(),
|
|
16
|
+
end: vi.fn(),
|
|
17
|
+
};
|
|
18
|
+
const mockNext = vi.fn();
|
|
19
|
+
const error = new ProsopoApiError("CONTRACT.INVALID_DATA_FORMAT", {
|
|
20
|
+
context: { code: 400 },
|
|
21
|
+
i18n,
|
|
22
|
+
});
|
|
23
|
+
console.log(error);
|
|
24
|
+
handleErrors(error, mockRequest, mockResponse, mockNext);
|
|
25
|
+
expect(mockResponse.set).toHaveBeenCalledWith("content-type", "application/json");
|
|
26
|
+
expect(mockResponse.send).toHaveBeenCalledWith({
|
|
27
|
+
error: {
|
|
28
|
+
code: 400,
|
|
29
|
+
key: "CONTRACT.INVALID_DATA_FORMAT",
|
|
30
|
+
message: "Invalid data format",
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
expect(mockResponse.status).toHaveBeenCalledWith(400);
|
|
34
|
+
expect(mockResponse.end).toHaveBeenCalled();
|
|
35
|
+
});
|
|
36
|
+
it("should handle SyntaxError", async () => {
|
|
37
|
+
const mockRequest = { i18n };
|
|
38
|
+
const mockResponse = {
|
|
39
|
+
writeHead: vi.fn().mockReturnThis(),
|
|
40
|
+
set: vi.fn().mockReturnThis(),
|
|
41
|
+
status: vi.fn().mockReturnThis(),
|
|
42
|
+
send: vi.fn(),
|
|
43
|
+
end: vi.fn(),
|
|
44
|
+
};
|
|
45
|
+
const mockNext = vi.fn();
|
|
46
|
+
const [len, max] = [100, 50];
|
|
47
|
+
const message = `Input length: ${len}, exceeds maximum allowed length: ${max}`;
|
|
48
|
+
const error = new SyntaxError(message);
|
|
49
|
+
handleErrors(error, mockRequest, mockResponse, mockNext);
|
|
50
|
+
expect(mockResponse.set).toHaveBeenCalledWith("content-type", "application/json");
|
|
51
|
+
expect(mockResponse.status).toHaveBeenCalledWith(400);
|
|
52
|
+
expect(mockResponse.send).toHaveBeenCalledWith({
|
|
53
|
+
error: {
|
|
54
|
+
message,
|
|
55
|
+
code: 400,
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
expect(mockResponse.end).toHaveBeenCalled();
|
|
59
|
+
});
|
|
60
|
+
it("should handle ZodError", () => {
|
|
61
|
+
const mockRequest = { i18n };
|
|
62
|
+
const mockResponse = {
|
|
63
|
+
writeHead: vi.fn().mockReturnThis(),
|
|
64
|
+
set: vi.fn().mockReturnThis(),
|
|
65
|
+
status: vi.fn().mockReturnThis(),
|
|
66
|
+
send: vi.fn(),
|
|
67
|
+
end: vi.fn(),
|
|
68
|
+
};
|
|
69
|
+
const mockNext = vi.fn();
|
|
70
|
+
const zodError = {
|
|
71
|
+
code: "custom",
|
|
72
|
+
message: "Invalid input",
|
|
73
|
+
path: ["some", "variable"],
|
|
74
|
+
};
|
|
75
|
+
const error = new ZodError([zodError]);
|
|
76
|
+
handleErrors(error, mockRequest, mockResponse, mockNext);
|
|
77
|
+
expect(mockResponse.set).toHaveBeenCalledWith("content-type", "application/json");
|
|
78
|
+
expect(mockResponse.status).toHaveBeenCalledWith(400);
|
|
79
|
+
expect(mockResponse.send).toHaveBeenCalledWith({
|
|
80
|
+
error: { code: 400, message: [zodError] },
|
|
81
|
+
});
|
|
82
|
+
expect(mockResponse.end).toHaveBeenCalled();
|
|
83
|
+
});
|
|
84
|
+
it("should unwrap nested ProsopoBaseError", async () => {
|
|
85
|
+
const mockRequest = { i18n };
|
|
86
|
+
const mockResponse = {
|
|
87
|
+
writeHead: vi.fn().mockReturnThis(),
|
|
88
|
+
set: vi.fn().mockReturnThis(),
|
|
89
|
+
status: vi.fn().mockReturnThis(),
|
|
90
|
+
send: vi.fn(),
|
|
91
|
+
end: vi.fn(),
|
|
92
|
+
};
|
|
93
|
+
const mockNext = vi.fn();
|
|
94
|
+
const envError = new ProsopoEnvError("GENERAL.ENVIRONMENT_NOT_READY", {
|
|
95
|
+
i18n,
|
|
96
|
+
});
|
|
97
|
+
const apiError = new ProsopoApiError(envError);
|
|
98
|
+
handleErrors(apiError, mockRequest, mockResponse, mockNext);
|
|
99
|
+
expect(mockResponse.set).toHaveBeenCalledWith("content-type", "application/json");
|
|
100
|
+
expect(mockResponse.status).toHaveBeenCalledWith(500);
|
|
101
|
+
expect(mockResponse.send).toHaveBeenCalledWith({
|
|
102
|
+
error: {
|
|
103
|
+
code: 500,
|
|
104
|
+
key: "GENERAL.ENVIRONMENT_NOT_READY",
|
|
105
|
+
message: "Environment not ready",
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
expect(mockResponse.end).toHaveBeenCalled();
|
|
109
|
+
});
|
|
110
|
+
it("should unwrap nested ProsopoBaseErrors but not an Error that is nested inside them", async () => {
|
|
111
|
+
const mockRequest = { i18n };
|
|
112
|
+
const mockResponse = {
|
|
113
|
+
writeHead: vi.fn().mockReturnThis(),
|
|
114
|
+
set: vi.fn().mockReturnThis(),
|
|
115
|
+
status: vi.fn().mockReturnThis(),
|
|
116
|
+
send: vi.fn(),
|
|
117
|
+
end: vi.fn(),
|
|
118
|
+
};
|
|
119
|
+
const mockNext = vi.fn();
|
|
120
|
+
const code = 400;
|
|
121
|
+
const key = "API.UNKNOWN";
|
|
122
|
+
const error = new Error("Some error");
|
|
123
|
+
const apiError = new ProsopoApiError(key, {
|
|
124
|
+
context: { code, error },
|
|
125
|
+
i18n,
|
|
126
|
+
});
|
|
127
|
+
handleErrors(apiError, mockRequest, mockResponse, mockNext);
|
|
128
|
+
expect(mockResponse.set).toHaveBeenCalledWith("content-type", "application/json");
|
|
129
|
+
expect(mockResponse.status).toHaveBeenCalledWith(code);
|
|
130
|
+
expect(mockResponse.send).toHaveBeenCalledWith({
|
|
131
|
+
error: {
|
|
132
|
+
code,
|
|
133
|
+
key,
|
|
134
|
+
message: "Unknown API error",
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
expect(mockResponse.end).toHaveBeenCalled();
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
//# sourceMappingURL=errorHandler.unit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandler.unit.test.js","sourceRoot":"","sources":["../../../src/tests/unit/errorHandler.unit.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prosopo/api-express-router",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.2",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -14,18 +14,18 @@
|
|
|
14
14
|
}
|
|
15
15
|
},
|
|
16
16
|
"scripts": {
|
|
17
|
-
"test": "
|
|
17
|
+
"test": "NODE_ENV=${NODE_ENV:-test}; npx vitest run --config ./vite.test.config.ts",
|
|
18
18
|
"clean": "tsc --build --clean",
|
|
19
19
|
"build": "tsc --build --verbose",
|
|
20
20
|
"build:cjs": "npx vite --config vite.cjs.config.ts build"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@prosopo/api-route": "2.
|
|
24
|
-
"@prosopo/common": "2.
|
|
23
|
+
"@prosopo/api-route": "2.4.2",
|
|
24
|
+
"@prosopo/common": "2.4.2",
|
|
25
25
|
"zod": "3.23.8"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"@prosopo/config": "2.
|
|
28
|
+
"@prosopo/config": "2.4.2"
|
|
29
29
|
},
|
|
30
30
|
"author": "PROSOPO LIMITED <info@prosopo.io>",
|
|
31
31
|
"license": "Apache-2.0",
|
package/vite.cjs.config.ts
CHANGED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Copyright 2021-2025 Prosopo (UK) Ltd.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
|
|
15
|
+
import fs from "node:fs";
|
|
16
|
+
import path from "node:path";
|
|
17
|
+
import { ViteTestConfig } from "@prosopo/config";
|
|
18
|
+
import dotenv from "dotenv";
|
|
19
|
+
process.env.NODE_ENV = "test";
|
|
20
|
+
// if .env.test exists at this level, use it, otherwise use the one at the root
|
|
21
|
+
const envFile = `.env.${process.env.NODE_ENV || "development"}`;
|
|
22
|
+
let envPath = envFile;
|
|
23
|
+
if (fs.existsSync(envFile)) {
|
|
24
|
+
envPath = path.resolve(envFile);
|
|
25
|
+
} else if (fs.existsSync(`../../${envFile}`)) {
|
|
26
|
+
envPath = path.resolve(`../../${envFile}`);
|
|
27
|
+
} else {
|
|
28
|
+
throw new Error(`No ${envFile} file found`);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
dotenv.config({ path: envPath });
|
|
32
|
+
|
|
33
|
+
export default ViteTestConfig;
|