@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
@@ -6,6 +6,7 @@ var path = require('path');
6
6
  var mongoose = require('mongoose');
7
7
  var jwt = require('jsonwebtoken');
8
8
  var fs = require('fs');
9
+ var rateLimit = require('express-rate-limit');
9
10
 
10
11
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
12
 
@@ -14,6 +15,7 @@ var DailyRotateFile__default = /*#__PURE__*/_interopDefault(DailyRotateFile);
14
15
  var path__default = /*#__PURE__*/_interopDefault(path);
15
16
  var mongoose__default = /*#__PURE__*/_interopDefault(mongoose);
16
17
  var jwt__default = /*#__PURE__*/_interopDefault(jwt);
18
+ var rateLimit__default = /*#__PURE__*/_interopDefault(rateLimit);
17
19
 
18
20
  // src/server/enums/status.ts
19
21
  var StatusCode = /* @__PURE__ */ ((StatusCode2) => {
@@ -720,20 +722,710 @@ var packageCheckServer = {
720
722
  print: printPackageCheckSummary
721
723
  };
722
724
 
725
+ // src/server/configs/cors.config.ts
726
+ var DEFAULT_CORS_CONFIG = {
727
+ productionOrigins: [],
728
+ developmentOrigins: [
729
+ "http://localhost:3000",
730
+ "http://localhost:4000",
731
+ "http://localhost:5000",
732
+ "http://localhost:5173",
733
+ "http://localhost:8080",
734
+ "http://127.0.0.1:3000",
735
+ "http://127.0.0.1:4000",
736
+ "http://127.0.0.1:5000",
737
+ "http://127.0.0.1:5173",
738
+ "http://127.0.0.1:8080"
739
+ ],
740
+ allowedSubdomains: [],
741
+ originPatterns: [],
742
+ allowNoOrigin: true,
743
+ allowAllInDev: true,
744
+ credentials: true,
745
+ methods: ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS", "HEAD"],
746
+ allowedHeaders: [
747
+ "Content-Type",
748
+ "Authorization",
749
+ "X-Requested-With",
750
+ "Accept",
751
+ "Origin",
752
+ "X-API-Key",
753
+ "X-Organization-Id",
754
+ "X-Request-Id"
755
+ ],
756
+ exposedHeaders: [
757
+ "Content-Range",
758
+ "X-Content-Range",
759
+ "X-Total-Count",
760
+ "X-Request-Id"
761
+ ],
762
+ maxAge: 86400
763
+ // 24 hours
764
+ };
765
+ var createCorsOptions = (config = {}) => {
766
+ const finalConfig = { ...DEFAULT_CORS_CONFIG, ...config };
767
+ const {
768
+ productionOrigins,
769
+ developmentOrigins,
770
+ allowedSubdomains,
771
+ originPatterns,
772
+ allowNoOrigin,
773
+ allowAllInDev,
774
+ customValidator,
775
+ credentials,
776
+ methods,
777
+ allowedHeaders,
778
+ exposedHeaders,
779
+ maxAge
780
+ } = finalConfig;
781
+ const allOrigins = /* @__PURE__ */ new Set([...productionOrigins, ...developmentOrigins]);
782
+ const originHandler = (origin, callback) => {
783
+ if (!origin) {
784
+ callback(null, allowNoOrigin);
785
+ return;
786
+ }
787
+ if (allOrigins.has(origin)) {
788
+ callback(null, true);
789
+ return;
790
+ }
791
+ if (allowedSubdomains.some((subdomain) => origin.endsWith(subdomain))) {
792
+ callback(null, true);
793
+ return;
794
+ }
795
+ if (originPatterns.some((pattern) => pattern.test(origin))) {
796
+ callback(null, true);
797
+ return;
798
+ }
799
+ if (customValidator && customValidator(origin)) {
800
+ callback(null, true);
801
+ return;
802
+ }
803
+ if (process.env.NODE_ENV !== "production" && allowAllInDev) {
804
+ callback(null, true);
805
+ return;
806
+ }
807
+ if (process.env.NODE_ENV === "production") {
808
+ callback(new Error(`Origin ${origin} not allowed by CORS`));
809
+ return;
810
+ }
811
+ callback(null, true);
812
+ };
813
+ return {
814
+ origin: originHandler,
815
+ credentials,
816
+ methods,
817
+ allowedHeaders,
818
+ exposedHeaders,
819
+ maxAge
820
+ };
821
+ };
822
+ var createBrandCorsOptions = (brandDomain, additionalConfig = {}) => {
823
+ const productionOrigins = [
824
+ `https://${brandDomain}`,
825
+ `https://www.${brandDomain}`
826
+ ];
827
+ const allowedSubdomains = [`.${brandDomain}`];
828
+ return createCorsOptions({
829
+ productionOrigins,
830
+ allowedSubdomains,
831
+ ...additionalConfig
832
+ });
833
+ };
834
+ var createMultiBrandCorsOptions = (domains, additionalConfig = {}) => {
835
+ const productionOrigins = domains.flatMap((domain) => [
836
+ `https://${domain}`,
837
+ `https://www.${domain}`
838
+ ]);
839
+ const allowedSubdomains = domains.map((domain) => `.${domain}`);
840
+ return createCorsOptions({
841
+ productionOrigins,
842
+ allowedSubdomains,
843
+ ...additionalConfig
844
+ });
845
+ };
846
+ var EXYCONN_CORS_CONFIG = {
847
+ productionOrigins: [
848
+ "https://exyconn.com",
849
+ "https://www.exyconn.com",
850
+ "https://botify.life",
851
+ "https://www.botify.life",
852
+ "https://partywings.fun",
853
+ "https://www.partywings.fun",
854
+ "https://sibera.work",
855
+ "https://www.sibera.work",
856
+ "https://spentiva.com",
857
+ "https://www.spentiva.com"
858
+ ],
859
+ allowedSubdomains: [
860
+ ".exyconn.com",
861
+ ".botify.life",
862
+ ".partywings.fun",
863
+ ".sibera.work",
864
+ ".spentiva.com"
865
+ ],
866
+ developmentOrigins: [
867
+ "http://localhost:3000",
868
+ "http://localhost:4000",
869
+ "http://localhost:4001",
870
+ "http://localhost:4002",
871
+ "http://localhost:4003",
872
+ "http://localhost:4004",
873
+ "http://localhost:4005",
874
+ "http://localhost:5173",
875
+ "http://127.0.0.1:3000",
876
+ "http://127.0.0.1:4000",
877
+ "http://127.0.0.1:5173"
878
+ ]
879
+ };
880
+ var STRICT_CORS_CONFIG = {
881
+ allowNoOrigin: false,
882
+ allowAllInDev: false,
883
+ methods: ["GET", "POST", "PUT", "DELETE"]
884
+ };
885
+ var PERMISSIVE_CORS_CONFIG = {
886
+ allowNoOrigin: true,
887
+ allowAllInDev: true,
888
+ originPatterns: [/localhost/, /127\.0\.0\.1/]
889
+ };
890
+ var corsOptions = createCorsOptions(EXYCONN_CORS_CONFIG);
891
+ var DEFAULT_RATE_LIMIT_TIERS = {
892
+ STANDARD: {
893
+ windowMs: 15 * 60 * 1e3,
894
+ // 15 minutes
895
+ maxRequests: 100,
896
+ message: "Too many requests, please try again later.",
897
+ skipSuccessfulRequests: false,
898
+ skipFailedRequests: false
899
+ },
900
+ STRICT: {
901
+ windowMs: 15 * 60 * 1e3,
902
+ // 15 minutes
903
+ maxRequests: 20,
904
+ message: "Too many requests, please try again later.",
905
+ skipSuccessfulRequests: false,
906
+ skipFailedRequests: false
907
+ },
908
+ DDOS: {
909
+ windowMs: 60 * 1e3,
910
+ // 1 minute
911
+ maxRequests: 60,
912
+ message: "Rate limit exceeded. Please slow down.",
913
+ skipSuccessfulRequests: false,
914
+ skipFailedRequests: false
915
+ },
916
+ // Additional presets
917
+ VERY_STRICT: {
918
+ windowMs: 60 * 60 * 1e3,
919
+ // 1 hour
920
+ maxRequests: 5,
921
+ message: "Too many attempts. Please try again in an hour.",
922
+ skipSuccessfulRequests: false,
923
+ skipFailedRequests: false
924
+ },
925
+ RELAXED: {
926
+ windowMs: 15 * 60 * 1e3,
927
+ // 15 minutes
928
+ maxRequests: 500,
929
+ message: "Rate limit exceeded.",
930
+ skipSuccessfulRequests: false,
931
+ skipFailedRequests: false
932
+ },
933
+ API: {
934
+ windowMs: 60 * 1e3,
935
+ // 1 minute
936
+ maxRequests: 30,
937
+ message: "API rate limit exceeded.",
938
+ skipSuccessfulRequests: false,
939
+ skipFailedRequests: false
940
+ }
941
+ };
942
+ var defaultKeyGenerator = (req) => {
943
+ const forwarded = req.headers["x-forwarded-for"];
944
+ const ip = forwarded ? Array.isArray(forwarded) ? forwarded[0] : forwarded.split(",")[0].trim() : req.ip || req.socket.remoteAddress || "unknown";
945
+ return ip;
946
+ };
947
+ var createPrefixedKeyGenerator = (prefix) => (req) => {
948
+ return `${prefix}:${defaultKeyGenerator(req)}`;
949
+ };
950
+ var createUserKeyGenerator = (getUserId) => (req) => {
951
+ const userId = getUserId(req);
952
+ return userId || defaultKeyGenerator(req);
953
+ };
954
+ var createApiKeyGenerator = (headerName = "x-api-key") => (req) => {
955
+ const apiKey = req.headers[headerName.toLowerCase()];
956
+ return apiKey || defaultKeyGenerator(req);
957
+ };
958
+ var createRateLimitResponse = (message, retryAfter) => ({
959
+ status: "error",
960
+ statusCode: 429,
961
+ message,
962
+ ...retryAfter
963
+ });
964
+ var createRateLimiter = (tierConfig, options = {}) => {
965
+ const {
966
+ standardHeaders = true,
967
+ legacyHeaders = false,
968
+ keyGenerator = defaultKeyGenerator,
969
+ skip,
970
+ handler
971
+ } = options;
972
+ return rateLimit__default.default({
973
+ windowMs: tierConfig.windowMs,
974
+ max: tierConfig.maxRequests,
975
+ message: createRateLimitResponse(tierConfig.message),
976
+ standardHeaders,
977
+ legacyHeaders,
978
+ keyGenerator,
979
+ skip,
980
+ handler,
981
+ skipSuccessfulRequests: tierConfig.skipSuccessfulRequests,
982
+ skipFailedRequests: tierConfig.skipFailedRequests
983
+ });
984
+ };
985
+ var createStandardRateLimiter = (config = {}, options = {}) => {
986
+ const tierConfig = { ...DEFAULT_RATE_LIMIT_TIERS.STANDARD, ...config };
987
+ return createRateLimiter(tierConfig, options);
988
+ };
989
+ var createStrictRateLimiter = (config = {}, options = {}) => {
990
+ const tierConfig = { ...DEFAULT_RATE_LIMIT_TIERS.STRICT, ...config };
991
+ return createRateLimiter(tierConfig, options);
992
+ };
993
+ var createDdosRateLimiter = (config = {}, options = {}) => {
994
+ const tierConfig = { ...DEFAULT_RATE_LIMIT_TIERS.DDOS, ...config };
995
+ return createRateLimiter(tierConfig, options);
996
+ };
997
+ var createApiRateLimiter = (config = {}, options = {}) => {
998
+ const tierConfig = { ...DEFAULT_RATE_LIMIT_TIERS.API, ...config };
999
+ return createRateLimiter(tierConfig, {
1000
+ keyGenerator: createApiKeyGenerator(),
1001
+ ...options
1002
+ });
1003
+ };
1004
+ var RateLimiterBuilder = class {
1005
+ constructor(preset = "STANDARD") {
1006
+ const presetConfig = DEFAULT_RATE_LIMIT_TIERS[preset];
1007
+ this.config = {
1008
+ windowMs: presetConfig.windowMs,
1009
+ maxRequests: presetConfig.maxRequests,
1010
+ message: presetConfig.message,
1011
+ skipSuccessfulRequests: presetConfig.skipSuccessfulRequests ?? false,
1012
+ skipFailedRequests: presetConfig.skipFailedRequests ?? false
1013
+ };
1014
+ this.options = {};
1015
+ }
1016
+ /**
1017
+ * Set window duration
1018
+ */
1019
+ windowMs(ms) {
1020
+ this.config.windowMs = ms;
1021
+ return this;
1022
+ }
1023
+ /**
1024
+ * Set window duration in minutes
1025
+ */
1026
+ windowMinutes(minutes) {
1027
+ this.config.windowMs = minutes * 60 * 1e3;
1028
+ return this;
1029
+ }
1030
+ /**
1031
+ * Set window duration in hours
1032
+ */
1033
+ windowHours(hours) {
1034
+ this.config.windowMs = hours * 60 * 60 * 1e3;
1035
+ return this;
1036
+ }
1037
+ /**
1038
+ * Set maximum requests
1039
+ */
1040
+ max(requests) {
1041
+ this.config.maxRequests = requests;
1042
+ return this;
1043
+ }
1044
+ /**
1045
+ * Set error message
1046
+ */
1047
+ message(msg) {
1048
+ this.config.message = msg;
1049
+ return this;
1050
+ }
1051
+ /**
1052
+ * Skip successful requests
1053
+ */
1054
+ skipSuccessful(skip = true) {
1055
+ this.config.skipSuccessfulRequests = skip;
1056
+ return this;
1057
+ }
1058
+ /**
1059
+ * Skip failed requests
1060
+ */
1061
+ skipFailed(skip = true) {
1062
+ this.config.skipFailedRequests = skip;
1063
+ return this;
1064
+ }
1065
+ /**
1066
+ * Set key generator
1067
+ */
1068
+ keyBy(generator) {
1069
+ this.options.keyGenerator = generator;
1070
+ return this;
1071
+ }
1072
+ /**
1073
+ * Key by IP (default)
1074
+ */
1075
+ keyByIp() {
1076
+ this.options.keyGenerator = defaultKeyGenerator;
1077
+ return this;
1078
+ }
1079
+ /**
1080
+ * Key by API key
1081
+ */
1082
+ keyByApiKey(headerName) {
1083
+ this.options.keyGenerator = createApiKeyGenerator(headerName);
1084
+ return this;
1085
+ }
1086
+ /**
1087
+ * Skip certain requests
1088
+ */
1089
+ skipWhen(predicate) {
1090
+ this.options.skip = predicate;
1091
+ return this;
1092
+ }
1093
+ /**
1094
+ * Build the rate limiter
1095
+ */
1096
+ build() {
1097
+ return createRateLimiter(this.config, this.options);
1098
+ }
1099
+ };
1100
+ var rateLimiter = (preset) => {
1101
+ return new RateLimiterBuilder(preset);
1102
+ };
1103
+ var RATE_LIMIT_CONFIG = {
1104
+ STANDARD: DEFAULT_RATE_LIMIT_TIERS.STANDARD,
1105
+ STRICT: DEFAULT_RATE_LIMIT_TIERS.STRICT,
1106
+ DDOS: DEFAULT_RATE_LIMIT_TIERS.DDOS
1107
+ };
1108
+ var standardRateLimiter = createStandardRateLimiter();
1109
+ var strictRateLimiter = createStrictRateLimiter();
1110
+ var ddosProtectionLimiter = createDdosRateLimiter();
1111
+
1112
+ // src/server/configs/server.config.ts
1113
+ var DEFAULT_SERVER_CONFIG = {
1114
+ name: "app-server",
1115
+ version: "1.0.0",
1116
+ environment: process.env.NODE_ENV || "development",
1117
+ port: parseInt(process.env.PORT || "3000", 10),
1118
+ host: process.env.HOST || "0.0.0.0",
1119
+ basePath: "/api",
1120
+ debug: process.env.DEBUG === "true",
1121
+ trustProxy: true
1122
+ };
1123
+ var DEFAULT_DATABASE_CONFIG = {
1124
+ uri: process.env.DATABASE_URL || process.env.MONGODB_URI || "",
1125
+ name: process.env.DATABASE_NAME || "app_db",
1126
+ maxPoolSize: process.env.NODE_ENV === "production" ? 50 : 10,
1127
+ minPoolSize: process.env.NODE_ENV === "production" ? 10 : 5,
1128
+ socketTimeoutMS: 45e3,
1129
+ serverSelectionTimeoutMS: 1e4,
1130
+ maxIdleTimeMS: 1e4,
1131
+ retryWrites: true,
1132
+ retryReads: true,
1133
+ writeConcern: "majority"
1134
+ };
1135
+ var DEFAULT_AUTH_CONFIG = {
1136
+ jwtSecret: process.env.JWT_SECRET || "",
1137
+ jwtExpiresIn: process.env.JWT_EXPIRES_IN || "7d",
1138
+ refreshTokenExpiresIn: process.env.REFRESH_TOKEN_EXPIRES_IN || "30d",
1139
+ enableRefreshTokens: true,
1140
+ apiKeyHeader: "x-api-key",
1141
+ orgHeader: "x-organization-id"
1142
+ };
1143
+ var DEFAULT_LOGGING_CONFIG = {
1144
+ level: process.env.LOG_LEVEL || "info",
1145
+ logsDir: process.env.LOGS_DIR || "logs",
1146
+ maxSize: "20m",
1147
+ maxFiles: "14d",
1148
+ errorMaxFiles: "30d",
1149
+ console: true,
1150
+ file: process.env.NODE_ENV === "production",
1151
+ json: process.env.NODE_ENV === "production"
1152
+ };
1153
+ var DEFAULT_CORS_ORIGINS = {
1154
+ production: [],
1155
+ development: [
1156
+ "http://localhost:3000",
1157
+ "http://localhost:4000",
1158
+ "http://localhost:5173",
1159
+ "http://127.0.0.1:3000",
1160
+ "http://127.0.0.1:4000",
1161
+ "http://127.0.0.1:5173"
1162
+ ],
1163
+ patterns: []
1164
+ };
1165
+ var DEFAULT_RATE_LIMIT_CONFIG = {
1166
+ enabled: true,
1167
+ standard: {
1168
+ windowMs: 15 * 60 * 1e3,
1169
+ // 15 minutes
1170
+ maxRequests: 100,
1171
+ message: "Too many requests, please try again later."
1172
+ },
1173
+ strict: {
1174
+ windowMs: 15 * 60 * 1e3,
1175
+ // 15 minutes
1176
+ maxRequests: 20,
1177
+ message: "Too many requests, please try again later."
1178
+ },
1179
+ ddos: {
1180
+ windowMs: 60 * 1e3,
1181
+ // 1 minute
1182
+ maxRequests: 60,
1183
+ message: "Rate limit exceeded. Please slow down.",
1184
+ skipSuccessfulRequests: false
1185
+ }
1186
+ };
1187
+ function deepMerge(target, source) {
1188
+ const result = { ...target };
1189
+ for (const key in source) {
1190
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
1191
+ const sourceValue = source[key];
1192
+ const targetValue = target[key];
1193
+ if (sourceValue !== void 0 && typeof sourceValue === "object" && sourceValue !== null && !Array.isArray(sourceValue) && typeof targetValue === "object" && targetValue !== null && !Array.isArray(targetValue)) {
1194
+ result[key] = deepMerge(
1195
+ targetValue,
1196
+ sourceValue
1197
+ );
1198
+ } else if (sourceValue !== void 0) {
1199
+ result[key] = sourceValue;
1200
+ }
1201
+ }
1202
+ }
1203
+ return result;
1204
+ }
1205
+ var ConfigBuilder = class {
1206
+ constructor() {
1207
+ this.config = {
1208
+ server: { ...DEFAULT_SERVER_CONFIG },
1209
+ database: { ...DEFAULT_DATABASE_CONFIG },
1210
+ auth: { ...DEFAULT_AUTH_CONFIG },
1211
+ logging: { ...DEFAULT_LOGGING_CONFIG },
1212
+ cors: { ...DEFAULT_CORS_ORIGINS },
1213
+ rateLimit: { ...DEFAULT_RATE_LIMIT_CONFIG }
1214
+ };
1215
+ }
1216
+ /**
1217
+ * Set server configuration
1218
+ */
1219
+ setServer(config) {
1220
+ this.config.server = deepMerge(this.config.server, config);
1221
+ return this;
1222
+ }
1223
+ /**
1224
+ * Set database configuration
1225
+ */
1226
+ setDatabase(config) {
1227
+ this.config.database = deepMerge(this.config.database, config);
1228
+ return this;
1229
+ }
1230
+ /**
1231
+ * Set auth configuration
1232
+ */
1233
+ setAuth(config) {
1234
+ this.config.auth = deepMerge(this.config.auth, config);
1235
+ return this;
1236
+ }
1237
+ /**
1238
+ * Set logging configuration
1239
+ */
1240
+ setLogging(config) {
1241
+ this.config.logging = deepMerge(this.config.logging, config);
1242
+ return this;
1243
+ }
1244
+ /**
1245
+ * Set CORS origins
1246
+ */
1247
+ setCorsOrigins(config) {
1248
+ this.config.cors = deepMerge(this.config.cors, config);
1249
+ return this;
1250
+ }
1251
+ /**
1252
+ * Add CORS production origin
1253
+ */
1254
+ addProductionOrigin(origin) {
1255
+ if (!this.config.cors.production.includes(origin)) {
1256
+ this.config.cors.production.push(origin);
1257
+ }
1258
+ return this;
1259
+ }
1260
+ /**
1261
+ * Add CORS development origin
1262
+ */
1263
+ addDevelopmentOrigin(origin) {
1264
+ if (!this.config.cors.development.includes(origin)) {
1265
+ this.config.cors.development.push(origin);
1266
+ }
1267
+ return this;
1268
+ }
1269
+ /**
1270
+ * Add CORS pattern
1271
+ */
1272
+ addCorsPattern(pattern) {
1273
+ if (!this.config.cors.patterns.includes(pattern)) {
1274
+ this.config.cors.patterns.push(pattern);
1275
+ }
1276
+ return this;
1277
+ }
1278
+ /**
1279
+ * Set rate limit configuration
1280
+ */
1281
+ setRateLimit(config) {
1282
+ this.config.rateLimit = deepMerge(this.config.rateLimit, config);
1283
+ return this;
1284
+ }
1285
+ /**
1286
+ * Add custom rate limit tier
1287
+ */
1288
+ addRateLimitTier(name, tier) {
1289
+ if (!this.config.rateLimit.custom) {
1290
+ this.config.rateLimit.custom = {};
1291
+ }
1292
+ this.config.rateLimit.custom[name] = tier;
1293
+ return this;
1294
+ }
1295
+ /**
1296
+ * Set custom configuration
1297
+ */
1298
+ setCustom(key, value) {
1299
+ if (!this.config.custom) {
1300
+ this.config.custom = {};
1301
+ }
1302
+ this.config.custom[key] = value;
1303
+ return this;
1304
+ }
1305
+ /**
1306
+ * Load configuration from environment variables
1307
+ */
1308
+ loadFromEnv() {
1309
+ if (process.env.SERVER_NAME) this.config.server.name = process.env.SERVER_NAME;
1310
+ if (process.env.SERVER_VERSION) this.config.server.version = process.env.SERVER_VERSION;
1311
+ if (process.env.PORT) this.config.server.port = parseInt(process.env.PORT, 10);
1312
+ if (process.env.HOST) this.config.server.host = process.env.HOST;
1313
+ if (process.env.BASE_PATH) this.config.server.basePath = process.env.BASE_PATH;
1314
+ if (process.env.DATABASE_URL) this.config.database.uri = process.env.DATABASE_URL;
1315
+ if (process.env.MONGODB_URI) this.config.database.uri = process.env.MONGODB_URI;
1316
+ if (process.env.DATABASE_NAME) this.config.database.name = process.env.DATABASE_NAME;
1317
+ if (process.env.JWT_SECRET) this.config.auth.jwtSecret = process.env.JWT_SECRET;
1318
+ if (process.env.JWT_EXPIRES_IN) this.config.auth.jwtExpiresIn = process.env.JWT_EXPIRES_IN;
1319
+ if (process.env.LOG_LEVEL) this.config.logging.level = process.env.LOG_LEVEL;
1320
+ if (process.env.LOGS_DIR) this.config.logging.logsDir = process.env.LOGS_DIR;
1321
+ if (process.env.CORS_ORIGINS) {
1322
+ const origins = process.env.CORS_ORIGINS.split(",").map((o) => o.trim());
1323
+ this.config.cors.production.push(...origins);
1324
+ }
1325
+ return this;
1326
+ }
1327
+ /**
1328
+ * Validate configuration
1329
+ */
1330
+ validate() {
1331
+ const errors = [];
1332
+ if (!this.config.server.name) errors.push("Server name is required");
1333
+ if (this.config.server.port < 1 || this.config.server.port > 65535) {
1334
+ errors.push("Server port must be between 1 and 65535");
1335
+ }
1336
+ if (this.config.server.environment === "production") {
1337
+ if (!this.config.auth.jwtSecret || this.config.auth.jwtSecret.length < 32) {
1338
+ errors.push("JWT secret must be at least 32 characters in production");
1339
+ }
1340
+ }
1341
+ return { valid: errors.length === 0, errors };
1342
+ }
1343
+ /**
1344
+ * Build the final configuration
1345
+ */
1346
+ build() {
1347
+ return { ...this.config };
1348
+ }
1349
+ };
1350
+ var createConfig = () => {
1351
+ return new ConfigBuilder();
1352
+ };
1353
+ var buildConfig = (partial = {}) => {
1354
+ const builder = createConfig().loadFromEnv();
1355
+ if (partial.server) builder.setServer(partial.server);
1356
+ if (partial.database) builder.setDatabase(partial.database);
1357
+ if (partial.auth) builder.setAuth(partial.auth);
1358
+ if (partial.logging) builder.setLogging(partial.logging);
1359
+ if (partial.cors) builder.setCorsOrigins(partial.cors);
1360
+ if (partial.rateLimit) builder.setRateLimit(partial.rateLimit);
1361
+ return builder.build();
1362
+ };
1363
+ var isProduction = (config) => {
1364
+ return (config?.environment || process.env.NODE_ENV) === "production";
1365
+ };
1366
+ var isDevelopment = (config) => {
1367
+ return (config?.environment || process.env.NODE_ENV) === "development";
1368
+ };
1369
+ var isTest = (config) => {
1370
+ return (config?.environment || process.env.NODE_ENV) === "test";
1371
+ };
1372
+ var getDatabaseOptions = (config) => {
1373
+ return {
1374
+ maxPoolSize: config.maxPoolSize,
1375
+ minPoolSize: config.minPoolSize,
1376
+ socketTimeoutMS: config.socketTimeoutMS,
1377
+ serverSelectionTimeoutMS: config.serverSelectionTimeoutMS,
1378
+ maxIdleTimeMS: config.maxIdleTimeMS,
1379
+ retryWrites: config.retryWrites,
1380
+ retryReads: config.retryReads,
1381
+ w: config.writeConcern
1382
+ };
1383
+ };
1384
+
1385
+ exports.ConfigBuilder = ConfigBuilder;
1386
+ exports.DEFAULT_AUTH_CONFIG = DEFAULT_AUTH_CONFIG;
1387
+ exports.DEFAULT_CORS_CONFIG = DEFAULT_CORS_CONFIG;
1388
+ exports.DEFAULT_CORS_ORIGINS = DEFAULT_CORS_ORIGINS;
1389
+ exports.DEFAULT_DATABASE_CONFIG = DEFAULT_DATABASE_CONFIG;
1390
+ exports.DEFAULT_LOGGING_CONFIG = DEFAULT_LOGGING_CONFIG;
1391
+ exports.DEFAULT_RATE_LIMIT_CONFIG = DEFAULT_RATE_LIMIT_CONFIG;
1392
+ exports.DEFAULT_RATE_LIMIT_TIERS = DEFAULT_RATE_LIMIT_TIERS;
1393
+ exports.DEFAULT_SERVER_CONFIG = DEFAULT_SERVER_CONFIG;
1394
+ exports.EXYCONN_CORS_CONFIG = EXYCONN_CORS_CONFIG;
1395
+ exports.PERMISSIVE_CORS_CONFIG = PERMISSIVE_CORS_CONFIG;
1396
+ exports.RATE_LIMIT_CONFIG = RATE_LIMIT_CONFIG;
1397
+ exports.RateLimiterBuilder = RateLimiterBuilder;
1398
+ exports.STRICT_CORS_CONFIG = STRICT_CORS_CONFIG;
723
1399
  exports.StatusCode = StatusCode;
724
1400
  exports.StatusMessage = StatusMessage;
725
1401
  exports.authenticateApiKey = authenticateApiKey;
726
1402
  exports.authenticateJWT = authenticateJWT;
727
1403
  exports.badRequestResponse = badRequestResponse;
1404
+ exports.buildConfig = buildConfig;
728
1405
  exports.buildFilter = buildFilter;
729
1406
  exports.buildPagination = buildPagination;
730
1407
  exports.buildPaginationMeta = buildPaginationMeta;
731
1408
  exports.checkPackageServer = checkPackageServer;
732
1409
  exports.conflictResponse = conflictResponse;
733
1410
  exports.connectDB = connectDB;
1411
+ exports.corsOptions = corsOptions;
1412
+ exports.createApiKeyGenerator = createApiKeyGenerator;
1413
+ exports.createApiRateLimiter = createApiRateLimiter;
1414
+ exports.createBrandCorsOptions = createBrandCorsOptions;
1415
+ exports.createConfig = createConfig;
1416
+ exports.createCorsOptions = createCorsOptions;
1417
+ exports.createDdosRateLimiter = createDdosRateLimiter;
734
1418
  exports.createLogger = createLogger;
735
1419
  exports.createMorganStream = createMorganStream;
1420
+ exports.createMultiBrandCorsOptions = createMultiBrandCorsOptions;
1421
+ exports.createPrefixedKeyGenerator = createPrefixedKeyGenerator;
1422
+ exports.createRateLimiter = createRateLimiter;
1423
+ exports.createStandardRateLimiter = createStandardRateLimiter;
1424
+ exports.createStrictRateLimiter = createStrictRateLimiter;
1425
+ exports.createUserKeyGenerator = createUserKeyGenerator;
736
1426
  exports.createdResponse = createdResponse;
1427
+ exports.ddosProtectionLimiter = ddosProtectionLimiter;
1428
+ exports.defaultKeyGenerator = defaultKeyGenerator;
737
1429
  exports.disconnectDB = disconnectDB;
738
1430
  exports.errorResponse = errorResponse;
739
1431
  exports.extractColumns = extractColumns;
@@ -742,6 +1434,10 @@ exports.forbiddenResponse = forbiddenResponse;
742
1434
  exports.formatPackageCheckResult = formatPackageCheckResult;
743
1435
  exports.generateNcuCommand = generateNcuCommand;
744
1436
  exports.getConnectionStatus = getConnectionStatus;
1437
+ exports.getDatabaseOptions = getDatabaseOptions;
1438
+ exports.isDevelopment = isDevelopment;
1439
+ exports.isProduction = isProduction;
1440
+ exports.isTest = isTest;
745
1441
  exports.logger = logger;
746
1442
  exports.noContentResponse = noContentResponse;
747
1443
  exports.notFoundResponse = notFoundResponse;
@@ -751,13 +1447,16 @@ exports.packageCheckServer = packageCheckServer;
751
1447
  exports.pickFields = pickFields;
752
1448
  exports.printPackageCheckSummary = printPackageCheckSummary;
753
1449
  exports.rateLimitResponse = rateLimitResponse;
1450
+ exports.rateLimiter = rateLimiter;
754
1451
  exports.requireOrganization = requireOrganization;
755
1452
  exports.sanitizeDocument = sanitizeDocument;
756
1453
  exports.sanitizeUser = sanitizeUser;
757
1454
  exports.simpleLogger = simpleLogger;
1455
+ exports.standardRateLimiter = standardRateLimiter;
758
1456
  exports.statusCode = statusCode;
759
1457
  exports.statusMessage = statusMessage;
760
1458
  exports.stream = stream;
1459
+ exports.strictRateLimiter = strictRateLimiter;
761
1460
  exports.successResponse = successResponse;
762
1461
  exports.successResponseArr = successResponseArr;
763
1462
  exports.unauthorizedResponse = unauthorizedResponse;