hi-secure 1.0.0

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 (210) hide show
  1. package/dist/adapters/ArgonAdapter.d.ts +8 -0
  2. package/dist/adapters/ArgonAdapter.d.ts.map +1 -0
  3. package/dist/adapters/ArgonAdapter.js +45 -0
  4. package/dist/adapters/ArgonAdapter.js.map +1 -0
  5. package/dist/adapters/BcryptAdapter.d.ts +7 -0
  6. package/dist/adapters/BcryptAdapter.d.ts.map +1 -0
  7. package/dist/adapters/BcryptAdapter.js +48 -0
  8. package/dist/adapters/BcryptAdapter.js.map +1 -0
  9. package/dist/adapters/DomPurifyAdapter.d.ts +13 -0
  10. package/dist/adapters/DomPurifyAdapter.d.ts.map +1 -0
  11. package/dist/adapters/DomPurifyAdapter.js +61 -0
  12. package/dist/adapters/DomPurifyAdapter.js.map +1 -0
  13. package/dist/adapters/ExpressRLAdapter.d.ts +13 -0
  14. package/dist/adapters/ExpressRLAdapter.d.ts.map +1 -0
  15. package/dist/adapters/ExpressRLAdapter.js +68 -0
  16. package/dist/adapters/ExpressRLAdapter.js.map +1 -0
  17. package/dist/adapters/ExpressValidatorAdapter.d.ts +6 -0
  18. package/dist/adapters/ExpressValidatorAdapter.d.ts.map +1 -0
  19. package/dist/adapters/ExpressValidatorAdapter.js +78 -0
  20. package/dist/adapters/ExpressValidatorAdapter.js.map +1 -0
  21. package/dist/adapters/GoggleAdapter.d.ts +15 -0
  22. package/dist/adapters/GoggleAdapter.d.ts.map +1 -0
  23. package/dist/adapters/GoggleAdapter.js +91 -0
  24. package/dist/adapters/GoggleAdapter.js.map +1 -0
  25. package/dist/adapters/GoogleAdapter.d.ts +15 -0
  26. package/dist/adapters/GoogleAdapter.d.ts.map +1 -0
  27. package/dist/adapters/GoogleAdapter.js +159 -0
  28. package/dist/adapters/GoogleAdapter.js.map +1 -0
  29. package/dist/adapters/JWTAdapter.d.ts +28 -0
  30. package/dist/adapters/JWTAdapter.d.ts.map +1 -0
  31. package/dist/adapters/JWTAdapter.js +276 -0
  32. package/dist/adapters/JWTAdapter.js.map +1 -0
  33. package/dist/adapters/RLFlexibleAdapter.d.ts +11 -0
  34. package/dist/adapters/RLFlexibleAdapter.d.ts.map +1 -0
  35. package/dist/adapters/RLFlexibleAdapter.js +115 -0
  36. package/dist/adapters/RLFlexibleAdapter.js.map +1 -0
  37. package/dist/adapters/SanitizeHtmlAdapter.d.ts +12 -0
  38. package/dist/adapters/SanitizeHtmlAdapter.d.ts.map +1 -0
  39. package/dist/adapters/SanitizeHtmlAdapter.js +141 -0
  40. package/dist/adapters/SanitizeHtmlAdapter.js.map +1 -0
  41. package/dist/adapters/XSSAdapter.d.ts +33 -0
  42. package/dist/adapters/XSSAdapter.d.ts.map +1 -0
  43. package/dist/adapters/XSSAdapter.js +127 -0
  44. package/dist/adapters/XSSAdapter.js.map +1 -0
  45. package/dist/adapters/ZodAdapter.d.ts +7 -0
  46. package/dist/adapters/ZodAdapter.d.ts.map +1 -0
  47. package/dist/adapters/ZodAdapter.js +39 -0
  48. package/dist/adapters/ZodAdapter.js.map +1 -0
  49. package/dist/core/HiSecure.d.ts +62 -0
  50. package/dist/core/HiSecure.d.ts.map +1 -0
  51. package/dist/core/HiSecure.js +273 -0
  52. package/dist/core/HiSecure.js.map +1 -0
  53. package/dist/core/config.d.ts +3 -0
  54. package/dist/core/config.d.ts.map +1 -0
  55. package/dist/core/config.js +53 -0
  56. package/dist/core/config.js.map +1 -0
  57. package/dist/core/constants.d.ts +37 -0
  58. package/dist/core/constants.d.ts.map +1 -0
  59. package/dist/core/constants.js +67 -0
  60. package/dist/core/constants.js.map +1 -0
  61. package/dist/core/errors/AdapterError.d.ts +5 -0
  62. package/dist/core/errors/AdapterError.d.ts.map +1 -0
  63. package/dist/core/errors/AdapterError.js +15 -0
  64. package/dist/core/errors/AdapterError.js.map +1 -0
  65. package/dist/core/errors/HttpErrror.d.ts +17 -0
  66. package/dist/core/errors/HttpErrror.d.ts.map +1 -0
  67. package/dist/core/errors/HttpErrror.js +36 -0
  68. package/dist/core/errors/HttpErrror.js.map +1 -0
  69. package/dist/core/errors/SanitizerError.d.ts +5 -0
  70. package/dist/core/errors/SanitizerError.d.ts.map +1 -0
  71. package/dist/core/errors/SanitizerError.js +14 -0
  72. package/dist/core/errors/SanitizerError.js.map +1 -0
  73. package/dist/core/errors/SecurityError.d.ts +5 -0
  74. package/dist/core/errors/SecurityError.d.ts.map +1 -0
  75. package/dist/core/errors/SecurityError.js +14 -0
  76. package/dist/core/errors/SecurityError.js.map +1 -0
  77. package/dist/core/errors/ValidationError.d.ts +5 -0
  78. package/dist/core/errors/ValidationError.d.ts.map +1 -0
  79. package/dist/core/errors/ValidationError.js +14 -0
  80. package/dist/core/errors/ValidationError.js.map +1 -0
  81. package/dist/core/types/HiSecureConfig.d.ts +47 -0
  82. package/dist/core/types/HiSecureConfig.d.ts.map +1 -0
  83. package/dist/core/types/HiSecureConfig.js +3 -0
  84. package/dist/core/types/HiSecureConfig.js.map +1 -0
  85. package/dist/core/types/SecureOptions.d.ts +30 -0
  86. package/dist/core/types/SecureOptions.d.ts.map +1 -0
  87. package/dist/core/types/SecureOptions.js +4 -0
  88. package/dist/core/types/SecureOptions.js.map +1 -0
  89. package/dist/core/useSecure.d.ts +10 -0
  90. package/dist/core/useSecure.d.ts.map +1 -0
  91. package/dist/core/useSecure.js +85 -0
  92. package/dist/core/useSecure.js.map +1 -0
  93. package/dist/examples/e1.d.ts +1 -0
  94. package/dist/examples/e1.d.ts.map +1 -0
  95. package/dist/examples/e1.js +3 -0
  96. package/dist/examples/e1.js.map +1 -0
  97. package/dist/index.d.ts +9 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/dist/index.js +15 -0
  100. package/dist/index.js.map +1 -0
  101. package/dist/logging/index.d.ts +3 -0
  102. package/dist/logging/index.d.ts.map +1 -0
  103. package/dist/logging/index.js +19 -0
  104. package/dist/logging/index.js.map +1 -0
  105. package/dist/logging/morganSetup.d.ts +2 -0
  106. package/dist/logging/morganSetup.d.ts.map +1 -0
  107. package/dist/logging/morganSetup.js +9 -0
  108. package/dist/logging/morganSetup.js.map +1 -0
  109. package/dist/logging/winstonSetup.d.ts +6 -0
  110. package/dist/logging/winstonSetup.d.ts.map +1 -0
  111. package/dist/logging/winstonSetup.js +22 -0
  112. package/dist/logging/winstonSetup.js.map +1 -0
  113. package/dist/managers/AuthManager.d.ts +23 -0
  114. package/dist/managers/AuthManager.d.ts.map +1 -0
  115. package/dist/managers/AuthManager.js +190 -0
  116. package/dist/managers/AuthManager.js.map +1 -0
  117. package/dist/managers/CorsManager.d.ts +9 -0
  118. package/dist/managers/CorsManager.d.ts.map +1 -0
  119. package/dist/managers/CorsManager.js +55 -0
  120. package/dist/managers/CorsManager.js.map +1 -0
  121. package/dist/managers/HashManager.d.ts +22 -0
  122. package/dist/managers/HashManager.d.ts.map +1 -0
  123. package/dist/managers/HashManager.js +319 -0
  124. package/dist/managers/HashManager.js.map +1 -0
  125. package/dist/managers/JsonManager.d.ts +6 -0
  126. package/dist/managers/JsonManager.d.ts.map +1 -0
  127. package/dist/managers/JsonManager.js +142 -0
  128. package/dist/managers/JsonManager.js.map +1 -0
  129. package/dist/managers/RateLimitManager.d.ts +16 -0
  130. package/dist/managers/RateLimitManager.d.ts.map +1 -0
  131. package/dist/managers/RateLimitManager.js +108 -0
  132. package/dist/managers/RateLimitManager.js.map +1 -0
  133. package/dist/managers/SanitizerManager.d.ts +18 -0
  134. package/dist/managers/SanitizerManager.d.ts.map +1 -0
  135. package/dist/managers/SanitizerManager.js +296 -0
  136. package/dist/managers/SanitizerManager.js.map +1 -0
  137. package/dist/managers/ValidatorManager.d.ts +13 -0
  138. package/dist/managers/ValidatorManager.d.ts.map +1 -0
  139. package/dist/managers/ValidatorManager.js +218 -0
  140. package/dist/managers/ValidatorManager.js.map +1 -0
  141. package/dist/middlewares/errorHandler.d.ts +3 -0
  142. package/dist/middlewares/errorHandler.d.ts.map +1 -0
  143. package/dist/middlewares/errorHandler.js +94 -0
  144. package/dist/middlewares/errorHandler.js.map +1 -0
  145. package/dist/middlewares/index.d.ts +3 -0
  146. package/dist/middlewares/index.d.ts.map +1 -0
  147. package/dist/middlewares/index.js +19 -0
  148. package/dist/middlewares/index.js.map +1 -0
  149. package/dist/middlewares/requestLogger.d.ts +2 -0
  150. package/dist/middlewares/requestLogger.d.ts.map +1 -0
  151. package/dist/middlewares/requestLogger.js +8 -0
  152. package/dist/middlewares/requestLogger.js.map +1 -0
  153. package/dist/test/t1.d.ts +1 -0
  154. package/dist/test/t1.d.ts.map +1 -0
  155. package/dist/test/t1.js +3 -0
  156. package/dist/test/t1.js.map +1 -0
  157. package/dist/utils/deepFreeze.d.ts +2 -0
  158. package/dist/utils/deepFreeze.d.ts.map +1 -0
  159. package/dist/utils/deepFreeze.js +69 -0
  160. package/dist/utils/deepFreeze.js.map +1 -0
  161. package/dist/utils/deepMerge.d.ts +5 -0
  162. package/dist/utils/deepMerge.d.ts.map +1 -0
  163. package/dist/utils/deepMerge.js +68 -0
  164. package/dist/utils/deepMerge.js.map +1 -0
  165. package/dist/utils/normalizeOptions.d.ts +38 -0
  166. package/dist/utils/normalizeOptions.d.ts.map +1 -0
  167. package/dist/utils/normalizeOptions.js +119 -0
  168. package/dist/utils/normalizeOptions.js.map +1 -0
  169. package/package.json +50 -0
  170. package/src/adapters/ArgonAdapter.ts +41 -0
  171. package/src/adapters/BcryptAdapter.ts +49 -0
  172. package/src/adapters/ExpressRLAdapter.ts +84 -0
  173. package/src/adapters/ExpressValidatorAdapter.ts +99 -0
  174. package/src/adapters/GoogleAdapter.ts +206 -0
  175. package/src/adapters/JWTAdapter.ts +346 -0
  176. package/src/adapters/RLFlexibleAdapter.ts +139 -0
  177. package/src/adapters/SanitizeHtmlAdapter.ts +162 -0
  178. package/src/adapters/XSSAdapter.ts +153 -0
  179. package/src/adapters/ZodAdapter.ts +91 -0
  180. package/src/core/HiSecure.ts +955 -0
  181. package/src/core/config.ts +156 -0
  182. package/src/core/constants.ts +73 -0
  183. package/src/core/errors/AdapterError.ts +14 -0
  184. package/src/core/errors/HttpErrror.ts +46 -0
  185. package/src/core/errors/SanitizerError.ts +13 -0
  186. package/src/core/errors/SecurityError.ts +13 -0
  187. package/src/core/errors/ValidationError.ts +13 -0
  188. package/src/core/types/HiSecureConfig.ts +62 -0
  189. package/src/core/types/SecureOptions.ts +61 -0
  190. package/src/core/useSecure.ts +111 -0
  191. package/src/examples/e1.ts +1 -0
  192. package/src/index.ts +17 -0
  193. package/src/logging/index.ts +2 -0
  194. package/src/logging/morganSetup.ts +3 -0
  195. package/src/logging/winstonSetup.ts +17 -0
  196. package/src/managers/AuthManager.ts +237 -0
  197. package/src/managers/CorsManager.ts +58 -0
  198. package/src/managers/HashManager.ts +390 -0
  199. package/src/managers/JsonManager.ts +149 -0
  200. package/src/managers/RateLimitManager.ts +368 -0
  201. package/src/managers/SanitizerManager.ts +359 -0
  202. package/src/managers/ValidatorManager.ts +269 -0
  203. package/src/middlewares/errorHandler.ts +265 -0
  204. package/src/middlewares/index.ts +2 -0
  205. package/src/middlewares/requestLogger.ts +5 -0
  206. package/src/test/t1.ts +1 -0
  207. package/src/utils/deepFreeze.ts +76 -0
  208. package/src/utils/deepMerge.ts +87 -0
  209. package/src/utils/normalizeOptions.ts +265 -0
  210. package/tsconfig.json +30 -0
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ // import { Request, Response, NextFunction } from "express";
3
+ // import { logger } from "../logging";
4
+ // import { AdapterError } from "../core/errors/AdapterError";
5
+ // import { ValidationError } from "../core/errors/ValidationError";
6
+ // import { SanitizerError } from "../core/errors/SanitizerError";
7
+ // import { SecurityError } from "../core/errors/SecurityError";
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.errorHandler = errorHandler;
10
+ const logging_1 = require("../logging");
11
+ const AdapterError_js_1 = require("../core/errors/AdapterError.js");
12
+ const ValidationError_js_1 = require("../core/errors/ValidationError.js");
13
+ const SanitizerError_js_1 = require("../core/errors/SanitizerError.js");
14
+ const SecurityError_js_1 = require("../core/errors/SecurityError.js");
15
+ const HttpErrror_js_1 = require("../core/errors/HttpErrror.js");
16
+ function errorHandler(err, req, res, _next) {
17
+ const message = typeof err === "string"
18
+ ? err
19
+ : err?.message || "Unknown error";
20
+ const stack = err instanceof Error && err.stack
21
+ ? err.stack.split("\n").slice(0, 2).join(" | ")
22
+ : undefined;
23
+ // Unified logging
24
+ logging_1.logger.error("❌ HiSecure Error", {
25
+ type: err?.name || "UnknownError",
26
+ message,
27
+ status: err?.status,
28
+ code: err?.code,
29
+ path: req.path,
30
+ method: req.method,
31
+ stack,
32
+ raw: err,
33
+ });
34
+ // ---------------------------------------------------
35
+ // 1. HttpError (developer thrown)
36
+ // ---------------------------------------------------
37
+ if (err instanceof HttpErrror_js_1.HttpError) {
38
+ return res.status(err.status).json({
39
+ success: false,
40
+ error: err.code,
41
+ message: err.message,
42
+ details: err.details || undefined,
43
+ });
44
+ }
45
+ // ---------------------------------------------------
46
+ // 2. Validation Errors
47
+ // ---------------------------------------------------
48
+ if (err instanceof ValidationError_js_1.ValidationError) {
49
+ return res.status(400).json({
50
+ success: false,
51
+ error: "VALIDATION_ERROR",
52
+ message,
53
+ });
54
+ }
55
+ // ---------------------------------------------------
56
+ // 3. Sanitizer Errors
57
+ // ---------------------------------------------------
58
+ if (err instanceof SanitizerError_js_1.SanitizerError) {
59
+ return res.status(400).json({
60
+ success: false,
61
+ error: "SANITIZER_ERROR",
62
+ message,
63
+ });
64
+ }
65
+ // ---------------------------------------------------
66
+ // 4. Adapter Errors (hashing, rate-limit, sanitizer, validator ...)
67
+ // ---------------------------------------------------
68
+ if (err instanceof AdapterError_js_1.AdapterError) {
69
+ return res.status(500).json({
70
+ success: false,
71
+ error: "ADAPTER_ERROR",
72
+ message,
73
+ });
74
+ }
75
+ // ---------------------------------------------------
76
+ // 5. Security Errors (internal library security logic)
77
+ // ---------------------------------------------------
78
+ if (err instanceof SecurityError_js_1.SecurityError) {
79
+ return res.status(500).json({
80
+ success: false,
81
+ error: "SECURITY_ERROR",
82
+ message,
83
+ });
84
+ }
85
+ // ---------------------------------------------------
86
+ // 6. Fallback → Unexpected
87
+ // ---------------------------------------------------
88
+ return res.status(500).json({
89
+ success: false,
90
+ error: "INTERNAL_SERVER_ERROR",
91
+ message: "An unexpected error occurred in HiSecure.",
92
+ });
93
+ }
94
+ //# sourceMappingURL=errorHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorHandler.js","sourceRoot":"","sources":["../../src/middlewares/errorHandler.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,uCAAuC;AACvC,8DAA8D;AAC9D,oEAAoE;AACpE,kEAAkE;AAClE,gEAAgE;;AAuKhE,oCA4FC;AApGD,wCAAoC;AAEpC,oEAA8D;AAC9D,0EAAoE;AACpE,wEAAkE;AAClE,sEAAgE;AAChE,gEAAyD;AAEzD,SAAgB,YAAY,CACxB,GAAQ,EACR,GAAY,EACZ,GAAa,EACb,KAAmB;IAEnB,MAAM,OAAO,GACT,OAAO,GAAG,KAAK,QAAQ;QACnB,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,GAAG,EAAE,OAAO,IAAI,eAAe,CAAC;IAE1C,MAAM,KAAK,GACP,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,KAAK;QAC7B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QAC/C,CAAC,CAAC,SAAS,CAAC;IAEpB,kBAAkB;IAClB,gBAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE;QAC7B,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,cAAc;QACjC,OAAO;QACP,MAAM,EAAE,GAAG,EAAE,MAAM;QACnB,IAAI,EAAE,GAAG,EAAE,IAAI;QACf,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,KAAK;QACL,GAAG,EAAE,GAAG;KACX,CAAC,CAAC;IAEH,sDAAsD;IACtD,kCAAkC;IAClC,sDAAsD;IACtD,IAAI,GAAG,YAAY,yBAAS,EAAE,CAAC;QAC3B,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;YAC/B,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,GAAG,CAAC,IAAI;YACf,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,SAAS;SACpC,CAAC,CAAC;IACP,CAAC;IAED,sDAAsD;IACtD,uBAAuB;IACvB,sDAAsD;IACtD,IAAI,GAAG,YAAY,oCAAe,EAAE,CAAC;QACjC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACxB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,kBAAkB;YACzB,OAAO;SACV,CAAC,CAAC;IACP,CAAC;IAED,sDAAsD;IACtD,sBAAsB;IACtB,sDAAsD;IACtD,IAAI,GAAG,YAAY,kCAAc,EAAE,CAAC;QAChC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACxB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,iBAAiB;YACxB,OAAO;SACV,CAAC,CAAC;IACP,CAAC;IAED,sDAAsD;IACtD,oEAAoE;IACpE,sDAAsD;IACtD,IAAI,GAAG,YAAY,8BAAY,EAAE,CAAC;QAC9B,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACxB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,eAAe;YACtB,OAAO;SACV,CAAC,CAAC;IACP,CAAC;IAED,sDAAsD;IACtD,uDAAuD;IACvD,sDAAsD;IACtD,IAAI,GAAG,YAAY,gCAAa,EAAE,CAAC;QAC/B,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACxB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,gBAAgB;YACvB,OAAO;SACV,CAAC,CAAC;IACP,CAAC;IAED,sDAAsD;IACtD,2BAA2B;IAC3B,sDAAsD;IACtD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACxB,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,uBAAuB;QAC9B,OAAO,EAAE,2CAA2C;KACvD,CAAC,CAAC;AACP,CAAC","sourcesContent":["// import { Request, Response, NextFunction } from \"express\";\r\n// import { logger } from \"../logging\";\r\n// import { AdapterError } from \"../core/errors/AdapterError\";\r\n// import { ValidationError } from \"../core/errors/ValidationError\";\r\n// import { SanitizerError } from \"../core/errors/SanitizerError\";\r\n// import { SecurityError } from \"../core/errors/SecurityError\";\r\n\r\n// export function errorHandler(\r\n// err: any,\r\n// req: Request,\r\n// res: Response,\r\n// _next: NextFunction\r\n// ) {\r\n// // Normalize unknown errors\r\n// const errorMessage =\r\n// typeof err === \"string\"\r\n// ? err\r\n// : err?.message || \"Unknown error occurred\";\r\n\r\n// const errorStack =\r\n// err instanceof Error && err.stack\r\n// ? err.stack.split(\"\\n\").slice(0, 2).join(\" | \")\r\n// : undefined;\r\n\r\n// // Log error centrally\r\n// logger.error(\"❌ HiSecure Error Captured\", {\r\n// message: errorMessage,\r\n// path: req.path,\r\n// method: req.method,\r\n// stack: errorStack,\r\n// raw: err\r\n// });\r\n\r\n// // ------------------------------\r\n// // CLASSIFIED ERROR RESPONSES\r\n// // ------------------------------\r\n\r\n// if (err instanceof ValidationError) {\r\n// return res.status(400).json({\r\n// success: false,\r\n// error: \"VALIDATION_ERROR\",\r\n// message: errorMessage\r\n// });\r\n// }\r\n\r\n// if (err instanceof SanitizerError) {\r\n// return res.status(400).json({\r\n// success: false,\r\n// error: \"SANITIZER_ERROR\",\r\n// message: errorMessage\r\n// });\r\n// }\r\n\r\n// if (err instanceof AdapterError) {\r\n// return res.status(500).json({\r\n// success: false,\r\n// error: \"ADAPTER_ERROR\",\r\n// message: errorMessage\r\n// });\r\n// }\r\n\r\n// if (err instanceof SecurityError) {\r\n// return res.status(500).json({\r\n// success: false,\r\n// error: \"SECURITY_ERROR\",\r\n// message: errorMessage\r\n// });\r\n// }\r\n\r\n// // ------------------------------\r\n// // UNEXPECTED ERROR\r\n// // ------------------------------\r\n// return res.status(500).json({\r\n// success: false,\r\n// error: \"INTERNAL_SERVER_ERROR\",\r\n// message: \"An unexpected error occurred in HiSecure middleware.\"\r\n// });\r\n// }\r\n\r\n\r\n\r\n\r\n// import { Request, Response, NextFunction } from \"express\";\r\n// import { logger } from \"../logging\";\r\n// import { AdapterError } from \"../core/errors/AdapterError\";\r\n// import { ValidationError } from \"../core/errors/ValidationError\";\r\n// import { SanitizerError } from \"../core/errors/SanitizerError\";\r\n// import { SecurityError } from \"../core/errors/SecurityError\";\r\n\r\n// export function errorHandler(\r\n// err: any,\r\n// req: Request,\r\n// res: Response,\r\n// _next: NextFunction\r\n// ) {\r\n// // Normalize unknown errors\r\n// const errorMessage =\r\n// typeof err === \"string\"\r\n// ? err\r\n// : err?.message || \"Unknown error occurred\";\r\n\r\n// const errorStack =\r\n// err instanceof Error && err.stack\r\n// ? err.stack.split(\"\\n\").slice(0, 2).join(\" | \")\r\n// : undefined;\r\n\r\n// // Log error centrally\r\n// logger.error(\"❌ HiSecure Error Captured\", {\r\n// message: errorMessage,\r\n// path: req.path,\r\n// method: req.method,\r\n// stack: errorStack,\r\n// raw: err\r\n// });\r\n\r\n// // ------------------------------\r\n// // CLASSIFIED ERROR RESPONSES\r\n// // ------------------------------\r\n\r\n// if (err instanceof ValidationError) {\r\n// return res.status(400).json({\r\n// success: false,\r\n// error: \"VALIDATION_ERROR\",\r\n// message: errorMessage\r\n// });\r\n// }\r\n\r\n// if (err instanceof SanitizerError) {\r\n// return res.status(400).json({\r\n// success: false,\r\n// error: \"SANITIZER_ERROR\",\r\n// message: errorMessage\r\n// });\r\n// }\r\n\r\n// if (err instanceof AdapterError) {\r\n// return res.status(500).json({\r\n// success: false,\r\n// error: \"ADAPTER_ERROR\",\r\n// message: errorMessage\r\n// });\r\n// }\r\n\r\n// if (err instanceof SecurityError) {\r\n// return res.status(500).json({\r\n// success: false,\r\n// error: \"SECURITY_ERROR\",\r\n// message: errorMessage\r\n// });\r\n// }\r\n\r\n// // ------------------------------\r\n// // UNEXPECTED ERROR\r\n// // ------------------------------\r\n// return res.status(500).json({\r\n// success: false,\r\n// error: \"INTERNAL_SERVER_ERROR\",\r\n// message: \"An unexpected error occurred in HiSecure middleware.\"\r\n// });\r\n// }\r\n\r\n\r\n\r\nimport { Request, Response, NextFunction } from \"express\";\r\nimport { logger } from \"../logging\";\r\n\r\nimport { AdapterError } from \"../core/errors/AdapterError.js\";\r\nimport { ValidationError } from \"../core/errors/ValidationError.js\";\r\nimport { SanitizerError } from \"../core/errors/SanitizerError.js\";\r\nimport { SecurityError } from \"../core/errors/SecurityError.js\";\r\nimport { HttpError } from \"../core/errors/HttpErrror.js\";\r\n\r\nexport function errorHandler(\r\n err: any,\r\n req: Request,\r\n res: Response,\r\n _next: NextFunction\r\n) {\r\n const message =\r\n typeof err === \"string\"\r\n ? err\r\n : err?.message || \"Unknown error\";\r\n\r\n const stack =\r\n err instanceof Error && err.stack\r\n ? err.stack.split(\"\\n\").slice(0, 2).join(\" | \")\r\n : undefined;\r\n\r\n // Unified logging\r\n logger.error(\"❌ HiSecure Error\", {\r\n type: err?.name || \"UnknownError\",\r\n message,\r\n status: err?.status,\r\n code: err?.code,\r\n path: req.path,\r\n method: req.method,\r\n stack,\r\n raw: err,\r\n });\r\n\r\n // ---------------------------------------------------\r\n // 1. HttpError (developer thrown)\r\n // ---------------------------------------------------\r\n if (err instanceof HttpError) {\r\n return res.status(err.status).json({\r\n success: false,\r\n error: err.code,\r\n message: err.message,\r\n details: err.details || undefined,\r\n });\r\n }\r\n\r\n // ---------------------------------------------------\r\n // 2. Validation Errors\r\n // ---------------------------------------------------\r\n if (err instanceof ValidationError) {\r\n return res.status(400).json({\r\n success: false,\r\n error: \"VALIDATION_ERROR\",\r\n message,\r\n });\r\n }\r\n\r\n // ---------------------------------------------------\r\n // 3. Sanitizer Errors\r\n // ---------------------------------------------------\r\n if (err instanceof SanitizerError) {\r\n return res.status(400).json({\r\n success: false,\r\n error: \"SANITIZER_ERROR\",\r\n message,\r\n });\r\n }\r\n\r\n // ---------------------------------------------------\r\n // 4. Adapter Errors (hashing, rate-limit, sanitizer, validator ...)\r\n // ---------------------------------------------------\r\n if (err instanceof AdapterError) {\r\n return res.status(500).json({\r\n success: false,\r\n error: \"ADAPTER_ERROR\",\r\n message,\r\n });\r\n }\r\n\r\n // ---------------------------------------------------\r\n // 5. Security Errors (internal library security logic)\r\n // ---------------------------------------------------\r\n if (err instanceof SecurityError) {\r\n return res.status(500).json({\r\n success: false,\r\n error: \"SECURITY_ERROR\",\r\n message,\r\n });\r\n }\r\n\r\n // ---------------------------------------------------\r\n // 6. Fallback → Unexpected\r\n // ---------------------------------------------------\r\n return res.status(500).json({\r\n success: false,\r\n error: \"INTERNAL_SERVER_ERROR\",\r\n message: \"An unexpected error occurred in HiSecure.\",\r\n });\r\n}\r\n"]}
@@ -0,0 +1,3 @@
1
+ export * from "./requestLogger.js";
2
+ export * from "./errorHandler.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middlewares/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./requestLogger.js"), exports);
18
+ __exportStar(require("./errorHandler.js"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middlewares/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,oDAAkC","sourcesContent":["export * from \"./requestLogger.js\";\r\nexport * from \"./errorHandler.js\";\r\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function httpLogger(): (req: import("http").IncomingMessage, res: import("http").ServerResponse<import("http").IncomingMessage>, callback: (err?: Error) => void) => void;
2
+ //# sourceMappingURL=requestLogger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestLogger.d.ts","sourceRoot":"","sources":["../../src/middlewares/requestLogger.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,4HAG6E,CAAC,0BADvG"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.httpLogger = httpLogger;
4
+ const logging_1 = require("../logging");
5
+ function httpLogger() {
6
+ return logging_1.requestLogger;
7
+ }
8
+ //# sourceMappingURL=requestLogger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestLogger.js","sourceRoot":"","sources":["../../src/middlewares/requestLogger.ts"],"names":[],"mappings":";;AAEA,gCAEC;AAJD,wCAA2C;AAE3C,SAAgB,UAAU;IACtB,OAAO,uBAAa,CAAC;AACzB,CAAC","sourcesContent":["import { requestLogger } from \"../logging\";\r\n\r\nexport function httpLogger() {\r\n return requestLogger;\r\n}\r\n"]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=t1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"t1.d.ts","sourceRoot":"","sources":["../../src/test/t1.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ // dekhete hai baad mein
3
+ //# sourceMappingURL=t1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"t1.js","sourceRoot":"","sources":["../../src/test/t1.ts"],"names":[],"mappings":";AAAA,wBAAwB","sourcesContent":["// dekhete hai baad mein"]}
@@ -0,0 +1,2 @@
1
+ export declare function deepFreeze<T>(obj: T, visited?: WeakSet<object>): T;
2
+ //# sourceMappingURL=deepFreeze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepFreeze.d.ts","sourceRoot":"","sources":["../../src/utils/deepFreeze.ts"],"names":[],"mappings":"AAwBA,wBAAgB,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,kBAAgB,GAAG,CAAC,CAmDhE"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ // export function deepFreeze<T>(obj: T): T {
3
+ // // Freeze the top level object
4
+ // Object.freeze(obj);
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.deepFreeze = deepFreeze;
7
+ // // Now recursively freeze nested objects
8
+ // Object.getOwnPropertyNames(obj).forEach((prop) => {
9
+ // // @ts-ignore
10
+ // const value = obj[prop];
11
+ // if (
12
+ // value &&
13
+ // (typeof value === "object" || typeof value === "function") &&
14
+ // !Object.isFrozen(value)
15
+ // ) {
16
+ // deepFreeze(value); // recursive freeze
17
+ // }
18
+ // });
19
+ // return obj;
20
+ // }
21
+ function deepFreeze(obj, visited = new WeakSet()) {
22
+ // Handle primitives and null/undefined
23
+ if (obj === null || obj === undefined)
24
+ return obj;
25
+ if (typeof obj !== 'object' && typeof obj !== 'function')
26
+ return obj;
27
+ // Handle circular references
28
+ if (visited.has(obj))
29
+ return obj;
30
+ visited.add(obj);
31
+ // Don't freeze built-in objects that shouldn't be frozen
32
+ const constructor = obj.constructor;
33
+ const builtIns = [Date, RegExp, Map, Set, WeakMap, WeakSet, Promise];
34
+ if (builtIns.some(builtIn => obj instanceof builtIn)) {
35
+ return obj;
36
+ }
37
+ // Don't freeze functions
38
+ if (typeof obj === 'function')
39
+ return obj;
40
+ // Freeze the object itself
41
+ Object.freeze(obj);
42
+ // Freeze array elements
43
+ if (Array.isArray(obj)) {
44
+ for (const item of obj) {
45
+ if (item && typeof item === 'object') {
46
+ deepFreeze(item, visited);
47
+ }
48
+ }
49
+ return obj;
50
+ }
51
+ // Freeze object properties
52
+ const props = Object.getOwnPropertyNames(obj);
53
+ for (const prop of props) {
54
+ const value = obj[prop];
55
+ if (value && typeof value === 'object') {
56
+ deepFreeze(value, visited);
57
+ }
58
+ }
59
+ // Freeze symbol properties
60
+ const symbols = Object.getOwnPropertySymbols(obj);
61
+ for (const sym of symbols) {
62
+ const value = obj[sym];
63
+ if (value && typeof value === 'object') {
64
+ deepFreeze(value, visited);
65
+ }
66
+ }
67
+ return obj;
68
+ }
69
+ //# sourceMappingURL=deepFreeze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepFreeze.js","sourceRoot":"","sources":["../../src/utils/deepFreeze.ts"],"names":[],"mappings":";AAAA,6CAA6C;AAC7C,qCAAqC;AACrC,0BAA0B;;AAsB1B,gCAmDC;AAvED,+CAA+C;AAC/C,0DAA0D;AAC1D,wBAAwB;AACxB,mCAAmC;AAEnC,eAAe;AACf,uBAAuB;AACvB,4EAA4E;AAC5E,sCAAsC;AACtC,cAAc;AACd,qDAAqD;AACrD,YAAY;AACZ,UAAU;AAEV,kBAAkB;AAClB,IAAI;AAKJ,SAAgB,UAAU,CAAI,GAAM,EAAE,OAAO,GAAG,IAAI,OAAO,EAAE;IACzD,uCAAuC;IACvC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IAClD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,UAAU;QAAE,OAAO,GAAG,CAAC;IAErE,6BAA6B;IAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEjB,yDAAyD;IACzD,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;IACpC,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACrE,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,YAAY,OAAO,CAAC,EAAE,CAAC;QACnD,OAAO,GAAG,CAAC;IACf,CAAC;IAED,yBAAyB;IACzB,IAAI,OAAO,GAAG,KAAK,UAAU;QAAE,OAAO,GAAG,CAAC;IAE1C,2BAA2B;IAC3B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEnB,wBAAwB;IACxB,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;YACrB,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACnC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC9B,CAAC;QACL,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAED,2BAA2B;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,KAAK,GAAI,GAAW,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC/B,CAAC;IACL,CAAC;IAED,2BAA2B;IAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAClD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,KAAK,GAAI,GAAW,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC/B,CAAC;IACL,CAAC;IAED,OAAO,GAAG,CAAC;AACf,CAAC","sourcesContent":["// export function deepFreeze<T>(obj: T): T {\r\n// // Freeze the top level object\r\n// Object.freeze(obj);\r\n\r\n// // Now recursively freeze nested objects\r\n// Object.getOwnPropertyNames(obj).forEach((prop) => {\r\n// // @ts-ignore\r\n// const value = obj[prop];\r\n\r\n// if (\r\n// value &&\r\n// (typeof value === \"object\" || typeof value === \"function\") &&\r\n// !Object.isFrozen(value)\r\n// ) {\r\n// deepFreeze(value); // recursive freeze\r\n// }\r\n// });\r\n\r\n// return obj;\r\n// }\r\n\r\n\r\n\r\n\r\nexport function deepFreeze<T>(obj: T, visited = new WeakSet()): T {\r\n // Handle primitives and null/undefined\r\n if (obj === null || obj === undefined) return obj;\r\n if (typeof obj !== 'object' && typeof obj !== 'function') return obj;\r\n \r\n // Handle circular references\r\n if (visited.has(obj)) return obj;\r\n visited.add(obj);\r\n \r\n // Don't freeze built-in objects that shouldn't be frozen\r\n const constructor = obj.constructor;\r\n const builtIns = [Date, RegExp, Map, Set, WeakMap, WeakSet, Promise];\r\n if (builtIns.some(builtIn => obj instanceof builtIn)) {\r\n return obj;\r\n }\r\n \r\n // Don't freeze functions\r\n if (typeof obj === 'function') return obj;\r\n \r\n // Freeze the object itself\r\n Object.freeze(obj);\r\n \r\n // Freeze array elements\r\n if (Array.isArray(obj)) {\r\n for (const item of obj) {\r\n if (item && typeof item === 'object') {\r\n deepFreeze(item, visited);\r\n }\r\n }\r\n return obj;\r\n }\r\n \r\n // Freeze object properties\r\n const props = Object.getOwnPropertyNames(obj);\r\n for (const prop of props) {\r\n const value = (obj as any)[prop];\r\n if (value && typeof value === 'object') {\r\n deepFreeze(value, visited);\r\n }\r\n }\r\n \r\n // Freeze symbol properties\r\n const symbols = Object.getOwnPropertySymbols(obj);\r\n for (const sym of symbols) {\r\n const value = (obj as any)[sym];\r\n if (value && typeof value === 'object') {\r\n deepFreeze(value, visited);\r\n }\r\n }\r\n \r\n return obj;\r\n}"]}
@@ -0,0 +1,5 @@
1
+ export declare function deepMerge<T extends object, U extends Partial<T>>(target: T, source: U, options?: {
2
+ mergeArrays?: boolean;
3
+ skipUndefined?: boolean;
4
+ }): T & U;
5
+ //# sourceMappingURL=deepMerge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepMerge.d.ts","sourceRoot":"","sources":["../../src/utils/deepMerge.ts"],"names":[],"mappings":"AA6BA,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,EAC5D,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,CAAC,EACT,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GACjE,CAAC,GAAG,CAAC,CAqDP"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ // export function deepMerge<T>(target: T, source: Partial<T>): T {
3
+ // if (!source) return target;
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.deepMerge = deepMerge;
6
+ // const output: any = Array.isArray(target) ? [...(target as any)] : { ...(target as any) };
7
+ // for (const key of Object.keys(source) as Array<keyof typeof source>) {
8
+ // const sourceValue = (source as any)[key];
9
+ // const targetValue = (target as any)[key];
10
+ // const shouldRecurse =
11
+ // sourceValue &&
12
+ // typeof sourceValue === "object" &&
13
+ // !Array.isArray(sourceValue) &&
14
+ // targetValue &&
15
+ // typeof targetValue === "object";
16
+ // if (shouldRecurse) {
17
+ // output[key] = deepMerge(targetValue, sourceValue);
18
+ // } else {
19
+ // output[key] = sourceValue;
20
+ // }
21
+ // }
22
+ // return output;
23
+ // }
24
+ function deepMerge(target, source, options = {}) {
25
+ const { mergeArrays = false, skipUndefined = true } = options;
26
+ if (!source || typeof source !== 'object') {
27
+ return target;
28
+ }
29
+ const output = Array.isArray(target)
30
+ ? [...target]
31
+ : { ...target };
32
+ for (const key in source) {
33
+ if (!source.hasOwnProperty(key))
34
+ continue;
35
+ const sourceValue = source[key];
36
+ const targetValue = target[key];
37
+ // Skip undefined values if configured
38
+ if (skipUndefined && sourceValue === undefined)
39
+ continue;
40
+ // Handle null explicitly
41
+ if (sourceValue === null) {
42
+ output[key] = null;
43
+ continue;
44
+ }
45
+ // Merge arrays if option enabled
46
+ if (mergeArrays && Array.isArray(targetValue) && Array.isArray(sourceValue)) {
47
+ output[key] = [...targetValue, ...sourceValue];
48
+ continue;
49
+ }
50
+ // Recursive merge for plain objects
51
+ if (sourceValue && typeof sourceValue === 'object' &&
52
+ targetValue && typeof targetValue === 'object' &&
53
+ !Array.isArray(sourceValue) && !Array.isArray(targetValue) &&
54
+ sourceValue.constructor === Object && targetValue.constructor === Object) {
55
+ output[key] = deepMerge(targetValue, sourceValue, options);
56
+ continue;
57
+ }
58
+ // Overwrite for everything else
59
+ output[key] = sourceValue;
60
+ }
61
+ // Handle symbol properties
62
+ const symbols = Object.getOwnPropertySymbols(source);
63
+ for (const sym of symbols) {
64
+ output[sym] = source[sym];
65
+ }
66
+ return output;
67
+ }
68
+ //# sourceMappingURL=deepMerge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepMerge.js","sourceRoot":"","sources":["../../src/utils/deepMerge.ts"],"names":[],"mappings":";AAAA,mEAAmE;AACnE,gCAAgC;;AA4BhC,8BAyDC;AAnFD,+FAA+F;AAE/F,2EAA2E;AAC3E,gDAAgD;AAChD,gDAAgD;AAEhD,4BAA4B;AAC5B,uBAAuB;AACvB,2CAA2C;AAC3C,uCAAuC;AACvC,uBAAuB;AACvB,yCAAyC;AAEzC,2BAA2B;AAC3B,2DAA2D;AAC3D,eAAe;AACf,mCAAmC;AACnC,QAAQ;AACR,MAAM;AAEN,mBAAmB;AACnB,IAAI;AAKJ,SAAgB,SAAS,CACrB,MAAS,EACT,MAAS,EACT,UAA8D,EAAE;IAEhE,MAAM,EAAE,WAAW,GAAG,KAAK,EAAE,aAAa,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAE9D,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,MAAe,CAAC;IAC3B,CAAC;IAED,MAAM,MAAM,GAAQ,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACrC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QACb,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;IAEpB,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC;YAAE,SAAS;QAE1C,MAAM,WAAW,GAAI,MAAc,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,WAAW,GAAI,MAAc,CAAC,GAAG,CAAC,CAAC;QAEzC,sCAAsC;QACtC,IAAI,aAAa,IAAI,WAAW,KAAK,SAAS;YAAE,SAAS;QAEzD,yBAAyB;QACzB,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YACnB,SAAS;QACb,CAAC;QAED,iCAAiC;QACjC,IAAI,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1E,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,WAAW,CAAC,CAAC;YAC/C,SAAS;QACb,CAAC;QAED,oCAAoC;QACpC,IAAI,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ;YAC9C,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ;YAC9C,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;YAC1D,WAAW,CAAC,WAAW,KAAK,MAAM,IAAI,WAAW,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;YAE3E,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;YAC3D,SAAS;QACb,CAAC;QAED,gCAAgC;QAChC,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;IAC9B,CAAC;IAED,2BAA2B;IAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACrD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,CAAC,GAAI,MAAc,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,MAAe,CAAC;AAC3B,CAAC","sourcesContent":["// export function deepMerge<T>(target: T, source: Partial<T>): T {\r\n// if (!source) return target;\r\n\r\n// const output: any = Array.isArray(target) ? [...(target as any)] : { ...(target as any) };\r\n\r\n// for (const key of Object.keys(source) as Array<keyof typeof source>) {\r\n// const sourceValue = (source as any)[key];\r\n// const targetValue = (target as any)[key];\r\n\r\n// const shouldRecurse =\r\n// sourceValue &&\r\n// typeof sourceValue === \"object\" &&\r\n// !Array.isArray(sourceValue) &&\r\n// targetValue &&\r\n// typeof targetValue === \"object\";\r\n\r\n// if (shouldRecurse) {\r\n// output[key] = deepMerge(targetValue, sourceValue);\r\n// } else {\r\n// output[key] = sourceValue;\r\n// }\r\n// }\r\n\r\n// return output;\r\n// }\r\n\r\n\r\n\r\n\r\nexport function deepMerge<T extends object, U extends Partial<T>>(\r\n target: T,\r\n source: U,\r\n options: { mergeArrays?: boolean; skipUndefined?: boolean } = {}\r\n): T & U {\r\n const { mergeArrays = false, skipUndefined = true } = options;\r\n \r\n if (!source || typeof source !== 'object') {\r\n return target as T & U;\r\n }\r\n \r\n const output: any = Array.isArray(target) \r\n ? [...target] \r\n : { ...target };\r\n \r\n for (const key in source) {\r\n if (!source.hasOwnProperty(key)) continue;\r\n \r\n const sourceValue = (source as any)[key];\r\n const targetValue = (target as any)[key];\r\n \r\n // Skip undefined values if configured\r\n if (skipUndefined && sourceValue === undefined) continue;\r\n \r\n // Handle null explicitly\r\n if (sourceValue === null) {\r\n output[key] = null;\r\n continue;\r\n }\r\n \r\n // Merge arrays if option enabled\r\n if (mergeArrays && Array.isArray(targetValue) && Array.isArray(sourceValue)) {\r\n output[key] = [...targetValue, ...sourceValue];\r\n continue;\r\n }\r\n \r\n // Recursive merge for plain objects\r\n if (sourceValue && typeof sourceValue === 'object' &&\r\n targetValue && typeof targetValue === 'object' &&\r\n !Array.isArray(sourceValue) && !Array.isArray(targetValue) &&\r\n sourceValue.constructor === Object && targetValue.constructor === Object) {\r\n \r\n output[key] = deepMerge(targetValue, sourceValue, options);\r\n continue;\r\n }\r\n \r\n // Overwrite for everything else\r\n output[key] = sourceValue;\r\n }\r\n \r\n // Handle symbol properties\r\n const symbols = Object.getOwnPropertySymbols(source);\r\n for (const sym of symbols) {\r\n output[sym] = (source as any)[sym];\r\n }\r\n \r\n return output as T & U;\r\n}"]}
@@ -0,0 +1,38 @@
1
+ import { SecureOptions, // ✅ ADD THIS
2
+ RateLimitOptions, // ✅ ADD THIS
3
+ SanitizeOptions } from "../core/types/SecureOptions.js";
4
+ export interface NormalizedOptions {
5
+ cors: {
6
+ enabled: boolean;
7
+ options?: object;
8
+ };
9
+ rateLimit: {
10
+ enabled: boolean;
11
+ mode?: "strict" | "relaxed";
12
+ options?: RateLimitOptions;
13
+ };
14
+ sanitize: {
15
+ enabled: boolean;
16
+ options?: SanitizeOptions;
17
+ };
18
+ validate: {
19
+ enabled: boolean;
20
+ schema?: any;
21
+ };
22
+ json: {
23
+ enabled: boolean;
24
+ options?: object;
25
+ };
26
+ auth: {
27
+ enabled: boolean;
28
+ required: boolean;
29
+ roles?: string[];
30
+ };
31
+ compression: {
32
+ enabled: boolean;
33
+ options?: object;
34
+ };
35
+ }
36
+ export declare function normalizeOptions(input?: SecureOptions | false): NormalizedOptions;
37
+ export declare function getPresetOptions(preset: 'api' | 'strict' | 'public'): NormalizedOptions;
38
+ //# sourceMappingURL=normalizeOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizeOptions.d.ts","sourceRoot":"","sources":["../../src/utils/normalizeOptions.ts"],"names":[],"mappings":"AAqHA,OAAO,EACH,aAAa,EACO,aAAa;AACjC,gBAAgB,EAAI,eAAe;AACnC,eAAe,EAClB,MAAM,gCAAgC,CAAC;AAExC,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,SAAS,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;QAAC,OAAO,CAAC,EAAE,gBAAgB,CAAA;KAAE,CAAC;IACzF,QAAQ,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,eAAe,CAAA;KAAE,CAAC;IAC1D,QAAQ,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC7C,IAAI,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,IAAI,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAChE,WAAW,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,KAAK,GAAG,iBAAiB,CA6CjF;AAqDD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,iBAAiB,CAgCvF"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ // import { SecureOptions } from "../core/types/SecureOptions.js";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.normalizeOptions = normalizeOptions;
5
+ exports.getPresetOptions = getPresetOptions;
6
+ function normalizeOptions(input) {
7
+ if (input === false) {
8
+ return {
9
+ cors: { enabled: false },
10
+ rateLimit: { enabled: false },
11
+ sanitize: { enabled: false },
12
+ validate: { enabled: false },
13
+ json: { enabled: false },
14
+ auth: { enabled: false, required: false },
15
+ compression: { enabled: false }
16
+ };
17
+ }
18
+ const opts = input || {};
19
+ return {
20
+ cors: {
21
+ enabled: opts.cors === undefined ? true : opts.cors !== false,
22
+ options: typeof opts.cors === "object" ? opts.cors : undefined
23
+ },
24
+ rateLimit: normalizeRateLimit(opts.rateLimit),
25
+ sanitize: {
26
+ enabled: opts.sanitize === undefined ? true : opts.sanitize !== false,
27
+ options: typeof opts.sanitize === "object" ? opts.sanitize : undefined
28
+ },
29
+ validate: {
30
+ enabled: !!opts.validate,
31
+ schema: opts.validate || undefined
32
+ },
33
+ json: {
34
+ enabled: opts.json === undefined ? true : opts.json !== false,
35
+ options: typeof opts.json === "object" ? opts.json : undefined
36
+ },
37
+ auth: normalizeAuth(opts.auth),
38
+ compression: {
39
+ enabled: opts.compression === undefined ? true : opts.compression !== false,
40
+ options: typeof opts.compression === "object" ? opts.compression : undefined
41
+ }
42
+ };
43
+ }
44
+ function normalizeRateLimit(value) {
45
+ if (value === false)
46
+ return { enabled: false };
47
+ if (value === "strict") {
48
+ return {
49
+ enabled: true,
50
+ mode: "strict",
51
+ options: { max: 5, windowMs: 10000 }
52
+ };
53
+ }
54
+ if (value === "relaxed") {
55
+ return {
56
+ enabled: true,
57
+ mode: "relaxed",
58
+ options: { max: 100, windowMs: 60000 }
59
+ };
60
+ }
61
+ if (typeof value === "object") {
62
+ const val = value;
63
+ const { mode, ...options } = val;
64
+ return {
65
+ enabled: true,
66
+ mode: (mode === "strict" || mode === "relaxed") ? mode : undefined,
67
+ options
68
+ };
69
+ }
70
+ return { enabled: true };
71
+ }
72
+ function normalizeAuth(value) {
73
+ if (value === false) {
74
+ return { enabled: false, required: false };
75
+ }
76
+ if (value === true || value === undefined) {
77
+ return { enabled: true, required: true };
78
+ }
79
+ const authOptions = value;
80
+ const enabled = authOptions.required !== false;
81
+ return {
82
+ enabled,
83
+ required: enabled,
84
+ roles: authOptions.roles
85
+ };
86
+ }
87
+ function getPresetOptions(preset) {
88
+ const presets = {
89
+ api: {
90
+ cors: { enabled: true, options: { origin: '*' } },
91
+ rateLimit: { enabled: true, mode: 'relaxed' },
92
+ sanitize: { enabled: true },
93
+ validate: { enabled: false },
94
+ json: { enabled: true },
95
+ auth: { enabled: false, required: false },
96
+ compression: { enabled: true }
97
+ },
98
+ strict: {
99
+ cors: { enabled: true, options: { origin: process.env.ALLOWED_ORIGIN || '*' } },
100
+ rateLimit: { enabled: true, mode: 'strict' },
101
+ sanitize: { enabled: true },
102
+ validate: { enabled: true },
103
+ json: { enabled: true },
104
+ auth: { enabled: true, required: true },
105
+ compression: { enabled: true }
106
+ },
107
+ public: {
108
+ cors: { enabled: true, options: { origin: '*' } },
109
+ rateLimit: { enabled: true },
110
+ sanitize: { enabled: false },
111
+ validate: { enabled: false },
112
+ json: { enabled: true },
113
+ auth: { enabled: false, required: false },
114
+ compression: { enabled: true }
115
+ }
116
+ };
117
+ return presets[preset] || presets.api;
118
+ }
119
+ //# sourceMappingURL=normalizeOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizeOptions.js","sourceRoot":"","sources":["../../src/utils/normalizeOptions.ts"],"names":[],"mappings":"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","sourcesContent":["\r\n// import { SecureOptions } from \"../core/types/SecureOptions.js\";\r\n\r\n// export interface NormalizedOptions {\r\n// cors: { enabled: boolean; options?: any };\r\n// rateLimit: { enabled: boolean; mode?: \"strict\" | \"relaxed\" | undefined; options?: any };\r\n// sanitize: { enabled: boolean };\r\n// validate: { enabled: boolean; schema?: any };\r\n// json: { enabled: boolean; options?: any };\r\n\r\n// /** NEW */\r\n// auth: { enabled: boolean; required: boolean };\r\n// }\r\n\r\n// export function normalizeOptions(input?: SecureOptions | false): NormalizedOptions {\r\n// if (input === false) {\r\n// return {\r\n// cors: { enabled: false },\r\n// rateLimit: { enabled: false, mode: undefined, options: undefined },\r\n// sanitize: { enabled: false },\r\n// validate: { enabled: false },\r\n// json: { enabled: false },\r\n// auth: { enabled: false, required: true }\r\n// };\r\n// }\r\n\r\n// const opts = input || {};\r\n\r\n// return {\r\n// cors: {\r\n// enabled: opts.cors === undefined ? true : opts.cors !== false,\r\n// options: typeof opts.cors === \"object\" ? opts.cors : undefined\r\n// },\r\n\r\n// rateLimit: normalizeRateLimit(opts.rateLimit),\r\n\r\n// sanitize: {\r\n// enabled: opts.sanitize === undefined ? true : opts.sanitize !== false\r\n// },\r\n\r\n// validate: {\r\n// enabled: !!opts.validate,\r\n// schema: opts.validate || undefined\r\n// },\r\n\r\n// json: {\r\n// enabled: opts.json === undefined ? true : opts.json !== false,\r\n// options: typeof opts.json === \"object\" ? opts.json : undefined\r\n// },\r\n\r\n// auth: normalizeAuth(opts.auth)\r\n// };\r\n// }\r\n\r\n// // ---------------------------------------------------------------\r\n// // RATE LIMIT — EXACT TYPES, NO TS ERROR\r\n// // ---------------------------------------------------------------\r\n// function normalizeRateLimit(value: SecureOptions[\"rateLimit\"]): {\r\n// enabled: boolean;\r\n// mode?: \"strict\" | \"relaxed\" | undefined;\r\n// options?: any;\r\n// } {\r\n// if (value === false) {\r\n// return { enabled: false, mode: undefined, options: undefined };\r\n// }\r\n\r\n// if (value === \"strict\") {\r\n// return {\r\n// enabled: true,\r\n// mode: \"strict\",\r\n// options: { max: 5, windowMs: 10000 }\r\n// };\r\n// }\r\n\r\n// if (value === \"relaxed\") {\r\n// return {\r\n// enabled: true,\r\n// mode: \"relaxed\",\r\n// options: { max: 100, windowMs: 60000 }\r\n// };\r\n// }\r\n\r\n// if (typeof value === \"object\") {\r\n// return {\r\n// enabled: true,\r\n// mode: undefined, // VERY IMPORTANT!\r\n// options: value\r\n// };\r\n// }\r\n\r\n// // Default → enabled and optional fields omitted\r\n// return {\r\n// enabled: true,\r\n// mode: undefined,\r\n// options: undefined\r\n// };\r\n// }\r\n\r\n// // ---------------------------------------------------------------\r\n// // AUTH NORMALIZER — EXACT FOR useSecure\r\n// // ---------------------------------------------------------------\r\n// function normalizeAuth(value: SecureOptions[\"auth\"]) {\r\n// if (value === false) return { enabled: false, required: true };\r\n\r\n// if (value === true || value === undefined)\r\n// return { enabled: true, required: true };\r\n\r\n// return {\r\n// enabled: true,\r\n// required: value.required !== false\r\n// };\r\n// }\r\n\r\n\r\n\r\n\r\n// src/utils/normalizeOptions.ts\r\nimport { \r\n SecureOptions,\r\n AuthOptions, // ✅ ADD THIS\r\n RateLimitOptions, // ✅ ADD THIS \r\n SanitizeOptions // ✅ ADD THIS\r\n} from \"../core/types/SecureOptions.js\";\r\n\r\nexport interface NormalizedOptions {\r\n cors: { enabled: boolean; options?: object };\r\n rateLimit: { enabled: boolean; mode?: \"strict\" | \"relaxed\"; options?: RateLimitOptions };\r\n sanitize: { enabled: boolean; options?: SanitizeOptions };\r\n validate: { enabled: boolean; schema?: any };\r\n json: { enabled: boolean; options?: object };\r\n auth: { enabled: boolean; required: boolean; roles?: string[] };\r\n compression: { enabled: boolean; options?: object };\r\n}\r\n\r\nexport function normalizeOptions(input?: SecureOptions | false): NormalizedOptions {\r\n if (input === false) {\r\n return {\r\n cors: { enabled: false },\r\n rateLimit: { enabled: false },\r\n sanitize: { enabled: false },\r\n validate: { enabled: false },\r\n json: { enabled: false },\r\n auth: { enabled: false, required: false },\r\n compression: { enabled: false }\r\n };\r\n }\r\n\r\n const opts = input || {};\r\n\r\n return {\r\n cors: {\r\n enabled: opts.cors === undefined ? true : opts.cors !== false,\r\n options: typeof opts.cors === \"object\" ? opts.cors : undefined\r\n },\r\n\r\n rateLimit: normalizeRateLimit(opts.rateLimit),\r\n\r\n sanitize: {\r\n enabled: opts.sanitize === undefined ? true : opts.sanitize !== false,\r\n options: typeof opts.sanitize === \"object\" ? opts.sanitize : undefined\r\n },\r\n\r\n validate: {\r\n enabled: !!opts.validate,\r\n schema: opts.validate || undefined\r\n },\r\n\r\n json: {\r\n enabled: opts.json === undefined ? true : opts.json !== false,\r\n options: typeof opts.json === \"object\" ? opts.json : undefined\r\n },\r\n\r\n auth: normalizeAuth(opts.auth),\r\n\r\n compression: {\r\n enabled: opts.compression === undefined ? true : opts.compression !== false,\r\n options: typeof opts.compression === \"object\" ? opts.compression : undefined\r\n }\r\n };\r\n}\r\n\r\nfunction normalizeRateLimit(value: SecureOptions[\"rateLimit\"]): NormalizedOptions[\"rateLimit\"] {\r\n if (value === false) return { enabled: false };\r\n \r\n if (value === \"strict\") {\r\n return {\r\n enabled: true,\r\n mode: \"strict\",\r\n options: { max: 5, windowMs: 10000 }\r\n };\r\n }\r\n \r\n if (value === \"relaxed\") {\r\n return {\r\n enabled: true,\r\n mode: \"relaxed\",\r\n options: { max: 100, windowMs: 60000 }\r\n };\r\n }\r\n \r\n if (typeof value === \"object\") {\r\n const val = value as RateLimitOptions;\r\n const { mode, ...options } = val;\r\n return {\r\n enabled: true,\r\n mode: (mode === \"strict\" || mode === \"relaxed\") ? mode : undefined,\r\n options\r\n };\r\n }\r\n \r\n return { enabled: true };\r\n}\r\n\r\nfunction normalizeAuth(value: SecureOptions[\"auth\"]): NormalizedOptions[\"auth\"] {\r\n if (value === false) {\r\n return { enabled: false, required: false };\r\n }\r\n \r\n if (value === true || value === undefined) {\r\n return { enabled: true, required: true };\r\n }\r\n \r\n const authOptions = value as AuthOptions;\r\n const enabled = authOptions.required !== false;\r\n \r\n return {\r\n enabled,\r\n required: enabled,\r\n roles: authOptions.roles\r\n };\r\n}\r\n\r\nexport function getPresetOptions(preset: 'api' | 'strict' | 'public'): NormalizedOptions {\r\n const presets = {\r\n api: {\r\n cors: { enabled: true, options: { origin: '*' } },\r\n rateLimit: { enabled: true, mode: 'relaxed' as const },\r\n sanitize: { enabled: true },\r\n validate: { enabled: false },\r\n json: { enabled: true },\r\n auth: { enabled: false, required: false },\r\n compression: { enabled: true }\r\n },\r\n strict: {\r\n cors: { enabled: true, options: { origin: process.env.ALLOWED_ORIGIN || '*' } },\r\n rateLimit: { enabled: true, mode: 'strict' as const },\r\n sanitize: { enabled: true },\r\n validate: { enabled: true },\r\n json: { enabled: true },\r\n auth: { enabled: true, required: true },\r\n compression: { enabled: true }\r\n },\r\n public: {\r\n cors: { enabled: true, options: { origin: '*' } },\r\n rateLimit: { enabled: true },\r\n sanitize: { enabled: false },\r\n validate: { enabled: false },\r\n json: { enabled: true },\r\n auth: { enabled: false, required: false },\r\n compression: { enabled: true }\r\n }\r\n };\r\n \r\n return presets[preset] || presets.api;\r\n}"]}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "hi-secure",
3
+ "version": "1.0.0",
4
+ "main": "dist/index.js",
5
+ "types": "dist/index.d.ts",
6
+ "scripts": {
7
+ "build": "tsc",
8
+ "dev": "tsx watch src/index.ts",
9
+ "start": "node dist/index.js"
10
+ },
11
+ "peerDependencies": {
12
+ "express": "^4.17.0 || ^5.0.0"
13
+ },
14
+ "dependencies": {
15
+ "argon2": "^0.44.0",
16
+ "bcryptjs": "^3.0.3",
17
+ "compression": "^1.8.1",
18
+ "cors": "^2.8.5",
19
+ "express-rate-limit": "^8.2.1",
20
+ "express-validator": "^7.3.1",
21
+ "google-auth-library": "^10.5.0",
22
+ "helmet": "^8.1.0",
23
+ "hpp": "^0.2.3",
24
+ "jsonwebtoken": "^9.0.3",
25
+ "morgan": "^1.10.1",
26
+ "nanoid": "^5.1.6",
27
+ "qs": "^6.14.0",
28
+ "rate-limiter-flexible": "^9.0.0",
29
+ "sanitize-html": "^2.17.0",
30
+ "uuid": "^13.0.0",
31
+ "winston": "^3.18.3",
32
+ "xss": "^1.0.15",
33
+ "zod": "^4.1.13"
34
+ },
35
+ "devDependencies": {
36
+ "@types/compression": "^1.8.1",
37
+ "@types/cors": "^2.8.19",
38
+ "@types/express": "^5.0.6",
39
+ "@types/hpp": "^0.2.7",
40
+ "@types/jsonwebtoken": "^9.0.10",
41
+ "@types/morgan": "^1.9.10",
42
+ "@types/node": "^24.10.1",
43
+ "@types/sanitize-html": "^2.16.0",
44
+ "@types/uuid": "^10.0.0",
45
+ "@types/winston": "^3.18.0",
46
+ "express": "^5.2.1",
47
+ "tsx": "^4.19.3",
48
+ "typescript": "^5.9.3"
49
+ }
50
+ }