hi-secure 1.0.14 → 1.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/adapters/ArgonAdapter.d.ts +1 -1
  2. package/dist/adapters/ArgonAdapter.d.ts.map +1 -1
  3. package/dist/adapters/ArgonAdapter.js +43 -5
  4. package/dist/adapters/ArgonAdapter.js.map +1 -1
  5. package/dist/adapters/BcryptAdapter.d.ts.map +1 -1
  6. package/dist/adapters/BcryptAdapter.js +43 -3
  7. package/dist/adapters/BcryptAdapter.js.map +1 -1
  8. package/dist/adapters/ExpressRLAdapter.d.ts.map +1 -1
  9. package/dist/adapters/ExpressRLAdapter.js +48 -6
  10. package/dist/adapters/ExpressRLAdapter.js.map +1 -1
  11. package/dist/adapters/ExpressValidatorAdapter.d.ts.map +1 -1
  12. package/dist/adapters/ExpressValidatorAdapter.js +50 -10
  13. package/dist/adapters/ExpressValidatorAdapter.js.map +1 -1
  14. package/dist/adapters/GoogleAdapter.d.ts.map +1 -1
  15. package/dist/adapters/GoogleAdapter.js +82 -16
  16. package/dist/adapters/GoogleAdapter.js.map +1 -1
  17. package/dist/adapters/JWTAdapter.d.ts.map +1 -1
  18. package/dist/adapters/JWTAdapter.js +104 -15
  19. package/dist/adapters/JWTAdapter.js.map +1 -1
  20. package/dist/adapters/RLFlexibleAdapter.d.ts.map +1 -1
  21. package/dist/adapters/RLFlexibleAdapter.js +87 -12
  22. package/dist/adapters/RLFlexibleAdapter.js.map +1 -1
  23. package/dist/adapters/SanitizeHtmlAdapter.d.ts.map +1 -1
  24. package/dist/adapters/SanitizeHtmlAdapter.js +81 -13
  25. package/dist/adapters/SanitizeHtmlAdapter.js.map +1 -1
  26. package/dist/adapters/XSSAdapter.d.ts +1 -1
  27. package/dist/adapters/XSSAdapter.d.ts.map +1 -1
  28. package/dist/adapters/XSSAdapter.js +137 -20
  29. package/dist/adapters/XSSAdapter.js.map +1 -1
  30. package/dist/adapters/ZodAdapter.d.ts +1 -1
  31. package/dist/adapters/ZodAdapter.d.ts.map +1 -1
  32. package/dist/adapters/ZodAdapter.js +13 -8
  33. package/dist/adapters/ZodAdapter.js.map +1 -1
  34. package/dist/core/HiSecure.d.ts +3 -4
  35. package/dist/core/HiSecure.d.ts.map +1 -1
  36. package/dist/core/HiSecure.js +108 -121
  37. package/dist/core/HiSecure.js.map +1 -1
  38. package/dist/index.d.ts +2 -0
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +8 -1
  41. package/dist/index.js.map +1 -1
  42. package/dist/logging/index.d.ts.map +1 -1
  43. package/dist/logging/index.js +2 -0
  44. package/dist/logging/index.js.map +1 -1
  45. package/dist/logging/morganSetup.d.ts.map +1 -1
  46. package/dist/logging/morganSetup.js +22 -1
  47. package/dist/logging/morganSetup.js.map +1 -1
  48. package/dist/logging/winstonSetup.d.ts.map +1 -1
  49. package/dist/logging/winstonSetup.js +61 -3
  50. package/dist/logging/winstonSetup.js.map +1 -1
  51. package/dist/managers/AuthManager.d.ts +2 -2
  52. package/dist/managers/AuthManager.d.ts.map +1 -1
  53. package/dist/managers/AuthManager.js +167 -31
  54. package/dist/managers/AuthManager.js.map +1 -1
  55. package/dist/managers/CorsManager.d.ts.map +1 -1
  56. package/dist/managers/CorsManager.js +46 -11
  57. package/dist/managers/CorsManager.js.map +1 -1
  58. package/dist/managers/HashManager.d.ts +1 -1
  59. package/dist/managers/HashManager.d.ts.map +1 -1
  60. package/dist/managers/HashManager.js +127 -17
  61. package/dist/managers/HashManager.js.map +1 -1
  62. package/dist/managers/JsonManager.d.ts +1 -1
  63. package/dist/managers/JsonManager.d.ts.map +1 -1
  64. package/dist/managers/JsonManager.js +99 -16
  65. package/dist/managers/JsonManager.js.map +1 -1
  66. package/dist/managers/RateLimitManager.d.ts +1 -1
  67. package/dist/managers/RateLimitManager.d.ts.map +1 -1
  68. package/dist/managers/RateLimitManager.js +46 -22
  69. package/dist/managers/RateLimitManager.js.map +1 -1
  70. package/dist/managers/SanitizerManager.d.ts.map +1 -1
  71. package/dist/managers/SanitizerManager.js +112 -15
  72. package/dist/managers/SanitizerManager.js.map +1 -1
  73. package/dist/managers/ValidatorManager.d.ts.map +1 -1
  74. package/dist/managers/ValidatorManager.js +90 -7
  75. package/dist/managers/ValidatorManager.js.map +1 -1
  76. package/package.json +19 -1
  77. package/readme.md +3 -6
  78. package/src/adapters/ArgonAdapter.ts +55 -6
  79. package/src/adapters/BcryptAdapter.ts +56 -8
  80. package/src/adapters/ExpressRLAdapter.ts +62 -9
  81. package/src/adapters/ExpressValidatorAdapter.ts +67 -11
  82. package/src/adapters/GoogleAdapter.ts +106 -21
  83. package/src/adapters/JWTAdapter.ts +129 -21
  84. package/src/adapters/RLFlexibleAdapter.ts +113 -16
  85. package/src/adapters/SanitizeHtmlAdapter.ts +111 -18
  86. package/src/adapters/XSSAdapter.ts +183 -39
  87. package/src/adapters/ZodAdapter.ts +56 -10
  88. package/src/core/HiSecure.ts +496 -162
  89. package/src/index.ts +4 -0
  90. package/src/logging/index.ts +6 -0
  91. package/src/logging/morganSetup.ts +36 -1
  92. package/src/logging/winstonSetup.ts +97 -8
  93. package/src/managers/AuthManager.ts +205 -34
  94. package/src/managers/CorsManager.ts +63 -16
  95. package/src/managers/HashManager.ts +156 -19
  96. package/src/managers/JsonManager.ts +119 -15
  97. package/src/managers/RateLimitManager.ts +174 -29
  98. package/src/managers/SanitizerManager.ts +150 -25
  99. package/src/managers/ValidatorManager.ts +115 -15
