hi-secure 1.0.6 → 1.0.10

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 (101) hide show
  1. package/dist/adapters/ArgonAdapter.js +1 -1
  2. package/dist/adapters/ArgonAdapter.js.map +1 -1
  3. package/dist/adapters/ExpressRLAdapter.d.ts.map +1 -1
  4. package/dist/adapters/ExpressRLAdapter.js +1 -2
  5. package/dist/adapters/ExpressRLAdapter.js.map +1 -1
  6. package/dist/adapters/ExpressValidatorAdapter.d.ts.map +1 -1
  7. package/dist/adapters/ExpressValidatorAdapter.js +1 -39
  8. package/dist/adapters/ExpressValidatorAdapter.js.map +1 -1
  9. package/dist/adapters/GoogleAdapter.d.ts.map +1 -1
  10. package/dist/adapters/GoogleAdapter.js +0 -101
  11. package/dist/adapters/GoogleAdapter.js.map +1 -1
  12. package/dist/adapters/JWTAdapter.d.ts.map +1 -1
  13. package/dist/adapters/JWTAdapter.js +3 -210
  14. package/dist/adapters/JWTAdapter.js.map +1 -1
  15. package/dist/adapters/RLFlexibleAdapter.d.ts.map +1 -1
  16. package/dist/adapters/RLFlexibleAdapter.js +0 -52
  17. package/dist/adapters/RLFlexibleAdapter.js.map +1 -1
  18. package/dist/adapters/SanitizeHtmlAdapter.d.ts +0 -3
  19. package/dist/adapters/SanitizeHtmlAdapter.d.ts.map +1 -1
  20. package/dist/adapters/SanitizeHtmlAdapter.js +2 -71
  21. package/dist/adapters/SanitizeHtmlAdapter.js.map +1 -1
  22. package/dist/adapters/XSSAdapter.d.ts +0 -10
  23. package/dist/adapters/XSSAdapter.d.ts.map +1 -1
  24. package/dist/adapters/XSSAdapter.js +2 -19
  25. package/dist/adapters/XSSAdapter.js.map +1 -1
  26. package/dist/adapters/ZodAdapter.d.ts.map +1 -1
  27. package/dist/adapters/ZodAdapter.js +2 -6
  28. package/dist/adapters/ZodAdapter.js.map +1 -1
  29. package/dist/core/HiSecure.d.ts +15 -2
  30. package/dist/core/HiSecure.d.ts.map +1 -1
  31. package/dist/core/HiSecure.js +130 -37
  32. package/dist/core/HiSecure.js.map +1 -1
  33. package/dist/core/useSecure.d.ts +4 -0
  34. package/dist/core/useSecure.d.ts.map +1 -1
  35. package/dist/core/useSecure.js +19 -114
  36. package/dist/core/useSecure.js.map +1 -1
  37. package/dist/index.d.ts +4 -4
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +6 -19
  40. package/dist/index.js.map +1 -1
  41. package/dist/managers/AuthManager.d.ts.map +1 -1
  42. package/dist/managers/AuthManager.js +1 -89
  43. package/dist/managers/AuthManager.js.map +1 -1
  44. package/dist/managers/CorsManager.d.ts.map +1 -1
  45. package/dist/managers/CorsManager.js +1 -19
  46. package/dist/managers/CorsManager.js.map +1 -1
  47. package/dist/managers/HashManager.d.ts.map +1 -1
  48. package/dist/managers/HashManager.js +0 -243
  49. package/dist/managers/HashManager.js.map +1 -1
  50. package/dist/managers/JsonManager.d.ts.map +1 -1
  51. package/dist/managers/JsonManager.js +1 -77
  52. package/dist/managers/JsonManager.js.map +1 -1
  53. package/dist/managers/RateLimitManager.d.ts.map +1 -1
  54. package/dist/managers/RateLimitManager.js +3 -17
  55. package/dist/managers/RateLimitManager.js.map +1 -1
  56. package/dist/managers/SanitizerManager.d.ts +0 -6
  57. package/dist/managers/SanitizerManager.d.ts.map +1 -1
  58. package/dist/managers/SanitizerManager.js +1 -213
  59. package/dist/managers/SanitizerManager.js.map +1 -1
  60. package/dist/managers/ValidatorManager.d.ts.map +1 -1
  61. package/dist/managers/ValidatorManager.js +1 -109
  62. package/dist/managers/ValidatorManager.js.map +1 -1
  63. package/dist/middlewares/errorHandler.d.ts.map +1 -1
  64. package/dist/middlewares/errorHandler.js +0 -19
  65. package/dist/middlewares/errorHandler.js.map +1 -1
  66. package/dist/utils/deepFreeze.d.ts.map +1 -1
  67. package/dist/utils/deepFreeze.js +0 -25
  68. package/dist/utils/deepFreeze.js.map +1 -1
  69. package/dist/utils/deepMerge.d.ts.map +1 -1
  70. package/dist/utils/deepMerge.js +0 -26
  71. package/dist/utils/deepMerge.js.map +1 -1
  72. package/dist/utils/normalizeOptions.d.ts +1 -3
  73. package/dist/utils/normalizeOptions.d.ts.map +1 -1
  74. package/dist/utils/normalizeOptions.js +0 -1
  75. package/dist/utils/normalizeOptions.js.map +1 -1
  76. package/package.json +1 -1
  77. package/src/adapters/ArgonAdapter.ts +1 -1
  78. package/src/adapters/ExpressRLAdapter.ts +1 -2
  79. package/src/adapters/ExpressValidatorAdapter.ts +1 -54
  80. package/src/adapters/GoogleAdapter.ts +0 -129
  81. package/src/adapters/JWTAdapter.ts +5 -259
  82. package/src/adapters/RLFlexibleAdapter.ts +2 -65
  83. package/src/adapters/SanitizeHtmlAdapter.ts +3 -87
  84. package/src/adapters/XSSAdapter.ts +11 -19
  85. package/src/adapters/ZodAdapter.ts +2 -51
  86. package/src/core/HiSecure.ts +25 -36
  87. package/src/core/useSecure.ts +5 -7
  88. package/src/index.ts +4 -5
  89. package/src/managers/AuthManager.ts +5 -109
  90. package/src/managers/CorsManager.ts +1 -25
  91. package/src/managers/HashManager.ts +0 -286
  92. package/src/managers/JsonManager.ts +1 -91
  93. package/src/managers/RateLimitManager.ts +3 -262
  94. package/src/managers/SanitizerManager.ts +4 -263
  95. package/src/managers/ValidatorManager.ts +53 -187
  96. package/src/middlewares/errorHandler.ts +1 -176
  97. package/src/utils/deepFreeze.ts +0 -32
  98. package/src/utils/deepMerge.ts +0 -35
  99. package/src/utils/normalizeOptions.ts +16 -133
  100. package/src/examples/e1.ts +0 -1
  101. package/src/test/t1.ts +0 -1
