hi-secure 1.0.2 → 1.0.4

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 (49) hide show
  1. package/dist/adapters/ExpressRLAdapter.d.ts.map +1 -1
  2. package/dist/adapters/ExpressRLAdapter.js +0 -29
  3. package/dist/adapters/ExpressRLAdapter.js.map +1 -1
  4. package/dist/adapters/GoogleAdapter.d.ts.map +1 -1
  5. package/dist/adapters/GoogleAdapter.js +4 -3
  6. package/dist/adapters/GoogleAdapter.js.map +1 -1
  7. package/dist/adapters/JWTAdapter.d.ts.map +1 -1
  8. package/dist/adapters/JWTAdapter.js +3 -1
  9. package/dist/adapters/JWTAdapter.js.map +1 -1
  10. package/dist/core/HiSecure.d.ts +3 -18
  11. package/dist/core/HiSecure.d.ts.map +1 -1
  12. package/dist/core/HiSecure.js +29 -132
  13. package/dist/core/HiSecure.js.map +1 -1
  14. package/dist/core/errors/HttpError.d.ts +17 -0
  15. package/dist/core/errors/HttpError.d.ts.map +1 -0
  16. package/dist/core/errors/HttpError.js +36 -0
  17. package/dist/core/errors/HttpError.js.map +1 -0
  18. package/dist/core/useSecure.d.ts +0 -7
  19. package/dist/core/useSecure.d.ts.map +1 -1
  20. package/dist/core/useSecure.js +65 -21
  21. package/dist/core/useSecure.js.map +1 -1
  22. package/dist/index.d.ts +3 -6
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +19 -9
  25. package/dist/index.js.map +1 -1
  26. package/dist/managers/AuthManager.d.ts.map +1 -1
  27. package/dist/managers/AuthManager.js +18 -17
  28. package/dist/managers/AuthManager.js.map +1 -1
  29. package/dist/managers/ValidatorManager.d.ts +4 -6
  30. package/dist/managers/ValidatorManager.d.ts.map +1 -1
  31. package/dist/managers/ValidatorManager.js +97 -144
  32. package/dist/managers/ValidatorManager.js.map +1 -1
  33. package/dist/middlewares/errorHandler.js +2 -2
  34. package/dist/middlewares/errorHandler.js.map +1 -1
  35. package/dist/utils/normalizeOptions.d.ts.map +1 -1
  36. package/dist/utils/normalizeOptions.js +14 -4
  37. package/dist/utils/normalizeOptions.js.map +1 -1
  38. package/package.json +1 -1
  39. package/readme.md +38 -73
  40. package/src/adapters/GoogleAdapter.ts +5 -3
  41. package/src/adapters/JWTAdapter.ts +3 -1
  42. package/src/core/HiSecure.ts +262 -12
  43. package/src/core/useSecure.ts +91 -36
  44. package/src/index.ts +28 -12
  45. package/src/managers/AuthManager.ts +15 -13
  46. package/src/managers/ValidatorManager.ts +120 -182
  47. package/src/middlewares/errorHandler.ts +1 -1
  48. package/src/utils/normalizeOptions.ts +24 -9
  49. /package/src/core/errors/{HttpErrror.ts → HttpError.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"AuthManager.d.ts","sourceRoot":"","sources":["../../src/managers/AuthManager.ts"],"names":[],"mappings":"AA4GA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG1D,MAAM,WAAW,WAAW;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,qBAAa,WAAW;IACpB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,aAAa,CAAC,CAAgB;gBAE1B,IAAI,EAAE,WAAW;IAsB7B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE;IAK7E,MAAM,CAAC,KAAK,EAAE,MAAM;IAKd,mBAAmB,CAAC,OAAO,EAAE,MAAM;IAezC,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,IAIpB,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY;CA2D9D"}
1
+ {"version":3,"file":"AuthManager.d.ts","sourceRoot":"","sources":["../../src/managers/AuthManager.ts"],"names":[],"mappings":"AA4GA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAK1D,MAAM,WAAW,WAAW;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,qBAAa,WAAW;IACpB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,aAAa,CAAC,CAAgB;gBAE1B,IAAI,EAAE,WAAW;IAsB7B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE;IAK7E,MAAM,CAAC,KAAK,EAAE,MAAM;IAKd,mBAAmB,CAAC,OAAO,EAAE,MAAM;IAezC,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,IAIpB,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY;CA2D9D"}
@@ -88,7 +88,8 @@ exports.AuthManager = void 0;
88
88
  const JWTAdapter_js_1 = require("../adapters/JWTAdapter.js");
89
89
  const GoogleAdapter_js_1 = require("../adapters/GoogleAdapter.js");
90
90
  const AdapterError_js_1 = require("../core/errors/AdapterError.js");
91
- const HttpErrror_js_1 = require("../core/errors/HttpErrror.js");
91
+ const HttpError_js_1 = require("../core/errors/HttpError.js");
92
+ // import { logError, logWarn, logInfo } from "../logging";
92
93
  const logging_1 = require("../logging");
