hi-secure 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/dist/adapters/ArgonAdapter.d.ts +8 -0
  2. package/dist/adapters/ArgonAdapter.d.ts.map +1 -0
  3. package/dist/adapters/ArgonAdapter.js +45 -0
  4. package/dist/adapters/ArgonAdapter.js.map +1 -0
  5. package/dist/adapters/BcryptAdapter.d.ts +7 -0
  6. package/dist/adapters/BcryptAdapter.d.ts.map +1 -0
  7. package/dist/adapters/BcryptAdapter.js +48 -0
  8. package/dist/adapters/BcryptAdapter.js.map +1 -0
  9. package/dist/adapters/DomPurifyAdapter.d.ts +13 -0
  10. package/dist/adapters/DomPurifyAdapter.d.ts.map +1 -0
  11. package/dist/adapters/DomPurifyAdapter.js +61 -0
  12. package/dist/adapters/DomPurifyAdapter.js.map +1 -0
  13. package/dist/adapters/ExpressRLAdapter.d.ts +13 -0
  14. package/dist/adapters/ExpressRLAdapter.d.ts.map +1 -0
  15. package/dist/adapters/ExpressRLAdapter.js +68 -0
  16. package/dist/adapters/ExpressRLAdapter.js.map +1 -0
  17. package/dist/adapters/ExpressValidatorAdapter.d.ts +6 -0
  18. package/dist/adapters/ExpressValidatorAdapter.d.ts.map +1 -0
  19. package/dist/adapters/ExpressValidatorAdapter.js +78 -0
  20. package/dist/adapters/ExpressValidatorAdapter.js.map +1 -0
  21. package/dist/adapters/GoggleAdapter.d.ts +15 -0
  22. package/dist/adapters/GoggleAdapter.d.ts.map +1 -0
  23. package/dist/adapters/GoggleAdapter.js +91 -0
  24. package/dist/adapters/GoggleAdapter.js.map +1 -0
  25. package/dist/adapters/GoogleAdapter.d.ts +15 -0
  26. package/dist/adapters/GoogleAdapter.d.ts.map +1 -0
  27. package/dist/adapters/GoogleAdapter.js +159 -0
  28. package/dist/adapters/GoogleAdapter.js.map +1 -0
  29. package/dist/adapters/JWTAdapter.d.ts +28 -0
  30. package/dist/adapters/JWTAdapter.d.ts.map +1 -0
  31. package/dist/adapters/JWTAdapter.js +276 -0
  32. package/dist/adapters/JWTAdapter.js.map +1 -0
  33. package/dist/adapters/RLFlexibleAdapter.d.ts +11 -0
  34. package/dist/adapters/RLFlexibleAdapter.d.ts.map +1 -0
  35. package/dist/adapters/RLFlexibleAdapter.js +115 -0
  36. package/dist/adapters/RLFlexibleAdapter.js.map +1 -0
  37. package/dist/adapters/SanitizeHtmlAdapter.d.ts +12 -0
  38. package/dist/adapters/SanitizeHtmlAdapter.d.ts.map +1 -0
  39. package/dist/adapters/SanitizeHtmlAdapter.js +141 -0
  40. package/dist/adapters/SanitizeHtmlAdapter.js.map +1 -0
  41. package/dist/adapters/XSSAdapter.d.ts +33 -0
  42. package/dist/adapters/XSSAdapter.d.ts.map +1 -0
  43. package/dist/adapters/XSSAdapter.js +127 -0
  44. package/dist/adapters/XSSAdapter.js.map +1 -0
  45. package/dist/adapters/ZodAdapter.d.ts +7 -0
  46. package/dist/adapters/ZodAdapter.d.ts.map +1 -0
  47. package/dist/adapters/ZodAdapter.js +39 -0
  48. package/dist/adapters/ZodAdapter.js.map +1 -0
  49. package/dist/core/HiSecure.d.ts +62 -0
  50. package/dist/core/HiSecure.d.ts.map +1 -0
  51. package/dist/core/HiSecure.js +273 -0
  52. package/dist/core/HiSecure.js.map +1 -0
  53. package/dist/core/config.d.ts +3 -0
  54. package/dist/core/config.d.ts.map +1 -0
  55. package/dist/core/config.js +53 -0
  56. package/dist/core/config.js.map +1 -0
  57. package/dist/core/constants.d.ts +37 -0
  58. package/dist/core/constants.d.ts.map +1 -0
  59. package/dist/core/constants.js +67 -0
  60. package/dist/core/constants.js.map +1 -0
  61. package/dist/core/errors/AdapterError.d.ts +5 -0
  62. package/dist/core/errors/AdapterError.d.ts.map +1 -0
  63. package/dist/core/errors/AdapterError.js +15 -0
  64. package/dist/core/errors/AdapterError.js.map +1 -0
  65. package/dist/core/errors/HttpErrror.d.ts +17 -0
  66. package/dist/core/errors/HttpErrror.d.ts.map +1 -0
  67. package/dist/core/errors/HttpErrror.js +36 -0
  68. package/dist/core/errors/HttpErrror.js.map +1 -0
  69. package/dist/core/errors/SanitizerError.d.ts +5 -0
  70. package/dist/core/errors/SanitizerError.d.ts.map +1 -0
  71. package/dist/core/errors/SanitizerError.js +14 -0
  72. package/dist/core/errors/SanitizerError.js.map +1 -0
  73. package/dist/core/errors/SecurityError.d.ts +5 -0
  74. package/dist/core/errors/SecurityError.d.ts.map +1 -0
  75. package/dist/core/errors/SecurityError.js +14 -0
  76. package/dist/core/errors/SecurityError.js.map +1 -0
  77. package/dist/core/errors/ValidationError.d.ts +5 -0
  78. package/dist/core/errors/ValidationError.d.ts.map +1 -0
  79. package/dist/core/errors/ValidationError.js +14 -0
  80. package/dist/core/errors/ValidationError.js.map +1 -0
  81. package/dist/core/types/HiSecureConfig.d.ts +47 -0
  82. package/dist/core/types/HiSecureConfig.d.ts.map +1 -0
  83. package/dist/core/types/HiSecureConfig.js +3 -0
  84. package/dist/core/types/HiSecureConfig.js.map +1 -0
  85. package/dist/core/types/SecureOptions.d.ts +30 -0
  86. package/dist/core/types/SecureOptions.d.ts.map +1 -0
  87. package/dist/core/types/SecureOptions.js +4 -0
  88. package/dist/core/types/SecureOptions.js.map +1 -0
  89. package/dist/core/useSecure.d.ts +10 -0
  90. package/dist/core/useSecure.d.ts.map +1 -0
  91. package/dist/core/useSecure.js +85 -0
  92. package/dist/core/useSecure.js.map +1 -0
  93. package/dist/examples/e1.d.ts +1 -0
  94. package/dist/examples/e1.d.ts.map +1 -0
  95. package/dist/examples/e1.js +3 -0
  96. package/dist/examples/e1.js.map +1 -0
  97. package/dist/index.d.ts +9 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/dist/index.js +15 -0
  100. package/dist/index.js.map +1 -0
  101. package/dist/logging/index.d.ts +3 -0
  102. package/dist/logging/index.d.ts.map +1 -0
  103. package/dist/logging/index.js +19 -0
  104. package/dist/logging/index.js.map +1 -0
  105. package/dist/logging/morganSetup.d.ts +2 -0
  106. package/dist/logging/morganSetup.d.ts.map +1 -0
  107. package/dist/logging/morganSetup.js +9 -0
  108. package/dist/logging/morganSetup.js.map +1 -0
  109. package/dist/logging/winstonSetup.d.ts +6 -0
  110. package/dist/logging/winstonSetup.d.ts.map +1 -0
  111. package/dist/logging/winstonSetup.js +22 -0
  112. package/dist/logging/winstonSetup.js.map +1 -0
  113. package/dist/managers/AuthManager.d.ts +23 -0
  114. package/dist/managers/AuthManager.d.ts.map +1 -0
  115. package/dist/managers/AuthManager.js +190 -0
  116. package/dist/managers/AuthManager.js.map +1 -0
  117. package/dist/managers/CorsManager.d.ts +9 -0
  118. package/dist/managers/CorsManager.d.ts.map +1 -0
  119. package/dist/managers/CorsManager.js +55 -0
  120. package/dist/managers/CorsManager.js.map +1 -0
  121. package/dist/managers/HashManager.d.ts +22 -0
  122. package/dist/managers/HashManager.d.ts.map +1 -0
  123. package/dist/managers/HashManager.js +319 -0
  124. package/dist/managers/HashManager.js.map +1 -0
  125. package/dist/managers/JsonManager.d.ts +6 -0
  126. package/dist/managers/JsonManager.d.ts.map +1 -0
  127. package/dist/managers/JsonManager.js +142 -0
  128. package/dist/managers/JsonManager.js.map +1 -0
  129. package/dist/managers/RateLimitManager.d.ts +16 -0
  130. package/dist/managers/RateLimitManager.d.ts.map +1 -0
  131. package/dist/managers/RateLimitManager.js +108 -0
  132. package/dist/managers/RateLimitManager.js.map +1 -0
  133. package/dist/managers/SanitizerManager.d.ts +18 -0
  134. package/dist/managers/SanitizerManager.d.ts.map +1 -0
  135. package/dist/managers/SanitizerManager.js +296 -0
  136. package/dist/managers/SanitizerManager.js.map +1 -0
  137. package/dist/managers/ValidatorManager.d.ts +13 -0
  138. package/dist/managers/ValidatorManager.d.ts.map +1 -0
  139. package/dist/managers/ValidatorManager.js +218 -0
  140. package/dist/managers/ValidatorManager.js.map +1 -0
  141. package/dist/middlewares/errorHandler.d.ts +3 -0
  142. package/dist/middlewares/errorHandler.d.ts.map +1 -0
  143. package/dist/middlewares/errorHandler.js +94 -0
  144. package/dist/middlewares/errorHandler.js.map +1 -0
  145. package/dist/middlewares/index.d.ts +3 -0
  146. package/dist/middlewares/index.d.ts.map +1 -0
  147. package/dist/middlewares/index.js +19 -0
  148. package/dist/middlewares/index.js.map +1 -0
  149. package/dist/middlewares/requestLogger.d.ts +2 -0
  150. package/dist/middlewares/requestLogger.d.ts.map +1 -0
  151. package/dist/middlewares/requestLogger.js +8 -0
  152. package/dist/middlewares/requestLogger.js.map +1 -0
  153. package/dist/test/t1.d.ts +1 -0
  154. package/dist/test/t1.d.ts.map +1 -0
  155. package/dist/test/t1.js +3 -0
  156. package/dist/test/t1.js.map +1 -0
  157. package/dist/utils/deepFreeze.d.ts +2 -0
  158. package/dist/utils/deepFreeze.d.ts.map +1 -0
  159. package/dist/utils/deepFreeze.js +69 -0
  160. package/dist/utils/deepFreeze.js.map +1 -0
  161. package/dist/utils/deepMerge.d.ts +5 -0
  162. package/dist/utils/deepMerge.d.ts.map +1 -0
  163. package/dist/utils/deepMerge.js +68 -0
  164. package/dist/utils/deepMerge.js.map +1 -0
  165. package/dist/utils/normalizeOptions.d.ts +38 -0
  166. package/dist/utils/normalizeOptions.d.ts.map +1 -0
  167. package/dist/utils/normalizeOptions.js +119 -0
  168. package/dist/utils/normalizeOptions.js.map +1 -0
  169. package/package.json +50 -0
  170. package/src/adapters/ArgonAdapter.ts +41 -0
  171. package/src/adapters/BcryptAdapter.ts +49 -0
  172. package/src/adapters/ExpressRLAdapter.ts +84 -0
  173. package/src/adapters/ExpressValidatorAdapter.ts +99 -0
  174. package/src/adapters/GoogleAdapter.ts +206 -0
  175. package/src/adapters/JWTAdapter.ts +346 -0
  176. package/src/adapters/RLFlexibleAdapter.ts +139 -0
  177. package/src/adapters/SanitizeHtmlAdapter.ts +162 -0
  178. package/src/adapters/XSSAdapter.ts +153 -0
  179. package/src/adapters/ZodAdapter.ts +91 -0
  180. package/src/core/HiSecure.ts +955 -0
  181. package/src/core/config.ts +156 -0
  182. package/src/core/constants.ts +73 -0
  183. package/src/core/errors/AdapterError.ts +14 -0
  184. package/src/core/errors/HttpErrror.ts +46 -0
  185. package/src/core/errors/SanitizerError.ts +13 -0
  186. package/src/core/errors/SecurityError.ts +13 -0
  187. package/src/core/errors/ValidationError.ts +13 -0
  188. package/src/core/types/HiSecureConfig.ts +62 -0
  189. package/src/core/types/SecureOptions.ts +61 -0
  190. package/src/core/useSecure.ts +111 -0
  191. package/src/examples/e1.ts +1 -0
  192. package/src/index.ts +17 -0
  193. package/src/logging/index.ts +2 -0
  194. package/src/logging/morganSetup.ts +3 -0
  195. package/src/logging/winstonSetup.ts +17 -0
  196. package/src/managers/AuthManager.ts +237 -0
  197. package/src/managers/CorsManager.ts +58 -0
  198. package/src/managers/HashManager.ts +390 -0
  199. package/src/managers/JsonManager.ts +149 -0
  200. package/src/managers/RateLimitManager.ts +368 -0
  201. package/src/managers/SanitizerManager.ts +359 -0
  202. package/src/managers/ValidatorManager.ts +269 -0
  203. package/src/middlewares/errorHandler.ts +265 -0
  204. package/src/middlewares/index.ts +2 -0
  205. package/src/middlewares/requestLogger.ts +5 -0
  206. package/src/test/t1.ts +1 -0
  207. package/src/utils/deepFreeze.ts +76 -0
  208. package/src/utils/deepMerge.ts +87 -0
  209. package/src/utils/normalizeOptions.ts +265 -0
  210. package/tsconfig.json +30 -0
