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