93
94
  class AuthManager {
94
95
  constructor(opts) {
@@ -96,37 +97,37 @@ class AuthManager {
96
97
  throw new AdapterError_js_1.AdapterError("jwtSecret required in AuthOptions");
97
98
  }
98
99
  if (opts.jwtSecret.length < 32) {
99
- (0, logging_1.logWarn)("⚠ JWT secret is less than 32 characters - consider using a stronger secret");
100
+ logging_1.logger.warn("⚠ JWT secret is less than 32 characters - consider using a stronger secret");
100
101
  }
101
- (0, logging_1.logInfo)("AuthManager initialized");
102
+ logging_1.logger.info("AuthManager initialized");
102
103
  this.jwtAdapter = new JWTAdapter_js_1.JWTAdapter({
103
104
  secret: opts.jwtSecret,
104
105
  expiresIn: opts.jwtExpiresIn ?? "1d",
105
106
  });
106
107
  if (opts.googleClientId) {
107
108
  this.googleAdapter = new GoogleAdapter_js_1.GoogleAdapter(opts.googleClientId);
108
- (0, logging_1.logInfo)("GoogleAdapter enabled");
109
+ logging_1.logger.info("GoogleAdapter enabled");
109
110
  }
110
111
  }
111
112
  sign(payload, options) {
112
- (0, logging_1.logInfo)("JWT Sign called");
113
+ logging_1.logger.info("JWT Sign called");
113
114
  return this.jwtAdapter.sign(payload, options);
114
115
  }
115
116
  verify(token) {
116
- (0, logging_1.logInfo)("JWT Verify called");
117
+ logging_1.logger.info("JWT Verify called");
117
118
  return this.jwtAdapter.verify(token);
118
119
  }
119
120
  async verifyGoogleIdToken(idToken) {
120
121
  if (!this.googleAdapter) {
121
122
  throw new AdapterError_js_1.AdapterError("GoogleAdapter not configured.");
122
123
  }
123
- (0, logging_1.logInfo)("Google ID Token verify called");
124
+ logging_1.logger.info("Google ID Token verify called");
124
125
  try {
125
126
  return await this.googleAdapter.verifyIdToken(idToken);
126
127
  }
127
128
  catch (err) {
128
- (0, logging_1.logError)("Google ID Token verification failed", { error: err?.message });
129
- throw HttpErrror_js_1.HttpError.Unauthorized("Invalid Google ID token");
129
+ logging_1.logger.error("Google ID Token verification failed", { error: err?.message });
130
+ throw HttpError_js_1.HttpError.Unauthorized("Invalid Google ID token");
130
131
  }
131
132
  }
132
133
  protect(options) {
@@ -140,20 +141,20 @@ class AuthManager {
140
141
  }
141
142
  // If auth is required but no header
142
143
  if (!header) {
143
- (0, logging_1.logWarn)("Missing Authorization header", {
144
+ logging_1.logger.warn("Missing Authorization header", {
144
145
  path: req.path,
145
146
  method: req.method
146
147
  });
147
- return next(HttpErrror_js_1.HttpError.Unauthorized("Missing Authorization header"));
148
+ return next(HttpError_js_1.HttpError.Unauthorized("Missing Authorization header"));
148
149
  }
149
150
  // Parse Bearer token
150
151
  const [type, token] = String(header).split(" ");
151
152
  if (type !== "Bearer" || !token) {
152
- (0, logging_1.logWarn)("Invalid Authorization header", {
153
+ logging_1.logger.warn("Invalid Authorization header", {
153
154
  path: req.path,
154
155
  method: req.method
155
156
  });
156
- return next(HttpErrror_js_1.HttpError.Unauthorized("Invalid Authorization header"));
157
+ return next(HttpError_js_1.HttpError.Unauthorized("Invalid Authorization header"));
157
158
  }
158
159
  try {
159
160
  // Verify JWT
@@ -165,23 +166,23 @@ class AuthManager {
165
166
  if (roles && roles.length > 0) {
166
167
  const userRole = decoded.role || decoded.roles?.[0];
167
168
  if (!userRole || !roles.includes(userRole)) {
168
- (0, logging_1.logWarn)("Insufficient permissions", {
169
+ logging_1.logger.warn("Insufficient permissions", {
169
170
  path: req.path,
170
171
  requiredRoles: roles,
171
172
  userRole
172
173
  });
173
- return next(HttpErrror_js_1.HttpError.Forbidden("Insufficient permissions"));
174
+ return next(HttpError_js_1.HttpError.Forbidden("Insufficient permissions"));
174
175
  }
175
176
  }
176
177
  return next();
177
178
  }
178
179
  catch (err) {
179
- (0, logging_1.logError)("JWT verify failed", {
180
+ logging_1.logger.error("JWT verify failed", {
180
181
  error: err?.message,
181
182
  path: req.path,
182
183
  method: req.method
183
184
  });
184
- return next(HttpErrror_js_1.HttpError.Unauthorized("Invalid or expired token"));
185
+ return next(HttpError_js_1.HttpError.Unauthorized("Invalid or expired token"));
185
186
  }
186
187
  };
187
188
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AuthManager.js","sourceRoot":"","sources":["../../src/managers/AuthManager.ts"],"names":[],"mappings":"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","sourcesContent":["// import { JWTAdapter } from \"../adapters/JWTAdapter.js\";\r\n// import { GoogleAdapter } from \"../adapters/GoggleAdapter.js\";\r\n// import { AdapterError } from \"../core/errors/AdapterError.js\";\r\n// import { HttpError } from \"../core/errors/HttpErrror.js\";\r\n// import { Request, Response, NextFunction } from \"express\";\r\n// import { logError, logWarn, logInfo } from \"../logging\";\r\n\r\n// export interface AuthOptions {\r\n// jwtSecret: string;\r\n// jwtExpiresIn?: string | number | undefined;\r\n// googleClientId?: string | undefined;\r\n// }\r\n\r\n// export class AuthManager {\r\n// private jwtAdapter: JWTAdapter;\r\n// private googleAdapter?: GoogleAdapter;\r\n\r\n// constructor(opts: AuthOptions) {\r\n// if (!opts.jwtSecret)\r\n// throw new AdapterError(\"jwtSecret required in AuthOptions\");\r\n\r\n// logInfo(\"AuthManager initialized\");\r\n\r\n// this.jwtAdapter = new JWTAdapter({\r\n// secret: opts.jwtSecret,\r\n// expiresIn: opts.jwtExpiresIn ?? undefined,\r\n// });\r\n\r\n// if (opts.googleClientId) {\r\n// this.googleAdapter = new GoogleAdapter(opts.googleClientId);\r\n// logInfo(\"GoogleAdapter enabled\");\r\n// }\r\n// }\r\n\r\n// sign(payload: object, options?: { expiresIn?: string | number }) {\r\n// logInfo(\"JWT Sign called\");\r\n// return this.jwtAdapter.sign(payload, options);\r\n// }\r\n\r\n// verify(token: string) {\r\n// logInfo(\"JWT Verify called\");\r\n// return this.jwtAdapter.verify(token);\r\n// }\r\n\r\n// async verifyGoogleIdToken(idToken: string) {\r\n// if (!this.googleAdapter)\r\n// throw new AdapterError(\"GoogleAdapter not configured.\");\r\n\r\n// logInfo(\"Google ID Token verify called\");\r\n\r\n// try {\r\n// return await this.googleAdapter.verifyIdToken(idToken);\r\n// } catch (err: any) {\r\n// logError(\"Google ID Token verification failed\", { error: err?.message });\r\n// throw HttpError.Unauthorized(\"Invalid Google ID token\");\r\n// }\r\n// }\r\n\r\n// protect(options?: { required?: boolean }) {\r\n// const required = options?.required ?? true;\r\n\r\n// return (req: Request, res: Response, next: NextFunction) => {\r\n// const header = req.headers[\"authorization\"] || req.headers[\"Authorization\"];\r\n\r\n// if (!header) {\r\n// if (required) {\r\n// logWarn(\"Missing Authorization header\", {\r\n// path: req.path,\r\n// method: req.method\r\n// });\r\n// return next(HttpError.Unauthorized(\"Missing Authorization header\"));\r\n// }\r\n// return next();\r\n// }\r\n\r\n// const [type, token] = String(header).split(\" \");\r\n\r\n// if (type !== \"Bearer\" || !token) {\r\n// logWarn(\"Invalid Authorization header\", {\r\n// path: req.path,\r\n// method: req.method\r\n// });\r\n// return next(HttpError.Unauthorized(\"Invalid Authorization header\"));\r\n// }\r\n\r\n// try {\r\n// const decoded = this.verify(token);\r\n// (req as any).auth = decoded;\r\n// return next();\r\n// } catch (err: any) {\r\n// logError(\"JWT verify failed\", {\r\n// error: err?.message,\r\n// path: req.path,\r\n// method: req.method\r\n// });\r\n// return next(HttpError.Unauthorized(\"Invalid or expired token\"));\r\n// }\r\n// };\r\n// }\r\n// }\r\n\r\n\r\n\r\n// src/managers/AuthManager.ts - FIXED\r\nimport { JWTAdapter } from \"../adapters/JWTAdapter.js\";\r\nimport { GoogleAdapter } from \"../adapters/GoogleAdapter.js\";\r\nimport { AdapterError } from \"../core/errors/AdapterError.js\";\r\nimport { HttpError } from \"../core/errors/HttpErrror.js\";\r\nimport { Request, Response, NextFunction } from \"express\";\r\nimport { logError, logWarn, logInfo } from \"../logging\";\r\n\r\nexport interface AuthOptions {\r\n jwtSecret: string;\r\n jwtExpiresIn?: string | number;\r\n googleClientId?: string;\r\n}\r\n\r\nexport interface ProtectOptions {\r\n required?: boolean;\r\n roles?: string[];\r\n}\r\n\r\nexport class AuthManager {\r\n private jwtAdapter: JWTAdapter;\r\n private googleAdapter?: GoogleAdapter;\r\n\r\n constructor(opts: AuthOptions) {\r\n if (!opts.jwtSecret) {\r\n throw new AdapterError(\"jwtSecret required in AuthOptions\");\r\n }\r\n\r\n if (opts.jwtSecret.length < 32) {\r\n logWarn(\"⚠ JWT secret is less than 32 characters - consider using a stronger secret\");\r\n }\r\n\r\n logInfo(\"AuthManager initialized\");\r\n\r\n this.jwtAdapter = new JWTAdapter({\r\n secret: opts.jwtSecret,\r\n expiresIn: opts.jwtExpiresIn ?? \"1d\",\r\n });\r\n\r\n if (opts.googleClientId) {\r\n this.googleAdapter = new GoogleAdapter(opts.googleClientId);\r\n logInfo(\"GoogleAdapter enabled\");\r\n }\r\n }\r\n\r\n sign(payload: object, options?: { expiresIn?: string | number, jti?: string }) {\r\n logInfo(\"JWT Sign called\");\r\n return this.jwtAdapter.sign(payload, options);\r\n }\r\n\r\n verify(token: string) {\r\n logInfo(\"JWT Verify called\");\r\n return this.jwtAdapter.verify(token);\r\n }\r\n\r\n async verifyGoogleIdToken(idToken: string) {\r\n if (!this.googleAdapter) {\r\n throw new AdapterError(\"GoogleAdapter not configured.\");\r\n }\r\n\r\n logInfo(\"Google ID Token verify called\");\r\n\r\n try {\r\n return await this.googleAdapter.verifyIdToken(idToken);\r\n } catch (err: any) {\r\n logError(\"Google ID Token verification failed\", { error: err?.message });\r\n throw HttpError.Unauthorized(\"Invalid Google ID token\");\r\n }\r\n }\r\n\r\n protect(options?: ProtectOptions) {\r\n const required = options?.required ?? true;\r\n const roles = options?.roles;\r\n\r\n return (req: Request, res: Response, next: NextFunction) => {\r\n const header = req.headers[\"authorization\"];\r\n\r\n // If auth is not required, skip authentication\r\n if (!required && !header) {\r\n return next();\r\n }\r\n\r\n // If auth is required but no header\r\n if (!header) {\r\n logWarn(\"Missing Authorization header\", {\r\n path: req.path,\r\n method: req.method\r\n });\r\n return next(HttpError.Unauthorized(\"Missing Authorization header\"));\r\n }\r\n\r\n // Parse Bearer token\r\n const [type, token] = String(header).split(\" \");\r\n if (type !== \"Bearer\" || !token) {\r\n logWarn(\"Invalid Authorization header\", {\r\n path: req.path,\r\n method: req.method\r\n });\r\n return next(HttpError.Unauthorized(\"Invalid Authorization header\"));\r\n }\r\n\r\n try {\r\n // Verify JWT\r\n const decoded = this.verify(token);\r\n \r\n // Attach to request\r\n (req as any).auth = decoded;\r\n (req as any).user = decoded; // Common pattern\r\n \r\n // Role-based authorization\r\n if (roles && roles.length > 0) {\r\n const userRole = (decoded as any).role || (decoded as any).roles?.[0];\r\n if (!userRole || !roles.includes(userRole)) {\r\n logWarn(\"Insufficient permissions\", {\r\n path: req.path,\r\n requiredRoles: roles,\r\n userRole\r\n });\r\n return next(HttpError.Forbidden(\"Insufficient permissions\"));\r\n }\r\n }\r\n \r\n return next();\r\n } catch (err: any) {\r\n logError(\"JWT verify failed\", {\r\n error: err?.message,\r\n path: req.path,\r\n method: req.method\r\n });\r\n return next(HttpError.Unauthorized(\"Invalid or expired token\"));\r\n }\r\n };\r\n }\r\n}"]}
1
+ {"version":3,"file":"AuthManager.js","sourceRoot":"","sources":["../../src/managers/AuthManager.ts"],"names":[],"mappings":"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","sourcesContent":["// import { JWTAdapter } from \"../adapters/JWTAdapter.js\";\r\n// import { GoogleAdapter } from \"../adapters/GoggleAdapter.js\";\r\n// import { AdapterError } from \"../core/errors/AdapterError.js\";\r\n// import { HttpError } from \"../core/errors/HttpErrror.js\";\r\n// import { Request, Response, NextFunction } from \"express\";\r\n// import { logError, logWarn, logInfo } from \"../logging\";\r\n\r\n// export interface AuthOptions {\r\n// jwtSecret: string;\r\n// jwtExpiresIn?: string | number | undefined;\r\n// googleClientId?: string | undefined;\r\n// }\r\n\r\n// export class AuthManager {\r\n// private jwtAdapter: JWTAdapter;\r\n// private googleAdapter?: GoogleAdapter;\r\n\r\n// constructor(opts: AuthOptions) {\r\n// if (!opts.jwtSecret)\r\n// throw new AdapterError(\"jwtSecret required in AuthOptions\");\r\n\r\n// logInfo(\"AuthManager initialized\");\r\n\r\n// this.jwtAdapter = new JWTAdapter({\r\n// secret: opts.jwtSecret,\r\n// expiresIn: opts.jwtExpiresIn ?? undefined,\r\n// });\r\n\r\n// if (opts.googleClientId) {\r\n// this.googleAdapter = new GoogleAdapter(opts.googleClientId);\r\n// logInfo(\"GoogleAdapter enabled\");\r\n// }\r\n// }\r\n\r\n// sign(payload: object, options?: { expiresIn?: string | number }) {\r\n// logInfo(\"JWT Sign called\");\r\n// return this.jwtAdapter.sign(payload, options);\r\n// }\r\n\r\n// verify(token: string) {\r\n// logInfo(\"JWT Verify called\");\r\n// return this.jwtAdapter.verify(token);\r\n// }\r\n\r\n// async verifyGoogleIdToken(idToken: string) {\r\n// if (!this.googleAdapter)\r\n// throw new AdapterError(\"GoogleAdapter not configured.\");\r\n\r\n// logInfo(\"Google ID Token verify called\");\r\n\r\n// try {\r\n// return await this.googleAdapter.verifyIdToken(idToken);\r\n// } catch (err: any) {\r\n// logError(\"Google ID Token verification failed\", { error: err?.message });\r\n// throw HttpError.Unauthorized(\"Invalid Google ID token\");\r\n// }\r\n// }\r\n\r\n// protect(options?: { required?: boolean }) {\r\n// const required = options?.required ?? true;\r\n\r\n// return (req: Request, res: Response, next: NextFunction) => {\r\n// const header = req.headers[\"authorization\"] || req.headers[\"Authorization\"];\r\n\r\n// if (!header) {\r\n// if (required) {\r\n// logWarn(\"Missing Authorization header\", {\r\n// path: req.path,\r\n// method: req.method\r\n// });\r\n// return next(HttpError.Unauthorized(\"Missing Authorization header\"));\r\n// }\r\n// return next();\r\n// }\r\n\r\n// const [type, token] = String(header).split(\" \");\r\n\r\n// if (type !== \"Bearer\" || !token) {\r\n// logWarn(\"Invalid Authorization header\", {\r\n// path: req.path,\r\n// method: req.method\r\n// });\r\n// return next(HttpError.Unauthorized(\"Invalid Authorization header\"));\r\n// }\r\n\r\n// try {\r\n// const decoded = this.verify(token);\r\n// (req as any).auth = decoded;\r\n// return next();\r\n// } catch (err: any) {\r\n// logError(\"JWT verify failed\", {\r\n// error: err?.message,\r\n// path: req.path,\r\n// method: req.method\r\n// });\r\n// return next(HttpError.Unauthorized(\"Invalid or expired token\"));\r\n// }\r\n// };\r\n// }\r\n// }\r\n\r\n\r\n\r\n// src/managers/AuthManager.ts - FIXED\r\nimport { JWTAdapter } from \"../adapters/JWTAdapter.js\";\r\nimport { GoogleAdapter } from \"../adapters/GoogleAdapter.js\";\r\nimport { AdapterError } from \"../core/errors/AdapterError.js\";\r\nimport { HttpError } from \"../core/errors/HttpError.js\";\r\nimport { Request, Response, NextFunction } from \"express\";\r\n// import { logError, logWarn, logInfo } from \"../logging\";\r\nimport { logger } from \"../logging\";\r\n\r\n\r\nexport interface AuthOptions {\r\n jwtSecret: string;\r\n jwtExpiresIn?: string | number;\r\n googleClientId?: string;\r\n}\r\n\r\nexport interface ProtectOptions {\r\n required?: boolean;\r\n roles?: string[];\r\n}\r\n\r\nexport class AuthManager {\r\n private jwtAdapter: JWTAdapter;\r\n private googleAdapter?: GoogleAdapter;\r\n\r\n constructor(opts: AuthOptions) {\r\n if (!opts.jwtSecret) {\r\n throw new AdapterError(\"jwtSecret required in AuthOptions\");\r\n }\r\n\r\n if (opts.jwtSecret.length < 32) {\r\n logger.warn(\"⚠ JWT secret is less than 32 characters - consider using a stronger secret\");\r\n }\r\n\r\n logger.info(\"AuthManager initialized\");\r\n\r\n this.jwtAdapter = new JWTAdapter({\r\n secret: opts.jwtSecret,\r\n expiresIn: opts.jwtExpiresIn ?? \"1d\",\r\n });\r\n\r\n if (opts.googleClientId) {\r\n this.googleAdapter = new GoogleAdapter(opts.googleClientId);\r\n logger.info(\"GoogleAdapter enabled\");\r\n }\r\n }\r\n\r\n sign(payload: object, options?: { expiresIn?: string | number, jti?: string }) {\r\n logger.info(\"JWT Sign called\");\r\n return this.jwtAdapter.sign(payload, options);\r\n }\r\n\r\n verify(token: string) {\r\n logger.info(\"JWT Verify called\");\r\n return this.jwtAdapter.verify(token);\r\n }\r\n\r\n async verifyGoogleIdToken(idToken: string) {\r\n if (!this.googleAdapter) {\r\n throw new AdapterError(\"GoogleAdapter not configured.\");\r\n }\r\n\r\n logger.info(\"Google ID Token verify called\");\r\n\r\n try {\r\n return await this.googleAdapter.verifyIdToken(idToken);\r\n } catch (err: any) {\r\n logger.error(\"Google ID Token verification failed\", { error: err?.message });\r\n throw HttpError.Unauthorized(\"Invalid Google ID token\");\r\n }\r\n }\r\n\r\n protect(options?: ProtectOptions) {\r\n const required = options?.required ?? true;\r\n const roles = options?.roles;\r\n\r\n return (req: Request, res: Response, next: NextFunction) => {\r\n const header = req.headers[\"authorization\"];\r\n\r\n // If auth is not required, skip authentication\r\n if (!required && !header) {\r\n return next();\r\n }\r\n\r\n // If auth is required but no header\r\n if (!header) {\r\n logger.warn(\"Missing Authorization header\", {\r\n path: req.path,\r\n method: req.method\r\n });\r\n return next(HttpError.Unauthorized(\"Missing Authorization header\"));\r\n }\r\n\r\n // Parse Bearer token\r\n const [type, token] = String(header).split(\" \");\r\n if (type !== \"Bearer\" || !token) {\r\n logger.warn(\"Invalid Authorization header\", {\r\n path: req.path,\r\n method: req.method\r\n });\r\n return next(HttpError.Unauthorized(\"Invalid Authorization header\"));\r\n }\r\n\r\n try {\r\n // Verify JWT\r\n const decoded = this.verify(token);\r\n \r\n // Attach to request\r\n (req as any).auth = decoded;\r\n (req as any).user = decoded; // Common pattern\r\n \r\n // Role-based authorization\r\n if (roles && roles.length > 0) {\r\n const userRole = (decoded as any).role || (decoded as any).roles?.[0];\r\n if (!userRole || !roles.includes(userRole)) {\r\n logger.warn(\"Insufficient permissions\", {\r\n path: req.path,\r\n requiredRoles: roles,\r\n userRole\r\n });\r\n return next(HttpError.Forbidden(\"Insufficient permissions\"));\r\n }\r\n }\r\n \r\n return next();\r\n } catch (err: any) {\r\n logger.error(\"JWT verify failed\", {\r\n error: err?.message,\r\n path: req.path,\r\n method: req.method\r\n });\r\n return next(HttpError.Unauthorized(\"Invalid or expired token\"));\r\n }\r\n };\r\n }\r\n}"]}
@@ -1,13 +1,11 @@
1
- import { HiSecureConfig } from "../core/types/HiSecureConfig.js";
2
1
  interface ValidatorAdapter {
3
2
  validate: (schema?: any) => any;
4
3
  }
5
4
  export declare class ValidatorManager {
6
- private config;
7
- private primaryAdapter;
8
- private fallbackAdapter;
9
- constructor(config: HiSecureConfig["validation"], primaryAdapter: ValidatorAdapter, fallbackAdapter: ValidatorAdapter | null);
10
- validate(schema?: any): (req: any, res: any, next: any) => void;
5
+ private zodAdapter;
6
+ private expressAdapter;
7
+ constructor(zodAdapter: ValidatorAdapter, expressAdapter: ValidatorAdapter);
8
+ validate(schema?: any): (req: any, res: any, next: any) => any;
11
9
  }
12
10
  export {};
13
11
  //# sourceMappingURL=ValidatorManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ValidatorManager.d.ts","sourceRoot":"","sources":["../../src/managers/ValidatorManager.ts"],"names":[],"mappings":"AAyMA,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,UAAU,gBAAgB;IACtB,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC;CACnC;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,cAAc,CAAmB;IACzC,OAAO,CAAC,eAAe,CAA0B;gBAG7C,MAAM,EAAE,cAAc,CAAC,YAAY,CAAC,EACpC,cAAc,EAAE,gBAAgB,EAChC,eAAe,EAAE,gBAAgB,GAAG,IAAI;IAO5C,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,IACT,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG;CA6C5C"}
1
+ {"version":3,"file":"ValidatorManager.d.ts","sourceRoot":"","sources":["../../src/managers/ValidatorManager.ts"],"names":[],"mappings":"AAwIA,UAAU,gBAAgB;IACtB,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC;CACnC;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,cAAc,CAAmB;gBAE7B,UAAU,EAAE,gBAAgB,EAAE,cAAc,EAAE,gBAAgB;IAK1E,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,IAUT,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG;CA8C5C"}
@@ -1,110 +1,10 @@
1
1
  "use strict";
2
- // // // import { HiSecureConfig } from "../core/config";
3
- // // // import { logger } from "../logging";
4
- // // // import { ValidationError } from "../core/errors/ValidationError";
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.ValidatorManager = void 0;
7
- // // // export class ValidatorManager {
8
- // // // private config: HiSecureConfig["validation"];
9
- // // // private primaryAdapter: any;
10
- // // // private fallbackAdapter: any;
11
- // // // constructor(
12
- // // // config: HiSecureConfig["validation"],
13
- // // // primaryAdapter: any,
14
- // // // fallbackAdapter: any
15
- // // // ) {
16
- // // // this.config = config;
17
- // // // this.primaryAdapter = primaryAdapter;
18
- // // // this.fallbackAdapter = fallbackAdapter;
19
- // // // }
20
- // // // /**
21
- // // // * Validate request body using primary adapter (Zod/express-validator).
22
- // // // * Fallback is only used if the adapter implementation itself throws.
23
- // // // */
24
- // // // validate(schema: any) {
25
- // // // return (req: any, res: any, next: any) => {
26
- // // // try {
27
- // // // const middleware = this.primaryAdapter.validate(schema);
28
- // // // return middleware(req, res, next);
29
- // // // } catch (err: any) {
30
- // // // logger.warn("⚠ Primary validator failed", {
31
- // // // error: err?.message,
32
- // // // path: req.path,
33
- // // // method: req.method
34
- // // // });
35
- // // // if (!this.fallbackAdapter) {
36
- // // // return next(new ValidationError("Validation failed."));
37
- // // // }
38
- // // // try {
39
- // // // logger.info("📌 Using fallback validator");
40
- // // // const fallbackMiddleware = this.fallbackAdapter.validate(schema);
41
- // // // return fallbackMiddleware(req, res, next);
42
- // // // } catch (fallbackErr: any) {
43
- // // // logger.error("❌ Fallback validation also failed", {
44
- // // // error: fallbackErr?.message
45
- // // // });
46
- // // // return next(new ValidationError("Both validators failed."));
47
- // // // }
48
- // // // }
49
- // // // };
50
- // // // }
51
- // // // }
52
- // // import { HiSecureConfig } from "../core/config.js";
53
- // // import { logger } from "../logging";
54
- // // import { ValidationError } from "../core/errors/ValidationError.js";
55
- // // interface ValidatorAdapter {
56
- // // validate: (schema?: any) => any;
57
- // // }
58
- // // export class ValidatorManager {
59
- // // private config: HiSecureConfig["validation"];
60
- // // private primaryAdapter: ValidatorAdapter;
61
- // // private fallbackAdapter: ValidatorAdapter | null;
62
- // // constructor(
63
- // // config: HiSecureConfig["validation"],
64
- // // primaryAdapter: ValidatorAdapter,
65
- // // fallbackAdapter: ValidatorAdapter | null
66
- // // ) {
67
- // // this.config = config;
68
- // // this.primaryAdapter = primaryAdapter;
69
- // // this.fallbackAdapter = fallbackAdapter;
70
- // // }
71
- // // /**
72
- // // * MAIN DYNAMIC VALIDATOR ENTRY
73
- // // * schema = per-route schema
74
- // // * If schema is undefined → use global schema
75
- // // */
76
- // // validate(schema?: any) {
77
- // // return (req: any, res: any, next: any) => {
78
- // // try {
79
- // // const middleware = this.primaryAdapter.validate(schema);
80
- // // return middleware(req, res, next);
81
- // // } catch (err: any) {
82
- // // logger.warn("⚠ Primary validator failed", {
83
- // // error: err?.message,
84
- // // path: req.path,
85
- // // method: req.method
86
- // // });
87
- // // if (!this.fallbackAdapter) {
88
- // // return next(new ValidationError("Validation failed"));
89
- // // }
90
- // // try {
91
- // // logger.info("📌 Using fallback validator");
92
- // // const fallbackMiddleware = this.fallbackAdapter.validate(schema);
93
- // // return fallbackMiddleware(req, res, next);
94
- // // } catch (fallbackErr: any) {
95
- // // logger.error("❌ Fallback validator also failed", {
96
- // // error: fallbackErr?.message
97
- // // });
98
- // // return next(new ValidationError("Both validators failed"));
99
- // // }
100
- // // }
101
- // // };
102
- // // }
103
- // // }
104
- // // src/managers/ValidatorManager.ts - FIXED
2
+ // // src/managers/ValidatorManager.ts - COMPLETE FIXED
105
3
  // import { logger } from "../logging";
106
4
  // import { ValidationError } from "../core/errors/ValidationError.js";
107
- // import { HiSecureConfig } from "../core/types/HiSecureConfig";
5
+ // import { HiSecureConfig } from "../core/types/HiSecureConfig.js"; // ✅ FIXED IMPORT
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ValidatorManager = void 0;
108
8
  // interface ValidatorAdapter {
109
9
  // validate: (schema?: any) => any;
110
10
  // }
@@ -163,54 +63,107 @@ exports.ValidatorManager = void 0;
163
63
  // };
164
64
  // }
165
65
  // }
166
- // src/managers/ValidatorManager.ts - COMPLETE FIXED
66
+ // // src/managers/ValidatorManager.ts
67
+ // import { logger } from "../logging";
68
+ // import { ValidationError } from "../core/errors/ValidationError.js";
69
+ // interface ValidatorAdapter {
70
+ // validate: (schema?: any) => any;
71
+ // }
72
+ // export class ValidatorManager {
73
+ // private primaryAdapter: ValidatorAdapter;
74
+ // private fallbackAdapter: ValidatorAdapter | null;
75
+ // constructor(primaryAdapter: ValidatorAdapter, fallbackAdapter: ValidatorAdapter | null) {
76
+ // this.primaryAdapter = primaryAdapter;
77
+ // this.fallbackAdapter = fallbackAdapter;
78
+ // }
79
+ // validate(schema?: any) {
80
+ // return (req: any, res: any, next: any) => {
81
+ // const isZod = schema && typeof schema === "object" && typeof schema.safeParse === "function";
82
+ // const isExpressValidator = Array.isArray(schema);
83
+ // let adapter: ValidatorAdapter;
84
+ // if (isZod) {
85
+ // adapter = this.primaryAdapter; // ZodAdapter
86
+ // logger.debug("📌 Using Zod adapter for validation");
87
+ // }
88
+ // else if (isExpressValidator) {
89
+ // adapter = this.fallbackAdapter!; // ExpressValidatorAdapter
90
+ // logger.debug("📌 Using express-validator adapter for validation");
91
+ // }
92
+ // else {
93
+ // return next(); // nothing to validate
94
+ // }
95
+ // const middleware = adapter.validate(schema);
96
+ // // Execute validation chain
97
+ // middleware(req, res, (err?: any) => {
98
+ // if (err instanceof ValidationError) {
99
+ // return next(err);
100
+ // }
101
+ // if (err) {
102
+ // logger.error("❌ Validator internal error", { error: err.message });
103
+ // return next(new ValidationError("Validation failed internally."));
104
+ // }
105
+ // next();
106
+ // });
107
+ // };
108
+ // }
109
+ // }
110
+ // src/managers/ValidatorManager.ts
167
111
  const logging_1 = require("../logging");
168
112
  const ValidationError_js_1 = require("../core/errors/ValidationError.js");
169
113
  class ValidatorManager {
170
- constructor(config, primaryAdapter, fallbackAdapter) {
171
- this.config = config;
172
- this.primaryAdapter = primaryAdapter;
173
- this.fallbackAdapter = fallbackAdapter;
114
+ constructor(zodAdapter, expressAdapter) {
115
+ this.zodAdapter = zodAdapter;
116
+ this.expressAdapter = expressAdapter;
174
117
  }
175
118
  validate(schema) {
119
+ // const isZod = schema && typeof schema.safeParse === "function";
120
+ const isZod = schema &&
121
+ typeof schema === "object" &&
122
+ typeof schema._def === "object" &&
123
+ typeof schema.safeParse === "function";
124
+ const isExpressValidator = Array.isArray(schema);
176
125
  return (req, res, next) => {
177
- // Execute primary adapter middleware
178
- const primaryMiddleware = this.primaryAdapter.validate(schema);
179
- // Run middleware and handle errors properly
180
- primaryMiddleware(req, res, (err) => {
181
- if (!err) {
182
- return next(); // Validation passed
183
- }
184
- // If error is a ValidationError, pass it through (don't fallback!)
185
- if (err instanceof ValidationError_js_1.ValidationError) {
186
- logging_1.logger.warn("⚠ Validation failed", {
187
- path: req.path,
188
- method: req.method,
189
- error: err.message
190
- });
191
- return next(err);
192
- }
193
- // Only use fallback for ADAPTER errors, not validation errors
194
- logging_1.logger.warn("⚠ Primary validator adapter failed", {
195
- error: err?.message,
196
- path: req.path,
197
- method: req.method
198
- });
199
- if (!this.fallbackAdapter) {
200
- return next(new ValidationError_js_1.ValidationError("Validation system error"));
201
- }
202
- // Try fallback adapter
203
- const fallbackMiddleware = this.fallbackAdapter.validate(schema);
204
- fallbackMiddleware(req, res, (fallbackErr) => {
205
- if (fallbackErr) {
206
- logging_1.logger.error("❌ Fallback validator also failed", {
207
- error: fallbackErr?.message
208
- });
209
- return next(new ValidationError_js_1.ValidationError("Validation system unavailable"));
126
+ let middleware;
127
+ if (isZod) {
128
+ logging_1.logger.debug("📌 Using Zod adapter");
129
+ middleware = this.zodAdapter.validate(schema);
130
+ }
131
+ else if (isExpressValidator) {
132
+ logging_1.logger.debug("📌 Using express-validator adapter");
133
+ middleware = this.expressAdapter.validate(schema);
134
+ }
135
+ else {
136
+ return next(); // no schema found
137
+ }
138
+ // CASE 1 — express-validator returns ARRAY
139
+ if (Array.isArray(middleware)) {
140
+ let idx = 0;
141
+ const run = (err) => {
142
+ if (err)
143
+ return next(err);
144
+ const fn = middleware[idx++];
145
+ if (!fn)
146
+ return next(); // done
147
+ try {
148
+ fn(req, res, run);
149
+ }
150
+ catch (error) {
151
+ next(new ValidationError_js_1.ValidationError(error.message));
210
152
  }
211
- next(); // Fallback validation passed
153
+ };
154
+ return run();
155
+ }
156
+ // CASE 2 — Zod returns SINGLE MIDDLEWARE
157
+ try {
158
+ middleware(req, res, (err) => {
159
+ if (err)
160
+ return next(err);
161
+ next();
212
162
  });
213
- });
163
+ }
164
+ catch (err) {
165
+ next(new ValidationError_js_1.ValidationError(err.message));
166
+ }
214
167
  };
215
168
  }
216
169
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ValidatorManager.js","sourceRoot":"","sources":["../../src/managers/ValidatorManager.ts"],"names":[],"mappings":"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","sourcesContent":["// // // import { HiSecureConfig } from \"../core/config\";\r\n// // // import { logger } from \"../logging\";\r\n// // // import { ValidationError } from \"../core/errors/ValidationError\";\r\n\r\n// // // export class ValidatorManager {\r\n// // // private config: HiSecureConfig[\"validation\"];\r\n// // // private primaryAdapter: any;\r\n// // // private fallbackAdapter: any;\r\n\r\n// // // constructor(\r\n// // // config: HiSecureConfig[\"validation\"],\r\n// // // primaryAdapter: any,\r\n// // // fallbackAdapter: any\r\n// // // ) {\r\n// // // this.config = config;\r\n// // // this.primaryAdapter = primaryAdapter;\r\n// // // this.fallbackAdapter = fallbackAdapter;\r\n// // // }\r\n\r\n// // // /**\r\n// // // * Validate request body using primary adapter (Zod/express-validator).\r\n// // // * Fallback is only used if the adapter implementation itself throws.\r\n// // // */\r\n// // // validate(schema: any) {\r\n// // // return (req: any, res: any, next: any) => {\r\n// // // try {\r\n// // // const middleware = this.primaryAdapter.validate(schema);\r\n// // // return middleware(req, res, next);\r\n\r\n// // // } catch (err: any) {\r\n// // // logger.warn(\"⚠ Primary validator failed\", {\r\n// // // error: err?.message,\r\n// // // path: req.path,\r\n// // // method: req.method\r\n// // // });\r\n\r\n// // // if (!this.fallbackAdapter) {\r\n// // // return next(new ValidationError(\"Validation failed.\"));\r\n// // // }\r\n\r\n// // // try {\r\n// // // logger.info(\"📌 Using fallback validator\");\r\n// // // const fallbackMiddleware = this.fallbackAdapter.validate(schema);\r\n// // // return fallbackMiddleware(req, res, next);\r\n\r\n// // // } catch (fallbackErr: any) {\r\n// // // logger.error(\"❌ Fallback validation also failed\", {\r\n// // // error: fallbackErr?.message\r\n// // // });\r\n\r\n// // // return next(new ValidationError(\"Both validators failed.\"));\r\n// // // }\r\n// // // }\r\n// // // };\r\n// // // }\r\n// // // }\r\n\r\n\r\n\r\n// // import { HiSecureConfig } from \"../core/config.js\";\r\n// // import { logger } from \"../logging\";\r\n// // import { ValidationError } from \"../core/errors/ValidationError.js\";\r\n\r\n// // interface ValidatorAdapter {\r\n// // validate: (schema?: any) => any;\r\n// // }\r\n\r\n// // export class ValidatorManager {\r\n// // private config: HiSecureConfig[\"validation\"];\r\n// // private primaryAdapter: ValidatorAdapter;\r\n// // private fallbackAdapter: ValidatorAdapter | null;\r\n\r\n// // constructor(\r\n// // config: HiSecureConfig[\"validation\"],\r\n// // primaryAdapter: ValidatorAdapter,\r\n// // fallbackAdapter: ValidatorAdapter | null\r\n// // ) {\r\n// // this.config = config;\r\n// // this.primaryAdapter = primaryAdapter;\r\n// // this.fallbackAdapter = fallbackAdapter;\r\n// // }\r\n\r\n// // /**\r\n// // * MAIN DYNAMIC VALIDATOR ENTRY\r\n// // * schema = per-route schema\r\n// // * If schema is undefined → use global schema\r\n// // */\r\n// // validate(schema?: any) {\r\n// // return (req: any, res: any, next: any) => {\r\n// // try {\r\n// // const middleware = this.primaryAdapter.validate(schema);\r\n// // return middleware(req, res, next);\r\n\r\n// // } catch (err: any) {\r\n// // logger.warn(\"⚠ Primary validator failed\", {\r\n// // error: err?.message,\r\n// // path: req.path,\r\n// // method: req.method\r\n// // });\r\n\r\n// // if (!this.fallbackAdapter) {\r\n// // return next(new ValidationError(\"Validation failed\"));\r\n// // }\r\n\r\n// // try {\r\n// // logger.info(\"📌 Using fallback validator\");\r\n// // const fallbackMiddleware = this.fallbackAdapter.validate(schema);\r\n// // return fallbackMiddleware(req, res, next);\r\n\r\n// // } catch (fallbackErr: any) {\r\n// // logger.error(\"❌ Fallback validator also failed\", {\r\n// // error: fallbackErr?.message\r\n// // });\r\n\r\n// // return next(new ValidationError(\"Both validators failed\"));\r\n// // }\r\n// // }\r\n// // };\r\n// // }\r\n// // }\r\n\r\n\r\n\r\n\r\n\r\n// // src/managers/ValidatorManager.ts - FIXED\r\n// import { logger } from \"../logging\";\r\n// import { ValidationError } from \"../core/errors/ValidationError.js\";\r\n// import { HiSecureConfig } from \"../core/types/HiSecureConfig\";\r\n\r\n// interface ValidatorAdapter {\r\n// validate: (schema?: any) => any;\r\n// }\r\n\r\n// export class ValidatorManager {\r\n// private config: HiSecureConfig[\"validation\"];\r\n// private primaryAdapter: ValidatorAdapter;\r\n// private fallbackAdapter: ValidatorAdapter | null;\r\n\r\n// constructor(\r\n// config: HiSecureConfig[\"validation\"],\r\n// primaryAdapter: ValidatorAdapter,\r\n// fallbackAdapter: ValidatorAdapter | null\r\n// ) {\r\n// this.config = config;\r\n// this.primaryAdapter = primaryAdapter;\r\n// this.fallbackAdapter = fallbackAdapter;\r\n// }\r\n\r\n// validate(schema?: any) {\r\n// return (req: any, res: any, next: any) => {\r\n// // Execute primary adapter middleware\r\n// const primaryMiddleware = this.primaryAdapter.validate(schema);\r\n \r\n// // Run middleware and handle errors properly\r\n// primaryMiddleware(req, res, (err?: any) => {\r\n// if (!err) {\r\n// return next(); // Validation passed\r\n// }\r\n \r\n// // If error is a ValidationError, pass it through (don't fallback!)\r\n// if (err instanceof ValidationError) {\r\n// logger.warn(\"⚠ Validation failed\", {\r\n// path: req.path,\r\n// method: req.method,\r\n// error: err.message\r\n// });\r\n// return next(err);\r\n// }\r\n \r\n// // Only use fallback for ADAPTER errors, not validation errors\r\n// logger.warn(\"⚠ Primary validator adapter failed\", {\r\n// error: err?.message,\r\n// path: req.path,\r\n// method: req.method\r\n// });\r\n\r\n// if (!this.fallbackAdapter) {\r\n// return next(new ValidationError(\"Validation system error\"));\r\n// }\r\n\r\n// // Try fallback adapter\r\n// const fallbackMiddleware = this.fallbackAdapter.validate(schema);\r\n// fallbackMiddleware(req, res, (fallbackErr?: any) => {\r\n// if (fallbackErr) {\r\n// logger.error(\"❌ Fallback validator also failed\", {\r\n// error: fallbackErr?.message\r\n// });\r\n// return next(new ValidationError(\"Validation system unavailable\"));\r\n// }\r\n// next(); // Fallback validation passed\r\n// });\r\n// });\r\n// };\r\n// }\r\n// }\r\n\r\n\r\n// src/managers/ValidatorManager.ts - COMPLETE FIXED\r\nimport { logger } from \"../logging\";\r\nimport { ValidationError } from \"../core/errors/ValidationError.js\";\r\nimport { HiSecureConfig } from \"../core/types/HiSecureConfig.js\"; // ✅ FIXED IMPORT\r\n\r\ninterface ValidatorAdapter {\r\n validate: (schema?: any) => any;\r\n}\r\n\r\nexport class ValidatorManager {\r\n private config: HiSecureConfig[\"validation\"];\r\n private primaryAdapter: ValidatorAdapter;\r\n private fallbackAdapter: ValidatorAdapter | null;\r\n\r\n constructor(\r\n config: HiSecureConfig[\"validation\"],\r\n primaryAdapter: ValidatorAdapter,\r\n fallbackAdapter: ValidatorAdapter | null\r\n ) {\r\n this.config = config;\r\n this.primaryAdapter = primaryAdapter;\r\n this.fallbackAdapter = fallbackAdapter;\r\n }\r\n\r\n validate(schema?: any) {\r\n return (req: any, res: any, next: any) => {\r\n // Execute primary adapter middleware\r\n const primaryMiddleware = this.primaryAdapter.validate(schema);\r\n \r\n // Run middleware and handle errors properly\r\n primaryMiddleware(req, res, (err?: any) => {\r\n if (!err) {\r\n return next(); // Validation passed\r\n }\r\n \r\n // If error is a ValidationError, pass it through (don't fallback!)\r\n if (err instanceof ValidationError) {\r\n logger.warn(\"⚠ Validation failed\", {\r\n path: req.path,\r\n method: req.method,\r\n error: err.message\r\n });\r\n return next(err);\r\n }\r\n \r\n // Only use fallback for ADAPTER errors, not validation errors\r\n logger.warn(\"⚠ Primary validator adapter failed\", {\r\n error: err?.message,\r\n path: req.path,\r\n method: req.method\r\n });\r\n\r\n if (!this.fallbackAdapter) {\r\n return next(new ValidationError(\"Validation system error\"));\r\n }\r\n\r\n // Try fallback adapter\r\n const fallbackMiddleware = this.fallbackAdapter.validate(schema);\r\n fallbackMiddleware(req, res, (fallbackErr?: any) => {\r\n if (fallbackErr) {\r\n logger.error(\"❌ Fallback validator also failed\", {\r\n error: fallbackErr?.message\r\n });\r\n return next(new ValidationError(\"Validation system unavailable\"));\r\n }\r\n next(); // Fallback validation passed\r\n });\r\n });\r\n };\r\n }\r\n}"]}
1
+ {"version":3,"file":"ValidatorManager.js","sourceRoot":"","sources":["../../src/managers/ValidatorManager.ts"],"names":[],"mappings":"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","sourcesContent":["// // src/managers/ValidatorManager.ts - COMPLETE FIXED\r\n// import { logger } from \"../logging\";\r\n// import { ValidationError } from \"../core/errors/ValidationError.js\";\r\n// import { HiSecureConfig } from \"../core/types/HiSecureConfig.js\"; // ✅ FIXED IMPORT\r\n\r\n// interface ValidatorAdapter {\r\n// validate: (schema?: any) => any;\r\n// }\r\n\r\n// export class ValidatorManager {\r\n// private config: HiSecureConfig[\"validation\"];\r\n// private primaryAdapter: ValidatorAdapter;\r\n// private fallbackAdapter: ValidatorAdapter | null;\r\n\r\n// constructor(\r\n// config: HiSecureConfig[\"validation\"],\r\n// primaryAdapter: ValidatorAdapter,\r\n// fallbackAdapter: ValidatorAdapter | null\r\n// ) {\r\n// this.config = config;\r\n// this.primaryAdapter = primaryAdapter;\r\n// this.fallbackAdapter = fallbackAdapter;\r\n// }\r\n\r\n// validate(schema?: any) {\r\n// return (req: any, res: any, next: any) => {\r\n// // Execute primary adapter middleware\r\n// const primaryMiddleware = this.primaryAdapter.validate(schema);\r\n \r\n// // Run middleware and handle errors properly\r\n// primaryMiddleware(req, res, (err?: any) => {\r\n// if (!err) {\r\n// return next(); // Validation passed\r\n// }\r\n \r\n// // If error is a ValidationError, pass it through (don't fallback!)\r\n// if (err instanceof ValidationError) {\r\n// logger.warn(\"⚠ Validation failed\", {\r\n// path: req.path,\r\n// method: req.method,\r\n// error: err.message\r\n// });\r\n// return next(err);\r\n// }\r\n \r\n// // Only use fallback for ADAPTER errors, not validation errors\r\n// logger.warn(\"⚠ Primary validator adapter failed\", {\r\n// error: err?.message,\r\n// path: req.path,\r\n// method: req.method\r\n// });\r\n\r\n// if (!this.fallbackAdapter) {\r\n// return next(new ValidationError(\"Validation system error\"));\r\n// }\r\n\r\n// // Try fallback adapter\r\n// const fallbackMiddleware = this.fallbackAdapter.validate(schema);\r\n// fallbackMiddleware(req, res, (fallbackErr?: any) => {\r\n// if (fallbackErr) {\r\n// logger.error(\"❌ Fallback validator also failed\", {\r\n// error: fallbackErr?.message\r\n// });\r\n// return next(new ValidationError(\"Validation system unavailable\"));\r\n// }\r\n// next(); // Fallback validation passed\r\n// });\r\n// });\r\n// };\r\n// }\r\n// }\r\n\r\n\r\n\r\n\r\n// // src/managers/ValidatorManager.ts\r\n// import { logger } from \"../logging\";\r\n// import { ValidationError } from \"../core/errors/ValidationError.js\";\r\n\r\n// interface ValidatorAdapter {\r\n// validate: (schema?: any) => any;\r\n// }\r\n\r\n// export class ValidatorManager {\r\n// private primaryAdapter: ValidatorAdapter;\r\n// private fallbackAdapter: ValidatorAdapter | null;\r\n\r\n// constructor(primaryAdapter: ValidatorAdapter, fallbackAdapter: ValidatorAdapter | null) {\r\n// this.primaryAdapter = primaryAdapter;\r\n// this.fallbackAdapter = fallbackAdapter;\r\n// }\r\n\r\n// validate(schema?: any) {\r\n// return (req: any, res: any, next: any) => {\r\n// const isZod = schema && typeof schema === \"object\" && typeof schema.safeParse === \"function\";\r\n// const isExpressValidator = Array.isArray(schema);\r\n\r\n// let adapter: ValidatorAdapter;\r\n\r\n// if (isZod) {\r\n// adapter = this.primaryAdapter; // ZodAdapter\r\n// logger.debug(\"📌 Using Zod adapter for validation\");\r\n// } \r\n// else if (isExpressValidator) {\r\n// adapter = this.fallbackAdapter!; // ExpressValidatorAdapter\r\n// logger.debug(\"📌 Using express-validator adapter for validation\");\r\n// } \r\n// else {\r\n// return next(); // nothing to validate\r\n// }\r\n\r\n// const middleware = adapter.validate(schema);\r\n\r\n// // Execute validation chain\r\n// middleware(req, res, (err?: any) => {\r\n// if (err instanceof ValidationError) {\r\n// return next(err);\r\n// }\r\n// if (err) {\r\n// logger.error(\"❌ Validator internal error\", { error: err.message });\r\n// return next(new ValidationError(\"Validation failed internally.\"));\r\n// }\r\n// next();\r\n// });\r\n// };\r\n// }\r\n// }\r\n\r\n\r\n\r\n\r\n\r\n// src/managers/ValidatorManager.ts\r\nimport { logger } from \"../logging\";\r\nimport { ValidationError } from \"../core/errors/ValidationError.js\";\r\n\r\ninterface ValidatorAdapter {\r\n validate: (schema?: any) => any;\r\n}\r\n\r\nexport class ValidatorManager {\r\n private zodAdapter: ValidatorAdapter;\r\n private expressAdapter: ValidatorAdapter;\r\n\r\n constructor(zodAdapter: ValidatorAdapter, expressAdapter: ValidatorAdapter) {\r\n this.zodAdapter = zodAdapter;\r\n this.expressAdapter = expressAdapter;\r\n }\r\n\r\n validate(schema?: any) {\r\n // const isZod = schema && typeof schema.safeParse === \"function\";\r\n const isZod =\r\n schema &&\r\n typeof schema === \"object\" &&\r\n typeof schema._def === \"object\" && \r\n typeof schema.safeParse === \"function\";\r\n\r\n const isExpressValidator = Array.isArray(schema);\r\n\r\n return (req: any, res: any, next: any) => {\r\n let middleware;\r\n\r\n if (isZod) {\r\n logger.debug(\"📌 Using Zod adapter\");\r\n middleware = this.zodAdapter.validate(schema);\r\n } \r\n else if (isExpressValidator) {\r\n logger.debug(\"📌 Using express-validator adapter\");\r\n middleware = this.expressAdapter.validate(schema);\r\n } \r\n else {\r\n return next(); // no schema found\r\n }\r\n\r\n // CASE 1 — express-validator returns ARRAY\r\n if (Array.isArray(middleware)) {\r\n let idx = 0;\r\n\r\n const run = (err?: any) => {\r\n if (err) return next(err);\r\n\r\n const fn = middleware[idx++];\r\n if (!fn) return next(); // done\r\n\r\n try {\r\n fn(req, res, run);\r\n } catch (error: any) {\r\n next(new ValidationError(error.message));\r\n }\r\n };\r\n\r\n return run();\r\n }\r\n\r\n // CASE 2 — Zod returns SINGLE MIDDLEWARE\r\n try {\r\n middleware(req, res, (err?: any) => {\r\n if (err) return next(err);\r\n next();\r\n });\r\n } catch (err: any) {\r\n next(new ValidationError(err.message));\r\n }\r\n };\r\n }\r\n}\r\n\r\n"]}
@@ -12,7 +12,7 @@ const AdapterError_js_1 = require("../core/errors/AdapterError.js");
12
12
  const ValidationError_js_1 = require("../core/errors/ValidationError.js");
13
13
  const SanitizerError_js_1 = require("../core/errors/SanitizerError.js");
14
14
  const SecurityError_js_1 = require("../core/errors/SecurityError.js");
15
- const HttpErrror_js_1 = require("../core/errors/HttpErrror.js");
15
+ const HttpError_js_1 = require("../core/errors/HttpError.js");
16
16
  function errorHandler(err, req, res, _next) {
17
17
  const message = typeof err === "string"
18
18
  ? err
@@ -34,7 +34,7 @@ function errorHandler(err, req, res, _next) {
34
34
  // ---------------------------------------------------
35
35
  // 1. HttpError (developer thrown)
36
36
  // ---------------------------------------------------
37
- if (err instanceof HttpErrror_js_1.HttpError) {
37
+ if (err instanceof HttpError_js_1.HttpError) {
38
38
  return res.status(err.status).json({
39
39
  success: false,
40
40
  error: err.code,