hi-secure 1.0.11 → 1.0.13

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 (83) hide show
  1. package/dist/adapters/ArgonAdapter.js +2 -2
  2. package/dist/adapters/ArgonAdapter.js.map +1 -1
  3. package/dist/adapters/BcryptAdapter.js +2 -2
  4. package/dist/adapters/BcryptAdapter.js.map +1 -1
  5. package/dist/adapters/ExpressRLAdapter.js +2 -2
  6. package/dist/adapters/ExpressRLAdapter.js.map +1 -1
  7. package/dist/adapters/ExpressValidatorAdapter.js +1 -1
  8. package/dist/adapters/ExpressValidatorAdapter.js.map +1 -1
  9. package/dist/adapters/GoogleAdapter.js +3 -3
  10. package/dist/adapters/GoogleAdapter.js.map +1 -1
  11. package/dist/adapters/JWTAdapter.js +2 -2
  12. package/dist/adapters/JWTAdapter.js.map +1 -1
  13. package/dist/adapters/RLFlexibleAdapter.js +2 -2
  14. package/dist/adapters/RLFlexibleAdapter.js.map +1 -1
  15. package/dist/adapters/SanitizeHtmlAdapter.js +3 -3
  16. package/dist/adapters/SanitizeHtmlAdapter.js.map +1 -1
  17. package/dist/adapters/XSSAdapter.js +3 -3
  18. package/dist/adapters/XSSAdapter.js.map +1 -1
  19. package/dist/adapters/ZodAdapter.js +1 -1
  20. package/dist/adapters/ZodAdapter.js.map +1 -1
  21. package/dist/core/HiSecure.d.ts.map +1 -1
  22. package/dist/core/HiSecure.js +9 -8
  23. package/dist/core/HiSecure.js.map +1 -1
  24. package/dist/core/config.d.ts.map +1 -1
  25. package/dist/core/config.js +0 -7
  26. package/dist/core/config.js.map +1 -1
  27. package/dist/core/constants.d.ts.map +1 -1
  28. package/dist/core/constants.js +0 -27
  29. package/dist/core/constants.js.map +1 -1
  30. package/dist/core/errors/AdapterError.js +1 -1
  31. package/dist/core/errors/AdapterError.js.map +1 -1
  32. package/dist/core/types/HiSecureConfig.d.ts.map +1 -1
  33. package/dist/core/types/HiSecureConfig.js.map +1 -1
  34. package/dist/core/types/SecureOptions.d.ts.map +1 -1
  35. package/dist/core/types/SecureOptions.js +0 -1
  36. package/dist/core/types/SecureOptions.js.map +1 -1
  37. package/dist/core/useSecure.d.ts.map +1 -1
  38. package/dist/core/useSecure.js +1 -1
  39. package/dist/core/useSecure.js.map +1 -1
  40. package/dist/managers/AuthManager.js +2 -2
  41. package/dist/managers/AuthManager.js.map +1 -1
  42. package/dist/managers/CorsManager.d.ts.map +1 -1
  43. package/dist/managers/CorsManager.js +2 -2
  44. package/dist/managers/CorsManager.js.map +1 -1
  45. package/dist/managers/HashManager.js +7 -7
  46. package/dist/managers/HashManager.js.map +1 -1
  47. package/dist/managers/JsonManager.js +4 -4
  48. package/dist/managers/JsonManager.js.map +1 -1
  49. package/dist/managers/RateLimitManager.js +5 -5
  50. package/dist/managers/RateLimitManager.js.map +1 -1
  51. package/dist/managers/SanitizerManager.js +5 -5
  52. package/dist/managers/SanitizerManager.js.map +1 -1
  53. package/dist/managers/ValidatorManager.js +2 -2
  54. package/dist/managers/ValidatorManager.js.map +1 -1
  55. package/dist/middlewares/errorHandler.js +3 -3
  56. package/dist/middlewares/errorHandler.js.map +1 -1
  57. package/package.json +1 -1
  58. package/readme.md +484 -113
  59. package/src/adapters/ArgonAdapter.ts +2 -2
  60. package/src/adapters/BcryptAdapter.ts +2 -2
  61. package/src/adapters/ExpressRLAdapter.ts +2 -2
  62. package/src/adapters/ExpressValidatorAdapter.ts +1 -1
  63. package/src/adapters/GoogleAdapter.ts +3 -3
  64. package/src/adapters/JWTAdapter.ts +2 -2
  65. package/src/adapters/RLFlexibleAdapter.ts +2 -2
  66. package/src/adapters/SanitizeHtmlAdapter.ts +3 -3
  67. package/src/adapters/XSSAdapter.ts +3 -3
  68. package/src/adapters/ZodAdapter.ts +1 -1
  69. package/src/core/HiSecure.ts +10 -8
  70. package/src/core/config.ts +0 -105
  71. package/src/core/constants.ts +0 -33
  72. package/src/core/errors/AdapterError.ts +1 -1
  73. package/src/core/types/HiSecureConfig.ts +0 -1
  74. package/src/core/types/SecureOptions.ts +0 -27
  75. package/src/core/useSecure.ts +1 -3
  76. package/src/managers/AuthManager.ts +2 -2
  77. package/src/managers/CorsManager.ts +2 -2
  78. package/src/managers/HashManager.ts +7 -7
  79. package/src/managers/JsonManager.ts +4 -4
  80. package/src/managers/RateLimitManager.ts +5 -5
  81. package/src/managers/SanitizerManager.ts +5 -5
  82. package/src/managers/ValidatorManager.ts +2 -2
  83. package/src/middlewares/errorHandler.ts +3 -3
@@ -20,7 +20,7 @@ class ArgonAdapter {
20
20
  : await argon2_1.default.hash(value);
21
21
  }