@@ -1 +1 @@
1
- {"version":3,"file":"RateLimitManager.js","sourceRoot":"","sources":["../../src/managers/RateLimitManager.ts"],"names":[],"mappings":";;;AACA,oEAA8D;AAC9D,wCAAoC;AAMpC,MAAa,gBAAgB;IAKzB,YACI,MAAqC,EACrC,cAAkC,EAClC,eAA0C;QAE1C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IAC3C,CAAC;IAED,UAAU,CAAC,IAA6D;QACpE,IAAI,YAAY,GAAQ,EAAE,CAAC;QAE3B,IAAI,IAAI,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,YAAY,GAAG;gBACX,QAAQ,EAAE,KAAM;gBAChB,GAAG,EAAE,CAAC;gBACN,OAAO,EAAE,sCAAsC;aAClD,CAAC;QACN,CAAC;aAAM,IAAI,IAAI,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;YAClC,YAAY,GAAG;gBACX,QAAQ,EAAE,KAAM;gBAChB,GAAG,EAAE,GAAG;gBACR,OAAO,EAAE,sBAAsB;aAClC,CAAC;QACN,CAAC;aAAM,IAAI,IAAI,EAAE,IAAI,KAAK,KAAK,EAAE,CAAC;YAC9B,YAAY,GAAG;gBACX,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;gBACxB,GAAG,EAAE,GAAG;gBACR,OAAO,EAAE,0BAA0B;aACtC,CAAC;QACN,CAAC;aAAM,CAAC;YACJ,YAAY,GAAG;gBACX,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;gBAC5B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;gBAC5B,eAAe,EAAE,IAAI;gBACrB,aAAa,EAAE,KAAK;aACvB,CAAC;QACN,CAAC;QAED,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;YAChB,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAC;YAC/F,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;gBACjC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;oBAClC,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC1C,CAAC;YACL,CAAC;YAED,MAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CACvD,CAAC,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,CACrD,CAAC;YACF,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,gBAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;oBACxC,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,SAAS;oBAC/B,cAAc,EAAE,kBAAkB;iBACrC,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QAED,IAAI,YAAY,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YAC7C,YAAY,CAAC,eAAe,GAAG,IAAI,CAAC;QACxC,CAAC;QACD,IAAI,YAAY,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YAC3C,YAAY,CAAC,aAAa,GAAG,KAAK,CAAC;QACvC,CAAC;QAED,IAAI,CAAC;YACD,gBAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE;gBAClC,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,SAAS;gBAC7B,QAAQ,EAAE,YAAY,CAAC,QAAQ;gBAC/B,GAAG,EAAE,YAAY,CAAC,GAAG;aACxB,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,gBAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE;gBAClD,KAAK,EAAE,GAAG,EAAE,OAAO;aACtB,CAAC,CAAC;YAEH,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;gBACxB,MAAM,IAAI,8BAAY,CAAC,4CAA4C,CAAC,CAAC;YACzE,CAAC;YAED,IAAI,CAAC;gBACD,gBAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;gBAC3C,OAAO,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YAC5D,CAAC;YAAC,OAAO,WAAgB,EAAE,CAAC;gBACxB,gBAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE;oBACzC,KAAK,EAAE,WAAW,EAAE,OAAO;iBAC9B,CAAC,CAAC;gBACH,MAAM,IAAI,8BAAY,CAAC,4CAA4C,CAAC,CAAC;YACzE,CAAC;QACL,CAAC;IACL,CAAC;CACJ;AApGD,4CAoGC","sourcesContent":["import { HiSecureConfig } from \"../core/types/HiSecureConfig.js\";\r\nimport { AdapterError } from \"../core/errors/AdapterError.js\";\r\nimport { logger } from \"../logging\";\r\n\r\ninterface RateLimiterAdapter {\r\n getMiddleware: (options?: any) => any;\r\n}\r\n\r\nexport class RateLimitManager {\r\n private config: HiSecureConfig[\"rateLimiter\"];\r\n private primaryAdapter: RateLimiterAdapter;\r\n private fallbackAdapter: RateLimiterAdapter | null;\r\n\r\n constructor(\r\n config: HiSecureConfig[\"rateLimiter\"],\r\n primaryAdapter: RateLimiterAdapter,\r\n fallbackAdapter: RateLimiterAdapter | null\r\n ) {\r\n this.config = config;\r\n this.primaryAdapter = primaryAdapter;\r\n this.fallbackAdapter = fallbackAdapter;\r\n }\r\n\r\n middleware(opts?: { mode?: \"strict\" | \"relaxed\" | \"api\"; options?: any }) {\r\n let finalOptions: any = {};\r\n\r\n if (opts?.mode === \"strict\") {\r\n finalOptions = {\r\n windowMs: 10_000,\r\n max: 5,\r\n message: \"Too many requests, please slow down.\"\r\n };\r\n } else if (opts?.mode === \"relaxed\") {\r\n finalOptions = {\r\n windowMs: 60_000,\r\n max: 100,\r\n message: \"Rate limit exceeded.\"\r\n };\r\n } else if (opts?.mode === \"api\") {\r\n finalOptions = {\r\n windowMs: 15 * 60 * 1000, \r\n max: 100,\r\n message: \"API rate limit exceeded.\"\r\n };\r\n } else {\r\n finalOptions = {\r\n windowMs: this.config.windowMs,\r\n max: this.config.maxRequests,\r\n message: this.config.message,\r\n standardHeaders: true, \r\n legacyHeaders: false \r\n };\r\n }\r\n\r\n if (opts?.options) {\r\n const allowedOverrides = ['message', 'skipFailedRequests', 'standardHeaders', 'legacyHeaders'];\r\n for (const key of allowedOverrides) {\r\n if (opts.options[key] !== undefined) {\r\n finalOptions[key] = opts.options[key];\r\n }\r\n }\r\n \r\n const attemptedOverrides = Object.keys(opts.options).filter(\r\n k => !allowedOverrides.includes(k) && k !== 'mode'\r\n );\r\n if (attemptedOverrides.length > 0) {\r\n logger.warn(\"Rate limit overrides ignored\", {\r\n preset: opts?.mode || 'default',\r\n ignoredOptions: attemptedOverrides\r\n });\r\n }\r\n }\r\n\r\n if (finalOptions.standardHeaders === undefined) {\r\n finalOptions.standardHeaders = true;\r\n }\r\n if (finalOptions.legacyHeaders === undefined) {\r\n finalOptions.legacyHeaders = false;\r\n }\r\n\r\n try {\r\n logger.info(\"Applying rate limiting\", {\r\n mode: opts?.mode || 'default',\r\n windowMs: finalOptions.windowMs,\r\n max: finalOptions.max\r\n });\r\n \r\n return this.primaryAdapter.getMiddleware(finalOptions);\r\n } catch (err: any) {\r\n logger.warn(\"Primary rate limiter failed → fallback\", {\r\n error: err?.message\r\n });\r\n\r\n if (!this.fallbackAdapter) {\r\n throw new AdapterError(\"Rate limiters failed; no fallback adapter.\");\r\n }\r\n\r\n try {\r\n logger.info(\"Using fallback rate limiter\");\r\n return this.fallbackAdapter.getMiddleware(finalOptions);\r\n } catch (fallbackErr: any) {\r\n logger.error(\"Fallback limiter also failed\", {\r\n error: fallbackErr?.message\r\n });\r\n throw new AdapterError(\"Both primary and fallback limiters failed.\");\r\n }\r\n }\r\n }\r\n}"]}
1
+ {"version":3,"file":"RateLimitManager.js","sourceRoot":"","sources":["../../src/managers/RateLimitManager.ts"],"names":[],"mappings":"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","sourcesContent":["// import { HiSecureConfig } from \"../core/types/HiSecureConfig.js\";\r\n// import { AdapterError } from \"../core/errors/AdapterError.js\";\r\n// import { logger } from \"../logging\";\r\n\r\n// interface RateLimiterAdapter {\r\n// getMiddleware: (options?: any) => any;\r\n// }\r\n\r\n// export class RateLimitManager {\r\n// private config: HiSecureConfig[\"rateLimiter\"];\r\n// private primaryAdapter: RateLimiterAdapter;\r\n// private fallbackAdapter: RateLimiterAdapter | null;\r\n\r\n// constructor(\r\n// config: HiSecureConfig[\"rateLimiter\"],\r\n// primaryAdapter: RateLimiterAdapter,\r\n// fallbackAdapter: RateLimiterAdapter | null\r\n// ) {\r\n// this.config = config;\r\n// this.primaryAdapter = primaryAdapter;\r\n// this.fallbackAdapter = fallbackAdapter;\r\n// }\r\n\r\n// middleware(opts?: { mode?: \"strict\" | \"relaxed\" | \"api\"; options?: any }) {\r\n// let finalOptions: any = {};\r\n\r\n// if (opts?.mode === \"strict\") {\r\n// finalOptions = {\r\n// windowMs: 10_000,\r\n// max: 5,\r\n// message: \"Too many requests, please slow down.\"\r\n// };\r\n// } else if (opts?.mode === \"relaxed\") {\r\n// finalOptions = {\r\n// windowMs: 60_000,\r\n// max: 100,\r\n// message: \"Rate limit exceeded.\"\r\n// };\r\n// } else if (opts?.mode === \"api\") {\r\n// finalOptions = {\r\n// windowMs: 15 * 60 * 1000, \r\n// max: 100,\r\n// message: \"API rate limit exceeded.\"\r\n// };\r\n// } else {\r\n// finalOptions = {\r\n// windowMs: this.config.windowMs,\r\n// max: this.config.maxRequests,\r\n// message: this.config.message,\r\n// standardHeaders: true, \r\n// legacyHeaders: false \r\n// };\r\n// }\r\n\r\n// if (opts?.options) {\r\n// const allowedOverrides = ['message', 'skipFailedRequests', 'standardHeaders', 'legacyHeaders'];\r\n// for (const key of allowedOverrides) {\r\n// if (opts.options[key] !== undefined) {\r\n// finalOptions[key] = opts.options[key];\r\n// }\r\n// }\r\n \r\n// const attemptedOverrides = Object.keys(opts.options).filter(\r\n// k => !allowedOverrides.includes(k) && k !== 'mode'\r\n// );\r\n// if (attemptedOverrides.length > 0) {\r\n// logger.warn(\"Rate limit overrides ignored\", {\r\n// preset: opts?.mode || 'default',\r\n// ignoredOptions: attemptedOverrides\r\n// });\r\n// }\r\n// }\r\n\r\n// if (finalOptions.standardHeaders === undefined) {\r\n// finalOptions.standardHeaders = true;\r\n// }\r\n// if (finalOptions.legacyHeaders === undefined) {\r\n// finalOptions.legacyHeaders = false;\r\n// }\r\n\r\n// try {\r\n// logger.info(\"Applying rate limiting\", {\r\n// mode: opts?.mode || 'default',\r\n// windowMs: finalOptions.windowMs,\r\n// max: finalOptions.max\r\n// });\r\n \r\n// return this.primaryAdapter.getMiddleware(finalOptions);\r\n// } catch (err: any) {\r\n// logger.warn(\"Primary rate limiter failed → fallback\", {\r\n// error: err?.message\r\n// });\r\n\r\n// if (!this.fallbackAdapter) {\r\n// throw new AdapterError(\"Rate limiters failed; no fallback adapter.\");\r\n// }\r\n\r\n// try {\r\n// logger.info(\"Using fallback rate limiter\");\r\n// return this.fallbackAdapter.getMiddleware(finalOptions);\r\n// } catch (fallbackErr: any) {\r\n// logger.error(\"Fallback limiter also failed\", {\r\n// error: fallbackErr?.message\r\n// });\r\n// throw new AdapterError(\"Both primary and fallback limiters failed.\");\r\n// }\r\n// }\r\n// }\r\n// }\r\n\r\n\r\n\r\n\r\nimport { HiSecureConfig } from \"../core/types/HiSecureConfig\";\r\nimport { AdapterError } from \"../core/errors/AdapterError\";\r\nimport { logger } from \"../logging\";\r\n\r\ninterface RateLimiterAdapter {\r\n getMiddleware: (options?: any) => any;\r\n}\r\n\r\nexport class RateLimitManager {\r\n private config: HiSecureConfig[\"rateLimiter\"];\r\n private primaryAdapter: RateLimiterAdapter;\r\n private fallbackAdapter: RateLimiterAdapter | null;\r\n\r\n constructor(\r\n config: HiSecureConfig[\"rateLimiter\"],\r\n primaryAdapter: RateLimiterAdapter,\r\n fallbackAdapter: RateLimiterAdapter | null\r\n ) {\r\n this.config = config;\r\n this.primaryAdapter = primaryAdapter;\r\n this.fallbackAdapter = fallbackAdapter;\r\n\r\n logger.info(\"RateLimitManager initialized\", {\r\n layer: \"rate-limit-manager\",\r\n primaryConfigured: true,\r\n fallbackConfigured: !!fallbackAdapter\r\n });\r\n }\r\n\r\n middleware(opts?: { mode?: \"strict\" | \"relaxed\" | \"api\"; options?: any }) {\r\n let finalOptions: any = {};\r\n const mode = opts?.mode || \"default\";\r\n\r\n if (mode === \"strict\") {\r\n finalOptions = {\r\n windowMs: 10_000,\r\n max: 5,\r\n message: \"Too many requests, please slow down.\"\r\n };\r\n } else if (mode === \"relaxed\") {\r\n finalOptions = {\r\n windowMs: 60_000,\r\n max: 100,\r\n message: \"Rate limit exceeded.\"\r\n };\r\n } else if (mode === \"api\") {\r\n finalOptions = {\r\n windowMs: 15 * 60 * 1000,\r\n max: 100,\r\n message: \"API rate limit exceeded.\"\r\n };\r\n } else {\r\n finalOptions = {\r\n windowMs: this.config.windowMs,\r\n max: this.config.maxRequests,\r\n message: this.config.message,\r\n standardHeaders: true,\r\n legacyHeaders: false\r\n };\r\n }\r\n\r\n if (opts?.options) {\r\n const allowedOverrides = [\r\n \"message\",\r\n \"skipFailedRequests\",\r\n \"standardHeaders\",\r\n \"legacyHeaders\"\r\n ];\r\n\r\n for (const key of allowedOverrides) {\r\n if (opts.options[key] !== undefined) {\r\n finalOptions[key] = opts.options[key];\r\n }\r\n }\r\n\r\n const attemptedOverrides = Object.keys(opts.options).filter(\r\n k => !allowedOverrides.includes(k) && k !== \"mode\"\r\n );\r\n\r\n if (attemptedOverrides.length > 0) {\r\n logger.warn(\"Rate limit overrides ignored\", {\r\n layer: \"rate-limit-manager\",\r\n operation: \"configure\",\r\n mode,\r\n ignoredOptions: attemptedOverrides\r\n });\r\n }\r\n }\r\n\r\n finalOptions.standardHeaders ??= true;\r\n finalOptions.legacyHeaders ??= false;\r\n\r\n try {\r\n logger.info(\"Rate limiting applied\", {\r\n layer: \"rate-limit-manager\",\r\n operation: \"apply\",\r\n mode,\r\n windowMs: finalOptions.windowMs,\r\n max: finalOptions.max\r\n });\r\n\r\n return this.primaryAdapter.getMiddleware(finalOptions);\r\n\r\n } catch (err: any) {\r\n logger.warn(\"Primary rate limiter failed\", {\r\n layer: \"rate-limit-manager\",\r\n operation: \"apply\",\r\n mode,\r\n reason: err?.message\r\n });\r\n\r\n if (!this.fallbackAdapter) {\r\n throw new AdapterError(\r\n \"Rate limiters failed; no fallback adapter configured.\"\r\n );\r\n }\r\n\r\n try {\r\n logger.warn(\"Using fallback rate limiter\", {\r\n layer: \"rate-limit-manager\",\r\n operation: \"fallback\",\r\n mode\r\n });\r\n\r\n return this.fallbackAdapter.getMiddleware(finalOptions);\r\n\r\n } catch (fallbackErr: any) {\r\n logger.error(\"Fallback rate limiter failed\", {\r\n layer: \"rate-limit-manager\",\r\n operation: \"fallback\",\r\n mode,\r\n reason: fallbackErr?.message\r\n });\r\n\r\n throw new AdapterError(\r\n \"Both primary and fallback rate limiters failed.\"\r\n );\r\n }\r\n }\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SanitizerManager.d.ts","sourceRoot":"","sources":["../../src/managers/SanitizerManager.ts"],"names":[],"mappings":"AAGA,UAAU,gBAAgB;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,MAAM,CAAC;CACtD;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,QAAQ,CAA0B;gBAE9B,OAAO,EAAE,gBAAgB,EAAE,QAAQ,GAAE,gBAAgB,GAAG,IAAW;IAK/E,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,MAAM;IAqB9C,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,IACZ,KAAK,GAAG,EAAE,MAAM,GAAG,EAAE,MAAM,GAAG;CA6D7C"}
1
+ {"version":3,"file":"SanitizerManager.d.ts","sourceRoot":"","sources":["../../src/managers/SanitizerManager.ts"],"names":[],"mappings":"AA0GA,UAAU,gBAAgB;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,MAAM,CAAC;CACtD;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,QAAQ,CAA0B;gBAE9B,OAAO,EAAE,gBAAgB,EAAE,QAAQ,GAAE,gBAAgB,GAAG,IAAW;IAU/E,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,MAAM;IA6B9C,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,IACZ,KAAK,GAAG,EAAE,MAAM,GAAG,EAAE,MAAM,GAAG;CAsE7C"}
@@ -1,26 +1,117 @@
1
1
  "use strict";
2
+ // import { SanitizerError } from "../core/errors/SanitizerError.js";
3
+ // import { logger } from "../logging";
2
4
  Object.defineProperty(exports, "__esModule", { value: true });
3
5
  exports.SanitizerManager = void 0;
4
- const SanitizerError_js_1 = require("../core/errors/SanitizerError.js");
6
+ // interface SanitizerAdapter {
7
+ // sanitize: (value: string, options?: any) => string;
8
+ // }
9
+ // export class SanitizerManager {
10
+ // private primary: SanitizerAdapter;
11
+ // private fallback: SanitizerAdapter | null;
12
+ // constructor(primary: SanitizerAdapter, fallback: SanitizerAdapter | null = null) {
13
+ // this.primary = primary;
14
+ // this.fallback = fallback;
15
+ // }
16
+ // sanitize(value: string, options?: any): string {
17
+ // if (typeof value !== 'string') {
18
+ // return value;
19
+ // }
20
+ // try {
21
+ // return this.primary.sanitize(value, options);
22
+ // } catch (err: any) {
23
+ // logger.warn("Primary sanitizer failed", { error: err?.message });
24
+ // if (!this.fallback) {
25
+ // throw new SanitizerError("Primary sanitizer failed and no fallback available.");
26
+ // }
27
+ // logger.info("Using fallback sanitizer");
28
+ // return this.fallback.sanitize(value, options);
29
+ // }
30
+ // }
31
+ // middleware(options?: any) {
32
+ // return (req: any, _res: any, next: any) => {
33
+ // let fallbackTriggered = false;
34
+ // const safeSanitize = (value: string): string => {
35
+ // if (fallbackTriggered && this.fallback) {
36
+ // return this.fallback.sanitize(value, options);
37
+ // }
38
+ // try {
39
+ // return this.primary.sanitize(value, options);
40
+ // } catch (err: any) {
41
+ // if (!this.fallback) {
42
+ // throw err;
43
+ // }
44
+ // fallbackTriggered = true;
45
+ // logger.warn("Switching to fallback sanitizer for this request");
46
+ // return this.fallback.sanitize(value, options);
47
+ // }
48
+ // };
49
+ // try {
50
+ // if (req.body && typeof req.body === "object") {
51
+ // const originalBody = req.body;
52
+ // const sanitizedBody: any = Array.isArray(originalBody) ? [] : {};
53
+ // for (const key of Object.keys(originalBody)) {
54
+ // const value = originalBody[key];
55
+ // if (typeof value === "string") {
56
+ // sanitizedBody[key] = safeSanitize(value);
57
+ // } else if (Array.isArray(value)) {
58
+ // sanitizedBody[key] = value.map(item =>
59
+ // typeof item === "string" ? safeSanitize(item) : item
60
+ // );
61
+ // } else if (value && typeof value === "object") {
62
+ // sanitizedBody[key] = value;
63
+ // } else {
64
+ // sanitizedBody[key] = value;
65
+ // }
66
+ // }
67
+ // req.sanitizedBody = sanitizedBody;
68
+ // logger.debug("Request body sanitized", {
69
+ // originalKeys: Object.keys(originalBody),
70
+ // sanitizedKeys: Object.keys(sanitizedBody),
71
+ // usedFallback: fallbackTriggered
72
+ // });
73
+ // }
74
+ // next();
75
+ // } catch (err: any) {
76
+ // logger.error("Sanitizer middleware failed", {
77
+ // error: err?.message
78
+ // });
79
+ // next(new SanitizerError("Sanitizer middleware failure"));
80
+ // }
81
+ // };
82
+ // }
83
+ // }
84
+ const SanitizerError_1 = require("../core/errors/SanitizerError");
5
85
  const logging_1 = require("../logging");
6
86
  class SanitizerManager {
7
87
  constructor(primary, fallback = null) {
8
88
  this.primary = primary;
9
89
  this.fallback = fallback;
90
+ logging_1.logger.info("SanitizerManager initialized", {
91
+ layer: "sanitizer-manager",
92
+ fallbackEnabled: !!fallback
93
+ });
10
94
  }
11
95
  sanitize(value, options) {
12
- if (typeof value !== 'string') {
96
+ if (typeof value !== "string") {
13
97
  return value;
14
98
  }
15
99
  try {
16
100
  return this.primary.sanitize(value, options);
17
101
  }
18
102
  catch (err) {
19
- logging_1.logger.warn("Primary sanitizer failed", { error: err?.message });
103
+ logging_1.logger.warn("Primary sanitizer failed", {
104
+ layer: "sanitizer-manager",
105
+ operation: "sanitize",
106
+ reason: err?.message
107
+ });
20
108
  if (!this.fallback) {
21
- throw new SanitizerError_js_1.SanitizerError("Primary sanitizer failed and no fallback available.");
109
+ throw new SanitizerError_1.SanitizerError("Primary sanitizer failed and no fallback available.");
22
110
  }
23
- logging_1.logger.info("Using fallback sanitizer");
111
+ logging_1.logger.warn("Sanitizer fallback used", {
112
+ layer: "sanitizer-manager",
113
+ operation: "sanitize"
114
+ });
24
115
  return this.fallback.sanitize(value, options);
25
116
  }
26
117
  }
@@ -39,7 +130,10 @@ class SanitizerManager {
39
130
  throw err;
40
131
  }
41
132
  fallbackTriggered = true;
42
- logging_1.logger.warn("Switching to fallback sanitizer for this request");
133
+ logging_1.logger.warn("Switching to fallback sanitizer for request", {
134
+ layer: "sanitizer-manager",
135
+ operation: "middleware"
136
+ });
43
137
  return this.fallback.sanitize(value, options);
44
138
  }
45
139
  };
@@ -53,19 +147,20 @@ class SanitizerManager {
53
147
  sanitizedBody[key] = safeSanitize(value);
54
148
  }
55
149
  else if (Array.isArray(value)) {
56
- sanitizedBody[key] = value.map(item => typeof item === "string" ? safeSanitize(item) : item);
57
- }
58
- else if (value && typeof value === "object") {
59
- sanitizedBody[key] = value;
150
+ sanitizedBody[key] = value.map(item => typeof item === "string"
151
+ ? safeSanitize(item)
152
+ : item);
60
153
  }
61
154
  else {
62
155
  sanitizedBody[key] = value;
63
156
  }
64
157
  }