@@ -0,0 +1,265 @@
1
+ // import { Request, Response, NextFunction } from "express";
2
+ // import { logger } from "../logging";
3
+ // import { AdapterError } from "../core/errors/AdapterError";
4
+ // import { ValidationError } from "../core/errors/ValidationError";
5
+ // import { SanitizerError } from "../core/errors/SanitizerError";
6
+ // import { SecurityError } from "../core/errors/SecurityError";
7
+
8
+ // export function errorHandler(
9
+ // err: any,
10
+ // req: Request,
11
+ // res: Response,
12
+ // _next: NextFunction
13
+ // ) {
14
+ // // Normalize unknown errors
15
+ // const errorMessage =
16
+ // typeof err === "string"
17
+ // ? err
18
+ // : err?.message || "Unknown error occurred";
19
+
20
+ // const errorStack =
21
+ // err instanceof Error && err.stack
22
+ // ? err.stack.split("\n").slice(0, 2).join(" | ")
23
+ // : undefined;
24
+
25
+ // // Log error centrally
26
+ // logger.error("❌ HiSecure Error Captured", {
27
+ // message: errorMessage,
28
+ // path: req.path,
29
+ // method: req.method,
30
+ // stack: errorStack,
31
+ // raw: err
32
+ // });
33
+
34
+ // // ------------------------------
35
+ // // CLASSIFIED ERROR RESPONSES
36
+ // // ------------------------------
37
+
38
+ // if (err instanceof ValidationError) {
39
+ // return res.status(400).json({
40
+ // success: false,
41
+ // error: "VALIDATION_ERROR",
42
+ // message: errorMessage
43
+ // });
44
+ // }
45
+
46
+ // if (err instanceof SanitizerError) {
47
+ // return res.status(400).json({
48
+ // success: false,
49
+ // error: "SANITIZER_ERROR",
50
+ // message: errorMessage
51
+ // });
52
+ // }
53
+
54
+ // if (err instanceof AdapterError) {
55
+ // return res.status(500).json({
56
+ // success: false,
57
+ // error: "ADAPTER_ERROR",
58
+ // message: errorMessage
59
+ // });
60
+ // }
61
+
62
+ // if (err instanceof SecurityError) {
63
+ // return res.status(500).json({
64
+ // success: false,
65
+ // error: "SECURITY_ERROR",
66
+ // message: errorMessage
67
+ // });
68
+ // }
69
+
70
+ // // ------------------------------
71
+ // // UNEXPECTED ERROR
72
+ // // ------------------------------
73
+ // return res.status(500).json({
74
+ // success: false,
75
+ // error: "INTERNAL_SERVER_ERROR",
76
+ // message: "An unexpected error occurred in HiSecure middleware."
77
+ // });
78
+ // }
79
+
80
+
81
+
82
+
83
+ // import { Request, Response, NextFunction } from "express";
84
+ // import { logger } from "../logging";
85
+ // import { AdapterError } from "../core/errors/AdapterError";
86
+ // import { ValidationError } from "../core/errors/ValidationError";
87
+ // import { SanitizerError } from "../core/errors/SanitizerError";
88
+ // import { SecurityError } from "../core/errors/SecurityError";
89
+
90
+ // export function errorHandler(
91
+ // err: any,
92
+ // req: Request,
93
+ // res: Response,
94
+ // _next: NextFunction
95
+ // ) {
96
+ // // Normalize unknown errors
97
+ // const errorMessage =
98
+ // typeof err === "string"
99
+ // ? err
100
+ // : err?.message || "Unknown error occurred";
101
+
102
+ // const errorStack =
103
+ // err instanceof Error && err.stack
104
+ // ? err.stack.split("\n").slice(0, 2).join(" | ")
105
+ // : undefined;
106
+
107
+ // // Log error centrally
108
+ // logger.error("❌ HiSecure Error Captured", {
109
+ // message: errorMessage,
110
+ // path: req.path,
111
+ // method: req.method,
112
+ // stack: errorStack,
113
+ // raw: err
114
+ // });
115
+
116
+ // // ------------------------------
117
+ // // CLASSIFIED ERROR RESPONSES
118
+ // // ------------------------------
119
+
120
+ // if (err instanceof ValidationError) {
121
+ // return res.status(400).json({
122
+ // success: false,
123
+ // error: "VALIDATION_ERROR",
124
+ // message: errorMessage
125
+ // });
126
+ // }
127
+
128
+ // if (err instanceof SanitizerError) {
129
+ // return res.status(400).json({
130
+ // success: false,
131
+ // error: "SANITIZER_ERROR",
132
+ // message: errorMessage
133
+ // });
134
+ // }
135
+
136
+ // if (err instanceof AdapterError) {
137
+ // return res.status(500).json({
138
+ // success: false,
139
+ // error: "ADAPTER_ERROR",
140
+ // message: errorMessage
141
+ // });
142
+ // }
143
+
144
+ // if (err instanceof SecurityError) {
145
+ // return res.status(500).json({
146
+ // success: false,
147
+ // error: "SECURITY_ERROR",
148
+ // message: errorMessage
149
+ // });
150
+ // }
151
+
152
+ // // ------------------------------
153
+ // // UNEXPECTED ERROR
154
+ // // ------------------------------
155
+ // return res.status(500).json({
156
+ // success: false,
157
+ // error: "INTERNAL_SERVER_ERROR",
158
+ // message: "An unexpected error occurred in HiSecure middleware."
159
+ // });
160
+ // }
161
+
162
+
163
+
164
+ import { Request, Response, NextFunction } from "express";
165
+ import { logger } from "../logging";
166
+
167
+ import { AdapterError } from "../core/errors/AdapterError.js";
168
+ import { ValidationError } from "../core/errors/ValidationError.js";
169
+ import { SanitizerError } from "../core/errors/SanitizerError.js";
170
+ import { SecurityError } from "../core/errors/SecurityError.js";
171
+ import { HttpError } from "../core/errors/HttpErrror.js";
172
+
173
+ export function errorHandler(
174
+ err: any,
175
+ req: Request,
176
+ res: Response,
177
+ _next: NextFunction
178
+ ) {
179
+ const message =
180
+ typeof err === "string"
181
+ ? err
182
+ : err?.message || "Unknown error";
183
+
184
+ const stack =
185
+ err instanceof Error && err.stack
186
+ ? err.stack.split("\n").slice(0, 2).join(" | ")
187
+ : undefined;
188
+
189
+ // Unified logging
190
+ logger.error("❌ HiSecure Error", {
191
+ type: err?.name || "UnknownError",
192
+ message,
193
+ status: err?.status,
194
+ code: err?.code,
195
+ path: req.path,
196
+ method: req.method,
197
+ stack,
198
+ raw: err,
199
+ });
200
+
201
+ // ---------------------------------------------------
202
+ // 1. HttpError (developer thrown)
203
+ // ---------------------------------------------------
204
+ if (err instanceof HttpError) {
205
+ return res.status(err.status).json({
206
+ success: false,
207
+ error: err.code,
208
+ message: err.message,
209
+ details: err.details || undefined,
210
+ });
211
+ }
212
+
213
+ // ---------------------------------------------------
214
+ // 2. Validation Errors
215
+ // ---------------------------------------------------
216
+ if (err instanceof ValidationError) {
217
+ return res.status(400).json({
218
+ success: false,
219
+ error: "VALIDATION_ERROR",
220
+ message,
221
+ });
222
+ }
223
+
224
+ // ---------------------------------------------------
225
+ // 3. Sanitizer Errors
226
+ // ---------------------------------------------------
227
+ if (err instanceof SanitizerError) {
228
+ return res.status(400).json({
229
+ success: false,
230
+ error: "SANITIZER_ERROR",
231
+ message,
232
+ });
233
+ }
234
+
235
+ // ---------------------------------------------------
236
+ // 4. Adapter Errors (hashing, rate-limit, sanitizer, validator ...)
237
+ // ---------------------------------------------------
238
+ if (err instanceof AdapterError) {
239
+ return res.status(500).json({
240
+ success: false,
241
+ error: "ADAPTER_ERROR",
242
+ message,
243
+ });
244
+ }
245
+
246
+ // ---------------------------------------------------
247
+ // 5. Security Errors (internal library security logic)
248
+ // ---------------------------------------------------
249
+ if (err instanceof SecurityError) {
250
+ return res.status(500).json({
251
+ success: false,
252
+ error: "SECURITY_ERROR",
253
+ message,
254
+ });
255
+ }
256
+
257
+ // ---------------------------------------------------
258
+ // 6. Fallback → Unexpected
259
+ // ---------------------------------------------------
260
+ return res.status(500).json({
261
+ success: false,
262
+ error: "INTERNAL_SERVER_ERROR",
263
+ message: "An unexpected error occurred in HiSecure.",
264
+ });
265
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./requestLogger.js";
2
+ export * from "./errorHandler.js";
@@ -0,0 +1,5 @@
1
+ import { requestLogger } from "../logging";
2
+
3
+ export function httpLogger() {
4
+ return requestLogger;
5
+ }
package/src/test/t1.ts ADDED
@@ -0,0 +1 @@
1
+ // dekhete hai baad mein
@@ -0,0 +1,76 @@
1
+ // export function deepFreeze<T>(obj: T): T {
2
+ // // Freeze the top level object
3
+ // Object.freeze(obj);
4
+
5
+ // // Now recursively freeze nested objects
6
+ // Object.getOwnPropertyNames(obj).forEach((prop) => {
7
+ // // @ts-ignore
8
+ // const value = obj[prop];
9
+
10
+ // if (
11
+ // value &&
12
+ // (typeof value === "object" || typeof value === "function") &&
13
+ // !Object.isFrozen(value)
14
+ // ) {
15
+ // deepFreeze(value); // recursive freeze
16
+ // }
17
+ // });
18
+
19
+ // return obj;
20
+ // }
21
+
22
+
23
+
24
+
25
+ export function deepFreeze<T>(obj: T, visited = new WeakSet()): T {
26
+ // Handle primitives and null/undefined
27
+ if (obj === null || obj === undefined) return obj;
28
+ if (typeof obj !== 'object' && typeof obj !== 'function') return obj;
29
+
30
+ // Handle circular references
31
+ if (visited.has(obj)) return obj;
32
+ visited.add(obj);
33
+
34
+ // Don't freeze built-in objects that shouldn't be frozen
35
+ const constructor = obj.constructor;
36
+ const builtIns = [Date, RegExp, Map, Set, WeakMap, WeakSet, Promise];
37
+ if (builtIns.some(builtIn => obj instanceof builtIn)) {
38
+ return obj;
39
+ }
40
+
41
+ // Don't freeze functions
42
+ if (typeof obj === 'function') return obj;
43
+
44
+ // Freeze the object itself
45
+ Object.freeze(obj);
46
+
47
+ // Freeze array elements
48
+ if (Array.isArray(obj)) {
49
+ for (const item of obj) {
50
+ if (item && typeof item === 'object') {
51
+ deepFreeze(item, visited);
52
+ }
53
+ }
54
+ return obj;
55
+ }
56
+
57
+ // Freeze object properties
58
+ const props = Object.getOwnPropertyNames(obj);
59
+ for (const prop of props) {
60
+ const value = (obj as any)[prop];
61
+ if (value && typeof value === 'object') {
62
+ deepFreeze(value, visited);
63
+ }
64
+ }
65
+
66
+ // Freeze symbol properties
67
+ const symbols = Object.getOwnPropertySymbols(obj);
68
+ for (const sym of symbols) {
69
+ const value = (obj as any)[sym];
70
+ if (value && typeof value === 'object') {
71
+ deepFreeze(value, visited);
72
+ }
73
+ }
74
+
75
+ return obj;
76
+ }
@@ -0,0 +1,87 @@
1
+ // export function deepMerge<T>(target: T, source: Partial<T>): T {
2
+ // if (!source) return target;
3
+
4
+ // const output: any = Array.isArray(target) ? [...(target as any)] : { ...(target as any) };
5
+
6
+ // for (const key of Object.keys(source) as Array<keyof typeof source>) {
7
+ // const sourceValue = (source as any)[key];
8
+ // const targetValue = (target as any)[key];
9
+
10
+ // const shouldRecurse =
11
+ // sourceValue &&
12
+ // typeof sourceValue === "object" &&
13
+ // !Array.isArray(sourceValue) &&
14
+ // targetValue &&
15
+ // typeof targetValue === "object";
16
+
17
+ // if (shouldRecurse) {
18
+ // output[key] = deepMerge(targetValue, sourceValue);
19
+ // } else {
20
+ // output[key] = sourceValue;
21
+ // }
22
+ // }
23
+
24
+ // return output;
25
+ // }
26
+
27
+
28
+
29
+
30
+ export function deepMerge<T extends object, U extends Partial<T>>(
31
+ target: T,
32
+ source: U,
33
+ options: { mergeArrays?: boolean; skipUndefined?: boolean } = {}
34
+ ): T & U {
35
+ const { mergeArrays = false, skipUndefined = true } = options;
36
+
37
+ if (!source || typeof source !== 'object') {
38
+ return target as T & U;
39
+ }
40
+
41
+ const output: any = Array.isArray(target)
42
+ ? [...target]
43
+ : { ...target };
44
+
45
+ for (const key in source) {
46
+ if (!source.hasOwnProperty(key)) continue;
47
+
48
+ const sourceValue = (source as any)[key];
49
+ const targetValue = (target as any)[key];
50
+
51
+ // Skip undefined values if configured
52
+ if (skipUndefined && sourceValue === undefined) continue;
53
+
54
+ // Handle null explicitly
55
+ if (sourceValue === null) {
56
+ output[key] = null;
57
+ continue;
58
+ }
59
+
60
+ // Merge arrays if option enabled
61
+ if (mergeArrays && Array.isArray(targetValue) && Array.isArray(sourceValue)) {
62
+ output[key] = [...targetValue, ...sourceValue];
63
+ continue;
64
+ }
65
+
66
+ // Recursive merge for plain objects
67
+ if (sourceValue && typeof sourceValue === 'object' &&
68
+ targetValue && typeof targetValue === 'object' &&
69
+ !Array.isArray(sourceValue) && !Array.isArray(targetValue) &&
70
+ sourceValue.constructor === Object && targetValue.constructor === Object) {
71
+
72
+ output[key] = deepMerge(targetValue, sourceValue, options);
73
+ continue;
74
+ }
75
+
76
+ // Overwrite for everything else
77
+ output[key] = sourceValue;
78
+ }
79
+
80
+ // Handle symbol properties
81
+ const symbols = Object.getOwnPropertySymbols(source);
82
+ for (const sym of symbols) {
83
+ output[sym] = (source as any)[sym];
84
+ }
85
+
86
+ return output as T & U;
87
+ }