@exyconn/common 2.0.0 → 2.3.2

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 (124) hide show
  1. package/README.md +864 -261
  2. package/dist/{index-BLltj-zN.d.ts → client/hooks/index.d.mts} +1 -195
  3. package/dist/{index-CIUdLBjA.d.mts → client/hooks/index.d.ts} +1 -195
  4. package/dist/client/hooks/index.js +2276 -0
  5. package/dist/client/hooks/index.js.map +1 -0
  6. package/dist/client/hooks/index.mjs +2217 -0
  7. package/dist/client/hooks/index.mjs.map +1 -0
  8. package/dist/client/index.d.mts +4 -1
  9. package/dist/client/index.d.ts +4 -1
  10. package/dist/client/index.js +2693 -19
  11. package/dist/client/index.js.map +1 -1
  12. package/dist/client/index.mjs +2634 -21
  13. package/dist/client/index.mjs.map +1 -1
  14. package/dist/client/web/index.d.mts +1461 -0
  15. package/dist/client/web/index.d.ts +1461 -0
  16. package/dist/client/web/index.js +2681 -0
  17. package/dist/client/web/index.js.map +1 -0
  18. package/dist/client/web/index.mjs +2618 -0
  19. package/dist/client/web/index.mjs.map +1 -0
  20. package/dist/data/brand-identity.d.mts +149 -0
  21. package/dist/data/brand-identity.d.ts +149 -0
  22. package/dist/data/brand-identity.js +235 -0
  23. package/dist/data/brand-identity.js.map +1 -0
  24. package/dist/data/brand-identity.mjs +220 -0
  25. package/dist/data/brand-identity.mjs.map +1 -0
  26. package/dist/data/countries.d.mts +61 -0
  27. package/dist/data/countries.d.ts +61 -0
  28. package/dist/data/countries.js +987 -0
  29. package/dist/data/countries.js.map +1 -0
  30. package/dist/data/countries.mjs +971 -0
  31. package/dist/data/countries.mjs.map +1 -0
  32. package/dist/data/currencies.d.mts +19 -0
  33. package/dist/data/currencies.d.ts +19 -0
  34. package/dist/data/currencies.js +162 -0
  35. package/dist/data/currencies.js.map +1 -0
  36. package/dist/data/currencies.mjs +153 -0
  37. package/dist/data/currencies.mjs.map +1 -0
  38. package/dist/data/index.d.mts +7 -0
  39. package/dist/data/index.d.ts +7 -0
  40. package/dist/data/index.js +2087 -0
  41. package/dist/data/index.js.map +1 -0
  42. package/dist/data/index.mjs +1948 -0
  43. package/dist/data/index.mjs.map +1 -0
  44. package/dist/data/phone-codes.d.mts +15 -0
  45. package/dist/data/phone-codes.d.ts +15 -0
  46. package/dist/data/phone-codes.js +219 -0
  47. package/dist/data/phone-codes.js.map +1 -0
  48. package/dist/data/phone-codes.mjs +211 -0
  49. package/dist/data/phone-codes.mjs.map +1 -0
  50. package/dist/data/regex.d.mts +287 -0
  51. package/dist/data/regex.d.ts +287 -0
  52. package/dist/data/regex.js +306 -0
  53. package/dist/data/regex.js.map +1 -0
  54. package/dist/data/regex.mjs +208 -0
  55. package/dist/data/regex.mjs.map +1 -0
  56. package/dist/data/timezones.d.mts +16 -0
  57. package/dist/data/timezones.d.ts +16 -0
  58. package/dist/data/timezones.js +98 -0
  59. package/dist/data/timezones.js.map +1 -0
  60. package/dist/data/timezones.mjs +89 -0
  61. package/dist/data/timezones.mjs.map +1 -0
  62. package/dist/index-01hoqibP.d.ts +119 -0
  63. package/dist/index-D3yCCjBZ.d.mts +119 -0
  64. package/dist/index-D9a9oxQy.d.ts +305 -0
  65. package/dist/index-DKn4raO7.d.ts +222 -0
  66. package/dist/index-DuxL84IW.d.mts +305 -0
  67. package/dist/index-NS8dS0p9.d.mts +222 -0
  68. package/dist/index-Nqm5_lwT.d.ts +188 -0
  69. package/dist/index-jBi3V6e5.d.mts +188 -0
  70. package/dist/index.d.mts +21 -729
  71. package/dist/index.d.ts +21 -729
  72. package/dist/index.js +3470 -97
  73. package/dist/index.js.map +1 -1
  74. package/dist/index.mjs +3457 -104
  75. package/dist/index.mjs.map +1 -1
  76. package/dist/server/configs/index.d.mts +602 -0
  77. package/dist/server/configs/index.d.ts +602 -0
  78. package/dist/server/configs/index.js +707 -0
  79. package/dist/server/configs/index.js.map +1 -0
  80. package/dist/server/configs/index.mjs +665 -0
  81. package/dist/server/configs/index.mjs.map +1 -0
  82. package/dist/server/index.d.mts +3 -0
  83. package/dist/server/index.d.ts +3 -0
  84. package/dist/server/index.js +699 -0
  85. package/dist/server/index.js.map +1 -1
  86. package/dist/server/index.mjs +662 -1
  87. package/dist/server/index.mjs.map +1 -1
  88. package/dist/shared/config/index.d.mts +40 -0
  89. package/dist/shared/config/index.d.ts +40 -0
  90. package/dist/shared/config/index.js +58 -0
  91. package/dist/shared/config/index.js.map +1 -0
  92. package/dist/shared/config/index.mjs +51 -0
  93. package/dist/shared/config/index.mjs.map +1 -0
  94. package/dist/shared/constants/index.d.mts +593 -0
  95. package/dist/shared/constants/index.d.ts +593 -0
  96. package/dist/shared/constants/index.js +391 -0
  97. package/dist/shared/constants/index.js.map +1 -0
  98. package/dist/shared/constants/index.mjs +360 -0
  99. package/dist/shared/constants/index.mjs.map +1 -0
  100. package/dist/shared/index.d.mts +5 -1
  101. package/dist/shared/index.d.ts +5 -1
  102. package/dist/shared/types/index.d.mts +140 -0
  103. package/dist/shared/types/index.d.ts +140 -0
  104. package/dist/shared/types/index.js +4 -0
  105. package/dist/shared/types/index.js.map +1 -0
  106. package/dist/shared/types/index.mjs +3 -0
  107. package/dist/shared/types/index.mjs.map +1 -0
  108. package/dist/shared/utils/index.d.mts +255 -0
  109. package/dist/shared/utils/index.d.ts +255 -0
  110. package/dist/shared/utils/index.js +623 -0
  111. package/dist/shared/utils/index.js.map +1 -0
  112. package/dist/shared/utils/index.mjs +324 -0
  113. package/dist/shared/utils/index.mjs.map +1 -0
  114. package/dist/shared/validation/index.d.mts +258 -0
  115. package/dist/shared/validation/index.d.ts +258 -0
  116. package/dist/shared/validation/index.js +185 -0
  117. package/dist/shared/validation/index.js.map +1 -0
  118. package/dist/shared/validation/index.mjs +172 -0
  119. package/dist/shared/validation/index.mjs.map +1 -0
  120. package/package.json +151 -56
  121. package/dist/index-DEzgM15j.d.ts +0 -67
  122. package/dist/index-DNFVgQx8.d.ts +0 -1375
  123. package/dist/index-DbV04Dx8.d.mts +0 -67
  124. package/dist/index-DfqEP6Oe.d.mts +0 -1375