@@ -1,10 +1,4 @@
1
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
2
  Object.defineProperty(exports, "__esModule", { value: true });
9
3
  exports.errorHandler = errorHandler;
10
4
  const logging_1 = require("../logging");
@@ -20,7 +14,6 @@ function errorHandler(err, req, res, _next) {
20
14
  const stack = err instanceof Error && err.stack
21
15
  ? err.stack.split("\n").slice(0, 2).join(" | ")
22
16
  : undefined;
23
- // Unified logging
24
17
  logging_1.logger.error("❌ HiSecure Error", {
25
18
  type: err?.name || "UnknownError",
26
19
  message,
@@ -31,9 +24,7 @@ function errorHandler(err, req, res, _next) {
31
24
  stack,
32
25
  raw: err,
33
26
  });
34
- // ---------------------------------------------------
35
27
  // 1. HttpError (developer thrown)
36
- // ---------------------------------------------------
37
28
  if (err instanceof HttpError_js_1.HttpError) {
38
29
  return res.status(err.status).json({
39
30
  success: false,
@@ -42,9 +33,7 @@ function errorHandler(err, req, res, _next) {
42
33
  details: err.details || undefined,
43
34
  });
44
35
  }
45
- // ---------------------------------------------------
46
36
  // 2. Validation Errors
47
- // ---------------------------------------------------
48
37
  if (err instanceof ValidationError_js_1.ValidationError) {
49
38
  return res.status(400).json({
50
39
  success: false,
@@ -52,9 +41,7 @@ function errorHandler(err, req, res, _next) {
52
41
  message,
53
42
  });
54
43
  }
55
- // ---------------------------------------------------
56
44
  // 3. Sanitizer Errors
57
- // ---------------------------------------------------
58
45
  if (err instanceof SanitizerError_js_1.SanitizerError) {
59
46
  return res.status(400).json({
60
47
  success: false,
@@ -62,9 +49,7 @@ function errorHandler(err, req, res, _next) {
62
49
  message,
63
50
  });
64
51
  }
65
- // ---------------------------------------------------
66
52
  // 4. Adapter Errors (hashing, rate-limit, sanitizer, validator ...)
67
- // ---------------------------------------------------
68
53
  if (err instanceof AdapterError_js_1.AdapterError) {
69
54
  return res.status(500).json({
70
55
  success: false,
@@ -72,9 +57,7 @@ function errorHandler(err, req, res, _next) {
72
57
  message,
73
58
  });
74
59
  }
75
- // ---------------------------------------------------
76
60
  // 5. Security Errors (internal library security logic)
77
- // ---------------------------------------------------
78
61
  if (err instanceof SecurityError_js_1.SecurityError) {
79
62
  return res.status(500).json({
80
63
  success: false,
@@ -82,9 +65,7 @@ function errorHandler(err, req, res, _next) {
82
65
  message,
83
66
  });
84
67
  }
85
- // ---------------------------------------------------
86
68
  // 6. Fallback → Unexpected
87
- // ---------------------------------------------------
88
69
  return res.status(500).json({
89
70
  success: false,
90
71
  error: "INTERNAL_SERVER_ERROR",
@@ -1 +1 @@
1
- {"version":3,"file":"errorHandler.js","sourceRoot":"","sources":["../../src/middlewares/errorHandler.ts"],"names":[],"mappings":"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","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/HttpError.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"]}
1
+ {"version":3,"file":"errorHandler.js","sourceRoot":"","sources":["../../src/middlewares/errorHandler.ts"],"names":[],"mappings":";;AASA,oCAgFC;AAxFD,wCAAoC;AAEpC,oEAA8D;AAC9D,0EAAoE;AACpE,wEAAkE;AAClE,sEAAgE;AAChE,8DAAwD;AAExD,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;IAGpB,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,kCAAkC;IAClC,IAAI,GAAG,YAAY,wBAAS,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,uBAAuB;IACvB,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,sBAAsB;IACtB,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,oEAAoE;IACpE,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,uDAAuD;IACvD,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,2BAA2B;IAC3B,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\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/HttpError.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 \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 // 1. HttpError (developer thrown)\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 // 2. Validation Errors\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 // 3. Sanitizer Errors\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 // 4. Adapter Errors (hashing, rate-limit, sanitizer, validator ...)\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 // 5. Security Errors (internal library security logic)\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 // 6. Fallback → Unexpected\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"]}
@@ -1 +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"}
1
+ {"version":3,"file":"deepFreeze.d.ts","sourceRoot":"","sources":["../../src/utils/deepFreeze.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,kBAAgB,GAAG,CAAC,CA2ChE"}
@@ -1,45 +1,22 @@
1
1
  "use strict";
2
- // export function deepFreeze<T>(obj: T): T {
3
- // // Freeze the top level object
4
- // Object.freeze(obj);
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  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
4
  function deepFreeze(obj, visited = new WeakSet()) {
22
- // Handle primitives and null/undefined
23
5
  if (obj === null || obj === undefined)
24
6
  return obj;
25
7
  if (typeof obj !== 'object' && typeof obj !== 'function')
26
8
  return obj;
27
- // Handle circular references
28
9
  if (visited.has(obj))
29
10
  return obj;
30
11
  visited.add(obj);
31
- // Don't freeze built-in objects that shouldn't be frozen
32
12
  const constructor = obj.constructor;
33
13
  const builtIns = [Date, RegExp, Map, Set, WeakMap, WeakSet, Promise];
34
14
  if (builtIns.some(builtIn => obj instanceof builtIn)) {
35
15
  return obj;
36
16
  }
37
- // Don't freeze functions
38
17
  if (typeof obj === 'function')
39
18
  return obj;
40
- // Freeze the object itself
41
19
  Object.freeze(obj);
42
- // Freeze array elements
43
20
  if (Array.isArray(obj)) {
44
21
  for (const item of obj) {
45
22
  if (item && typeof item === 'object') {
@@ -48,7 +25,6 @@ function deepFreeze(obj, visited = new WeakSet()) {
48
25
  }
49
26
  return obj;
50
27
  }
51
- // Freeze object properties
52
28
  const props = Object.getOwnPropertyNames(obj);
53
29
  for (const prop of props) {
54
30
  const value = obj[prop];
@@ -56,7 +32,6 @@ function deepFreeze(obj, visited = new WeakSet()) {
56
32
  deepFreeze(value, visited);
57
33
  }
58
34
  }
59
- // Freeze symbol properties
60
35
  const symbols = Object.getOwnPropertySymbols(obj);
61
36
  for (const sym of symbols) {
62
37
  const value = obj[sym];
@@ -1 +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}"]}
1
+ {"version":3,"file":"deepFreeze.js","sourceRoot":"","sources":["../../src/utils/deepFreeze.ts"],"names":[],"mappings":";;AAAA,gCA2CC;AA3CD,SAAgB,UAAU,CAAI,GAAM,EAAE,OAAO,GAAG,IAAI,OAAO,EAAE;IACzD,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,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEjB,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,IAAI,OAAO,GAAG,KAAK,UAAU;QAAE,OAAO,GAAG,CAAC;IAE1C,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEnB,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,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,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, visited = new WeakSet()): T {\r\n if (obj === null || obj === undefined) return obj;\r\n if (typeof obj !== 'object' && typeof obj !== 'function') return obj;\r\n \r\n if (visited.has(obj)) return obj;\r\n visited.add(obj);\r\n \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 if (typeof obj === 'function') return obj;\r\n \r\n Object.freeze(obj);\r\n \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 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 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}"]}
@@ -1 +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"}
1
+ {"version":3,"file":"deepMerge.d.ts","sourceRoot":"","sources":["../../src/utils/deepMerge.ts"],"names":[],"mappings":"AAAA,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,CA+CP"}
@@ -1,26 +1,6 @@
1
1
  "use strict";
2
- // export function deepMerge<T>(target: T, source: Partial<T>): T {
3
- // if (!source) return target;
4
2
  Object.defineProperty(exports, "__esModule", { value: true });
5
3
  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
4
  function deepMerge(target, source, options = {}) {
25
5
  const { mergeArrays = false, skipUndefined = true } = options;
26
6
  if (!source || typeof source !== 'object') {
@@ -34,20 +14,16 @@ function deepMerge(target, source, options = {}) {
34
14
  continue;
35
15
  const sourceValue = source[key];
36
16
  const targetValue = target[key];
37
- // Skip undefined values if configured
38
17
  if (skipUndefined && sourceValue === undefined)
39
18
  continue;
40
- // Handle null explicitly
41
19
  if (sourceValue === null) {
42
20
  output[key] = null;
43
21
  continue;
44
22
  }
45
- // Merge arrays if option enabled
46
23
  if (mergeArrays && Array.isArray(targetValue) && Array.isArray(sourceValue)) {
47
24
  output[key] = [...targetValue, ...sourceValue];
48
25
  continue;
49
26
  }
50
- // Recursive merge for plain objects
51
27
  if (sourceValue && typeof sourceValue === 'object' &&
52
28
  targetValue && typeof targetValue === 'object' &&
53
29
  !Array.isArray(sourceValue) && !Array.isArray(targetValue) &&
@@ -55,10 +31,8 @@ function deepMerge(target, source, options = {}) {
55
31
  output[key] = deepMerge(targetValue, sourceValue, options);
56
32
  continue;
57
33
  }
58
- // Overwrite for everything else
59
34
  output[key] = sourceValue;
60
35
  }
61
- // Handle symbol properties
62
36
  const symbols = Object.getOwnPropertySymbols(source);
63
37
  for (const sym of symbols) {
64
38
  output[sym] = source[sym];
@@ -1 +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}"]}
1
+ {"version":3,"file":"deepMerge.js","sourceRoot":"","sources":["../../src/utils/deepMerge.ts"],"names":[],"mappings":";;AAAA,8BAmDC;AAnDD,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,IAAI,aAAa,IAAI,WAAW,KAAK,SAAS;YAAE,SAAS;QAEzD,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YACnB,SAAS;QACb,CAAC;QAED,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,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,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;IAC9B,CAAC;IAED,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 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 if (skipUndefined && sourceValue === undefined) continue;\r\n \r\n if (sourceValue === null) {\r\n output[key] = null;\r\n continue;\r\n }\r\n \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 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 output[key] = sourceValue;\r\n }\r\n \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}"]}
@@ -1,6 +1,4 @@
1
- import { SecureOptions, // ADD THIS
2
- RateLimitOptions, // ✅ ADD THIS
3
- SanitizeOptions } from "../core/types/SecureOptions.js";
1
+ import { SecureOptions, RateLimitOptions, SanitizeOptions } from "../core/types/SecureOptions.js";
4
2
  export interface NormalizedOptions {
5
3
  cors: {
6
4
  enabled: boolean;
@@ -1 +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,CAmDjF;AA8DD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,iBAAiB,CAgCvF"}
1
+ {"version":3,"file":"normalizeOptions.d.ts","sourceRoot":"","sources":["../../src/utils/normalizeOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,aAAa,EAEb,gBAAgB,EAChB,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,CAmDjF;AA+DD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,iBAAiB,CAgCvF"}
@@ -1,5 +1,4 @@
1
1
  "use strict";
2
- // import { SecureOptions } from "../core/types/SecureOptions.js";
3
2
  Object.defineProperty(exports, "__esModule", { value: true });
4
3
  exports.normalizeOptions = normalizeOptions;
5
4
  exports.getPresetOptions = getPresetOptions;
@@ -1 +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 validate: {\r\n enabled: opts.validate !== undefined,\r\n schema: opts.validate\r\n},\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\r\n if (value === undefined) {\r\n return { enabled: false, required: false };\r\n}\r\nif (value === true) {\r\n return { enabled: true, required: true };\r\n}\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}"]}
1
+ {"version":3,"file":"normalizeOptions.js","sourceRoot":"","sources":["../../src/utils/normalizeOptions.ts"],"names":[],"mappings":"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","sourcesContent":["import { \r\n SecureOptions,\r\n AuthOptions, \r\n RateLimitOptions, \r\n SanitizeOptions \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 validate: {\r\n enabled: opts.validate !== undefined,\r\n schema: opts.validate\r\n},\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\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\r\n if (value === undefined) {\r\n return { enabled: false, required: false };\r\n}\r\nif (value === true) {\r\n return { enabled: true, required: true };\r\n}\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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hi-secure",
3
- "version": "1.0.6",
3
+ "version": "1.0.10",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "scripts": {
@@ -15,7 +15,7 @@ export class ArgonAdapter {
15
15
  try {
16
16
  return this.options
17
17
  ? await argon2.hash(value, this.options)
18
- : await argon2.hash(value); // avoid passing undefined
18
+ : await argon2.hash(value);
19
19
  } catch (err: any) {
20
20
  logger.error("❌ Argon2 hashing failed", {
21
21
  error: err?.message || err
@@ -1,4 +1,3 @@
1
- // src/adapters/ExpressRLAdapter.ts - IMPROVED
2
1
  import rateLimit from "express-rate-limit";
3
2
  import { logger } from "../logging/index.js";
4
3
  import { AdapterError } from "../core/errors/AdapterError.js";
@@ -17,7 +16,7 @@ export class ExpressRLAdapter {
17
16
  getMiddleware(options: RateLimitOptions = {}) {
18
17
  try {
19
18
  const defaultOptions = {
20
- windowMs: 15 * 60 * 1000, // 15 minutes
19
+ windowMs: 15 * 60 * 1000,
21
20
  max: 100,
22
21
  message: { error: "Too many requests" },
23
22
  standardHeaders: true,
@@ -1,58 +1,5 @@
1
- // import { validationResult } from "express-validator";
2
- // import { ValidationError } from "../core/errors/ValidationError";
3
- // import { logger } from "../logging";
4
-
5
- // export class ExpressValidatorAdapter {
6
- // private globalSchema?: any[];
7
-
8
- // constructor(globalSchema?: any[]) {
9
- // this.globalSchema = globalSchema as any;;
10
- // }
11
-
12
- // /**
13
- // * Dynamic schema override
14
- // */
15
- // validate(dynamicSchema?: any[]) {
16
- // const schema = dynamicSchema || this.globalSchema;
17
-
18
- // if (!schema || !Array.isArray(schema)) {
19
- // return (req: any, res: any, next: any) => next();
20
- // }
21
-
22
- // return [
23
- // ...schema,
24
-
25
- // (req: any, res: any, next: any) => {
26
- // const errors = validationResult(req);
27
-
28
- // if (!errors.isEmpty()) {
29
- // const formatted = errors.array().map(err => ({
30
- // message: err.msg,
31
- // }));
32
-
33
- // logger.warn("⚠ express-validator failed", {
34
- // path: req.path,
35
- // method: req.method,
36
- // errors: formatted,
37
- // preview: JSON.stringify(req.body).slice(0, 200)
38
- // });
39
-
40
- // return next(new ValidationError("Validation failed."));
41
- // }
42
-
43
- // next();
44
- // }
45
- // ];
46
- // }
47
- // }
48
-
49
-
50
-
51
-
52
-
53
- // src/adapters/ExpressValidatorAdapter.ts - FIXED
54
1
  import { validationResult } from "express-validator";
55
- import { ValidationError } from "../core/errors/ValidationError.js"; // ✅ Add .js
2
+ import { ValidationError } from "../core/errors/ValidationError.js";
56
3
  import { logger } from "../logging/index.js";
57
4
 
58
5
  export class ExpressValidatorAdapter {
@@ -1,134 +1,5 @@
1
- // // import { OAuth2Client, LoginTicket } from "google-auth-library";
2
- // // import { AdapterError } from "../core/errors/AdapterError";
3
- // // import { logWarn, logError } from "../logging";
4
-
5
- // // export class GoogleAdapter {
6
- // // private client: OAuth2Client;
7
- // // private clientId?: string;
8
-
9
- // // constructor(clientId?: string) {
10
- // // this.client = new OAuth2Client(clientId);
11
- // // this.clientId = clientId as any;
12
- // // }
13
-
14
- // // async verifyIdToken(idToken: string) {
15
- // // try {
16
- // // const options: {
17
- // // idToken: string;
18
- // // audience?: string | string[];
19
- // // } = { idToken };
20
-
21
- // // // ADD ONLY IF DEFINED → FIXES TS ERROR
22
- // // if (this.clientId !== undefined) {
23
- // // options.audience = this.clientId;
24
- // // }
25
-
26
- // // const ticket: LoginTicket = await this.client.verifyIdToken(options);
27
-
28
- // // const payload = ticket.getPayload();
29
- // // if (!payload) {
30
- // // logWarn("GoogleAdapter: Empty payload");
31
- // // throw new AdapterError("Invalid Google ID token payload.");
32
- // // }
33
-
34
- // // return {
35
- // // sub: payload.sub,
36
- // // email: payload.email,
37
- // // email_verified: payload.email_verified,
38
- // // name: payload.name,
39
- // // picture: payload.picture,
40
- // // };
41
-
42
- // // } catch (err: any) {
43
- // // logError("GoogleAdapter.verifyIdToken failed", { error: err?.message });
44
- // // throw new AdapterError(err?.message || "Google token verification failed");
45
- // // }
46
- // // }
47
- // // }
48
-
49
-
50
-
51
-
52
- // // src/adapters/GoogleAdapter.ts - IMPROVED
53
- // import { OAuth2Client, LoginTicket } from "google-auth-library";
54
- // import { AdapterError } from "../core/errors/AdapterError.js";
55
- // import { logWarn, logError } from "../logging/index.js";
56
-
57
- // export interface GoogleTokenPayload {
58
- // sub: string;
59
- // email: string;
60
- // email_verified: boolean;
61
- // name?: string;
62
- // picture?: string;
63
- // [key: string]: any;
64
- // }
65
-
66
- // export class GoogleAdapter {
67
- // private client: OAuth2Client;
68
- // private clientId?: string;
69
-
70
- // constructor(clientId?: string) {
71
- // if (clientId && clientId.trim().length === 0) {
72
- // throw new AdapterError("Google clientId cannot be empty string");
73
- // }
74
-
75
- // this.client = new OAuth2Client(clientId);
76
- // this.clientId = clientId;
77
- // }
78
-
79
- // async verifyIdToken(idToken: string): Promise<GoogleTokenPayload> {
80
- // try {
81
- // if (!idToken || typeof idToken !== 'string') {
82
- // throw new AdapterError("Invalid ID token provided");
83
- // }
84
-
85
- // const options: { idToken: string; audience?: string | string[] } = {
86
- // idToken
87
- // };
88
-
89
- // // Add audience only if clientId is provided and not empty
90
- // if (this.clientId && this.clientId.trim().length > 0) {
91
- // options.audience = this.clientId;
92
- // }
93
-
94
- // const ticket: LoginTicket = await this.client.verifyIdToken(options);
95
- // const payload = ticket.getPayload();
96
-
97
- // if (!payload) {
98
- // logWarn("GoogleAdapter: Empty payload");
99
- // throw new AdapterError("Invalid Google ID token payload.");
100
- // }
101
-
102
- // return {
103
- // sub: payload.sub,
104
- // email: payload.email || '',
105
- // email_verified: payload.email_verified || false,
106
- // name: payload.name,
107
- // picture: payload.picture,
108
- // ...payload
109
- // };
110
-
111
- // } catch (err: any) {
112
- // logError("GoogleAdapter.verifyIdToken failed", {
113
- // error: err?.message,
114
- // hasClientId: !!this.clientId
115
- // });
116
-
117
- // if (err.message?.includes('audience')) {
118
- // throw new AdapterError("Invalid Google client ID configured.");
119
- // }
120
-
121
- // throw new AdapterError(err?.message || "Google token verification failed");
122
- // }
123
- // }
124
- // }
125
-
126
-
127
-
128
- // src/adapters/GoogleAdapter.ts - FIXED
129
1
  import { OAuth2Client, LoginTicket } from "google-auth-library";
130
2
  import { AdapterError } from "../core/errors/AdapterError.js";
131
- // import { logWarn, logError } from "../logging/index.js";
132
3
 
133
4
  import {logger} from '../logging';
134
5