65
158
  req.sanitizedBody = sanitizedBody;
66
- logging_1.logger.debug("Request body sanitized", {
67
- originalKeys: Object.keys(originalBody),
68
- sanitizedKeys: Object.keys(sanitizedBody),
159
+ // visible + safe info
160
+ logging_1.logger.info("Request body sanitized", {
161
+ layer: "sanitizer-manager",
162
+ operation: "middleware",
163
+ fieldCount: Object.keys(sanitizedBody).length,
69
164
  usedFallback: fallbackTriggered
70
165
  });
71
166
  }
@@ -73,9 +168,11 @@ class SanitizerManager {
73
168
  }
74
169
  catch (err) {
75
170
  logging_1.logger.error("Sanitizer middleware failed", {
76
- error: err?.message
171
+ layer: "sanitizer-manager",
172
+ operation: "middleware",
173
+ reason: err?.message
77
174
  });
78
- next(new SanitizerError_js_1.SanitizerError("Sanitizer middleware failure"));
175
+ next(new SanitizerError_1.SanitizerError("Sanitizer middleware failure"));
79
176
  }
80
177
  };
81
178
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SanitizerManager.js","sourceRoot":"","sources":["../../src/managers/SanitizerManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { SanitizerError } from \"../core/errors/SanitizerError.js\";\r\nimport { logger } from \"../logging\";\r\n\r\ninterface SanitizerAdapter {\r\n sanitize: (value: string, options?: any) => string;\r\n}\r\n\r\nexport class SanitizerManager {\r\n private primary: SanitizerAdapter;\r\n private fallback: SanitizerAdapter | null;\r\n\r\n constructor(primary: SanitizerAdapter, fallback: SanitizerAdapter | null = null) {\r\n this.primary = primary;\r\n this.fallback = fallback;\r\n }\r\n\r\n sanitize(value: string, options?: any): string {\r\n \r\n if (typeof value !== 'string') {\r\n return value;\r\n }\r\n\r\n try {\r\n return this.primary.sanitize(value, options);\r\n } catch (err: any) {\r\n logger.warn(\"Primary sanitizer failed\", { error: err?.message });\r\n\r\n if (!this.fallback) {\r\n throw new SanitizerError(\"Primary sanitizer failed and no fallback available.\");\r\n }\r\n\r\n logger.info(\"Using fallback sanitizer\");\r\n return this.fallback.sanitize(value, options);\r\n }\r\n }\r\n\r\n \r\n middleware(options?: any) {\r\n return (req: any, _res: any, next: any) => {\r\n let fallbackTriggered = false;\r\n \r\n const safeSanitize = (value: string): string => {\r\n if (fallbackTriggered && this.fallback) {\r\n return this.fallback.sanitize(value, options);\r\n }\r\n \r\n try {\r\n return this.primary.sanitize(value, options);\r\n } catch (err: any) {\r\n if (!this.fallback) {\r\n throw err;\r\n }\r\n \r\n fallbackTriggered = true;\r\n logger.warn(\"Switching to fallback sanitizer for this request\");\r\n return this.fallback.sanitize(value, options);\r\n }\r\n };\r\n\r\n try {\r\n \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 value = originalBody[key];\r\n \r\n if (typeof value === \"string\") {\r\n sanitizedBody[key] = safeSanitize(value);\r\n } else if (Array.isArray(value)) {\r\n sanitizedBody[key] = value.map(item => \r\n typeof item === \"string\" ? safeSanitize(item) : item\r\n );\r\n } else if (value && typeof value === \"object\") {\r\n sanitizedBody[key] = value; \r\n } else {\r\n sanitizedBody[key] = value;\r\n }\r\n }\r\n \r\n req.sanitizedBody = sanitizedBody;\r\n \r\n logger.debug(\"Request body sanitized\", {\r\n originalKeys: Object.keys(originalBody),\r\n sanitizedKeys: Object.keys(sanitizedBody),\r\n usedFallback: fallbackTriggered\r\n });\r\n }\r\n\r\n next();\r\n } catch (err: any) {\r\n logger.error(\"Sanitizer middleware failed\", {\r\n error: err?.message\r\n });\r\n next(new SanitizerError(\"Sanitizer middleware failure\"));\r\n }\r\n };\r\n }\r\n}"]}
1
+ {"version":3,"file":"SanitizerManager.js","sourceRoot":"","sources":["../../src/managers/SanitizerManager.ts"],"names":[],"mappings":"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","sourcesContent":["// import { SanitizerError } from \"../core/errors/SanitizerError.js\";\r\n// import { logger } from \"../logging\";\r\n\r\n// interface SanitizerAdapter {\r\n// sanitize: (value: string, options?: any) => string;\r\n// }\r\n\r\n// export class SanitizerManager {\r\n// private primary: SanitizerAdapter;\r\n// private fallback: SanitizerAdapter | null;\r\n\r\n// constructor(primary: SanitizerAdapter, fallback: SanitizerAdapter | null = null) {\r\n// this.primary = primary;\r\n// this.fallback = fallback;\r\n// }\r\n\r\n// sanitize(value: string, options?: any): string {\r\n \r\n// if (typeof value !== 'string') {\r\n// return value;\r\n// }\r\n\r\n// try {\r\n// return this.primary.sanitize(value, options);\r\n// } catch (err: any) {\r\n// logger.warn(\"Primary sanitizer failed\", { error: err?.message });\r\n\r\n// if (!this.fallback) {\r\n// throw new SanitizerError(\"Primary sanitizer failed and no fallback available.\");\r\n// }\r\n\r\n// logger.info(\"Using fallback sanitizer\");\r\n// return this.fallback.sanitize(value, options);\r\n// }\r\n// }\r\n\r\n \r\n// middleware(options?: any) {\r\n// return (req: any, _res: any, next: any) => {\r\n// let fallbackTriggered = false;\r\n \r\n// const safeSanitize = (value: string): string => {\r\n// if (fallbackTriggered && this.fallback) {\r\n// return this.fallback.sanitize(value, options);\r\n// }\r\n \r\n// try {\r\n// return this.primary.sanitize(value, options);\r\n// } catch (err: any) {\r\n// if (!this.fallback) {\r\n// throw err;\r\n// }\r\n \r\n// fallbackTriggered = true;\r\n// logger.warn(\"Switching to fallback sanitizer for this request\");\r\n// return this.fallback.sanitize(value, options);\r\n// }\r\n// };\r\n\r\n// try {\r\n \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 value = originalBody[key];\r\n \r\n// if (typeof value === \"string\") {\r\n// sanitizedBody[key] = safeSanitize(value);\r\n// } else if (Array.isArray(value)) {\r\n// sanitizedBody[key] = value.map(item => \r\n// typeof item === \"string\" ? safeSanitize(item) : item\r\n// );\r\n// } else if (value && typeof value === \"object\") {\r\n// sanitizedBody[key] = value; \r\n// } else {\r\n// sanitizedBody[key] = value;\r\n// }\r\n// }\r\n \r\n// req.sanitizedBody = sanitizedBody;\r\n \r\n// logger.debug(\"Request body sanitized\", {\r\n// originalKeys: Object.keys(originalBody),\r\n// sanitizedKeys: Object.keys(sanitizedBody),\r\n// usedFallback: fallbackTriggered\r\n// });\r\n// }\r\n\r\n// next();\r\n// } catch (err: any) {\r\n// logger.error(\"Sanitizer middleware failed\", {\r\n// error: err?.message\r\n// });\r\n// next(new SanitizerError(\"Sanitizer middleware failure\"));\r\n// }\r\n// };\r\n// }\r\n// }\r\n\r\n\r\n\r\nimport { SanitizerError } from \"../core/errors/SanitizerError\";\r\nimport { logger } from \"../logging\";\r\n\r\ninterface SanitizerAdapter {\r\n sanitize: (value: string, options?: any) => string;\r\n}\r\n\r\nexport class SanitizerManager {\r\n private primary: SanitizerAdapter;\r\n private fallback: SanitizerAdapter | null;\r\n\r\n constructor(primary: SanitizerAdapter, fallback: SanitizerAdapter | null = null) {\r\n this.primary = primary;\r\n this.fallback = fallback;\r\n\r\n logger.info(\"SanitizerManager initialized\", {\r\n layer: \"sanitizer-manager\",\r\n fallbackEnabled: !!fallback\r\n });\r\n }\r\n\r\n sanitize(value: string, options?: any): string {\r\n if (typeof value !== \"string\") {\r\n return value;\r\n }\r\n\r\n try {\r\n return this.primary.sanitize(value, options);\r\n } catch (err: any) {\r\n logger.warn(\"Primary sanitizer failed\", {\r\n layer: \"sanitizer-manager\",\r\n operation: \"sanitize\",\r\n reason: err?.message\r\n });\r\n\r\n if (!this.fallback) {\r\n throw new SanitizerError(\r\n \"Primary sanitizer failed and no fallback available.\"\r\n );\r\n }\r\n\r\n logger.warn(\"Sanitizer fallback used\", {\r\n layer: \"sanitizer-manager\",\r\n operation: \"sanitize\"\r\n });\r\n\r\n return this.fallback.sanitize(value, options);\r\n }\r\n }\r\n\r\n middleware(options?: any) {\r\n return (req: any, _res: any, next: any) => {\r\n let fallbackTriggered = false;\r\n\r\n const safeSanitize = (value: string): string => {\r\n if (fallbackTriggered && this.fallback) {\r\n return this.fallback.sanitize(value, options);\r\n }\r\n\r\n try {\r\n return this.primary.sanitize(value, options);\r\n } catch (err: any) {\r\n if (!this.fallback) {\r\n throw err;\r\n }\r\n\r\n fallbackTriggered = true;\r\n\r\n logger.warn(\"Switching to fallback sanitizer for request\", {\r\n layer: \"sanitizer-manager\",\r\n operation: \"middleware\"\r\n });\r\n\r\n return this.fallback.sanitize(value, options);\r\n }\r\n };\r\n\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 value = originalBody[key];\r\n\r\n if (typeof value === \"string\") {\r\n sanitizedBody[key] = safeSanitize(value);\r\n } else if (Array.isArray(value)) {\r\n sanitizedBody[key] = value.map(item =>\r\n typeof item === \"string\"\r\n ? safeSanitize(item)\r\n : item\r\n );\r\n } else {\r\n sanitizedBody[key] = value;\r\n }\r\n }\r\n\r\n req.sanitizedBody = sanitizedBody;\r\n\r\n // ✅ visible + safe info\r\n logger.info(\"Request body sanitized\", {\r\n layer: \"sanitizer-manager\",\r\n operation: \"middleware\",\r\n fieldCount: Object.keys(sanitizedBody).length,\r\n usedFallback: fallbackTriggered\r\n });\r\n }\r\n\r\n next();\r\n } catch (err: any) {\r\n logger.error(\"Sanitizer middleware failed\", {\r\n layer: \"sanitizer-manager\",\r\n operation: \"middleware\",\r\n reason: err?.message\r\n });\r\n\r\n next(new SanitizerError(\"Sanitizer middleware failure\"));\r\n }\r\n };\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ValidatorManager.d.ts","sourceRoot":"","sources":["../../src/managers/ValidatorManager.ts"],"names":[],"mappings":"AAGA,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,IAST,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG;CA8C5C"}
1
+ {"version":3,"file":"ValidatorManager.d.ts","sourceRoot":"","sources":["../../src/managers/ValidatorManager.ts"],"names":[],"mappings":"AA8EA,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;IAU1E,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,IAST,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG;CAmE5C"}
@@ -1,12 +1,75 @@
1
1
  "use strict";
2
+ // import { logger } from "../logging";
3
+ // import { ValidationError } from "../core/errors/ValidationError.js";
2
4
  Object.defineProperty(exports, "__esModule", { value: true });
3
5
  exports.ValidatorManager = void 0;
6
+ // interface ValidatorAdapter {
7
+ // validate: (schema?: any) => any;
8
+ // }
9
+ // export class ValidatorManager {
10
+ // private zodAdapter: ValidatorAdapter;
11
+ // private expressAdapter: ValidatorAdapter;
12
+ // constructor(zodAdapter: ValidatorAdapter, expressAdapter: ValidatorAdapter) {
13
+ // this.zodAdapter = zodAdapter;
14
+ // this.expressAdapter = expressAdapter;
15
+ // }
16
+ // validate(schema?: any) {
17
+ // const isZod =
18
+ // schema &&
19
+ // typeof schema === "object" &&
20
+ // typeof schema._def === "object" &&
21
+ // typeof schema.safeParse === "function";
22
+ // const isExpressValidator = Array.isArray(schema);
23
+ // return (req: any, res: any, next: any) => {
24
+ // let middleware;
25
+ // if (isZod) {
26
+ // logger.debug("Using Zod adapter");
27
+ // middleware = this.zodAdapter.validate(schema);
28
+ // }
29
+ // else if (isExpressValidator) {
30
+ // logger.debug(" Using express-validator adapter");
31
+ // middleware = this.expressAdapter.validate(schema);
32
+ // }
33
+ // else {
34
+ // return next();
35
+ // }
36
+ // // CASE 1 — express-validator returns ARRAY
37
+ // if (Array.isArray(middleware)) {
38
+ // let idx = 0;
39
+ // const run = (err?: any) => {
40
+ // if (err) return next(err);
41
+ // const fn = middleware[idx++];
42
+ // if (!fn) return next(); // done
43
+ // try {
44
+ // fn(req, res, run);
45
+ // } catch (error: any) {
46
+ // next(new ValidationError(error.message));
47
+ // }
48
+ // };
49
+ // return run();
50
+ // }
51
+ // // CASE 2 — Zod returns SINGLE MIDDLEWARE
52
+ // try {
53
+ // middleware(req, res, (err?: any) => {
54
+ // if (err) return next(err);
55
+ // next();
56
+ // });
57
+ // } catch (err: any) {
58
+ // next(new ValidationError(err.message));
59
+ // }
60
+ // };
61
+ // }
62
+ // }
4
63
  const logging_1 = require("../logging");
5
- const ValidationError_js_1 = require("../core/errors/ValidationError.js");
64
+ const ValidationError_1 = require("../core/errors/ValidationError");
6
65
  class ValidatorManager {
7
66
  constructor(zodAdapter, expressAdapter) {
8
67
  this.zodAdapter = zodAdapter;
9
68
  this.expressAdapter = expressAdapter;
69
+ logging_1.logger.info("ValidatorManager initialized", {
70
+ layer: "validator-manager",
71
+ adapters: ["zod", "express-validator"]
72
+ });
10
73
  }
11
74
  validate(schema) {
12
75
  const isZod = schema &&
@@ -16,17 +79,25 @@ class ValidatorManager {
16
79
  const isExpressValidator = Array.isArray(schema);
17
80
  return (req, res, next) => {
18
81
  let middleware;
82
+ let adapterUsed = "none";
19
83
  if (isZod) {
20
- logging_1.logger.debug("Using Zod adapter");
84
+ adapterUsed = "zod";
21
85
  middleware = this.zodAdapter.validate(schema);
22
86
  }
23
87
  else if (isExpressValidator) {
24
- logging_1.logger.debug(" Using express-validator adapter");
88
+ adapterUsed = "express-validator";
25
89
  middleware = this.expressAdapter.validate(schema);
26
90
  }
27
91
  else {
28
92
  return next();
29
93
  }
94
+ logging_1.logger.info("Validation adapter selected", {
95
+ layer: "validator-manager",
96
+ operation: "select",
97
+ adapter: adapterUsed,
98
+ path: req.path,
99
+ method: req.method
100
+ });
30
101
  // CASE 1 — express-validator returns ARRAY
31
102
  if (Array.isArray(middleware)) {
32
103
  let idx = 0;
@@ -35,17 +106,23 @@ class ValidatorManager {
35
106
  return next(err);
36
107
  const fn = middleware[idx++];
37
108
  if (!fn)
38
- return next(); // done
109
+ return next();
39
110
  try {
40
111
  fn(req, res, run);
41
112
  }
42
113
  catch (error) {
43
- next(new ValidationError_js_1.ValidationError(error.message));
114
+ logging_1.logger.error("Validation middleware execution failed", {
115
+ layer: "validator-manager",
116
+ operation: "execute",
117
+ adapter: adapterUsed,
118
+ reason: error?.message
119
+ });
120
+ next(new ValidationError_1.ValidationError(error.message));
44
121
  }
45
122
  };
46
123
  return run();
47
124
  }
48
- // CASE 2 — Zod returns SINGLE MIDDLEWARE
125
+ // CASE 2 — Zod returns SINGLE middleware
49
126
  try {
50
127
  middleware(req, res, (err) => {
51
128
  if (err)
@@ -54,7 +131,13 @@ class ValidatorManager {
54
131
  });
55
132
  }
56
133
  catch (err) {
57
- next(new ValidationError_js_1.ValidationError(err.message));
134
+ logging_1.logger.error("Validation middleware execution failed", {
135
+ layer: "validator-manager",
136
+ operation: "execute",
137
+ adapter: adapterUsed,
138
+ reason: err?.message
139
+ });
140
+ next(new ValidationError_1.ValidationError(err.message));
58
141
  }
59
142
  };
60
143
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ValidatorManager.js","sourceRoot":"","sources":["../../src/managers/ValidatorManager.ts"],"names":[],"mappings":";;;AAAA,wCAAoC;AACpC,0EAAoE;AAMpE,MAAa,gBAAgB;IAIzB,YAAY,UAA4B,EAAE,cAAgC;QACtE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACzC,CAAC;IAED,QAAQ,CAAC,MAAY;QACjB,MAAM,KAAK,GACf,MAAM;YACN,OAAO,MAAM,KAAK,QAAQ;YAC1B,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;YAC/B,OAAO,MAAM,CAAC,SAAS,KAAK,UAAU,CAAC;QAEnC,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEjD,OAAO,CAAC,GAAQ,EAAE,GAAQ,EAAE,IAAS,EAAE,EAAE;YACrC,IAAI,UAAU,CAAC;YAEf,IAAI,KAAK,EAAE,CAAC;gBACR,gBAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAClC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAClD,CAAC;iBACI,IAAI,kBAAkB,EAAE,CAAC;gBAC1B,gBAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;gBACjD,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACtD,CAAC;iBACI,CAAC;gBACF,OAAO,IAAI,EAAE,CAAC;YAClB,CAAC;YAED,2CAA2C;YAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC5B,IAAI,GAAG,GAAG,CAAC,CAAC;gBAEZ,MAAM,GAAG,GAAG,CAAC,GAAS,EAAE,EAAE;oBACtB,IAAI,GAAG;wBAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;oBAE1B,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;oBAC7B,IAAI,CAAC,EAAE;wBAAE,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO;oBAE/B,IAAI,CAAC;wBACD,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;oBACtB,CAAC;oBAAC,OAAO,KAAU,EAAE,CAAC;wBAClB,IAAI,CAAC,IAAI,oCAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;oBAC7C,CAAC;gBACL,CAAC,CAAC;gBAEF,OAAO,GAAG,EAAE,CAAC;YACjB,CAAC;YAED,yCAAyC;YACzC,IAAI,CAAC;gBACD,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAS,EAAE,EAAE;oBAC/B,IAAI,GAAG;wBAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC1B,IAAI,EAAE,CAAC;gBACX,CAAC,CAAC,CAAC;YACP,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,IAAI,CAAC,IAAI,oCAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3C,CAAC;QACL,CAAC,CAAC;IACN,CAAC;CACJ;AAhED,4CAgEC","sourcesContent":["import { 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 =\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(); \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"]}
1
+ {"version":3,"file":"ValidatorManager.js","sourceRoot":"","sources":["../../src/managers/ValidatorManager.ts"],"names":[],"mappings":"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","sourcesContent":["// 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 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 =\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(); \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\r\n\r\nimport { logger } from \"../logging\";\r\nimport { ValidationError } from \"../core/errors/ValidationError\";\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 logger.info(\"ValidatorManager initialized\", {\r\n layer: \"validator-manager\",\r\n adapters: [\"zod\", \"express-validator\"]\r\n });\r\n }\r\n\r\n validate(schema?: any) {\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 let adapterUsed: \"zod\" | \"express-validator\" | \"none\" = \"none\";\r\n\r\n if (isZod) {\r\n adapterUsed = \"zod\";\r\n middleware = this.zodAdapter.validate(schema);\r\n } else if (isExpressValidator) {\r\n adapterUsed = \"express-validator\";\r\n middleware = this.expressAdapter.validate(schema);\r\n } else {\r\n return next();\r\n }\r\n\r\n logger.info(\"Validation adapter selected\", {\r\n layer: \"validator-manager\",\r\n operation: \"select\",\r\n adapter: adapterUsed,\r\n path: req.path,\r\n method: req.method\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();\r\n\r\n try {\r\n fn(req, res, run);\r\n } catch (error: any) {\r\n logger.error(\"Validation middleware execution failed\", {\r\n layer: \"validator-manager\",\r\n operation: \"execute\",\r\n adapter: adapterUsed,\r\n reason: error?.message\r\n });\r\n\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 logger.error(\"Validation middleware execution failed\", {\r\n layer: \"validator-manager\",\r\n operation: \"execute\",\r\n adapter: adapterUsed,\r\n reason: err?.message\r\n });\r\n\r\n next(new ValidationError(err.message));\r\n }\r\n };\r\n }\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,8 +1,26 @@
1
1
  {
2
2
  "name": "hi-secure",
3
- "version": "1.0.14",
3
+ "version": "1.0.16",
4
+ "description": "Unified security layer for Express.js: authentication, validation, sanitization, rate limiting and CORS",
5
+ "license": "MIT",
4
6
  "main": "dist/index.js",
5
7
  "types": "dist/index.d.ts",
8
+ "keywords": [
9
+ "express",
10
+ "security",
11
+ "middleware",
12
+ "authentication",
13
+ "jwt",
14
+ "google-auth",
15
+ "rate-limit",
16
+ "cors",
17
+ "validation",
18
+ "sanitization",
19
+ "rbac",
20
+ "api-security",
21
+ "nodejs",
22
+ "backend"
23
+ ],
6
24
  "scripts": {
7
25
  "build": "tsc",
8
26
  "dev": "tsx watch src/index.ts",
package/readme.md CHANGED
@@ -97,7 +97,7 @@ Managing these separately leads to duplicated logic, configuration drift and sub
97
97
 
98
98
  <tr>
99
99
  <td>Logging</td>
100
- <td>Beta</td>
100
+ <td>Better</td>
101
101
  <td>Structured internal logs</td>
102
102
  </tr>
103
103
  </table>
@@ -324,7 +324,7 @@ Choose the style based on complexity and ownership.
324
324
 
325
325
  <h4>express-validator (Rule-Based, Inline)</h4>
326
326
 
327
- <pre><code>import { body } from "express-validator";
327
+ <pre><code>import { HiSecure , body } from "hi-secure";
328
328
 
329
329
  router.post(
330
330
  "/register",
@@ -346,7 +346,7 @@ router.post(
346
346
 
347
347
  <h4>Zod (Schema-Based, Reusable)</h4>
348
348
 
349
- <pre><code>import { z } from "zod";
349
+ <pre><code>import { HiSecure , z } from "hi-secure";
350
350
 
351
351
  const registerSchema = z.object({
352
352
  email: z.string().email(),
@@ -455,9 +455,6 @@ HiSecure.getInstance({
455
455
 
456
456
  <hr/>
457
457
 
458
- <h2>Final Authentication Setup</h2>
459
-
460
- <hr/>
461
458
 
462
459
  <h2>🔐 Final Authentication Setup</h2>
463
460
 
@@ -1,14 +1,57 @@
1
+ // import argon2 from "argon2";
2
+ // import { AdapterError } from "../core/errors/AdapterError";
3
+ // import { logger } from "../logging";
4
+
5
+ // export class ArgonAdapter {
6
+ // private options: argon2.Options | undefined;
7
+
8
+ // constructor(options?: argon2.Options) {
9
+ // if (options) {
10
+ // this.options = options;
11
+ // }
12
+ // }
13
+
14
+ // async hash(value: string): Promise<string> {
15
+ // try {
16
+ // return this.options
17
+ // ? await argon2.hash(value, this.options)
18
+ // : await argon2.hash(value);
19
+ // } catch (err: any) {
20
+ // logger.error("Argon2 hashing failed", {
21
+ // error: err?.message || err
22
+ // });
23
+ // throw new AdapterError("Argon2 hashing failed.");
24
+ // }
25
+ // }
26
+
27
+ // async verify(value: string, hashed: string): Promise<boolean> {
28
+ // try {
29
+ // if (!hashed || typeof hashed !== "string") {
30
+ // throw new AdapterError("Invalid hash provided for verification.");
31
+ // }
32
+
33
+ // return await argon2.verify(hashed, value);
34
+ // } catch (err: any) {
35
+ // logger.error("Argon2 verify failed", {
36
+ // error: err?.message || err
37
+ // });
38
+ // throw new AdapterError("Argon2 verify failed.");
39
+ // }
40
+ // }
41
+ // }
42
+
43
+
44
+
45
+
1
46
  import argon2 from "argon2";
2
47
  import { AdapterError } from "../core/errors/AdapterError";
3
48
  import { logger } from "../logging";
4
49
 
5
50
  export class ArgonAdapter {
6
- private options: argon2.Options | undefined;
51
+ private options?: argon2.Options;
7
52
 
8
53
  constructor(options?: argon2.Options) {
9
- if (options) {
10
- this.options = options;
11
- }
54
+ this.options = options;
12
55
  }
13
56
 
14
57
  async hash(value: string): Promise<string> {
@@ -18,8 +61,11 @@ export class ArgonAdapter {
18
61
  : await argon2.hash(value);
19
62
  } catch (err: any) {
20
63
  logger.error("Argon2 hashing failed", {
21
- error: err?.message || err
64
+ adapter: "argon2",
65
+ operation: "hash",
66
+ reason: err?.message
22
67
  });
68
+
23
69
  throw new AdapterError("Argon2 hashing failed.");
24
70
  }
25
71
  }
@@ -33,8 +79,11 @@ export class ArgonAdapter {
33
79
  return await argon2.verify(hashed, value);
34
80
  } catch (err: any) {
35
81
  logger.error("Argon2 verify failed", {
36
- error: err?.message || err
82
+ adapter: "argon2",
83
+ operation: "verify",
84
+ reason: err?.message
37
85
  });
86
+
38
87
  throw new AdapterError("Argon2 verify failed.");
39
88
  }
40
89
  }