@classytic/revenue 0.2.4 → 1.0.1
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.
- package/README.md +498 -501
- package/dist/actions-CwG-b7fR.d.ts +519 -0
- package/dist/core/index.d.ts +884 -0
- package/dist/core/index.js +2941 -0
- package/dist/core/index.js.map +1 -0
- package/dist/enums/index.d.ts +130 -0
- package/dist/enums/index.js +167 -0
- package/dist/enums/index.js.map +1 -0
- package/dist/index-BnJWVXuw.d.ts +378 -0
- package/dist/index-ChVD3P9k.d.ts +504 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.js +4362 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/index.d.ts +132 -0
- package/dist/providers/index.js +122 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/retry-80lBCmSe.d.ts +234 -0
- package/dist/schemas/index.d.ts +906 -0
- package/dist/schemas/index.js +533 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/validation.d.ts +309 -0
- package/dist/schemas/validation.js +249 -0
- package/dist/schemas/validation.js.map +1 -0
- package/dist/services/index.d.ts +3 -0
- package/dist/services/index.js +1632 -0
- package/dist/services/index.js.map +1 -0
- package/dist/split.enums-DHdM1YAV.d.ts +255 -0
- package/dist/split.schema-CETjPq10.d.ts +976 -0
- package/dist/utils/index.d.ts +24 -0
- package/dist/utils/index.js +1067 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +48 -32
- package/core/builder.js +0 -219
- package/core/container.js +0 -119
- package/core/errors.js +0 -262
- package/dist/types/core/builder.d.ts +0 -97
- package/dist/types/core/container.d.ts +0 -57
- package/dist/types/core/errors.d.ts +0 -122
- package/dist/types/enums/escrow.enums.d.ts +0 -24
- package/dist/types/enums/index.d.ts +0 -69
- package/dist/types/enums/monetization.enums.d.ts +0 -6
- package/dist/types/enums/payment.enums.d.ts +0 -16
- package/dist/types/enums/split.enums.d.ts +0 -25
- package/dist/types/enums/subscription.enums.d.ts +0 -15
- package/dist/types/enums/transaction.enums.d.ts +0 -24
- package/dist/types/index.d.ts +0 -22
- package/dist/types/providers/base.d.ts +0 -128
- package/dist/types/schemas/escrow/hold.schema.d.ts +0 -54
- package/dist/types/schemas/escrow/index.d.ts +0 -6
- package/dist/types/schemas/index.d.ts +0 -506
- package/dist/types/schemas/split/index.d.ts +0 -8
- package/dist/types/schemas/split/split.schema.d.ts +0 -142
- package/dist/types/schemas/subscription/index.d.ts +0 -152
- package/dist/types/schemas/subscription/info.schema.d.ts +0 -128
- package/dist/types/schemas/subscription/plan.schema.d.ts +0 -39
- package/dist/types/schemas/transaction/common.schema.d.ts +0 -12
- package/dist/types/schemas/transaction/gateway.schema.d.ts +0 -86
- package/dist/types/schemas/transaction/index.d.ts +0 -202
- package/dist/types/schemas/transaction/payment.schema.d.ts +0 -145
- package/dist/types/services/escrow.service.d.ts +0 -51
- package/dist/types/services/monetization.service.d.ts +0 -193
- package/dist/types/services/payment.service.d.ts +0 -117
- package/dist/types/services/transaction.service.d.ts +0 -40
- package/dist/types/utils/category-resolver.d.ts +0 -46
- package/dist/types/utils/commission-split.d.ts +0 -56
- package/dist/types/utils/commission.d.ts +0 -29
- package/dist/types/utils/hooks.d.ts +0 -17
- package/dist/types/utils/index.d.ts +0 -6
- package/dist/types/utils/logger.d.ts +0 -12
- package/dist/types/utils/subscription/actions.d.ts +0 -28
- package/dist/types/utils/subscription/index.d.ts +0 -2
- package/dist/types/utils/subscription/period.d.ts +0 -47
- package/dist/types/utils/transaction-type.d.ts +0 -102
- package/enums/escrow.enums.js +0 -36
- package/enums/index.d.ts +0 -116
- package/enums/index.js +0 -110
- package/enums/monetization.enums.js +0 -15
- package/enums/payment.enums.js +0 -64
- package/enums/split.enums.js +0 -37
- package/enums/subscription.enums.js +0 -33
- package/enums/transaction.enums.js +0 -69
- package/index.js +0 -76
- package/providers/base.js +0 -162
- package/schemas/escrow/hold.schema.js +0 -62
- package/schemas/escrow/index.js +0 -15
- package/schemas/index.d.ts +0 -33
- package/schemas/index.js +0 -27
- package/schemas/split/index.js +0 -16
- package/schemas/split/split.schema.js +0 -86
- package/schemas/subscription/index.js +0 -17
- package/schemas/subscription/info.schema.js +0 -115
- package/schemas/subscription/plan.schema.js +0 -48
- package/schemas/transaction/common.schema.js +0 -22
- package/schemas/transaction/gateway.schema.js +0 -69
- package/schemas/transaction/index.js +0 -20
- package/schemas/transaction/payment.schema.js +0 -110
- package/services/escrow.service.js +0 -353
- package/services/monetization.service.js +0 -675
- package/services/payment.service.js +0 -535
- package/services/transaction.service.js +0 -142
- package/utils/category-resolver.js +0 -74
- package/utils/commission-split.js +0 -180
- package/utils/commission.js +0 -83
- package/utils/hooks.js +0 -44
- package/utils/index.d.ts +0 -164
- package/utils/index.js +0 -16
- package/utils/logger.js +0 -36
- package/utils/subscription/actions.js +0 -68
- package/utils/subscription/index.js +0 -20
- package/utils/subscription/period.js +0 -123
- package/utils/transaction-type.js +0 -254
package/core/container.js
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dependency Injection Container
|
|
3
|
-
* @classytic/revenue
|
|
4
|
-
*
|
|
5
|
-
* Lightweight DI container for managing dependencies
|
|
6
|
-
* Inspired by: Awilix, InversifyJS but much simpler
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
export class Container {
|
|
10
|
-
constructor() {
|
|
11
|
-
this._services = new Map();
|
|
12
|
-
this._singletons = new Map();
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Register a service
|
|
17
|
-
* @param {string} name - Service name
|
|
18
|
-
* @param {any} implementation - Service implementation or factory
|
|
19
|
-
* @param {Object} options - Registration options
|
|
20
|
-
*/
|
|
21
|
-
register(name, implementation, options = {}) {
|
|
22
|
-
this._services.set(name, {
|
|
23
|
-
implementation,
|
|
24
|
-
singleton: options.singleton !== false, // Default to singleton
|
|
25
|
-
factory: options.factory || false,
|
|
26
|
-
});
|
|
27
|
-
return this;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Register a singleton service
|
|
32
|
-
* @param {string} name - Service name
|
|
33
|
-
* @param {any} implementation - Service implementation
|
|
34
|
-
*/
|
|
35
|
-
singleton(name, implementation) {
|
|
36
|
-
return this.register(name, implementation, { singleton: true });
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Register a transient service (new instance each time)
|
|
41
|
-
* @param {string} name - Service name
|
|
42
|
-
* @param {Function} factory - Factory function
|
|
43
|
-
*/
|
|
44
|
-
transient(name, factory) {
|
|
45
|
-
return this.register(name, factory, { singleton: false, factory: true });
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Get a service from the container
|
|
50
|
-
* @param {string} name - Service name
|
|
51
|
-
* @returns {any} Service instance
|
|
52
|
-
*/
|
|
53
|
-
get(name) {
|
|
54
|
-
// Check if already instantiated as singleton
|
|
55
|
-
if (this._singletons.has(name)) {
|
|
56
|
-
return this._singletons.get(name);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const service = this._services.get(name);
|
|
60
|
-
if (!service) {
|
|
61
|
-
throw new Error(`Service "${name}" not registered in container`);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// Handle factory functions
|
|
65
|
-
if (service.factory) {
|
|
66
|
-
const instance = service.implementation(this);
|
|
67
|
-
if (service.singleton) {
|
|
68
|
-
this._singletons.set(name, instance);
|
|
69
|
-
}
|
|
70
|
-
return instance;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Handle direct values
|
|
74
|
-
if (service.singleton) {
|
|
75
|
-
this._singletons.set(name, service.implementation);
|
|
76
|
-
}
|
|
77
|
-
return service.implementation;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Check if service is registered
|
|
82
|
-
* @param {string} name - Service name
|
|
83
|
-
* @returns {boolean}
|
|
84
|
-
*/
|
|
85
|
-
has(name) {
|
|
86
|
-
return this._services.has(name);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Get all registered service names
|
|
91
|
-
* @returns {string[]}
|
|
92
|
-
*/
|
|
93
|
-
keys() {
|
|
94
|
-
return Array.from(this._services.keys());
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Clear all services (useful for testing)
|
|
99
|
-
*/
|
|
100
|
-
clear() {
|
|
101
|
-
this._services.clear();
|
|
102
|
-
this._singletons.clear();
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Create a child container (for scoped dependencies)
|
|
107
|
-
* @returns {Container}
|
|
108
|
-
*/
|
|
109
|
-
createScope() {
|
|
110
|
-
const scope = new Container();
|
|
111
|
-
// Copy parent services
|
|
112
|
-
this._services.forEach((value, key) => {
|
|
113
|
-
scope._services.set(key, value);
|
|
114
|
-
});
|
|
115
|
-
return scope;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
export default Container;
|
package/core/errors.js
DELETED
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Revenue Error Classes
|
|
3
|
-
* @classytic/revenue
|
|
4
|
-
*
|
|
5
|
-
* Typed errors with codes for better error handling
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Base Revenue Error
|
|
10
|
-
*/
|
|
11
|
-
export class RevenueError extends Error {
|
|
12
|
-
constructor(message, code, options = {}) {
|
|
13
|
-
super(message);
|
|
14
|
-
this.name = this.constructor.name;
|
|
15
|
-
this.code = code;
|
|
16
|
-
this.retryable = options.retryable || false;
|
|
17
|
-
this.metadata = options.metadata || {};
|
|
18
|
-
Error.captureStackTrace(this, this.constructor);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
toJSON() {
|
|
22
|
-
return {
|
|
23
|
-
name: this.name,
|
|
24
|
-
message: this.message,
|
|
25
|
-
code: this.code,
|
|
26
|
-
retryable: this.retryable,
|
|
27
|
-
metadata: this.metadata,
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Configuration Errors
|
|
34
|
-
*/
|
|
35
|
-
export class ConfigurationError extends RevenueError {
|
|
36
|
-
constructor(message, metadata = {}) {
|
|
37
|
-
super(message, 'CONFIGURATION_ERROR', { retryable: false, metadata });
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export class ModelNotRegisteredError extends ConfigurationError {
|
|
42
|
-
constructor(modelName) {
|
|
43
|
-
super(
|
|
44
|
-
`Model "${modelName}" is not registered. Register it via createRevenue({ models: { ${modelName}: ... } })`,
|
|
45
|
-
{ modelName }
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Provider Errors
|
|
52
|
-
*/
|
|
53
|
-
export class ProviderError extends RevenueError {
|
|
54
|
-
constructor(message, code, options = {}) {
|
|
55
|
-
super(message, code, options);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export class ProviderNotFoundError extends ProviderError {
|
|
60
|
-
constructor(providerName, availableProviders = []) {
|
|
61
|
-
super(
|
|
62
|
-
`Payment provider "${providerName}" not found. Available: ${availableProviders.join(', ')}`,
|
|
63
|
-
'PROVIDER_NOT_FOUND',
|
|
64
|
-
{ retryable: false, metadata: { providerName, availableProviders } }
|
|
65
|
-
);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export class ProviderCapabilityError extends ProviderError {
|
|
70
|
-
constructor(providerName, capability) {
|
|
71
|
-
super(
|
|
72
|
-
`Provider "${providerName}" does not support ${capability}`,
|
|
73
|
-
'PROVIDER_CAPABILITY_NOT_SUPPORTED',
|
|
74
|
-
{ retryable: false, metadata: { providerName, capability } }
|
|
75
|
-
);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
export class PaymentIntentCreationError extends ProviderError {
|
|
80
|
-
constructor(providerName, originalError) {
|
|
81
|
-
super(
|
|
82
|
-
`Failed to create payment intent with provider "${providerName}": ${originalError.message}`,
|
|
83
|
-
'PAYMENT_INTENT_CREATION_FAILED',
|
|
84
|
-
{ retryable: true, metadata: { providerName, originalError: originalError.message } }
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export class PaymentVerificationError extends ProviderError {
|
|
90
|
-
constructor(paymentIntentId, reason) {
|
|
91
|
-
super(
|
|
92
|
-
`Payment verification failed for intent "${paymentIntentId}": ${reason}`,
|
|
93
|
-
'PAYMENT_VERIFICATION_FAILED',
|
|
94
|
-
{ retryable: true, metadata: { paymentIntentId, reason } }
|
|
95
|
-
);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Resource Not Found Errors
|
|
101
|
-
*/
|
|
102
|
-
export class NotFoundError extends RevenueError {
|
|
103
|
-
constructor(message, code, metadata = {}) {
|
|
104
|
-
super(message, code, { retryable: false, metadata });
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
export class SubscriptionNotFoundError extends NotFoundError {
|
|
109
|
-
constructor(subscriptionId) {
|
|
110
|
-
super(
|
|
111
|
-
`Subscription not found: ${subscriptionId}`,
|
|
112
|
-
'SUBSCRIPTION_NOT_FOUND',
|
|
113
|
-
{ subscriptionId }
|
|
114
|
-
);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
export class TransactionNotFoundError extends NotFoundError {
|
|
119
|
-
constructor(transactionId) {
|
|
120
|
-
super(
|
|
121
|
-
`Transaction not found: ${transactionId}`,
|
|
122
|
-
'TRANSACTION_NOT_FOUND',
|
|
123
|
-
{ transactionId }
|
|
124
|
-
);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Validation Errors
|
|
130
|
-
*/
|
|
131
|
-
export class ValidationError extends RevenueError {
|
|
132
|
-
constructor(message, metadata = {}) {
|
|
133
|
-
super(message, 'VALIDATION_ERROR', { retryable: false, metadata });
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
export class InvalidAmountError extends ValidationError {
|
|
138
|
-
constructor(amount) {
|
|
139
|
-
super(`Invalid amount: ${amount}. Amount must be non-negative`, { amount });
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
export class MissingRequiredFieldError extends ValidationError {
|
|
144
|
-
constructor(fieldName) {
|
|
145
|
-
super(`Missing required field: ${fieldName}`, { fieldName });
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* State Errors
|
|
151
|
-
*/
|
|
152
|
-
export class StateError extends RevenueError {
|
|
153
|
-
constructor(message, code, metadata = {}) {
|
|
154
|
-
super(message, code, { retryable: false, metadata });
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
export class AlreadyVerifiedError extends StateError {
|
|
159
|
-
constructor(transactionId) {
|
|
160
|
-
super(
|
|
161
|
-
`Transaction ${transactionId} is already verified`,
|
|
162
|
-
'ALREADY_VERIFIED',
|
|
163
|
-
{ transactionId }
|
|
164
|
-
);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
export class InvalidStateTransitionError extends StateError {
|
|
169
|
-
constructor(resourceType, resourceId, fromState, toState) {
|
|
170
|
-
super(
|
|
171
|
-
`Invalid state transition for ${resourceType} ${resourceId}: ${fromState} → ${toState}`,
|
|
172
|
-
'INVALID_STATE_TRANSITION',
|
|
173
|
-
{ resourceType, resourceId, fromState, toState }
|
|
174
|
-
);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
export class SubscriptionNotActiveError extends StateError {
|
|
179
|
-
constructor(subscriptionId) {
|
|
180
|
-
super(
|
|
181
|
-
`Subscription ${subscriptionId} is not active`,
|
|
182
|
-
'SUBSCRIPTION_NOT_ACTIVE',
|
|
183
|
-
{ subscriptionId }
|
|
184
|
-
);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* Operation Errors
|
|
190
|
-
*/
|
|
191
|
-
export class OperationError extends RevenueError {
|
|
192
|
-
constructor(message, code, options = {}) {
|
|
193
|
-
super(message, code, options);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
export class RefundNotSupportedError extends OperationError {
|
|
198
|
-
constructor(providerName) {
|
|
199
|
-
super(
|
|
200
|
-
`Refunds are not supported by provider "${providerName}"`,
|
|
201
|
-
'REFUND_NOT_SUPPORTED',
|
|
202
|
-
{ retryable: false, metadata: { providerName } }
|
|
203
|
-
);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
export class RefundError extends OperationError {
|
|
208
|
-
constructor(transactionId, reason) {
|
|
209
|
-
super(
|
|
210
|
-
`Refund failed for transaction ${transactionId}: ${reason}`,
|
|
211
|
-
'REFUND_FAILED',
|
|
212
|
-
{ retryable: true, metadata: { transactionId, reason } }
|
|
213
|
-
);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* Error Code Constants
|
|
219
|
-
*/
|
|
220
|
-
export const ERROR_CODES = {
|
|
221
|
-
// Configuration
|
|
222
|
-
CONFIGURATION_ERROR: 'CONFIGURATION_ERROR',
|
|
223
|
-
MODEL_NOT_REGISTERED: 'MODEL_NOT_REGISTERED',
|
|
224
|
-
|
|
225
|
-
// Provider
|
|
226
|
-
PROVIDER_NOT_FOUND: 'PROVIDER_NOT_FOUND',
|
|
227
|
-
PROVIDER_CAPABILITY_NOT_SUPPORTED: 'PROVIDER_CAPABILITY_NOT_SUPPORTED',
|
|
228
|
-
PAYMENT_INTENT_CREATION_FAILED: 'PAYMENT_INTENT_CREATION_FAILED',
|
|
229
|
-
PAYMENT_VERIFICATION_FAILED: 'PAYMENT_VERIFICATION_FAILED',
|
|
230
|
-
|
|
231
|
-
// Not Found
|
|
232
|
-
SUBSCRIPTION_NOT_FOUND: 'SUBSCRIPTION_NOT_FOUND',
|
|
233
|
-
TRANSACTION_NOT_FOUND: 'TRANSACTION_NOT_FOUND',
|
|
234
|
-
|
|
235
|
-
// Validation
|
|
236
|
-
VALIDATION_ERROR: 'VALIDATION_ERROR',
|
|
237
|
-
INVALID_AMOUNT: 'INVALID_AMOUNT',
|
|
238
|
-
MISSING_REQUIRED_FIELD: 'MISSING_REQUIRED_FIELD',
|
|
239
|
-
|
|
240
|
-
// State
|
|
241
|
-
ALREADY_VERIFIED: 'ALREADY_VERIFIED',
|
|
242
|
-
INVALID_STATE_TRANSITION: 'INVALID_STATE_TRANSITION',
|
|
243
|
-
SUBSCRIPTION_NOT_ACTIVE: 'SUBSCRIPTION_NOT_ACTIVE',
|
|
244
|
-
|
|
245
|
-
// Operations
|
|
246
|
-
REFUND_NOT_SUPPORTED: 'REFUND_NOT_SUPPORTED',
|
|
247
|
-
REFUND_FAILED: 'REFUND_FAILED',
|
|
248
|
-
};
|
|
249
|
-
|
|
250
|
-
/**
|
|
251
|
-
* Check if error is retryable
|
|
252
|
-
*/
|
|
253
|
-
export function isRetryable(error) {
|
|
254
|
-
return error instanceof RevenueError && error.retryable;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/**
|
|
258
|
-
* Check if error is from revenue package
|
|
259
|
-
*/
|
|
260
|
-
export function isRevenueError(error) {
|
|
261
|
-
return error instanceof RevenueError;
|
|
262
|
-
}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Create revenue instance with dependency injection
|
|
3
|
-
*
|
|
4
|
-
* @param {Object} options - Configuration options
|
|
5
|
-
* @param {Object} options.models - Mongoose models { Transaction, Subscription, etc. }
|
|
6
|
-
* @param {Record<string, import('../providers/base.js').PaymentProvider>} options.providers - Payment providers - Register ANY custom gateway by name
|
|
7
|
-
* @param {Object} options.hooks - Event hooks
|
|
8
|
-
* @param {Object} options.config - Additional configuration
|
|
9
|
-
* @param {Object} options.logger - Logger instance
|
|
10
|
-
* @returns {Revenue} Revenue instance
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```javascript
|
|
14
|
-
* import { createRevenue } from '@classytic/revenue';
|
|
15
|
-
* import { ManualProvider } from '@classytic/revenue-manual';
|
|
16
|
-
*
|
|
17
|
-
* const revenue = createRevenue({
|
|
18
|
-
* models: {
|
|
19
|
-
* Transaction: TransactionModel,
|
|
20
|
-
* Subscription: SubscriptionModel,
|
|
21
|
-
* },
|
|
22
|
-
* providers: {
|
|
23
|
-
* manual: new ManualProvider(),
|
|
24
|
-
* bkash: new BkashProvider(), // Custom gateway
|
|
25
|
-
* nagad: new NagadProvider(), // Custom gateway
|
|
26
|
-
* stripe: new StripeProvider(), // Custom gateway
|
|
27
|
-
* // ... register any gateway you want
|
|
28
|
-
* },
|
|
29
|
-
* config: {
|
|
30
|
-
* targetModels: ['Subscription', 'Membership'],
|
|
31
|
-
* categoryMappings: {
|
|
32
|
-
* Subscription: 'platform_subscription',
|
|
33
|
-
* Membership: 'gym_membership',
|
|
34
|
-
* },
|
|
35
|
-
* },
|
|
36
|
-
* });
|
|
37
|
-
*
|
|
38
|
-
* // Use any registered gateway by name
|
|
39
|
-
* const { transaction } = await revenue.monetization.create({
|
|
40
|
-
* gateway: 'bkash', // Use your custom gateway
|
|
41
|
-
* monetizationType: 'purchase',
|
|
42
|
-
* amount: 1500,
|
|
43
|
-
* // ...
|
|
44
|
-
* });
|
|
45
|
-
* await revenue.payments.verify(transaction._id);
|
|
46
|
-
* ```
|
|
47
|
-
*/
|
|
48
|
-
export function createRevenue(options?: {
|
|
49
|
-
models: any;
|
|
50
|
-
providers: Record<string, import("../providers/base.js").PaymentProvider>;
|
|
51
|
-
hooks: any;
|
|
52
|
-
config: any;
|
|
53
|
-
logger: any;
|
|
54
|
-
}): Revenue;
|
|
55
|
-
export default createRevenue;
|
|
56
|
-
/**
|
|
57
|
-
* Revenue instance type (for documentation)
|
|
58
|
-
*/
|
|
59
|
-
export type Revenue = {
|
|
60
|
-
/**
|
|
61
|
-
* - DI container (readonly)
|
|
62
|
-
*/
|
|
63
|
-
container: Container;
|
|
64
|
-
/**
|
|
65
|
-
* - Payment providers (readonly, frozen)
|
|
66
|
-
*/
|
|
67
|
-
providers: any;
|
|
68
|
-
/**
|
|
69
|
-
* - Configuration (readonly, frozen)
|
|
70
|
-
*/
|
|
71
|
-
config: any;
|
|
72
|
-
/**
|
|
73
|
-
* - Monetization service (purchases, subscriptions, free items)
|
|
74
|
-
*/
|
|
75
|
-
monetization: MonetizationService;
|
|
76
|
-
/**
|
|
77
|
-
* - Payment service
|
|
78
|
-
*/
|
|
79
|
-
payments: PaymentService;
|
|
80
|
-
/**
|
|
81
|
-
* - Transaction service
|
|
82
|
-
*/
|
|
83
|
-
transactions: TransactionService;
|
|
84
|
-
/**
|
|
85
|
-
* - Escrow service
|
|
86
|
-
*/
|
|
87
|
-
escrow: EscrowService;
|
|
88
|
-
/**
|
|
89
|
-
* - Get payment provider
|
|
90
|
-
*/
|
|
91
|
-
getProvider: Function;
|
|
92
|
-
};
|
|
93
|
-
import { Container } from './container.js';
|
|
94
|
-
import { MonetizationService } from '../services/monetization.service.js';
|
|
95
|
-
import { PaymentService } from '../services/payment.service.js';
|
|
96
|
-
import { TransactionService } from '../services/transaction.service.js';
|
|
97
|
-
import { EscrowService } from '../services/escrow.service.js';
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dependency Injection Container
|
|
3
|
-
* @classytic/revenue
|
|
4
|
-
*
|
|
5
|
-
* Lightweight DI container for managing dependencies
|
|
6
|
-
* Inspired by: Awilix, InversifyJS but much simpler
|
|
7
|
-
*/
|
|
8
|
-
export class Container {
|
|
9
|
-
_services: Map<any, any>;
|
|
10
|
-
_singletons: Map<any, any>;
|
|
11
|
-
/**
|
|
12
|
-
* Register a service
|
|
13
|
-
* @param {string} name - Service name
|
|
14
|
-
* @param {any} implementation - Service implementation or factory
|
|
15
|
-
* @param {Object} options - Registration options
|
|
16
|
-
*/
|
|
17
|
-
register(name: string, implementation: any, options?: any): this;
|
|
18
|
-
/**
|
|
19
|
-
* Register a singleton service
|
|
20
|
-
* @param {string} name - Service name
|
|
21
|
-
* @param {any} implementation - Service implementation
|
|
22
|
-
*/
|
|
23
|
-
singleton(name: string, implementation: any): this;
|
|
24
|
-
/**
|
|
25
|
-
* Register a transient service (new instance each time)
|
|
26
|
-
* @param {string} name - Service name
|
|
27
|
-
* @param {Function} factory - Factory function
|
|
28
|
-
*/
|
|
29
|
-
transient(name: string, factory: Function): this;
|
|
30
|
-
/**
|
|
31
|
-
* Get a service from the container
|
|
32
|
-
* @param {string} name - Service name
|
|
33
|
-
* @returns {any} Service instance
|
|
34
|
-
*/
|
|
35
|
-
get(name: string): any;
|
|
36
|
-
/**
|
|
37
|
-
* Check if service is registered
|
|
38
|
-
* @param {string} name - Service name
|
|
39
|
-
* @returns {boolean}
|
|
40
|
-
*/
|
|
41
|
-
has(name: string): boolean;
|
|
42
|
-
/**
|
|
43
|
-
* Get all registered service names
|
|
44
|
-
* @returns {string[]}
|
|
45
|
-
*/
|
|
46
|
-
keys(): string[];
|
|
47
|
-
/**
|
|
48
|
-
* Clear all services (useful for testing)
|
|
49
|
-
*/
|
|
50
|
-
clear(): void;
|
|
51
|
-
/**
|
|
52
|
-
* Create a child container (for scoped dependencies)
|
|
53
|
-
* @returns {Container}
|
|
54
|
-
*/
|
|
55
|
-
createScope(): Container;
|
|
56
|
-
}
|
|
57
|
-
export default Container;
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Check if error is retryable
|
|
3
|
-
*/
|
|
4
|
-
export function isRetryable(error: any): any;
|
|
5
|
-
/**
|
|
6
|
-
* Check if error is from revenue package
|
|
7
|
-
*/
|
|
8
|
-
export function isRevenueError(error: any): error is RevenueError;
|
|
9
|
-
/**
|
|
10
|
-
* Revenue Error Classes
|
|
11
|
-
* @classytic/revenue
|
|
12
|
-
*
|
|
13
|
-
* Typed errors with codes for better error handling
|
|
14
|
-
*/
|
|
15
|
-
/**
|
|
16
|
-
* Base Revenue Error
|
|
17
|
-
*/
|
|
18
|
-
export class RevenueError extends Error {
|
|
19
|
-
constructor(message: any, code: any, options?: {});
|
|
20
|
-
code: any;
|
|
21
|
-
retryable: any;
|
|
22
|
-
metadata: any;
|
|
23
|
-
toJSON(): {
|
|
24
|
-
name: string;
|
|
25
|
-
message: string;
|
|
26
|
-
code: any;
|
|
27
|
-
retryable: any;
|
|
28
|
-
metadata: any;
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Configuration Errors
|
|
33
|
-
*/
|
|
34
|
-
export class ConfigurationError extends RevenueError {
|
|
35
|
-
constructor(message: any, metadata?: {});
|
|
36
|
-
}
|
|
37
|
-
export class ModelNotRegisteredError extends ConfigurationError {
|
|
38
|
-
constructor(modelName: any);
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Provider Errors
|
|
42
|
-
*/
|
|
43
|
-
export class ProviderError extends RevenueError {
|
|
44
|
-
}
|
|
45
|
-
export class ProviderNotFoundError extends ProviderError {
|
|
46
|
-
constructor(providerName: any, availableProviders?: any[]);
|
|
47
|
-
}
|
|
48
|
-
export class ProviderCapabilityError extends ProviderError {
|
|
49
|
-
constructor(providerName: any, capability: any);
|
|
50
|
-
}
|
|
51
|
-
export class PaymentIntentCreationError extends ProviderError {
|
|
52
|
-
constructor(providerName: any, originalError: any);
|
|
53
|
-
}
|
|
54
|
-
export class PaymentVerificationError extends ProviderError {
|
|
55
|
-
constructor(paymentIntentId: any, reason: any);
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Resource Not Found Errors
|
|
59
|
-
*/
|
|
60
|
-
export class NotFoundError extends RevenueError {
|
|
61
|
-
}
|
|
62
|
-
export class SubscriptionNotFoundError extends NotFoundError {
|
|
63
|
-
constructor(subscriptionId: any);
|
|
64
|
-
}
|
|
65
|
-
export class TransactionNotFoundError extends NotFoundError {
|
|
66
|
-
constructor(transactionId: any);
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Validation Errors
|
|
70
|
-
*/
|
|
71
|
-
export class ValidationError extends RevenueError {
|
|
72
|
-
constructor(message: any, metadata?: {});
|
|
73
|
-
}
|
|
74
|
-
export class InvalidAmountError extends ValidationError {
|
|
75
|
-
constructor(amount: any);
|
|
76
|
-
}
|
|
77
|
-
export class MissingRequiredFieldError extends ValidationError {
|
|
78
|
-
constructor(fieldName: any);
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* State Errors
|
|
82
|
-
*/
|
|
83
|
-
export class StateError extends RevenueError {
|
|
84
|
-
}
|
|
85
|
-
export class AlreadyVerifiedError extends StateError {
|
|
86
|
-
constructor(transactionId: any);
|
|
87
|
-
}
|
|
88
|
-
export class InvalidStateTransitionError extends StateError {
|
|
89
|
-
constructor(resourceType: any, resourceId: any, fromState: any, toState: any);
|
|
90
|
-
}
|
|
91
|
-
export class SubscriptionNotActiveError extends StateError {
|
|
92
|
-
constructor(subscriptionId: any);
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Operation Errors
|
|
96
|
-
*/
|
|
97
|
-
export class OperationError extends RevenueError {
|
|
98
|
-
}
|
|
99
|
-
export class RefundNotSupportedError extends OperationError {
|
|
100
|
-
constructor(providerName: any);
|
|
101
|
-
}
|
|
102
|
-
export class RefundError extends OperationError {
|
|
103
|
-
constructor(transactionId: any, reason: any);
|
|
104
|
-
}
|
|
105
|
-
export namespace ERROR_CODES {
|
|
106
|
-
let CONFIGURATION_ERROR: string;
|
|
107
|
-
let MODEL_NOT_REGISTERED: string;
|
|
108
|
-
let PROVIDER_NOT_FOUND: string;
|
|
109
|
-
let PROVIDER_CAPABILITY_NOT_SUPPORTED: string;
|
|
110
|
-
let PAYMENT_INTENT_CREATION_FAILED: string;
|
|
111
|
-
let PAYMENT_VERIFICATION_FAILED: string;
|
|
112
|
-
let SUBSCRIPTION_NOT_FOUND: string;
|
|
113
|
-
let TRANSACTION_NOT_FOUND: string;
|
|
114
|
-
let VALIDATION_ERROR: string;
|
|
115
|
-
let INVALID_AMOUNT: string;
|
|
116
|
-
let MISSING_REQUIRED_FIELD: string;
|
|
117
|
-
let ALREADY_VERIFIED: string;
|
|
118
|
-
let INVALID_STATE_TRANSITION: string;
|
|
119
|
-
let SUBSCRIPTION_NOT_ACTIVE: string;
|
|
120
|
-
let REFUND_NOT_SUPPORTED: string;
|
|
121
|
-
let REFUND_FAILED: string;
|
|
122
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
export namespace HOLD_STATUS {
|
|
2
|
-
let PENDING: string;
|
|
3
|
-
let HELD: string;
|
|
4
|
-
let RELEASED: string;
|
|
5
|
-
let CANCELLED: string;
|
|
6
|
-
let EXPIRED: string;
|
|
7
|
-
let PARTIALLY_RELEASED: string;
|
|
8
|
-
}
|
|
9
|
-
export const HOLD_STATUS_VALUES: string[];
|
|
10
|
-
export namespace RELEASE_REASON {
|
|
11
|
-
let PAYMENT_VERIFIED: string;
|
|
12
|
-
let MANUAL_RELEASE: string;
|
|
13
|
-
let AUTO_RELEASE: string;
|
|
14
|
-
let DISPUTE_RESOLVED: string;
|
|
15
|
-
}
|
|
16
|
-
export const RELEASE_REASON_VALUES: string[];
|
|
17
|
-
export namespace HOLD_REASON {
|
|
18
|
-
let PAYMENT_VERIFICATION: string;
|
|
19
|
-
let FRAUD_CHECK: string;
|
|
20
|
-
let MANUAL_REVIEW: string;
|
|
21
|
-
let DISPUTE: string;
|
|
22
|
-
let COMPLIANCE: string;
|
|
23
|
-
}
|
|
24
|
-
export const HOLD_REASON_VALUES: string[];
|