@classytic/revenue 1.1.2 → 1.1.3
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 +8 -7
- package/dist/application/services/index.d.mts +4 -0
- package/dist/application/services/index.mjs +3 -0
- package/dist/base-CsTlVQJe.d.mts +136 -0
- package/dist/base-DCoyIUj6.mjs +152 -0
- package/dist/category-resolver-DV83N8ok.mjs +284 -0
- package/dist/commission-split-BzB8cd39.mjs +485 -0
- package/dist/core/events.d.mts +294 -0
- package/dist/core/events.mjs +100 -0
- package/dist/core/index.d.mts +9 -0
- package/dist/core/index.mjs +8 -0
- package/dist/enums/index.d.mts +157 -0
- package/dist/enums/index.mjs +56 -0
- package/dist/errors-CorrWz7A.d.mts +787 -0
- package/dist/escrow.enums-CZGrrdg7.mjs +101 -0
- package/dist/{escrow.enums-CE0VQsfe.d.ts → escrow.enums-DwdLuuve.d.mts} +30 -28
- package/dist/idempotency-DaYcUGY1.mjs +172 -0
- package/dist/index-Dsp7H5Wb.d.mts +471 -0
- package/dist/index.d.mts +9 -0
- package/dist/index.mjs +38 -0
- package/dist/infrastructure/plugins/{index.d.ts → index.d.mts} +81 -109
- package/dist/infrastructure/plugins/index.mjs +345 -0
- package/dist/money-CvrDOijQ.mjs +271 -0
- package/dist/money-DPG8AtJ8.d.mts +112 -0
- package/dist/{payment.enums-C1BiGlRa.d.ts → payment.enums-HAuAS9Pp.d.mts} +14 -13
- package/dist/payment.enums-tEFVa-Xp.mjs +69 -0
- package/dist/plugin-BbK0OVHy.d.mts +327 -0
- package/dist/plugin-Cd_V04Em.mjs +210 -0
- package/dist/providers/index.d.mts +3 -0
- package/dist/providers/index.mjs +3 -0
- package/dist/reconciliation/{index.d.ts → index.d.mts} +90 -112
- package/dist/reconciliation/index.mjs +192 -0
- package/dist/retry-HHCOXYdn.d.mts +186 -0
- package/dist/revenue-9scqKSef.mjs +553 -0
- package/dist/schemas/index.d.mts +2665 -0
- package/dist/schemas/index.mjs +717 -0
- package/dist/schemas/validation.d.mts +375 -0
- package/dist/schemas/validation.mjs +325 -0
- package/dist/{settlement.enums-ByC1x0ye.d.ts → settlement.enums-DFhkqZEY.d.mts} +31 -29
- package/dist/settlement.schema-D5uWB5tP.d.mts +344 -0
- package/dist/settlement.service-BxuiHpNC.d.mts +594 -0
- package/dist/settlement.service-CUxbUTzT.mjs +2510 -0
- package/dist/split.enums-BrjabxIX.mjs +86 -0
- package/dist/split.enums-DmskfLOM.d.mts +43 -0
- package/dist/tax-BoCt5cEd.d.mts +61 -0
- package/dist/tax-EQ15DO81.mjs +162 -0
- package/dist/transaction.enums-pCyMFT4Z.mjs +96 -0
- package/dist/utils/{index.d.ts → index.d.mts} +91 -161
- package/dist/utils/index.mjs +346 -0
- package/package.json +38 -36
- package/dist/application/services/index.d.ts +0 -6
- package/dist/application/services/index.js +0 -3288
- package/dist/application/services/index.js.map +0 -1
- package/dist/core/events.d.ts +0 -455
- package/dist/core/events.js +0 -122
- package/dist/core/events.js.map +0 -1
- package/dist/core/index.d.ts +0 -13
- package/dist/core/index.js +0 -4591
- package/dist/core/index.js.map +0 -1
- package/dist/enums/index.d.ts +0 -159
- package/dist/enums/index.js +0 -296
- package/dist/enums/index.js.map +0 -1
- package/dist/index-DxIK0UmZ.d.ts +0 -633
- package/dist/index-EnfKzDbs.d.ts +0 -806
- package/dist/index-cLJBLUvx.d.ts +0 -478
- package/dist/index.d.ts +0 -43
- package/dist/index.js +0 -4864
- package/dist/index.js.map +0 -1
- package/dist/infrastructure/plugins/index.js +0 -292
- package/dist/infrastructure/plugins/index.js.map +0 -1
- package/dist/money-widWVD7r.d.ts +0 -111
- package/dist/plugin-Bb9HOE10.d.ts +0 -336
- package/dist/providers/index.d.ts +0 -145
- package/dist/providers/index.js +0 -141
- package/dist/providers/index.js.map +0 -1
- package/dist/reconciliation/index.js +0 -140
- package/dist/reconciliation/index.js.map +0 -1
- package/dist/retry-D4hFUwVk.d.ts +0 -194
- package/dist/schemas/index.d.ts +0 -2655
- package/dist/schemas/index.js +0 -841
- package/dist/schemas/index.js.map +0 -1
- package/dist/schemas/validation.d.ts +0 -384
- package/dist/schemas/validation.js +0 -303
- package/dist/schemas/validation.js.map +0 -1
- package/dist/settlement.schema-CpamV7ZY.d.ts +0 -343
- package/dist/split.enums-DG3TxQf9.d.ts +0 -42
- package/dist/tax-CV8A0sxl.d.ts +0 -60
- package/dist/utils/index.js +0 -1202
- package/dist/utils/index.js.map +0 -1
package/README.md
CHANGED
|
@@ -78,12 +78,13 @@ import type { ITransaction } from '@classytic/shared-types';
|
|
|
78
78
|
## Installation
|
|
79
79
|
|
|
80
80
|
```bash
|
|
81
|
-
npm install @classytic/revenue mongoose zod
|
|
81
|
+
npm install @classytic/revenue @classytic/shared-types mongoose zod
|
|
82
82
|
```
|
|
83
83
|
|
|
84
84
|
**Peer Dependencies:**
|
|
85
|
+
- `@classytic/shared-types` ^1.0.0
|
|
85
86
|
- `mongoose` ^8.0.0 || ^9.0.0
|
|
86
|
-
- `zod` ^4.
|
|
87
|
+
- `zod` ^4.0.0
|
|
87
88
|
|
|
88
89
|
**Provider Packages** (install as needed):
|
|
89
90
|
```bash
|
|
@@ -435,7 +436,7 @@ await revenue.escrow.split(transaction._id, {
|
|
|
435
436
|
```typescript
|
|
436
437
|
import { EventBus } from '@classytic/revenue/events';
|
|
437
438
|
|
|
438
|
-
revenue.events.on('payment
|
|
439
|
+
revenue.events.on('payment.verified', async (event) => {
|
|
439
440
|
// Grant access
|
|
440
441
|
await grantAccess(event.transaction.customerId);
|
|
441
442
|
|
|
@@ -443,14 +444,14 @@ revenue.events.on('payment:verified', async (event) => {
|
|
|
443
444
|
await sendEmail(event.transaction.customerId, 'Payment received!');
|
|
444
445
|
});
|
|
445
446
|
|
|
446
|
-
revenue.events.on('subscription
|
|
447
|
+
revenue.events.on('subscription.cancelled', async (event) => {
|
|
447
448
|
await removeAccess(event.subscription.customerId);
|
|
448
449
|
});
|
|
449
450
|
|
|
450
451
|
// Other events:
|
|
451
|
-
// - monetization
|
|
452
|
-
// - subscription
|
|
453
|
-
// - escrow
|
|
452
|
+
// - monetization.created, payment.failed, payment.refunded
|
|
453
|
+
// - subscription.activated, subscription.renewed
|
|
454
|
+
// - escrow.held, escrow.released, settlement.completed
|
|
454
455
|
```
|
|
455
456
|
|
|
456
457
|
### Tax Plugin (Optional)
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { a as MonetizationService, i as PaymentService, n as EscrowService, r as TransactionService, t as SettlementService } from "../../settlement.service-BxuiHpNC.mjs";
|
|
2
|
+
import "../../index-Dsp7H5Wb.mjs";
|
|
3
|
+
import "../../settlement.schema-D5uWB5tP.mjs";
|
|
4
|
+
export { EscrowService, MonetizationService, PaymentService, SettlementService, TransactionService };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { a as MonetizationService, i as PaymentService, n as EscrowService, r as TransactionService, t as SettlementService } from "../../settlement.service-CUxbUTzT.mjs";
|
|
2
|
+
|
|
3
|
+
export { EscrowService, MonetizationService, PaymentService, SettlementService, TransactionService };
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { D as ProviderCapabilities, W as WebhookEventData, _ as PaymentIntentData, a as CreateIntentParams, b as PaymentResultData, k as RefundResultData } from "./index-Dsp7H5Wb.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/providers/base.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Payment Intent - standardized response from createIntent
|
|
6
|
+
*/
|
|
7
|
+
declare class PaymentIntent implements PaymentIntentData {
|
|
8
|
+
readonly id: string;
|
|
9
|
+
readonly sessionId: string | null;
|
|
10
|
+
readonly paymentIntentId: string | null;
|
|
11
|
+
readonly provider: string;
|
|
12
|
+
readonly status: string;
|
|
13
|
+
readonly amount: number;
|
|
14
|
+
readonly currency?: string;
|
|
15
|
+
readonly metadata: Record<string, unknown>;
|
|
16
|
+
readonly clientSecret?: string;
|
|
17
|
+
readonly paymentUrl?: string;
|
|
18
|
+
readonly instructions?: string;
|
|
19
|
+
readonly raw?: unknown;
|
|
20
|
+
constructor(data: PaymentIntentData);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Payment Result - standardized response from verifyPayment
|
|
24
|
+
*/
|
|
25
|
+
declare class PaymentResult implements PaymentResultData {
|
|
26
|
+
readonly id: string;
|
|
27
|
+
readonly provider: string;
|
|
28
|
+
readonly status: 'succeeded' | 'failed' | 'processing' | 'requires_action';
|
|
29
|
+
readonly amount?: number;
|
|
30
|
+
readonly currency?: string;
|
|
31
|
+
readonly paidAt?: Date;
|
|
32
|
+
readonly metadata: Record<string, unknown>;
|
|
33
|
+
readonly raw?: unknown;
|
|
34
|
+
constructor(data: PaymentResultData);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Refund Result - standardized response from refund
|
|
38
|
+
*/
|
|
39
|
+
declare class RefundResult implements RefundResultData {
|
|
40
|
+
readonly id: string;
|
|
41
|
+
readonly provider: string;
|
|
42
|
+
readonly status: 'succeeded' | 'failed' | 'processing';
|
|
43
|
+
readonly amount?: number;
|
|
44
|
+
readonly currency?: string;
|
|
45
|
+
readonly refundedAt?: Date;
|
|
46
|
+
readonly reason?: string;
|
|
47
|
+
readonly metadata: Record<string, unknown>;
|
|
48
|
+
readonly raw?: unknown;
|
|
49
|
+
constructor(data: RefundResultData);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Webhook Event - standardized webhook event
|
|
53
|
+
*/
|
|
54
|
+
declare class WebhookEvent implements WebhookEventData {
|
|
55
|
+
readonly id: string;
|
|
56
|
+
readonly provider: string;
|
|
57
|
+
readonly type: string;
|
|
58
|
+
readonly data: {
|
|
59
|
+
sessionId?: string;
|
|
60
|
+
paymentIntentId?: string;
|
|
61
|
+
[key: string]: unknown;
|
|
62
|
+
};
|
|
63
|
+
readonly createdAt?: Date;
|
|
64
|
+
readonly raw?: unknown;
|
|
65
|
+
constructor(data: WebhookEventData);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Base Payment Provider
|
|
69
|
+
* All payment providers must extend this class
|
|
70
|
+
*/
|
|
71
|
+
declare abstract class PaymentProvider {
|
|
72
|
+
readonly config: Record<string, unknown>;
|
|
73
|
+
readonly name: string;
|
|
74
|
+
/** Default currency - injected by Revenue when provider is registered */
|
|
75
|
+
private _defaultCurrency;
|
|
76
|
+
constructor(config?: Record<string, unknown>);
|
|
77
|
+
/**
|
|
78
|
+
* Get the default currency for this provider
|
|
79
|
+
* Used when creating PaymentIntent, PaymentResult, RefundResult without explicit currency
|
|
80
|
+
*/
|
|
81
|
+
get defaultCurrency(): string;
|
|
82
|
+
/**
|
|
83
|
+
* Set the default currency (called by Revenue when registering provider)
|
|
84
|
+
* @internal
|
|
85
|
+
*/
|
|
86
|
+
setDefaultCurrency(currency: string): void;
|
|
87
|
+
/**
|
|
88
|
+
* Create a payment intent
|
|
89
|
+
* @param params - Payment parameters
|
|
90
|
+
* @returns Promise<PaymentIntent>
|
|
91
|
+
*/
|
|
92
|
+
abstract createIntent(params: CreateIntentParams): Promise<PaymentIntent>;
|
|
93
|
+
/**
|
|
94
|
+
* Verify a payment
|
|
95
|
+
* @param intentId - Payment intent ID
|
|
96
|
+
* @returns Promise<PaymentResult>
|
|
97
|
+
*/
|
|
98
|
+
abstract verifyPayment(intentId: string): Promise<PaymentResult>;
|
|
99
|
+
/**
|
|
100
|
+
* Get payment status
|
|
101
|
+
* @param intentId - Payment intent ID
|
|
102
|
+
* @returns Promise<PaymentResult>
|
|
103
|
+
*/
|
|
104
|
+
abstract getStatus(intentId: string): Promise<PaymentResult>;
|
|
105
|
+
/**
|
|
106
|
+
* Refund a payment
|
|
107
|
+
* @param paymentId - Payment ID
|
|
108
|
+
* @param amount - Amount to refund (optional, full refund if not provided)
|
|
109
|
+
* @param options - Refund options
|
|
110
|
+
* @returns Promise<RefundResult>
|
|
111
|
+
*/
|
|
112
|
+
abstract refund(paymentId: string, amount?: number | null, options?: {
|
|
113
|
+
reason?: string;
|
|
114
|
+
}): Promise<RefundResult>;
|
|
115
|
+
/**
|
|
116
|
+
* Handle webhook from provider
|
|
117
|
+
* @param payload - Webhook payload
|
|
118
|
+
* @param headers - Request headers (for signature verification)
|
|
119
|
+
* @returns Promise<WebhookEvent>
|
|
120
|
+
*/
|
|
121
|
+
abstract handleWebhook(payload: unknown, headers?: Record<string, string>): Promise<WebhookEvent>;
|
|
122
|
+
/**
|
|
123
|
+
* Verify webhook signature (optional)
|
|
124
|
+
* @param payload - Webhook payload
|
|
125
|
+
* @param signature - Webhook signature
|
|
126
|
+
* @returns boolean
|
|
127
|
+
*/
|
|
128
|
+
verifyWebhookSignature(_payload: unknown, _signature: string): boolean;
|
|
129
|
+
/**
|
|
130
|
+
* Get provider capabilities
|
|
131
|
+
* @returns ProviderCapabilities
|
|
132
|
+
*/
|
|
133
|
+
getCapabilities(): ProviderCapabilities;
|
|
134
|
+
}
|
|
135
|
+
//#endregion
|
|
136
|
+
export { WebhookEvent as a, RefundResult as i, PaymentProvider as n, PaymentResult as r, PaymentIntent as t };
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
//#region src/providers/base.ts
|
|
2
|
+
/**
|
|
3
|
+
* Payment Intent - standardized response from createIntent
|
|
4
|
+
*/
|
|
5
|
+
var PaymentIntent = class {
|
|
6
|
+
id;
|
|
7
|
+
sessionId;
|
|
8
|
+
paymentIntentId;
|
|
9
|
+
provider;
|
|
10
|
+
status;
|
|
11
|
+
amount;
|
|
12
|
+
currency;
|
|
13
|
+
metadata;
|
|
14
|
+
clientSecret;
|
|
15
|
+
paymentUrl;
|
|
16
|
+
instructions;
|
|
17
|
+
raw;
|
|
18
|
+
constructor(data) {
|
|
19
|
+
this.id = data.id;
|
|
20
|
+
this.sessionId = data.sessionId ?? null;
|
|
21
|
+
this.paymentIntentId = data.paymentIntentId ?? null;
|
|
22
|
+
this.provider = data.provider;
|
|
23
|
+
this.status = data.status;
|
|
24
|
+
this.amount = data.amount;
|
|
25
|
+
this.currency = data.currency;
|
|
26
|
+
this.metadata = data.metadata ?? {};
|
|
27
|
+
this.clientSecret = data.clientSecret;
|
|
28
|
+
this.paymentUrl = data.paymentUrl;
|
|
29
|
+
this.instructions = data.instructions;
|
|
30
|
+
this.raw = data.raw;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Payment Result - standardized response from verifyPayment
|
|
35
|
+
*/
|
|
36
|
+
var PaymentResult = class {
|
|
37
|
+
id;
|
|
38
|
+
provider;
|
|
39
|
+
status;
|
|
40
|
+
amount;
|
|
41
|
+
currency;
|
|
42
|
+
paidAt;
|
|
43
|
+
metadata;
|
|
44
|
+
raw;
|
|
45
|
+
constructor(data) {
|
|
46
|
+
this.id = data.id;
|
|
47
|
+
this.provider = data.provider;
|
|
48
|
+
this.status = data.status;
|
|
49
|
+
this.amount = data.amount;
|
|
50
|
+
this.currency = data.currency;
|
|
51
|
+
this.paidAt = data.paidAt;
|
|
52
|
+
this.metadata = data.metadata ?? {};
|
|
53
|
+
this.raw = data.raw;
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Refund Result - standardized response from refund
|
|
58
|
+
*/
|
|
59
|
+
var RefundResult = class {
|
|
60
|
+
id;
|
|
61
|
+
provider;
|
|
62
|
+
status;
|
|
63
|
+
amount;
|
|
64
|
+
currency;
|
|
65
|
+
refundedAt;
|
|
66
|
+
reason;
|
|
67
|
+
metadata;
|
|
68
|
+
raw;
|
|
69
|
+
constructor(data) {
|
|
70
|
+
this.id = data.id;
|
|
71
|
+
this.provider = data.provider;
|
|
72
|
+
this.status = data.status;
|
|
73
|
+
this.amount = data.amount;
|
|
74
|
+
this.currency = data.currency;
|
|
75
|
+
this.refundedAt = data.refundedAt;
|
|
76
|
+
this.reason = data.reason;
|
|
77
|
+
this.metadata = data.metadata ?? {};
|
|
78
|
+
this.raw = data.raw;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Webhook Event - standardized webhook event
|
|
83
|
+
*/
|
|
84
|
+
var WebhookEvent = class {
|
|
85
|
+
id;
|
|
86
|
+
provider;
|
|
87
|
+
type;
|
|
88
|
+
data;
|
|
89
|
+
createdAt;
|
|
90
|
+
raw;
|
|
91
|
+
constructor(data) {
|
|
92
|
+
this.id = data.id;
|
|
93
|
+
this.provider = data.provider;
|
|
94
|
+
this.type = data.type;
|
|
95
|
+
this.data = data.data;
|
|
96
|
+
this.createdAt = data.createdAt;
|
|
97
|
+
this.raw = data.raw;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Base Payment Provider
|
|
102
|
+
* All payment providers must extend this class
|
|
103
|
+
*/
|
|
104
|
+
var PaymentProvider = class {
|
|
105
|
+
config;
|
|
106
|
+
name;
|
|
107
|
+
/** Default currency - injected by Revenue when provider is registered */
|
|
108
|
+
_defaultCurrency = "USD";
|
|
109
|
+
constructor(config = {}) {
|
|
110
|
+
this.config = config;
|
|
111
|
+
this.name = "base";
|
|
112
|
+
if (config.defaultCurrency && typeof config.defaultCurrency === "string") this._defaultCurrency = config.defaultCurrency;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get the default currency for this provider
|
|
116
|
+
* Used when creating PaymentIntent, PaymentResult, RefundResult without explicit currency
|
|
117
|
+
*/
|
|
118
|
+
get defaultCurrency() {
|
|
119
|
+
return this._defaultCurrency;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Set the default currency (called by Revenue when registering provider)
|
|
123
|
+
* @internal
|
|
124
|
+
*/
|
|
125
|
+
setDefaultCurrency(currency) {
|
|
126
|
+
this._defaultCurrency = currency;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Verify webhook signature (optional)
|
|
130
|
+
* @param payload - Webhook payload
|
|
131
|
+
* @param signature - Webhook signature
|
|
132
|
+
* @returns boolean
|
|
133
|
+
*/
|
|
134
|
+
verifyWebhookSignature(_payload, _signature) {
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get provider capabilities
|
|
139
|
+
* @returns ProviderCapabilities
|
|
140
|
+
*/
|
|
141
|
+
getCapabilities() {
|
|
142
|
+
return {
|
|
143
|
+
supportsWebhooks: false,
|
|
144
|
+
supportsRefunds: false,
|
|
145
|
+
supportsPartialRefunds: false,
|
|
146
|
+
requiresManualVerification: true
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
//#endregion
|
|
152
|
+
export { WebhookEvent as a, RefundResult as i, PaymentProvider as n, PaymentResult as r, PaymentIntent as t };
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { t as LIBRARY_CATEGORIES } from "./transaction.enums-pCyMFT4Z.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/core/errors.ts
|
|
4
|
+
/**
|
|
5
|
+
* Base Revenue Error
|
|
6
|
+
*/
|
|
7
|
+
var RevenueError = class extends Error {
|
|
8
|
+
code;
|
|
9
|
+
retryable;
|
|
10
|
+
metadata;
|
|
11
|
+
constructor(message, code, options = {}) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = this.constructor.name;
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.retryable = options.retryable ?? false;
|
|
16
|
+
this.metadata = options.metadata ?? {};
|
|
17
|
+
Error.captureStackTrace(this, this.constructor);
|
|
18
|
+
}
|
|
19
|
+
toJSON() {
|
|
20
|
+
return {
|
|
21
|
+
name: this.name,
|
|
22
|
+
message: this.message,
|
|
23
|
+
code: this.code,
|
|
24
|
+
retryable: this.retryable,
|
|
25
|
+
metadata: this.metadata
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Configuration Errors
|
|
31
|
+
*/
|
|
32
|
+
var ConfigurationError = class extends RevenueError {
|
|
33
|
+
constructor(message, metadata = {}) {
|
|
34
|
+
super(message, "CONFIGURATION_ERROR", {
|
|
35
|
+
retryable: false,
|
|
36
|
+
metadata
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
var ModelNotRegisteredError = class extends ConfigurationError {
|
|
41
|
+
constructor(modelName) {
|
|
42
|
+
super(`Model "${modelName}" is not registered. Register it via createRevenue({ models: { ${modelName}: ... } })`, { modelName });
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Provider Errors
|
|
47
|
+
*/
|
|
48
|
+
var ProviderError = class extends RevenueError {
|
|
49
|
+
constructor(message, code, options = {}) {
|
|
50
|
+
super(message, code, options);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
var ProviderNotFoundError = class extends ProviderError {
|
|
54
|
+
constructor(providerName, availableProviders = []) {
|
|
55
|
+
super(`Payment provider "${providerName}" not found. Available: ${availableProviders.join(", ")}`, "PROVIDER_NOT_FOUND", {
|
|
56
|
+
retryable: false,
|
|
57
|
+
metadata: {
|
|
58
|
+
providerName,
|
|
59
|
+
availableProviders
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
var ProviderCapabilityError = class extends ProviderError {
|
|
65
|
+
constructor(providerName, capability) {
|
|
66
|
+
super(`Provider "${providerName}" does not support ${capability}`, "PROVIDER_CAPABILITY_NOT_SUPPORTED", {
|
|
67
|
+
retryable: false,
|
|
68
|
+
metadata: {
|
|
69
|
+
providerName,
|
|
70
|
+
capability
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
var PaymentIntentCreationError = class extends ProviderError {
|
|
76
|
+
constructor(providerName, originalError) {
|
|
77
|
+
super(`Failed to create payment intent with provider "${providerName}": ${originalError.message}`, "PAYMENT_INTENT_CREATION_FAILED", {
|
|
78
|
+
retryable: true,
|
|
79
|
+
metadata: {
|
|
80
|
+
providerName,
|
|
81
|
+
originalError: originalError.message
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
var PaymentVerificationError = class extends ProviderError {
|
|
87
|
+
constructor(paymentIntentId, reason) {
|
|
88
|
+
super(`Payment verification failed for intent "${paymentIntentId}": ${reason}`, "PAYMENT_VERIFICATION_FAILED", {
|
|
89
|
+
retryable: true,
|
|
90
|
+
metadata: {
|
|
91
|
+
paymentIntentId,
|
|
92
|
+
reason
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Resource Not Found Errors
|
|
99
|
+
*/
|
|
100
|
+
var NotFoundError = class extends RevenueError {
|
|
101
|
+
constructor(message, code, metadata = {}) {
|
|
102
|
+
super(message, code, {
|
|
103
|
+
retryable: false,
|
|
104
|
+
metadata
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
var SubscriptionNotFoundError = class extends NotFoundError {
|
|
109
|
+
constructor(subscriptionId) {
|
|
110
|
+
super(`Subscription not found: ${subscriptionId}`, "SUBSCRIPTION_NOT_FOUND", { subscriptionId });
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
var TransactionNotFoundError = class extends NotFoundError {
|
|
114
|
+
constructor(transactionId) {
|
|
115
|
+
super(`Transaction not found: ${transactionId}`, "TRANSACTION_NOT_FOUND", { transactionId });
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* Validation Errors
|
|
120
|
+
*/
|
|
121
|
+
var ValidationError = class extends RevenueError {
|
|
122
|
+
constructor(message, metadata = {}) {
|
|
123
|
+
super(message, "VALIDATION_ERROR", {
|
|
124
|
+
retryable: false,
|
|
125
|
+
metadata
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
var InvalidAmountError = class extends ValidationError {
|
|
130
|
+
constructor(amount, message) {
|
|
131
|
+
super(message ?? `Invalid amount: ${amount}. Amount must be non-negative`, { amount });
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
var MissingRequiredFieldError = class extends ValidationError {
|
|
135
|
+
constructor(fieldName) {
|
|
136
|
+
super(`Missing required field: ${fieldName}`, { fieldName });
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* State Errors
|
|
141
|
+
*/
|
|
142
|
+
var StateError = class extends RevenueError {
|
|
143
|
+
constructor(message, code, metadata = {}) {
|
|
144
|
+
super(message, code, {
|
|
145
|
+
retryable: false,
|
|
146
|
+
metadata
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
var AlreadyVerifiedError = class extends StateError {
|
|
151
|
+
constructor(transactionId) {
|
|
152
|
+
super(`Transaction ${transactionId} is already verified`, "ALREADY_VERIFIED", { transactionId });
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
var InvalidStateTransitionError = class extends StateError {
|
|
156
|
+
constructor(resourceType, resourceId, fromState, toState) {
|
|
157
|
+
super(`Invalid state transition for ${resourceType} ${resourceId}: ${fromState} → ${toState}`, "INVALID_STATE_TRANSITION", {
|
|
158
|
+
resourceType,
|
|
159
|
+
resourceId,
|
|
160
|
+
fromState,
|
|
161
|
+
toState
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
var SubscriptionNotActiveError = class extends StateError {
|
|
166
|
+
constructor(subscriptionId, message) {
|
|
167
|
+
super(message ?? `Subscription ${subscriptionId} is not active`, "SUBSCRIPTION_NOT_ACTIVE", { subscriptionId });
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
/**
|
|
171
|
+
* Operation Errors
|
|
172
|
+
*/
|
|
173
|
+
var OperationError = class extends RevenueError {
|
|
174
|
+
constructor(message, code, options = {}) {
|
|
175
|
+
super(message, code, options);
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
var RefundNotSupportedError = class extends OperationError {
|
|
179
|
+
constructor(providerName) {
|
|
180
|
+
super(`Refunds are not supported by provider "${providerName}"`, "REFUND_NOT_SUPPORTED", {
|
|
181
|
+
retryable: false,
|
|
182
|
+
metadata: { providerName }
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
var RefundError = class extends OperationError {
|
|
187
|
+
constructor(transactionId, reason) {
|
|
188
|
+
super(`Refund failed for transaction ${transactionId}: ${reason}`, "REFUND_FAILED", {
|
|
189
|
+
retryable: true,
|
|
190
|
+
metadata: {
|
|
191
|
+
transactionId,
|
|
192
|
+
reason
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
/**
|
|
198
|
+
* Error Code Constants
|
|
199
|
+
*/
|
|
200
|
+
const ERROR_CODES = {
|
|
201
|
+
CONFIGURATION_ERROR: "CONFIGURATION_ERROR",
|
|
202
|
+
MODEL_NOT_REGISTERED: "MODEL_NOT_REGISTERED",
|
|
203
|
+
PROVIDER_NOT_FOUND: "PROVIDER_NOT_FOUND",
|
|
204
|
+
PROVIDER_CAPABILITY_NOT_SUPPORTED: "PROVIDER_CAPABILITY_NOT_SUPPORTED",
|
|
205
|
+
PAYMENT_INTENT_CREATION_FAILED: "PAYMENT_INTENT_CREATION_FAILED",
|
|
206
|
+
PAYMENT_VERIFICATION_FAILED: "PAYMENT_VERIFICATION_FAILED",
|
|
207
|
+
SUBSCRIPTION_NOT_FOUND: "SUBSCRIPTION_NOT_FOUND",
|
|
208
|
+
TRANSACTION_NOT_FOUND: "TRANSACTION_NOT_FOUND",
|
|
209
|
+
VALIDATION_ERROR: "VALIDATION_ERROR",
|
|
210
|
+
INVALID_AMOUNT: "INVALID_AMOUNT",
|
|
211
|
+
MISSING_REQUIRED_FIELD: "MISSING_REQUIRED_FIELD",
|
|
212
|
+
ALREADY_VERIFIED: "ALREADY_VERIFIED",
|
|
213
|
+
INVALID_STATE_TRANSITION: "INVALID_STATE_TRANSITION",
|
|
214
|
+
SUBSCRIPTION_NOT_ACTIVE: "SUBSCRIPTION_NOT_ACTIVE",
|
|
215
|
+
REFUND_NOT_SUPPORTED: "REFUND_NOT_SUPPORTED",
|
|
216
|
+
REFUND_FAILED: "REFUND_FAILED"
|
|
217
|
+
};
|
|
218
|
+
/**
|
|
219
|
+
* Check if error is retryable
|
|
220
|
+
*/
|
|
221
|
+
function isRetryable(error) {
|
|
222
|
+
return error instanceof RevenueError && error.retryable;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Check if error is from revenue package
|
|
226
|
+
*/
|
|
227
|
+
function isRevenueError(error) {
|
|
228
|
+
return error instanceof RevenueError;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
//#endregion
|
|
232
|
+
//#region src/shared/utils/validators/category-resolver.ts
|
|
233
|
+
/**
|
|
234
|
+
* Category Resolver Utility
|
|
235
|
+
* @classytic/revenue
|
|
236
|
+
*
|
|
237
|
+
* Resolves transaction category based on categoryMappings
|
|
238
|
+
*/
|
|
239
|
+
/**
|
|
240
|
+
* Resolve category for a transaction based on entity and monetizationType
|
|
241
|
+
*
|
|
242
|
+
* Resolution Logic:
|
|
243
|
+
* 1. If categoryMappings[entity] exists → use it
|
|
244
|
+
* 2. Otherwise → fall back to default library category
|
|
245
|
+
*
|
|
246
|
+
* @param entity - The logical entity/identifier (e.g., 'Order', 'PlatformSubscription', 'Membership')
|
|
247
|
+
* NOTE: This is NOT a database model name - it's just a logical identifier
|
|
248
|
+
* @param monetizationType - The monetization type ('subscription', 'purchase', 'free')
|
|
249
|
+
* @param categoryMappings - User-defined category mappings from config
|
|
250
|
+
* @returns Category name for the transaction
|
|
251
|
+
*
|
|
252
|
+
* @example
|
|
253
|
+
* // With mapping defined
|
|
254
|
+
* resolveCategory('Order', 'subscription', { Order: 'order_subscription' })
|
|
255
|
+
* // Returns: 'order_subscription'
|
|
256
|
+
*
|
|
257
|
+
* @example
|
|
258
|
+
* // Without mapping, falls back to library default
|
|
259
|
+
* resolveCategory('Order', 'subscription', {})
|
|
260
|
+
* // Returns: 'subscription'
|
|
261
|
+
*
|
|
262
|
+
* @example
|
|
263
|
+
* // Different entities with different mappings
|
|
264
|
+
* const mappings = {
|
|
265
|
+
* Order: 'order_subscription',
|
|
266
|
+
* PlatformSubscription: 'platform_subscription',
|
|
267
|
+
* TenantUpgrade: 'tenant_upgrade',
|
|
268
|
+
* Membership: 'gym_membership',
|
|
269
|
+
* Enrollment: 'course_enrollment',
|
|
270
|
+
* };
|
|
271
|
+
* resolveCategory('PlatformSubscription', 'subscription', mappings)
|
|
272
|
+
* // Returns: 'platform_subscription'
|
|
273
|
+
*/
|
|
274
|
+
function resolveCategory(entity, monetizationType, categoryMappings = {}) {
|
|
275
|
+
if (entity && categoryMappings[entity]) return categoryMappings[entity];
|
|
276
|
+
switch (monetizationType) {
|
|
277
|
+
case "subscription": return LIBRARY_CATEGORIES.SUBSCRIPTION;
|
|
278
|
+
case "purchase": return LIBRARY_CATEGORIES.PURCHASE;
|
|
279
|
+
default: return LIBRARY_CATEGORIES.SUBSCRIPTION;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
//#endregion
|
|
284
|
+
export { ValidationError as C, TransactionNotFoundError as S, isRevenueError as T, RefundNotSupportedError as _, InvalidAmountError as a, SubscriptionNotActiveError as b, ModelNotRegisteredError as c, PaymentIntentCreationError as d, PaymentVerificationError as f, RefundError as g, ProviderNotFoundError as h, ERROR_CODES as i, NotFoundError as l, ProviderError as m, AlreadyVerifiedError as n, InvalidStateTransitionError as o, ProviderCapabilityError as p, ConfigurationError as r, MissingRequiredFieldError as s, resolveCategory as t, OperationError as u, RevenueError as v, isRetryable as w, SubscriptionNotFoundError as x, StateError as y };
|