@@ -0,0 +1,707 @@
1
+ 'use strict';
2
+
3
+ var rateLimit = require('express-rate-limit');
4
+
5
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
6
+
7
+ var rateLimit__default = /*#__PURE__*/_interopDefault(rateLimit);
8
+
9
+ // src/server/configs/cors.config.ts
10
+ var DEFAULT_CORS_CONFIG = {
11
+ productionOrigins: [],
12
+ developmentOrigins: [
13
+ "http://localhost:3000",
14
+ "http://localhost:4000",
15
+ "http://localhost:5000",
16
+ "http://localhost:5173",
17
+ "http://localhost:8080",
18
+ "http://127.0.0.1:3000",
19
+ "http://127.0.0.1:4000",
20
+ "http://127.0.0.1:5000",
21
+ "http://127.0.0.1:5173",
22
+ "http://127.0.0.1:8080"
23
+ ],
24
+ allowedSubdomains: [],
25
+ originPatterns: [],
26
+ allowNoOrigin: true,
27
+ allowAllInDev: true,
28
+ credentials: true,
29
+ methods: ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS", "HEAD"],
30
+ allowedHeaders: [
31
+ "Content-Type",
32
+ "Authorization",
33
+ "X-Requested-With",
34
+ "Accept",
35
+ "Origin",
36
+ "X-API-Key",
37
+ "X-Organization-Id",
38
+ "X-Request-Id"
39
+ ],
40
+ exposedHeaders: [
41
+ "Content-Range",
42
+ "X-Content-Range",
43
+ "X-Total-Count",
44
+ "X-Request-Id"
45
+ ],
46
+ maxAge: 86400
47
+ // 24 hours
48
+ };
49
+ var createCorsOptions = (config = {}) => {
50
+ const finalConfig = { ...DEFAULT_CORS_CONFIG, ...config };
51
+ const {
52
+ productionOrigins,
53
+ developmentOrigins,
54
+ allowedSubdomains,
55
+ originPatterns,
56
+ allowNoOrigin,
57
+ allowAllInDev,
58
+ customValidator,
59
+ credentials,
60
+ methods,
61
+ allowedHeaders,
62
+ exposedHeaders,
63
+ maxAge
64
+ } = finalConfig;
65
+ const allOrigins = /* @__PURE__ */ new Set([...productionOrigins, ...developmentOrigins]);
66
+ const originHandler = (origin, callback) => {
67
+ if (!origin) {
68
+ callback(null, allowNoOrigin);
69
+ return;
70
+ }
71
+ if (allOrigins.has(origin)) {
72
+ callback(null, true);
73
+ return;
74
+ }
75
+ if (allowedSubdomains.some((subdomain) => origin.endsWith(subdomain))) {
76
+ callback(null, true);
77
+ return;
78
+ }
79
+ if (originPatterns.some((pattern) => pattern.test(origin))) {
80
+ callback(null, true);
81
+ return;
82
+ }
83
+ if (customValidator && customValidator(origin)) {
84
+ callback(null, true);
85
+ return;
86
+ }
87
+ if (process.env.NODE_ENV !== "production" && allowAllInDev) {
88
+ callback(null, true);
89
+ return;
90
+ }
91
+ if (process.env.NODE_ENV === "production") {
92
+ callback(new Error(`Origin ${origin} not allowed by CORS`));
93
+ return;
94
+ }
95
+ callback(null, true);
96
+ };
97
+ return {
98
+ origin: originHandler,
99
+ credentials,
100
+ methods,
101
+ allowedHeaders,
102
+ exposedHeaders,
103
+ maxAge
104
+ };
105
+ };
106
+ var createBrandCorsOptions = (brandDomain, additionalConfig = {}) => {
107
+ const productionOrigins = [
108
+ `https://${brandDomain}`,
109
+ `https://www.${brandDomain}`
110
+ ];
111
+ const allowedSubdomains = [`.${brandDomain}`];
112
+ return createCorsOptions({
113
+ productionOrigins,
114
+ allowedSubdomains,
115
+ ...additionalConfig
116
+ });
117
+ };
118
+ var createMultiBrandCorsOptions = (domains, additionalConfig = {}) => {
119
+ const productionOrigins = domains.flatMap((domain) => [
120
+ `https://${domain}`,
121
+ `https://www.${domain}`
122
+ ]);
123
+ const allowedSubdomains = domains.map((domain) => `.${domain}`);
124
+ return createCorsOptions({
125
+ productionOrigins,
126
+ allowedSubdomains,
127
+ ...additionalConfig
128
+ });
129
+ };
130
+ var EXYCONN_CORS_CONFIG = {
131
+ productionOrigins: [
132
+ "https://exyconn.com",
133
+ "https://www.exyconn.com",
134
+ "https://botify.life",
135
+ "https://www.botify.life",
136
+ "https://partywings.fun",
137
+ "https://www.partywings.fun",
138
+ "https://sibera.work",
139
+ "https://www.sibera.work",
140
+ "https://spentiva.com",
141
+ "https://www.spentiva.com"
142
+ ],
143
+ allowedSubdomains: [
144
+ ".exyconn.com",
145
+ ".botify.life",
146
+ ".partywings.fun",
147
+ ".sibera.work",
148
+ ".spentiva.com"
149
+ ],
150
+ developmentOrigins: [
151
+ "http://localhost:3000",
152
+ "http://localhost:4000",
153
+ "http://localhost:4001",
154
+ "http://localhost:4002",
155
+ "http://localhost:4003",
156
+ "http://localhost:4004",
157
+ "http://localhost:4005",
158
+ "http://localhost:5173",
159
+ "http://127.0.0.1:3000",
160
+ "http://127.0.0.1:4000",
161
+ "http://127.0.0.1:5173"
162
+ ]
163
+ };
164
+ var STRICT_CORS_CONFIG = {
165
+ allowNoOrigin: false,
166
+ allowAllInDev: false,
167
+ methods: ["GET", "POST", "PUT", "DELETE"]
168
+ };
169
+ var PERMISSIVE_CORS_CONFIG = {
170
+ allowNoOrigin: true,
171
+ allowAllInDev: true,
172
+ originPatterns: [/localhost/, /127\.0\.0\.1/]
173
+ };
174
+ var corsOptions = createCorsOptions(EXYCONN_CORS_CONFIG);
175
+ var DEFAULT_RATE_LIMIT_TIERS = {
176
+ STANDARD: {
177
+ windowMs: 15 * 60 * 1e3,
178
+ // 15 minutes
179
+ maxRequests: 100,
180
+ message: "Too many requests, please try again later.",
181
+ skipSuccessfulRequests: false,
182
+ skipFailedRequests: false
183
+ },
184
+ STRICT: {
185
+ windowMs: 15 * 60 * 1e3,
186
+ // 15 minutes
187
+ maxRequests: 20,
188
+ message: "Too many requests, please try again later.",
189
+ skipSuccessfulRequests: false,
190
+ skipFailedRequests: false
191
+ },
192
+ DDOS: {
193
+ windowMs: 60 * 1e3,
194
+ // 1 minute
195
+ maxRequests: 60,
196
+ message: "Rate limit exceeded. Please slow down.",
197
+ skipSuccessfulRequests: false,
198
+ skipFailedRequests: false
199
+ },
200
+ // Additional presets
201
+ VERY_STRICT: {
202
+ windowMs: 60 * 60 * 1e3,
203
+ // 1 hour
204
+ maxRequests: 5,
205
+ message: "Too many attempts. Please try again in an hour.",
206
+ skipSuccessfulRequests: false,
207
+ skipFailedRequests: false
208
+ },
209
+ RELAXED: {
210
+ windowMs: 15 * 60 * 1e3,
211
+ // 15 minutes
212
+ maxRequests: 500,
213
+ message: "Rate limit exceeded.",
214
+ skipSuccessfulRequests: false,
215
+ skipFailedRequests: false
216
+ },
217
+ API: {
218
+ windowMs: 60 * 1e3,
219
+ // 1 minute
220
+ maxRequests: 30,
221
+ message: "API rate limit exceeded.",
222
+ skipSuccessfulRequests: false,
223
+ skipFailedRequests: false
224
+ }
225
+ };
226
+ var defaultKeyGenerator = (req) => {
227
+ const forwarded = req.headers["x-forwarded-for"];
228
+ const ip = forwarded ? Array.isArray(forwarded) ? forwarded[0] : forwarded.split(",")[0].trim() : req.ip || req.socket.remoteAddress || "unknown";
229
+ return ip;
230
+ };
231
+ var createPrefixedKeyGenerator = (prefix) => (req) => {
232
+ return `${prefix}:${defaultKeyGenerator(req)}`;
233
+ };
234
+ var createUserKeyGenerator = (getUserId) => (req) => {
235
+ const userId = getUserId(req);
236
+ return userId || defaultKeyGenerator(req);
237
+ };
238
+ var createApiKeyGenerator = (headerName = "x-api-key") => (req) => {
239
+ const apiKey = req.headers[headerName.toLowerCase()];
240
+ return apiKey || defaultKeyGenerator(req);
241
+ };
242
+ var createRateLimitResponse = (message, retryAfter) => ({
243
+ status: "error",
244
+ statusCode: 429,
245
+ message,
246
+ ...retryAfter
247
+ });
248
+ var createRateLimiter = (tierConfig, options = {}) => {
249
+ const {
250
+ standardHeaders = true,
251
+ legacyHeaders = false,
252
+ keyGenerator = defaultKeyGenerator,
253
+ skip,
254
+ handler
255
+ } = options;
256
+ return rateLimit__default.default({
257
+ windowMs: tierConfig.windowMs,
258
+ max: tierConfig.maxRequests,
259
+ message: createRateLimitResponse(tierConfig.message),
260
+ standardHeaders,
261
+ legacyHeaders,
262
+ keyGenerator,
263
+ skip,
264
+ handler,
265
+ skipSuccessfulRequests: tierConfig.skipSuccessfulRequests,
266
+ skipFailedRequests: tierConfig.skipFailedRequests
267
+ });
268
+ };
269
+ var createStandardRateLimiter = (config = {}, options = {}) => {
270
+ const tierConfig = { ...DEFAULT_RATE_LIMIT_TIERS.STANDARD, ...config };
271
+ return createRateLimiter(tierConfig, options);
272
+ };
273
+ var createStrictRateLimiter = (config = {}, options = {}) => {
274
+ const tierConfig = { ...DEFAULT_RATE_LIMIT_TIERS.STRICT, ...config };
275
+ return createRateLimiter(tierConfig, options);
276
+ };
277
+ var createDdosRateLimiter = (config = {}, options = {}) => {
278
+ const tierConfig = { ...DEFAULT_RATE_LIMIT_TIERS.DDOS, ...config };
279
+ return createRateLimiter(tierConfig, options);
280
+ };
281
+ var createApiRateLimiter = (config = {}, options = {}) => {
282
+ const tierConfig = { ...DEFAULT_RATE_LIMIT_TIERS.API, ...config };
283
+ return createRateLimiter(tierConfig, {
284
+ keyGenerator: createApiKeyGenerator(),
285
+ ...options
286
+ });
287
+ };
288
+ var RateLimiterBuilder = class {
289
+ constructor(preset = "STANDARD") {
290
+ const presetConfig = DEFAULT_RATE_LIMIT_TIERS[preset];
291
+ this.config = {
292
+ windowMs: presetConfig.windowMs,
293
+ maxRequests: presetConfig.maxRequests,
294
+ message: presetConfig.message,
295
+ skipSuccessfulRequests: presetConfig.skipSuccessfulRequests ?? false,
296
+ skipFailedRequests: presetConfig.skipFailedRequests ?? false
297
+ };
298
+ this.options = {};
299
+ }
300
+ /**
301
+ * Set window duration
302
+ */
303
+ windowMs(ms) {
304
+ this.config.windowMs = ms;
305
+ return this;
306
+ }
307
+ /**
308
+ * Set window duration in minutes
309
+ */
310
+ windowMinutes(minutes) {
311
+ this.config.windowMs = minutes * 60 * 1e3;
312
+ return this;
313
+ }
314
+ /**
315
+ * Set window duration in hours
316
+ */
317
+ windowHours(hours) {
318
+ this.config.windowMs = hours * 60 * 60 * 1e3;
319
+ return this;
320
+ }
321
+ /**
322
+ * Set maximum requests
323
+ */
324
+ max(requests) {
325
+ this.config.maxRequests = requests;
326
+ return this;
327
+ }
328
+ /**
329
+ * Set error message
330
+ */
331
+ message(msg) {
332
+ this.config.message = msg;
333
+ return this;
334
+ }
335
+ /**
336
+ * Skip successful requests
337
+ */
338
+ skipSuccessful(skip = true) {
339
+ this.config.skipSuccessfulRequests = skip;
340
+ return this;
341
+ }
342
+ /**
343
+ * Skip failed requests
344
+ */
345
+ skipFailed(skip = true) {
346
+ this.config.skipFailedRequests = skip;
347
+ return this;
348
+ }
349
+ /**
350
+ * Set key generator
351
+ */
352
+ keyBy(generator) {
353
+ this.options.keyGenerator = generator;
354
+ return this;
355
+ }
356
+ /**
357
+ * Key by IP (default)
358
+ */
359
+ keyByIp() {
360
+ this.options.keyGenerator = defaultKeyGenerator;
361
+ return this;
362
+ }
363
+ /**
364
+ * Key by API key
365
+ */
366
+ keyByApiKey(headerName) {
367
+ this.options.keyGenerator = createApiKeyGenerator(headerName);
368
+ return this;
369
+ }
370
+ /**
371
+ * Skip certain requests
372
+ */
373
+ skipWhen(predicate) {
374
+ this.options.skip = predicate;
375
+ return this;
376
+ }
377
+ /**
378
+ * Build the rate limiter
379
+ */
380
+ build() {
381
+ return createRateLimiter(this.config, this.options);
382
+ }
383
+ };
384
+ var rateLimiter = (preset) => {
385
+ return new RateLimiterBuilder(preset);
386
+ };
387
+ var RATE_LIMIT_CONFIG = {
388
+ STANDARD: DEFAULT_RATE_LIMIT_TIERS.STANDARD,
389
+ STRICT: DEFAULT_RATE_LIMIT_TIERS.STRICT,
390
+ DDOS: DEFAULT_RATE_LIMIT_TIERS.DDOS
391
+ };
392
+ var standardRateLimiter = createStandardRateLimiter();
393
+ var strictRateLimiter = createStrictRateLimiter();
394
+ var ddosProtectionLimiter = createDdosRateLimiter();
395
+
396
+ // src/server/configs/server.config.ts
397
+ var DEFAULT_SERVER_CONFIG = {
398
+ name: "app-server",
399
+ version: "1.0.0",
400
+ environment: process.env.NODE_ENV || "development",
401
+ port: parseInt(process.env.PORT || "3000", 10),
402
+ host: process.env.HOST || "0.0.0.0",
403
+ basePath: "/api",
404
+ debug: process.env.DEBUG === "true",
405
+ trustProxy: true
406
+ };
407
+ var DEFAULT_DATABASE_CONFIG = {
408
+ uri: process.env.DATABASE_URL || process.env.MONGODB_URI || "",
409
+ name: process.env.DATABASE_NAME || "app_db",
410
+ maxPoolSize: process.env.NODE_ENV === "production" ? 50 : 10,
411
+ minPoolSize: process.env.NODE_ENV === "production" ? 10 : 5,
412
+ socketTimeoutMS: 45e3,
413
+ serverSelectionTimeoutMS: 1e4,
414
+ maxIdleTimeMS: 1e4,
415
+ retryWrites: true,
416
+ retryReads: true,
417
+ writeConcern: "majority"
418
+ };
419
+ var DEFAULT_AUTH_CONFIG = {
420
+ jwtSecret: process.env.JWT_SECRET || "",
421
+ jwtExpiresIn: process.env.JWT_EXPIRES_IN || "7d",
422
+ refreshTokenExpiresIn: process.env.REFRESH_TOKEN_EXPIRES_IN || "30d",
423
+ enableRefreshTokens: true,
424
+ apiKeyHeader: "x-api-key",
425
+ orgHeader: "x-organization-id"
426
+ };
427
+ var DEFAULT_LOGGING_CONFIG = {
428
+ level: process.env.LOG_LEVEL || "info",
429
+ logsDir: process.env.LOGS_DIR || "logs",
430
+ maxSize: "20m",
431
+ maxFiles: "14d",
432
+ errorMaxFiles: "30d",
433
+ console: true,
434
+ file: process.env.NODE_ENV === "production",
435
+ json: process.env.NODE_ENV === "production"
436
+ };
437
+ var DEFAULT_CORS_ORIGINS = {
438
+ production: [],
439
+ development: [
440
+ "http://localhost:3000",
441
+ "http://localhost:4000",
442
+ "http://localhost:5173",
443
+ "http://127.0.0.1:3000",
444
+ "http://127.0.0.1:4000",
445
+ "http://127.0.0.1:5173"
446
+ ],
447
+ patterns: []
448
+ };
449
+ var DEFAULT_RATE_LIMIT_CONFIG = {
450
+ enabled: true,
451
+ standard: {
452
+ windowMs: 15 * 60 * 1e3,
453
+ // 15 minutes
454
+ maxRequests: 100,
455
+ message: "Too many requests, please try again later."
456
+ },
457
+ strict: {
458
+ windowMs: 15 * 60 * 1e3,
459
+ // 15 minutes
460
+ maxRequests: 20,
461
+ message: "Too many requests, please try again later."
462
+ },
463
+ ddos: {
464
+ windowMs: 60 * 1e3,
465
+ // 1 minute
466
+ maxRequests: 60,
467
+ message: "Rate limit exceeded. Please slow down.",
468
+ skipSuccessfulRequests: false
469
+ }
470
+ };
471
+ function deepMerge(target, source) {
472
+ const result = { ...target };
473
+ for (const key in source) {
474
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
475
+ const sourceValue = source[key];
476
+ const targetValue = target[key];
477
+ if (sourceValue !== void 0 && typeof sourceValue === "object" && sourceValue !== null && !Array.isArray(sourceValue) && typeof targetValue === "object" && targetValue !== null && !Array.isArray(targetValue)) {
478
+ result[key] = deepMerge(
479
+ targetValue,
480
+ sourceValue
481
+ );
482
+ } else if (sourceValue !== void 0) {
483
+ result[key] = sourceValue;
484
+ }
485
+ }
486
+ }
487
+ return result;
488
+ }
489
+ var ConfigBuilder = class {
490
+ constructor() {
491
+ this.config = {
492
+ server: { ...DEFAULT_SERVER_CONFIG },
493
+ database: { ...DEFAULT_DATABASE_CONFIG },
494
+ auth: { ...DEFAULT_AUTH_CONFIG },
495
+ logging: { ...DEFAULT_LOGGING_CONFIG },
496
+ cors: { ...DEFAULT_CORS_ORIGINS },
497
+ rateLimit: { ...DEFAULT_RATE_LIMIT_CONFIG }
498
+ };
499
+ }
500
+ /**
501
+ * Set server configuration
502
+ */
503
+ setServer(config) {
504
+ this.config.server = deepMerge(this.config.server, config);
505
+ return this;
506
+ }
507
+ /**
508
+ * Set database configuration
509
+ */
510
+ setDatabase(config) {
511
+ this.config.database = deepMerge(this.config.database, config);
512
+ return this;
513
+ }
514
+ /**
515
+ * Set auth configuration
516
+ */
517
+ setAuth(config) {
518
+ this.config.auth = deepMerge(this.config.auth, config);
519
+ return this;
520
+ }
521
+ /**
522
+ * Set logging configuration
523
+ */
524
+ setLogging(config) {
525
+ this.config.logging = deepMerge(this.config.logging, config);
526
+ return this;
527
+ }
528
+ /**
529
+ * Set CORS origins
530
+ */
531
+ setCorsOrigins(config) {
532
+ this.config.cors = deepMerge(this.config.cors, config);
533
+ return this;
534
+ }
535
+ /**
536
+ * Add CORS production origin
537
+ */
538
+ addProductionOrigin(origin) {
539
+ if (!this.config.cors.production.includes(origin)) {
540
+ this.config.cors.production.push(origin);
541
+ }
542
+ return this;
543
+ }
544
+ /**
545
+ * Add CORS development origin
546
+ */
547
+ addDevelopmentOrigin(origin) {
548
+ if (!this.config.cors.development.includes(origin)) {
549
+ this.config.cors.development.push(origin);
550
+ }
551
+ return this;
552
+ }
553
+ /**
554
+ * Add CORS pattern
555
+ */
556
+ addCorsPattern(pattern) {
557
+ if (!this.config.cors.patterns.includes(pattern)) {
558
+ this.config.cors.patterns.push(pattern);
559
+ }
560
+ return this;
561
+ }
562
+ /**
563
+ * Set rate limit configuration
564
+ */
565
+ setRateLimit(config) {
566
+ this.config.rateLimit = deepMerge(this.config.rateLimit, config);
567
+ return this;
568
+ }
569
+ /**
570
+ * Add custom rate limit tier
571
+ */
572
+ addRateLimitTier(name, tier) {
573
+ if (!this.config.rateLimit.custom) {
574
+ this.config.rateLimit.custom = {};
575
+ }
576
+ this.config.rateLimit.custom[name] = tier;
577
+ return this;
578
+ }
579
+ /**
580
+ * Set custom configuration
581
+ */
582
+ setCustom(key, value) {
583
+ if (!this.config.custom) {
584
+ this.config.custom = {};
585
+ }
586
+ this.config.custom[key] = value;
587
+ return this;
588
+ }
589
+ /**
590
+ * Load configuration from environment variables
591
+ */
592
+ loadFromEnv() {
593
+ if (process.env.SERVER_NAME) this.config.server.name = process.env.SERVER_NAME;
594
+ if (process.env.SERVER_VERSION) this.config.server.version = process.env.SERVER_VERSION;
595
+ if (process.env.PORT) this.config.server.port = parseInt(process.env.PORT, 10);
596
+ if (process.env.HOST) this.config.server.host = process.env.HOST;
597
+ if (process.env.BASE_PATH) this.config.server.basePath = process.env.BASE_PATH;
598
+ if (process.env.DATABASE_URL) this.config.database.uri = process.env.DATABASE_URL;
599
+ if (process.env.MONGODB_URI) this.config.database.uri = process.env.MONGODB_URI;
600
+ if (process.env.DATABASE_NAME) this.config.database.name = process.env.DATABASE_NAME;
601
+ if (process.env.JWT_SECRET) this.config.auth.jwtSecret = process.env.JWT_SECRET;
602
+ if (process.env.JWT_EXPIRES_IN) this.config.auth.jwtExpiresIn = process.env.JWT_EXPIRES_IN;
603
+ if (process.env.LOG_LEVEL) this.config.logging.level = process.env.LOG_LEVEL;
604
+ if (process.env.LOGS_DIR) this.config.logging.logsDir = process.env.LOGS_DIR;
605
+ if (process.env.CORS_ORIGINS) {
606
+ const origins = process.env.CORS_ORIGINS.split(",").map((o) => o.trim());
607
+ this.config.cors.production.push(...origins);
608
+ }
609
+ return this;
610
+ }
611
+ /**
612
+ * Validate configuration
613
+ */
614
+ validate() {
615
+ const errors = [];
616
+ if (!this.config.server.name) errors.push("Server name is required");
617
+ if (this.config.server.port < 1 || this.config.server.port > 65535) {
618
+ errors.push("Server port must be between 1 and 65535");
619
+ }
620
+ if (this.config.server.environment === "production") {
621
+ if (!this.config.auth.jwtSecret || this.config.auth.jwtSecret.length < 32) {
622
+ errors.push("JWT secret must be at least 32 characters in production");
623
+ }
624
+ }
625
+ return { valid: errors.length === 0, errors };
626
+ }
627
+ /**
628
+ * Build the final configuration
629
+ */
630
+ build() {
631
+ return { ...this.config };
632
+ }
633
+ };
634
+ var createConfig = () => {
635
+ return new ConfigBuilder();
636
+ };
637
+ var buildConfig = (partial = {}) => {
638
+ const builder = createConfig().loadFromEnv();
639
+ if (partial.server) builder.setServer(partial.server);
640
+ if (partial.database) builder.setDatabase(partial.database);
641
+ if (partial.auth) builder.setAuth(partial.auth);
642
+ if (partial.logging) builder.setLogging(partial.logging);
643
+ if (partial.cors) builder.setCorsOrigins(partial.cors);
644
+ if (partial.rateLimit) builder.setRateLimit(partial.rateLimit);
645
+ return builder.build();
646
+ };
647
+ var isProduction = (config) => {
648
+ return (config?.environment || process.env.NODE_ENV) === "production";
649
+ };
650
+ var isDevelopment = (config) => {
651
+ return (config?.environment || process.env.NODE_ENV) === "development";
652
+ };
653
+ var isTest = (config) => {
654
+ return (config?.environment || process.env.NODE_ENV) === "test";
655
+ };
656
+ var getDatabaseOptions = (config) => {
657
+ return {
658
+ maxPoolSize: config.maxPoolSize,
659
+ minPoolSize: config.minPoolSize,
660
+ socketTimeoutMS: config.socketTimeoutMS,
661
+ serverSelectionTimeoutMS: config.serverSelectionTimeoutMS,
662
+ maxIdleTimeMS: config.maxIdleTimeMS,
663
+ retryWrites: config.retryWrites,
664
+ retryReads: config.retryReads,
665
+ w: config.writeConcern
666
+ };
667
+ };
668
+
669
+ exports.ConfigBuilder = ConfigBuilder;
670
+ exports.DEFAULT_AUTH_CONFIG = DEFAULT_AUTH_CONFIG;
671
+ exports.DEFAULT_CORS_CONFIG = DEFAULT_CORS_CONFIG;
672
+ exports.DEFAULT_CORS_ORIGINS = DEFAULT_CORS_ORIGINS;
673
+ exports.DEFAULT_DATABASE_CONFIG = DEFAULT_DATABASE_CONFIG;
674
+ exports.DEFAULT_LOGGING_CONFIG = DEFAULT_LOGGING_CONFIG;
675
+ exports.DEFAULT_RATE_LIMIT_CONFIG = DEFAULT_RATE_LIMIT_CONFIG;
676
+ exports.DEFAULT_RATE_LIMIT_TIERS = DEFAULT_RATE_LIMIT_TIERS;
677
+ exports.DEFAULT_SERVER_CONFIG = DEFAULT_SERVER_CONFIG;
678
+ exports.EXYCONN_CORS_CONFIG = EXYCONN_CORS_CONFIG;
679
+ exports.PERMISSIVE_CORS_CONFIG = PERMISSIVE_CORS_CONFIG;
680
+ exports.RATE_LIMIT_CONFIG = RATE_LIMIT_CONFIG;
681
+ exports.RateLimiterBuilder = RateLimiterBuilder;
682
+ exports.STRICT_CORS_CONFIG = STRICT_CORS_CONFIG;
683
+ exports.buildConfig = buildConfig;
684
+ exports.corsOptions = corsOptions;
685
+ exports.createApiKeyGenerator = createApiKeyGenerator;
686
+ exports.createApiRateLimiter = createApiRateLimiter;
687
+ exports.createBrandCorsOptions = createBrandCorsOptions;
688
+ exports.createConfig = createConfig;
689
+ exports.createCorsOptions = createCorsOptions;
690
+ exports.createDdosRateLimiter = createDdosRateLimiter;
691
+ exports.createMultiBrandCorsOptions = createMultiBrandCorsOptions;
692
+ exports.createPrefixedKeyGenerator = createPrefixedKeyGenerator;
693
+ exports.createRateLimiter = createRateLimiter;
694
+ exports.createStandardRateLimiter = createStandardRateLimiter;
695
+ exports.createStrictRateLimiter = createStrictRateLimiter;
696
+ exports.createUserKeyGenerator = createUserKeyGenerator;
697
+ exports.ddosProtectionLimiter = ddosProtectionLimiter;
698
+ exports.defaultKeyGenerator = defaultKeyGenerator;
699
+ exports.getDatabaseOptions = getDatabaseOptions;
700
+ exports.isDevelopment = isDevelopment;
701
+ exports.isProduction = isProduction;
702
+ exports.isTest = isTest;
703
+ exports.rateLimiter = rateLimiter;
704
+ exports.standardRateLimiter = standardRateLimiter;
705
+ exports.strictRateLimiter = strictRateLimiter;
706
+ //# sourceMappingURL=index.js.map
707
+ //# sourceMappingURL=index.js.map