@prosopo/api-express-router 3.0.25 → 3.0.33

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 (56) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/coverage/base.css +224 -0
  3. package/coverage/block-navigation.js +87 -0
  4. package/coverage/clover.xml +245 -0
  5. package/coverage/coverage-final.json +8 -0
  6. package/coverage/favicon.png +0 -0
  7. package/coverage/index.html +146 -0
  8. package/coverage/prettify.css +1 -0
  9. package/coverage/prettify.js +2 -0
  10. package/coverage/sort-arrow-sprite.png +0 -0
  11. package/coverage/sorter.js +210 -0
  12. package/coverage/src/apiExpressRouterFactory.ts.html +289 -0
  13. package/coverage/src/endpointAdapter/apiExpressDefaultEndpointAdapter.ts.html +268 -0
  14. package/coverage/src/endpointAdapter/apiExpressEndpointAdapter.ts.html +169 -0
  15. package/coverage/src/endpointAdapter/index.html +131 -0
  16. package/coverage/src/errorHandler.ts.html +184 -0
  17. package/coverage/src/index.html +146 -0
  18. package/coverage/src/index.ts.html +196 -0
  19. package/coverage/src/middlewares/authMiddleware.ts.html +454 -0
  20. package/coverage/src/middlewares/index.html +131 -0
  21. package/coverage/src/middlewares/requestLoggerMiddleware.ts.html +211 -0
  22. package/dist/apiExpressRouterFactory.d.ts +9 -0
  23. package/dist/apiExpressRouterFactory.d.ts.map +1 -0
  24. package/dist/apiExpressRouterFactory.js +3 -3
  25. package/dist/apiExpressRouterFactory.js.map +1 -0
  26. package/dist/cjs/apiExpressRouterFactory.cjs +3 -3
  27. package/dist/cjs/endpointAdapter/apiExpressDefaultEndpointAdapter.cjs +2 -1
  28. package/dist/endpointAdapter/apiExpressDefaultEndpointAdapter.d.ts +13 -0
  29. package/dist/endpointAdapter/apiExpressDefaultEndpointAdapter.d.ts.map +1 -0
  30. package/dist/endpointAdapter/apiExpressDefaultEndpointAdapter.js +3 -2
  31. package/dist/endpointAdapter/apiExpressDefaultEndpointAdapter.js.map +1 -0
  32. package/dist/endpointAdapter/apiExpressEndpointAdapter.d.ts +8 -0
  33. package/dist/endpointAdapter/apiExpressEndpointAdapter.d.ts.map +1 -0
  34. package/dist/endpointAdapter/apiExpressEndpointAdapter.js +2 -0
  35. package/dist/endpointAdapter/apiExpressEndpointAdapter.js.map +1 -0
  36. package/dist/errorHandler.d.ts +5 -0
  37. package/dist/errorHandler.d.ts.map +1 -0
  38. package/dist/errorHandler.js.map +1 -0
  39. package/dist/index.d.ts +10 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/middlewares/authMiddleware.d.ts +5 -0
  43. package/dist/middlewares/authMiddleware.d.ts.map +1 -0
  44. package/dist/middlewares/authMiddleware.js.map +1 -0
  45. package/dist/middlewares/requestLoggerMiddleware.d.ts +4 -0
  46. package/dist/middlewares/requestLoggerMiddleware.d.ts.map +1 -0
  47. package/dist/middlewares/requestLoggerMiddleware.js.map +1 -0
  48. package/dist/tests/unit/errorHandler.unit.test.d.ts +2 -0
  49. package/dist/tests/unit/errorHandler.unit.test.d.ts.map +1 -0
  50. package/dist/tests/unit/errorHandler.unit.test.js +140 -0
  51. package/dist/tests/unit/errorHandler.unit.test.js.map +1 -0
  52. package/dist/tests/unit/middlewares/authMiddleware.unit.test.d.ts +2 -0
  53. package/dist/tests/unit/middlewares/authMiddleware.unit.test.d.ts.map +1 -0
  54. package/dist/tests/unit/middlewares/authMiddleware.unit.test.js +135 -0
  55. package/dist/tests/unit/middlewares/authMiddleware.unit.test.js.map +1 -0
  56. package/package.json +11 -11
