hi-secure 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/ArgonAdapter.d.ts +8 -0
- package/dist/adapters/ArgonAdapter.d.ts.map +1 -0
- package/dist/adapters/ArgonAdapter.js +45 -0
- package/dist/adapters/ArgonAdapter.js.map +1 -0
- package/dist/adapters/BcryptAdapter.d.ts +7 -0
- package/dist/adapters/BcryptAdapter.d.ts.map +1 -0
- package/dist/adapters/BcryptAdapter.js +48 -0
- package/dist/adapters/BcryptAdapter.js.map +1 -0
- package/dist/adapters/DomPurifyAdapter.d.ts +13 -0
- package/dist/adapters/DomPurifyAdapter.d.ts.map +1 -0
- package/dist/adapters/DomPurifyAdapter.js +61 -0
- package/dist/adapters/DomPurifyAdapter.js.map +1 -0
- package/dist/adapters/ExpressRLAdapter.d.ts +13 -0
- package/dist/adapters/ExpressRLAdapter.d.ts.map +1 -0
- package/dist/adapters/ExpressRLAdapter.js +68 -0
- package/dist/adapters/ExpressRLAdapter.js.map +1 -0
- package/dist/adapters/ExpressValidatorAdapter.d.ts +6 -0
- package/dist/adapters/ExpressValidatorAdapter.d.ts.map +1 -0
- package/dist/adapters/ExpressValidatorAdapter.js +78 -0
- package/dist/adapters/ExpressValidatorAdapter.js.map +1 -0
- package/dist/adapters/GoggleAdapter.d.ts +15 -0
- package/dist/adapters/GoggleAdapter.d.ts.map +1 -0
- package/dist/adapters/GoggleAdapter.js +91 -0
- package/dist/adapters/GoggleAdapter.js.map +1 -0
- package/dist/adapters/GoogleAdapter.d.ts +15 -0
- package/dist/adapters/GoogleAdapter.d.ts.map +1 -0
- package/dist/adapters/GoogleAdapter.js +159 -0
- package/dist/adapters/GoogleAdapter.js.map +1 -0
- package/dist/adapters/JWTAdapter.d.ts +28 -0
- package/dist/adapters/JWTAdapter.d.ts.map +1 -0
- package/dist/adapters/JWTAdapter.js +276 -0
- package/dist/adapters/JWTAdapter.js.map +1 -0
- package/dist/adapters/RLFlexibleAdapter.d.ts +11 -0
- package/dist/adapters/RLFlexibleAdapter.d.ts.map +1 -0
- package/dist/adapters/RLFlexibleAdapter.js +115 -0
- package/dist/adapters/RLFlexibleAdapter.js.map +1 -0
- package/dist/adapters/SanitizeHtmlAdapter.d.ts +12 -0
- package/dist/adapters/SanitizeHtmlAdapter.d.ts.map +1 -0
- package/dist/adapters/SanitizeHtmlAdapter.js +141 -0
- package/dist/adapters/SanitizeHtmlAdapter.js.map +1 -0
- package/dist/adapters/XSSAdapter.d.ts +33 -0
- package/dist/adapters/XSSAdapter.d.ts.map +1 -0
- package/dist/adapters/XSSAdapter.js +127 -0
- package/dist/adapters/XSSAdapter.js.map +1 -0
- package/dist/adapters/ZodAdapter.d.ts +7 -0
- package/dist/adapters/ZodAdapter.d.ts.map +1 -0
- package/dist/adapters/ZodAdapter.js +39 -0
- package/dist/adapters/ZodAdapter.js.map +1 -0
- package/dist/core/HiSecure.d.ts +62 -0
- package/dist/core/HiSecure.d.ts.map +1 -0
- package/dist/core/HiSecure.js +273 -0
- package/dist/core/HiSecure.js.map +1 -0
- package/dist/core/config.d.ts +3 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +53 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/constants.d.ts +37 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +67 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/errors/AdapterError.d.ts +5 -0
- package/dist/core/errors/AdapterError.d.ts.map +1 -0
- package/dist/core/errors/AdapterError.js +15 -0
- package/dist/core/errors/AdapterError.js.map +1 -0
- package/dist/core/errors/HttpErrror.d.ts +17 -0
- package/dist/core/errors/HttpErrror.d.ts.map +1 -0
- package/dist/core/errors/HttpErrror.js +36 -0
- package/dist/core/errors/HttpErrror.js.map +1 -0
- package/dist/core/errors/SanitizerError.d.ts +5 -0
- package/dist/core/errors/SanitizerError.d.ts.map +1 -0
- package/dist/core/errors/SanitizerError.js +14 -0
- package/dist/core/errors/SanitizerError.js.map +1 -0
- package/dist/core/errors/SecurityError.d.ts +5 -0
- package/dist/core/errors/SecurityError.d.ts.map +1 -0
- package/dist/core/errors/SecurityError.js +14 -0
- package/dist/core/errors/SecurityError.js.map +1 -0
- package/dist/core/errors/ValidationError.d.ts +5 -0
- package/dist/core/errors/ValidationError.d.ts.map +1 -0
- package/dist/core/errors/ValidationError.js +14 -0
- package/dist/core/errors/ValidationError.js.map +1 -0
- package/dist/core/types/HiSecureConfig.d.ts +47 -0
- package/dist/core/types/HiSecureConfig.d.ts.map +1 -0
- package/dist/core/types/HiSecureConfig.js +3 -0
- package/dist/core/types/HiSecureConfig.js.map +1 -0
- package/dist/core/types/SecureOptions.d.ts +30 -0
- package/dist/core/types/SecureOptions.d.ts.map +1 -0
- package/dist/core/types/SecureOptions.js +4 -0
- package/dist/core/types/SecureOptions.js.map +1 -0
- package/dist/core/useSecure.d.ts +10 -0
- package/dist/core/useSecure.d.ts.map +1 -0
- package/dist/core/useSecure.js +85 -0
- package/dist/core/useSecure.js.map +1 -0
- package/dist/examples/e1.d.ts +1 -0
- package/dist/examples/e1.d.ts.map +1 -0
- package/dist/examples/e1.js +3 -0
- package/dist/examples/e1.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/index.d.ts +3 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +19 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/morganSetup.d.ts +2 -0
- package/dist/logging/morganSetup.d.ts.map +1 -0
- package/dist/logging/morganSetup.js +9 -0
- package/dist/logging/morganSetup.js.map +1 -0
- package/dist/logging/winstonSetup.d.ts +6 -0
- package/dist/logging/winstonSetup.d.ts.map +1 -0
- package/dist/logging/winstonSetup.js +22 -0
- package/dist/logging/winstonSetup.js.map +1 -0
- package/dist/managers/AuthManager.d.ts +23 -0
- package/dist/managers/AuthManager.d.ts.map +1 -0
- package/dist/managers/AuthManager.js +190 -0
- package/dist/managers/AuthManager.js.map +1 -0
- package/dist/managers/CorsManager.d.ts +9 -0
- package/dist/managers/CorsManager.d.ts.map +1 -0
- package/dist/managers/CorsManager.js +55 -0
- package/dist/managers/CorsManager.js.map +1 -0
- package/dist/managers/HashManager.d.ts +22 -0
- package/dist/managers/HashManager.d.ts.map +1 -0
- package/dist/managers/HashManager.js +319 -0
- package/dist/managers/HashManager.js.map +1 -0
- package/dist/managers/JsonManager.d.ts +6 -0
- package/dist/managers/JsonManager.d.ts.map +1 -0
- package/dist/managers/JsonManager.js +142 -0
- package/dist/managers/JsonManager.js.map +1 -0
- package/dist/managers/RateLimitManager.d.ts +16 -0
- package/dist/managers/RateLimitManager.d.ts.map +1 -0
- package/dist/managers/RateLimitManager.js +108 -0
- package/dist/managers/RateLimitManager.js.map +1 -0
- package/dist/managers/SanitizerManager.d.ts +18 -0
- package/dist/managers/SanitizerManager.d.ts.map +1 -0
- package/dist/managers/SanitizerManager.js +296 -0
- package/dist/managers/SanitizerManager.js.map +1 -0
- package/dist/managers/ValidatorManager.d.ts +13 -0
- package/dist/managers/ValidatorManager.d.ts.map +1 -0
- package/dist/managers/ValidatorManager.js +218 -0
- package/dist/managers/ValidatorManager.js.map +1 -0
- package/dist/middlewares/errorHandler.d.ts +3 -0
- package/dist/middlewares/errorHandler.d.ts.map +1 -0
- package/dist/middlewares/errorHandler.js +94 -0
- package/dist/middlewares/errorHandler.js.map +1 -0
- package/dist/middlewares/index.d.ts +3 -0
- package/dist/middlewares/index.d.ts.map +1 -0
- package/dist/middlewares/index.js +19 -0
- package/dist/middlewares/index.js.map +1 -0
- package/dist/middlewares/requestLogger.d.ts +2 -0
- package/dist/middlewares/requestLogger.d.ts.map +1 -0
- package/dist/middlewares/requestLogger.js +8 -0
- package/dist/middlewares/requestLogger.js.map +1 -0
- package/dist/test/t1.d.ts +1 -0
- package/dist/test/t1.d.ts.map +1 -0
- package/dist/test/t1.js +3 -0
- package/dist/test/t1.js.map +1 -0
- package/dist/utils/deepFreeze.d.ts +2 -0
- package/dist/utils/deepFreeze.d.ts.map +1 -0
- package/dist/utils/deepFreeze.js +69 -0
- package/dist/utils/deepFreeze.js.map +1 -0
- package/dist/utils/deepMerge.d.ts +5 -0
- package/dist/utils/deepMerge.d.ts.map +1 -0
- package/dist/utils/deepMerge.js +68 -0
- package/dist/utils/deepMerge.js.map +1 -0
- package/dist/utils/normalizeOptions.d.ts +38 -0
- package/dist/utils/normalizeOptions.d.ts.map +1 -0
- package/dist/utils/normalizeOptions.js +119 -0
- package/dist/utils/normalizeOptions.js.map +1 -0
- package/package.json +50 -0
- package/src/adapters/ArgonAdapter.ts +41 -0
- package/src/adapters/BcryptAdapter.ts +49 -0
- package/src/adapters/ExpressRLAdapter.ts +84 -0
- package/src/adapters/ExpressValidatorAdapter.ts +99 -0
- package/src/adapters/GoogleAdapter.ts +206 -0
- package/src/adapters/JWTAdapter.ts +346 -0
- package/src/adapters/RLFlexibleAdapter.ts +139 -0
- package/src/adapters/SanitizeHtmlAdapter.ts +162 -0
- package/src/adapters/XSSAdapter.ts +153 -0
- package/src/adapters/ZodAdapter.ts +91 -0
- package/src/core/HiSecure.ts +955 -0
- package/src/core/config.ts +156 -0
- package/src/core/constants.ts +73 -0
- package/src/core/errors/AdapterError.ts +14 -0
- package/src/core/errors/HttpErrror.ts +46 -0
- package/src/core/errors/SanitizerError.ts +13 -0
- package/src/core/errors/SecurityError.ts +13 -0
- package/src/core/errors/ValidationError.ts +13 -0
- package/src/core/types/HiSecureConfig.ts +62 -0
- package/src/core/types/SecureOptions.ts +61 -0
- package/src/core/useSecure.ts +111 -0
- package/src/examples/e1.ts +1 -0
- package/src/index.ts +17 -0
- package/src/logging/index.ts +2 -0
- package/src/logging/morganSetup.ts +3 -0
- package/src/logging/winstonSetup.ts +17 -0
- package/src/managers/AuthManager.ts +237 -0
- package/src/managers/CorsManager.ts +58 -0
- package/src/managers/HashManager.ts +390 -0
- package/src/managers/JsonManager.ts +149 -0
- package/src/managers/RateLimitManager.ts +368 -0
- package/src/managers/SanitizerManager.ts +359 -0
- package/src/managers/ValidatorManager.ts +269 -0
- package/src/middlewares/errorHandler.ts +265 -0
- package/src/middlewares/index.ts +2 -0
- package/src/middlewares/requestLogger.ts +5 -0
- package/src/test/t1.ts +1 -0
- package/src/utils/deepFreeze.ts +76 -0
- package/src/utils/deepMerge.ts +87 -0
- package/src/utils/normalizeOptions.ts +265 -0
- package/tsconfig.json +30 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
// export interface HiSecureConfig {
|
|
4
|
+
// enableHelmet: boolean;
|
|
5
|
+
// enableHPP: boolean;
|
|
6
|
+
// enableCORS: boolean;
|
|
7
|
+
// enableSanitizer: boolean;
|
|
8
|
+
// enableRateLimiter: boolean;
|
|
9
|
+
// enableValidation: boolean;
|
|
10
|
+
|
|
11
|
+
// hashing: {
|
|
12
|
+
// primary: "argon2" | "bcrypt";
|
|
13
|
+
// fallback: "bcrypt" | null;
|
|
14
|
+
// saltRounds: number;
|
|
15
|
+
// };
|
|
16
|
+
|
|
17
|
+
// rateLimiter: {
|
|
18
|
+
// windowMs: number;
|
|
19
|
+
// maxRequests: number;
|
|
20
|
+
// message: string;
|
|
21
|
+
// useAdaptiveMode: boolean;
|
|
22
|
+
// };
|
|
23
|
+
|
|
24
|
+
// validation: {
|
|
25
|
+
// mode: "zod" | "express-validator";
|
|
26
|
+
// fallback: "express-validator" | null;
|
|
27
|
+
// };
|
|
28
|
+
|
|
29
|
+
// sanitizer: {
|
|
30
|
+
// allowedTags: string[];
|
|
31
|
+
// allowedAttributes: Record<string, string[]>;
|
|
32
|
+
// };
|
|
33
|
+
|
|
34
|
+
// logging: {
|
|
35
|
+
// enabled: boolean;
|
|
36
|
+
// level: "info" | "warn" | "error" | "debug";
|
|
37
|
+
// };
|
|
38
|
+
|
|
39
|
+
// /** 🔥 ADD THIS */
|
|
40
|
+
// auth: {
|
|
41
|
+
// enabled: boolean;
|
|
42
|
+
// jwtExpiresIn: string | number | undefined;
|
|
43
|
+
// };
|
|
44
|
+
|
|
45
|
+
// /** 🔥 optional configs for dynamic JSON/CORS */
|
|
46
|
+
// json?: any;
|
|
47
|
+
// urlencoded?: any;
|
|
48
|
+
// cors?: any;
|
|
49
|
+
// }
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
// export const defaultConfig: HiSecureConfig = {
|
|
55
|
+
// enableHelmet: true,
|
|
56
|
+
// enableHPP: true,
|
|
57
|
+
// enableCORS: true,
|
|
58
|
+
// enableSanitizer: true,
|
|
59
|
+
// enableRateLimiter: true,
|
|
60
|
+
// enableValidation: true,
|
|
61
|
+
|
|
62
|
+
// hashing: {
|
|
63
|
+
// primary: "argon2",
|
|
64
|
+
// fallback: "bcrypt",
|
|
65
|
+
// saltRounds: 10,
|
|
66
|
+
// },
|
|
67
|
+
|
|
68
|
+
// rateLimiter: {
|
|
69
|
+
// windowMs: 15 * 60 * 1000,
|
|
70
|
+
// maxRequests: 100,
|
|
71
|
+
// message: "Too many requests, please try again later.",
|
|
72
|
+
// useAdaptiveMode: false,
|
|
73
|
+
// },
|
|
74
|
+
|
|
75
|
+
// validation: {
|
|
76
|
+
// mode: "zod",
|
|
77
|
+
// fallback: "express-validator",
|
|
78
|
+
// },
|
|
79
|
+
|
|
80
|
+
// sanitizer: {
|
|
81
|
+
// allowedTags: ["b", "i", "em", "strong", "a"],
|
|
82
|
+
// allowedAttributes: { a: ["href"] },
|
|
83
|
+
// },
|
|
84
|
+
|
|
85
|
+
// logging: {
|
|
86
|
+
// enabled: true,
|
|
87
|
+
// level: "info",
|
|
88
|
+
// },
|
|
89
|
+
|
|
90
|
+
// /** 🔥 NEW AUTH CONFIG */
|
|
91
|
+
// auth: {
|
|
92
|
+
// enabled: false, // user enables manually
|
|
93
|
+
// jwtExpiresIn: "1d", // default value
|
|
94
|
+
// },
|
|
95
|
+
|
|
96
|
+
// /** Optional parser configs */
|
|
97
|
+
// json: {},
|
|
98
|
+
// urlencoded: { extended: true },
|
|
99
|
+
// cors: {},
|
|
100
|
+
// };
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
// src/core/config.ts
|
|
106
|
+
import { HiSecureConfig } from "./types/HiSecureConfig";
|
|
107
|
+
|
|
108
|
+
export const defaultConfig: HiSecureConfig = {
|
|
109
|
+
enableHelmet: true,
|
|
110
|
+
enableHPP: true,
|
|
111
|
+
enableCORS: true,
|
|
112
|
+
enableSanitizer: true,
|
|
113
|
+
enableRateLimiter: true,
|
|
114
|
+
enableValidation: true,
|
|
115
|
+
enableCompression: true,
|
|
116
|
+
|
|
117
|
+
hashing: {
|
|
118
|
+
primary: "argon2",
|
|
119
|
+
fallback: "bcrypt",
|
|
120
|
+
saltRounds: 10,
|
|
121
|
+
},
|
|
122
|
+
|
|
123
|
+
rateLimiter: {
|
|
124
|
+
windowMs: 15 * 60 * 1000,
|
|
125
|
+
maxRequests: 100,
|
|
126
|
+
message: "Too many requests, please try again later.",
|
|
127
|
+
useAdaptiveMode: false,
|
|
128
|
+
},
|
|
129
|
+
|
|
130
|
+
validation: {
|
|
131
|
+
mode: "zod",
|
|
132
|
+
fallback: "express-validator",
|
|
133
|
+
},
|
|
134
|
+
|
|
135
|
+
sanitizer: {
|
|
136
|
+
allowedTags: ["b", "i", "em", "strong", "a"],
|
|
137
|
+
allowedAttributes: { a: ["href"] },
|
|
138
|
+
fallback: 'escape',
|
|
139
|
+
primary: 'sanitize-html'
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
logging: {
|
|
143
|
+
enabled: true,
|
|
144
|
+
level: "info",
|
|
145
|
+
maxSize: 5 * 1024 * 1024,
|
|
146
|
+
},
|
|
147
|
+
|
|
148
|
+
auth: {
|
|
149
|
+
enabled: false,
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
json: { limit: '1mb' },
|
|
153
|
+
urlencoded: { extended: true },
|
|
154
|
+
cors: {},
|
|
155
|
+
compression: {},
|
|
156
|
+
};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// export const LIB_NAME = "HiSecure";
|
|
2
|
+
// export const LIB_VERSION = "1.0.0";
|
|
3
|
+
|
|
4
|
+
// // Adapter Names
|
|
5
|
+
// export const ADAPTERS = {
|
|
6
|
+
// HASHING_PRIMARY: "HASHING_PRIMARY",
|
|
7
|
+
// HASHING_FALLBACK: "HASHING_FALLBACK",
|
|
8
|
+
// RATE_LIMITER: "RATE_LIMITER",
|
|
9
|
+
// VALIDATOR: "VALIDATOR",
|
|
10
|
+
// SANITIZER: "SANITIZER"
|
|
11
|
+
// } as const;
|
|
12
|
+
|
|
13
|
+
// // Manager Names
|
|
14
|
+
// export const MANAGERS = {
|
|
15
|
+
// HASH_MANAGER: "HASH_MANAGER",
|
|
16
|
+
// RATE_LIMIT_MANAGER: "RATE_LIMIT_MANAGER",
|
|
17
|
+
// VALIDATION_MANAGER: "VALIDATION_MANAGER",
|
|
18
|
+
// SANITIZER_MANAGER:"SANITIZER_MANAGER"
|
|
19
|
+
// } as const;
|
|
20
|
+
|
|
21
|
+
// // Error Codes
|
|
22
|
+
// export const ERROR_CODES = {
|
|
23
|
+
// ADAPTER_FAILURE: "ADAPTER_FAILURE",
|
|
24
|
+
// VALIDATION_ERROR: "VALIDATION_ERROR",
|
|
25
|
+
// RATE_LIMIT_EXCEEDED: "RATE_LIMIT_EXCEEDED",
|
|
26
|
+
// SANITIZER_ERROR:"SANITIZER_ERROR",
|
|
27
|
+
// CONFIG_ERROR: "CONFIG_ERROR",
|
|
28
|
+
// UNKNOWN: "UNKNOWN"
|
|
29
|
+
// } as const;
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
// src/core/constants.ts
|
|
34
|
+
export const LIB_NAME = "HiSecure";
|
|
35
|
+
export const LIB_VERSION = "1.0.0";
|
|
36
|
+
|
|
37
|
+
export const ADAPTERS = {
|
|
38
|
+
HASHING_PRIMARY: "HASHING_PRIMARY",
|
|
39
|
+
HASHING_FALLBACK: "HASHING_FALLBACK",
|
|
40
|
+
RATE_LIMITER: "RATE_LIMITER",
|
|
41
|
+
VALIDATOR: "VALIDATOR",
|
|
42
|
+
SANITIZER: "SANITIZER",
|
|
43
|
+
COMPRESSION: "COMPRESSION"
|
|
44
|
+
} as const;
|
|
45
|
+
|
|
46
|
+
export const MANAGERS = {
|
|
47
|
+
HASH_MANAGER: "HASH_MANAGER",
|
|
48
|
+
RATE_LIMIT_MANAGER: "RATE_LIMIT_MANAGER",
|
|
49
|
+
VALIDATION_MANAGER: "VALIDATION_MANAGER",
|
|
50
|
+
SANITIZER_MANAGER: "SANITIZER_MANAGER",
|
|
51
|
+
CORS_MANAGER: "CORS_MANAGER",
|
|
52
|
+
JSON_MANAGER: "JSON_MANAGER",
|
|
53
|
+
AUTH_MANAGER: "AUTH_MANAGER",
|
|
54
|
+
COMPRESSION_MANAGER: "COMPRESSION_MANAGER"
|
|
55
|
+
} as const;
|
|
56
|
+
|
|
57
|
+
export const ERROR_CODES = {
|
|
58
|
+
ADAPTER_FAILURE: "ADAPTER_FAILURE",
|
|
59
|
+
VALIDATION_ERROR: "VALIDATION_ERROR",
|
|
60
|
+
RATE_LIMIT_EXCEEDED: "RATE_LIMIT_EXCEEDED",
|
|
61
|
+
SANITIZER_ERROR: "SANITIZER_ERROR",
|
|
62
|
+
AUTH_ERROR: "AUTH_ERROR",
|
|
63
|
+
CONFIG_ERROR: "CONFIG_ERROR",
|
|
64
|
+
SECURITY_ERROR: "SECURITY_ERROR",
|
|
65
|
+
UNKNOWN: "UNKNOWN"
|
|
66
|
+
} as const;
|
|
67
|
+
|
|
68
|
+
export const PRESETS = {
|
|
69
|
+
API: 'api',
|
|
70
|
+
STRICT: 'strict',
|
|
71
|
+
PUBLIC: 'public',
|
|
72
|
+
DEFAULT: 'default'
|
|
73
|
+
} as const;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ERROR_CODES } from "../constants.js";
|
|
2
|
+
|
|
3
|
+
export class AdapterError extends Error {
|
|
4
|
+
code: string;
|
|
5
|
+
|
|
6
|
+
constructor(message: string, code: string = ERROR_CODES.ADAPTER_FAILURE) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.name = "AdapterError";
|
|
10
|
+
|
|
11
|
+
// Capture stack trace properly
|
|
12
|
+
Error.captureStackTrace?.(this, AdapterError);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export class HttpError extends Error {
|
|
2
|
+
status: number;
|
|
3
|
+
code?: string;
|
|
4
|
+
details?: any;
|
|
5
|
+
|
|
6
|
+
constructor(
|
|
7
|
+
status: number,
|
|
8
|
+
message: string,
|
|
9
|
+
options?: { code?:string; details?: any }
|
|
10
|
+
) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.status = status;
|
|
13
|
+
this.code = options?.code as string;
|
|
14
|
+
this.details = options?.details;
|
|
15
|
+
this.name = "HttpError";
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// ---------- STATIC HELPERS ----------
|
|
19
|
+
static BadRequest(message = "Bad Request", details?: any) {
|
|
20
|
+
return new HttpError(400, message, { code: "BAD_REQUEST", details });
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
static Unauthorized(message = "Unauthorized", details?: any) {
|
|
24
|
+
return new HttpError(401, message, { code: "UNAUTHORIZED", details });
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
static Forbidden(message = "Forbidden", details?: any) {
|
|
28
|
+
return new HttpError(403, message, { code: "FORBIDDEN", details });
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
static NotFound(message = "Not Found", details?: any) {
|
|
32
|
+
return new HttpError(404, message, { code: "NOT_FOUND", details });
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
static Conflict(message = "Conflict", details?: any) {
|
|
36
|
+
return new HttpError(409, message, { code: "CONFLICT", details });
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
static TooManyRequests(message = "Too Many Requests", details?: any) {
|
|
40
|
+
return new HttpError(429, message, { code: "RATE_LIMIT", details });
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
static Internal(message = "Internal Server Error", details?: any) {
|
|
44
|
+
return new HttpError(500, message, { code: "INTERNAL_ERROR", details });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ERROR_CODES } from "../constants.js";
|
|
2
|
+
|
|
3
|
+
export class SanitizerError extends Error {
|
|
4
|
+
code: string;
|
|
5
|
+
|
|
6
|
+
constructor(message: string, code: string = ERROR_CODES.SANITIZER_ERROR) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.name = "SanitizerError";
|
|
10
|
+
|
|
11
|
+
Error.captureStackTrace?.(this, SanitizerError);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ERROR_CODES } from "../constants.js";
|
|
2
|
+
|
|
3
|
+
export class SecurityError extends Error {
|
|
4
|
+
code: string;
|
|
5
|
+
|
|
6
|
+
constructor(message: string, code: string = ERROR_CODES.CONFIG_ERROR) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.name = "SecurityError";
|
|
10
|
+
|
|
11
|
+
Error.captureStackTrace?.(this, SecurityError);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ERROR_CODES } from "../constants.js";
|
|
2
|
+
|
|
3
|
+
export class ValidationError extends Error {
|
|
4
|
+
code: string;
|
|
5
|
+
|
|
6
|
+
constructor(message: string, code: string = ERROR_CODES.VALIDATION_ERROR) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.name = "ValidationError";
|
|
10
|
+
|
|
11
|
+
Error.captureStackTrace?.(this, ValidationError);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// src/core/types/HiSecureConfig.ts
|
|
2
|
+
export interface HiSecureConfig {
|
|
3
|
+
// Core security features
|
|
4
|
+
enableHelmet: boolean;
|
|
5
|
+
enableHPP: boolean;
|
|
6
|
+
enableCORS: boolean;
|
|
7
|
+
enableSanitizer: boolean;
|
|
8
|
+
enableRateLimiter: boolean;
|
|
9
|
+
enableValidation: boolean;
|
|
10
|
+
enableCompression: boolean;
|
|
11
|
+
|
|
12
|
+
// Hashing configuration
|
|
13
|
+
hashing: {
|
|
14
|
+
primary: "argon2" | "bcrypt";
|
|
15
|
+
fallback: "bcrypt" | null;
|
|
16
|
+
saltRounds: number;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
// Rate limiting
|
|
20
|
+
rateLimiter: {
|
|
21
|
+
windowMs: number;
|
|
22
|
+
maxRequests: number;
|
|
23
|
+
message: string;
|
|
24
|
+
useAdaptiveMode: boolean;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// Validation
|
|
28
|
+
validation: {
|
|
29
|
+
mode: "zod" | "express-validator";
|
|
30
|
+
fallback: "express-validator" | null;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// Sanitization
|
|
34
|
+
sanitizer: {
|
|
35
|
+
allowedTags: string[];
|
|
36
|
+
allowedAttributes: Record<string, string[]>;
|
|
37
|
+
fallback: 'escape' | 'xss' | 'none';
|
|
38
|
+
primary: 'sanitize-html' | 'xss';
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// Logging
|
|
42
|
+
logging: {
|
|
43
|
+
enabled: boolean;
|
|
44
|
+
level: "info" | "warn" | "error" | "debug";
|
|
45
|
+
file?: string;
|
|
46
|
+
maxSize?: number;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
// Authentication
|
|
50
|
+
auth: {
|
|
51
|
+
enabled: boolean;
|
|
52
|
+
jwtSecret?: string;
|
|
53
|
+
jwtExpiresIn?: string | number;
|
|
54
|
+
googleClientId?: string;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
// Optional parsers
|
|
58
|
+
json?: object;
|
|
59
|
+
urlencoded?: object;
|
|
60
|
+
cors?: object;
|
|
61
|
+
compression?: object;
|
|
62
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// // src/core/types/SecureOptions.ts
|
|
2
|
+
|
|
3
|
+
// export interface SecureOptions {
|
|
4
|
+
// /** Enable/override CORS for this route */
|
|
5
|
+
// cors?: boolean | object;
|
|
6
|
+
|
|
7
|
+
// /** Per-route rate limit */
|
|
8
|
+
// rateLimit?: boolean | "strict" | "relaxed" | object;
|
|
9
|
+
|
|
10
|
+
// /** Sanitize request body */
|
|
11
|
+
// sanitize?: boolean;
|
|
12
|
+
|
|
13
|
+
// /** Validation schema (Zod or express-validator) */
|
|
14
|
+
// validate?: any;
|
|
15
|
+
|
|
16
|
+
// /** Auto-JSON parsing (express.json) options */
|
|
17
|
+
// json?: boolean | object;
|
|
18
|
+
|
|
19
|
+
// /** NEW: Per-route authentication (JWT protect) */
|
|
20
|
+
// auth?: boolean | { required?: boolean };
|
|
21
|
+
// }
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
// src/core/types/SecureOptions.ts
|
|
28
|
+
import { z, ZodSchema } from 'zod';
|
|
29
|
+
import { ValidationChain } from 'express-validator';
|
|
30
|
+
|
|
31
|
+
export type ValidationSchema = ZodSchema | ValidationChain[];
|
|
32
|
+
|
|
33
|
+
export interface RateLimitOptions {
|
|
34
|
+
windowMs?: number;
|
|
35
|
+
max?: number;
|
|
36
|
+
message?: string;
|
|
37
|
+
skipFailedRequests?: boolean;
|
|
38
|
+
[key: string]: any;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface SanitizeOptions {
|
|
42
|
+
allowedTags?: string[];
|
|
43
|
+
allowedAttributes?: Record<string, string[]>;
|
|
44
|
+
[key: string]: any;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface AuthOptions {
|
|
48
|
+
required?: boolean;
|
|
49
|
+
roles?: string[];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface SecureOptions {
|
|
53
|
+
cors?: boolean | object;
|
|
54
|
+
rateLimit?: boolean | "strict" | "relaxed" | RateLimitOptions;
|
|
55
|
+
sanitize?: boolean | SanitizeOptions;
|
|
56
|
+
validate?: ValidationSchema;
|
|
57
|
+
json?: boolean | object;
|
|
58
|
+
auth?: boolean | AuthOptions;
|
|
59
|
+
compression?: boolean | object;
|
|
60
|
+
headers?: boolean | object;
|
|
61
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// import { normalizeOptions } from "../utils/normalizeOptions.js";
|
|
2
|
+
// import { HiSecure } from "./HiSecure.js";
|
|
3
|
+
|
|
4
|
+
// export function useSecure(engine: HiSecure, input?: any) {
|
|
5
|
+
// if (!engine.isInitialized()) {
|
|
6
|
+
// throw new Error("HiSecure must be initialized before using .use()");
|
|
7
|
+
// }
|
|
8
|
+
|
|
9
|
+
// const options = normalizeOptions(input);
|
|
10
|
+
// const chain: any[] = [];
|
|
11
|
+
|
|
12
|
+
// // JSON
|
|
13
|
+
// if (options.json.enabled) {
|
|
14
|
+
// chain.push(engine.jsonManager.middleware(options.json.options));
|
|
15
|
+
// chain.push(engine.jsonManager.urlencoded());
|
|
16
|
+
// }
|
|
17
|
+
|
|
18
|
+
// // CORS
|
|
19
|
+
// if (options.cors.enabled) {
|
|
20
|
+
// chain.push(engine.corsManager.middleware(options.cors.options));
|
|
21
|
+
// }
|
|
22
|
+
|
|
23
|
+
// // Sanitize
|
|
24
|
+
// if (options.sanitize.enabled) {
|
|
25
|
+
// chain.push(engine.sanitizerManager.middleware());
|
|
26
|
+
// }
|
|
27
|
+
|
|
28
|
+
// // Validate
|
|
29
|
+
// if (options.validate.enabled && options.validate.schema) {
|
|
30
|
+
// chain.push(engine.validatorManager.validate(options.validate.schema));
|
|
31
|
+
// }
|
|
32
|
+
|
|
33
|
+
// // Rate Limit
|
|
34
|
+
// if (options.rateLimit.enabled) {
|
|
35
|
+
// chain.push(
|
|
36
|
+
// engine.rateLimitManager.middleware({
|
|
37
|
+
// mode: options.rateLimit.mode ?? undefined,
|
|
38
|
+
// options: options.rateLimit.options ?? undefined
|
|
39
|
+
// })
|
|
40
|
+
// );
|
|
41
|
+
// }
|
|
42
|
+
|
|
43
|
+
// // AUTH
|
|
44
|
+
// if (options.auth.enabled) {
|
|
45
|
+
// if (!engine.authManager) {
|
|
46
|
+
// throw new Error("AuthManager not initialized. Enable auth in config.");
|
|
47
|
+
// }
|
|
48
|
+
|
|
49
|
+
// chain.push(
|
|
50
|
+
// engine.authManager.protect({
|
|
51
|
+
// required: options.auth.required
|
|
52
|
+
// })
|
|
53
|
+
// );
|
|
54
|
+
// }
|
|
55
|
+
|
|
56
|
+
// return chain;
|
|
57
|
+
// }
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
// src/core/useSecure.ts - SIMPLER VERSION
|
|
62
|
+
// This is now optional since HiSecure class has fluent API
|
|
63
|
+
|
|
64
|
+
import { HiSecure } from "./HiSecure.js";
|
|
65
|
+
import { SecureOptions } from "./types/SecureOptions.js";
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @deprecated Use HiSecure.middleware() or fluent API instead
|
|
69
|
+
*/
|
|
70
|
+
export function useSecure(options?: SecureOptions | "api" | "strict" | "public") {
|
|
71
|
+
console.warn("⚠ useSecure() is deprecated. Use HiSecure.middleware() or fluent API methods.");
|
|
72
|
+
return HiSecure.middleware(options);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Legacy support - route-level security
|
|
77
|
+
*/
|
|
78
|
+
export function secureRoute(options?: SecureOptions) {
|
|
79
|
+
const chain: any[] = [];
|
|
80
|
+
|
|
81
|
+
if (options?.cors) {
|
|
82
|
+
chain.push(HiSecure.cors(
|
|
83
|
+
typeof options.cors === 'object' ? options.cors : undefined
|
|
84
|
+
));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (options?.rateLimit) {
|
|
88
|
+
chain.push(HiSecure.rateLimit(
|
|
89
|
+
typeof options.rateLimit === 'object' ? options.rateLimit :
|
|
90
|
+
options.rateLimit === "strict" ? "strict" : "relaxed"
|
|
91
|
+
));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (options?.sanitize) {
|
|
95
|
+
chain.push(HiSecure.sanitize(
|
|
96
|
+
typeof options.sanitize === 'object' ? options.sanitize : undefined
|
|
97
|
+
));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (options?.validate) {
|
|
101
|
+
chain.push(HiSecure.validate(options.validate));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (options?.auth) {
|
|
105
|
+
chain.push(HiSecure.auth(
|
|
106
|
+
typeof options.auth === 'object' ? options.auth : undefined
|
|
107
|
+
));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return chain;
|
|
111
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
// baad mein krte hai ise
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// src/index.ts - MAIN ENTRY POINT
|
|
2
|
+
import { HiSecure } from "./core/HiSecure.js";
|
|
3
|
+
import { useSecure, secureRoute } from "./core/useSecure.js";
|
|
4
|
+
|
|
5
|
+
// Export the singleton instance for quick usage
|
|
6
|
+
const hiSecure = HiSecure.getInstance();
|
|
7
|
+
|
|
8
|
+
// Export everything
|
|
9
|
+
export {
|
|
10
|
+
HiSecure, // Class for advanced usage
|
|
11
|
+
hiSecure, // Singleton instance
|
|
12
|
+
useSecure, // Legacy function (deprecated)
|
|
13
|
+
secureRoute // Route-level security helper
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
// Default export is the singleton instance
|
|
17
|
+
export default hiSecure;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import winston from "winston";
|
|
2
|
+
|
|
3
|
+
export const logger = winston.createLogger({
|
|
4
|
+
level: "info",
|
|
5
|
+
format: winston.format.combine(
|
|
6
|
+
winston.format.timestamp(),
|
|
7
|
+
winston.format.json()
|
|
8
|
+
),
|
|
9
|
+
transports: [
|
|
10
|
+
new winston.transports.Console()
|
|
11
|
+
]
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
// Shortcut helpers
|
|
15
|
+
export const logInfo = (msg: string, meta: any = {}) => logger.info(msg, meta);
|
|
16
|
+
export const logWarn = (msg: string, meta: any = {}) => logger.warn(msg, meta);
|
|
17
|
+
export const logError = (msg: string, meta: any = {}) => logger.error(msg, meta);
|