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.
- package/dist/adapters/ArgonAdapter.js +1 -1
- package/dist/adapters/ArgonAdapter.js.map +1 -1
- package/dist/adapters/ExpressRLAdapter.d.ts.map +1 -1
- package/dist/adapters/ExpressRLAdapter.js +1 -2
- package/dist/adapters/ExpressRLAdapter.js.map +1 -1
- package/dist/adapters/ExpressValidatorAdapter.d.ts.map +1 -1
- package/dist/adapters/ExpressValidatorAdapter.js +1 -39
- package/dist/adapters/ExpressValidatorAdapter.js.map +1 -1
- package/dist/adapters/GoogleAdapter.d.ts.map +1 -1
- package/dist/adapters/GoogleAdapter.js +0 -101
- package/dist/adapters/GoogleAdapter.js.map +1 -1
- package/dist/adapters/JWTAdapter.d.ts.map +1 -1
- package/dist/adapters/JWTAdapter.js +3 -210
- package/dist/adapters/JWTAdapter.js.map +1 -1
- package/dist/adapters/RLFlexibleAdapter.d.ts.map +1 -1
- package/dist/adapters/RLFlexibleAdapter.js +0 -52
- package/dist/adapters/RLFlexibleAdapter.js.map +1 -1
- package/dist/adapters/SanitizeHtmlAdapter.d.ts +0 -3
- package/dist/adapters/SanitizeHtmlAdapter.d.ts.map +1 -1
- package/dist/adapters/SanitizeHtmlAdapter.js +2 -71
- package/dist/adapters/SanitizeHtmlAdapter.js.map +1 -1
- package/dist/adapters/XSSAdapter.d.ts +0 -10
- package/dist/adapters/XSSAdapter.d.ts.map +1 -1
- package/dist/adapters/XSSAdapter.js +2 -19
- package/dist/adapters/XSSAdapter.js.map +1 -1
- package/dist/adapters/ZodAdapter.d.ts.map +1 -1
- package/dist/adapters/ZodAdapter.js +2 -6
- package/dist/adapters/ZodAdapter.js.map +1 -1
- package/dist/core/HiSecure.d.ts +15 -2
- package/dist/core/HiSecure.d.ts.map +1 -1
- package/dist/core/HiSecure.js +130 -37
- package/dist/core/HiSecure.js.map +1 -1
- package/dist/core/useSecure.d.ts +4 -0
- package/dist/core/useSecure.d.ts.map +1 -1
- package/dist/core/useSecure.js +19 -114
- package/dist/core/useSecure.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -19
- package/dist/index.js.map +1 -1
- package/dist/managers/AuthManager.d.ts.map +1 -1
- package/dist/managers/AuthManager.js +1 -89
- package/dist/managers/AuthManager.js.map +1 -1
- package/dist/managers/CorsManager.d.ts.map +1 -1
- package/dist/managers/CorsManager.js +1 -19
- package/dist/managers/CorsManager.js.map +1 -1
- package/dist/managers/HashManager.d.ts.map +1 -1
- package/dist/managers/HashManager.js +0 -243
- package/dist/managers/HashManager.js.map +1 -1
- package/dist/managers/JsonManager.d.ts.map +1 -1
- package/dist/managers/JsonManager.js +1 -77
- package/dist/managers/JsonManager.js.map +1 -1
- package/dist/managers/RateLimitManager.d.ts.map +1 -1
- package/dist/managers/RateLimitManager.js +3 -17
- package/dist/managers/RateLimitManager.js.map +1 -1
- package/dist/managers/SanitizerManager.d.ts +0 -6
- package/dist/managers/SanitizerManager.d.ts.map +1 -1
- package/dist/managers/SanitizerManager.js +1 -213
- package/dist/managers/SanitizerManager.js.map +1 -1
- package/dist/managers/ValidatorManager.d.ts.map +1 -1
- package/dist/managers/ValidatorManager.js +1 -109
- package/dist/managers/ValidatorManager.js.map +1 -1
- package/dist/middlewares/errorHandler.d.ts.map +1 -1
- package/dist/middlewares/errorHandler.js +0 -19
- package/dist/middlewares/errorHandler.js.map +1 -1
- package/dist/utils/deepFreeze.d.ts.map +1 -1
- package/dist/utils/deepFreeze.js +0 -25
- package/dist/utils/deepFreeze.js.map +1 -1
- package/dist/utils/deepMerge.d.ts.map +1 -1
- package/dist/utils/deepMerge.js +0 -26
- package/dist/utils/deepMerge.js.map +1 -1
- package/dist/utils/normalizeOptions.d.ts +1 -3
- package/dist/utils/normalizeOptions.d.ts.map +1 -1
- package/dist/utils/normalizeOptions.js +0 -1
- package/dist/utils/normalizeOptions.js.map +1 -1
- package/package.json +1 -1
- package/src/adapters/ArgonAdapter.ts +1 -1
- package/src/adapters/ExpressRLAdapter.ts +1 -2
- package/src/adapters/ExpressValidatorAdapter.ts +1 -54
- package/src/adapters/GoogleAdapter.ts +0 -129
- package/src/adapters/JWTAdapter.ts +5 -259
- package/src/adapters/RLFlexibleAdapter.ts +2 -65
- package/src/adapters/SanitizeHtmlAdapter.ts +3 -87
- package/src/adapters/XSSAdapter.ts +11 -19
- package/src/adapters/ZodAdapter.ts +2 -51
- package/src/core/HiSecure.ts +25 -36
- package/src/core/useSecure.ts +5 -7
- package/src/index.ts +4 -5
- package/src/managers/AuthManager.ts +5 -109
- package/src/managers/CorsManager.ts +1 -25
- package/src/managers/HashManager.ts +0 -286
- package/src/managers/JsonManager.ts +1 -91
- package/src/managers/RateLimitManager.ts +3 -262
- package/src/managers/SanitizerManager.ts +4 -263
- package/src/managers/ValidatorManager.ts +53 -187
- package/src/middlewares/errorHandler.ts +1 -176
- package/src/utils/deepFreeze.ts +0 -32
- package/src/utils/deepMerge.ts +0 -35
- package/src/utils/normalizeOptions.ts +16 -133
- package/src/examples/e1.ts +0 -1
- 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":"
|
|
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"}
|
package/dist/utils/deepFreeze.js
CHANGED
|
@@ -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":"
|
|
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":"
|
|
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"}
|
package/dist/utils/deepMerge.js
CHANGED
|
@@ -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":"
|
|
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,
|
|
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":"
|
|
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 +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
|
@@ -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);
|
|
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,
|
|
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";
|
|
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
|
|