@@ -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 not return 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 message = "Unknown API error";
47
+ const error = new SyntaxError(message);
48
+ handleErrors(error, mockRequest, mockResponse, mockNext);
49
+ expect(mockResponse.set).toHaveBeenCalledWith("content-type", "application/json");
50
+ expect(mockResponse.status).toHaveBeenCalledWith(400);
51
+ expect(mockResponse.send).toHaveBeenCalledWith({
52
+ error: {
53
+ message,
54
+ key: "API.UNKNOWN",
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, key: "API.INVALID_BODY", 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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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=authMiddleware.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authMiddleware.unit.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/unit/middlewares/authMiddleware.unit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,135 @@
1
+ import { hexToU8a, isHex } from "@polkadot/util";
2
+ import { ProsopoApiError, ProsopoEnvError, getLogger, } from "@prosopo/common";
3
+ import { describe, expect, it, vi } from "vitest";
4
+ import { authMiddleware } from "../../../middlewares/authMiddleware.js";
5
+ const loggerOuter = getLogger("info", import.meta.url);
6
+ const mockLogger = {
7
+ debug: vi.fn().mockImplementation(loggerOuter.debug.bind(loggerOuter)),
8
+ log: vi.fn().mockImplementation(loggerOuter.log.bind(loggerOuter)),
9
+ info: vi.fn().mockImplementation(loggerOuter.info.bind(loggerOuter)),
10
+ error: vi.fn().mockImplementation(loggerOuter.error.bind(loggerOuter)),
11
+ trace: vi.fn().mockImplementation(loggerOuter.trace.bind(loggerOuter)),
12
+ fatal: vi.fn().mockImplementation(loggerOuter.fatal.bind(loggerOuter)),
13
+ warn: vi.fn().mockImplementation(loggerOuter.warn.bind(loggerOuter)),
14
+ };
15
+ vi.mock("@polkadot/util", async (importOriginal) => {
16
+ const actual = await importOriginal();
17
+ return {
18
+ ...actual,
19
+ hexToU8a: vi.fn(),
20
+ isHex: vi.fn(),
21
+ };
22
+ });
23
+ const mockPair = {
24
+ publicKey: "mockPublicKey",
25
+ verify: vi.fn(),
26
+ };
27
+ const mockEnv = {
28
+ pair: mockPair,
29
+ authAccount: mockPair,
30
+ logger: mockLogger,
31
+ };
32
+ describe("authMiddleware", () => {
33
+ it("should call next() if signature is valid", async () => {
34
+ const mockLogger = {
35
+ debug: vi.fn().mockImplementation(loggerOuter.debug.bind(loggerOuter)),
36
+ log: vi.fn().mockImplementation(loggerOuter.log.bind(loggerOuter)),
37
+ info: vi.fn().mockImplementation(loggerOuter.info.bind(loggerOuter)),
38
+ error: vi.fn().mockImplementation(loggerOuter.error.bind(loggerOuter)),
39
+ trace: vi.fn().mockImplementation(loggerOuter.trace.bind(loggerOuter)),
40
+ fatal: vi.fn().mockImplementation(loggerOuter.fatal.bind(loggerOuter)),
41
+ warn: vi.fn().mockImplementation(loggerOuter.warn.bind(loggerOuter)),
42
+ };
43
+ const mockReq = {
44
+ url: "/v1/prosopo/provider/captcha/image",
45
+ originalUrl: "/v1/prosopo/provider/captcha/image",
46
+ headers: {
47
+ signature: "0x1234",
48
+ timestamp: new Date().getTime(),
49
+ },
50
+ logger: mockLogger,
51
+ };
52
+ const mockRes = {
53
+ status: vi.fn().mockReturnThis(),
54
+ json: vi.fn(),
55
+ };
56
+ const mockNext = vi.fn();
57
+ vi.mocked(isHex).mockReturnValue(true);
58
+ vi.mocked(hexToU8a).mockReturnValue(new Uint8Array());
59
+ vi.mocked(mockPair.verify).mockReturnValue(true);
60
+ const middleware = authMiddleware(mockEnv.pair, mockEnv.authAccount);
61
+ await middleware(mockReq, mockRes, mockNext);
62
+ expect(mockNext).toHaveBeenCalled();
63
+ expect(mockRes.status).not.toHaveBeenCalled();
64
+ });
65
+ it("should return 401 if signature is invalid", async () => {
66
+ const mockLogger = {
67
+ debug: vi.fn().mockImplementation(loggerOuter.debug.bind(loggerOuter)),
68
+ log: vi.fn().mockImplementation(loggerOuter.log.bind(loggerOuter)),
69
+ info: vi.fn().mockImplementation(loggerOuter.info.bind(loggerOuter)),
70
+ error: vi.fn().mockImplementation(loggerOuter.error.bind(loggerOuter)),
71
+ trace: vi.fn().mockImplementation(loggerOuter.trace.bind(loggerOuter)),
72
+ fatal: vi.fn().mockImplementation(loggerOuter.fatal.bind(loggerOuter)),
73
+ warn: vi.fn().mockImplementation(loggerOuter.warn.bind(loggerOuter)),
74
+ };
75
+ const mockReq = {
76
+ url: "/v1/prosopo/provider/captcha/image",
77
+ originalUrl: "/v1/prosopo/provider/captcha/image",
78
+ headers: {
79
+ signature: "0x1234",
80
+ timestamp: new Date().getTime(),
81
+ },
82
+ logger: mockLogger,
83
+ };
84
+ const mockRes = {
85
+ status: vi.fn().mockReturnThis(),
86
+ json: vi.fn(),
87
+ };
88
+ const mockNext = vi.fn();
89
+ vi.mocked(isHex).mockReturnValue(true);
90
+ vi.mocked(hexToU8a).mockReturnValue(new Uint8Array());
91
+ vi.mocked(mockPair.verify).mockReturnValue(false);
92
+ const middleware = authMiddleware(mockEnv.pair, mockEnv.authAccount);
93
+ await middleware(mockReq, mockRes, mockNext);
94
+ expect(mockNext).not.toHaveBeenCalled();
95
+ expect(mockRes.status).toHaveBeenCalledWith(401);
96
+ expect(mockRes.json).toHaveBeenCalledWith({
97
+ error: "Unauthorized",
98
+ message: expect.any(ProsopoApiError),
99
+ });
100
+ });
101
+ it("should return 401 if key pair is missing", async () => {
102
+ const mockLogger = {
103
+ debug: vi.fn().mockImplementation(loggerOuter.debug.bind(loggerOuter)),
104
+ log: vi.fn().mockImplementation(loggerOuter.log.bind(loggerOuter)),
105
+ info: vi.fn().mockImplementation(loggerOuter.info.bind(loggerOuter)),
106
+ error: vi.fn().mockImplementation(loggerOuter.error.bind(loggerOuter)),
107
+ trace: vi.fn().mockImplementation(loggerOuter.trace.bind(loggerOuter)),
108
+ fatal: vi.fn().mockImplementation(loggerOuter.fatal.bind(loggerOuter)),
109
+ warn: vi.fn().mockImplementation(loggerOuter.warn.bind(loggerOuter)),
110
+ };
111
+ const mockReq = {
112
+ url: "/v1/prosopo/provider/captcha/image",
113
+ originalUrl: "/v1/prosopo/provider/captcha/image",
114
+ headers: {
115
+ signature: "0x1234",
116
+ timestamp: new Date().getTime(),
117
+ },
118
+ logger: mockLogger,
119
+ };
120
+ const mockRes = {
121
+ status: vi.fn().mockReturnThis(),
122
+ json: vi.fn(),
123
+ };
124
+ const mockNext = vi.fn();
125
+ const middleware = authMiddleware(undefined, undefined);
126
+ await middleware(mockReq, mockRes, mockNext);
127
+ expect(mockNext).not.toHaveBeenCalled();
128
+ expect(mockRes.status).toHaveBeenCalledWith(401);
129
+ expect(mockRes.json).toHaveBeenCalledWith({
130
+ error: "Unauthorized",
131
+ message: expect.any(ProsopoEnvError),
132
+ });
133
+ });
134
+ });
135
+ //# sourceMappingURL=authMiddleware.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authMiddleware.unit.test.js","sourceRoot":"","sources":["../../../../src/tests/unit/middlewares/authMiddleware.unit.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@prosopo/api-express-router",
3
- "version": "3.0.25",
3
+ "version": "3.0.33",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
7
7
  "engines": {
8
- "node": "20",
9
- "npm": "10.8.2"
8
+ "node": ">=v20.0.0",
9
+ "npm": ">=10.6.0"
10
10
  },
11
11
  "exports": {
12
12
  ".": {
@@ -24,13 +24,13 @@
24
24
  "test": "NODE_ENV=${NODE_ENV:-test}; npx vitest run --config ./vite.test.config.ts"
25
25
  },
26
26
  "dependencies": {
27
- "@polkadot/util": "12.6.2",
28
- "@prosopo/api-route": "2.6.28",
29
- "@prosopo/common": "3.1.20",
30
- "@prosopo/env": "3.2.13",
31
- "@prosopo/locale": "3.1.20",
32
- "@prosopo/types": "3.5.3",
33
- "@prosopo/config": "3.1.20",
27
+ "@polkadot/util": "13.5.7",
28
+ "@prosopo/api-route": "2.6.29",
29
+ "@prosopo/common": "3.1.21",
30
+ "@prosopo/env": "3.2.21",
31
+ "@prosopo/locale": "3.1.21",
32
+ "@prosopo/types": "3.5.11",
33
+ "@prosopo/config": "3.1.21",
34
34
  "dotenv": "16.4.5",
35
35
  "express": "4.21.2",
36
36
  "i18next": "24.1.0",
@@ -39,7 +39,7 @@
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/node": "22.10.2",
42
- "vitest": "3.0.9"
42
+ "vitest": "3.2.4"
43
43
  },
44
44
  "author": "PROSOPO LIMITED <info@prosopo.io>",
45
45
  "license": "Apache-2.0",