chargeback-guard 2.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 (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +311 -0
  3. package/docs/api.md +278 -0
  4. package/docs/architecture.md +281 -0
  5. package/docs/configuration.md +292 -0
  6. package/docs/getting-started.md +155 -0
  7. package/examples/advancedConfig.ts +123 -0
  8. package/examples/basicUsage.ts +98 -0
  9. package/examples/stripeIntegration.ts +106 -0
  10. package/package.json +181 -0
  11. package/src/ai/fraudDetection.ts +261 -0
  12. package/src/ai/patternRecognition.ts +218 -0
  13. package/src/analytics/dashboard.ts +195 -0
  14. package/src/analytics/metrics.ts +175 -0
  15. package/src/analytics/predictions.ts +135 -0
  16. package/src/analytics/reports.ts +221 -0
  17. package/src/api/controllers.ts +339 -0
  18. package/src/api/middleware.ts +172 -0
  19. package/src/api/routes.ts +141 -0
  20. package/src/config.ts +231 -0
  21. package/src/core/chargebackGuard.ts +616 -0
  22. package/src/core/eventEmitter.ts +118 -0
  23. package/src/core/lifecycle.ts +215 -0
  24. package/src/database/schema.ts +392 -0
  25. package/src/dispute/analyzer.ts +317 -0
  26. package/src/dispute/bankIntegration.ts +274 -0
  27. package/src/dispute/detector.ts +239 -0
  28. package/src/dispute/responseEngine.ts +440 -0
  29. package/src/evidence/collector.ts +426 -0
  30. package/src/evidence/encryption.ts +168 -0
  31. package/src/evidence/storage.ts +197 -0
  32. package/src/evidence/validator.ts +184 -0
  33. package/src/index.ts +43 -0
  34. package/src/integrations/paypal.ts +258 -0
  35. package/src/integrations/stripe.ts +280 -0
  36. package/src/integrations/webhook.ts +332 -0
  37. package/src/notifications/email.ts +161 -0
  38. package/src/notifications/inApp.ts +319 -0
  39. package/src/notifications/sms.ts +58 -0
  40. package/src/security/auth.ts +153 -0
  41. package/src/security/rateLimit.ts +77 -0
  42. package/src/security/validation.ts +166 -0
  43. package/src/server.ts +122 -0
  44. package/src/types/index.ts +790 -0
  45. package/src/utils/formatters.ts +72 -0
  46. package/src/utils/helpers.ts +193 -0
  47. package/src/utils/logger.ts +88 -0
  48. package/src/utils/validators.ts +39 -0
package/src/config.ts ADDED
@@ -0,0 +1,231 @@
1
+ // ============================================================
2
+ // CHARGEBACK GUARD — Central Configuration Module
3
+ // ============================================================
4
+
5
+ import dotenv from 'dotenv';
6
+ import { ChargebackGuardConfig, Environment, SubscriptionPlan } from './types';
7
+
8
+ dotenv.config();
9
+
10
+ // ────────────────────────────────────────────────────────────
11
+ // HELPERS
12
+ // ────────────────────────────────────────────────────────────
13
+
14
+ const getEnv = (key: string, fallback?: string): string => {
15
+ const value = process.env[key] ?? fallback;
16
+ if (value === undefined) {
17
+ throw new Error(`Missing required environment variable: ${key}`);
18
+ }
19
+ return value;
20
+ };
21
+
22
+ const getEnvOptional = (key: string, fallback?: string): string | undefined => {
23
+ return process.env[key] ?? fallback;
24
+ };
25
+
26
+ const getEnvInt = (key: string, fallback: number): number => {
27
+ const val = process.env[key];
28
+ return val !== undefined ? parseInt(val, 10) : fallback;
29
+ };
30
+
31
+ const getEnvFloat = (key: string, fallback: number): number => {
32
+ const val = process.env[key];
33
+ return val !== undefined ? parseFloat(val) : fallback;
34
+ };
35
+
36
+ const getEnvBool = (key: string, fallback: boolean): boolean => {
37
+ const val = process.env[key];
38
+ if (val === undefined) { return fallback; }
39
+ return val.toLowerCase() === 'true' || val === '1';
40
+ };
41
+
42
+ // ────────────────────────────────────────────────────────────
43
+ // APP CONFIG
44
+ // ────────────────────────────────────────────────────────────
45
+
46
+ export const appConfig = {
47
+ name: getEnv('APP_NAME', 'ChargebackGuard'),
48
+ version: getEnv('APP_VERSION', '2.0.0'),
49
+ env: (getEnv('NODE_ENV', 'development') as Environment),
50
+ port: getEnvInt('PORT', 3000),
51
+ url: getEnv('APP_URL', 'http://localhost:3000'),
52
+ logLevel: getEnv('LOG_LEVEL', 'info'),
53
+ isDev: process.env.NODE_ENV === 'development',
54
+ isProd: process.env.NODE_ENV === 'production',
55
+ };
56
+
57
+ // ────────────────────────────────────────────────────────────
58
+ // DATABASE CONFIG
59
+ // ────────────────────────────────────────────────────────────
60
+
61
+ export const dbConfig = {
62
+ type: getEnv('DATABASE_TYPE', 'sqlite') as 'sqlite' | 'postgresql' | 'mysql',
63
+ url: getEnv('DATABASE_URL', 'sqlite://./data/chargeback-guard.db'),
64
+ poolMin: getEnvInt('DATABASE_POOL_MIN', 2),
65
+ poolMax: getEnvInt('DATABASE_POOL_MAX', 10),
66
+ debug: getEnvBool('DATABASE_DEBUG', false),
67
+ };
68
+
69
+ // ────────────────────────────────────────────────────────────
70
+ // REDIS CONFIG
71
+ // ────────────────────────────────────────────────────────────
72
+
73
+ export const redisConfig = {
74
+ url: getEnv('REDIS_URL', 'redis://localhost:6379'),
75
+ password: getEnvOptional('REDIS_PASSWORD'),
76
+ db: getEnvInt('REDIS_DB', 0),
77
+ ttl: getEnvInt('CACHE_TTL', 3600),
78
+ };
79
+
80
+ // ────────────────────────────────────────────────────────────
81
+ // SECURITY CONFIG
82
+ // ────────────────────────────────────────────────────────────
83
+
84
+ export const securityConfig = {
85
+ jwtSecret: getEnv('JWT_SECRET', 'change-this-in-production'),
86
+ jwtExpiresIn: getEnv('JWT_EXPIRES_IN', '7d'),
87
+ encryptionKey: getEnv('ENCRYPTION_KEY', 'change-this-32-char-key-produc!!'),
88
+ apiKeyPrefix: getEnv('API_KEY_PREFIX', 'cbg_'),
89
+ bcryptRounds: getEnvInt('BCRYPT_ROUNDS', 12),
90
+ rateLimit: {
91
+ windowMs: getEnvInt('RATE_LIMIT_WINDOW_MS', 900000),
92
+ maxRequests: getEnvInt('RATE_LIMIT_MAX_REQUESTS', 100),
93
+ skipFailedRequests: getEnvBool('RATE_LIMIT_SKIP_FAILED_REQUESTS', false),
94
+ },
95
+ };
96
+
97
+ // ────────────────────────────────────────────────────────────
98
+ // STRIPE CONFIG
99
+ // ────────────────────────────────────────────────────────────
100
+
101
+ export const stripeConfig = {
102
+ secretKey: getEnv('STRIPE_SECRET_KEY', ''),
103
+ publishableKey: getEnvOptional('STRIPE_PUBLISHABLE_KEY'),
104
+ webhookSecret: getEnv('STRIPE_WEBHOOK_SECRET', ''),
105
+ apiVersion: getEnv('STRIPE_API_VERSION', '2023-10-16'),
106
+ };
107
+
108
+ // ────────────────────────────────────────────────────────────
109
+ // PAYPAL CONFIG
110
+ // ────────────────────────────────────────────────────────────
111
+
112
+ export const paypalConfig = {
113
+ clientId: getEnv('PAYPAL_CLIENT_ID', ''),
114
+ clientSecret: getEnv('PAYPAL_CLIENT_SECRET', ''),
115
+ mode: getEnv('PAYPAL_MODE', 'sandbox') as 'sandbox' | 'live',
116
+ webhookId: getEnvOptional('PAYPAL_WEBHOOK_ID'),
117
+ };
118
+
119
+ // ────────────────────────────────────────────────────────────
120
+ // EMAIL CONFIG
121
+ // ────────────────────────────────────────────────────────────
122
+
123
+ export const emailConfig = {
124
+ host: getEnv('SMTP_HOST', 'smtp.gmail.com'),
125
+ port: getEnvInt('SMTP_PORT', 587),
126
+ secure: getEnvBool('SMTP_SECURE', false),
127
+ user: getEnv('SMTP_USER', ''),
128
+ pass: getEnv('SMTP_PASS', ''),
129
+ fromName: getEnv('EMAIL_FROM_NAME', 'ChargebackGuard'),
130
+ fromAddress: getEnv('EMAIL_FROM_ADDRESS', 'noreply@chargebackguard.io'),
131
+ };
132
+
133
+ // ────────────────────────────────────────────────────────────
134
+ // SMS CONFIG
135
+ // ────────────────────────────────────────────────────────────
136
+
137
+ export const smsConfig = {
138
+ accountSid: getEnv('TWILIO_ACCOUNT_SID', ''),
139
+ authToken: getEnv('TWILIO_AUTH_TOKEN', ''),
140
+ phoneNumber: getEnv('TWILIO_PHONE_NUMBER', ''),
141
+ };
142
+
143
+ // ────────────────────────────────────────────────────────────
144
+ // AI CONFIG
145
+ // ────────────────────────────────────────────────────────────
146
+
147
+ export const aiConfig = {
148
+ openaiApiKey: getEnvOptional('OPENAI_API_KEY'),
149
+ modelPath: getEnv('ML_MODEL_PATH', './models'),
150
+ fraudThreshold: getEnvFloat('FRAUD_THRESHOLD', 0.75),
151
+ riskScoreHigh: getEnvFloat('RISK_SCORE_HIGH', 0.8),
152
+ riskScoreMedium: getEnvFloat('RISK_SCORE_MEDIUM', 0.5),
153
+ };
154
+
155
+ // ────────────────────────────────────────────────────────────
156
+ // FILE STORAGE CONFIG
157
+ // ────────────────────────────────────────────────────────────
158
+
159
+ export const storageConfig = {
160
+ uploadDir: getEnv('UPLOAD_DIR', './uploads'),
161
+ maxFileSize: getEnvInt('MAX_FILE_SIZE', 10485760),
162
+ allowedMimeTypes: getEnv(
163
+ 'ALLOWED_MIME_TYPES',
164
+ 'image/jpeg,image/png,application/pdf'
165
+ ).split(','),
166
+ };
167
+
168
+ // ────────────────────────────────────────────────────────────
169
+ // CORS CONFIG
170
+ // ────────────────────────────────────────────────────────────
171
+
172
+ export const corsConfig = {
173
+ origins: getEnv('CORS_ORIGINS', 'http://localhost:3000').split(','),
174
+ methods: getEnv('CORS_METHODS', 'GET,POST,PUT,PATCH,DELETE,OPTIONS').split(','),
175
+ };
176
+
177
+ // ────────────────────────────────────────────────────────────
178
+ // WEBHOOK CONFIG
179
+ // ────────────────────────────────────────────────────────────
180
+
181
+ export const webhookConfig = {
182
+ maxRetries: getEnvInt('WEBHOOK_MAX_RETRIES', 3),
183
+ retryDelay: getEnvInt('WEBHOOK_RETRY_DELAY', 5000),
184
+ timeout: getEnvInt('WEBHOOK_TIMEOUT', 30000),
185
+ };
186
+
187
+ // ────────────────────────────────────────────────────────────
188
+ // BILLING CONFIG
189
+ // ────────────────────────────────────────────────────────────
190
+
191
+ export const billingConfig = {
192
+ revenueSharePercentage: getEnvFloat('REVENUE_SHARE_PERCENTAGE', 1.0),
193
+ subscriptionProPrice: getEnvInt('SUBSCRIPTION_PRO_PRICE', 99),
194
+ subscriptionEnterprisePrice: getEnvInt('SUBSCRIPTION_ENTERPRISE_PRICE', 499),
195
+ };
196
+
197
+ // ────────────────────────────────────────────────────────────
198
+ // DEFAULT CHARGEBACKGUARD CONFIG
199
+ // ────────────────────────────────────────────────────────────
200
+
201
+ export const defaultConfig: Partial<ChargebackGuardConfig> = {
202
+ environment: appConfig.env,
203
+ autoReply: true,
204
+ evidenceCollection: true,
205
+ database: dbConfig,
206
+ redis: redisConfig,
207
+ security: securityConfig,
208
+ ai: aiConfig,
209
+ billing: {
210
+ plan: SubscriptionPlan.PRO,
211
+ revenueSharePercentage: billingConfig.revenueSharePercentage,
212
+ monthlyPrice: billingConfig.subscriptionProPrice,
213
+ },
214
+ };
215
+
216
+ export default {
217
+ app: appConfig,
218
+ db: dbConfig,
219
+ redis: redisConfig,
220
+ security: securityConfig,
221
+ stripe: stripeConfig,
222
+ paypal: paypalConfig,
223
+ email: emailConfig,
224
+ sms: smsConfig,
225
+ ai: aiConfig,
226
+ storage: storageConfig,
227
+ cors: corsConfig,
228
+ webhook: webhookConfig,
229
+ billing: billingConfig,
230
+ defaults: defaultConfig,
231
+ };