22
22
  catch (err) {
23
- logging_1.logger.error("Argon2 hashing failed", {
23
+ logging_1.logger.error("Argon2 hashing failed", {
24
24
  error: err?.message || err
25
25
  });
26
26
  throw new AdapterError_1.AdapterError("Argon2 hashing failed.");
@@ -34,7 +34,7 @@ class ArgonAdapter {
34
34
  return await argon2_1.default.verify(hashed, value);
35
35
  }
36
36
  catch (err) {
37
- logging_1.logger.error("Argon2 verify failed", {
37
+ logging_1.logger.error("Argon2 verify failed", {
38
38
  error: err?.message || err
39
39
  });
40
40
  throw new AdapterError_1.AdapterError("Argon2 verify failed.");
@@ -1 +1 @@
1
- {"version":3,"file":"ArgonAdapter.js","sourceRoot":"","sources":["../../src/adapters/ArgonAdapter.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,8DAA2D;AAC3D,wCAAoC;AAEpC,MAAa,YAAY;IAGrB,YAAY,OAAwB;QAChC,IAAI,OAAO,EAAE,CAAC;YACV,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAC3B,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAa;QACpB,IAAI,CAAC;YACD,OAAO,IAAI,CAAC,OAAO;gBACf,CAAC,CAAC,MAAM,gBAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;gBACxC,CAAC,CAAC,MAAM,gBAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,gBAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;gBACpC,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,GAAG;aAC7B,CAAC,CAAC;YACH,MAAM,IAAI,2BAAY,CAAC,wBAAwB,CAAC,CAAC;QACrD,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,MAAc;QACtC,IAAI,CAAC;YACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxC,MAAM,IAAI,2BAAY,CAAC,yCAAyC,CAAC,CAAC;YACtE,CAAC;YAED,OAAO,MAAM,gBAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,gBAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE;gBACnC,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,GAAG;aAC7B,CAAC,CAAC;YACH,MAAM,IAAI,2BAAY,CAAC,uBAAuB,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;CACJ;AApCD,oCAoCC","sourcesContent":["import argon2 from \"argon2\";\r\nimport { AdapterError } from \"../core/errors/AdapterError\";\r\nimport { logger } from \"../logging\";\r\n\r\nexport class ArgonAdapter {\r\n private options: argon2.Options | undefined;\r\n\r\n constructor(options?: argon2.Options) {\r\n if (options) {\r\n this.options = options;\r\n }\r\n }\r\n\r\n async hash(value: string): Promise<string> {\r\n try {\r\n return this.options\r\n ? await argon2.hash(value, this.options)\r\n : await argon2.hash(value);\r\n } catch (err: any) {\r\n logger.error(\"Argon2 hashing failed\", {\r\n error: err?.message || err\r\n });\r\n throw new AdapterError(\"Argon2 hashing failed.\");\r\n }\r\n }\r\n\r\n async verify(value: string, hashed: string): Promise<boolean> {\r\n try {\r\n if (!hashed || typeof hashed !== \"string\") {\r\n throw new AdapterError(\"Invalid hash provided for verification.\");\r\n }\r\n\r\n return await argon2.verify(hashed, value);\r\n } catch (err: any) {\r\n logger.error(\"Argon2 verify failed\", {\r\n error: err?.message || err\r\n });\r\n throw new AdapterError(\"Argon2 verify failed.\");\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ArgonAdapter.js","sourceRoot":"","sources":["../../src/adapters/ArgonAdapter.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,8DAA2D;AAC3D,wCAAoC;AAEpC,MAAa,YAAY;IAGrB,YAAY,OAAwB;QAChC,IAAI,OAAO,EAAE,CAAC;YACV,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAC3B,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAa;QACpB,IAAI,CAAC;YACD,OAAO,IAAI,CAAC,OAAO;gBACf,CAAC,CAAC,MAAM,gBAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;gBACxC,CAAC,CAAC,MAAM,gBAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,gBAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE;gBAClC,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,GAAG;aAC7B,CAAC,CAAC;YACH,MAAM,IAAI,2BAAY,CAAC,wBAAwB,CAAC,CAAC;QACrD,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,MAAc;QACtC,IAAI,CAAC;YACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxC,MAAM,IAAI,2BAAY,CAAC,yCAAyC,CAAC,CAAC;YACtE,CAAC;YAED,OAAO,MAAM,gBAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,gBAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;gBACjC,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,GAAG;aAC7B,CAAC,CAAC;YACH,MAAM,IAAI,2BAAY,CAAC,uBAAuB,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;CACJ;AApCD,oCAoCC","sourcesContent":["import argon2 from \"argon2\";\r\nimport { AdapterError } from \"../core/errors/AdapterError\";\r\nimport { logger } from \"../logging\";\r\n\r\nexport class ArgonAdapter {\r\n private options: argon2.Options | undefined;\r\n\r\n constructor(options?: argon2.Options) {\r\n if (options) {\r\n this.options = options;\r\n }\r\n }\r\n\r\n async hash(value: string): Promise<string> {\r\n try {\r\n return this.options\r\n ? await argon2.hash(value, this.options)\r\n : await argon2.hash(value);\r\n } catch (err: any) {\r\n logger.error(\"Argon2 hashing failed\", {\r\n error: err?.message || err\r\n });\r\n throw new AdapterError(\"Argon2 hashing failed.\");\r\n }\r\n }\r\n\r\n async verify(value: string, hashed: string): Promise<boolean> {\r\n try {\r\n if (!hashed || typeof hashed !== \"string\") {\r\n throw new AdapterError(\"Invalid hash provided for verification.\");\r\n }\r\n\r\n return await argon2.verify(hashed, value);\r\n } catch (err: any) {\r\n logger.error(\"Argon2 verify failed\", {\r\n error: err?.message || err\r\n });\r\n throw new AdapterError(\"Argon2 verify failed.\");\r\n }\r\n }\r\n}\r\n"]}
@@ -19,7 +19,7 @@ class BcryptAdapter {
19
19
  return await bcryptjs_1.default.hash(value, this.saltRounds);
20
20
  }
21
21
  catch (err) {
22
- logging_1.logger.error("Bcrypt hashing failed", {
22
+ logging_1.logger.error("Bcrypt hashing failed", {
23
23
  error: err?.message || err,
24
24
  saltRounds: this.saltRounds
25
25
  });
@@ -37,7 +37,7 @@ class BcryptAdapter {
37
37
  return await bcryptjs_1.default.compare(value, hashed);
38
38
  }
39
39
  catch (err) {
40
- logging_1.logger.error("Bcrypt verify failed", {
40
+ logging_1.logger.error("Bcrypt verify failed", {
41
41
  error: err?.message || err
42
42
  });
43
43
  throw new AdapterError_1.AdapterError("Bcrypt verify failed.");
@@ -1 +1 @@
1
- {"version":3,"file":"BcryptAdapter.js","sourceRoot":"","sources":["../../src/adapters/BcryptAdapter.ts"],"names":[],"mappings":";;;;;;AAAA,wDAA8B;AAC9B,8DAA2D;AAC3D,wCAAoC;AAEpC,MAAa,aAAa;IACtB,YAAoB,aAAqB,EAAE;QAAvB,eAAU,GAAV,UAAU,CAAa;IAAG,CAAC;IAE/C,KAAK,CAAC,IAAI,CAAC,KAAa;QACpB,IAAI,CAAC;YACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,IAAI,2BAAY,CAAC,iCAAiC,CAAC,CAAC;YAC9D,CAAC;YAED,OAAO,MAAM,kBAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,gBAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;gBACpC,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,GAAG;gBAC1B,UAAU,EAAE,IAAI,CAAC,UAAU;aAC9B,CAAC,CAAC;YAEH,MAAM,IAAI,2BAAY,CAAC,wBAAwB,CAAC,CAAC;QACrD,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,MAAc;QACtC,IAAI,CAAC;YACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,IAAI,2BAAY,CAAC,mCAAmC,CAAC,CAAC;YAChE,CAAC;YAED,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxC,MAAM,IAAI,2BAAY,CAAC,iCAAiC,CAAC,CAAC;YAC9D,CAAC;YAED,OAAO,MAAM,kBAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,gBAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE;gBACnC,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,GAAG;aAC7B,CAAC,CAAC;YAEH,MAAM,IAAI,2BAAY,CAAC,uBAAuB,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;CACJ;AAvCD,sCAuCC","sourcesContent":["import bcrypt from \"bcryptjs\";\r\nimport { AdapterError } from \"../core/errors/AdapterError\";\r\nimport { logger } from \"../logging\";\r\n\r\nexport class BcryptAdapter {\r\n constructor(private saltRounds: number = 10) {}\r\n\r\n async hash(value: string): Promise<string> {\r\n try {\r\n if (typeof value !== \"string\") {\r\n throw new AdapterError(\"Value to hash must be a string.\");\r\n }\r\n\r\n return await bcrypt.hash(value, this.saltRounds);\r\n } catch (err: any) {\r\n logger.error(\"Bcrypt hashing failed\", {\r\n error: err?.message || err,\r\n saltRounds: this.saltRounds\r\n });\r\n\r\n throw new AdapterError(\"Bcrypt hashing failed.\");\r\n }\r\n }\r\n\r\n async verify(value: string, hashed: string): Promise<boolean> {\r\n try {\r\n if (typeof value !== \"string\") {\r\n throw new AdapterError(\"Value to verify must be a string.\");\r\n }\r\n\r\n if (!hashed || typeof hashed !== \"string\") {\r\n throw new AdapterError(\"Invalid hashed string provided.\");\r\n }\r\n\r\n return await bcrypt.compare(value, hashed);\r\n } catch (err: any) {\r\n logger.error(\"Bcrypt verify failed\", {\r\n error: err?.message || err\r\n });\r\n\r\n throw new AdapterError(\"Bcrypt verify failed.\");\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n"]}
1
+ {"version":3,"file":"BcryptAdapter.js","sourceRoot":"","sources":["../../src/adapters/BcryptAdapter.ts"],"names":[],"mappings":";;;;;;AAAA,wDAA8B;AAC9B,8DAA2D;AAC3D,wCAAoC;AAEpC,MAAa,aAAa;IACtB,YAAoB,aAAqB,EAAE;QAAvB,eAAU,GAAV,UAAU,CAAa;IAAG,CAAC;IAE/C,KAAK,CAAC,IAAI,CAAC,KAAa;QACpB,IAAI,CAAC;YACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,IAAI,2BAAY,CAAC,iCAAiC,CAAC,CAAC;YAC9D,CAAC;YAED,OAAO,MAAM,kBAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,gBAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE;gBAClC,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,GAAG;gBAC1B,UAAU,EAAE,IAAI,CAAC,UAAU;aAC9B,CAAC,CAAC;YAEH,MAAM,IAAI,2BAAY,CAAC,wBAAwB,CAAC,CAAC;QACrD,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,MAAc;QACtC,IAAI,CAAC;YACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,IAAI,2BAAY,CAAC,mCAAmC,CAAC,CAAC;YAChE,CAAC;YAED,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxC,MAAM,IAAI,2BAAY,CAAC,iCAAiC,CAAC,CAAC;YAC9D,CAAC;YAED,OAAO,MAAM,kBAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,gBAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;gBACjC,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,GAAG;aAC7B,CAAC,CAAC;YAEH,MAAM,IAAI,2BAAY,CAAC,uBAAuB,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;CACJ;AAvCD,sCAuCC","sourcesContent":["import bcrypt from \"bcryptjs\";\r\nimport { AdapterError } from \"../core/errors/AdapterError\";\r\nimport { logger } from \"../logging\";\r\n\r\nexport class BcryptAdapter {\r\n constructor(private saltRounds: number = 10) {}\r\n\r\n async hash(value: string): Promise<string> {\r\n try {\r\n if (typeof value !== \"string\") {\r\n throw new AdapterError(\"Value to hash must be a string.\");\r\n }\r\n\r\n return await bcrypt.hash(value, this.saltRounds);\r\n } catch (err: any) {\r\n logger.error(\"Bcrypt hashing failed\", {\r\n error: err?.message || err,\r\n saltRounds: this.saltRounds\r\n });\r\n\r\n throw new AdapterError(\"Bcrypt hashing failed.\");\r\n }\r\n }\r\n\r\n async verify(value: string, hashed: string): Promise<boolean> {\r\n try {\r\n if (typeof value !== \"string\") {\r\n throw new AdapterError(\"Value to verify must be a string.\");\r\n }\r\n\r\n if (!hashed || typeof hashed !== \"string\") {\r\n throw new AdapterError(\"Invalid hashed string provided.\");\r\n }\r\n\r\n return await bcrypt.compare(value, hashed);\r\n } catch (err: any) {\r\n logger.error(\"Bcrypt verify failed\", {\r\n error: err?.message || err\r\n });\r\n\r\n throw new AdapterError(\"Bcrypt verify failed.\");\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n"]}
@@ -20,14 +20,14 @@ class ExpressRLAdapter {
20
20
  };
21
21
  const finalOptions = { ...defaultOptions, ...options };
22
22
  const limiter = (0, express_rate_limit_1.default)(finalOptions);
23
- index_js_1.logger.debug("📌 Express rate limiter configured", {
23
+ index_js_1.logger.debug("Express rate limiter configured", {
24
24
  windowMs: finalOptions.windowMs,
25
25
  max: finalOptions.max
26
26
  });
27
27
  return limiter;
28
28
  }
29
29
  catch (err) {
30
- index_js_1.logger.error("ExpressRLAdapter: failed to create limiter", {
30
+ index_js_1.logger.error("ExpressRLAdapter: failed to create limiter", {
31
31
  error: err?.message || err
32
32
  });
33
33
  throw new AdapterError_js_1.AdapterError("Express rate limiter creation failed.");
@@ -1 +1 @@
1
- {"version":3,"file":"ExpressRLAdapter.js","sourceRoot":"","sources":["../../src/adapters/ExpressRLAdapter.ts"],"names":[],"mappings":";;;;;;AAAA,4EAA2C;AAC3C,kDAA6C;AAC7C,oEAA8D;AAY9D,MAAa,gBAAgB;IACzB,aAAa,CAAC,UAA4B,EAAE;QACxC,IAAI,CAAC;YACD,MAAM,cAAc,GAAG;gBACnB,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;gBACxB,GAAG,EAAE,GAAG;gBACR,OAAO,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE;gBACvC,eAAe,EAAE,IAAI;gBACrB,aAAa,EAAE,KAAK;gBACpB,kBAAkB,EAAE,KAAK;aAC5B,CAAC;YAEF,MAAM,YAAY,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC;YAEvD,MAAM,OAAO,GAAG,IAAA,4BAAS,EAAC,YAAY,CAAC,CAAC;YAExC,iBAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE;gBAC/C,QAAQ,EAAE,YAAY,CAAC,QAAQ;gBAC/B,GAAG,EAAE,YAAY,CAAC,GAAG;aACxB,CAAC,CAAC;YAEH,OAAO,OAAO,CAAC;QAEnB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,iBAAM,CAAC,KAAK,CAAC,8CAA8C,EAAE;gBACzD,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,GAAG;aAC7B,CAAC,CAAC;YACH,MAAM,IAAI,8BAAY,CAAC,uCAAuC,CAAC,CAAC;QACpE,CAAC;IACL,CAAC;CACJ;AA9BD,4CA8BC","sourcesContent":["import rateLimit from \"express-rate-limit\";\r\nimport { logger } from \"../logging/index.js\";\r\nimport { AdapterError } from \"../core/errors/AdapterError.js\";\r\n\r\nexport interface RateLimitOptions {\r\n windowMs?: number;\r\n max?: number;\r\n message?: any;\r\n skipFailedRequests?: boolean;\r\n standardHeaders?: boolean;\r\n legacyHeaders?: boolean;\r\n [key: string]: any;\r\n}\r\n\r\nexport class ExpressRLAdapter {\r\n getMiddleware(options: RateLimitOptions = {}) {\r\n try {\r\n const defaultOptions = {\r\n windowMs: 15 * 60 * 1000, \r\n max: 100,\r\n message: { error: \"Too many requests\" },\r\n standardHeaders: true,\r\n legacyHeaders: false,\r\n skipFailedRequests: false\r\n };\r\n\r\n const finalOptions = { ...defaultOptions, ...options };\r\n \r\n const limiter = rateLimit(finalOptions);\r\n \r\n logger.debug(\"📌 Express rate limiter configured\", {\r\n windowMs: finalOptions.windowMs,\r\n max: finalOptions.max\r\n });\r\n\r\n return limiter;\r\n\r\n } catch (err: any) {\r\n logger.error(\"ExpressRLAdapter: failed to create limiter\", {\r\n error: err?.message || err\r\n });\r\n throw new AdapterError(\"Express rate limiter creation failed.\");\r\n }\r\n }\r\n}"]}
1
+ {"version":3,"file":"ExpressRLAdapter.js","sourceRoot":"","sources":["../../src/adapters/ExpressRLAdapter.ts"],"names":[],"mappings":";;;;;;AAAA,4EAA2C;AAC3C,kDAA6C;AAC7C,oEAA8D;AAY9D,MAAa,gBAAgB;IACzB,aAAa,CAAC,UAA4B,EAAE;QACxC,IAAI,CAAC;YACD,MAAM,cAAc,GAAG;gBACnB,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;gBACxB,GAAG,EAAE,GAAG;gBACR,OAAO,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE;gBACvC,eAAe,EAAE,IAAI;gBACrB,aAAa,EAAE,KAAK;gBACpB,kBAAkB,EAAE,KAAK;aAC5B,CAAC;YAEF,MAAM,YAAY,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC;YAEvD,MAAM,OAAO,GAAG,IAAA,4BAAS,EAAC,YAAY,CAAC,CAAC;YAExC,iBAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;gBAC5C,QAAQ,EAAE,YAAY,CAAC,QAAQ;gBAC/B,GAAG,EAAE,YAAY,CAAC,GAAG;aACxB,CAAC,CAAC;YAEH,OAAO,OAAO,CAAC;QAEnB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,iBAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE;gBACvD,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,GAAG;aAC7B,CAAC,CAAC;YACH,MAAM,IAAI,8BAAY,CAAC,uCAAuC,CAAC,CAAC;QACpE,CAAC;IACL,CAAC;CACJ;AA9BD,4CA8BC","sourcesContent":["import rateLimit from \"express-rate-limit\";\r\nimport { logger } from \"../logging/index.js\";\r\nimport { AdapterError } from \"../core/errors/AdapterError.js\";\r\n\r\nexport interface RateLimitOptions {\r\n windowMs?: number;\r\n max?: number;\r\n message?: any;\r\n skipFailedRequests?: boolean;\r\n standardHeaders?: boolean;\r\n legacyHeaders?: boolean;\r\n [key: string]: any;\r\n}\r\n\r\nexport class ExpressRLAdapter {\r\n getMiddleware(options: RateLimitOptions = {}) {\r\n try {\r\n const defaultOptions = {\r\n windowMs: 15 * 60 * 1000, \r\n max: 100,\r\n message: { error: \"Too many requests\" },\r\n standardHeaders: true,\r\n legacyHeaders: false,\r\n skipFailedRequests: false\r\n };\r\n\r\n const finalOptions = { ...defaultOptions, ...options };\r\n \r\n const limiter = rateLimit(finalOptions);\r\n \r\n logger.debug(\"Express rate limiter configured\", {\r\n windowMs: finalOptions.windowMs,\r\n max: finalOptions.max\r\n });\r\n\r\n return limiter;\r\n\r\n } catch (err: any) {\r\n logger.error(\"ExpressRLAdapter: failed to create limiter\", {\r\n error: err?.message || err\r\n });\r\n throw new AdapterError(\"Express rate limiter creation failed.\");\r\n }\r\n }\r\n}"]}
@@ -23,7 +23,7 @@ class ExpressValidatorAdapter {
23
23
  // param: err.param ,
24
24
  // location: err.location
25
25
  }));
26
- index_js_1.logger.warn("express-validator failed", {
26
+ index_js_1.logger.warn("express-validator failed", {
27
27
  path: req.path,
28
28
  method: req.method,
29
29
  errors: formatted,
@@ -1 +1 @@
1
- {"version":3,"file":"ExpressValidatorAdapter.js","sourceRoot":"","sources":["../../src/adapters/ExpressValidatorAdapter.ts"],"names":[],"mappings":";;;AAAA,yDAAqD;AACrD,0EAAoE;AACpE,kDAA6C;AAE7C,MAAa,uBAAuB;IAGhC,YAAY,YAAoB;QAC5B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACrC,CAAC;IAED,QAAQ,CAAC,aAAqB;QAC1B,MAAM,MAAM,GAAG,aAAa,IAAI,IAAI,CAAC,YAAY,CAAC;QAElD,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,GAAQ,EAAE,GAAQ,EAAE,IAAS,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QACrD,CAAC;QAED,OAAO;YACH,GAAG,MAAM;YAET,CAAC,GAAQ,EAAE,GAAQ,EAAE,IAAS,EAAE,EAAE;gBAC9B,MAAM,MAAM,GAAG,IAAA,oCAAgB,EAAC,GAAG,CAAC,CAAC;gBAErC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;oBACpB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBACzC,OAAO,EAAE,GAAG,CAAC,GAAG;wBAChB,qBAAqB;wBACrB,yBAAyB;qBAC5B,CAAC,CAAC,CAAC;oBAEJ,iBAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;wBACtC,IAAI,EAAE,GAAG,CAAC,IAAI;wBACd,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,MAAM,EAAE,SAAS;wBACjB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;qBAClD,CAAC,CAAC;oBAEH,OAAO,IAAI,CAAC,IAAI,oCAAe,CAAC,oBAAoB,EAAE,SAAgB,CAAC,CAAC,CAAC;gBAC7E,CAAC;gBAED,IAAI,EAAE,CAAC;YACX,CAAC;SACJ,CAAC;IACN,CAAC;CACJ;AAzCD,0DAyCC","sourcesContent":["import { validationResult } from \"express-validator\";\r\nimport { ValidationError } from \"../core/errors/ValidationError.js\"; \r\nimport { logger } from \"../logging/index.js\";\r\n\r\nexport class ExpressValidatorAdapter {\r\n private globalSchema?: any[];\r\n\r\n constructor(globalSchema?: any[]) {\r\n this.globalSchema = globalSchema;\r\n }\r\n\r\n validate(dynamicSchema?: any[]) {\r\n const schema = dynamicSchema || this.globalSchema;\r\n\r\n if (!schema || !Array.isArray(schema)) {\r\n return (req: any, res: any, next: any) => next();\r\n }\r\n\r\n return [\r\n ...schema,\r\n\r\n (req: any, res: any, next: any) => {\r\n const errors = validationResult(req);\r\n\r\n if (!errors.isEmpty()) {\r\n const formatted = errors.array().map(err => ({\r\n message: err.msg,\r\n // param: err.param ,\r\n // location: err.location\r\n }));\r\n\r\n logger.warn(\"express-validator failed\", {\r\n path: req.path,\r\n method: req.method,\r\n errors: formatted,\r\n preview: JSON.stringify(req.body).slice(0, 200)\r\n });\r\n\r\n return next(new ValidationError(\"Validation failed.\", formatted as any));\r\n }\r\n\r\n next();\r\n }\r\n ];\r\n }\r\n}"]}
1
+ {"version":3,"file":"ExpressValidatorAdapter.js","sourceRoot":"","sources":["../../src/adapters/ExpressValidatorAdapter.ts"],"names":[],"mappings":";;;AAAA,yDAAqD;AACrD,0EAAoE;AACpE,kDAA6C;AAE7C,MAAa,uBAAuB;IAGhC,YAAY,YAAoB;QAC5B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACrC,CAAC;IAED,QAAQ,CAAC,aAAqB;QAC1B,MAAM,MAAM,GAAG,aAAa,IAAI,IAAI,CAAC,YAAY,CAAC;QAElD,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,GAAQ,EAAE,GAAQ,EAAE,IAAS,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QACrD,CAAC;QAED,OAAO;YACH,GAAG,MAAM;YAET,CAAC,GAAQ,EAAE,GAAQ,EAAE,IAAS,EAAE,EAAE;gBAC9B,MAAM,MAAM,GAAG,IAAA,oCAAgB,EAAC,GAAG,CAAC,CAAC;gBAErC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;oBACpB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBACzC,OAAO,EAAE,GAAG,CAAC,GAAG;wBAChB,qBAAqB;wBACrB,yBAAyB;qBAC5B,CAAC,CAAC,CAAC;oBAEJ,iBAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE;wBACpC,IAAI,EAAE,GAAG,CAAC,IAAI;wBACd,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,MAAM,EAAE,SAAS;wBACjB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;qBAClD,CAAC,CAAC;oBAEH,OAAO,IAAI,CAAC,IAAI,oCAAe,CAAC,oBAAoB,EAAE,SAAgB,CAAC,CAAC,CAAC;gBAC7E,CAAC;gBAED,IAAI,EAAE,CAAC;YACX,CAAC;SACJ,CAAC;IACN,CAAC;CACJ;AAzCD,0DAyCC","sourcesContent":["import { validationResult } from \"express-validator\";\r\nimport { ValidationError } from \"../core/errors/ValidationError.js\"; \r\nimport { logger } from \"../logging/index.js\";\r\n\r\nexport class ExpressValidatorAdapter {\r\n private globalSchema?: any[];\r\n\r\n constructor(globalSchema?: any[]) {\r\n this.globalSchema = globalSchema;\r\n }\r\n\r\n validate(dynamicSchema?: any[]) {\r\n const schema = dynamicSchema || this.globalSchema;\r\n\r\n if (!schema || !Array.isArray(schema)) {\r\n return (req: any, res: any, next: any) => next();\r\n }\r\n\r\n return [\r\n ...schema,\r\n\r\n (req: any, res: any, next: any) => {\r\n const errors = validationResult(req);\r\n\r\n if (!errors.isEmpty()) {\r\n const formatted = errors.array().map(err => ({\r\n message: err.msg,\r\n // param: err.param ,\r\n // location: err.location\r\n }));\r\n\r\n logger.warn(\"express-validator failed\", {\r\n path: req.path,\r\n method: req.method,\r\n errors: formatted,\r\n preview: JSON.stringify(req.body).slice(0, 200)\r\n });\r\n\r\n return next(new ValidationError(\"Validation failed.\", formatted as any));\r\n }\r\n\r\n next();\r\n }\r\n ];\r\n }\r\n}"]}
@@ -20,7 +20,7 @@ class GoogleAdapter {
20
20
  const options = {
21
21
  idToken
22
22
  };
23
- // Add audience only if clientId is provided and not empty
23
+ // audience only if clientId is provided and not empty
24
24
  if (this.clientId && this.clientId.trim().length > 0) {
25
25
  options.audience = this.clientId;
26
26
  }
@@ -30,7 +30,7 @@ class GoogleAdapter {
30
30
  logging_1.logger.warn("GoogleAdapter: Empty payload");
31
31
  throw new AdapterError_js_1.AdapterError("Invalid Google ID token payload.");
32
32
  }
33
- // Create result object
33
+ // result object
34
34
  const result = {
35
35
  sub: payload.sub,
36
36
  email: payload.email || '',
@@ -38,7 +38,7 @@ class GoogleAdapter {
38
38
  name: payload.name,
39
39
  picture: payload.picture
40
40
  };
41
- // Add remaining properties from payload (excluding duplicates)
41
+ // remaining properties from payload
42
42
  const { sub, email, email_verified, name, picture, ...rest } = payload;
43
43
  Object.assign(result, rest);
44
44
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"GoogleAdapter.js","sourceRoot":"","sources":["../../src/adapters/GoogleAdapter.ts"],"names":[],"mappings":";;;AAAA,6DAAgE;AAChE,oEAA8D;AAE9D,wCAAkC;AAWlC,MAAa,aAAa;IAItB,YAAY,QAAiB;QACzB,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,8BAAY,CAAC,wCAAwC,CAAC,CAAC;QACrE,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,kCAAY,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAe;QAC/B,IAAI,CAAC;YACD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC1C,MAAM,IAAI,8BAAY,CAAC,2BAA2B,CAAC,CAAC;YACxD,CAAC;YAED,MAAM,OAAO,GAAsD;gBAC/D,OAAO;aACV,CAAC;YAEF,0DAA0D;YAC1D,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnD,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YACrC,CAAC;YAED,MAAM,MAAM,GAAgB,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACrE,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAEpC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,gBAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;gBAC5C,MAAM,IAAI,8BAAY,CAAC,kCAAkC,CAAC,CAAC;YAC/D,CAAC;YAED,uBAAuB;YACvB,MAAM,MAAM,GAAuB;gBAC/B,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;gBAC1B,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,KAAK;gBAC/C,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,OAAO,EAAE,OAAO,CAAC,OAAO;aAC3B,CAAC;YAEF,+DAA+D;YAC/D,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;YACvE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAE5B,OAAO,MAAM,CAAC;QAElB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,gBAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE;gBAC/C,KAAK,EAAE,GAAG,EAAE,OAAO;gBACnB,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ;aAC/B,CAAC,CAAC;YAEH,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpC,MAAM,IAAI,8BAAY,CAAC,sCAAsC,CAAC,CAAC;YACnE,CAAC;YAED,MAAM,IAAI,8BAAY,CAAC,GAAG,EAAE,OAAO,IAAI,kCAAkC,CAAC,CAAC;QAC/E,CAAC;IACL,CAAC;CACJ;AAhED,sCAgEC","sourcesContent":["import { OAuth2Client, LoginTicket } from \"google-auth-library\";\r\nimport { AdapterError } from \"../core/errors/AdapterError.js\";\r\n\r\nimport {logger} from '../logging';\r\n\r\nexport interface GoogleTokenPayload {\r\n sub: string;\r\n email: string;\r\n email_verified: boolean;\r\n name?: string;\r\n picture?: string;\r\n [key: string]: any;\r\n}\r\n\r\nexport class GoogleAdapter {\r\n private client: OAuth2Client;\r\n private clientId?: string;\r\n\r\n constructor(clientId?: string) {\r\n if (clientId && clientId.trim().length === 0) {\r\n throw new AdapterError(\"Google clientId cannot be empty string\");\r\n }\r\n \r\n this.client = new OAuth2Client(clientId);\r\n this.clientId = clientId;\r\n }\r\n\r\n async verifyIdToken(idToken: string): Promise<GoogleTokenPayload> {\r\n try {\r\n if (!idToken || typeof idToken !== 'string') {\r\n throw new AdapterError(\"Invalid ID token provided\");\r\n }\r\n\r\n const options: { idToken: string; audience?: string | string[] } = { \r\n idToken \r\n };\r\n\r\n // Add audience only if clientId is provided and not empty\r\n if (this.clientId && this.clientId.trim().length > 0) {\r\n options.audience = this.clientId;\r\n }\r\n\r\n const ticket: LoginTicket = await this.client.verifyIdToken(options);\r\n const payload = ticket.getPayload();\r\n \r\n if (!payload) {\r\n logger.warn(\"GoogleAdapter: Empty payload\");\r\n throw new AdapterError(\"Invalid Google ID token payload.\");\r\n }\r\n\r\n // Create result object\r\n const result: GoogleTokenPayload = {\r\n sub: payload.sub,\r\n email: payload.email || '',\r\n email_verified: payload.email_verified || false,\r\n name: payload.name,\r\n picture: payload.picture\r\n };\r\n\r\n // Add remaining properties from payload (excluding duplicates)\r\n const { sub, email, email_verified, name, picture, ...rest } = payload;\r\n Object.assign(result, rest);\r\n\r\n return result;\r\n\r\n } catch (err: any) {\r\n logger.error(\"GoogleAdapter.verifyIdToken failed\", { \r\n error: err?.message,\r\n hasClientId: !!this.clientId \r\n });\r\n \r\n if (err.message?.includes('audience')) {\r\n throw new AdapterError(\"Invalid Google client ID configured.\");\r\n }\r\n \r\n throw new AdapterError(err?.message || \"Google token verification failed\");\r\n }\r\n }\r\n}"]}
1
+ {"version":3,"file":"GoogleAdapter.js","sourceRoot":"","sources":["../../src/adapters/GoogleAdapter.ts"],"names":[],"mappings":";;;AAAA,6DAAgE;AAChE,oEAA8D;AAE9D,wCAAkC;AAWlC,MAAa,aAAa;IAItB,YAAY,QAAiB;QACzB,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,8BAAY,CAAC,wCAAwC,CAAC,CAAC;QACrE,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,kCAAY,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAe;QAC/B,IAAI,CAAC;YACD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC1C,MAAM,IAAI,8BAAY,CAAC,2BAA2B,CAAC,CAAC;YACxD,CAAC;YAED,MAAM,OAAO,GAAsD;gBAC/D,OAAO;aACV,CAAC;YAEF,sDAAsD;YACtD,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnD,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YACrC,CAAC;YAED,MAAM,MAAM,GAAgB,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACrE,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAEpC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,gBAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;gBAC5C,MAAM,IAAI,8BAAY,CAAC,kCAAkC,CAAC,CAAC;YAC/D,CAAC;YAED,gBAAgB;YAChB,MAAM,MAAM,GAAuB;gBAC/B,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;gBAC1B,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,KAAK;gBAC/C,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,OAAO,EAAE,OAAO,CAAC,OAAO;aAC3B,CAAC;YAEF,qCAAqC;YACrC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;YACvE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAE5B,OAAO,MAAM,CAAC;QAElB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,gBAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE;gBAC/C,KAAK,EAAE,GAAG,EAAE,OAAO;gBACnB,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ;aAC/B,CAAC,CAAC;YAEH,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpC,MAAM,IAAI,8BAAY,CAAC,sCAAsC,CAAC,CAAC;YACnE,CAAC;YAED,MAAM,IAAI,8BAAY,CAAC,GAAG,EAAE,OAAO,IAAI,kCAAkC,CAAC,CAAC;QAC/E,CAAC;IACL,CAAC;CACJ;AAhED,sCAgEC","sourcesContent":["import { OAuth2Client, LoginTicket } from \"google-auth-library\";\r\nimport { AdapterError } from \"../core/errors/AdapterError.js\";\r\n\r\nimport {logger} from '../logging';\r\n\r\nexport interface GoogleTokenPayload {\r\n sub: string;\r\n email: string;\r\n email_verified: boolean;\r\n name?: string;\r\n picture?: string;\r\n [key: string]: any;\r\n}\r\n\r\nexport class GoogleAdapter {\r\n private client: OAuth2Client;\r\n private clientId?: string;\r\n\r\n constructor(clientId?: string) {\r\n if (clientId && clientId.trim().length === 0) {\r\n throw new AdapterError(\"Google clientId cannot be empty string\");\r\n }\r\n \r\n this.client = new OAuth2Client(clientId);\r\n this.clientId = clientId;\r\n }\r\n\r\n async verifyIdToken(idToken: string): Promise<GoogleTokenPayload> {\r\n try {\r\n if (!idToken || typeof idToken !== 'string') {\r\n throw new AdapterError(\"Invalid ID token provided\");\r\n }\r\n\r\n const options: { idToken: string; audience?: string | string[] } = { \r\n idToken \r\n };\r\n\r\n // audience only if clientId is provided and not empty\r\n if (this.clientId && this.clientId.trim().length > 0) {\r\n options.audience = this.clientId;\r\n }\r\n\r\n const ticket: LoginTicket = await this.client.verifyIdToken(options);\r\n const payload = ticket.getPayload();\r\n \r\n if (!payload) {\r\n logger.warn(\"GoogleAdapter: Empty payload\");\r\n throw new AdapterError(\"Invalid Google ID token payload.\");\r\n }\r\n\r\n // result object\r\n const result: GoogleTokenPayload = {\r\n sub: payload.sub,\r\n email: payload.email || '',\r\n email_verified: payload.email_verified || false,\r\n name: payload.name,\r\n picture: payload.picture\r\n };\r\n\r\n // remaining properties from payload \r\n const { sub, email, email_verified, name, picture, ...rest } = payload;\r\n Object.assign(result, rest);\r\n\r\n return result;\r\n\r\n } catch (err: any) {\r\n logger.error(\"GoogleAdapter.verifyIdToken failed\", { \r\n error: err?.message,\r\n hasClientId: !!this.clientId \r\n });\r\n \r\n if (err.message?.includes('audience')) {\r\n throw new AdapterError(\"Invalid Google client ID configured.\");\r\n }\r\n \r\n throw new AdapterError(err?.message || \"Google token verification failed\");\r\n }\r\n }\r\n}"]}
@@ -15,8 +15,8 @@ class JWTAdapter {
15
15
  throw new AdapterError_js_1.AdapterError("JWT secret is required");
16
16
  }
17
17
  if (options.secret.length < 32) {
18
- logging_1.logger.warn("🚨 JWT secret shorter than 32 chars. Consider using stronger secret.");
19
- // logError("JWT secret is too short (minimum 32 characters recommended)");
18
+ logging_1.logger.warn("JWT secret shorter than 32 chars. Consider using stronger secret.");
19
+ // logError("JWT secret is too short (minimum 32 characters recommended)");
20
20
  }
21
21
  this.secret = options.secret;
22
22
  this.expiresIn = options.expiresIn;
@@ -1 +1 @@
1
- {"version":3,"file":"JWTAdapter.js","sourceRoot":"","sources":["../../src/adapters/JWTAdapter.ts"],"names":[],"mappings":"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","sourcesContent":["import jwt from \"jsonwebtoken\";\r\nimport { randomUUID } from \"crypto\"; \r\nimport { AdapterError } from \"../core/errors/AdapterError.js\";\r\nimport { logError } from \"../logging/index.js\";\r\nimport { logger } from \"../logging\";\r\n\r\nexport interface JWTAdapterOptions {\r\n secret: string;\r\n expiresIn?: string | number;\r\n algorithm?: jwt.Algorithm;\r\n issuer?: string;\r\n audience?: string | string[];\r\n}\r\n\r\nexport interface SignOptions {\r\n expiresIn?: string | number;\r\n jti?: string; \r\n subject?: string;\r\n issuer?: string;\r\n audience?: string | string[];\r\n}\r\n\r\nexport class JWTAdapter {\r\n private secret: string;\r\n private expiresIn?: string | number;\r\n private algorithm: jwt.Algorithm;\r\n private issuer?: string;\r\n private audience?: string | string[];\r\n\r\n constructor(options: JWTAdapterOptions) {\r\n if (!options.secret) {\r\n throw new AdapterError(\"JWT secret is required\");\r\n }\r\n\r\n if (options.secret.length < 32) {\r\n logger.warn(\"🚨 JWT secret shorter than 32 chars. Consider using stronger secret.\");\r\n // logError(\"JWT secret is too short (minimum 32 characters recommended)\");\r\n }\r\n\r\n this.secret = options.secret;\r\n this.expiresIn = options.expiresIn;\r\n this.algorithm = options.algorithm || 'HS256'; // Default algorithm \r\n this.issuer = options.issuer;\r\n this.audience = options.audience;\r\n }\r\n\r\n sign(payload: object, options?: SignOptions) {\r\n try {\r\n const jwtOptions: jwt.SignOptions = {\r\n algorithm: this.algorithm,\r\n issuer: options?.issuer || this.issuer,\r\n audience: options?.audience || this.audience,\r\n jwtid: options?.jti || randomUUID(), \r\n subject: options?.subject\r\n };\r\n\r\n if (options?.expiresIn !== undefined) {\r\n jwtOptions.expiresIn = options.expiresIn as number;\r\n } else if (this.expiresIn !== undefined) {\r\n jwtOptions.expiresIn = this.expiresIn as number;\r\n }\r\n\r\n return jwt.sign(payload, this.secret, jwtOptions);\r\n\r\n } catch (err: any) {\r\n logError(\"JWTAdapter.sign failed\", { error: err?.message });\r\n throw new AdapterError(err?.message || \"JWT sign failed\");\r\n }\r\n }\r\n\r\n verify(token: string, options?: { audience?: string | string[] }) {\r\n try {\r\n const verifyOptions: jwt.VerifyOptions = {\r\n algorithms: [this.algorithm],\r\n issuer: this.issuer,\r\n audience: options?.audience as string || this.audience as string\r\n };\r\n\r\n return jwt.verify(token, this.secret, verifyOptions);\r\n } catch (err: any) {\r\n logError(\"JWTAdapter.verify failed\", { error: err?.message });\r\n \r\n \r\n if (err.name === 'TokenExpiredError') {\r\n throw new AdapterError(\"JWT token has expired\");\r\n }\r\n if (err.name === 'JsonWebTokenError') {\r\n throw new AdapterError(\"Invalid JWT token\");\r\n }\r\n \r\n throw new AdapterError(err?.message || \"JWT verification failed\");\r\n }\r\n }\r\n}"]}
1
+ {"version":3,"file":"JWTAdapter.js","sourceRoot":"","sources":["../../src/adapters/JWTAdapter.ts"],"names":[],"mappings":"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","sourcesContent":["import jwt from \"jsonwebtoken\";\r\nimport { randomUUID } from \"crypto\"; \r\nimport { AdapterError } from \"../core/errors/AdapterError.js\";\r\nimport { logError } from \"../logging/index.js\";\r\nimport { logger } from \"../logging\";\r\n\r\nexport interface JWTAdapterOptions {\r\n secret: string;\r\n expiresIn?: string | number;\r\n algorithm?: jwt.Algorithm;\r\n issuer?: string;\r\n audience?: string | string[];\r\n}\r\n\r\nexport interface SignOptions {\r\n expiresIn?: string | number;\r\n jti?: string; \r\n subject?: string;\r\n issuer?: string;\r\n audience?: string | string[];\r\n}\r\n\r\nexport class JWTAdapter {\r\n private secret: string;\r\n private expiresIn?: string | number;\r\n private algorithm: jwt.Algorithm;\r\n private issuer?: string;\r\n private audience?: string | string[];\r\n\r\n constructor(options: JWTAdapterOptions) {\r\n if (!options.secret) {\r\n throw new AdapterError(\"JWT secret is required\");\r\n }\r\n\r\n if (options.secret.length < 32) {\r\n logger.warn(\"JWT secret shorter than 32 chars. Consider using stronger secret.\");\r\n // logError(\"JWT secret is too short (minimum 32 characters recommended)\");\r\n }\r\n\r\n this.secret = options.secret;\r\n this.expiresIn = options.expiresIn;\r\n this.algorithm = options.algorithm || 'HS256'; // Default algorithm \r\n this.issuer = options.issuer;\r\n this.audience = options.audience;\r\n }\r\n\r\n sign(payload: object, options?: SignOptions) {\r\n try {\r\n const jwtOptions: jwt.SignOptions = {\r\n algorithm: this.algorithm,\r\n issuer: options?.issuer || this.issuer,\r\n audience: options?.audience || this.audience,\r\n jwtid: options?.jti || randomUUID(), \r\n subject: options?.subject\r\n };\r\n\r\n if (options?.expiresIn !== undefined) {\r\n jwtOptions.expiresIn = options.expiresIn as number;\r\n } else if (this.expiresIn !== undefined) {\r\n jwtOptions.expiresIn = this.expiresIn as number;\r\n }\r\n\r\n return jwt.sign(payload, this.secret, jwtOptions);\r\n\r\n } catch (err: any) {\r\n logError(\"JWTAdapter.sign failed\", { error: err?.message });\r\n throw new AdapterError(err?.message || \"JWT sign failed\");\r\n }\r\n }\r\n\r\n verify(token: string, options?: { audience?: string | string[] }) {\r\n try {\r\n const verifyOptions: jwt.VerifyOptions = {\r\n algorithms: [this.algorithm],\r\n issuer: this.issuer,\r\n audience: options?.audience as string || this.audience as string\r\n };\r\n\r\n return jwt.verify(token, this.secret, verifyOptions);\r\n } catch (err: any) {\r\n logError(\"JWTAdapter.verify failed\", { error: err?.message });\r\n \r\n \r\n if (err.name === 'TokenExpiredError') {\r\n throw new AdapterError(\"JWT token has expired\");\r\n }\r\n if (err.name === 'JsonWebTokenError') {\r\n throw new AdapterError(\"Invalid JWT token\");\r\n }\r\n \r\n throw new AdapterError(err?.message || \"JWT verification failed\");\r\n }\r\n }\r\n}"]}
@@ -27,7 +27,7 @@ class RLFlexibleAdapter {
27
27
  }
28
28
  catch (err) {
29
29
  const rlErr = err;
30
- index_js_1.logger.warn("RLFlexibleAdapter: rate limit exceeded", {
30
+ index_js_1.logger.warn("RLFlexibleAdapter: rate limit exceeded", {
31
31
  ip,
32
32
  path: req.path,
33
33
  method: req.method,
@@ -44,7 +44,7 @@ class RLFlexibleAdapter {
44
44
  };
45
45
  }
46
46
  catch (err) {
47
- index_js_1.logger.error("RLFlexibleAdapter: failed to initialize limiter", {
47
+ index_js_1.logger.error("RLFlexibleAdapter: failed to initialize limiter", {
48
48
  error: err?.message || err
49
49
  });
50
50
  throw new AdapterError_js_1.AdapterError("RateLimiterFlexible creation failed.");
@@ -1 +1 @@
1
- {"version":3,"file":"RLFlexibleAdapter.js","sourceRoot":"","sources":["../../src/adapters/RLFlexibleAdapter.ts"],"names":[],"mappings":";;;AAAA,iEAA0E;AAC1E,kDAA6C;AAC7C,oEAA8D;AAS9D,MAAa,iBAAiB;IAC1B,aAAa,CAAC,UAAqB,EAAE;QACjC,IAAI,CAAC;YACD,MAAM,cAAc,GAAG;gBACnB,MAAM,EAAE,GAAG;gBACX,QAAQ,EAAE,EAAE;gBACZ,OAAO,EAAE,+BAA+B;gBACxC,aAAa,EAAE,CAAC;aACnB,CAAC;YAEF,MAAM,YAAY,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC;YAEvD,MAAM,OAAO,GAAG,IAAI,yCAAiB,CAAC;gBAClC,MAAM,EAAE,YAAY,CAAC,MAAM;gBAC3B,QAAQ,EAAE,YAAY,CAAC,QAAQ;gBAC/B,aAAa,EAAE,YAAY,CAAC,aAAa;aAC5C,CAAC,CAAC;YAEH,OAAO,KAAK,EAAE,GAAQ,EAAE,GAAQ,EAAE,IAAS,EAAE,EAAE;gBAE3C,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBAE/B,IAAI,CAAC;oBACD,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAC1B,IAAI,EAAE,CAAC;gBACX,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAChB,MAAM,KAAK,GAAG,GAAqB,CAAC;oBAEpC,iBAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE;wBACpD,EAAE;wBACF,IAAI,EAAE,GAAG,CAAC,IAAI;wBACd,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,UAAU,EAAE,KAAK,CAAC,YAAY;qBACjC,CAAC,CAAC;oBAEH,GAAG,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC;oBAEnE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBACxB,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,qBAAqB;wBAC5B,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;wBAChD,OAAO,EAAE,YAAY,CAAC,OAAO;qBAChC,CAAC,CAAC;gBACP,CAAC;YACL,CAAC,CAAC;QAEN,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,iBAAM,CAAC,KAAK,CAAC,mDAAmD,EAAE;gBAC9D,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,GAAG;aAC7B,CAAC,CAAC;YACH,MAAM,IAAI,8BAAY,CAAC,sCAAsC,CAAC,CAAC;QACnE,CAAC;IACL,CAAC;IAEO,SAAS,CAAC,GAAQ;QACtB,OAAO,CACH,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC;YACxB,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;YACrD,GAAG,CAAC,EAAE;YACN,GAAG,CAAC,UAAU,EAAE,aAAa;YAC7B,GAAG,CAAC,MAAM,EAAE,aAAa;YACzB,SAAS,CACZ,CAAC;IACN,CAAC;CACJ;AAhED,8CAgEC","sourcesContent":["import { RateLimiterMemory, RateLimiterRes } from \"rate-limiter-flexible\";\r\nimport { logger } from \"../logging/index.js\";\r\nimport { AdapterError } from \"../core/errors/AdapterError.js\";\r\n\r\nexport interface RLOptions {\r\n points?: number;\r\n duration?: number; \r\n message?: any;\r\n blockDuration?: number;\r\n}\r\n\r\nexport class RLFlexibleAdapter {\r\n getMiddleware(options: RLOptions = {}) {\r\n try {\r\n const defaultOptions = {\r\n points: 100,\r\n duration: 60,\r\n message: \"Too many requests, slow down.\",\r\n blockDuration: 0\r\n };\r\n\r\n const finalOptions = { ...defaultOptions, ...options };\r\n\r\n const limiter = new RateLimiterMemory({\r\n points: finalOptions.points,\r\n duration: finalOptions.duration,\r\n blockDuration: finalOptions.blockDuration\r\n });\r\n\r\n return async (req: any, res: any, next: any) => {\r\n \r\n const ip = this.extractIP(req);\r\n\r\n try {\r\n await limiter.consume(ip);\r\n next();\r\n } catch (err: any) {\r\n const rlErr = err as RateLimiterRes;\r\n\r\n logger.warn(\"RLFlexibleAdapter: rate limit exceeded\", {\r\n ip,\r\n path: req.path,\r\n method: req.method,\r\n retryAfter: rlErr.msBeforeNext\r\n });\r\n\r\n res.setHeader('Retry-After', Math.ceil(rlErr.msBeforeNext / 1000));\r\n \r\n return res.status(429).json({\r\n success: false,\r\n error: \"RATE_LIMIT_EXCEEDED\",\r\n retryAfter: Math.ceil(rlErr.msBeforeNext / 1000),\r\n message: finalOptions.message\r\n });\r\n }\r\n };\r\n\r\n } catch (err: any) {\r\n logger.error(\"RLFlexibleAdapter: failed to initialize limiter\", {\r\n error: err?.message || err\r\n });\r\n throw new AdapterError(\"RateLimiterFlexible creation failed.\");\r\n }\r\n }\r\n\r\n private extractIP(req: any): string {\r\n return (\r\n req.headers['x-real-ip'] ||\r\n req.headers['x-forwarded-for']?.split(',')[0]?.trim() ||\r\n req.ip ||\r\n req.connection?.remoteAddress ||\r\n req.socket?.remoteAddress ||\r\n 'unknown'\r\n );\r\n }\r\n}"]}
1
+ {"version":3,"file":"RLFlexibleAdapter.js","sourceRoot":"","sources":["../../src/adapters/RLFlexibleAdapter.ts"],"names":[],"mappings":";;;AAAA,iEAA0E;AAC1E,kDAA6C;AAC7C,oEAA8D;AAS9D,MAAa,iBAAiB;IAC1B,aAAa,CAAC,UAAqB,EAAE;QACjC,IAAI,CAAC;YACD,MAAM,cAAc,GAAG;gBACnB,MAAM,EAAE,GAAG;gBACX,QAAQ,EAAE,EAAE;gBACZ,OAAO,EAAE,+BAA+B;gBACxC,aAAa,EAAE,CAAC;aACnB,CAAC;YAEF,MAAM,YAAY,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC;YAEvD,MAAM,OAAO,GAAG,IAAI,yCAAiB,CAAC;gBAClC,MAAM,EAAE,YAAY,CAAC,MAAM;gBAC3B,QAAQ,EAAE,YAAY,CAAC,QAAQ;gBAC/B,aAAa,EAAE,YAAY,CAAC,aAAa;aAC5C,CAAC,CAAC;YAEH,OAAO,KAAK,EAAE,GAAQ,EAAE,GAAQ,EAAE,IAAS,EAAE,EAAE;gBAE3C,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBAE/B,IAAI,CAAC;oBACD,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAC1B,IAAI,EAAE,CAAC;gBACX,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAChB,MAAM,KAAK,GAAG,GAAqB,CAAC;oBAEpC,iBAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE;wBAClD,EAAE;wBACF,IAAI,EAAE,GAAG,CAAC,IAAI;wBACd,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,UAAU,EAAE,KAAK,CAAC,YAAY;qBACjC,CAAC,CAAC;oBAEH,GAAG,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC;oBAEnE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBACxB,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,qBAAqB;wBAC5B,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;wBAChD,OAAO,EAAE,YAAY,CAAC,OAAO;qBAChC,CAAC,CAAC;gBACP,CAAC;YACL,CAAC,CAAC;QAEN,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,iBAAM,CAAC,KAAK,CAAC,iDAAiD,EAAE;gBAC5D,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,GAAG;aAC7B,CAAC,CAAC;YACH,MAAM,IAAI,8BAAY,CAAC,sCAAsC,CAAC,CAAC;QACnE,CAAC;IACL,CAAC;IAEO,SAAS,CAAC,GAAQ;QACtB,OAAO,CACH,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC;YACxB,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;YACrD,GAAG,CAAC,EAAE;YACN,GAAG,CAAC,UAAU,EAAE,aAAa;YAC7B,GAAG,CAAC,MAAM,EAAE,aAAa;YACzB,SAAS,CACZ,CAAC;IACN,CAAC;CACJ;AAhED,8CAgEC","sourcesContent":["import { RateLimiterMemory, RateLimiterRes } from \"rate-limiter-flexible\";\r\nimport { logger } from \"../logging/index.js\";\r\nimport { AdapterError } from \"../core/errors/AdapterError.js\";\r\n\r\nexport interface RLOptions {\r\n points?: number;\r\n duration?: number; \r\n message?: any;\r\n blockDuration?: number;\r\n}\r\n\r\nexport class RLFlexibleAdapter {\r\n getMiddleware(options: RLOptions = {}) {\r\n try {\r\n const defaultOptions = {\r\n points: 100,\r\n duration: 60,\r\n message: \"Too many requests, slow down.\",\r\n blockDuration: 0\r\n };\r\n\r\n const finalOptions = { ...defaultOptions, ...options };\r\n\r\n const limiter = new RateLimiterMemory({\r\n points: finalOptions.points,\r\n duration: finalOptions.duration,\r\n blockDuration: finalOptions.blockDuration\r\n });\r\n\r\n return async (req: any, res: any, next: any) => {\r\n \r\n const ip = this.extractIP(req);\r\n\r\n try {\r\n await limiter.consume(ip);\r\n next();\r\n } catch (err: any) {\r\n const rlErr = err as RateLimiterRes;\r\n\r\n logger.warn(\"RLFlexibleAdapter: rate limit exceeded\", {\r\n ip,\r\n path: req.path,\r\n method: req.method,\r\n retryAfter: rlErr.msBeforeNext\r\n });\r\n\r\n res.setHeader('Retry-After', Math.ceil(rlErr.msBeforeNext / 1000));\r\n \r\n return res.status(429).json({\r\n success: false,\r\n error: \"RATE_LIMIT_EXCEEDED\",\r\n retryAfter: Math.ceil(rlErr.msBeforeNext / 1000),\r\n message: finalOptions.message\r\n });\r\n }\r\n };\r\n\r\n } catch (err: any) {\r\n logger.error(\"RLFlexibleAdapter: failed to initialize limiter\", {\r\n error: err?.message || err\r\n });\r\n throw new AdapterError(\"RateLimiterFlexible creation failed.\");\r\n }\r\n }\r\n\r\n private extractIP(req: any): string {\r\n return (\r\n req.headers['x-real-ip'] ||\r\n req.headers['x-forwarded-for']?.split(',')[0]?.trim() ||\r\n req.ip ||\r\n req.connection?.remoteAddress ||\r\n req.socket?.remoteAddress ||\r\n 'unknown'\r\n );\r\n }\r\n}"]}
@@ -18,7 +18,7 @@ class SanitizeHtmlAdapter {
18
18
  return typeof clean === "string" ? clean : String(clean);
19
19
  }
20
20
  catch (err) {
21
- index_js_1.logger.error("sanitize-html failed", {
21
+ index_js_1.logger.error("sanitize-html failed", {
22
22
  error: err?.message || err,
23
23
  preview: typeof input === "string" ? input.slice(0, 100) : undefined
24
24
  });
@@ -53,14 +53,14 @@ class SanitizeHtmlAdapter {
53
53
  try {
54
54
  if (req.body) {
55
55
  req.body = this.deepSanitize(req.body, dynamicOptions);
56
- index_js_1.logger.debug("🧼 sanitize-html applied", {
56
+ index_js_1.logger.debug("sanitize-html applied", {
57
57
  keys: Object.keys(req.body)
58
58
  });
59
59
  }
60
60
  next();
61
61
  }
62
62
  catch (err) {
63
- index_js_1.logger.error("sanitize-html middleware failed", {
63
+ index_js_1.logger.error("sanitize-html middleware failed", {
64
64
  error: err?.message || err
65
65
  });
66
66
  next(err);
@@ -1 +1 @@
1
- {"version":3,"file":"SanitizeHtmlAdapter.js","sourceRoot":"","sources":["../../src/adapters/SanitizeHtmlAdapter.ts"],"names":[],"mappings":";;;;;;AAAA,kEAAyC;AACzC,oEAA8D;AAC9D,kDAA6C;AAE7C,MAAa,mBAAmB;IAG5B,YAAY,UAAiC,EAAE;QAC3C,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;IACjC,CAAC;IAED,QAAQ,CAAC,KAAa,EAAE,cAAoB;QACxC,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,EAAE,CAAC;YAElE,MAAM,KAAK,GAAG,IAAA,uBAAY,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE7D,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,iBAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE;gBACnC,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,GAAG;gBAC1B,OAAO,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;aACvE,CAAC,CAAC;YAEH,MAAM,IAAI,8BAAY,CAAC,+BAA+B,CAAC,CAAC;QAC5D,CAAC;IACL,CAAC;IAED,mCAAmC;IAC3B,YAAY,CAAC,GAAQ,EAAE,cAAoB,EAAE,OAAO,GAAG,IAAI,OAAO,EAAE;QAExE,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACjC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,OAAO,GAAG,CAAC;YACf,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;QAC/E,CAAC;QAED,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,MAAM,GAAQ,EAAE,CAAC;YACvB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;YACvE,CAAC;YACD,OAAO,MAAM,CAAC;QAClB,CAAC;QAED,OAAO,GAAG,CAAC;IACf,CAAC;IAED,UAAU,CAAC,cAAoB;QAC3B,OAAO,CAAC,GAAQ,EAAE,IAAS,EAAE,IAAS,EAAE,EAAE;YACtC,IAAI,CAAC;gBACD,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;oBACX,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;oBAEvD,iBAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE;wBACrC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;qBAC9B,CAAC,CAAC;gBACP,CAAC;gBACD,IAAI,EAAE,CAAC;YAEX,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,iBAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE;oBAC9C,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,GAAG;iBAC7B,CAAC,CAAC;gBACH,IAAI,CAAC,GAAG,CAAC,CAAC;YACd,CAAC;QACL,CAAC,CAAC;IACN,CAAC;CACJ;AAzED,kDAyEC","sourcesContent":["import sanitizeHtml from \"sanitize-html\";\r\nimport { AdapterError } from \"../core/errors/AdapterError.js\";\r\nimport { logger } from \"../logging/index.js\";\r\n\r\nexport class SanitizeHtmlAdapter {\r\n private globalOptions: sanitizeHtml.IOptions;\r\n\r\n constructor(options: sanitizeHtml.IOptions = {}) {\r\n this.globalOptions = options;\r\n }\r\n\r\n sanitize(input: string, dynamicOptions?: any): string {\r\n try {\r\n const opts = { ...this.globalOptions, ...(dynamicOptions || {}) };\r\n\r\n const clean = sanitizeHtml(input, opts);\r\n return typeof clean === \"string\" ? clean : String(clean);\r\n\r\n } catch (err: any) {\r\n logger.error(\"sanitize-html failed\", {\r\n error: err?.message || err,\r\n preview: typeof input === \"string\" ? input.slice(0, 100) : undefined\r\n });\r\n\r\n throw new AdapterError(\"sanitize-html adapter failed.\");\r\n }\r\n }\r\n\r\n // Deep Sanitization - Recursively \r\n private deepSanitize(obj: any, dynamicOptions?: any, visited = new WeakSet()): any {\r\n \r\n if (obj && typeof obj === \"object\") {\r\n if (visited.has(obj)) {\r\n return obj; \r\n }\r\n visited.add(obj);\r\n }\r\n\r\n if (typeof obj === \"string\") {\r\n return this.sanitize(obj, dynamicOptions);\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map((item) => this.deepSanitize(item, dynamicOptions, visited));\r\n }\r\n\r\n if (obj && typeof obj === \"object\") {\r\n const result: any = {};\r\n for (const key of Object.keys(obj)) {\r\n result[key] = this.deepSanitize(obj[key], dynamicOptions, visited);\r\n }\r\n return result;\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n middleware(dynamicOptions?: any) {\r\n return (req: any, _res: any, next: any) => {\r\n try {\r\n if (req.body) {\r\n req.body = this.deepSanitize(req.body, dynamicOptions);\r\n\r\n logger.debug(\"🧼 sanitize-html applied\", {\r\n keys: Object.keys(req.body)\r\n });\r\n }\r\n next();\r\n\r\n } catch (err: any) {\r\n logger.error(\"sanitize-html middleware failed\", {\r\n error: err?.message || err\r\n });\r\n next(err);\r\n }\r\n };\r\n }\r\n}"]}
1
+ {"version":3,"file":"SanitizeHtmlAdapter.js","sourceRoot":"","sources":["../../src/adapters/SanitizeHtmlAdapter.ts"],"names":[],"mappings":"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","sourcesContent":["import sanitizeHtml from \"sanitize-html\";\r\nimport { AdapterError } from \"../core/errors/AdapterError.js\";\r\nimport { logger } from \"../logging/index.js\";\r\n\r\nexport class SanitizeHtmlAdapter {\r\n private globalOptions: sanitizeHtml.IOptions;\r\n\r\n constructor(options: sanitizeHtml.IOptions = {}) {\r\n this.globalOptions = options;\r\n }\r\n\r\n sanitize(input: string, dynamicOptions?: any): string {\r\n try {\r\n const opts = { ...this.globalOptions, ...(dynamicOptions || {}) };\r\n\r\n const clean = sanitizeHtml(input, opts);\r\n return typeof clean === \"string\" ? clean : String(clean);\r\n\r\n } catch (err: any) {\r\n logger.error(\"sanitize-html failed\", {\r\n error: err?.message || err,\r\n preview: typeof input === \"string\" ? input.slice(0, 100) : undefined\r\n });\r\n\r\n throw new AdapterError(\"sanitize-html adapter failed.\");\r\n }\r\n }\r\n\r\n // Deep Sanitization - Recursively \r\n private deepSanitize(obj: any, dynamicOptions?: any, visited = new WeakSet()): any {\r\n \r\n if (obj && typeof obj === \"object\") {\r\n if (visited.has(obj)) {\r\n return obj; \r\n }\r\n visited.add(obj);\r\n }\r\n\r\n if (typeof obj === \"string\") {\r\n return this.sanitize(obj, dynamicOptions);\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map((item) => this.deepSanitize(item, dynamicOptions, visited));\r\n }\r\n\r\n if (obj && typeof obj === \"object\") {\r\n const result: any = {};\r\n for (const key of Object.keys(obj)) {\r\n result[key] = this.deepSanitize(obj[key], dynamicOptions, visited);\r\n }\r\n return result;\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n middleware(dynamicOptions?: any) {\r\n return (req: any, _res: any, next: any) => {\r\n try {\r\n if (req.body) {\r\n req.body = this.deepSanitize(req.body, dynamicOptions);\r\n\r\n logger.debug(\"sanitize-html applied\", {\r\n keys: Object.keys(req.body)\r\n });\r\n }\r\n next();\r\n\r\n } catch (err: any) {\r\n logger.error(\"sanitize-html middleware failed\", {\r\n error: err?.message || err\r\n });\r\n next(err);\r\n }\r\n };\r\n }\r\n}"]}
@@ -37,7 +37,7 @@ class XSSAdapter {
37
37
  return customFilter.process(input);
38
38
  }
39
39
  catch (err) {
40
- index_js_1.logger.error("XSS sanitizer failed", {
40
+ index_js_1.logger.error("XSS sanitizer failed", {
41
41
  error: err?.message,
42
42
  preview: input?.slice?.(0, 80)
43
43
  });
@@ -68,7 +68,7 @@ class XSSAdapter {
68
68
  }
69
69
  }
70
70
  req.sanitizedBody = sanitizedBody;
71
- index_js_1.logger.debug("🛡️ XSS sanitizer applied", {
71
+ index_js_1.logger.debug("XSS sanitizer applied", {
72
72
  originalKeys: Object.keys(originalBody),
73
73
  sanitizedKeys: Object.keys(sanitizedBody)
74
74
  });
@@ -76,7 +76,7 @@ class XSSAdapter {
76
76
  next();
77
77
  }
78
78
  catch (err) {
79
- index_js_1.logger.error("XSS middleware failed", {
79
+ index_js_1.logger.error("XSS middleware failed", {
80
80
  error: err?.message || err
81
81
  });
82
82
  next(err);
@@ -1 +1 @@
1
- {"version":3,"file":"XSSAdapter.js","sourceRoot":"","sources":["../../src/adapters/XSSAdapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { FilterXSS, getDefaultWhiteList, whiteList } from 'xss';\r\nimport { AdapterError } from \"../core/errors/AdapterError.js\";\r\nimport { logger } from \"../logging/index.js\";\r\n\r\nexport interface XSSOptions {\r\n whiteList?: typeof whiteList;\r\n stripIgnoreTag?: boolean;\r\n stripIgnoreTagBody?: string[];\r\n allowCommentTag?: boolean;\r\n css?: boolean | { [key: string]: boolean };\r\n onTag?: (tag: string, html: string, options: any) => string;\r\n onTagAttr?: (tag: string, name: string, value: string, isWhiteAttr: boolean) => string;\r\n onIgnoreTag?: (tag: string, html: string, options: any) => string;\r\n [key: string]: any;\r\n}\r\n\r\nexport class XSSAdapter {\r\n private globalOptions: XSSOptions;\r\n private defaultFilter: FilterXSS;\r\n\r\n constructor(options: XSSOptions = {}) {\r\n this.globalOptions = options;\r\n \r\n // Default safe configuration\r\n const defaultOptions: XSSOptions = {\r\n whiteList: getDefaultWhiteList(),\r\n stripIgnoreTag: true, \r\n stripIgnoreTagBody: ['script', 'style', 'iframe', 'object', 'embed'],\r\n allowCommentTag: false,\r\n css: false, \r\n onTag: (tag, html, options) => {\r\n \r\n if (tag === 'a') {\r\n return html.replace(/<a /i, '<a target=\"_blank\" rel=\"noopener noreferrer\" ');\r\n }\r\n return html;\r\n }\r\n };\r\n\r\n const finalOptions = { ...defaultOptions, ...options };\r\n this.defaultFilter = new FilterXSS(finalOptions);\r\n }\r\n\r\n \r\n sanitize(input: string, dynamicOptions?: XSSOptions): string {\r\n try {\r\n if (typeof input !== \"string\") {\r\n return input as any;\r\n }\r\n\r\n \r\n if (!dynamicOptions || Object.keys(dynamicOptions).length === 0) {\r\n return this.defaultFilter.process(input);\r\n }\r\n\r\n \r\n const mergedOptions = { ...this.globalOptions, ...dynamicOptions };\r\n const customFilter = new FilterXSS(mergedOptions);\r\n \r\n return customFilter.process(input);\r\n\r\n } catch (err: any) {\r\n logger.error(\"XSS sanitizer failed\", {\r\n error: err?.message,\r\n preview: input?.slice?.(0, 80)\r\n });\r\n throw new AdapterError(\"XSS sanitizer failed.\");\r\n }\r\n }\r\n\r\n \r\n middleware(dynamicOptions?: XSSOptions) {\r\n return (req: any, _res: any, next: any) => {\r\n try {\r\n if (req.body && typeof req.body === \"object\") {\r\n const originalBody = req.body;\r\n const sanitizedBody: any = Array.isArray(originalBody) ? [] : {};\r\n \r\n for (const key of Object.keys(originalBody)) {\r\n const val = originalBody[key];\r\n\r\n if (typeof val === \"string\") {\r\n sanitizedBody[key] = this.sanitize(val, dynamicOptions);\r\n } else if (Array.isArray(val)) {\r\n sanitizedBody[key] = val.map((v) =>\r\n typeof v === \"string\"\r\n ? this.sanitize(v, dynamicOptions)\r\n : v\r\n );\r\n } else if (val && typeof val === \"object\") {\r\n \r\n sanitizedBody[key] = this.deepSanitize(val, dynamicOptions);\r\n } else {\r\n sanitizedBody[key] = val;\r\n }\r\n }\r\n \r\n \r\n req.sanitizedBody = sanitizedBody;\r\n \r\n logger.debug(\"🛡️ XSS sanitizer applied\", {\r\n originalKeys: Object.keys(originalBody),\r\n sanitizedKeys: Object.keys(sanitizedBody)\r\n });\r\n }\r\n\r\n next();\r\n } catch (err: any) {\r\n logger.error(\"XSS middleware failed\", {\r\n error: err?.message || err\r\n });\r\n next(err);\r\n }\r\n };\r\n }\r\n\r\n \r\n private deepSanitize(obj: any, options?: XSSOptions, visited = new WeakSet()): any {\r\n \r\n if (obj && typeof obj === \"object\") {\r\n if (visited.has(obj)) {\r\n return obj;\r\n }\r\n visited.add(obj);\r\n }\r\n\r\n if (typeof obj === \"string\") {\r\n return this.sanitize(obj, options);\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map(item => this.deepSanitize(item, options, visited));\r\n }\r\n\r\n if (obj && typeof obj === \"object\") {\r\n const result: any = {};\r\n for (const key of Object.keys(obj)) {\r\n result[key] = this.deepSanitize(obj[key], options, visited);\r\n }\r\n return result;\r\n }\r\n\r\n return obj;\r\n }\r\n}"]}
1
+ {"version":3,"file":"XSSAdapter.js","sourceRoot":"","sources":["../../src/adapters/XSSAdapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { FilterXSS, getDefaultWhiteList, whiteList } from 'xss';\r\nimport { AdapterError } from \"../core/errors/AdapterError.js\";\r\nimport { logger } from \"../logging/index.js\";\r\n\r\nexport interface XSSOptions {\r\n whiteList?: typeof whiteList;\r\n stripIgnoreTag?: boolean;\r\n stripIgnoreTagBody?: string[];\r\n allowCommentTag?: boolean;\r\n css?: boolean | { [key: string]: boolean };\r\n onTag?: (tag: string, html: string, options: any) => string;\r\n onTagAttr?: (tag: string, name: string, value: string, isWhiteAttr: boolean) => string;\r\n onIgnoreTag?: (tag: string, html: string, options: any) => string;\r\n [key: string]: any;\r\n}\r\n\r\nexport class XSSAdapter {\r\n private globalOptions: XSSOptions;\r\n private defaultFilter: FilterXSS;\r\n\r\n constructor(options: XSSOptions = {}) {\r\n this.globalOptions = options;\r\n \r\n // Default safe configuration\r\n const defaultOptions: XSSOptions = {\r\n whiteList: getDefaultWhiteList(),\r\n stripIgnoreTag: true, \r\n stripIgnoreTagBody: ['script', 'style', 'iframe', 'object', 'embed'],\r\n allowCommentTag: false,\r\n css: false, \r\n onTag: (tag, html, options) => {\r\n \r\n if (tag === 'a') {\r\n return html.replace(/<a /i, '<a target=\"_blank\" rel=\"noopener noreferrer\" ');\r\n }\r\n return html;\r\n }\r\n };\r\n\r\n const finalOptions = { ...defaultOptions, ...options };\r\n this.defaultFilter = new FilterXSS(finalOptions);\r\n }\r\n\r\n \r\n sanitize(input: string, dynamicOptions?: XSSOptions): string {\r\n try {\r\n if (typeof input !== \"string\") {\r\n return input as any;\r\n }\r\n\r\n \r\n if (!dynamicOptions || Object.keys(dynamicOptions).length === 0) {\r\n return this.defaultFilter.process(input);\r\n }\r\n\r\n \r\n const mergedOptions = { ...this.globalOptions, ...dynamicOptions };\r\n const customFilter = new FilterXSS(mergedOptions);\r\n \r\n return customFilter.process(input);\r\n\r\n } catch (err: any) {\r\n logger.error(\"XSS sanitizer failed\", {\r\n error: err?.message,\r\n preview: input?.slice?.(0, 80)\r\n });\r\n throw new AdapterError(\"XSS sanitizer failed.\");\r\n }\r\n }\r\n\r\n \r\n middleware(dynamicOptions?: XSSOptions) {\r\n return (req: any, _res: any, next: any) => {\r\n try {\r\n if (req.body && typeof req.body === \"object\") {\r\n const originalBody = req.body;\r\n const sanitizedBody: any = Array.isArray(originalBody) ? [] : {};\r\n \r\n for (const key of Object.keys(originalBody)) {\r\n const val = originalBody[key];\r\n\r\n if (typeof val === \"string\") {\r\n sanitizedBody[key] = this.sanitize(val, dynamicOptions);\r\n } else if (Array.isArray(val)) {\r\n sanitizedBody[key] = val.map((v) =>\r\n typeof v === \"string\"\r\n ? this.sanitize(v, dynamicOptions)\r\n : v\r\n );\r\n } else if (val && typeof val === \"object\") {\r\n \r\n sanitizedBody[key] = this.deepSanitize(val, dynamicOptions);\r\n } else {\r\n sanitizedBody[key] = val;\r\n }\r\n }\r\n \r\n \r\n req.sanitizedBody = sanitizedBody;\r\n \r\n logger.debug(\"XSS sanitizer applied\", {\r\n originalKeys: Object.keys(originalBody),\r\n sanitizedKeys: Object.keys(sanitizedBody)\r\n });\r\n }\r\n\r\n next();\r\n } catch (err: any) {\r\n logger.error(\"XSS middleware failed\", {\r\n error: err?.message || err\r\n });\r\n next(err);\r\n }\r\n };\r\n }\r\n\r\n \r\n private deepSanitize(obj: any, options?: XSSOptions, visited = new WeakSet()): any {\r\n \r\n if (obj && typeof obj === \"object\") {\r\n if (visited.has(obj)) {\r\n return obj;\r\n }\r\n visited.add(obj);\r\n }\r\n\r\n if (typeof obj === \"string\") {\r\n return this.sanitize(obj, options);\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map(item => this.deepSanitize(item, options, visited));\r\n }\r\n\r\n if (obj && typeof obj === \"object\") {\r\n const result: any = {};\r\n for (const key of Object.keys(obj)) {\r\n result[key] = this.deepSanitize(obj[key], options, visited);\r\n }\r\n return result;\r\n }\r\n\r\n return obj;\r\n }\r\n}"]}
@@ -21,7 +21,7 @@ class ZodAdapter {
21
21
  path: issue.path.join("."),
22
22
  code: issue.code
23
23
  }));
24
- index_js_1.logger.warn("Zod validation failed", {
24
+ index_js_1.logger.warn("Zod validation failed", {
25
25
  path: req.path,
26
26
  method: req.method,
27
27
  issues,
@@ -1 +1 @@
1
- {"version":3,"file":"ZodAdapter.js","sourceRoot":"","sources":["../../src/adapters/ZodAdapter.ts"],"names":[],"mappings":";;;AACA,0EAAoE;AACpE,kDAA6C;AAE7C,MAAa,UAAU;IAGnB,YAAY,YAAwB;QAChC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACrC,CAAC;IAED,QAAQ,CAAC,aAAyB;QAC9B,OAAO,CAAC,GAAQ,EAAE,GAAQ,EAAE,IAAS,EAAE,EAAE;YACrC,MAAM,MAAM,GAAG,aAAa,IAAI,IAAI,CAAC,YAAY,CAAC;YAElD,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAE1C,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,IAAI,EAAE,CAAC;YAElC,MAAM,MAAM,GAAa,MAAM,CAAC,KAAK,CAAC;YAEtC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACvC,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;aACnB,CAAC,CAAC,CAAC;YAEJ,iBAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBACnC,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,MAAM;gBACN,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;aAClD,CAAC,CAAC;YAEH,OAAO,IAAI,CACP,IAAI,oCAAe,CAAC,oBAAoB,EAAE,MAAa,CAAC,CAC3D,CAAC;QACN,CAAC,CAAC;IACN,CAAC;CACJ;AArCD,gCAqCC","sourcesContent":["import { ZodSchema, ZodError } from \"zod\";\r\nimport { ValidationError } from \"../core/errors/ValidationError.js\"; \r\nimport { logger } from \"../logging/index.js\";\r\n\r\nexport class ZodAdapter {\r\n private globalSchema?: ZodSchema;\r\n\r\n constructor(globalSchema?: ZodSchema) {\r\n this.globalSchema = globalSchema;\r\n }\r\n\r\n validate(dynamicSchema?: ZodSchema) {\r\n return (req: any, res: any, next: any) => {\r\n const schema = dynamicSchema || this.globalSchema;\r\n\r\n if (!schema) return next();\r\n\r\n const result = schema.safeParse(req.body);\r\n\r\n if (result.success) return next();\r\n\r\n const zodErr: ZodError = result.error;\r\n\r\n const issues = zodErr.issues.map(issue => ({\r\n message: issue.message,\r\n path: issue.path.join(\".\"),\r\n code: issue.code\r\n }));\r\n\r\n logger.warn(\"Zod validation failed\", {\r\n path: req.path,\r\n method: req.method,\r\n issues,\r\n preview: JSON.stringify(req.body).slice(0, 200)\r\n });\r\n\r\n return next(\r\n new ValidationError(\"Validation failed.\", issues as any) \r\n );\r\n };\r\n }\r\n}"]}
1
+ {"version":3,"file":"ZodAdapter.js","sourceRoot":"","sources":["../../src/adapters/ZodAdapter.ts"],"names":[],"mappings":";;;AACA,0EAAoE;AACpE,kDAA6C;AAE7C,MAAa,UAAU;IAGnB,YAAY,YAAwB;QAChC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACrC,CAAC;IAED,QAAQ,CAAC,aAAyB;QAC9B,OAAO,CAAC,GAAQ,EAAE,GAAQ,EAAE,IAAS,EAAE,EAAE;YACrC,MAAM,MAAM,GAAG,aAAa,IAAI,IAAI,CAAC,YAAY,CAAC;YAElD,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,EAAE,CAAC;YAE3B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAE1C,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,IAAI,EAAE,CAAC;YAElC,MAAM,MAAM,GAAa,MAAM,CAAC,KAAK,CAAC;YAEtC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACvC,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;aACnB,CAAC,CAAC,CAAC;YAEJ,iBAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;gBACjC,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,MAAM;gBACN,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;aAClD,CAAC,CAAC;YAEH,OAAO,IAAI,CACP,IAAI,oCAAe,CAAC,oBAAoB,EAAE,MAAa,CAAC,CAC3D,CAAC;QACN,CAAC,CAAC;IACN,CAAC;CACJ;AArCD,gCAqCC","sourcesContent":["import { ZodSchema, ZodError } from \"zod\";\r\nimport { ValidationError } from \"../core/errors/ValidationError.js\"; \r\nimport { logger } from \"../logging/index.js\";\r\n\r\nexport class ZodAdapter {\r\n private globalSchema?: ZodSchema;\r\n\r\n constructor(globalSchema?: ZodSchema) {\r\n this.globalSchema = globalSchema;\r\n }\r\n\r\n validate(dynamicSchema?: ZodSchema) {\r\n return (req: any, res: any, next: any) => {\r\n const schema = dynamicSchema || this.globalSchema;\r\n\r\n if (!schema) return next();\r\n\r\n const result = schema.safeParse(req.body);\r\n\r\n if (result.success) return next();\r\n\r\n const zodErr: ZodError = result.error;\r\n\r\n const issues = zodErr.issues.map(issue => ({\r\n message: issue.message,\r\n path: issue.path.join(\".\"),\r\n code: issue.code\r\n }));\r\n\r\n logger.warn(\"Zod validation failed\", {\r\n path: req.path,\r\n method: req.method,\r\n issues,\r\n preview: JSON.stringify(req.body).slice(0, 200)\r\n });\r\n\r\n return next(\r\n new ValidationError(\"Validation failed.\", issues as any) \r\n );\r\n };\r\n }\r\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"HiSecure.d.ts","sourceRoot":"","sources":["../../src/core/HiSecure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAkB3D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AASzD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAC,MAAM,0BAA0B,CAAC;AAE1E,qBAAa,QAAQ;IACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAyB;IAChD,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,WAAW,CAAS;IAGrB,WAAW,EAAG,WAAW,CAAC;IAC1B,gBAAgB,EAAG,gBAAgB,CAAC;IACpC,gBAAgB,EAAG,gBAAgB,CAAC;IACpC,gBAAgB,EAAG,gBAAgB,CAAC;IACpC,WAAW,EAAG,WAAW,CAAC;IAC1B,WAAW,EAAG,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAGjC,OAAO,CAAC,cAAc,CAAM;IAC5B,OAAO,CAAC,eAAe,CAAM;IAC7B,OAAO,CAAC,kBAAkB,CAAM;IAChC,OAAO,CAAC,mBAAmB,CAAM;IACjC,OAAO,CAAC,gBAAgB,CAAM;IAC9B,OAAO,CAAC,iBAAiB,CAAM;IAG/B,OAAO;IAMP,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,QAAQ;IAQ9D,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B,IAAI,IAAI,IAAI;IAyBZ,aAAa,IAAI,OAAO;IAMxB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;IAQ9D,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,gBAAgB;IAIxC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG;IAI7B,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM;IAe9D,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG;kBA7GJ,CAAC;;;iBAID,CAAC;IA6GtB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG;WAUZ,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;WAMvC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrE,MAAM,CAAC,GAAG;wBACU,MAAM,YAAY,GAAG;wBAQrB,MAAM;;qCASO,MAAM;;MAQrC;IAIF,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ;IAuBvE,OAAO,CAAC,aAAa;IAoCrB,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,qBAAqB;CAmDhC"}
1
+ {"version":3,"file":"HiSecure.d.ts","sourceRoot":"","sources":["../../src/core/HiSecure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAkB3D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AASzD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAC,MAAM,0BAA0B,CAAC;AAE1E,qBAAa,QAAQ;IACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAyB;IAChD,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,WAAW,CAAS;IAGrB,WAAW,EAAG,WAAW,CAAC;IAC1B,gBAAgB,EAAG,gBAAgB,CAAC;IACpC,gBAAgB,EAAG,gBAAgB,CAAC;IACpC,gBAAgB,EAAG,gBAAgB,CAAC;IACpC,WAAW,EAAG,WAAW,CAAC;IAC1B,WAAW,EAAG,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAGjC,OAAO,CAAC,cAAc,CAAM;IAC5B,OAAO,CAAC,eAAe,CAAM;IAC7B,OAAO,CAAC,kBAAkB,CAAM;IAChC,OAAO,CAAC,mBAAmB,CAAM;IACjC,OAAO,CAAC,gBAAgB,CAAM;IAC9B,OAAO,CAAC,iBAAiB,CAAM;IAG/B,OAAO;IAMP,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,QAAQ;IAQ9D,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B,IAAI,IAAI,IAAI;IA0BZ,aAAa,IAAI,OAAO;IAMxB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;IAQ9D,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,gBAAgB;IAIxC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG;IAI7B,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM;IAe9D,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG;kBA9GJ,CAAC;;;iBAID,CAAC;IA8GtB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG;WAUZ,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;WAMvC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrE,MAAM,CAAC,GAAG;wBACU,MAAM,YAAY,GAAG;wBAQrB,MAAM;;qCASO,MAAM;;MAQrC;IAIF,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ;IAuBvE,OAAO,CAAC,aAAa;IAqCrB,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,qBAAqB;CAmDhC"}
@@ -50,14 +50,15 @@ class HiSecure {
50
50
  }
51
51
  init() {
52
52
  if (this.initialized) {
53
- index_js_1.logger.warn(" HiSecure already initialized");
53
+ index_js_1.logger.warn(" HiSecure already initialized");
54
54
  return;
55
55
  }
56
- index_js_1.logger.info(`🔐 ${constants_js_1.LIB_NAME} v${constants_js_1.LIB_VERSION} initializing...`);
56
+ index_js_1.logger.info(` ${constants_js_1.LIB_NAME} v${constants_js_1.LIB_VERSION} initializing...`);
57
57
  this.setupAdapters();
58
58
  this.setupManagers();
59
59
  this.setupDynamicManagers();
60
60
  (0, deepFreeze_js_1.deepFreeze)(this.config);
61
+ // deep Freeze - for now we remove from manager it needs to manage the adapters
61
62
  // deepFreeze(this.hashManager);
62
63
  // deepFreeze(this.rateLimitManager);
63
64
  // deepFreeze(this.validatorManager);
@@ -66,7 +67,7 @@ class HiSecure {
66
67
  // deepFreeze(this.corsManager);
67
68
  // if (this.authManager) deepFreeze(this.authManager);
68
69
  this.initialized = true;
69
- index_js_1.logger.info("HiSecure initialized successfully");
70
+ index_js_1.logger.info("HiSecure initialized successfully");
70
71
  }
71
72
  isInitialized() {
72
73
  return this.initialized;
@@ -107,7 +108,7 @@ class HiSecure {
107
108
  chain.push(instance.jsonManager.urlencoded());
108
109
  return chain;
109
110
  }
110
- // UTILITY METHODS (Direct usage)
111
+ // UTILITY METHODS - For direct use
111
112
  static async hash(password) {
112
113
  const instance = this.getInstance();
113
114
  const result = await instance.hashManager.hash(password, { allowFallback: true });
@@ -136,7 +137,7 @@ class HiSecure {
136
137
  }
137
138
  // Internal Methods
138
139
  setupAdapters() {
139
- index_js_1.logger.info("🧩 Setting up adapters...");
140
+ index_js_1.logger.info(" Setting up adapters...");
140
141
  // Hashing
141
142
  this.hashingPrimary = this.config.hashing.primary === "argon2"
142
143
  ? new ArgonAdapter_js_1.ArgonAdapter()
@@ -149,7 +150,7 @@ class HiSecure {
149
150
  ? new RLFlexibleAdapter_js_1.RLFlexibleAdapter()
150
151
  : new ExpressRLAdapter_js_1.ExpressRLAdapter();
151
152
  this.rateLimiterFallback = new ExpressRLAdapter_js_1.ExpressRLAdapter();
152
- // // Validation
153
+ // // Validation - we handle this in d/f way for now
153
154
  // this.validatorPrimary = this.config.validation.mode === "zod"
154
155
  // ? new ZodAdapter()
155
156
  // : new ExpressValidatorAdapter();
@@ -159,7 +160,7 @@ class HiSecure {
159
160
  // Sanitization
160
161
  this.sanitizerPrimary = new SanitizeHtmlAdapter_js_1.SanitizeHtmlAdapter(this.config.sanitizer);
161
162
  this.sanitizerFallback = new XSSAdapter_js_1.XSSAdapter(this.config.sanitizer);
162
- index_js_1.logger.info("Adapters ready");
163
+ index_js_1.logger.info("Adapters ready");
163
164
  }
164
165
  setupManagers() {
165
166
  this.hashManager = new HashManager_js_1.HashManager(this.config.hashing, this.hashingPrimary, this.hashingFallback);
@@ -228,7 +229,7 @@ class HiSecure {
228
229
  (typeof options.auth === 'object' ? options.auth : undefined);
229
230
  chain.push(this.authManager.protect(authOpts));
230
231
  }
231
- // Error handler (always last)
232
+ // Error handler - at last usage
232
233
  chain.push(errorHandler_js_1.errorHandler);
233
234
  return chain;
234
235
  }