hi-secure 1.0.15 → 1.0.16
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/adapters/ArgonAdapter.d.ts +1 -1
- package/dist/adapters/ArgonAdapter.d.ts.map +1 -1
- package/dist/adapters/ArgonAdapter.js +43 -5
- package/dist/adapters/ArgonAdapter.js.map +1 -1
- package/dist/adapters/BcryptAdapter.d.ts.map +1 -1
- package/dist/adapters/BcryptAdapter.js +43 -3
- package/dist/adapters/BcryptAdapter.js.map +1 -1
- package/dist/adapters/ExpressRLAdapter.d.ts.map +1 -1
- package/dist/adapters/ExpressRLAdapter.js +48 -6
- package/dist/adapters/ExpressRLAdapter.js.map +1 -1
- package/dist/adapters/ExpressValidatorAdapter.d.ts.map +1 -1
- package/dist/adapters/ExpressValidatorAdapter.js +50 -10
- package/dist/adapters/ExpressValidatorAdapter.js.map +1 -1
- package/dist/adapters/GoogleAdapter.d.ts.map +1 -1
- package/dist/adapters/GoogleAdapter.js +82 -16
- package/dist/adapters/GoogleAdapter.js.map +1 -1
- package/dist/adapters/JWTAdapter.d.ts.map +1 -1
- package/dist/adapters/JWTAdapter.js +104 -15
- package/dist/adapters/JWTAdapter.js.map +1 -1
- package/dist/adapters/RLFlexibleAdapter.d.ts.map +1 -1
- package/dist/adapters/RLFlexibleAdapter.js +87 -12
- package/dist/adapters/RLFlexibleAdapter.js.map +1 -1
- package/dist/adapters/SanitizeHtmlAdapter.d.ts.map +1 -1
- package/dist/adapters/SanitizeHtmlAdapter.js +81 -13
- package/dist/adapters/SanitizeHtmlAdapter.js.map +1 -1
- package/dist/adapters/XSSAdapter.d.ts +1 -1
- package/dist/adapters/XSSAdapter.d.ts.map +1 -1
- package/dist/adapters/XSSAdapter.js +137 -20
- package/dist/adapters/XSSAdapter.js.map +1 -1
- package/dist/adapters/ZodAdapter.d.ts +1 -1
- package/dist/adapters/ZodAdapter.d.ts.map +1 -1
- package/dist/adapters/ZodAdapter.js +13 -8
- package/dist/adapters/ZodAdapter.js.map +1 -1
- package/dist/core/HiSecure.d.ts +3 -4
- package/dist/core/HiSecure.d.ts.map +1 -1
- package/dist/core/HiSecure.js +108 -121
- package/dist/core/HiSecure.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/logging/index.d.ts.map +1 -1
- package/dist/logging/index.js +2 -0
- package/dist/logging/index.js.map +1 -1
- package/dist/logging/morganSetup.d.ts.map +1 -1
- package/dist/logging/morganSetup.js +22 -1
- package/dist/logging/morganSetup.js.map +1 -1
- package/dist/logging/winstonSetup.d.ts.map +1 -1
- package/dist/logging/winstonSetup.js +61 -3
- package/dist/logging/winstonSetup.js.map +1 -1
- package/dist/managers/AuthManager.d.ts +2 -2
- package/dist/managers/AuthManager.d.ts.map +1 -1
- package/dist/managers/AuthManager.js +167 -31
- package/dist/managers/AuthManager.js.map +1 -1
- package/dist/managers/CorsManager.d.ts.map +1 -1
- package/dist/managers/CorsManager.js +46 -11
- package/dist/managers/CorsManager.js.map +1 -1
- package/dist/managers/HashManager.d.ts +1 -1
- package/dist/managers/HashManager.d.ts.map +1 -1
- package/dist/managers/HashManager.js +127 -17
- package/dist/managers/HashManager.js.map +1 -1
- package/dist/managers/JsonManager.d.ts +1 -1
- package/dist/managers/JsonManager.d.ts.map +1 -1
- package/dist/managers/JsonManager.js +99 -16
- package/dist/managers/JsonManager.js.map +1 -1
- package/dist/managers/RateLimitManager.d.ts +1 -1
- package/dist/managers/RateLimitManager.d.ts.map +1 -1
- package/dist/managers/RateLimitManager.js +46 -22
- package/dist/managers/RateLimitManager.js.map +1 -1
- package/dist/managers/SanitizerManager.d.ts.map +1 -1
- package/dist/managers/SanitizerManager.js +112 -15
- package/dist/managers/SanitizerManager.js.map +1 -1
- package/dist/managers/ValidatorManager.d.ts.map +1 -1
- package/dist/managers/ValidatorManager.js +90 -7
- package/dist/managers/ValidatorManager.js.map +1 -1
- package/package.json +2 -6
- package/readme.md +3 -6
- package/src/adapters/ArgonAdapter.ts +55 -6
- package/src/adapters/BcryptAdapter.ts +56 -8
- package/src/adapters/ExpressRLAdapter.ts +62 -9
- package/src/adapters/ExpressValidatorAdapter.ts +67 -11
- package/src/adapters/GoogleAdapter.ts +106 -21
- package/src/adapters/JWTAdapter.ts +129 -21
- package/src/adapters/RLFlexibleAdapter.ts +113 -16
- package/src/adapters/SanitizeHtmlAdapter.ts +111 -18
- package/src/adapters/XSSAdapter.ts +183 -39
- package/src/adapters/ZodAdapter.ts +56 -10
- package/src/core/HiSecure.ts +496 -162
- package/src/index.ts +4 -0
- package/src/logging/index.ts +6 -0
- package/src/logging/morganSetup.ts +36 -1
- package/src/logging/winstonSetup.ts +97 -8
- package/src/managers/AuthManager.ts +205 -34
- package/src/managers/CorsManager.ts +63 -16
- package/src/managers/HashManager.ts +156 -19
- package/src/managers/JsonManager.ts +119 -15
- package/src/managers/RateLimitManager.ts +174 -29
- package/src/managers/SanitizerManager.ts +150 -25
- package/src/managers/ValidatorManager.ts +115 -15
|
@@ -1,4 +1,107 @@
|
|
|
1
|
-
import { SanitizerError } from "../core/errors/SanitizerError.js";
|
|
1
|
+
// import { SanitizerError } from "../core/errors/SanitizerError.js";
|
|
2
|
+
// import { logger } from "../logging";
|
|
3
|
+
|
|
4
|
+
// interface SanitizerAdapter {
|
|
5
|
+
// sanitize: (value: string, options?: any) => string;
|
|
6
|
+
// }
|
|
7
|
+
|
|
8
|
+
// export class SanitizerManager {
|
|
9
|
+
// private primary: SanitizerAdapter;
|
|
10
|
+
// private fallback: SanitizerAdapter | null;
|
|
11
|
+
|
|
12
|
+
// constructor(primary: SanitizerAdapter, fallback: SanitizerAdapter | null = null) {
|
|
13
|
+
// this.primary = primary;
|
|
14
|
+
// this.fallback = fallback;
|
|
15
|
+
// }
|
|
16
|
+
|
|
17
|
+
// sanitize(value: string, options?: any): string {
|
|
18
|
+
|
|
19
|
+
// if (typeof value !== 'string') {
|
|
20
|
+
// return value;
|
|
21
|
+
// }
|
|
22
|
+
|
|
23
|
+
// try {
|
|
24
|
+
// return this.primary.sanitize(value, options);
|
|
25
|
+
// } catch (err: any) {
|
|
26
|
+
// logger.warn("Primary sanitizer failed", { error: err?.message });
|
|
27
|
+
|
|
28
|
+
// if (!this.fallback) {
|
|
29
|
+
// throw new SanitizerError("Primary sanitizer failed and no fallback available.");
|
|
30
|
+
// }
|
|
31
|
+
|
|
32
|
+
// logger.info("Using fallback sanitizer");
|
|
33
|
+
// return this.fallback.sanitize(value, options);
|
|
34
|
+
// }
|
|
35
|
+
// }
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
// middleware(options?: any) {
|
|
39
|
+
// return (req: any, _res: any, next: any) => {
|
|
40
|
+
// let fallbackTriggered = false;
|
|
41
|
+
|
|
42
|
+
// const safeSanitize = (value: string): string => {
|
|
43
|
+
// if (fallbackTriggered && this.fallback) {
|
|
44
|
+
// return this.fallback.sanitize(value, options);
|
|
45
|
+
// }
|
|
46
|
+
|
|
47
|
+
// try {
|
|
48
|
+
// return this.primary.sanitize(value, options);
|
|
49
|
+
// } catch (err: any) {
|
|
50
|
+
// if (!this.fallback) {
|
|
51
|
+
// throw err;
|
|
52
|
+
// }
|
|
53
|
+
|
|
54
|
+
// fallbackTriggered = true;
|
|
55
|
+
// logger.warn("Switching to fallback sanitizer for this request");
|
|
56
|
+
// return this.fallback.sanitize(value, options);
|
|
57
|
+
// }
|
|
58
|
+
// };
|
|
59
|
+
|
|
60
|
+
// try {
|
|
61
|
+
|
|
62
|
+
// if (req.body && typeof req.body === "object") {
|
|
63
|
+
// const originalBody = req.body;
|
|
64
|
+
// const sanitizedBody: any = Array.isArray(originalBody) ? [] : {};
|
|
65
|
+
|
|
66
|
+
// for (const key of Object.keys(originalBody)) {
|
|
67
|
+
// const value = originalBody[key];
|
|
68
|
+
|
|
69
|
+
// if (typeof value === "string") {
|
|
70
|
+
// sanitizedBody[key] = safeSanitize(value);
|
|
71
|
+
// } else if (Array.isArray(value)) {
|
|
72
|
+
// sanitizedBody[key] = value.map(item =>
|
|
73
|
+
// typeof item === "string" ? safeSanitize(item) : item
|
|
74
|
+
// );
|
|
75
|
+
// } else if (value && typeof value === "object") {
|
|
76
|
+
// sanitizedBody[key] = value;
|
|
77
|
+
// } else {
|
|
78
|
+
// sanitizedBody[key] = value;
|
|
79
|
+
// }
|
|
80
|
+
// }
|
|
81
|
+
|
|
82
|
+
// req.sanitizedBody = sanitizedBody;
|
|
83
|
+
|
|
84
|
+
// logger.debug("Request body sanitized", {
|
|
85
|
+
// originalKeys: Object.keys(originalBody),
|
|
86
|
+
// sanitizedKeys: Object.keys(sanitizedBody),
|
|
87
|
+
// usedFallback: fallbackTriggered
|
|
88
|
+
// });
|
|
89
|
+
// }
|
|
90
|
+
|
|
91
|
+
// next();
|
|
92
|
+
// } catch (err: any) {
|
|
93
|
+
// logger.error("Sanitizer middleware failed", {
|
|
94
|
+
// error: err?.message
|
|
95
|
+
// });
|
|
96
|
+
// next(new SanitizerError("Sanitizer middleware failure"));
|
|
97
|
+
// }
|
|
98
|
+
// };
|
|
99
|
+
// }
|
|
100
|
+
// }
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
import { SanitizerError } from "../core/errors/SanitizerError";
|
|
2
105
|
import { logger } from "../logging";
|
|
3
106
|
|
|
4
107
|
interface SanitizerAdapter {
|
|
@@ -12,78 +115,97 @@ export class SanitizerManager {
|
|
|
12
115
|
constructor(primary: SanitizerAdapter, fallback: SanitizerAdapter | null = null) {
|
|
13
116
|
this.primary = primary;
|
|
14
117
|
this.fallback = fallback;
|
|
118
|
+
|
|
119
|
+
logger.info("SanitizerManager initialized", {
|
|
120
|
+
layer: "sanitizer-manager",
|
|
121
|
+
fallbackEnabled: !!fallback
|
|
122
|
+
});
|
|
15
123
|
}
|
|
16
124
|
|
|
17
125
|
sanitize(value: string, options?: any): string {
|
|
18
|
-
|
|
19
|
-
if (typeof value !== 'string') {
|
|
126
|
+
if (typeof value !== "string") {
|
|
20
127
|
return value;
|
|
21
128
|
}
|
|
22
129
|
|
|
23
130
|
try {
|
|
24
131
|
return this.primary.sanitize(value, options);
|
|
25
132
|
} catch (err: any) {
|
|
26
|
-
logger.warn("Primary sanitizer failed", {
|
|
133
|
+
logger.warn("Primary sanitizer failed", {
|
|
134
|
+
layer: "sanitizer-manager",
|
|
135
|
+
operation: "sanitize",
|
|
136
|
+
reason: err?.message
|
|
137
|
+
});
|
|
27
138
|
|
|
28
139
|
if (!this.fallback) {
|
|
29
|
-
throw new SanitizerError(
|
|
140
|
+
throw new SanitizerError(
|
|
141
|
+
"Primary sanitizer failed and no fallback available."
|
|
142
|
+
);
|
|
30
143
|
}
|
|
31
144
|
|
|
32
|
-
logger.
|
|
145
|
+
logger.warn("Sanitizer fallback used", {
|
|
146
|
+
layer: "sanitizer-manager",
|
|
147
|
+
operation: "sanitize"
|
|
148
|
+
});
|
|
149
|
+
|
|
33
150
|
return this.fallback.sanitize(value, options);
|
|
34
151
|
}
|
|
35
152
|
}
|
|
36
153
|
|
|
37
|
-
|
|
38
154
|
middleware(options?: any) {
|
|
39
155
|
return (req: any, _res: any, next: any) => {
|
|
40
156
|
let fallbackTriggered = false;
|
|
41
|
-
|
|
157
|
+
|
|
42
158
|
const safeSanitize = (value: string): string => {
|
|
43
159
|
if (fallbackTriggered && this.fallback) {
|
|
44
160
|
return this.fallback.sanitize(value, options);
|
|
45
161
|
}
|
|
46
|
-
|
|
162
|
+
|
|
47
163
|
try {
|
|
48
164
|
return this.primary.sanitize(value, options);
|
|
49
165
|
} catch (err: any) {
|
|
50
166
|
if (!this.fallback) {
|
|
51
167
|
throw err;
|
|
52
168
|
}
|
|
53
|
-
|
|
169
|
+
|
|
54
170
|
fallbackTriggered = true;
|
|
55
|
-
|
|
171
|
+
|
|
172
|
+
logger.warn("Switching to fallback sanitizer for request", {
|
|
173
|
+
layer: "sanitizer-manager",
|
|
174
|
+
operation: "middleware"
|
|
175
|
+
});
|
|
176
|
+
|
|
56
177
|
return this.fallback.sanitize(value, options);
|
|
57
178
|
}
|
|
58
179
|
};
|
|
59
180
|
|
|
60
181
|
try {
|
|
61
|
-
|
|
62
182
|
if (req.body && typeof req.body === "object") {
|
|
63
183
|
const originalBody = req.body;
|
|
64
184
|
const sanitizedBody: any = Array.isArray(originalBody) ? [] : {};
|
|
65
|
-
|
|
185
|
+
|
|
66
186
|
for (const key of Object.keys(originalBody)) {
|
|
67
187
|
const value = originalBody[key];
|
|
68
|
-
|
|
188
|
+
|
|
69
189
|
if (typeof value === "string") {
|
|
70
190
|
sanitizedBody[key] = safeSanitize(value);
|
|
71
191
|
} else if (Array.isArray(value)) {
|
|
72
|
-
sanitizedBody[key] = value.map(item =>
|
|
73
|
-
typeof item === "string"
|
|
192
|
+
sanitizedBody[key] = value.map(item =>
|
|
193
|
+
typeof item === "string"
|
|
194
|
+
? safeSanitize(item)
|
|
195
|
+
: item
|
|
74
196
|
);
|
|
75
|
-
} else if (value && typeof value === "object") {
|
|
76
|
-
sanitizedBody[key] = value;
|
|
77
197
|
} else {
|
|
78
198
|
sanitizedBody[key] = value;
|
|
79
199
|
}
|
|
80
200
|
}
|
|
81
|
-
|
|
201
|
+
|
|
82
202
|
req.sanitizedBody = sanitizedBody;
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
203
|
+
|
|
204
|
+
// ✅ visible + safe info
|
|
205
|
+
logger.info("Request body sanitized", {
|
|
206
|
+
layer: "sanitizer-manager",
|
|
207
|
+
operation: "middleware",
|
|
208
|
+
fieldCount: Object.keys(sanitizedBody).length,
|
|
87
209
|
usedFallback: fallbackTriggered
|
|
88
210
|
});
|
|
89
211
|
}
|
|
@@ -91,10 +213,13 @@ export class SanitizerManager {
|
|
|
91
213
|
next();
|
|
92
214
|
} catch (err: any) {
|
|
93
215
|
logger.error("Sanitizer middleware failed", {
|
|
94
|
-
|
|
216
|
+
layer: "sanitizer-manager",
|
|
217
|
+
operation: "middleware",
|
|
218
|
+
reason: err?.message
|
|
95
219
|
});
|
|
220
|
+
|
|
96
221
|
next(new SanitizerError("Sanitizer middleware failure"));
|
|
97
222
|
}
|
|
98
223
|
};
|
|
99
224
|
}
|
|
100
|
-
}
|
|
225
|
+
}
|
|
@@ -1,5 +1,80 @@
|
|
|
1
|
+
// import { logger } from "../logging";
|
|
2
|
+
// import { ValidationError } from "../core/errors/ValidationError.js";
|
|
3
|
+
|
|
4
|
+
// interface ValidatorAdapter {
|
|
5
|
+
// validate: (schema?: any) => any;
|
|
6
|
+
// }
|
|
7
|
+
|
|
8
|
+
// export class ValidatorManager {
|
|
9
|
+
// private zodAdapter: ValidatorAdapter;
|
|
10
|
+
// private expressAdapter: ValidatorAdapter;
|
|
11
|
+
|
|
12
|
+
// constructor(zodAdapter: ValidatorAdapter, expressAdapter: ValidatorAdapter) {
|
|
13
|
+
// this.zodAdapter = zodAdapter;
|
|
14
|
+
// this.expressAdapter = expressAdapter;
|
|
15
|
+
// }
|
|
16
|
+
|
|
17
|
+
// validate(schema?: any) {
|
|
18
|
+
// const isZod =
|
|
19
|
+
// schema &&
|
|
20
|
+
// typeof schema === "object" &&
|
|
21
|
+
// typeof schema._def === "object" &&
|
|
22
|
+
// typeof schema.safeParse === "function";
|
|
23
|
+
|
|
24
|
+
// const isExpressValidator = Array.isArray(schema);
|
|
25
|
+
|
|
26
|
+
// return (req: any, res: any, next: any) => {
|
|
27
|
+
// let middleware;
|
|
28
|
+
|
|
29
|
+
// if (isZod) {
|
|
30
|
+
// logger.debug("Using Zod adapter");
|
|
31
|
+
// middleware = this.zodAdapter.validate(schema);
|
|
32
|
+
// }
|
|
33
|
+
// else if (isExpressValidator) {
|
|
34
|
+
// logger.debug(" Using express-validator adapter");
|
|
35
|
+
// middleware = this.expressAdapter.validate(schema);
|
|
36
|
+
// }
|
|
37
|
+
// else {
|
|
38
|
+
// return next();
|
|
39
|
+
// }
|
|
40
|
+
|
|
41
|
+
// // CASE 1 — express-validator returns ARRAY
|
|
42
|
+
// if (Array.isArray(middleware)) {
|
|
43
|
+
// let idx = 0;
|
|
44
|
+
|
|
45
|
+
// const run = (err?: any) => {
|
|
46
|
+
// if (err) return next(err);
|
|
47
|
+
|
|
48
|
+
// const fn = middleware[idx++];
|
|
49
|
+
// if (!fn) return next(); // done
|
|
50
|
+
|
|
51
|
+
// try {
|
|
52
|
+
// fn(req, res, run);
|
|
53
|
+
// } catch (error: any) {
|
|
54
|
+
// next(new ValidationError(error.message));
|
|
55
|
+
// }
|
|
56
|
+
// };
|
|
57
|
+
|
|
58
|
+
// return run();
|
|
59
|
+
// }
|
|
60
|
+
|
|
61
|
+
// // CASE 2 — Zod returns SINGLE MIDDLEWARE
|
|
62
|
+
// try {
|
|
63
|
+
// middleware(req, res, (err?: any) => {
|
|
64
|
+
// if (err) return next(err);
|
|
65
|
+
// next();
|
|
66
|
+
// });
|
|
67
|
+
// } catch (err: any) {
|
|
68
|
+
// next(new ValidationError(err.message));
|
|
69
|
+
// }
|
|
70
|
+
// };
|
|
71
|
+
// }
|
|
72
|
+
// }
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
|
|
1
76
|
import { logger } from "../logging";
|
|
2
|
-
import { ValidationError } from "../core/errors/ValidationError
|
|
77
|
+
import { ValidationError } from "../core/errors/ValidationError";
|
|
3
78
|
|
|
4
79
|
interface ValidatorAdapter {
|
|
5
80
|
validate: (schema?: any) => any;
|
|
@@ -12,32 +87,44 @@ export class ValidatorManager {
|
|
|
12
87
|
constructor(zodAdapter: ValidatorAdapter, expressAdapter: ValidatorAdapter) {
|
|
13
88
|
this.zodAdapter = zodAdapter;
|
|
14
89
|
this.expressAdapter = expressAdapter;
|
|
90
|
+
|
|
91
|
+
logger.info("ValidatorManager initialized", {
|
|
92
|
+
layer: "validator-manager",
|
|
93
|
+
adapters: ["zod", "express-validator"]
|
|
94
|
+
});
|
|
15
95
|
}
|
|
16
96
|
|
|
17
97
|
validate(schema?: any) {
|
|
18
98
|
const isZod =
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
99
|
+
schema &&
|
|
100
|
+
typeof schema === "object" &&
|
|
101
|
+
typeof schema._def === "object" &&
|
|
102
|
+
typeof schema.safeParse === "function";
|
|
23
103
|
|
|
24
104
|
const isExpressValidator = Array.isArray(schema);
|
|
25
105
|
|
|
26
106
|
return (req: any, res: any, next: any) => {
|
|
27
107
|
let middleware;
|
|
108
|
+
let adapterUsed: "zod" | "express-validator" | "none" = "none";
|
|
28
109
|
|
|
29
110
|
if (isZod) {
|
|
30
|
-
|
|
111
|
+
adapterUsed = "zod";
|
|
31
112
|
middleware = this.zodAdapter.validate(schema);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
logger.debug(" Using express-validator adapter");
|
|
113
|
+
} else if (isExpressValidator) {
|
|
114
|
+
adapterUsed = "express-validator";
|
|
35
115
|
middleware = this.expressAdapter.validate(schema);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return next();
|
|
116
|
+
} else {
|
|
117
|
+
return next();
|
|
39
118
|
}
|
|
40
119
|
|
|
120
|
+
logger.info("Validation adapter selected", {
|
|
121
|
+
layer: "validator-manager",
|
|
122
|
+
operation: "select",
|
|
123
|
+
adapter: adapterUsed,
|
|
124
|
+
path: req.path,
|
|
125
|
+
method: req.method
|
|
126
|
+
});
|
|
127
|
+
|
|
41
128
|
// CASE 1 — express-validator returns ARRAY
|
|
42
129
|
if (Array.isArray(middleware)) {
|
|
43
130
|
let idx = 0;
|
|
@@ -46,11 +133,18 @@ export class ValidatorManager {
|
|
|
46
133
|
if (err) return next(err);
|
|
47
134
|
|
|
48
135
|
const fn = middleware[idx++];
|
|
49
|
-
if (!fn) return next();
|
|
136
|
+
if (!fn) return next();
|
|
50
137
|
|
|
51
138
|
try {
|
|
52
139
|
fn(req, res, run);
|
|
53
140
|
} catch (error: any) {
|
|
141
|
+
logger.error("Validation middleware execution failed", {
|
|
142
|
+
layer: "validator-manager",
|
|
143
|
+
operation: "execute",
|
|
144
|
+
adapter: adapterUsed,
|
|
145
|
+
reason: error?.message
|
|
146
|
+
});
|
|
147
|
+
|
|
54
148
|
next(new ValidationError(error.message));
|
|
55
149
|
}
|
|
56
150
|
};
|
|
@@ -58,16 +152,22 @@ export class ValidatorManager {
|
|
|
58
152
|
return run();
|
|
59
153
|
}
|
|
60
154
|
|
|
61
|
-
// CASE 2 — Zod returns SINGLE
|
|
155
|
+
// CASE 2 — Zod returns SINGLE middleware
|
|
62
156
|
try {
|
|
63
157
|
middleware(req, res, (err?: any) => {
|
|
64
158
|
if (err) return next(err);
|
|
65
159
|
next();
|
|
66
160
|
});
|
|
67
161
|
} catch (err: any) {
|
|
162
|
+
logger.error("Validation middleware execution failed", {
|
|
163
|
+
layer: "validator-manager",
|
|
164
|
+
operation: "execute",
|
|
165
|
+
adapter: adapterUsed,
|
|
166
|
+
reason: err?.message
|
|
167
|
+
});
|
|
168
|
+
|
|
68
169
|
next(new ValidationError(err.message));
|
|
69
170
|
}
|
|
70
171
|
};
|
|
71
172
|
}
|
|
72
173
|
}
|
|
73
|
-
|