@classytic/revenue 1.0.0 → 1.0.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.
- package/LICENSE +21 -21
- package/README.md +1 -1
- package/dist/core/index.d.ts +10 -4
- package/dist/core/index.js +6 -12
- package/dist/core/index.js.map +1 -1
- package/dist/enums/index.d.ts +4 -4
- package/dist/enums/index.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +6 -12
- package/dist/index.js.map +1 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/schemas/index.d.ts +7 -7
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/validation.d.ts +4 -4
- package/dist/schemas/validation.js.map +1 -1
- package/dist/services/index.js.map +1 -1
- package/dist/{split.enums-DHdM1YAV.d.ts → split.enums-Bh24jw8p.d.ts} +3 -3
- package/dist/{split.schema-BPdFZMbU.d.ts → split.schema-DYVP7Wu2.d.ts} +6 -6
- package/dist/utils/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/container.ts","../src/core/events.ts","../src/core/plugin.ts","../src/core/result.ts","../src/utils/idempotency.ts","../src/utils/retry.ts","../src/core/errors.ts","../src/utils/hooks.ts","../src/enums/transaction.enums.ts","../src/utils/category-resolver.ts","../src/utils/commission.ts","../src/enums/monetization.enums.ts","../src/services/monetization.service.ts","../src/services/payment.service.ts","../src/services/transaction.service.ts","../src/enums/escrow.enums.ts","../src/enums/split.enums.ts","../src/utils/commission-split.ts","../src/services/escrow.service.ts","../src/providers/base.ts","../src/core/revenue.ts","../src/utils/money.ts","../src/schemas/validation.ts","../src/enums/payment.enums.ts","../src/enums/subscription.enums.ts","../src/schemas/transaction/common.schema.ts","../src/schemas/transaction/gateway.schema.ts","../src/schemas/transaction/payment.schema.ts","../src/schemas/transaction/commission.schema.ts","../src/schemas/subscription/plan.schema.ts","../src/schemas/subscription/info.schema.ts","../src/schemas/escrow/hold.schema.ts","../src/schemas/split/split.schema.ts","../src/utils/transaction-type.ts","../src/utils/logger.ts","../src/utils/subscription/period.ts","../src/utils/subscription/actions.ts","../src/index.ts"],"names":["instance","err","record","logger","nanoid","Schema","date"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Dependency Injection Container\r\n * @classytic/revenue\r\n *\r\n * Lightweight DI container for managing dependencies\r\n * Inspired by: Awilix, InversifyJS but much simpler\r\n */\r\n\r\ninterface ServiceRegistration<T = unknown> {\r\n implementation: T | ((container: Container) => T);\r\n singleton: boolean;\r\n factory: boolean;\r\n}\r\n\r\nexport class Container {\r\n private _services: Map<string, ServiceRegistration>;\r\n private _singletons: Map<string, unknown>;\r\n\r\n constructor() {\r\n this._services = new Map();\r\n this._singletons = new Map();\r\n }\r\n\r\n /**\r\n * Register a service\r\n * @param name - Service name\r\n * @param implementation - Service implementation or factory\r\n * @param options - Registration options\r\n */\r\n register<T>(\r\n name: string,\r\n implementation: T | ((container: Container) => T),\r\n options: { singleton?: boolean; factory?: boolean } = {}\r\n ): this {\r\n this._services.set(name, {\r\n implementation,\r\n singleton: options.singleton !== false, // Default to singleton\r\n factory: options.factory ?? false,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Register a singleton service\r\n * @param name - Service name\r\n * @param implementation - Service implementation\r\n */\r\n singleton<T>(name: string, implementation: T): this {\r\n return this.register(name, implementation, { singleton: true });\r\n }\r\n\r\n /**\r\n * Register a transient service (new instance each time)\r\n * @param name - Service name\r\n * @param factory - Factory function\r\n */\r\n transient<T>(name: string, factory: (container: Container) => T): this {\r\n return this.register(name, factory, { singleton: false, factory: true });\r\n }\r\n\r\n /**\r\n * Get a service from the container\r\n * @param name - Service name\r\n * @returns Service instance\r\n */\r\n get<T>(name: string): T {\r\n // Check if already instantiated as singleton\r\n if (this._singletons.has(name)) {\r\n return this._singletons.get(name) as T;\r\n }\r\n\r\n const service = this._services.get(name);\r\n if (!service) {\r\n throw new Error(`Service \"${name}\" not registered in container`);\r\n }\r\n\r\n // Handle factory functions\r\n if (service.factory) {\r\n const factory = service.implementation as (container: Container) => T;\r\n const instance = factory(this);\r\n if (service.singleton) {\r\n this._singletons.set(name, instance);\r\n }\r\n return instance;\r\n }\r\n\r\n // Handle direct values\r\n const instance = service.implementation as T;\r\n if (service.singleton) {\r\n this._singletons.set(name, instance);\r\n }\r\n return instance;\r\n }\r\n\r\n /**\r\n * Check if service is registered\r\n * @param name - Service name\r\n */\r\n has(name: string): boolean {\r\n return this._services.has(name);\r\n }\r\n\r\n /**\r\n * Get all registered service names\r\n */\r\n keys(): string[] {\r\n return Array.from(this._services.keys());\r\n }\r\n\r\n /**\r\n * Clear all services (useful for testing)\r\n */\r\n clear(): void {\r\n this._services.clear();\r\n this._singletons.clear();\r\n }\r\n\r\n /**\r\n * Create a child container (for scoped dependencies)\r\n */\r\n createScope(): Container {\r\n const scope = new Container();\r\n // Copy parent services\r\n this._services.forEach((value, key) => {\r\n scope._services.set(key, value);\r\n });\r\n return scope;\r\n }\r\n}\r\n\r\nexport default Container;\r\n\r\n","/**\r\n * Event System - Type-safe pub/sub\r\n * @classytic/revenue\r\n *\r\n * Strongly typed events with async handlers\r\n * Inspired by: Node.js EventEmitter, mitt, EventTarget\r\n */\r\n\r\nimport type { TransactionDocument, SubscriptionDocument } from '../types/index.js';\r\nimport type { PaymentResult, RefundResult } from '../providers/base.js';\r\n\r\n// ============ EVENT DEFINITIONS ============\r\n\r\n/**\r\n * All revenue events with their payload types\r\n */\r\nexport interface RevenueEvents {\r\n // Payment events\r\n 'payment.initiated': PaymentInitiatedEvent;\r\n 'payment.succeeded': PaymentSucceededEvent;\r\n 'payment.failed': PaymentFailedEvent;\r\n 'payment.refunded': PaymentRefundedEvent;\r\n \r\n // Subscription events\r\n 'subscription.created': SubscriptionCreatedEvent;\r\n 'subscription.activated': SubscriptionActivatedEvent;\r\n 'subscription.renewed': SubscriptionRenewedEvent;\r\n 'subscription.cancelled': SubscriptionCancelledEvent;\r\n 'subscription.paused': SubscriptionPausedEvent;\r\n 'subscription.resumed': SubscriptionResumedEvent;\r\n 'subscription.expired': SubscriptionExpiredEvent;\r\n \r\n // Transaction events\r\n 'transaction.created': TransactionCreatedEvent;\r\n 'transaction.verified': TransactionVerifiedEvent;\r\n 'transaction.completed': TransactionCompletedEvent;\r\n 'transaction.failed': TransactionFailedEvent;\r\n \r\n // Escrow events\r\n 'escrow.held': EscrowHeldEvent;\r\n 'escrow.released': EscrowReleasedEvent;\r\n 'escrow.cancelled': EscrowCancelledEvent;\r\n \r\n // Commission events\r\n 'commission.calculated': CommissionCalculatedEvent;\r\n 'commission.paid': CommissionPaidEvent;\r\n \r\n // Webhook events\r\n 'webhook.received': WebhookReceivedEvent;\r\n 'webhook.processed': WebhookProcessedEvent;\r\n \r\n // Wildcard - catches all events\r\n '*': BaseEvent;\r\n}\r\n\r\n// ============ EVENT PAYLOADS ============\r\n\r\nexport interface BaseEvent {\r\n readonly type: string;\r\n readonly timestamp: Date;\r\n readonly metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface PaymentInitiatedEvent extends BaseEvent {\r\n type: 'payment.initiated';\r\n transactionId: string;\r\n amount: number;\r\n currency: string;\r\n provider: string;\r\n intentId: string;\r\n}\r\n\r\nexport interface PaymentSucceededEvent extends BaseEvent {\r\n type: 'payment.succeeded';\r\n transactionId: string;\r\n transaction: TransactionDocument;\r\n result: PaymentResult;\r\n}\r\n\r\nexport interface PaymentFailedEvent extends BaseEvent {\r\n type: 'payment.failed';\r\n transactionId: string;\r\n error: Error;\r\n provider: string;\r\n}\r\n\r\nexport interface PaymentRefundedEvent extends BaseEvent {\r\n type: 'payment.refunded';\r\n transactionId: string;\r\n result: RefundResult;\r\n amount: number;\r\n isPartial: boolean;\r\n}\r\n\r\nexport interface SubscriptionCreatedEvent extends BaseEvent {\r\n type: 'subscription.created';\r\n subscriptionId: string;\r\n subscription: SubscriptionDocument;\r\n transactionId?: string;\r\n}\r\n\r\nexport interface SubscriptionActivatedEvent extends BaseEvent {\r\n type: 'subscription.activated';\r\n subscriptionId: string;\r\n subscription: SubscriptionDocument;\r\n transactionId: string;\r\n}\r\n\r\nexport interface SubscriptionRenewedEvent extends BaseEvent {\r\n type: 'subscription.renewed';\r\n subscriptionId: string;\r\n subscription: SubscriptionDocument;\r\n transactionId: string;\r\n period: { start: Date; end: Date };\r\n}\r\n\r\nexport interface SubscriptionCancelledEvent extends BaseEvent {\r\n type: 'subscription.cancelled';\r\n subscriptionId: string;\r\n subscription: SubscriptionDocument;\r\n reason?: string;\r\n immediate: boolean;\r\n}\r\n\r\nexport interface SubscriptionPausedEvent extends BaseEvent {\r\n type: 'subscription.paused';\r\n subscriptionId: string;\r\n subscription: SubscriptionDocument;\r\n resumeAt?: Date;\r\n}\r\n\r\nexport interface SubscriptionResumedEvent extends BaseEvent {\r\n type: 'subscription.resumed';\r\n subscriptionId: string;\r\n subscription: SubscriptionDocument;\r\n}\r\n\r\nexport interface SubscriptionExpiredEvent extends BaseEvent {\r\n type: 'subscription.expired';\r\n subscriptionId: string;\r\n subscription: SubscriptionDocument;\r\n}\r\n\r\nexport interface TransactionCreatedEvent extends BaseEvent {\r\n type: 'transaction.created';\r\n transactionId: string;\r\n transaction: TransactionDocument;\r\n}\r\n\r\nexport interface TransactionVerifiedEvent extends BaseEvent {\r\n type: 'transaction.verified';\r\n transactionId: string;\r\n transaction: TransactionDocument;\r\n}\r\n\r\nexport interface TransactionCompletedEvent extends BaseEvent {\r\n type: 'transaction.completed';\r\n transactionId: string;\r\n transaction: TransactionDocument;\r\n}\r\n\r\nexport interface TransactionFailedEvent extends BaseEvent {\r\n type: 'transaction.failed';\r\n transactionId: string;\r\n error: Error;\r\n}\r\n\r\nexport interface EscrowHeldEvent extends BaseEvent {\r\n type: 'escrow.held';\r\n transactionId: string;\r\n amount: number;\r\n holdUntil?: Date;\r\n}\r\n\r\nexport interface EscrowReleasedEvent extends BaseEvent {\r\n type: 'escrow.released';\r\n transactionId: string;\r\n releasedAmount: number;\r\n recipientId: string;\r\n}\r\n\r\nexport interface EscrowCancelledEvent extends BaseEvent {\r\n type: 'escrow.cancelled';\r\n transactionId: string;\r\n reason: string;\r\n}\r\n\r\nexport interface CommissionCalculatedEvent extends BaseEvent {\r\n type: 'commission.calculated';\r\n transactionId: string;\r\n grossAmount: number;\r\n netAmount: number;\r\n platformFee: number;\r\n gatewayFee: number;\r\n}\r\n\r\nexport interface CommissionPaidEvent extends BaseEvent {\r\n type: 'commission.paid';\r\n transactionId: string;\r\n recipientId: string;\r\n amount: number;\r\n}\r\n\r\nexport interface WebhookReceivedEvent extends BaseEvent {\r\n type: 'webhook.received';\r\n provider: string;\r\n eventType: string;\r\n payload: unknown;\r\n}\r\n\r\nexport interface WebhookProcessedEvent extends BaseEvent {\r\n type: 'webhook.processed';\r\n provider: string;\r\n eventType: string;\r\n transactionId?: string;\r\n success: boolean;\r\n}\r\n\r\n// ============ EVENT BUS ============\r\n\r\ntype EventHandler<T> = (event: T) => void | Promise<void>;\r\ntype EventKey = keyof RevenueEvents;\r\n\r\n/**\r\n * Type-safe event bus\r\n */\r\nexport class EventBus {\r\n private handlers = new Map<string, Set<EventHandler<any>>>();\r\n private onceHandlers = new Map<string, Set<EventHandler<any>>>();\r\n\r\n /**\r\n * Subscribe to an event\r\n */\r\n on<K extends EventKey>(\r\n event: K,\r\n handler: EventHandler<RevenueEvents[K]>\r\n ): () => void {\r\n if (!this.handlers.has(event)) {\r\n this.handlers.set(event, new Set());\r\n }\r\n this.handlers.get(event)!.add(handler);\r\n \r\n // Return unsubscribe function\r\n return () => this.off(event, handler);\r\n }\r\n\r\n /**\r\n * Subscribe to an event once\r\n */\r\n once<K extends EventKey>(\r\n event: K,\r\n handler: EventHandler<RevenueEvents[K]>\r\n ): () => void {\r\n if (!this.onceHandlers.has(event)) {\r\n this.onceHandlers.set(event, new Set());\r\n }\r\n this.onceHandlers.get(event)!.add(handler);\r\n \r\n return () => this.onceHandlers.get(event)?.delete(handler);\r\n }\r\n\r\n /**\r\n * Unsubscribe from an event\r\n */\r\n off<K extends EventKey>(\r\n event: K,\r\n handler: EventHandler<RevenueEvents[K]>\r\n ): void {\r\n this.handlers.get(event)?.delete(handler);\r\n this.onceHandlers.get(event)?.delete(handler);\r\n }\r\n\r\n /**\r\n * Emit an event (fire and forget, non-blocking)\r\n */\r\n emit<K extends EventKey>(event: K, payload: Omit<RevenueEvents[K], 'timestamp'>): void {\r\n const fullPayload = {\r\n ...payload,\r\n timestamp: new Date(),\r\n } as RevenueEvents[K];\r\n\r\n // Regular handlers\r\n const handlers = this.handlers.get(event);\r\n if (handlers) {\r\n for (const handler of handlers) {\r\n // Fire and forget - don't await\r\n Promise.resolve(handler(fullPayload)).catch(err => {\r\n console.error(`[Revenue] Event handler error for \"${event}\":`, err);\r\n });\r\n }\r\n }\r\n\r\n // Once handlers\r\n const onceHandlers = this.onceHandlers.get(event);\r\n if (onceHandlers) {\r\n for (const handler of onceHandlers) {\r\n Promise.resolve(handler(fullPayload)).catch(err => {\r\n console.error(`[Revenue] Once handler error for \"${event}\":`, err);\r\n });\r\n }\r\n this.onceHandlers.delete(event);\r\n }\r\n\r\n // Wildcard handlers\r\n if (event !== '*') {\r\n const wildcardHandlers = this.handlers.get('*');\r\n if (wildcardHandlers) {\r\n for (const handler of wildcardHandlers) {\r\n Promise.resolve(handler(fullPayload)).catch(err => {\r\n console.error(`[Revenue] Wildcard handler error:`, err);\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Emit and wait for all handlers to complete\r\n */\r\n async emitAsync<K extends EventKey>(\r\n event: K,\r\n payload: Omit<RevenueEvents[K], 'timestamp'>\r\n ): Promise<void> {\r\n const fullPayload = {\r\n ...payload,\r\n timestamp: new Date(),\r\n } as RevenueEvents[K];\r\n\r\n const promises: Promise<void>[] = [];\r\n\r\n const handlers = this.handlers.get(event);\r\n if (handlers) {\r\n for (const handler of handlers) {\r\n promises.push(Promise.resolve(handler(fullPayload)));\r\n }\r\n }\r\n\r\n const onceHandlers = this.onceHandlers.get(event);\r\n if (onceHandlers) {\r\n for (const handler of onceHandlers) {\r\n promises.push(Promise.resolve(handler(fullPayload)));\r\n }\r\n this.onceHandlers.delete(event);\r\n }\r\n\r\n if (event !== '*') {\r\n const wildcardHandlers = this.handlers.get('*');\r\n if (wildcardHandlers) {\r\n for (const handler of wildcardHandlers) {\r\n promises.push(Promise.resolve(handler(fullPayload)));\r\n }\r\n }\r\n }\r\n\r\n await Promise.all(promises);\r\n }\r\n\r\n /**\r\n * Remove all handlers\r\n */\r\n clear(): void {\r\n this.handlers.clear();\r\n this.onceHandlers.clear();\r\n }\r\n\r\n /**\r\n * Get handler count for an event\r\n */\r\n listenerCount(event: EventKey): number {\r\n return (this.handlers.get(event)?.size ?? 0) + \r\n (this.onceHandlers.get(event)?.size ?? 0);\r\n }\r\n}\r\n\r\n/**\r\n * Create a new event bus\r\n */\r\nexport function createEventBus(): EventBus {\r\n return new EventBus();\r\n}\r\n\r\nexport default EventBus;\r\n\r\n","/**\r\n * Plugin System\r\n * @classytic/revenue\r\n *\r\n * Composable, type-safe plugin architecture\r\n * Inspired by: Hono middleware, Fastify plugins, Redux middleware\r\n */\r\n\r\nimport type { EventBus, RevenueEvents } from './events.js';\r\n\r\n// ============ PLUGIN TYPES ============\r\n\r\n/**\r\n * Plugin context passed to hooks\r\n */\r\nexport interface PluginContext {\r\n /** Event bus for emitting events */\r\n events: EventBus;\r\n /** Logger instance */\r\n logger: PluginLogger;\r\n /** Get registered service */\r\n get<T>(key: string): T;\r\n /** Plugin-specific storage */\r\n storage: Map<string, unknown>;\r\n /** Request metadata */\r\n meta: {\r\n idempotencyKey?: string;\r\n requestId: string;\r\n timestamp: Date;\r\n [key: string]: unknown;\r\n };\r\n}\r\n\r\n/**\r\n * Plugin logger interface\r\n */\r\nexport interface PluginLogger {\r\n debug(message: string, data?: unknown): void;\r\n info(message: string, data?: unknown): void;\r\n warn(message: string, data?: unknown): void;\r\n error(message: string, data?: unknown): void;\r\n}\r\n\r\n/**\r\n * Hook function type\r\n */\r\nexport type HookFn<TInput = unknown, TOutput = unknown> = (\r\n ctx: PluginContext,\r\n input: TInput,\r\n next: () => Promise<TOutput>\r\n) => Promise<TOutput>;\r\n\r\n/**\r\n * Available hook points\r\n */\r\nexport interface PluginHooks {\r\n // Payment hooks\r\n 'payment.create.before': HookFn<PaymentCreateInput>;\r\n 'payment.create.after': HookFn<PaymentCreateInput, PaymentCreateOutput>;\r\n 'payment.verify.before': HookFn<PaymentVerifyInput>;\r\n 'payment.verify.after': HookFn<PaymentVerifyInput, PaymentVerifyOutput>;\r\n 'payment.refund.before': HookFn<RefundInput>;\r\n 'payment.refund.after': HookFn<RefundInput, RefundOutput>;\r\n \r\n // Subscription hooks\r\n 'subscription.create.before': HookFn<SubscriptionCreateInput>;\r\n 'subscription.create.after': HookFn<SubscriptionCreateInput, SubscriptionCreateOutput>;\r\n 'subscription.cancel.before': HookFn<SubscriptionCancelInput>;\r\n 'subscription.cancel.after': HookFn<SubscriptionCancelInput, SubscriptionCancelOutput>;\r\n \r\n // Transaction hooks\r\n 'transaction.create.before': HookFn<TransactionCreateInput>;\r\n 'transaction.create.after': HookFn<TransactionCreateInput, TransactionCreateOutput>;\r\n \r\n // Escrow hooks\r\n 'escrow.hold.before': HookFn<EscrowHoldInput>;\r\n 'escrow.hold.after': HookFn<EscrowHoldInput, EscrowHoldOutput>;\r\n 'escrow.release.before': HookFn<EscrowReleaseInput>;\r\n 'escrow.release.after': HookFn<EscrowReleaseInput, EscrowReleaseOutput>;\r\n}\r\n\r\n// Simplified input/output types for hooks\r\ninterface PaymentCreateInput { amount: number; currency: string; [key: string]: unknown }\r\ninterface PaymentCreateOutput { transactionId: string; intentId: string; [key: string]: unknown }\r\ninterface PaymentVerifyInput { id: string; [key: string]: unknown }\r\ninterface PaymentVerifyOutput { verified: boolean; [key: string]: unknown }\r\ninterface RefundInput { transactionId: string; amount?: number; [key: string]: unknown }\r\ninterface RefundOutput { refundId: string; [key: string]: unknown }\r\ninterface SubscriptionCreateInput { planKey: string; [key: string]: unknown }\r\ninterface SubscriptionCreateOutput { subscriptionId: string; [key: string]: unknown }\r\ninterface SubscriptionCancelInput { subscriptionId: string; [key: string]: unknown }\r\ninterface SubscriptionCancelOutput { cancelled: boolean; [key: string]: unknown }\r\ninterface TransactionCreateInput { amount: number; [key: string]: unknown }\r\ninterface TransactionCreateOutput { transactionId: string; [key: string]: unknown }\r\ninterface EscrowHoldInput { transactionId: string; [key: string]: unknown }\r\ninterface EscrowHoldOutput { held: boolean; [key: string]: unknown }\r\ninterface EscrowReleaseInput { transactionId: string; [key: string]: unknown }\r\ninterface EscrowReleaseOutput { released: boolean; [key: string]: unknown }\r\n\r\n/**\r\n * Plugin definition\r\n */\r\nexport interface RevenuePlugin {\r\n /** Unique plugin name */\r\n name: string;\r\n /** Plugin version */\r\n version?: string;\r\n /** Plugin description */\r\n description?: string;\r\n /** Dependencies on other plugins */\r\n dependencies?: string[];\r\n /** Hook implementations */\r\n hooks?: Partial<PluginHooks>;\r\n /** Event listeners */\r\n events?: Partial<{\r\n [K in keyof RevenueEvents]: (event: RevenueEvents[K]) => void | Promise<void>;\r\n }>;\r\n /** Initialize plugin */\r\n init?: (ctx: PluginContext) => void | Promise<void>;\r\n /** Cleanup plugin */\r\n destroy?: () => void | Promise<void>;\r\n}\r\n\r\n// ============ PLUGIN MANAGER ============\r\n\r\n/**\r\n * Plugin manager - handles registration and execution\r\n */\r\nexport class PluginManager {\r\n private plugins = new Map<string, RevenuePlugin>();\r\n private hooks = new Map<string, HookFn[]>();\r\n private initialized = false;\r\n\r\n /**\r\n * Register a plugin\r\n */\r\n register(plugin: RevenuePlugin): this {\r\n if (this.plugins.has(plugin.name)) {\r\n throw new Error(`Plugin \"${plugin.name}\" is already registered`);\r\n }\r\n\r\n // Check dependencies\r\n if (plugin.dependencies) {\r\n for (const dep of plugin.dependencies) {\r\n if (!this.plugins.has(dep)) {\r\n throw new Error(\r\n `Plugin \"${plugin.name}\" requires \"${dep}\" to be registered first`\r\n );\r\n }\r\n }\r\n }\r\n\r\n this.plugins.set(plugin.name, plugin);\r\n\r\n // Register hooks\r\n if (plugin.hooks) {\r\n for (const [hookName, hookFn] of Object.entries(plugin.hooks)) {\r\n if (!this.hooks.has(hookName)) {\r\n this.hooks.set(hookName, []);\r\n }\r\n this.hooks.get(hookName)!.push(hookFn as HookFn);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Initialize all plugins\r\n */\r\n async init(ctx: PluginContext): Promise<void> {\r\n if (this.initialized) return;\r\n\r\n for (const plugin of this.plugins.values()) {\r\n if (plugin.init) {\r\n await plugin.init(ctx);\r\n }\r\n\r\n // Register event listeners\r\n if (plugin.events) {\r\n for (const [event, handler] of Object.entries(plugin.events)) {\r\n ctx.events.on(event as keyof RevenueEvents, handler as any);\r\n }\r\n }\r\n }\r\n\r\n this.initialized = true;\r\n }\r\n\r\n /**\r\n * Execute a hook chain\r\n */\r\n async executeHook<TInput, TOutput>(\r\n hookName: string,\r\n ctx: PluginContext,\r\n input: TInput,\r\n execute: () => Promise<TOutput>\r\n ): Promise<TOutput> {\r\n const hooks = this.hooks.get(hookName) ?? [];\r\n \r\n if (hooks.length === 0) {\r\n return execute();\r\n }\r\n\r\n // Build middleware chain\r\n let index = 0;\r\n const next = async (): Promise<TOutput> => {\r\n if (index >= hooks.length) {\r\n return execute();\r\n }\r\n const hook = hooks[index++];\r\n return hook(ctx, input, next) as Promise<TOutput>;\r\n };\r\n\r\n return next();\r\n }\r\n\r\n /**\r\n * Check if plugin is registered\r\n */\r\n has(name: string): boolean {\r\n return this.plugins.has(name);\r\n }\r\n\r\n /**\r\n * Get a plugin by name\r\n */\r\n get(name: string): RevenuePlugin | undefined {\r\n return this.plugins.get(name);\r\n }\r\n\r\n /**\r\n * Get all registered plugins\r\n */\r\n list(): RevenuePlugin[] {\r\n return Array.from(this.plugins.values());\r\n }\r\n\r\n /**\r\n * Destroy all plugins\r\n */\r\n async destroy(): Promise<void> {\r\n for (const plugin of this.plugins.values()) {\r\n if (plugin.destroy) {\r\n await plugin.destroy();\r\n }\r\n }\r\n this.plugins.clear();\r\n this.hooks.clear();\r\n this.initialized = false;\r\n }\r\n}\r\n\r\n// ============ BUILT-IN PLUGINS ============\r\n\r\n/**\r\n * Logging plugin - logs all operations\r\n */\r\nexport function loggingPlugin(options: { level?: 'debug' | 'info' } = {}): RevenuePlugin {\r\n const level = options.level ?? 'info';\r\n \r\n return {\r\n name: 'logging',\r\n version: '1.0.0',\r\n description: 'Logs all revenue operations',\r\n hooks: {\r\n 'payment.create.before': async (ctx, input, next) => {\r\n ctx.logger[level]('Creating payment', { amount: input.amount, currency: input.currency });\r\n const result = await next();\r\n ctx.logger[level]('Payment created', { transactionId: (result as any)?.transactionId });\r\n return result;\r\n },\r\n 'payment.verify.before': async (ctx, input, next) => {\r\n ctx.logger[level]('Verifying payment', { id: input.id });\r\n const result = await next();\r\n ctx.logger[level]('Payment verified', { verified: (result as any)?.verified });\r\n return result;\r\n },\r\n 'payment.refund.before': async (ctx, input, next) => {\r\n ctx.logger[level]('Processing refund', { transactionId: input.transactionId, amount: input.amount });\r\n const result = await next();\r\n ctx.logger[level]('Refund processed', { refundId: (result as any)?.refundId });\r\n return result;\r\n },\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Audit plugin - records all operations for compliance\r\n */\r\nexport function auditPlugin(options: { \r\n store?: (entry: AuditEntry) => Promise<void> \r\n} = {}): RevenuePlugin {\r\n const entries: AuditEntry[] = [];\r\n \r\n const store = options.store ?? (async (entry: AuditEntry) => {\r\n entries.push(entry);\r\n });\r\n\r\n return {\r\n name: 'audit',\r\n version: '1.0.0',\r\n description: 'Audit trail for all operations',\r\n hooks: {\r\n 'payment.create.after': async (ctx, input, next) => {\r\n const result = await next();\r\n await store({\r\n action: 'payment.create',\r\n requestId: ctx.meta.requestId,\r\n timestamp: ctx.meta.timestamp,\r\n input: sanitizeInput(input),\r\n output: sanitizeOutput(result),\r\n idempotencyKey: ctx.meta.idempotencyKey,\r\n });\r\n return result;\r\n },\r\n 'payment.refund.after': async (ctx, input, next) => {\r\n const result = await next();\r\n await store({\r\n action: 'payment.refund',\r\n requestId: ctx.meta.requestId,\r\n timestamp: ctx.meta.timestamp,\r\n input: sanitizeInput(input),\r\n output: sanitizeOutput(result),\r\n idempotencyKey: ctx.meta.idempotencyKey,\r\n });\r\n return result;\r\n },\r\n },\r\n };\r\n}\r\n\r\ninterface AuditEntry {\r\n action: string;\r\n requestId: string;\r\n timestamp: Date;\r\n input: Record<string, unknown>;\r\n output: Record<string, unknown>;\r\n idempotencyKey?: string;\r\n}\r\n\r\nfunction sanitizeInput(input: unknown): Record<string, unknown> {\r\n if (typeof input !== 'object' || !input) return {};\r\n const sanitized = { ...input } as Record<string, unknown>;\r\n // Remove sensitive fields\r\n delete sanitized.apiKey;\r\n delete sanitized.secretKey;\r\n delete sanitized.password;\r\n return sanitized;\r\n}\r\n\r\nfunction sanitizeOutput(output: unknown): Record<string, unknown> {\r\n if (typeof output !== 'object' || !output) return {};\r\n return { ...output } as Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Metrics plugin - collects operation metrics\r\n */\r\nexport function metricsPlugin(options: {\r\n onMetric?: (metric: Metric) => void;\r\n} = {}): RevenuePlugin {\r\n const metrics: Metric[] = [];\r\n \r\n const record = options.onMetric ?? ((metric: Metric) => {\r\n metrics.push(metric);\r\n });\r\n\r\n return {\r\n name: 'metrics',\r\n version: '1.0.0',\r\n description: 'Collects operation metrics',\r\n hooks: {\r\n 'payment.create.before': async (_ctx, input, next) => {\r\n const start = Date.now();\r\n try {\r\n const result = await next();\r\n record({\r\n name: 'payment.create',\r\n duration: Date.now() - start,\r\n success: true,\r\n amount: input.amount,\r\n currency: input.currency,\r\n });\r\n return result;\r\n } catch (error) {\r\n record({\r\n name: 'payment.create',\r\n duration: Date.now() - start,\r\n success: false,\r\n error: (error as Error).message,\r\n });\r\n throw error;\r\n }\r\n },\r\n },\r\n };\r\n}\r\n\r\ninterface Metric {\r\n name: string;\r\n duration: number;\r\n success: boolean;\r\n error?: string;\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Create a custom plugin\r\n */\r\nexport function definePlugin(plugin: RevenuePlugin): RevenuePlugin {\r\n return plugin;\r\n}\r\n\r\nexport default PluginManager;\r\n\r\n","/**\r\n * Result Type - Rust-inspired error handling\r\n * @classytic/revenue\r\n *\r\n * No more try/catch - explicit, type-safe error handling\r\n * Inspired by: Rust Result<T, E>, neverthrow, Effect-TS\r\n */\r\n\r\n/**\r\n * Success result\r\n */\r\nexport interface Ok<T> {\r\n readonly ok: true;\r\n readonly value: T;\r\n readonly error?: never;\r\n}\r\n\r\n/**\r\n * Error result\r\n */\r\nexport interface Err<E> {\r\n readonly ok: false;\r\n readonly error: E;\r\n readonly value?: never;\r\n}\r\n\r\n/**\r\n * Result type - either Ok<T> or Err<E>\r\n */\r\nexport type Result<T, E = Error> = Ok<T> | Err<E>;\r\n\r\n/**\r\n * Create a success result\r\n */\r\nexport function ok<T>(value: T): Ok<T> {\r\n return { ok: true, value };\r\n}\r\n\r\n/**\r\n * Create an error result\r\n */\r\nexport function err<E>(error: E): Err<E> {\r\n return { ok: false, error };\r\n}\r\n\r\n/**\r\n * Check if result is Ok\r\n */\r\nexport function isOk<T, E>(result: Result<T, E>): result is Ok<T> {\r\n return result.ok === true;\r\n}\r\n\r\n/**\r\n * Check if result is Err\r\n */\r\nexport function isErr<T, E>(result: Result<T, E>): result is Err<E> {\r\n return result.ok === false;\r\n}\r\n\r\n/**\r\n * Unwrap a result, throwing if it's an error\r\n * Use sparingly - prefer pattern matching\r\n */\r\nexport function unwrap<T, E>(result: Result<T, E>): T {\r\n if (result.ok) return result.value;\r\n throw result.error;\r\n}\r\n\r\n/**\r\n * Unwrap a result with a default value\r\n */\r\nexport function unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T {\r\n return result.ok ? result.value : defaultValue;\r\n}\r\n\r\n/**\r\n * Map over a successful result\r\n */\r\nexport function map<T, U, E>(\r\n result: Result<T, E>,\r\n fn: (value: T) => U\r\n): Result<U, E> {\r\n return result.ok ? ok(fn(result.value)) : result;\r\n}\r\n\r\n/**\r\n * Map over an error result\r\n */\r\nexport function mapErr<T, E, F>(\r\n result: Result<T, E>,\r\n fn: (error: E) => F\r\n): Result<T, F> {\r\n return result.ok ? result : err(fn(result.error));\r\n}\r\n\r\n/**\r\n * Flat map (chain) results\r\n */\r\nexport function flatMap<T, U, E>(\r\n result: Result<T, E>,\r\n fn: (value: T) => Result<U, E>\r\n): Result<U, E> {\r\n return result.ok ? fn(result.value) : result;\r\n}\r\n\r\n/**\r\n * Try-catch wrapper that returns Result\r\n */\r\nexport async function tryCatch<T, E = Error>(\r\n fn: () => Promise<T>,\r\n mapError?: (e: unknown) => E\r\n): Promise<Result<T, E>> {\r\n try {\r\n const value = await fn();\r\n return ok(value);\r\n } catch (e) {\r\n const error = mapError ? mapError(e) : (e as E);\r\n return err(error);\r\n }\r\n}\r\n\r\n/**\r\n * Synchronous try-catch wrapper\r\n */\r\nexport function tryCatchSync<T, E = Error>(\r\n fn: () => T,\r\n mapError?: (e: unknown) => E\r\n): Result<T, E> {\r\n try {\r\n const value = fn();\r\n return ok(value);\r\n } catch (e) {\r\n const error = mapError ? mapError(e) : (e as E);\r\n return err(error);\r\n }\r\n}\r\n\r\n/**\r\n * Combine multiple results - all must succeed\r\n */\r\nexport function all<T extends readonly Result<unknown, unknown>[]>(\r\n results: T\r\n): Result<\r\n { [K in keyof T]: T[K] extends Result<infer U, unknown> ? U : never },\r\n T[number] extends Result<unknown, infer E> ? E : never\r\n> {\r\n const values: unknown[] = [];\r\n for (const result of results) {\r\n if (!result.ok) return result as any;\r\n values.push(result.value);\r\n }\r\n return ok(values as any);\r\n}\r\n\r\n/**\r\n * Pattern match on result\r\n */\r\nexport function match<T, E, U>(\r\n result: Result<T, E>,\r\n handlers: {\r\n ok: (value: T) => U;\r\n err: (error: E) => U;\r\n }\r\n): U {\r\n return result.ok ? handlers.ok(result.value) : handlers.err(result.error);\r\n}\r\n\r\nexport const Result = {\r\n ok,\r\n err,\r\n isOk,\r\n isErr,\r\n unwrap,\r\n unwrapOr,\r\n map,\r\n mapErr,\r\n flatMap,\r\n tryCatch,\r\n tryCatchSync,\r\n all,\r\n match,\r\n} as const;\r\n\r\nexport default Result;\r\n\r\n","/**\r\n * Idempotency Utilities\r\n * @classytic/revenue\r\n *\r\n * Prevent duplicate operations with idempotency keys\r\n * Inspired by: Stripe, Amazon SQS deduplication\r\n */\r\n\r\nimport { nanoid } from 'nanoid';\r\nimport { Result, ok, err } from '../core/result.js';\r\n\r\n// ============ TYPES ============\r\n\r\nexport interface IdempotencyRecord<T = unknown> {\r\n /** Idempotency key */\r\n key: string;\r\n /** Operation result (if completed) */\r\n result?: T;\r\n /** Operation status */\r\n status: 'pending' | 'completed' | 'failed';\r\n /** Creation timestamp */\r\n createdAt: Date;\r\n /** Completion timestamp */\r\n completedAt?: Date;\r\n /** Request hash for validation */\r\n requestHash: string;\r\n /** TTL - when record expires */\r\n expiresAt: Date;\r\n}\r\n\r\nexport interface IdempotencyStore {\r\n /** Get record by key */\r\n get<T>(key: string): Promise<IdempotencyRecord<T> | null>;\r\n /** Set or update record */\r\n set<T>(key: string, record: IdempotencyRecord<T>): Promise<void>;\r\n /** Delete record */\r\n delete(key: string): Promise<void>;\r\n /** Check if key exists */\r\n exists(key: string): Promise<boolean>;\r\n}\r\n\r\nexport interface IdempotencyConfig {\r\n /** TTL in milliseconds (default: 24 hours) */\r\n ttl?: number;\r\n /** Custom store implementation */\r\n store?: IdempotencyStore;\r\n /** Key prefix */\r\n prefix?: string;\r\n}\r\n\r\n// ============ IN-MEMORY STORE ============\r\n\r\n/**\r\n * Simple in-memory idempotency store\r\n * Use Redis/database store in production\r\n */\r\nexport class MemoryIdempotencyStore implements IdempotencyStore {\r\n private records = new Map<string, IdempotencyRecord>();\r\n private cleanupInterval: NodeJS.Timeout | null = null;\r\n\r\n constructor(cleanupIntervalMs = 60000) {\r\n // Periodic cleanup of expired records\r\n this.cleanupInterval = setInterval(() => {\r\n this.cleanup();\r\n }, cleanupIntervalMs);\r\n }\r\n\r\n async get<T>(key: string): Promise<IdempotencyRecord<T> | null> {\r\n const record = this.records.get(key);\r\n if (!record) return null;\r\n \r\n // Check if expired\r\n if (record.expiresAt < new Date()) {\r\n this.records.delete(key);\r\n return null;\r\n }\r\n \r\n return record as IdempotencyRecord<T>;\r\n }\r\n\r\n async set<T>(key: string, record: IdempotencyRecord<T>): Promise<void> {\r\n this.records.set(key, record);\r\n }\r\n\r\n async delete(key: string): Promise<void> {\r\n this.records.delete(key);\r\n }\r\n\r\n async exists(key: string): Promise<boolean> {\r\n const record = await this.get(key);\r\n return record !== null;\r\n }\r\n\r\n private cleanup(): void {\r\n const now = new Date();\r\n for (const [key, record] of this.records) {\r\n if (record.expiresAt < now) {\r\n this.records.delete(key);\r\n }\r\n }\r\n }\r\n\r\n destroy(): void {\r\n if (this.cleanupInterval) {\r\n clearInterval(this.cleanupInterval);\r\n this.cleanupInterval = null;\r\n }\r\n this.records.clear();\r\n }\r\n}\r\n\r\n// ============ IDEMPOTENCY MANAGER ============\r\n\r\nexport class IdempotencyError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly code: 'DUPLICATE_REQUEST' | 'REQUEST_IN_PROGRESS' | 'REQUEST_MISMATCH'\r\n ) {\r\n super(message);\r\n this.name = 'IdempotencyError';\r\n }\r\n}\r\n\r\n/**\r\n * Idempotency manager\r\n */\r\nexport class IdempotencyManager {\r\n private store: IdempotencyStore;\r\n private ttl: number;\r\n private prefix: string;\r\n\r\n constructor(config: IdempotencyConfig = {}) {\r\n this.store = config.store ?? new MemoryIdempotencyStore();\r\n this.ttl = config.ttl ?? 24 * 60 * 60 * 1000; // 24 hours\r\n this.prefix = config.prefix ?? 'idem:';\r\n }\r\n\r\n /**\r\n * Generate a unique idempotency key\r\n */\r\n generateKey(): string {\r\n return `${this.prefix}${nanoid(21)}`;\r\n }\r\n\r\n /**\r\n * Hash request parameters for validation\r\n */\r\n private hashRequest(params: unknown): string {\r\n // Simple JSON hash - in production, use a proper hash function\r\n const json = JSON.stringify(params, Object.keys(params as object).sort());\r\n let hash = 0;\r\n for (let i = 0; i < json.length; i++) {\r\n const char = json.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + char;\r\n hash = hash & hash;\r\n }\r\n return hash.toString(36);\r\n }\r\n\r\n /**\r\n * Execute operation with idempotency protection\r\n */\r\n async execute<T>(\r\n key: string,\r\n params: unknown,\r\n operation: () => Promise<T>\r\n ): Promise<Result<T, IdempotencyError>> {\r\n const fullKey = key.startsWith(this.prefix) ? key : `${this.prefix}${key}`;\r\n const requestHash = this.hashRequest(params);\r\n\r\n // Check for existing record\r\n const existing = await this.store.get<T>(fullKey);\r\n\r\n if (existing) {\r\n // Validate request hash matches\r\n if (existing.requestHash !== requestHash) {\r\n return err(new IdempotencyError(\r\n 'Idempotency key used with different request parameters',\r\n 'REQUEST_MISMATCH'\r\n ));\r\n }\r\n\r\n // If already completed, return cached result\r\n if (existing.status === 'completed' && existing.result !== undefined) {\r\n return ok(existing.result);\r\n }\r\n\r\n // If in progress, reject\r\n if (existing.status === 'pending') {\r\n return err(new IdempotencyError(\r\n 'Request with this idempotency key is already in progress',\r\n 'REQUEST_IN_PROGRESS'\r\n ));\r\n }\r\n\r\n // If failed, allow retry\r\n if (existing.status === 'failed') {\r\n await this.store.delete(fullKey);\r\n }\r\n }\r\n\r\n // Create pending record\r\n const record: IdempotencyRecord<T> = {\r\n key: fullKey,\r\n status: 'pending',\r\n createdAt: new Date(),\r\n requestHash,\r\n expiresAt: new Date(Date.now() + this.ttl),\r\n };\r\n\r\n await this.store.set(fullKey, record);\r\n\r\n try {\r\n // Execute operation\r\n const result = await operation();\r\n\r\n // Update record with result\r\n record.status = 'completed';\r\n record.result = result;\r\n record.completedAt = new Date();\r\n await this.store.set(fullKey, record);\r\n\r\n return ok(result);\r\n } catch (error) {\r\n // Mark as failed\r\n record.status = 'failed';\r\n await this.store.set(fullKey, record);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Check if operation with key was already completed\r\n */\r\n async wasCompleted(key: string): Promise<boolean> {\r\n const fullKey = key.startsWith(this.prefix) ? key : `${this.prefix}${key}`;\r\n const record = await this.store.get(fullKey);\r\n return record?.status === 'completed';\r\n }\r\n\r\n /**\r\n * Get cached result for key\r\n */\r\n async getCached<T>(key: string): Promise<T | null> {\r\n const fullKey = key.startsWith(this.prefix) ? key : `${this.prefix}${key}`;\r\n const record = await this.store.get<T>(fullKey);\r\n return record?.status === 'completed' ? (record.result ?? null) : null;\r\n }\r\n\r\n /**\r\n * Invalidate a key (force re-execution on next call)\r\n */\r\n async invalidate(key: string): Promise<void> {\r\n const fullKey = key.startsWith(this.prefix) ? key : `${this.prefix}${key}`;\r\n await this.store.delete(fullKey);\r\n }\r\n}\r\n\r\n/**\r\n * Create idempotency manager\r\n */\r\nexport function createIdempotencyManager(\r\n config?: IdempotencyConfig\r\n): IdempotencyManager {\r\n return new IdempotencyManager(config);\r\n}\r\n\r\n/**\r\n * Decorator for idempotent operations\r\n * @example\r\n * class PaymentService {\r\n * @withIdempotency(manager, (p) => p.idempotencyKey)\r\n * async createPayment(params) { ... }\r\n * }\r\n */\r\nexport function withIdempotency(\r\n manager: IdempotencyManager,\r\n getKey: (params: unknown) => string | undefined\r\n) {\r\n return function(\r\n _target: unknown,\r\n _propertyKey: string,\r\n descriptor: PropertyDescriptor\r\n ) {\r\n const original = descriptor.value;\r\n\r\n descriptor.value = async function(this: unknown, params: unknown) {\r\n const key = getKey(params);\r\n \r\n if (!key) {\r\n // No idempotency key provided, execute normally\r\n return original.call(this, params);\r\n }\r\n\r\n const result = await manager.execute(key, params, () => \r\n original.call(this, params)\r\n );\r\n\r\n if (result.ok) {\r\n return result.value;\r\n }\r\n\r\n throw result.error;\r\n };\r\n\r\n return descriptor;\r\n };\r\n}\r\n\r\nexport default IdempotencyManager;\r\n\r\n","/**\r\n * Retry Utilities\r\n * @classytic/revenue\r\n *\r\n * Exponential backoff with jitter for resilient operations\r\n * Inspired by: AWS SDK retry, Netflix Hystrix, resilience4j\r\n */\r\n\r\nimport { Result, ok, err } from '../core/result.js';\r\n\r\n// ============ TYPES ============\r\n\r\nexport interface RetryConfig {\r\n /** Maximum number of retry attempts (default: 3) */\r\n maxAttempts: number;\r\n /** Base delay in milliseconds (default: 1000) */\r\n baseDelay: number;\r\n /** Maximum delay in milliseconds (default: 30000) */\r\n maxDelay: number;\r\n /** Backoff multiplier (default: 2) */\r\n backoffMultiplier: number;\r\n /** Jitter factor 0-1 (default: 0.1) */\r\n jitter: number;\r\n /** Which errors are retryable */\r\n retryIf?: (error: unknown) => boolean;\r\n /** Callback on each retry */\r\n onRetry?: (error: unknown, attempt: number, delay: number) => void;\r\n}\r\n\r\nexport interface RetryState {\r\n attempt: number;\r\n totalDelay: number;\r\n errors: Error[];\r\n}\r\n\r\n// ============ DEFAULT CONFIG ============\r\n\r\nconst DEFAULT_CONFIG: RetryConfig = {\r\n maxAttempts: 3,\r\n baseDelay: 1000,\r\n maxDelay: 30000,\r\n backoffMultiplier: 2,\r\n jitter: 0.1,\r\n retryIf: isRetryableError,\r\n};\r\n\r\n// ============ RETRY LOGIC ============\r\n\r\n/**\r\n * Calculate delay with exponential backoff and jitter\r\n */\r\nexport function calculateDelay(\r\n attempt: number,\r\n config: RetryConfig\r\n): number {\r\n // Exponential backoff: baseDelay * multiplier^attempt\r\n const exponentialDelay = config.baseDelay * Math.pow(config.backoffMultiplier, attempt);\r\n \r\n // Cap at maxDelay\r\n const cappedDelay = Math.min(exponentialDelay, config.maxDelay);\r\n \r\n // Add jitter (random variance)\r\n const jitterRange = cappedDelay * config.jitter;\r\n const jitter = Math.random() * jitterRange * 2 - jitterRange;\r\n \r\n return Math.round(Math.max(0, cappedDelay + jitter));\r\n}\r\n\r\n/**\r\n * Sleep for specified milliseconds\r\n */\r\nexport function sleep(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n\r\n/**\r\n * Check if error is retryable by default\r\n */\r\nexport function isRetryableError(error: unknown): boolean {\r\n if (!(error instanceof Error)) return false;\r\n\r\n // Network errors\r\n if (error.message.includes('ECONNREFUSED')) return true;\r\n if (error.message.includes('ETIMEDOUT')) return true;\r\n if (error.message.includes('ENOTFOUND')) return true;\r\n if (error.message.includes('network')) return true;\r\n if (error.message.includes('timeout')) return true;\r\n\r\n // Rate limiting\r\n if (error.message.includes('429')) return true;\r\n if (error.message.includes('rate limit')) return true;\r\n\r\n // Server errors (5xx)\r\n if (error.message.includes('500')) return true;\r\n if (error.message.includes('502')) return true;\r\n if (error.message.includes('503')) return true;\r\n if (error.message.includes('504')) return true;\r\n\r\n // Check for retryable property\r\n if ('retryable' in error && (error as any).retryable === true) return true;\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Execute operation with retry logic\r\n */\r\nexport async function retry<T>(\r\n operation: () => Promise<T>,\r\n config: Partial<RetryConfig> = {}\r\n): Promise<T> {\r\n const fullConfig: RetryConfig = { ...DEFAULT_CONFIG, ...config };\r\n const state: RetryState = {\r\n attempt: 0,\r\n totalDelay: 0,\r\n errors: [],\r\n };\r\n\r\n while (state.attempt < fullConfig.maxAttempts) {\r\n try {\r\n return await operation();\r\n } catch (error) {\r\n state.errors.push(error instanceof Error ? error : new Error(String(error)));\r\n state.attempt++;\r\n\r\n // Check if we should retry\r\n const shouldRetry = fullConfig.retryIf?.(error) ?? isRetryableError(error);\r\n \r\n if (!shouldRetry || state.attempt >= fullConfig.maxAttempts) {\r\n throw new RetryExhaustedError(\r\n `Operation failed after ${state.attempt} attempts`,\r\n state.errors\r\n );\r\n }\r\n\r\n // Calculate delay\r\n const delay = calculateDelay(state.attempt - 1, fullConfig);\r\n state.totalDelay += delay;\r\n\r\n // Callback\r\n fullConfig.onRetry?.(error, state.attempt, delay);\r\n\r\n // Wait before retry\r\n await sleep(delay);\r\n }\r\n }\r\n\r\n // Should never reach here, but TypeScript needs it\r\n throw new RetryExhaustedError(\r\n `Operation failed after ${state.attempt} attempts`,\r\n state.errors\r\n );\r\n}\r\n\r\n/**\r\n * Execute operation with retry, returning Result instead of throwing\r\n */\r\nexport async function retryWithResult<T>(\r\n operation: () => Promise<T>,\r\n config: Partial<RetryConfig> = {}\r\n): Promise<Result<T, RetryExhaustedError>> {\r\n try {\r\n const result = await retry(operation, config);\r\n return ok(result);\r\n } catch (error) {\r\n if (error instanceof RetryExhaustedError) {\r\n return err(error);\r\n }\r\n return err(new RetryExhaustedError('Operation failed', [\r\n error instanceof Error ? error : new Error(String(error))\r\n ]));\r\n }\r\n}\r\n\r\n// ============ ERROR CLASSES ============\r\n\r\n/**\r\n * Error thrown when all retries are exhausted\r\n */\r\nexport class RetryExhaustedError extends Error {\r\n public readonly attempts: number;\r\n public readonly errors: Error[];\r\n\r\n constructor(message: string, errors: Error[]) {\r\n super(message);\r\n this.name = 'RetryExhaustedError';\r\n this.attempts = errors.length;\r\n this.errors = errors;\r\n }\r\n\r\n /**\r\n * Get the last error\r\n */\r\n get lastError(): Error | undefined {\r\n return this.errors[this.errors.length - 1];\r\n }\r\n\r\n /**\r\n * Get the first error\r\n */\r\n get firstError(): Error | undefined {\r\n return this.errors[0];\r\n }\r\n}\r\n\r\n// ============ CIRCUIT BREAKER ============\r\n\r\nexport type CircuitState = 'closed' | 'open' | 'half-open';\r\n\r\nexport interface CircuitBreakerConfig {\r\n /** Number of failures before opening circuit */\r\n failureThreshold: number;\r\n /** Time in ms to wait before half-opening */\r\n resetTimeout: number;\r\n /** Number of successes in half-open to close circuit */\r\n successThreshold: number;\r\n /** Monitor window in ms */\r\n monitorWindow: number;\r\n}\r\n\r\nconst DEFAULT_CIRCUIT_CONFIG: CircuitBreakerConfig = {\r\n failureThreshold: 5,\r\n resetTimeout: 30000,\r\n successThreshold: 3,\r\n monitorWindow: 60000,\r\n};\r\n\r\n/**\r\n * Circuit breaker for preventing cascade failures\r\n * Inspired by: Netflix Hystrix, resilience4j\r\n */\r\nexport class CircuitBreaker {\r\n private state: CircuitState = 'closed';\r\n private failures: Date[] = [];\r\n private successes = 0;\r\n private lastFailure?: Date;\r\n private config: CircuitBreakerConfig;\r\n\r\n constructor(config: Partial<CircuitBreakerConfig> = {}) {\r\n this.config = { ...DEFAULT_CIRCUIT_CONFIG, ...config };\r\n }\r\n\r\n /**\r\n * Execute operation through circuit breaker\r\n */\r\n async execute<T>(operation: () => Promise<T>): Promise<T> {\r\n // Check circuit state\r\n if (this.state === 'open') {\r\n if (this.shouldAttemptReset()) {\r\n this.state = 'half-open';\r\n } else {\r\n throw new CircuitOpenError('Circuit is open, request rejected');\r\n }\r\n }\r\n\r\n try {\r\n const result = await operation();\r\n this.onSuccess();\r\n return result;\r\n } catch (error) {\r\n this.onFailure();\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Execute with Result type\r\n */\r\n async executeWithResult<T>(\r\n operation: () => Promise<T>\r\n ): Promise<Result<T, CircuitOpenError | Error>> {\r\n try {\r\n const result = await this.execute(operation);\r\n return ok(result);\r\n } catch (error) {\r\n return err(error as Error);\r\n }\r\n }\r\n\r\n private onSuccess(): void {\r\n if (this.state === 'half-open') {\r\n this.successes++;\r\n if (this.successes >= this.config.successThreshold) {\r\n this.reset();\r\n }\r\n }\r\n // Clean old failures outside monitor window\r\n this.cleanOldFailures();\r\n }\r\n\r\n private onFailure(): void {\r\n this.failures.push(new Date());\r\n this.lastFailure = new Date();\r\n this.successes = 0;\r\n\r\n // Clean old failures\r\n this.cleanOldFailures();\r\n\r\n // Check if we should open circuit\r\n if (this.failures.length >= this.config.failureThreshold) {\r\n this.state = 'open';\r\n }\r\n }\r\n\r\n private shouldAttemptReset(): boolean {\r\n if (!this.lastFailure) return true;\r\n return Date.now() - this.lastFailure.getTime() >= this.config.resetTimeout;\r\n }\r\n\r\n private cleanOldFailures(): void {\r\n const cutoff = Date.now() - this.config.monitorWindow;\r\n this.failures = this.failures.filter(f => f.getTime() > cutoff);\r\n }\r\n\r\n private reset(): void {\r\n this.state = 'closed';\r\n this.failures = [];\r\n this.successes = 0;\r\n }\r\n\r\n /**\r\n * Get current circuit state\r\n */\r\n getState(): CircuitState {\r\n return this.state;\r\n }\r\n\r\n /**\r\n * Manually reset circuit\r\n */\r\n forceReset(): void {\r\n this.reset();\r\n }\r\n\r\n /**\r\n * Get circuit statistics\r\n */\r\n getStats(): {\r\n state: CircuitState;\r\n failures: number;\r\n successes: number;\r\n lastFailure?: Date;\r\n } {\r\n return {\r\n state: this.state,\r\n failures: this.failures.length,\r\n successes: this.successes,\r\n lastFailure: this.lastFailure,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown when circuit is open\r\n */\r\nexport class CircuitOpenError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = 'CircuitOpenError';\r\n }\r\n}\r\n\r\n/**\r\n * Create a circuit breaker\r\n */\r\nexport function createCircuitBreaker(\r\n config?: Partial<CircuitBreakerConfig>\r\n): CircuitBreaker {\r\n return new CircuitBreaker(config);\r\n}\r\n\r\n// ============ COMBINED RETRY WITH CIRCUIT BREAKER ============\r\n\r\n/**\r\n * Execute with both retry and circuit breaker\r\n */\r\nexport async function resilientExecute<T>(\r\n operation: () => Promise<T>,\r\n options: {\r\n retry?: Partial<RetryConfig>;\r\n circuitBreaker?: CircuitBreaker;\r\n } = {}\r\n): Promise<T> {\r\n const { retry: retryConfig, circuitBreaker } = options;\r\n\r\n const wrappedOperation = async () => {\r\n if (circuitBreaker) {\r\n return circuitBreaker.execute(operation);\r\n }\r\n return operation();\r\n };\r\n\r\n if (retryConfig) {\r\n return retry(wrappedOperation, retryConfig);\r\n }\r\n\r\n return wrappedOperation();\r\n}\r\n\r\nexport default retry;\r\n\r\n","/**\r\n * Revenue Error Classes\r\n * @classytic/revenue\r\n *\r\n * Typed errors with codes for better error handling\r\n */\r\n\r\nexport interface RevenueErrorOptions {\r\n retryable?: boolean;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Base Revenue Error\r\n */\r\nexport class RevenueError extends Error {\r\n public readonly code: string;\r\n public readonly retryable: boolean;\r\n public readonly metadata: Record<string, unknown>;\r\n\r\n constructor(\r\n message: string,\r\n code: string,\r\n options: RevenueErrorOptions = {}\r\n ) {\r\n super(message);\r\n this.name = this.constructor.name;\r\n this.code = code;\r\n this.retryable = options.retryable ?? false;\r\n this.metadata = options.metadata ?? {};\r\n Error.captureStackTrace(this, this.constructor);\r\n }\r\n\r\n toJSON(): Record<string, unknown> {\r\n return {\r\n name: this.name,\r\n message: this.message,\r\n code: this.code,\r\n retryable: this.retryable,\r\n metadata: this.metadata,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Configuration Errors\r\n */\r\nexport class ConfigurationError extends RevenueError {\r\n constructor(message: string, metadata: Record<string, unknown> = {}) {\r\n super(message, 'CONFIGURATION_ERROR', { retryable: false, metadata });\r\n }\r\n}\r\n\r\nexport class ModelNotRegisteredError extends ConfigurationError {\r\n constructor(modelName: string) {\r\n super(\r\n `Model \"${modelName}\" is not registered. Register it via createRevenue({ models: { ${modelName}: ... } })`,\r\n { modelName }\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Provider Errors\r\n */\r\nexport class ProviderError extends RevenueError {\r\n constructor(\r\n message: string,\r\n code: string,\r\n options: RevenueErrorOptions = {}\r\n ) {\r\n super(message, code, options);\r\n }\r\n}\r\n\r\nexport class ProviderNotFoundError extends ProviderError {\r\n constructor(providerName: string, availableProviders: string[] = []) {\r\n super(\r\n `Payment provider \"${providerName}\" not found. Available: ${availableProviders.join(', ')}`,\r\n 'PROVIDER_NOT_FOUND',\r\n { retryable: false, metadata: { providerName, availableProviders } }\r\n );\r\n }\r\n}\r\n\r\nexport class ProviderCapabilityError extends ProviderError {\r\n constructor(providerName: string, capability: string) {\r\n super(\r\n `Provider \"${providerName}\" does not support ${capability}`,\r\n 'PROVIDER_CAPABILITY_NOT_SUPPORTED',\r\n { retryable: false, metadata: { providerName, capability } }\r\n );\r\n }\r\n}\r\n\r\nexport class PaymentIntentCreationError extends ProviderError {\r\n constructor(providerName: string, originalError: Error) {\r\n super(\r\n `Failed to create payment intent with provider \"${providerName}\": ${originalError.message}`,\r\n 'PAYMENT_INTENT_CREATION_FAILED',\r\n { retryable: true, metadata: { providerName, originalError: originalError.message } }\r\n );\r\n }\r\n}\r\n\r\nexport class PaymentVerificationError extends ProviderError {\r\n constructor(paymentIntentId: string, reason: string) {\r\n super(\r\n `Payment verification failed for intent \"${paymentIntentId}\": ${reason}`,\r\n 'PAYMENT_VERIFICATION_FAILED',\r\n { retryable: true, metadata: { paymentIntentId, reason } }\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Resource Not Found Errors\r\n */\r\nexport class NotFoundError extends RevenueError {\r\n constructor(\r\n message: string,\r\n code: string,\r\n metadata: Record<string, unknown> = {}\r\n ) {\r\n super(message, code, { retryable: false, metadata });\r\n }\r\n}\r\n\r\nexport class SubscriptionNotFoundError extends NotFoundError {\r\n constructor(subscriptionId: string) {\r\n super(\r\n `Subscription not found: ${subscriptionId}`,\r\n 'SUBSCRIPTION_NOT_FOUND',\r\n { subscriptionId }\r\n );\r\n }\r\n}\r\n\r\nexport class TransactionNotFoundError extends NotFoundError {\r\n constructor(transactionId: string) {\r\n super(\r\n `Transaction not found: ${transactionId}`,\r\n 'TRANSACTION_NOT_FOUND',\r\n { transactionId }\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Validation Errors\r\n */\r\nexport class ValidationError extends RevenueError {\r\n constructor(message: string, metadata: Record<string, unknown> = {}) {\r\n super(message, 'VALIDATION_ERROR', { retryable: false, metadata });\r\n }\r\n}\r\n\r\nexport class InvalidAmountError extends ValidationError {\r\n constructor(amount: number, message?: string) {\r\n super(\r\n message ?? `Invalid amount: ${amount}. Amount must be non-negative`,\r\n { amount }\r\n );\r\n }\r\n}\r\n\r\nexport class MissingRequiredFieldError extends ValidationError {\r\n constructor(fieldName: string) {\r\n super(`Missing required field: ${fieldName}`, { fieldName });\r\n }\r\n}\r\n\r\n/**\r\n * State Errors\r\n */\r\nexport class StateError extends RevenueError {\r\n constructor(\r\n message: string,\r\n code: string,\r\n metadata: Record<string, unknown> = {}\r\n ) {\r\n super(message, code, { retryable: false, metadata });\r\n }\r\n}\r\n\r\nexport class AlreadyVerifiedError extends StateError {\r\n constructor(transactionId: string) {\r\n super(\r\n `Transaction ${transactionId} is already verified`,\r\n 'ALREADY_VERIFIED',\r\n { transactionId }\r\n );\r\n }\r\n}\r\n\r\nexport class InvalidStateTransitionError extends StateError {\r\n constructor(\r\n resourceType: string,\r\n resourceId: string,\r\n fromState: string,\r\n toState: string\r\n ) {\r\n super(\r\n `Invalid state transition for ${resourceType} ${resourceId}: ${fromState} → ${toState}`,\r\n 'INVALID_STATE_TRANSITION',\r\n { resourceType, resourceId, fromState, toState }\r\n );\r\n }\r\n}\r\n\r\nexport class SubscriptionNotActiveError extends StateError {\r\n constructor(subscriptionId: string, message?: string) {\r\n super(\r\n message ?? `Subscription ${subscriptionId} is not active`,\r\n 'SUBSCRIPTION_NOT_ACTIVE',\r\n { subscriptionId }\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Operation Errors\r\n */\r\nexport class OperationError extends RevenueError {\r\n constructor(\r\n message: string,\r\n code: string,\r\n options: RevenueErrorOptions = {}\r\n ) {\r\n super(message, code, options);\r\n }\r\n}\r\n\r\nexport class RefundNotSupportedError extends OperationError {\r\n constructor(providerName: string) {\r\n super(\r\n `Refunds are not supported by provider \"${providerName}\"`,\r\n 'REFUND_NOT_SUPPORTED',\r\n { retryable: false, metadata: { providerName } }\r\n );\r\n }\r\n}\r\n\r\nexport class RefundError extends OperationError {\r\n constructor(transactionId: string, reason: string) {\r\n super(\r\n `Refund failed for transaction ${transactionId}: ${reason}`,\r\n 'REFUND_FAILED',\r\n { retryable: true, metadata: { transactionId, reason } }\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Error Code Constants\r\n */\r\nexport const ERROR_CODES = {\r\n // Configuration\r\n CONFIGURATION_ERROR: 'CONFIGURATION_ERROR',\r\n MODEL_NOT_REGISTERED: 'MODEL_NOT_REGISTERED',\r\n\r\n // Provider\r\n PROVIDER_NOT_FOUND: 'PROVIDER_NOT_FOUND',\r\n PROVIDER_CAPABILITY_NOT_SUPPORTED: 'PROVIDER_CAPABILITY_NOT_SUPPORTED',\r\n PAYMENT_INTENT_CREATION_FAILED: 'PAYMENT_INTENT_CREATION_FAILED',\r\n PAYMENT_VERIFICATION_FAILED: 'PAYMENT_VERIFICATION_FAILED',\r\n\r\n // Not Found\r\n SUBSCRIPTION_NOT_FOUND: 'SUBSCRIPTION_NOT_FOUND',\r\n TRANSACTION_NOT_FOUND: 'TRANSACTION_NOT_FOUND',\r\n\r\n // Validation\r\n VALIDATION_ERROR: 'VALIDATION_ERROR',\r\n INVALID_AMOUNT: 'INVALID_AMOUNT',\r\n MISSING_REQUIRED_FIELD: 'MISSING_REQUIRED_FIELD',\r\n\r\n // State\r\n ALREADY_VERIFIED: 'ALREADY_VERIFIED',\r\n INVALID_STATE_TRANSITION: 'INVALID_STATE_TRANSITION',\r\n SUBSCRIPTION_NOT_ACTIVE: 'SUBSCRIPTION_NOT_ACTIVE',\r\n\r\n // Operations\r\n REFUND_NOT_SUPPORTED: 'REFUND_NOT_SUPPORTED',\r\n REFUND_FAILED: 'REFUND_FAILED',\r\n} as const;\r\n\r\nexport type ErrorCode = typeof ERROR_CODES[keyof typeof ERROR_CODES];\r\n\r\n/**\r\n * Check if error is retryable\r\n */\r\nexport function isRetryable(error: unknown): boolean {\r\n return error instanceof RevenueError && error.retryable;\r\n}\r\n\r\n/**\r\n * Check if error is from revenue package\r\n */\r\nexport function isRevenueError(error: unknown): error is RevenueError {\r\n return error instanceof RevenueError;\r\n}\r\n\r\n","/**\r\n * Hook Utilities\r\n * @classytic/revenue\r\n *\r\n * Fire-and-forget hook execution - never blocks main flow\r\n */\r\n\r\nimport type { Logger, HooksRegistry } from '../types/index.js';\r\n\r\n/**\r\n * Trigger hooks asynchronously without waiting\r\n * Errors are logged but never thrown\r\n *\r\n * @param hooks - Hooks object\r\n * @param event - Event name\r\n * @param data - Event data\r\n * @param logger - Logger instance\r\n */\r\nexport function triggerHook(\r\n hooks: HooksRegistry,\r\n event: string,\r\n data: unknown,\r\n logger: Logger\r\n): void {\r\n const handlers = hooks[event] ?? [];\r\n\r\n if (handlers.length === 0) {\r\n return; // No handlers, return immediately\r\n }\r\n\r\n // Fire-and-forget: Don't await, don't block\r\n Promise.all(\r\n handlers.map((handler) =>\r\n Promise.resolve(handler(data)).catch((error: Error) => {\r\n logger.error(`Hook \"${event}\" failed:`, {\r\n error: error.message,\r\n stack: error.stack,\r\n event,\r\n // Don't log full data (could be huge)\r\n dataKeys: Object.keys(data as object),\r\n });\r\n })\r\n )\r\n ).catch(() => {\r\n // Swallow any Promise.all errors (already logged individually)\r\n });\r\n\r\n // Return immediately - hooks run in background\r\n}\r\n\r\nexport default triggerHook;\r\n\r\n","/**\r\n * Transaction Enums\r\n * @classytic/revenue\r\n *\r\n * Library-managed transaction enums only.\r\n * Users should define their own categories and merge with these.\r\n */\r\n\r\n// ============ TRANSACTION TYPE ============\r\n/**\r\n * Transaction Type - Income vs Expense\r\n *\r\n * INCOME: Money coming in (payments, subscriptions, purchases)\r\n * EXPENSE: Money going out (refunds, payouts)\r\n *\r\n * Users can map these in their config via transactionTypeMapping\r\n */\r\nexport const TRANSACTION_TYPE = {\r\n INCOME: 'income',\r\n EXPENSE: 'expense',\r\n} as const;\r\n\r\nexport type TransactionType = typeof TRANSACTION_TYPE;\r\nexport type TransactionTypeValue = TransactionType[keyof TransactionType];\r\nexport const TRANSACTION_TYPE_VALUES = Object.values(TRANSACTION_TYPE);\r\n\r\n// ============ TRANSACTION STATUS ============\r\n/**\r\n * Transaction Status - Library-managed states\r\n */\r\nexport const TRANSACTION_STATUS = {\r\n PENDING: 'pending',\r\n PAYMENT_INITIATED: 'payment_initiated',\r\n PROCESSING: 'processing',\r\n REQUIRES_ACTION: 'requires_action',\r\n VERIFIED: 'verified',\r\n COMPLETED: 'completed',\r\n FAILED: 'failed',\r\n CANCELLED: 'cancelled',\r\n EXPIRED: 'expired',\r\n REFUNDED: 'refunded',\r\n PARTIALLY_REFUNDED: 'partially_refunded',\r\n} as const;\r\n\r\nexport type TransactionStatus = typeof TRANSACTION_STATUS;\r\nexport type TransactionStatusValue = TransactionStatus[keyof TransactionStatus];\r\nexport const TRANSACTION_STATUS_VALUES = Object.values(TRANSACTION_STATUS);\r\n\r\n// ============ LIBRARY CATEGORIES ============\r\n/**\r\n * Categories managed by this library\r\n *\r\n * SUBSCRIPTION: Recurring subscription payments\r\n * PURCHASE: One-time purchases\r\n *\r\n * Users should spread these into their own category enums:\r\n *\r\n * @example\r\n * import { LIBRARY_CATEGORIES } from '@classytic/revenue';\r\n *\r\n * export const MY_CATEGORIES = {\r\n * ...LIBRARY_CATEGORIES,\r\n * SALARY: 'salary',\r\n * RENT: 'rent',\r\n * EQUIPMENT: 'equipment',\r\n * } as const;\r\n */\r\nexport const LIBRARY_CATEGORIES = {\r\n SUBSCRIPTION: 'subscription',\r\n PURCHASE: 'purchase',\r\n} as const;\r\n\r\nexport type LibraryCategories = typeof LIBRARY_CATEGORIES;\r\nexport type LibraryCategoryValue = LibraryCategories[keyof LibraryCategories];\r\nexport const LIBRARY_CATEGORY_VALUES = Object.values(LIBRARY_CATEGORIES);\r\n\r\n","/**\r\n * Category Resolver Utility\r\n * @classytic/revenue\r\n *\r\n * Resolves transaction category based on referenceModel and categoryMappings\r\n */\r\n\r\nimport { LIBRARY_CATEGORIES } from '../enums/transaction.enums.js';\r\nimport type { MonetizationTypeValue } from '../types/index.js';\r\n\r\n/**\r\n * Resolve category for a transaction based on entity and monetizationType\r\n *\r\n * Resolution Logic:\r\n * 1. If categoryMappings[entity] exists → use it\r\n * 2. Otherwise → fall back to default library category\r\n *\r\n * @param entity - The logical entity/identifier (e.g., 'Order', 'PlatformSubscription', 'Membership')\r\n * NOTE: This is NOT a database model name - it's just a logical identifier\r\n * @param monetizationType - The monetization type ('subscription', 'purchase', 'free')\r\n * @param categoryMappings - User-defined category mappings from config\r\n * @returns Category name for the transaction\r\n *\r\n * @example\r\n * // With mapping defined\r\n * resolveCategory('Order', 'subscription', { Order: 'order_subscription' })\r\n * // Returns: 'order_subscription'\r\n *\r\n * @example\r\n * // Without mapping, falls back to library default\r\n * resolveCategory('Order', 'subscription', {})\r\n * // Returns: 'subscription'\r\n *\r\n * @example\r\n * // Different entities with different mappings\r\n * const mappings = {\r\n * Order: 'order_subscription',\r\n * PlatformSubscription: 'platform_subscription',\r\n * TenantUpgrade: 'tenant_upgrade',\r\n * Membership: 'gym_membership',\r\n * Enrollment: 'course_enrollment',\r\n * };\r\n * resolveCategory('PlatformSubscription', 'subscription', mappings)\r\n * // Returns: 'platform_subscription'\r\n */\r\nexport function resolveCategory(\r\n entity: string | null | undefined,\r\n monetizationType: MonetizationTypeValue,\r\n categoryMappings: Record<string, string> = {}\r\n): string {\r\n // If user has defined a custom mapping for this entity, use it\r\n if (entity && categoryMappings[entity]) {\r\n return categoryMappings[entity];\r\n }\r\n\r\n // Otherwise, fall back to library default based on monetization type\r\n switch (monetizationType) {\r\n case 'subscription':\r\n return LIBRARY_CATEGORIES.SUBSCRIPTION; // 'subscription'\r\n case 'purchase':\r\n return LIBRARY_CATEGORIES.PURCHASE; // 'purchase'\r\n default:\r\n return LIBRARY_CATEGORIES.SUBSCRIPTION; // Default to subscription\r\n }\r\n}\r\n\r\n/**\r\n * Validate that a category is defined in user's Transaction model enum\r\n * This is informational - actual validation happens at Mongoose schema level\r\n *\r\n * @param category - Category to validate\r\n * @param allowedCategories - List of allowed categories\r\n * @returns Whether category is valid\r\n */\r\nexport function isCategoryValid(\r\n category: string,\r\n allowedCategories: string[] = []\r\n): boolean {\r\n return allowedCategories.includes(category);\r\n}\r\n\r\nexport default resolveCategory;\r\n\r\n","/**\r\n * Commission Calculation Utility\r\n * @classytic/revenue\r\n *\r\n * Handles platform commission calculation with gateway fee deduction\r\n */\r\n\r\nimport type { CommissionInfo } from '../types/index.js';\r\n\r\n/**\r\n * Build commission object for transaction\r\n *\r\n * @param amount - Transaction amount\r\n * @param commissionRate - Commission rate (0 to 1, e.g., 0.10 for 10%)\r\n * @param gatewayFeeRate - Gateway fee rate (0 to 1, e.g., 0.018 for 1.8%)\r\n * @returns Commission object or null\r\n */\r\nexport function calculateCommission(\r\n amount: number,\r\n commissionRate: number,\r\n gatewayFeeRate: number = 0\r\n): CommissionInfo | null {\r\n // No commission if rate is 0 or negative\r\n if (!commissionRate || commissionRate <= 0) {\r\n return null;\r\n }\r\n\r\n // Validate inputs\r\n if (amount < 0) {\r\n throw new Error('Transaction amount cannot be negative');\r\n }\r\n\r\n if (commissionRate < 0 || commissionRate > 1) {\r\n throw new Error('Commission rate must be between 0 and 1');\r\n }\r\n\r\n if (gatewayFeeRate < 0 || gatewayFeeRate > 1) {\r\n throw new Error('Gateway fee rate must be between 0 and 1');\r\n }\r\n\r\n // Calculate commission\r\n const grossAmount = Math.round(amount * commissionRate * 100) / 100; // Round to 2 decimals\r\n const gatewayFeeAmount = Math.round(amount * gatewayFeeRate * 100) / 100;\r\n const netAmount = Math.max(0, Math.round((grossAmount - gatewayFeeAmount) * 100) / 100);\r\n\r\n return {\r\n rate: commissionRate,\r\n grossAmount,\r\n gatewayFeeRate,\r\n gatewayFeeAmount,\r\n netAmount,\r\n status: 'pending',\r\n };\r\n}\r\n\r\n/**\r\n * Reverse commission on refund (proportional)\r\n *\r\n * @param originalCommission - Original commission object\r\n * @param originalAmount - Original transaction amount\r\n * @param refundAmount - Amount being refunded\r\n * @returns Reversed commission or null\r\n */\r\nexport function reverseCommission(\r\n originalCommission: CommissionInfo | null | undefined,\r\n originalAmount: number,\r\n refundAmount: number\r\n): CommissionInfo | null {\r\n if (!originalCommission?.netAmount) {\r\n return null;\r\n }\r\n\r\n // Calculate proportional refund\r\n const refundRatio = refundAmount / originalAmount;\r\n const reversedNetAmount = Math.round(originalCommission.netAmount * refundRatio * 100) / 100;\r\n const reversedGrossAmount = Math.round(originalCommission.grossAmount * refundRatio * 100) / 100;\r\n const reversedGatewayFee = Math.round(originalCommission.gatewayFeeAmount * refundRatio * 100) / 100;\r\n\r\n return {\r\n rate: originalCommission.rate,\r\n grossAmount: reversedGrossAmount,\r\n gatewayFeeRate: originalCommission.gatewayFeeRate,\r\n gatewayFeeAmount: reversedGatewayFee,\r\n netAmount: reversedNetAmount,\r\n status: 'waived', // Commission waived due to refund\r\n };\r\n}\r\n\r\nexport default {\r\n calculateCommission,\r\n reverseCommission,\r\n};\r\n\r\n","/**\r\n * Monetization Enums\r\n * @classytic/revenue\r\n *\r\n * General monetization enums and constants\r\n */\r\n\r\n// ============ MONETIZATION TYPES ============\r\nexport const MONETIZATION_TYPES = {\r\n FREE: 'free',\r\n PURCHASE: 'purchase',\r\n SUBSCRIPTION: 'subscription',\r\n} as const;\r\n\r\nexport type MonetizationTypes = typeof MONETIZATION_TYPES;\r\nexport type MonetizationTypeValue = MonetizationTypes[keyof MonetizationTypes];\r\nexport const MONETIZATION_TYPE_VALUES = Object.values(MONETIZATION_TYPES);\r\n\r\n","/**\r\n * Monetization Service\r\n * @classytic/revenue\r\n *\r\n * Framework-agnostic monetization management service with DI\r\n * Handles purchases, subscriptions, and free items using provider system\r\n */\r\n\r\nimport { nanoid } from 'nanoid';\r\nimport {\r\n MissingRequiredFieldError,\r\n InvalidAmountError,\r\n ProviderNotFoundError,\r\n SubscriptionNotFoundError,\r\n ModelNotRegisteredError,\r\n SubscriptionNotActiveError,\r\n PaymentIntentCreationError,\r\n InvalidStateTransitionError,\r\n} from '../core/errors.js';\r\nimport { triggerHook } from '../utils/hooks.js';\r\nimport { resolveCategory } from '../utils/category-resolver.js';\r\nimport { calculateCommission } from '../utils/commission.js';\r\nimport { MONETIZATION_TYPES } from '../enums/monetization.enums.js';\r\nimport { TRANSACTION_TYPE } from '../enums/transaction.enums.js';\r\nimport type { Container } from '../core/container.js';\r\nimport type {\r\n ModelsRegistry,\r\n ProvidersRegistry,\r\n HooksRegistry,\r\n RevenueConfig,\r\n Logger,\r\n MonetizationCreateParams,\r\n MonetizationCreateResult,\r\n ActivateOptions,\r\n RenewalParams,\r\n CancelOptions,\r\n PauseOptions,\r\n ResumeOptions,\r\n ListOptions,\r\n SubscriptionDocument,\r\n TransactionDocument,\r\n PaymentIntentData,\r\n TransactionTypeValue,\r\n} from '../types/index.js';\r\n\r\n/**\r\n * Monetization Service\r\n * Uses DI container for all dependencies\r\n */\r\nexport class MonetizationService {\r\n private readonly models: ModelsRegistry;\r\n private readonly providers: ProvidersRegistry;\r\n private readonly config: RevenueConfig;\r\n private readonly hooks: HooksRegistry;\r\n private readonly logger: Logger;\r\n\r\n constructor(container: Container) {\r\n this.models = container.get<ModelsRegistry>('models');\r\n this.providers = container.get<ProvidersRegistry>('providers');\r\n this.config = container.get<RevenueConfig>('config');\r\n this.hooks = container.get<HooksRegistry>('hooks');\r\n this.logger = container.get<Logger>('logger');\r\n }\r\n\r\n /**\r\n * Create a new monetization (purchase, subscription, or free item)\r\n *\r\n * @param params - Monetization parameters\r\n *\r\n * @example\r\n * // One-time purchase\r\n * await revenue.monetization.create({\r\n * data: {\r\n * organizationId: '...',\r\n * customerId: '...',\r\n * referenceId: order._id,\r\n * referenceModel: 'Order',\r\n * },\r\n * planKey: 'one_time',\r\n * monetizationType: 'purchase',\r\n * gateway: 'bkash',\r\n * amount: 1500,\r\n * });\r\n *\r\n * // Recurring subscription\r\n * await revenue.monetization.create({\r\n * data: {\r\n * organizationId: '...',\r\n * customerId: '...',\r\n * referenceId: subscription._id,\r\n * referenceModel: 'Subscription',\r\n * },\r\n * planKey: 'monthly',\r\n * monetizationType: 'subscription',\r\n * gateway: 'stripe',\r\n * amount: 2000,\r\n * });\r\n *\r\n * @returns Result with subscription, transaction, and paymentIntent\r\n */\r\n async create(params: MonetizationCreateParams): Promise<MonetizationCreateResult> {\r\n const {\r\n data,\r\n planKey,\r\n amount,\r\n currency = 'BDT',\r\n gateway = 'manual',\r\n entity = null,\r\n monetizationType = MONETIZATION_TYPES.SUBSCRIPTION,\r\n paymentData,\r\n metadata = {},\r\n idempotencyKey = null,\r\n } = params;\r\n\r\n // Validate required fields\r\n // Note: organizationId is OPTIONAL (only needed for multi-tenant)\r\n\r\n if (!planKey) {\r\n throw new MissingRequiredFieldError('planKey');\r\n }\r\n\r\n if (amount < 0) {\r\n throw new InvalidAmountError(amount);\r\n }\r\n\r\n const isFree = amount === 0;\r\n\r\n // Get provider\r\n const provider = this.providers[gateway];\r\n if (!provider) {\r\n throw new ProviderNotFoundError(gateway, Object.keys(this.providers));\r\n }\r\n\r\n // Create payment intent if not free\r\n let paymentIntent: PaymentIntentData | null = null;\r\n let transaction: TransactionDocument | null = null;\r\n\r\n if (!isFree) {\r\n // Create payment intent via provider\r\n try {\r\n paymentIntent = await provider.createIntent({\r\n amount,\r\n currency,\r\n metadata: {\r\n ...metadata,\r\n type: 'subscription',\r\n planKey,\r\n },\r\n });\r\n } catch (error) {\r\n throw new PaymentIntentCreationError(gateway, error as Error);\r\n }\r\n\r\n // Resolve category based on entity and monetizationType\r\n const category = resolveCategory(entity, monetizationType, this.config.categoryMappings);\r\n\r\n // Resolve transaction type using config mapping or default to 'income'\r\n const transactionType: TransactionTypeValue = \r\n this.config.transactionTypeMapping?.subscription ??\r\n this.config.transactionTypeMapping?.[monetizationType] ??\r\n TRANSACTION_TYPE.INCOME;\r\n\r\n // Calculate commission if configured\r\n const commissionRate = this.config.commissionRates?.[category] ?? 0;\r\n const gatewayFeeRate = this.config.gatewayFeeRates?.[gateway] ?? 0;\r\n const commission = calculateCommission(amount, commissionRate, gatewayFeeRate);\r\n\r\n // Create transaction record\r\n const TransactionModel = this.models.Transaction;\r\n transaction = await TransactionModel.create({\r\n organizationId: data.organizationId,\r\n customerId: data.customerId ?? null,\r\n amount,\r\n currency,\r\n category,\r\n type: transactionType,\r\n method: ((paymentData as Record<string, unknown>)?.method as string) ?? 'manual',\r\n status: paymentIntent.status === 'succeeded' ? 'verified' : 'pending',\r\n gateway: {\r\n type: gateway,\r\n sessionId: paymentIntent.sessionId,\r\n paymentIntentId: paymentIntent.paymentIntentId,\r\n provider: paymentIntent.provider,\r\n metadata: paymentIntent.metadata,\r\n },\r\n paymentDetails: {\r\n provider: gateway,\r\n ...paymentData,\r\n },\r\n ...(commission && { commission }), // Only include if commission exists\r\n // Polymorphic reference (top-level, not metadata)\r\n ...(data.referenceId && { referenceId: data.referenceId }),\r\n ...(data.referenceModel && { referenceModel: data.referenceModel }),\r\n metadata: {\r\n ...metadata,\r\n planKey,\r\n entity,\r\n monetizationType,\r\n paymentIntentId: paymentIntent.id,\r\n },\r\n idempotencyKey: idempotencyKey ?? `sub_${nanoid(16)}`,\r\n }) as TransactionDocument;\r\n }\r\n\r\n // Create subscription record (if Subscription model exists)\r\n let subscription: SubscriptionDocument | null = null;\r\n if (this.models.Subscription) {\r\n const SubscriptionModel = this.models.Subscription;\r\n\r\n // Create subscription with proper reference tracking\r\n const subscriptionData = {\r\n organizationId: data.organizationId,\r\n customerId: data.customerId ?? null,\r\n planKey,\r\n amount,\r\n currency,\r\n status: isFree ? 'active' : 'pending',\r\n isActive: isFree,\r\n gateway,\r\n transactionId: transaction?._id ?? null,\r\n paymentIntentId: paymentIntent?.id ?? null,\r\n metadata: {\r\n ...metadata,\r\n isFree,\r\n entity,\r\n monetizationType,\r\n },\r\n ...data,\r\n } as Record<string, unknown>;\r\n\r\n // Remove referenceId/referenceModel from subscription (they're for transactions)\r\n delete subscriptionData.referenceId;\r\n delete subscriptionData.referenceModel;\r\n\r\n subscription = await SubscriptionModel.create(subscriptionData) as SubscriptionDocument;\r\n }\r\n\r\n // Trigger hooks - emit specific event based on monetization type\r\n const eventData = {\r\n subscription,\r\n transaction,\r\n paymentIntent,\r\n isFree,\r\n monetizationType,\r\n };\r\n\r\n // Emit specific monetization event\r\n if (monetizationType === MONETIZATION_TYPES.PURCHASE) {\r\n this._triggerHook('purchase.created', eventData);\r\n } else if (monetizationType === MONETIZATION_TYPES.SUBSCRIPTION) {\r\n this._triggerHook('subscription.created', eventData);\r\n } else if (monetizationType === MONETIZATION_TYPES.FREE) {\r\n this._triggerHook('free.created', eventData);\r\n }\r\n\r\n // Also emit generic event for backward compatibility\r\n this._triggerHook('monetization.created', eventData);\r\n\r\n return {\r\n subscription,\r\n transaction,\r\n paymentIntent,\r\n };\r\n }\r\n\r\n /**\r\n * Activate subscription after payment verification\r\n *\r\n * @param subscriptionId - Subscription ID or transaction ID\r\n * @param options - Activation options\r\n * @returns Updated subscription\r\n */\r\n async activate(\r\n subscriptionId: string,\r\n options: ActivateOptions = {}\r\n ): Promise<SubscriptionDocument> {\r\n const { timestamp = new Date() } = options;\r\n\r\n if (!this.models.Subscription) {\r\n throw new ModelNotRegisteredError('Subscription');\r\n }\r\n\r\n const SubscriptionModel = this.models.Subscription;\r\n const subscription = await SubscriptionModel.findById(subscriptionId) as SubscriptionDocument | null;\r\n\r\n if (!subscription) {\r\n throw new SubscriptionNotFoundError(subscriptionId);\r\n }\r\n\r\n if (subscription.isActive) {\r\n this.logger.warn('Subscription already active', { subscriptionId });\r\n return subscription;\r\n }\r\n\r\n // Calculate period dates based on plan\r\n const periodEnd = this._calculatePeriodEnd(subscription.planKey, timestamp);\r\n\r\n // Update subscription\r\n subscription.isActive = true;\r\n subscription.status = 'active';\r\n subscription.startDate = timestamp;\r\n subscription.endDate = periodEnd;\r\n subscription.activatedAt = timestamp;\r\n\r\n await subscription.save();\r\n\r\n // Trigger hook\r\n this._triggerHook('subscription.activated', {\r\n subscription,\r\n activatedAt: timestamp,\r\n });\r\n\r\n return subscription;\r\n }\r\n\r\n /**\r\n * Renew subscription\r\n *\r\n * @param subscriptionId - Subscription ID\r\n * @param params - Renewal parameters\r\n * @returns { subscription, transaction, paymentIntent }\r\n */\r\n async renew(\r\n subscriptionId: string,\r\n params: RenewalParams = {}\r\n ): Promise<MonetizationCreateResult> {\r\n const {\r\n gateway = 'manual',\r\n entity = null,\r\n paymentData,\r\n metadata = {},\r\n idempotencyKey = null,\r\n } = params;\r\n\r\n if (!this.models.Subscription) {\r\n throw new ModelNotRegisteredError('Subscription');\r\n }\r\n\r\n const SubscriptionModel = this.models.Subscription;\r\n const subscription = await SubscriptionModel.findById(subscriptionId) as SubscriptionDocument | null;\r\n\r\n if (!subscription) {\r\n throw new SubscriptionNotFoundError(subscriptionId);\r\n }\r\n\r\n if (subscription.amount === 0) {\r\n throw new InvalidAmountError(0, 'Free subscriptions do not require renewal');\r\n }\r\n\r\n // Get provider\r\n const provider = this.providers[gateway];\r\n if (!provider) {\r\n throw new ProviderNotFoundError(gateway, Object.keys(this.providers));\r\n }\r\n\r\n // Create payment intent\r\n let paymentIntent: PaymentIntentData | null = null;\r\n try {\r\n paymentIntent = await provider.createIntent({\r\n amount: subscription.amount,\r\n currency: subscription.currency ?? 'BDT',\r\n metadata: {\r\n ...metadata,\r\n type: 'subscription_renewal',\r\n subscriptionId: subscription._id.toString(),\r\n },\r\n });\r\n } catch (error) {\r\n this.logger.error('Failed to create payment intent for renewal:', error);\r\n throw new PaymentIntentCreationError(gateway, error as Error);\r\n }\r\n\r\n // Resolve category - use provided entity or inherit from subscription metadata\r\n const effectiveEntity = entity ?? (subscription.metadata as Record<string, unknown>)?.entity as string | null;\r\n const effectiveMonetizationType = \r\n ((subscription.metadata as Record<string, unknown>)?.monetizationType as string) ?? MONETIZATION_TYPES.SUBSCRIPTION;\r\n const category = resolveCategory(effectiveEntity, effectiveMonetizationType as 'subscription' | 'purchase' | 'free', this.config.categoryMappings);\r\n\r\n // Resolve transaction type using config mapping or default to 'income'\r\n const transactionType: TransactionTypeValue = \r\n this.config.transactionTypeMapping?.subscription_renewal ??\r\n this.config.transactionTypeMapping?.subscription ??\r\n this.config.transactionTypeMapping?.[effectiveMonetizationType] ??\r\n TRANSACTION_TYPE.INCOME;\r\n\r\n // Calculate commission if configured\r\n const commissionRate = this.config.commissionRates?.[category] ?? 0;\r\n const gatewayFeeRate = this.config.gatewayFeeRates?.[gateway] ?? 0;\r\n const commission = calculateCommission(subscription.amount, commissionRate, gatewayFeeRate);\r\n\r\n // Create transaction\r\n const TransactionModel = this.models.Transaction;\r\n const transaction = await TransactionModel.create({\r\n organizationId: subscription.organizationId,\r\n customerId: subscription.customerId,\r\n amount: subscription.amount,\r\n currency: subscription.currency ?? 'BDT',\r\n category,\r\n type: transactionType,\r\n method: ((paymentData as Record<string, unknown>)?.method as string) ?? 'manual',\r\n status: paymentIntent.status === 'succeeded' ? 'verified' : 'pending',\r\n gateway: {\r\n type: gateway,\r\n sessionId: paymentIntent.sessionId,\r\n paymentIntentId: paymentIntent.paymentIntentId,\r\n provider: paymentIntent.provider,\r\n metadata: paymentIntent.metadata,\r\n },\r\n paymentDetails: {\r\n provider: gateway,\r\n ...paymentData,\r\n },\r\n ...(commission && { commission }), // Only include if commission exists\r\n // Polymorphic reference to subscription\r\n referenceId: subscription._id,\r\n referenceModel: 'Subscription',\r\n metadata: {\r\n ...metadata,\r\n subscriptionId: subscription._id.toString(), // Keep for backward compat\r\n entity: effectiveEntity,\r\n monetizationType: effectiveMonetizationType,\r\n isRenewal: true,\r\n paymentIntentId: paymentIntent.id,\r\n },\r\n idempotencyKey: idempotencyKey ?? `renewal_${nanoid(16)}`,\r\n }) as TransactionDocument;\r\n\r\n // Update subscription\r\n subscription.status = 'pending_renewal' as SubscriptionDocument['status'];\r\n subscription.renewalTransactionId = transaction._id;\r\n subscription.renewalCount = (subscription.renewalCount ?? 0) + 1;\r\n await subscription.save();\r\n\r\n // Trigger hook\r\n this._triggerHook('subscription.renewed', {\r\n subscription,\r\n transaction,\r\n paymentIntent,\r\n renewalCount: subscription.renewalCount,\r\n });\r\n\r\n return {\r\n subscription,\r\n transaction,\r\n paymentIntent,\r\n };\r\n }\r\n\r\n /**\r\n * Cancel subscription\r\n *\r\n * @param subscriptionId - Subscription ID\r\n * @param options - Cancellation options\r\n * @returns Updated subscription\r\n */\r\n async cancel(\r\n subscriptionId: string,\r\n options: CancelOptions = {}\r\n ): Promise<SubscriptionDocument> {\r\n const { immediate = false, reason = null } = options;\r\n\r\n if (!this.models.Subscription) {\r\n throw new ModelNotRegisteredError('Subscription');\r\n }\r\n\r\n const SubscriptionModel = this.models.Subscription;\r\n const subscription = await SubscriptionModel.findById(subscriptionId) as SubscriptionDocument | null;\r\n\r\n if (!subscription) {\r\n throw new SubscriptionNotFoundError(subscriptionId);\r\n }\r\n\r\n const now = new Date();\r\n\r\n if (immediate) {\r\n subscription.isActive = false;\r\n subscription.status = 'cancelled';\r\n subscription.canceledAt = now;\r\n subscription.cancellationReason = reason;\r\n } else {\r\n // Schedule cancellation at period end\r\n subscription.cancelAt = subscription.endDate ?? now;\r\n subscription.cancellationReason = reason;\r\n }\r\n\r\n await subscription.save();\r\n\r\n // Trigger hook\r\n this._triggerHook('subscription.cancelled', {\r\n subscription,\r\n immediate,\r\n reason,\r\n canceledAt: immediate ? now : subscription.cancelAt,\r\n });\r\n\r\n return subscription;\r\n }\r\n\r\n /**\r\n * Pause subscription\r\n *\r\n * @param subscriptionId - Subscription ID\r\n * @param options - Pause options\r\n * @returns Updated subscription\r\n */\r\n async pause(\r\n subscriptionId: string,\r\n options: PauseOptions = {}\r\n ): Promise<SubscriptionDocument> {\r\n const { reason = null } = options;\r\n\r\n if (!this.models.Subscription) {\r\n throw new ModelNotRegisteredError('Subscription');\r\n }\r\n\r\n const SubscriptionModel = this.models.Subscription;\r\n const subscription = await SubscriptionModel.findById(subscriptionId) as SubscriptionDocument | null;\r\n\r\n if (!subscription) {\r\n throw new SubscriptionNotFoundError(subscriptionId);\r\n }\r\n\r\n if (!subscription.isActive) {\r\n throw new SubscriptionNotActiveError(subscriptionId, 'Only active subscriptions can be paused');\r\n }\r\n\r\n const pausedAt = new Date();\r\n subscription.isActive = false;\r\n subscription.status = 'paused';\r\n subscription.pausedAt = pausedAt;\r\n subscription.pauseReason = reason;\r\n\r\n await subscription.save();\r\n\r\n // Trigger hook\r\n this._triggerHook('subscription.paused', {\r\n subscription,\r\n reason,\r\n pausedAt,\r\n });\r\n\r\n return subscription;\r\n }\r\n\r\n /**\r\n * Resume subscription\r\n *\r\n * @param subscriptionId - Subscription ID\r\n * @param options - Resume options\r\n * @returns Updated subscription\r\n */\r\n async resume(\r\n subscriptionId: string,\r\n options: ResumeOptions = {}\r\n ): Promise<SubscriptionDocument> {\r\n const { extendPeriod = false } = options;\r\n\r\n if (!this.models.Subscription) {\r\n throw new ModelNotRegisteredError('Subscription');\r\n }\r\n\r\n const SubscriptionModel = this.models.Subscription;\r\n const subscription = await SubscriptionModel.findById(subscriptionId) as SubscriptionDocument | null;\r\n\r\n if (!subscription) {\r\n throw new SubscriptionNotFoundError(subscriptionId);\r\n }\r\n\r\n if (!subscription.pausedAt) {\r\n throw new InvalidStateTransitionError(\r\n 'resume',\r\n 'paused',\r\n subscription.status,\r\n 'Only paused subscriptions can be resumed'\r\n );\r\n }\r\n\r\n const now = new Date();\r\n const pausedAt = new Date(subscription.pausedAt);\r\n const pauseDuration = now.getTime() - pausedAt.getTime();\r\n\r\n subscription.isActive = true;\r\n subscription.status = 'active';\r\n subscription.pausedAt = null;\r\n subscription.pauseReason = null;\r\n\r\n // Optionally extend period by pause duration\r\n if (extendPeriod && subscription.endDate) {\r\n const currentEnd = new Date(subscription.endDate);\r\n subscription.endDate = new Date(currentEnd.getTime() + pauseDuration);\r\n }\r\n\r\n await subscription.save();\r\n\r\n // Trigger hook\r\n this._triggerHook('subscription.resumed', {\r\n subscription,\r\n extendPeriod,\r\n pauseDuration,\r\n resumedAt: now,\r\n });\r\n\r\n return subscription;\r\n }\r\n\r\n /**\r\n * List subscriptions with filters\r\n *\r\n * @param filters - Query filters\r\n * @param options - Query options (limit, skip, sort)\r\n * @returns Subscriptions\r\n */\r\n async list(\r\n filters: Record<string, unknown> = {},\r\n options: ListOptions = {}\r\n ): Promise<SubscriptionDocument[]> {\r\n if (!this.models.Subscription) {\r\n throw new ModelNotRegisteredError('Subscription');\r\n }\r\n\r\n const SubscriptionModel = this.models.Subscription;\r\n const { limit = 50, skip = 0, sort = { createdAt: -1 } } = options;\r\n\r\n const subscriptions = await (SubscriptionModel as unknown as {\r\n find(filter: object): { limit(n: number): { skip(n: number): { sort(s: object): Promise<SubscriptionDocument[]> } } };\r\n })\r\n .find(filters)\r\n .limit(limit)\r\n .skip(skip)\r\n .sort(sort);\r\n\r\n return subscriptions;\r\n }\r\n\r\n /**\r\n * Get subscription by ID\r\n *\r\n * @param subscriptionId - Subscription ID\r\n * @returns Subscription\r\n */\r\n async get(subscriptionId: string): Promise<SubscriptionDocument> {\r\n if (!this.models.Subscription) {\r\n throw new ModelNotRegisteredError('Subscription');\r\n }\r\n\r\n const SubscriptionModel = this.models.Subscription;\r\n const subscription = await SubscriptionModel.findById(subscriptionId) as SubscriptionDocument | null;\r\n\r\n if (!subscription) {\r\n throw new SubscriptionNotFoundError(subscriptionId);\r\n }\r\n\r\n return subscription;\r\n }\r\n\r\n /**\r\n * Calculate period end date based on plan key\r\n * @private\r\n */\r\n private _calculatePeriodEnd(planKey: string, startDate: Date = new Date()): Date {\r\n const start = new Date(startDate);\r\n const end = new Date(start);\r\n\r\n switch (planKey) {\r\n case 'monthly':\r\n end.setMonth(end.getMonth() + 1);\r\n break;\r\n case 'quarterly':\r\n end.setMonth(end.getMonth() + 3);\r\n break;\r\n case 'yearly':\r\n end.setFullYear(end.getFullYear() + 1);\r\n break;\r\n default:\r\n // Default to 30 days\r\n end.setDate(end.getDate() + 30);\r\n }\r\n\r\n return end;\r\n }\r\n\r\n /**\r\n * Trigger event hook (fire-and-forget, non-blocking)\r\n * @private\r\n */\r\n private _triggerHook(event: string, data: unknown): void {\r\n triggerHook(this.hooks, event, data, this.logger);\r\n }\r\n}\r\n\r\nexport default MonetizationService;\r\n\r\n","/**\r\n * Payment Service\r\n * @classytic/revenue\r\n *\r\n * Framework-agnostic payment verification and management service with DI\r\n * Handles payment verification, refunds, and status updates\r\n */\r\n\r\nimport {\r\n TransactionNotFoundError,\r\n ProviderNotFoundError,\r\n ProviderError,\r\n AlreadyVerifiedError,\r\n PaymentVerificationError,\r\n RefundNotSupportedError,\r\n RefundError,\r\n ProviderCapabilityError,\r\n ValidationError,\r\n} from '../core/errors.js';\r\nimport { triggerHook } from '../utils/hooks.js';\r\nimport { reverseCommission } from '../utils/commission.js';\r\nimport { TRANSACTION_TYPE } from '../enums/transaction.enums.js';\r\nimport type { Container } from '../core/container.js';\r\nimport type {\r\n ModelsRegistry,\r\n ProvidersRegistry,\r\n HooksRegistry,\r\n RevenueConfig,\r\n Logger,\r\n TransactionDocument,\r\n PaymentVerifyOptions,\r\n PaymentVerifyResult,\r\n PaymentStatusResult,\r\n RefundOptions,\r\n PaymentRefundResult,\r\n WebhookResult,\r\n ListOptions,\r\n PaymentResultData,\r\n PaymentProviderInterface,\r\n TransactionTypeValue,\r\n MongooseModel,\r\n} from '../types/index.js';\r\n\r\n/**\r\n * Payment Service\r\n * Uses DI container for all dependencies\r\n */\r\nexport class PaymentService {\r\n private readonly models: ModelsRegistry;\r\n private readonly providers: ProvidersRegistry;\r\n private readonly config: RevenueConfig;\r\n private readonly hooks: HooksRegistry;\r\n private readonly logger: Logger;\r\n\r\n constructor(container: Container) {\r\n this.models = container.get<ModelsRegistry>('models');\r\n this.providers = container.get<ProvidersRegistry>('providers');\r\n this.config = container.get<RevenueConfig>('config');\r\n this.hooks = container.get<HooksRegistry>('hooks');\r\n this.logger = container.get<Logger>('logger');\r\n }\r\n\r\n /**\r\n * Verify a payment\r\n *\r\n * @param paymentIntentId - Payment intent ID, session ID, or transaction ID\r\n * @param options - Verification options\r\n * @returns { transaction, status }\r\n */\r\n async verify(\r\n paymentIntentId: string,\r\n options: PaymentVerifyOptions = {}\r\n ): Promise<PaymentVerifyResult> {\r\n const { verifiedBy = null } = options;\r\n\r\n const TransactionModel = this.models.Transaction;\r\n const transaction = await this._findTransaction(TransactionModel, paymentIntentId);\r\n\r\n if (!transaction) {\r\n throw new TransactionNotFoundError(paymentIntentId);\r\n }\r\n\r\n if (transaction.status === 'verified' || transaction.status === 'completed') {\r\n throw new AlreadyVerifiedError(transaction._id.toString());\r\n }\r\n\r\n // Get provider for verification\r\n const gatewayType = transaction.gateway?.type ?? 'manual';\r\n const provider = this.providers[gatewayType];\r\n\r\n if (!provider) {\r\n throw new ProviderNotFoundError(gatewayType, Object.keys(this.providers));\r\n }\r\n\r\n // Verify payment with provider\r\n let paymentResult: PaymentResultData | null = null;\r\n try {\r\n paymentResult = await provider.verifyPayment(paymentIntentId);\r\n } catch (error) {\r\n this.logger.error('Payment verification failed:', error);\r\n\r\n // Update transaction as failed\r\n transaction.status = 'failed';\r\n transaction.failureReason = (error as Error).message;\r\n transaction.metadata = {\r\n ...transaction.metadata,\r\n verificationError: (error as Error).message,\r\n failedAt: new Date().toISOString(),\r\n };\r\n await transaction.save();\r\n\r\n // Trigger payment.failed hook\r\n this._triggerHook('payment.failed', {\r\n transaction,\r\n error: (error as Error).message,\r\n provider: gatewayType,\r\n paymentIntentId,\r\n });\r\n\r\n throw new PaymentVerificationError(paymentIntentId, (error as Error).message);\r\n }\r\n\r\n // Validate amount and currency match\r\n if (paymentResult.amount && paymentResult.amount !== transaction.amount) {\r\n throw new ValidationError(\r\n `Amount mismatch: expected ${transaction.amount}, got ${paymentResult.amount}`,\r\n { expected: transaction.amount, actual: paymentResult.amount }\r\n );\r\n }\r\n\r\n if (paymentResult.currency && paymentResult.currency.toUpperCase() !== transaction.currency.toUpperCase()) {\r\n throw new ValidationError(\r\n `Currency mismatch: expected ${transaction.currency}, got ${paymentResult.currency}`,\r\n { expected: transaction.currency, actual: paymentResult.currency }\r\n );\r\n }\r\n\r\n // Update transaction based on verification result\r\n transaction.status = paymentResult.status === 'succeeded' ? 'verified' : paymentResult.status;\r\n transaction.verifiedAt = paymentResult.paidAt ?? new Date();\r\n transaction.verifiedBy = verifiedBy;\r\n transaction.gateway = {\r\n ...transaction.gateway,\r\n type: transaction.gateway?.type ?? 'manual',\r\n verificationData: paymentResult.metadata,\r\n };\r\n\r\n await transaction.save();\r\n\r\n // Trigger hook\r\n this._triggerHook('payment.verified', {\r\n transaction,\r\n paymentResult,\r\n verifiedBy,\r\n });\r\n\r\n return {\r\n transaction,\r\n paymentResult,\r\n status: transaction.status,\r\n };\r\n }\r\n\r\n /**\r\n * Get payment status\r\n *\r\n * @param paymentIntentId - Payment intent ID, session ID, or transaction ID\r\n * @returns { transaction, status }\r\n */\r\n async getStatus(paymentIntentId: string): Promise<PaymentStatusResult> {\r\n const TransactionModel = this.models.Transaction;\r\n const transaction = await this._findTransaction(TransactionModel, paymentIntentId);\r\n\r\n if (!transaction) {\r\n throw new TransactionNotFoundError(paymentIntentId);\r\n }\r\n\r\n // Get provider\r\n const gatewayType = transaction.gateway?.type ?? 'manual';\r\n const provider = this.providers[gatewayType];\r\n\r\n if (!provider) {\r\n throw new ProviderNotFoundError(gatewayType, Object.keys(this.providers));\r\n }\r\n\r\n // Get status from provider\r\n let paymentResult: PaymentResultData | null = null;\r\n try {\r\n paymentResult = await provider.getStatus(paymentIntentId);\r\n } catch (error) {\r\n this.logger.warn('Failed to get payment status from provider:', error);\r\n // Return transaction status as fallback\r\n return {\r\n transaction,\r\n status: transaction.status,\r\n provider: gatewayType,\r\n };\r\n }\r\n\r\n return {\r\n transaction,\r\n paymentResult,\r\n status: paymentResult.status,\r\n provider: gatewayType,\r\n };\r\n }\r\n\r\n /**\r\n * Refund a payment\r\n *\r\n * @param paymentId - Payment intent ID, session ID, or transaction ID\r\n * @param amount - Amount to refund (optional, full refund if not provided)\r\n * @param options - Refund options\r\n * @returns { transaction, refundResult }\r\n */\r\n async refund(\r\n paymentId: string,\r\n amount: number | null = null,\r\n options: RefundOptions = {}\r\n ): Promise<PaymentRefundResult> {\r\n const { reason = null } = options;\r\n\r\n const TransactionModel = this.models.Transaction;\r\n const transaction = await this._findTransaction(TransactionModel, paymentId);\r\n\r\n if (!transaction) {\r\n throw new TransactionNotFoundError(paymentId);\r\n }\r\n\r\n if (transaction.status !== 'verified' && transaction.status !== 'completed') {\r\n throw new RefundError(transaction._id.toString(), 'Only verified/completed transactions can be refunded');\r\n }\r\n\r\n // Get provider\r\n const gatewayType = transaction.gateway?.type ?? 'manual';\r\n const provider = this.providers[gatewayType];\r\n\r\n if (!provider) {\r\n throw new ProviderNotFoundError(gatewayType, Object.keys(this.providers));\r\n }\r\n\r\n // Check if provider supports refunds\r\n const capabilities = provider.getCapabilities();\r\n if (!capabilities.supportsRefunds) {\r\n throw new RefundNotSupportedError(gatewayType);\r\n }\r\n\r\n // Calculate refundable amount\r\n const refundedSoFar = transaction.refundedAmount ?? 0;\r\n const refundableAmount = transaction.amount - refundedSoFar;\r\n const refundAmount = amount ?? refundableAmount;\r\n\r\n // Validate refund amount\r\n if (refundAmount <= 0) {\r\n throw new ValidationError(`Refund amount must be positive, got ${refundAmount}`);\r\n }\r\n\r\n if (refundAmount > refundableAmount) {\r\n throw new ValidationError(\r\n `Refund amount (${refundAmount}) exceeds refundable balance (${refundableAmount})`,\r\n { refundAmount, refundableAmount, alreadyRefunded: refundedSoFar }\r\n );\r\n }\r\n\r\n // Refund via provider\r\n let refundResult;\r\n\r\n try {\r\n refundResult = await provider.refund(paymentId, refundAmount, { reason: reason ?? undefined });\r\n } catch (error) {\r\n this.logger.error('Refund failed:', error);\r\n throw new RefundError(paymentId, (error as Error).message);\r\n }\r\n\r\n // Create separate refund transaction (EXPENSE) for proper accounting\r\n const refundTransactionType: TransactionTypeValue = \r\n this.config.transactionTypeMapping?.refund ?? TRANSACTION_TYPE.EXPENSE;\r\n\r\n // Reverse commission proportionally for refund\r\n const refundCommission = transaction.commission\r\n ? reverseCommission(transaction.commission, transaction.amount, refundAmount)\r\n : null;\r\n\r\n const refundTransaction = await TransactionModel.create({\r\n organizationId: transaction.organizationId,\r\n customerId: transaction.customerId,\r\n amount: refundAmount,\r\n currency: transaction.currency,\r\n category: transaction.category,\r\n type: refundTransactionType, // EXPENSE - money going out\r\n method: transaction.method ?? 'manual',\r\n status: 'completed',\r\n gateway: {\r\n type: transaction.gateway?.type ?? 'manual',\r\n paymentIntentId: refundResult.id,\r\n provider: refundResult.provider,\r\n },\r\n paymentDetails: transaction.paymentDetails,\r\n ...(refundCommission && { commission: refundCommission }), // Reversed commission\r\n // Polymorphic reference (copy from original transaction)\r\n ...(transaction.referenceId && { referenceId: transaction.referenceId }),\r\n ...(transaction.referenceModel && { referenceModel: transaction.referenceModel }),\r\n metadata: {\r\n ...transaction.metadata,\r\n isRefund: true,\r\n originalTransactionId: transaction._id.toString(),\r\n refundReason: reason,\r\n refundResult: refundResult.metadata,\r\n },\r\n idempotencyKey: `refund_${transaction._id}_${Date.now()}`,\r\n }) as TransactionDocument;\r\n\r\n // Update original transaction status\r\n const isPartialRefund = refundAmount < transaction.amount;\r\n transaction.status = isPartialRefund ? 'partially_refunded' : 'refunded';\r\n transaction.refundedAmount = (transaction.refundedAmount ?? 0) + refundAmount;\r\n transaction.refundedAt = refundResult.refundedAt ?? new Date();\r\n transaction.metadata = {\r\n ...transaction.metadata,\r\n refundTransactionId: refundTransaction._id.toString(),\r\n refundReason: reason,\r\n };\r\n\r\n await transaction.save();\r\n\r\n // Trigger hook\r\n this._triggerHook('payment.refunded', {\r\n transaction,\r\n refundTransaction,\r\n refundResult,\r\n refundAmount,\r\n reason,\r\n isPartialRefund,\r\n });\r\n\r\n return {\r\n transaction,\r\n refundTransaction,\r\n refundResult,\r\n status: transaction.status,\r\n };\r\n }\r\n\r\n /**\r\n * Handle webhook from payment provider\r\n *\r\n * @param provider - Provider name\r\n * @param payload - Webhook payload\r\n * @param headers - Request headers\r\n * @returns { event, transaction }\r\n */\r\n async handleWebhook(\r\n providerName: string,\r\n payload: unknown,\r\n headers: Record<string, string> = {}\r\n ): Promise<WebhookResult> {\r\n const provider = this.providers[providerName];\r\n\r\n if (!provider) {\r\n throw new ProviderNotFoundError(providerName, Object.keys(this.providers));\r\n }\r\n\r\n // Check if provider supports webhooks\r\n const capabilities = provider.getCapabilities();\r\n if (!capabilities.supportsWebhooks) {\r\n throw new ProviderCapabilityError(providerName, 'webhooks');\r\n }\r\n\r\n // Process webhook via provider\r\n let webhookEvent;\r\n try {\r\n webhookEvent = await provider.handleWebhook(payload, headers);\r\n } catch (error) {\r\n this.logger.error('Webhook processing failed:', error);\r\n throw new ProviderError(\r\n `Webhook processing failed for ${providerName}: ${(error as Error).message}`,\r\n 'WEBHOOK_PROCESSING_FAILED',\r\n { retryable: false }\r\n );\r\n }\r\n\r\n // Validate webhook event structure\r\n if (!webhookEvent?.data?.sessionId && !webhookEvent?.data?.paymentIntentId) {\r\n throw new ValidationError(\r\n `Invalid webhook event structure from ${providerName}: missing sessionId or paymentIntentId`,\r\n { provider: providerName, eventType: webhookEvent?.type }\r\n );\r\n }\r\n\r\n // Find transaction by sessionId first (for checkout flows), then paymentIntentId\r\n const TransactionModel = this.models.Transaction;\r\n let transaction: TransactionDocument | null = null;\r\n\r\n if (webhookEvent.data.sessionId) {\r\n transaction = await (TransactionModel as unknown as {\r\n findOne(filter: object): Promise<TransactionDocument | null>;\r\n }).findOne({\r\n 'gateway.sessionId': webhookEvent.data.sessionId,\r\n });\r\n }\r\n\r\n if (!transaction && webhookEvent.data.paymentIntentId) {\r\n transaction = await (TransactionModel as unknown as {\r\n findOne(filter: object): Promise<TransactionDocument | null>;\r\n }).findOne({\r\n 'gateway.paymentIntentId': webhookEvent.data.paymentIntentId,\r\n });\r\n }\r\n\r\n if (!transaction) {\r\n this.logger.warn('Transaction not found for webhook event', {\r\n provider: providerName,\r\n eventId: webhookEvent.id,\r\n sessionId: webhookEvent.data.sessionId,\r\n paymentIntentId: webhookEvent.data.paymentIntentId,\r\n });\r\n throw new TransactionNotFoundError(\r\n webhookEvent.data.sessionId ?? webhookEvent.data.paymentIntentId ?? 'unknown'\r\n );\r\n }\r\n\r\n // Update gateway with complete information from webhook\r\n if (webhookEvent.data.sessionId && !transaction.gateway?.sessionId) {\r\n transaction.gateway = {\r\n ...transaction.gateway,\r\n type: transaction.gateway?.type ?? 'manual',\r\n sessionId: webhookEvent.data.sessionId,\r\n };\r\n }\r\n if (webhookEvent.data.paymentIntentId && !transaction.gateway?.paymentIntentId) {\r\n transaction.gateway = {\r\n ...transaction.gateway,\r\n type: transaction.gateway?.type ?? 'manual',\r\n paymentIntentId: webhookEvent.data.paymentIntentId,\r\n };\r\n }\r\n\r\n // Check for duplicate webhook processing (idempotency)\r\n if (transaction.webhook?.eventId === webhookEvent.id && transaction.webhook?.processedAt) {\r\n this.logger.warn('Webhook already processed', {\r\n transactionId: transaction._id,\r\n eventId: webhookEvent.id,\r\n });\r\n return {\r\n event: webhookEvent,\r\n transaction,\r\n status: 'already_processed',\r\n };\r\n }\r\n\r\n // Update transaction based on webhook event\r\n transaction.webhook = {\r\n eventId: webhookEvent.id,\r\n eventType: webhookEvent.type,\r\n receivedAt: new Date(),\r\n processedAt: new Date(),\r\n data: webhookEvent.data,\r\n };\r\n\r\n // Update status based on webhook type\r\n if (webhookEvent.type === 'payment.succeeded') {\r\n transaction.status = 'verified';\r\n transaction.verifiedAt = webhookEvent.createdAt;\r\n } else if (webhookEvent.type === 'payment.failed') {\r\n transaction.status = 'failed';\r\n } else if (webhookEvent.type === 'refund.succeeded') {\r\n transaction.status = 'refunded';\r\n transaction.refundedAt = webhookEvent.createdAt;\r\n }\r\n\r\n await transaction.save();\r\n\r\n // Trigger hook\r\n this._triggerHook(`payment.webhook.${webhookEvent.type}`, {\r\n event: webhookEvent,\r\n transaction,\r\n });\r\n\r\n return {\r\n event: webhookEvent,\r\n transaction,\r\n status: 'processed',\r\n };\r\n }\r\n\r\n /**\r\n * List payments/transactions with filters\r\n *\r\n * @param filters - Query filters\r\n * @param options - Query options (limit, skip, sort)\r\n * @returns Transactions\r\n */\r\n async list(\r\n filters: Record<string, unknown> = {},\r\n options: ListOptions = {}\r\n ): Promise<TransactionDocument[]> {\r\n const TransactionModel = this.models.Transaction;\r\n const { limit = 50, skip = 0, sort = { createdAt: -1 } } = options;\r\n\r\n const transactions = await (TransactionModel as unknown as {\r\n find(filter: object): { limit(n: number): { skip(n: number): { sort(s: object): Promise<TransactionDocument[]> } } };\r\n })\r\n .find(filters)\r\n .limit(limit)\r\n .skip(skip)\r\n .sort(sort);\r\n\r\n return transactions;\r\n }\r\n\r\n /**\r\n * Get payment/transaction by ID\r\n *\r\n * @param transactionId - Transaction ID\r\n * @returns Transaction\r\n */\r\n async get(transactionId: string): Promise<TransactionDocument> {\r\n const TransactionModel = this.models.Transaction;\r\n const transaction = await TransactionModel.findById(transactionId) as TransactionDocument | null;\r\n\r\n if (!transaction) {\r\n throw new TransactionNotFoundError(transactionId);\r\n }\r\n\r\n return transaction;\r\n }\r\n\r\n /**\r\n * Get provider instance\r\n *\r\n * @param providerName - Provider name\r\n * @returns Provider instance\r\n */\r\n getProvider(providerName: string): PaymentProviderInterface {\r\n const provider = this.providers[providerName];\r\n if (!provider) {\r\n throw new ProviderNotFoundError(providerName, Object.keys(this.providers));\r\n }\r\n return provider;\r\n }\r\n\r\n /**\r\n * Trigger event hook (fire-and-forget, non-blocking)\r\n * @private\r\n */\r\n private _triggerHook(event: string, data: unknown): void {\r\n triggerHook(this.hooks, event, data, this.logger);\r\n }\r\n\r\n /**\r\n * Find transaction by sessionId, paymentIntentId, or transaction ID\r\n * @private\r\n */\r\n private async _findTransaction(\r\n TransactionModel: MongooseModel<TransactionDocument>,\r\n identifier: string\r\n ): Promise<TransactionDocument | null> {\r\n let transaction = await (TransactionModel as unknown as {\r\n findOne(filter: object): Promise<TransactionDocument | null>;\r\n }).findOne({\r\n 'gateway.sessionId': identifier,\r\n });\r\n\r\n if (!transaction) {\r\n transaction = await (TransactionModel as unknown as {\r\n findOne(filter: object): Promise<TransactionDocument | null>;\r\n }).findOne({\r\n 'gateway.paymentIntentId': identifier,\r\n });\r\n }\r\n\r\n if (!transaction) {\r\n transaction = await TransactionModel.findById(identifier) as TransactionDocument | null;\r\n }\r\n\r\n return transaction;\r\n }\r\n}\r\n\r\nexport default PaymentService;\r\n\r\n","/**\r\n * Transaction Service\r\n * @classytic/revenue\r\n *\r\n * Thin, focused transaction service for core operations\r\n * Users handle their own analytics, exports, and complex queries\r\n *\r\n * Works with ANY model implementation:\r\n * - Plain Mongoose models\r\n * - @classytic/mongokit Repository instances\r\n * - Any other abstraction with compatible interface\r\n */\r\n\r\nimport { TransactionNotFoundError } from '../core/errors.js';\r\nimport { triggerHook } from '../utils/hooks.js';\r\nimport type { Container } from '../core/container.js';\r\nimport type {\r\n ModelsRegistry,\r\n HooksRegistry,\r\n Logger,\r\n TransactionDocument,\r\n TransactionListResult,\r\n ListOptions,\r\n} from '../types/index.js';\r\n\r\n/**\r\n * Transaction Service\r\n * Focused on core transaction lifecycle operations\r\n */\r\nexport class TransactionService {\r\n private readonly models: ModelsRegistry;\r\n private readonly hooks: HooksRegistry;\r\n private readonly logger: Logger;\r\n\r\n constructor(container: Container) {\r\n this.models = container.get<ModelsRegistry>('models');\r\n this.hooks = container.get<HooksRegistry>('hooks');\r\n this.logger = container.get<Logger>('logger');\r\n }\r\n\r\n /**\r\n * Get transaction by ID\r\n *\r\n * @param transactionId - Transaction ID\r\n * @returns Transaction\r\n */\r\n async get(transactionId: string): Promise<TransactionDocument> {\r\n const TransactionModel = this.models.Transaction;\r\n const transaction = await TransactionModel.findById(transactionId) as TransactionDocument | null;\r\n\r\n if (!transaction) {\r\n throw new TransactionNotFoundError(transactionId);\r\n }\r\n\r\n return transaction;\r\n }\r\n\r\n /**\r\n * List transactions with filters\r\n *\r\n * @param filters - Query filters\r\n * @param options - Query options (limit, skip, sort, populate)\r\n * @returns { transactions, total, page, limit }\r\n */\r\n async list(\r\n filters: Record<string, unknown> = {},\r\n options: ListOptions = {}\r\n ): Promise<TransactionListResult> {\r\n const TransactionModel = this.models.Transaction;\r\n const {\r\n limit = 50,\r\n skip = 0,\r\n page = null,\r\n sort = { createdAt: -1 },\r\n populate = [],\r\n } = options;\r\n\r\n // Calculate pagination\r\n const actualSkip = page ? (page - 1) * limit : skip;\r\n\r\n // Build query\r\n type QueryBuilder = {\r\n find(filter: object): QueryBuilder;\r\n limit(n: number): QueryBuilder;\r\n skip(n: number): QueryBuilder;\r\n sort(s: object): QueryBuilder;\r\n populate(field: string): QueryBuilder;\r\n then<T>(resolve: (value: TransactionDocument[]) => T): Promise<T>;\r\n };\r\n\r\n let query = (TransactionModel as unknown as {\r\n find(filter: object): QueryBuilder;\r\n }).find(filters)\r\n .limit(limit)\r\n .skip(actualSkip)\r\n .sort(sort);\r\n\r\n // Apply population if supported\r\n if (populate.length > 0 && typeof query.populate === 'function') {\r\n populate.forEach((field) => {\r\n query = query.populate(field);\r\n });\r\n }\r\n\r\n const transactions = await query as unknown as TransactionDocument[];\r\n\r\n // Count documents (works with both Mongoose and Repository)\r\n type ModelWithCount = {\r\n countDocuments?(filter: object): Promise<number>;\r\n count?(filter: object): Promise<number>;\r\n };\r\n\r\n const model = TransactionModel as unknown as ModelWithCount;\r\n const total = await (model.countDocuments\r\n ? model.countDocuments(filters)\r\n : model.count?.(filters)) ?? 0;\r\n\r\n return {\r\n transactions,\r\n total,\r\n page: page ?? Math.floor(actualSkip / limit) + 1,\r\n limit,\r\n pages: Math.ceil(total / limit),\r\n };\r\n }\r\n\r\n /**\r\n * Update transaction\r\n *\r\n * @param transactionId - Transaction ID\r\n * @param updates - Fields to update\r\n * @returns Updated transaction\r\n */\r\n async update(\r\n transactionId: string,\r\n updates: Partial<TransactionDocument>\r\n ): Promise<TransactionDocument> {\r\n const TransactionModel = this.models.Transaction;\r\n\r\n // Support both Repository pattern and Mongoose\r\n type ModelWithUpdate = {\r\n update?(id: string, data: object): Promise<TransactionDocument | null>;\r\n findByIdAndUpdate?(id: string, data: object, options?: object): Promise<TransactionDocument | null>;\r\n };\r\n\r\n const model = TransactionModel as unknown as ModelWithUpdate;\r\n let transaction: TransactionDocument | null;\r\n\r\n if (typeof model.update === 'function') {\r\n // Repository pattern\r\n transaction = await model.update(transactionId, updates);\r\n } else if (typeof model.findByIdAndUpdate === 'function') {\r\n // Plain Mongoose\r\n transaction = await model.findByIdAndUpdate(\r\n transactionId,\r\n { $set: updates },\r\n { new: true }\r\n );\r\n } else {\r\n throw new Error('Transaction model does not support update operations');\r\n }\r\n\r\n if (!transaction) {\r\n throw new TransactionNotFoundError(transactionId);\r\n }\r\n\r\n // Trigger hook (fire-and-forget, non-blocking)\r\n this._triggerHook('transaction.updated', {\r\n transaction,\r\n updates,\r\n });\r\n\r\n return transaction;\r\n }\r\n\r\n /**\r\n * Trigger event hook (fire-and-forget, non-blocking)\r\n * @private\r\n */\r\n private _triggerHook(event: string, data: unknown): void {\r\n triggerHook(this.hooks, event, data, this.logger);\r\n }\r\n}\r\n\r\nexport default TransactionService;\r\n\r\n","/**\r\n * Escrow/Hold Enums\r\n * @classytic/revenue\r\n *\r\n * Enums for platform-as-intermediary payment flow\r\n */\r\n\r\nexport const HOLD_STATUS = {\r\n PENDING: 'pending',\r\n HELD: 'held',\r\n RELEASED: 'released',\r\n CANCELLED: 'cancelled',\r\n EXPIRED: 'expired',\r\n PARTIALLY_RELEASED: 'partially_released',\r\n} as const;\r\n\r\nexport type HoldStatus = typeof HOLD_STATUS;\r\nexport type HoldStatusValue = HoldStatus[keyof HoldStatus];\r\nexport const HOLD_STATUS_VALUES = Object.values(HOLD_STATUS);\r\n\r\nexport const RELEASE_REASON = {\r\n PAYMENT_VERIFIED: 'payment_verified',\r\n MANUAL_RELEASE: 'manual_release',\r\n AUTO_RELEASE: 'auto_release',\r\n DISPUTE_RESOLVED: 'dispute_resolved',\r\n} as const;\r\n\r\nexport type ReleaseReason = typeof RELEASE_REASON;\r\nexport type ReleaseReasonValue = ReleaseReason[keyof ReleaseReason];\r\nexport const RELEASE_REASON_VALUES = Object.values(RELEASE_REASON);\r\n\r\nexport const HOLD_REASON = {\r\n PAYMENT_VERIFICATION: 'payment_verification',\r\n FRAUD_CHECK: 'fraud_check',\r\n MANUAL_REVIEW: 'manual_review',\r\n DISPUTE: 'dispute',\r\n COMPLIANCE: 'compliance',\r\n} as const;\r\n\r\nexport type HoldReason = typeof HOLD_REASON;\r\nexport type HoldReasonValue = HoldReason[keyof HoldReason];\r\nexport const HOLD_REASON_VALUES = Object.values(HOLD_REASON);\r\n\r\n","/**\r\n * Split Payment Enums\r\n * @classytic/revenue\r\n *\r\n * Enums for multi-party commission splits\r\n */\r\n\r\nexport const SPLIT_TYPE = {\r\n PLATFORM_COMMISSION: 'platform_commission',\r\n AFFILIATE_COMMISSION: 'affiliate_commission',\r\n REFERRAL_COMMISSION: 'referral_commission',\r\n PARTNER_COMMISSION: 'partner_commission',\r\n CUSTOM: 'custom',\r\n} as const;\r\n\r\nexport type SplitType = typeof SPLIT_TYPE;\r\nexport type SplitTypeValue = SplitType[keyof SplitType];\r\nexport const SPLIT_TYPE_VALUES = Object.values(SPLIT_TYPE);\r\n\r\nexport const SPLIT_STATUS = {\r\n PENDING: 'pending',\r\n DUE: 'due',\r\n PAID: 'paid',\r\n WAIVED: 'waived',\r\n CANCELLED: 'cancelled',\r\n} as const;\r\n\r\nexport type SplitStatus = typeof SPLIT_STATUS;\r\nexport type SplitStatusValue = SplitStatus[keyof SplitStatus];\r\nexport const SPLIT_STATUS_VALUES = Object.values(SPLIT_STATUS);\r\n\r\nexport const PAYOUT_METHOD = {\r\n BANK_TRANSFER: 'bank_transfer',\r\n MOBILE_WALLET: 'mobile_wallet',\r\n PLATFORM_BALANCE: 'platform_balance',\r\n CRYPTO: 'crypto',\r\n CHECK: 'check',\r\n MANUAL: 'manual',\r\n} as const;\r\n\r\nexport type PayoutMethod = typeof PAYOUT_METHOD;\r\nexport type PayoutMethodValue = PayoutMethod[keyof PayoutMethod];\r\nexport const PAYOUT_METHOD_VALUES = Object.values(PAYOUT_METHOD);\r\n\r\n","/**\r\n * Commission Split Utilities\r\n * @classytic/revenue\r\n *\r\n * Multi-party commission split calculation for affiliate/referral systems\r\n */\r\n\r\nimport { SPLIT_TYPE, SPLIT_STATUS } from '../enums/split.enums.js';\r\nimport type {\r\n SplitRule,\r\n SplitInfo,\r\n CommissionInfo,\r\n CommissionWithSplitsOptions,\r\n} from '../types/index.js';\r\n\r\n/**\r\n * Calculate multi-party commission splits\r\n *\r\n * @param amount - Transaction amount\r\n * @param splitRules - Split configuration\r\n * @param gatewayFeeRate - Gateway fee rate (optional)\r\n * @returns Split objects\r\n *\r\n * @example\r\n * calculateSplits(1000, [\r\n * { type: 'platform_commission', recipientId: 'platform', recipientType: 'platform', rate: 0.10 },\r\n * { type: 'affiliate_commission', recipientId: 'affiliate-123', recipientType: 'user', rate: 0.02 },\r\n * ], 0.018);\r\n *\r\n * Returns:\r\n * [\r\n * { type: 'platform_commission', recipientId: 'platform', grossAmount: 100, gatewayFeeAmount: 18, netAmount: 82, ... },\r\n * { type: 'affiliate_commission', recipientId: 'affiliate-123', grossAmount: 20, gatewayFeeAmount: 0, netAmount: 20, ... },\r\n * ]\r\n */\r\nexport function calculateSplits(\r\n amount: number,\r\n splitRules: SplitRule[] = [],\r\n gatewayFeeRate: number = 0\r\n): SplitInfo[] {\r\n if (!splitRules || splitRules.length === 0) {\r\n return [];\r\n }\r\n\r\n if (amount < 0) {\r\n throw new Error('Transaction amount cannot be negative');\r\n }\r\n\r\n if (gatewayFeeRate < 0 || gatewayFeeRate > 1) {\r\n throw new Error('Gateway fee rate must be between 0 and 1');\r\n }\r\n\r\n const totalRate = splitRules.reduce((sum, rule) => sum + rule.rate, 0);\r\n if (totalRate > 1) {\r\n throw new Error(`Total split rate (${totalRate}) cannot exceed 1.0`);\r\n }\r\n\r\n return splitRules.map((rule, index) => {\r\n if (rule.rate < 0 || rule.rate > 1) {\r\n throw new Error(`Split rate must be between 0 and 1 for split ${index}`);\r\n }\r\n\r\n const grossAmount = Math.round(amount * rule.rate * 100) / 100;\r\n\r\n const gatewayFeeAmount = index === 0 && gatewayFeeRate > 0\r\n ? Math.round(amount * gatewayFeeRate * 100) / 100\r\n : 0;\r\n\r\n const netAmount = Math.max(0, Math.round((grossAmount - gatewayFeeAmount) * 100) / 100);\r\n\r\n return {\r\n type: rule.type ?? SPLIT_TYPE.CUSTOM,\r\n recipientId: rule.recipientId,\r\n recipientType: rule.recipientType,\r\n rate: rule.rate,\r\n grossAmount,\r\n gatewayFeeRate: gatewayFeeAmount > 0 ? gatewayFeeRate : 0,\r\n gatewayFeeAmount,\r\n netAmount,\r\n status: SPLIT_STATUS.PENDING,\r\n dueDate: rule.dueDate ?? null,\r\n metadata: rule.metadata ?? {},\r\n };\r\n });\r\n}\r\n\r\n/**\r\n * Calculate organization payout after splits\r\n *\r\n * @param amount - Total transaction amount\r\n * @param splits - Calculated splits\r\n * @returns Amount organization receives\r\n */\r\nexport function calculateOrganizationPayout(\r\n amount: number,\r\n splits: SplitInfo[] = []\r\n): number {\r\n const totalSplitAmount = splits.reduce((sum, split) => sum + split.grossAmount, 0);\r\n return Math.max(0, Math.round((amount - totalSplitAmount) * 100) / 100);\r\n}\r\n\r\n/**\r\n * Reverse splits proportionally on refund\r\n *\r\n * @param originalSplits - Original split objects\r\n * @param originalAmount - Original transaction amount\r\n * @param refundAmount - Amount being refunded\r\n * @returns Reversed splits\r\n */\r\nexport function reverseSplits(\r\n originalSplits: SplitInfo[] | undefined | null,\r\n originalAmount: number,\r\n refundAmount: number\r\n): SplitInfo[] {\r\n if (!originalSplits || originalSplits.length === 0) {\r\n return [];\r\n }\r\n\r\n const refundRatio = refundAmount / originalAmount;\r\n\r\n return originalSplits.map((split) => ({\r\n ...split,\r\n grossAmount: Math.round(split.grossAmount * refundRatio * 100) / 100,\r\n gatewayFeeAmount: Math.round(split.gatewayFeeAmount * refundRatio * 100) / 100,\r\n netAmount: Math.round(split.netAmount * refundRatio * 100) / 100,\r\n status: SPLIT_STATUS.WAIVED,\r\n }));\r\n}\r\n\r\n/**\r\n * Build commission object with splits support\r\n * Backward compatible with existing calculateCommission\r\n *\r\n * @param amount - Transaction amount\r\n * @param commissionRate - Platform commission rate\r\n * @param gatewayFeeRate - Gateway fee rate\r\n * @param options - Additional options\r\n * @returns Commission with optional splits\r\n */\r\nexport function calculateCommissionWithSplits(\r\n amount: number,\r\n commissionRate: number,\r\n gatewayFeeRate: number = 0,\r\n options: CommissionWithSplitsOptions = {}\r\n): CommissionInfo | null {\r\n const { affiliateRate = 0, affiliateId = null, affiliateType = 'user' } = options;\r\n\r\n if (commissionRate <= 0 && affiliateRate <= 0) {\r\n return null;\r\n }\r\n\r\n const splitRules: SplitRule[] = [];\r\n\r\n if (commissionRate > 0) {\r\n splitRules.push({\r\n type: SPLIT_TYPE.PLATFORM_COMMISSION,\r\n recipientId: 'platform',\r\n recipientType: 'platform',\r\n rate: commissionRate,\r\n });\r\n }\r\n\r\n if (affiliateRate > 0 && affiliateId) {\r\n splitRules.push({\r\n type: SPLIT_TYPE.AFFILIATE_COMMISSION,\r\n recipientId: affiliateId,\r\n recipientType: affiliateType,\r\n rate: affiliateRate,\r\n });\r\n }\r\n\r\n const splits = calculateSplits(amount, splitRules, gatewayFeeRate);\r\n\r\n const platformSplit = splits.find((s) => s.type === SPLIT_TYPE.PLATFORM_COMMISSION);\r\n const affiliateSplit = splits.find((s) => s.type === SPLIT_TYPE.AFFILIATE_COMMISSION);\r\n\r\n return {\r\n rate: commissionRate,\r\n grossAmount: platformSplit?.grossAmount ?? 0,\r\n gatewayFeeRate: platformSplit?.gatewayFeeRate ?? 0,\r\n gatewayFeeAmount: platformSplit?.gatewayFeeAmount ?? 0,\r\n netAmount: platformSplit?.netAmount ?? 0,\r\n status: 'pending',\r\n ...(splits.length > 0 && { splits }),\r\n ...(affiliateSplit && {\r\n affiliate: {\r\n recipientId: affiliateSplit.recipientId,\r\n recipientType: affiliateSplit.recipientType,\r\n rate: affiliateSplit.rate,\r\n grossAmount: affiliateSplit.grossAmount,\r\n netAmount: affiliateSplit.netAmount,\r\n },\r\n }),\r\n };\r\n}\r\n\r\nexport default {\r\n calculateSplits,\r\n calculateOrganizationPayout,\r\n reverseSplits,\r\n calculateCommissionWithSplits,\r\n};\r\n\r\n","/**\r\n * Escrow Service\r\n * @classytic/revenue\r\n *\r\n * Platform-as-intermediary payment flow\r\n * Hold funds → Verify → Split/Deduct → Release to organization\r\n */\r\n\r\nimport { TransactionNotFoundError } from '../core/errors.js';\r\nimport { HOLD_STATUS, RELEASE_REASON, HOLD_REASON } from '../enums/escrow.enums.js';\r\nimport { TRANSACTION_TYPE, TRANSACTION_STATUS } from '../enums/transaction.enums.js';\r\nimport { SPLIT_STATUS } from '../enums/split.enums.js';\r\nimport { triggerHook } from '../utils/hooks.js';\r\nimport { calculateSplits, calculateOrganizationPayout } from '../utils/commission-split.js';\r\nimport type { Container } from '../core/container.js';\r\nimport type {\r\n ModelsRegistry,\r\n HooksRegistry,\r\n Logger,\r\n TransactionDocument,\r\n HoldOptions,\r\n ReleaseOptions,\r\n ReleaseResult,\r\n CancelHoldOptions,\r\n SplitResult,\r\n EscrowStatusResult,\r\n SplitRule,\r\n SplitInfo,\r\n} from '../types/index.js';\r\n\r\nexport class EscrowService {\r\n private readonly models: ModelsRegistry;\r\n private readonly hooks: HooksRegistry;\r\n private readonly logger: Logger;\r\n\r\n constructor(container: Container) {\r\n this.models = container.get<ModelsRegistry>('models');\r\n this.hooks = container.get<HooksRegistry>('hooks');\r\n this.logger = container.get<Logger>('logger');\r\n }\r\n\r\n /**\r\n * Hold funds in escrow\r\n *\r\n * @param transactionId - Transaction to hold\r\n * @param options - Hold options\r\n * @returns Updated transaction\r\n */\r\n async hold(\r\n transactionId: string,\r\n options: HoldOptions = {}\r\n ): Promise<TransactionDocument> {\r\n const {\r\n reason = HOLD_REASON.PAYMENT_VERIFICATION,\r\n holdUntil = null,\r\n metadata = {},\r\n } = options;\r\n\r\n const TransactionModel = this.models.Transaction;\r\n const transaction = await TransactionModel.findById(transactionId) as TransactionDocument | null;\r\n\r\n if (!transaction) {\r\n throw new TransactionNotFoundError(transactionId);\r\n }\r\n\r\n if (transaction.status !== TRANSACTION_STATUS.VERIFIED) {\r\n throw new Error(`Cannot hold transaction with status: ${transaction.status}. Must be verified.`);\r\n }\r\n\r\n transaction.hold = {\r\n status: HOLD_STATUS.HELD,\r\n heldAmount: transaction.amount,\r\n releasedAmount: 0,\r\n reason,\r\n heldAt: new Date(),\r\n ...(holdUntil && { holdUntil }),\r\n releases: [],\r\n metadata,\r\n };\r\n\r\n await transaction.save();\r\n\r\n this._triggerHook('escrow.held', {\r\n transaction,\r\n heldAmount: transaction.amount,\r\n reason,\r\n });\r\n\r\n return transaction;\r\n }\r\n\r\n /**\r\n * Release funds from escrow to recipient\r\n *\r\n * @param transactionId - Transaction to release\r\n * @param options - Release options\r\n * @returns { transaction, releaseTransaction }\r\n */\r\n async release(\r\n transactionId: string,\r\n options: ReleaseOptions\r\n ): Promise<ReleaseResult> {\r\n const {\r\n amount = null,\r\n recipientId,\r\n recipientType = 'organization',\r\n reason = RELEASE_REASON.PAYMENT_VERIFIED,\r\n releasedBy = null,\r\n createTransaction = true,\r\n metadata = {},\r\n } = options;\r\n\r\n const TransactionModel = this.models.Transaction;\r\n const transaction = await TransactionModel.findById(transactionId) as TransactionDocument | null;\r\n\r\n if (!transaction) {\r\n throw new TransactionNotFoundError(transactionId);\r\n }\r\n\r\n if (!transaction.hold || transaction.hold.status !== HOLD_STATUS.HELD) {\r\n throw new Error(`Transaction is not in held status. Current: ${transaction.hold?.status ?? 'none'}`);\r\n }\r\n\r\n if (!recipientId) {\r\n throw new Error('recipientId is required for release');\r\n }\r\n\r\n const releaseAmount = amount ?? (transaction.hold.heldAmount - transaction.hold.releasedAmount);\r\n const availableAmount = transaction.hold.heldAmount - transaction.hold.releasedAmount;\r\n\r\n if (releaseAmount > availableAmount) {\r\n throw new Error(`Release amount (${releaseAmount}) exceeds available held amount (${availableAmount})`);\r\n }\r\n\r\n const releaseRecord = {\r\n amount: releaseAmount,\r\n recipientId,\r\n recipientType,\r\n releasedAt: new Date(),\r\n releasedBy,\r\n reason,\r\n metadata,\r\n };\r\n\r\n transaction.hold.releases.push(releaseRecord);\r\n transaction.hold.releasedAmount += releaseAmount;\r\n\r\n const isFullRelease = transaction.hold.releasedAmount >= transaction.hold.heldAmount;\r\n const isPartialRelease = transaction.hold.releasedAmount > 0 && transaction.hold.releasedAmount < transaction.hold.heldAmount;\r\n\r\n if (isFullRelease) {\r\n transaction.hold.status = HOLD_STATUS.RELEASED;\r\n transaction.hold.releasedAt = new Date();\r\n transaction.status = TRANSACTION_STATUS.COMPLETED;\r\n } else if (isPartialRelease) {\r\n transaction.hold.status = HOLD_STATUS.PARTIALLY_RELEASED;\r\n }\r\n\r\n await transaction.save();\r\n\r\n let releaseTransaction: TransactionDocument | null = null;\r\n if (createTransaction) {\r\n releaseTransaction = await TransactionModel.create({\r\n organizationId: transaction.organizationId,\r\n customerId: recipientId,\r\n amount: releaseAmount,\r\n currency: transaction.currency,\r\n category: transaction.category,\r\n type: TRANSACTION_TYPE.INCOME,\r\n method: transaction.method,\r\n status: TRANSACTION_STATUS.COMPLETED,\r\n gateway: transaction.gateway,\r\n referenceId: transaction.referenceId,\r\n referenceModel: transaction.referenceModel,\r\n metadata: {\r\n ...metadata,\r\n isRelease: true,\r\n heldTransactionId: transaction._id.toString(),\r\n releaseReason: reason,\r\n recipientType,\r\n },\r\n idempotencyKey: `release_${transaction._id}_${Date.now()}`,\r\n }) as TransactionDocument;\r\n }\r\n\r\n this._triggerHook('escrow.released', {\r\n transaction,\r\n releaseTransaction,\r\n releaseAmount,\r\n recipientId,\r\n recipientType,\r\n reason,\r\n isFullRelease,\r\n isPartialRelease,\r\n });\r\n\r\n return {\r\n transaction,\r\n releaseTransaction,\r\n releaseAmount,\r\n isFullRelease,\r\n isPartialRelease,\r\n };\r\n }\r\n\r\n /**\r\n * Cancel hold and release back to customer\r\n *\r\n * @param transactionId - Transaction to cancel hold\r\n * @param options - Cancel options\r\n * @returns Updated transaction\r\n */\r\n async cancel(\r\n transactionId: string,\r\n options: CancelHoldOptions = {}\r\n ): Promise<TransactionDocument> {\r\n const { reason = 'Hold cancelled', metadata = {} } = options;\r\n\r\n const TransactionModel = this.models.Transaction;\r\n const transaction = await TransactionModel.findById(transactionId) as TransactionDocument | null;\r\n\r\n if (!transaction) {\r\n throw new TransactionNotFoundError(transactionId);\r\n }\r\n\r\n if (!transaction.hold || transaction.hold.status !== HOLD_STATUS.HELD) {\r\n throw new Error(`Transaction is not in held status. Current: ${transaction.hold?.status ?? 'none'}`);\r\n }\r\n\r\n transaction.hold.status = HOLD_STATUS.CANCELLED;\r\n transaction.hold.cancelledAt = new Date();\r\n transaction.hold.metadata = {\r\n ...transaction.hold.metadata,\r\n ...metadata,\r\n cancelReason: reason,\r\n };\r\n\r\n transaction.status = TRANSACTION_STATUS.CANCELLED;\r\n\r\n await transaction.save();\r\n\r\n this._triggerHook('escrow.cancelled', {\r\n transaction,\r\n reason,\r\n });\r\n\r\n return transaction;\r\n }\r\n\r\n /**\r\n * Split payment to multiple recipients\r\n * Deducts splits from held amount and releases remainder to organization\r\n *\r\n * @param transactionId - Transaction to split\r\n * @param splitRules - Split configuration\r\n * @returns { transaction, splitTransactions, organizationTransaction }\r\n */\r\n async split(\r\n transactionId: string,\r\n splitRules: SplitRule[] = []\r\n ): Promise<SplitResult> {\r\n const TransactionModel = this.models.Transaction;\r\n const transaction = await TransactionModel.findById(transactionId) as TransactionDocument | null;\r\n\r\n if (!transaction) {\r\n throw new TransactionNotFoundError(transactionId);\r\n }\r\n\r\n if (!transaction.hold || transaction.hold.status !== HOLD_STATUS.HELD) {\r\n throw new Error(`Transaction must be held before splitting. Current: ${transaction.hold?.status ?? 'none'}`);\r\n }\r\n\r\n if (!splitRules || splitRules.length === 0) {\r\n throw new Error('splitRules cannot be empty');\r\n }\r\n\r\n const splits = calculateSplits(\r\n transaction.amount,\r\n splitRules,\r\n transaction.commission?.gatewayFeeRate ?? 0\r\n );\r\n\r\n transaction.splits = splits;\r\n await transaction.save();\r\n\r\n const splitTransactions: TransactionDocument[] = [];\r\n\r\n for (const split of splits) {\r\n const splitTransaction = await TransactionModel.create({\r\n organizationId: transaction.organizationId,\r\n customerId: split.recipientId,\r\n amount: split.netAmount,\r\n currency: transaction.currency,\r\n category: split.type,\r\n type: TRANSACTION_TYPE.EXPENSE,\r\n method: transaction.method,\r\n status: TRANSACTION_STATUS.COMPLETED,\r\n gateway: transaction.gateway,\r\n referenceId: transaction.referenceId,\r\n referenceModel: transaction.referenceModel,\r\n metadata: {\r\n isSplit: true,\r\n splitType: split.type,\r\n recipientType: split.recipientType,\r\n originalTransactionId: transaction._id.toString(),\r\n grossAmount: split.grossAmount,\r\n gatewayFeeAmount: split.gatewayFeeAmount,\r\n },\r\n idempotencyKey: `split_${transaction._id}_${split.recipientId}_${Date.now()}`,\r\n }) as TransactionDocument;\r\n\r\n (split as SplitInfo & { payoutTransactionId?: string }).payoutTransactionId = splitTransaction._id.toString();\r\n split.status = SPLIT_STATUS.PAID;\r\n (split as SplitInfo & { paidDate?: Date }).paidDate = new Date();\r\n\r\n splitTransactions.push(splitTransaction);\r\n }\r\n\r\n await transaction.save();\r\n\r\n const organizationPayout = calculateOrganizationPayout(transaction.amount, splits);\r\n\r\n const organizationTransaction = await this.release(transactionId, {\r\n amount: organizationPayout,\r\n recipientId: transaction.organizationId?.toString() ?? '',\r\n recipientType: 'organization',\r\n reason: RELEASE_REASON.PAYMENT_VERIFIED,\r\n createTransaction: true,\r\n metadata: {\r\n afterSplits: true,\r\n totalSplits: splits.length,\r\n totalSplitAmount: transaction.amount - organizationPayout,\r\n },\r\n });\r\n\r\n this._triggerHook('escrow.split', {\r\n transaction,\r\n splits,\r\n splitTransactions,\r\n organizationTransaction: organizationTransaction.releaseTransaction,\r\n organizationPayout,\r\n });\r\n\r\n return {\r\n transaction,\r\n splits,\r\n splitTransactions,\r\n organizationTransaction: organizationTransaction.releaseTransaction,\r\n organizationPayout,\r\n };\r\n }\r\n\r\n /**\r\n * Get escrow status\r\n *\r\n * @param transactionId - Transaction ID\r\n * @returns Escrow status\r\n */\r\n async getStatus(transactionId: string): Promise<EscrowStatusResult> {\r\n const TransactionModel = this.models.Transaction;\r\n const transaction = await TransactionModel.findById(transactionId) as TransactionDocument | null;\r\n\r\n if (!transaction) {\r\n throw new TransactionNotFoundError(transactionId);\r\n }\r\n\r\n return {\r\n transaction,\r\n hold: transaction.hold ?? null,\r\n splits: transaction.splits ?? [],\r\n hasHold: !!transaction.hold,\r\n hasSplits: transaction.splits ? transaction.splits.length > 0 : false,\r\n };\r\n }\r\n\r\n private _triggerHook(event: string, data: unknown): void {\r\n triggerHook(this.hooks, event, data, this.logger);\r\n }\r\n}\r\n\r\nexport default EscrowService;\r\n\r\n","/**\r\n * Payment Provider Base Class\r\n * @classytic/revenue\r\n *\r\n * Abstract base class for all payment providers\r\n * Inspired by: Vercel AI SDK, Stripe SDK\r\n */\r\n\r\nimport type {\r\n CreateIntentParams,\r\n PaymentIntentData,\r\n PaymentResultData,\r\n RefundResultData,\r\n WebhookEventData,\r\n ProviderCapabilities,\r\n} from '../types/index.js';\r\n\r\n/**\r\n * Payment Intent - standardized response from createIntent\r\n */\r\nexport class PaymentIntent implements PaymentIntentData {\r\n public readonly id: string;\r\n public readonly sessionId: string | null;\r\n public readonly paymentIntentId: string | null;\r\n public readonly provider: string;\r\n public readonly status: string;\r\n public readonly amount: number;\r\n public readonly currency: string;\r\n public readonly metadata: Record<string, unknown>;\r\n public readonly clientSecret?: string;\r\n public readonly paymentUrl?: string;\r\n public readonly instructions?: string;\r\n public readonly raw?: unknown;\r\n\r\n constructor(data: PaymentIntentData) {\r\n this.id = data.id;\r\n this.sessionId = data.sessionId ?? null;\r\n this.paymentIntentId = data.paymentIntentId ?? null;\r\n this.provider = data.provider;\r\n this.status = data.status;\r\n this.amount = data.amount;\r\n this.currency = data.currency ?? 'BDT';\r\n this.metadata = data.metadata ?? {};\r\n this.clientSecret = data.clientSecret;\r\n this.paymentUrl = data.paymentUrl;\r\n this.instructions = data.instructions;\r\n this.raw = data.raw;\r\n }\r\n}\r\n\r\n/**\r\n * Payment Result - standardized response from verifyPayment\r\n */\r\nexport class PaymentResult implements PaymentResultData {\r\n public readonly id: string;\r\n public readonly provider: string;\r\n public readonly status: 'succeeded' | 'failed' | 'processing';\r\n public readonly amount?: number;\r\n public readonly currency: string;\r\n public readonly paidAt?: Date;\r\n public readonly metadata: Record<string, unknown>;\r\n public readonly raw?: unknown;\r\n\r\n constructor(data: PaymentResultData) {\r\n this.id = data.id;\r\n this.provider = data.provider;\r\n this.status = data.status;\r\n this.amount = data.amount;\r\n this.currency = data.currency ?? 'BDT';\r\n this.paidAt = data.paidAt;\r\n this.metadata = data.metadata ?? {};\r\n this.raw = data.raw;\r\n }\r\n}\r\n\r\n/**\r\n * Refund Result - standardized response from refund\r\n */\r\nexport class RefundResult implements RefundResultData {\r\n public readonly id: string;\r\n public readonly provider: string;\r\n public readonly status: 'succeeded' | 'failed' | 'processing';\r\n public readonly amount?: number;\r\n public readonly currency: string;\r\n public readonly refundedAt?: Date;\r\n public readonly reason?: string;\r\n public readonly metadata: Record<string, unknown>;\r\n public readonly raw?: unknown;\r\n\r\n constructor(data: RefundResultData) {\r\n this.id = data.id;\r\n this.provider = data.provider;\r\n this.status = data.status;\r\n this.amount = data.amount;\r\n this.currency = data.currency ?? 'BDT';\r\n this.refundedAt = data.refundedAt;\r\n this.reason = data.reason;\r\n this.metadata = data.metadata ?? {};\r\n this.raw = data.raw;\r\n }\r\n}\r\n\r\n/**\r\n * Webhook Event - standardized webhook event\r\n */\r\nexport class WebhookEvent implements WebhookEventData {\r\n public readonly id: string;\r\n public readonly provider: string;\r\n public readonly type: string;\r\n public readonly data: { sessionId?: string; paymentIntentId?: string; [key: string]: unknown };\r\n public readonly createdAt?: Date;\r\n public readonly raw?: unknown;\r\n\r\n constructor(data: WebhookEventData) {\r\n this.id = data.id;\r\n this.provider = data.provider;\r\n this.type = data.type;\r\n this.data = data.data;\r\n this.createdAt = data.createdAt;\r\n this.raw = data.raw;\r\n }\r\n}\r\n\r\n/**\r\n * Base Payment Provider\r\n * All payment providers must extend this class\r\n */\r\nexport abstract class PaymentProvider {\r\n public readonly config: Record<string, unknown>;\r\n public readonly name: string;\r\n\r\n constructor(config: Record<string, unknown> = {}) {\r\n this.config = config;\r\n this.name = 'base'; // Override in subclass\r\n }\r\n\r\n /**\r\n * Create a payment intent\r\n * @param params - Payment parameters\r\n * @returns Promise<PaymentIntent>\r\n */\r\n abstract createIntent(params: CreateIntentParams): Promise<PaymentIntent>;\r\n\r\n /**\r\n * Verify a payment\r\n * @param intentId - Payment intent ID\r\n * @returns Promise<PaymentResult>\r\n */\r\n abstract verifyPayment(intentId: string): Promise<PaymentResult>;\r\n\r\n /**\r\n * Get payment status\r\n * @param intentId - Payment intent ID\r\n * @returns Promise<PaymentResult>\r\n */\r\n abstract getStatus(intentId: string): Promise<PaymentResult>;\r\n\r\n /**\r\n * Refund a payment\r\n * @param paymentId - Payment ID\r\n * @param amount - Amount to refund (optional, full refund if not provided)\r\n * @param options - Refund options\r\n * @returns Promise<RefundResult>\r\n */\r\n abstract refund(\r\n paymentId: string,\r\n amount?: number | null,\r\n options?: { reason?: string }\r\n ): Promise<RefundResult>;\r\n\r\n /**\r\n * Handle webhook from provider\r\n * @param payload - Webhook payload\r\n * @param headers - Request headers (for signature verification)\r\n * @returns Promise<WebhookEvent>\r\n */\r\n abstract handleWebhook(\r\n payload: unknown,\r\n headers?: Record<string, string>\r\n ): Promise<WebhookEvent>;\r\n\r\n /**\r\n * Verify webhook signature (optional)\r\n * @param payload - Webhook payload\r\n * @param signature - Webhook signature\r\n * @returns boolean\r\n */\r\n verifyWebhookSignature(_payload: unknown, _signature: string): boolean {\r\n // Override in subclass if provider supports webhook signatures\r\n return true;\r\n }\r\n\r\n /**\r\n * Get provider capabilities\r\n * @returns ProviderCapabilities\r\n */\r\n getCapabilities(): ProviderCapabilities {\r\n return {\r\n supportsWebhooks: false,\r\n supportsRefunds: false,\r\n supportsPartialRefunds: false,\r\n requiresManualVerification: true,\r\n };\r\n }\r\n}\r\n\r\nexport default PaymentProvider;\r\n\r\n","/**\r\n * Revenue - Modern Payment Management\r\n * @classytic/revenue\r\n *\r\n * Fluent Builder API with integrated services\r\n * Less code, more power\r\n *\r\n * Inspired by: Vercel AI SDK, Stripe SDK, tRPC\r\n */\r\n\r\nimport { nanoid } from 'nanoid';\r\nimport { Container } from './container.js';\r\nimport { EventBus, createEventBus } from './events.js';\r\nimport { PluginManager, type RevenuePlugin, type PluginContext, type PluginLogger } from './plugin.js';\r\nimport { type Result, tryCatch } from './result.js';\r\nimport { IdempotencyManager, createIdempotencyManager } from '../utils/idempotency.js';\r\nimport { retry, type RetryConfig, CircuitBreaker, createCircuitBreaker } from '../utils/retry.js';\r\nimport { MonetizationService } from '../services/monetization.service.js';\r\nimport { PaymentService } from '../services/payment.service.js';\r\nimport { TransactionService } from '../services/transaction.service.js';\r\nimport { EscrowService } from '../services/escrow.service.js';\r\nimport { ConfigurationError } from './errors.js';\r\nimport { PaymentProvider } from '../providers/base.js';\r\nimport type { MongooseModel, PaymentProviderInterface } from '../types/index.js';\r\n\r\n// ============ TYPES ============\r\n\r\n/** Internal config for Revenue instance */\r\nexport interface InternalConfig {\r\n defaultCurrency: string;\r\n commissionRate: number;\r\n gatewayFeeRate: number;\r\n targetModels?: string[];\r\n categoryMappings?: Record<string, string>;\r\n}\r\n\r\nexport interface RevenueOptions {\r\n /** Default currency (ISO 4217) */\r\n defaultCurrency?: string;\r\n /** Environment */\r\n environment?: 'development' | 'staging' | 'production';\r\n /** Debug mode */\r\n debug?: boolean;\r\n /** Retry configuration */\r\n retry?: Partial<RetryConfig>;\r\n /** Idempotency TTL in ms */\r\n idempotencyTtl?: number;\r\n /** Enable circuit breaker */\r\n circuitBreaker?: boolean;\r\n /** Custom logger */\r\n logger?: PluginLogger;\r\n /** Commission rate (0-100) */\r\n commissionRate?: number;\r\n /** Gateway fee rate (0-100) */\r\n gatewayFeeRate?: number;\r\n}\r\n\r\nexport interface ModelsConfig {\r\n Transaction: MongooseModel<any>;\r\n Subscription?: MongooseModel<any>;\r\n [key: string]: MongooseModel<any> | undefined;\r\n}\r\n\r\nexport interface ProvidersConfig {\r\n [name: string]: PaymentProvider;\r\n}\r\n\r\nexport interface HooksConfig {\r\n [key: string]: ((...args: any[]) => void | Promise<void>) | undefined;\r\n}\r\n\r\n// ============ REVENUE CLASS ============\r\n\r\n/**\r\n * Revenue - Main entry point\r\n *\r\n * @example\r\n * ```typescript\r\n * const revenue = Revenue\r\n * .create({ defaultCurrency: 'USD' })\r\n * .withModels({ Transaction, Subscription })\r\n * .withProvider('stripe', new StripeProvider({ apiKey: '...' }))\r\n * .withProvider('manual', new ManualProvider())\r\n * .withPlugin(auditPlugin())\r\n * .build();\r\n *\r\n * // Access services directly\r\n * await revenue.monetization.create({ ... });\r\n * await revenue.payments.verify({ ... });\r\n *\r\n * // Or use events\r\n * revenue.on('payment.succeeded', (event) => { ... });\r\n * ```\r\n */\r\nexport class Revenue {\r\n // ============ CORE ============\r\n private readonly _container: Container;\r\n private readonly _events: EventBus;\r\n private readonly _plugins: PluginManager;\r\n private readonly _idempotency: IdempotencyManager;\r\n private readonly _circuitBreaker?: CircuitBreaker;\r\n private readonly _options: Required<RevenueOptions>;\r\n private readonly _logger: PluginLogger;\r\n private readonly _providers: ProvidersConfig;\r\n private readonly _config: InternalConfig;\r\n\r\n // ============ SERVICES ============\r\n /** Monetization service - purchases, subscriptions, free items */\r\n public readonly monetization: MonetizationService;\r\n /** Payment service - verify, refund, webhooks */\r\n public readonly payments: PaymentService;\r\n /** Transaction service - query, update transactions */\r\n public readonly transactions: TransactionService;\r\n /** Escrow service - hold, release, splits */\r\n public readonly escrow: EscrowService;\r\n\r\n private constructor(\r\n container: Container,\r\n events: EventBus,\r\n plugins: PluginManager,\r\n options: Required<RevenueOptions>,\r\n providers: ProvidersConfig,\r\n config: InternalConfig\r\n ) {\r\n this._container = container;\r\n this._events = events;\r\n this._plugins = plugins;\r\n this._options = options;\r\n this._logger = options.logger;\r\n this._providers = providers;\r\n this._config = config;\r\n\r\n // Initialize idempotency\r\n this._idempotency = createIdempotencyManager({\r\n ttl: options.idempotencyTtl,\r\n });\r\n\r\n // Initialize circuit breaker\r\n if (options.circuitBreaker) {\r\n this._circuitBreaker = createCircuitBreaker();\r\n }\r\n\r\n // Register utilities in container\r\n container.singleton('events', events);\r\n container.singleton('plugins', plugins);\r\n container.singleton('idempotency', this._idempotency);\r\n container.singleton('logger', this._logger);\r\n\r\n // Initialize services\r\n this.monetization = new MonetizationService(container);\r\n this.payments = new PaymentService(container);\r\n this.transactions = new TransactionService(container);\r\n this.escrow = new EscrowService(container);\r\n\r\n // Freeze for immutability\r\n Object.freeze(this._providers);\r\n Object.freeze(this._config);\r\n }\r\n\r\n // ============ STATIC FACTORY ============\r\n\r\n /**\r\n * Create a new Revenue builder\r\n *\r\n * @example\r\n * ```typescript\r\n * const revenue = Revenue\r\n * .create({ defaultCurrency: 'BDT' })\r\n * .withModels({ Transaction, Subscription })\r\n * .withProvider('manual', new ManualProvider())\r\n * .build();\r\n * ```\r\n */\r\n static create(options: RevenueOptions = {}): RevenueBuilder {\r\n return new RevenueBuilder(options);\r\n }\r\n\r\n // ============ ACCESSORS ============\r\n\r\n /** DI container (for advanced usage) */\r\n get container(): Container {\r\n return this._container;\r\n }\r\n\r\n /** Event bus */\r\n get events(): EventBus {\r\n return this._events;\r\n }\r\n\r\n /** Registered providers (frozen) */\r\n get providers(): Readonly<ProvidersConfig> {\r\n return this._providers;\r\n }\r\n\r\n /** Configuration (frozen) */\r\n get config(): Readonly<InternalConfig> {\r\n return this._config;\r\n }\r\n\r\n /** Default currency */\r\n get defaultCurrency(): string {\r\n return this._options.defaultCurrency;\r\n }\r\n\r\n /** Current environment */\r\n get environment(): string {\r\n return this._options.environment;\r\n }\r\n\r\n // ============ PROVIDER METHODS ============\r\n\r\n /**\r\n * Get a provider by name\r\n */\r\n getProvider(name: string): PaymentProviderInterface {\r\n const provider = this._providers[name];\r\n if (!provider) {\r\n throw new ConfigurationError(\r\n `Provider \"${name}\" not found. Available: ${Object.keys(this._providers).join(', ')}`\r\n );\r\n }\r\n return provider as PaymentProviderInterface;\r\n }\r\n\r\n /**\r\n * Get all provider names\r\n */\r\n getProviderNames(): string[] {\r\n return Object.keys(this._providers);\r\n }\r\n\r\n /**\r\n * Check if provider exists\r\n */\r\n hasProvider(name: string): boolean {\r\n return name in this._providers;\r\n }\r\n\r\n // ============ EVENT SYSTEM ============\r\n\r\n /**\r\n * Subscribe to events\r\n *\r\n * @example\r\n * ```typescript\r\n * revenue.on('payment.succeeded', (event) => {\r\n * console.log('Payment:', event.transactionId);\r\n * });\r\n * ```\r\n */\r\n on: EventBus['on'] = (event, handler) => {\r\n return this._events.on(event, handler);\r\n };\r\n\r\n /**\r\n * Subscribe once\r\n */\r\n once: EventBus['once'] = (event, handler) => {\r\n return this._events.once(event, handler);\r\n };\r\n\r\n /**\r\n * Unsubscribe\r\n */\r\n off: EventBus['off'] = (event, handler) => {\r\n this._events.off(event, handler);\r\n };\r\n\r\n /**\r\n * Emit an event\r\n */\r\n emit: EventBus['emit'] = (event, payload) => {\r\n this._events.emit(event, payload);\r\n };\r\n\r\n // ============ RESILIENCE ============\r\n\r\n /**\r\n * Execute operation with retry and idempotency\r\n */\r\n async execute<T>(\r\n operation: () => Promise<T>,\r\n options: {\r\n idempotencyKey?: string;\r\n params?: unknown;\r\n useRetry?: boolean;\r\n useCircuitBreaker?: boolean;\r\n } = {}\r\n ): Promise<Result<T, Error>> {\r\n const { idempotencyKey, params, useRetry = true, useCircuitBreaker = true } = options;\r\n\r\n // Wrap with idempotency if key provided\r\n const idempotentOp = async () => {\r\n if (idempotencyKey) {\r\n const result = await this._idempotency.execute(idempotencyKey, params, operation);\r\n if (!result.ok) throw result.error;\r\n return result.value;\r\n }\r\n return operation();\r\n };\r\n\r\n // Wrap with circuit breaker\r\n const resilientOp = async () => {\r\n if (useCircuitBreaker && this._circuitBreaker) {\r\n return this._circuitBreaker.execute(idempotentOp);\r\n }\r\n return idempotentOp();\r\n };\r\n\r\n // Wrap with retry\r\n if (useRetry && this._options.retry) {\r\n return tryCatch(() => retry(resilientOp, this._options.retry));\r\n }\r\n\r\n return tryCatch(resilientOp);\r\n }\r\n\r\n /**\r\n * Create plugin context (for advanced usage)\r\n */\r\n createContext(meta: { idempotencyKey?: string } = {}): PluginContext {\r\n return {\r\n events: this._events,\r\n logger: this._logger,\r\n get: <T>(key: string) => this._container.get<T>(key),\r\n storage: new Map(),\r\n meta: {\r\n ...meta,\r\n requestId: nanoid(12),\r\n timestamp: new Date(),\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Destroy instance and cleanup\r\n */\r\n async destroy(): Promise<void> {\r\n await this._plugins.destroy();\r\n this._events.clear();\r\n }\r\n}\r\n\r\n// ============ BUILDER ============\r\n\r\n/**\r\n * Revenue Builder - Fluent configuration API\r\n */\r\nexport class RevenueBuilder {\r\n private options: RevenueOptions;\r\n private models: ModelsConfig | null = null;\r\n private providers: ProvidersConfig = {};\r\n private plugins: RevenuePlugin[] = [];\r\n private hooks: HooksConfig = {};\r\n private categoryMappings: Record<string, string> = {};\r\n\r\n constructor(options: RevenueOptions = {}) {\r\n this.options = options;\r\n }\r\n\r\n /**\r\n * Register models (required)\r\n *\r\n * @example\r\n * ```typescript\r\n * .withModels({\r\n * Transaction: TransactionModel,\r\n * Subscription: SubscriptionModel,\r\n * })\r\n * ```\r\n */\r\n withModels(models: ModelsConfig): this {\r\n this.models = models;\r\n return this;\r\n }\r\n\r\n /**\r\n * Register a single model\r\n */\r\n withModel(name: string, model: MongooseModel<any>): this {\r\n if (!this.models) {\r\n this.models = { Transaction: model } as ModelsConfig;\r\n }\r\n (this.models as any)[name] = model;\r\n return this;\r\n }\r\n\r\n /**\r\n * Register a payment provider\r\n *\r\n * @example\r\n * ```typescript\r\n * .withProvider('stripe', new StripeProvider({ apiKey: '...' }))\r\n * .withProvider('manual', new ManualProvider())\r\n * ```\r\n */\r\n withProvider(name: string, provider: PaymentProvider): this {\r\n this.providers[name] = provider;\r\n return this;\r\n }\r\n\r\n /**\r\n * Register multiple providers at once\r\n */\r\n withProviders(providers: ProvidersConfig): this {\r\n this.providers = { ...this.providers, ...providers };\r\n return this;\r\n }\r\n\r\n /**\r\n * Register a plugin\r\n *\r\n * @example\r\n * ```typescript\r\n * .withPlugin(loggingPlugin())\r\n * .withPlugin(auditPlugin({ store: saveToDb }))\r\n * ```\r\n */\r\n withPlugin(plugin: RevenuePlugin): this {\r\n this.plugins.push(plugin);\r\n return this;\r\n }\r\n\r\n /**\r\n * Register multiple plugins\r\n */\r\n withPlugins(plugins: RevenuePlugin[]): this {\r\n this.plugins.push(...plugins);\r\n return this;\r\n }\r\n\r\n /**\r\n * Register event hooks (for backward compatibility)\r\n *\r\n * @example\r\n * ```typescript\r\n * .withHooks({\r\n * onPaymentVerified: async (tx) => { ... },\r\n * onSubscriptionRenewed: async (sub) => { ... },\r\n * })\r\n * ```\r\n */\r\n withHooks(hooks: HooksConfig): this {\r\n this.hooks = { ...this.hooks, ...hooks };\r\n return this;\r\n }\r\n\r\n /**\r\n * Set retry configuration\r\n *\r\n * @example\r\n * ```typescript\r\n * .withRetry({ maxAttempts: 5, baseDelay: 2000 })\r\n * ```\r\n */\r\n withRetry(config: Partial<RetryConfig>): this {\r\n this.options.retry = config;\r\n return this;\r\n }\r\n\r\n /**\r\n * Enable circuit breaker\r\n */\r\n withCircuitBreaker(enabled = true): this {\r\n this.options.circuitBreaker = enabled;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set custom logger\r\n */\r\n withLogger(logger: PluginLogger): this {\r\n this.options.logger = logger;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set environment\r\n */\r\n forEnvironment(env: 'development' | 'staging' | 'production'): this {\r\n this.options.environment = env;\r\n return this;\r\n }\r\n\r\n /**\r\n * Enable debug mode\r\n */\r\n withDebug(enabled = true): this {\r\n this.options.debug = enabled;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set commission rate (0-100)\r\n */\r\n withCommission(rate: number, gatewayFeeRate = 0): this {\r\n this.options.commissionRate = rate;\r\n this.options.gatewayFeeRate = gatewayFeeRate;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set category mappings (entity → category)\r\n *\r\n * @example\r\n * ```typescript\r\n * .withCategoryMappings({\r\n * PlatformSubscription: 'platform_subscription',\r\n * CourseEnrollment: 'course_enrollment',\r\n * ProductOrder: 'product_order',\r\n * })\r\n * ```\r\n */\r\n withCategoryMappings(mappings: Record<string, string>): this {\r\n this.categoryMappings = { ...this.categoryMappings, ...mappings };\r\n return this;\r\n }\r\n\r\n /**\r\n * Build the Revenue instance\r\n */\r\n build(): Revenue {\r\n // Validate required configuration\r\n if (!this.models) {\r\n throw new ConfigurationError(\r\n 'Models are required. Use .withModels({ Transaction, Subscription })'\r\n );\r\n }\r\n\r\n if (!this.models.Transaction) {\r\n throw new ConfigurationError(\r\n 'Transaction model is required in models configuration'\r\n );\r\n }\r\n\r\n if (Object.keys(this.providers).length === 0) {\r\n throw new ConfigurationError(\r\n 'At least one provider is required. Use .withProvider(name, provider)'\r\n );\r\n }\r\n\r\n // Create container\r\n const container = new Container();\r\n\r\n // Default logger\r\n const defaultLogger: PluginLogger = {\r\n debug: (msg, data) => this.options.debug && console.debug(`[Revenue] ${msg}`, data ?? ''),\r\n info: (msg, data) => console.info(`[Revenue] ${msg}`, data ?? ''),\r\n warn: (msg, data) => console.warn(`[Revenue] ${msg}`, data ?? ''),\r\n error: (msg, data) => console.error(`[Revenue] ${msg}`, data ?? ''),\r\n };\r\n\r\n // Resolve options with defaults\r\n const resolvedOptions: Required<RevenueOptions> = {\r\n defaultCurrency: this.options.defaultCurrency ?? 'USD',\r\n environment: this.options.environment ?? 'development',\r\n debug: this.options.debug ?? false,\r\n retry: this.options.retry ?? { maxAttempts: 3 },\r\n idempotencyTtl: this.options.idempotencyTtl ?? 24 * 60 * 60 * 1000,\r\n circuitBreaker: this.options.circuitBreaker ?? false,\r\n logger: this.options.logger ?? defaultLogger,\r\n commissionRate: this.options.commissionRate ?? 0,\r\n gatewayFeeRate: this.options.gatewayFeeRate ?? 0,\r\n };\r\n\r\n // Build config for services\r\n const config: InternalConfig = {\r\n defaultCurrency: resolvedOptions.defaultCurrency,\r\n commissionRate: resolvedOptions.commissionRate,\r\n gatewayFeeRate: resolvedOptions.gatewayFeeRate,\r\n categoryMappings: this.categoryMappings,\r\n };\r\n\r\n // Register in container (same format as legacy for service compatibility)\r\n container.singleton('models', this.models);\r\n container.singleton('providers', this.providers as Record<string, unknown>);\r\n container.singleton('hooks', this.hooks);\r\n container.singleton('config', config);\r\n\r\n // Create event bus\r\n const events = createEventBus();\r\n\r\n // Create plugin manager\r\n const pluginManager = new PluginManager();\r\n for (const plugin of this.plugins) {\r\n pluginManager.register(plugin);\r\n }\r\n\r\n // Create Revenue instance using private constructor access\r\n const revenue = new (Revenue as any)(\r\n container,\r\n events,\r\n pluginManager,\r\n resolvedOptions,\r\n this.providers,\r\n config\r\n );\r\n\r\n // Initialize plugins\r\n const ctx = revenue.createContext();\r\n pluginManager.init(ctx).catch((err: Error) => {\r\n resolvedOptions.logger.error('Failed to initialize plugins', err);\r\n });\r\n\r\n return revenue;\r\n }\r\n}\r\n\r\n// ============ FACTORY FUNCTION ============\r\n\r\n/**\r\n * Create Revenue instance (shorthand)\r\n *\r\n * @example\r\n * ```typescript\r\n * const revenue = createRevenue({\r\n * models: { Transaction, Subscription },\r\n * providers: { manual: new ManualProvider() },\r\n * });\r\n * ```\r\n */\r\nexport function createRevenue(config: {\r\n models: ModelsConfig;\r\n providers: ProvidersConfig;\r\n options?: RevenueOptions;\r\n plugins?: RevenuePlugin[];\r\n hooks?: HooksConfig;\r\n}): Revenue {\r\n let builder = Revenue.create(config.options);\r\n\r\n builder = builder.withModels(config.models);\r\n builder = builder.withProviders(config.providers);\r\n\r\n if (config.plugins) {\r\n builder = builder.withPlugins(config.plugins);\r\n }\r\n\r\n if (config.hooks) {\r\n builder = builder.withHooks(config.hooks);\r\n }\r\n\r\n return builder.build();\r\n}\r\n\r\nexport default Revenue;\r\n","/**\r\n * Money Utility - Integer-safe currency handling\r\n * @classytic/revenue\r\n *\r\n * Never use floating point for money!\r\n * All amounts stored as smallest unit (cents, paisa, etc.)\r\n * \r\n * Inspired by: Stripe, Dinero.js, tc39/proposal-decimal\r\n */\r\n\r\nexport interface MoneyValue {\r\n /** Amount in smallest currency unit (cents, paisa, etc.) */\r\n readonly amount: number;\r\n /** ISO 4217 currency code */\r\n readonly currency: string;\r\n}\r\n\r\n/** Currency configuration */\r\ninterface CurrencyConfig {\r\n code: string;\r\n decimals: number;\r\n symbol: string;\r\n name: string;\r\n}\r\n\r\n/** Supported currencies with their decimal places */\r\nconst CURRENCIES: Record<string, CurrencyConfig> = {\r\n USD: { code: 'USD', decimals: 2, symbol: '$', name: 'US Dollar' },\r\n EUR: { code: 'EUR', decimals: 2, symbol: '€', name: 'Euro' },\r\n GBP: { code: 'GBP', decimals: 2, symbol: '£', name: 'British Pound' },\r\n BDT: { code: 'BDT', decimals: 2, symbol: '৳', name: 'Bangladeshi Taka' },\r\n INR: { code: 'INR', decimals: 2, symbol: '₹', name: 'Indian Rupee' },\r\n JPY: { code: 'JPY', decimals: 0, symbol: '¥', name: 'Japanese Yen' },\r\n CNY: { code: 'CNY', decimals: 2, symbol: '¥', name: 'Chinese Yuan' },\r\n AED: { code: 'AED', decimals: 2, symbol: 'د.إ', name: 'UAE Dirham' },\r\n SAR: { code: 'SAR', decimals: 2, symbol: '﷼', name: 'Saudi Riyal' },\r\n SGD: { code: 'SGD', decimals: 2, symbol: 'S$', name: 'Singapore Dollar' },\r\n AUD: { code: 'AUD', decimals: 2, symbol: 'A$', name: 'Australian Dollar' },\r\n CAD: { code: 'CAD', decimals: 2, symbol: 'C$', name: 'Canadian Dollar' },\r\n};\r\n\r\n/**\r\n * Money class - immutable money representation\r\n */\r\nexport class Money implements MoneyValue {\r\n readonly amount: number;\r\n readonly currency: string;\r\n\r\n private constructor(amount: number, currency: string) {\r\n if (!Number.isInteger(amount)) {\r\n throw new Error(`Money amount must be integer (smallest unit). Got: ${amount}`);\r\n }\r\n this.amount = amount;\r\n this.currency = currency.toUpperCase();\r\n }\r\n\r\n // ============ FACTORY METHODS ============\r\n\r\n /**\r\n * Create money from smallest unit (cents, paisa)\r\n * @example Money.cents(1999, 'USD') // $19.99\r\n */\r\n static cents(amount: number, currency = 'USD'): Money {\r\n return new Money(Math.round(amount), currency);\r\n }\r\n\r\n /**\r\n * Create money from major unit (dollars, taka)\r\n * @example Money.of(19.99, 'USD') // $19.99 (stored as 1999 cents)\r\n */\r\n static of(amount: number, currency = 'USD'): Money {\r\n const config = CURRENCIES[currency.toUpperCase()] ?? { decimals: 2 };\r\n const multiplier = Math.pow(10, config.decimals);\r\n return new Money(Math.round(amount * multiplier), currency);\r\n }\r\n\r\n /**\r\n * Create zero money\r\n */\r\n static zero(currency = 'USD'): Money {\r\n return new Money(0, currency);\r\n }\r\n\r\n // ============ SHORTHAND FACTORIES ============\r\n\r\n static usd(cents: number): Money { return Money.cents(cents, 'USD'); }\r\n static eur(cents: number): Money { return Money.cents(cents, 'EUR'); }\r\n static gbp(pence: number): Money { return Money.cents(pence, 'GBP'); }\r\n static bdt(paisa: number): Money { return Money.cents(paisa, 'BDT'); }\r\n static inr(paisa: number): Money { return Money.cents(paisa, 'INR'); }\r\n static jpy(yen: number): Money { return Money.cents(yen, 'JPY'); }\r\n\r\n // ============ ARITHMETIC ============\r\n\r\n /**\r\n * Add two money values (must be same currency)\r\n */\r\n add(other: Money): Money {\r\n this.assertSameCurrency(other);\r\n return new Money(this.amount + other.amount, this.currency);\r\n }\r\n\r\n /**\r\n * Subtract money (must be same currency)\r\n */\r\n subtract(other: Money): Money {\r\n this.assertSameCurrency(other);\r\n return new Money(this.amount - other.amount, this.currency);\r\n }\r\n\r\n /**\r\n * Multiply by a factor (rounds to nearest integer)\r\n */\r\n multiply(factor: number): Money {\r\n return new Money(Math.round(this.amount * factor), this.currency);\r\n }\r\n\r\n /**\r\n * Divide by a divisor (rounds to nearest integer)\r\n */\r\n divide(divisor: number): Money {\r\n if (divisor === 0) throw new Error('Cannot divide by zero');\r\n return new Money(Math.round(this.amount / divisor), this.currency);\r\n }\r\n\r\n /**\r\n * Calculate percentage\r\n * @example money.percentage(10) // 10% of money\r\n */\r\n percentage(percent: number): Money {\r\n return this.multiply(percent / 100);\r\n }\r\n\r\n /**\r\n * Allocate money among recipients (handles rounding)\r\n * @example Money.usd(100).allocate([1, 1, 1]) // [34, 33, 33] cents\r\n */\r\n allocate(ratios: number[]): Money[] {\r\n const total = ratios.reduce((a, b) => a + b, 0);\r\n if (total === 0) throw new Error('Ratios must sum to more than 0');\r\n\r\n let remainder = this.amount;\r\n const results: Money[] = [];\r\n\r\n for (let i = 0; i < ratios.length; i++) {\r\n const share = Math.floor((this.amount * ratios[i]) / total);\r\n results.push(new Money(share, this.currency));\r\n remainder -= share;\r\n }\r\n\r\n // Distribute remainder (largest remainder method)\r\n for (let i = 0; i < remainder; i++) {\r\n results[i] = new Money(results[i].amount + 1, this.currency);\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Split equally among n recipients\r\n */\r\n split(parts: number): Money[] {\r\n return this.allocate(Array(parts).fill(1));\r\n }\r\n\r\n // ============ COMPARISON ============\r\n\r\n isZero(): boolean { return this.amount === 0; }\r\n isPositive(): boolean { return this.amount > 0; }\r\n isNegative(): boolean { return this.amount < 0; }\r\n \r\n equals(other: Money): boolean {\r\n return this.amount === other.amount && this.currency === other.currency;\r\n }\r\n\r\n greaterThan(other: Money): boolean {\r\n this.assertSameCurrency(other);\r\n return this.amount > other.amount;\r\n }\r\n\r\n lessThan(other: Money): boolean {\r\n this.assertSameCurrency(other);\r\n return this.amount < other.amount;\r\n }\r\n\r\n greaterThanOrEqual(other: Money): boolean {\r\n return this.greaterThan(other) || this.equals(other);\r\n }\r\n\r\n lessThanOrEqual(other: Money): boolean {\r\n return this.lessThan(other) || this.equals(other);\r\n }\r\n\r\n // ============ FORMATTING ============\r\n\r\n /**\r\n * Get amount in major unit (dollars, taka)\r\n */\r\n toUnit(): number {\r\n const config = CURRENCIES[this.currency] ?? { decimals: 2 };\r\n return this.amount / Math.pow(10, config.decimals);\r\n }\r\n\r\n /**\r\n * Format for display\r\n * @example Money.usd(1999).format() // \"$19.99\"\r\n */\r\n format(locale = 'en-US'): string {\r\n return new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currency: this.currency,\r\n }).format(this.toUnit());\r\n }\r\n\r\n /**\r\n * Format without currency symbol\r\n */\r\n formatAmount(locale = 'en-US'): string {\r\n const config = CURRENCIES[this.currency] ?? { decimals: 2 };\r\n return new Intl.NumberFormat(locale, {\r\n minimumFractionDigits: config.decimals,\r\n maximumFractionDigits: config.decimals,\r\n }).format(this.toUnit());\r\n }\r\n\r\n /**\r\n * Convert to JSON-serializable object\r\n */\r\n toJSON(): MoneyValue {\r\n return { amount: this.amount, currency: this.currency };\r\n }\r\n\r\n /**\r\n * Create from JSON\r\n */\r\n static fromJSON(json: MoneyValue): Money {\r\n return new Money(json.amount, json.currency);\r\n }\r\n\r\n toString(): string {\r\n return `${this.currency} ${this.amount}`;\r\n }\r\n\r\n // ============ HELPERS ============\r\n\r\n private assertSameCurrency(other: Money): void {\r\n if (this.currency !== other.currency) {\r\n throw new Error(\r\n `Currency mismatch: ${this.currency} vs ${other.currency}. Convert first.`\r\n );\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Helper functions for legacy compatibility\r\n */\r\nexport function toSmallestUnit(amount: number, currency = 'USD'): number {\r\n return Money.of(amount, currency).amount;\r\n}\r\n\r\nexport function fromSmallestUnit(amount: number, currency = 'USD'): number {\r\n return Money.cents(amount, currency).toUnit();\r\n}\r\n\r\nexport default Money;\r\n\r\n","/**\r\n * Zod Validation Schemas\r\n * @classytic/revenue\r\n *\r\n * Runtime validation with TypeScript inference\r\n * Using Zod v4 - Modern schema validation\r\n *\r\n * Inspired by: tRPC, Zod best practices\r\n */\r\n\r\nimport * as z from 'zod';\r\n\r\n// ============ PRIMITIVE SCHEMAS ============\r\n\r\n/**\r\n * MongoDB ObjectId pattern\r\n */\r\nexport const ObjectIdSchema = z.string().regex(\r\n /^[a-fA-F0-9]{24}$/,\r\n 'Invalid ObjectId format'\r\n);\r\n\r\n/**\r\n * Currency code (ISO 4217)\r\n */\r\nexport const CurrencySchema = z.string()\r\n .length(3, 'Currency must be 3 characters')\r\n .transform(val => val.toUpperCase())\r\n .default('USD');\r\n\r\n/**\r\n * Money amount in smallest unit (cents, paisa)\r\n */\r\nexport const MoneyAmountSchema = z.number()\r\n .int('Amount must be integer (smallest unit)')\r\n .nonnegative('Amount cannot be negative');\r\n\r\n/**\r\n * Money object\r\n */\r\nexport const MoneySchema = z.object({\r\n amount: MoneyAmountSchema,\r\n currency: z.string().length(3).default('USD'),\r\n});\r\n\r\n/**\r\n * Email address\r\n */\r\nexport const EmailSchema = z.string().email();\r\n\r\n/**\r\n * Idempotency key (optional, auto-generated if not provided)\r\n */\r\nexport const IdempotencyKeySchema = z.string()\r\n .min(1)\r\n .max(255)\r\n .optional();\r\n\r\n/**\r\n * Metadata object - Zod v4 record syntax\r\n */\r\nexport const MetadataSchema = z.record(z.string(), z.unknown()).optional().default({});\r\n\r\n// ============ PAYMENT SCHEMAS ============\r\n\r\n/**\r\n * Create payment intent params\r\n */\r\nexport const CreatePaymentSchema = z.object({\r\n /** Amount in smallest currency unit (cents) */\r\n amount: MoneyAmountSchema,\r\n /** ISO 4217 currency code */\r\n currency: z.string().length(3).default('USD'),\r\n /** Customer identifier */\r\n customerId: z.string().min(1, 'Customer ID is required'),\r\n /** Organization/merchant identifier */\r\n organizationId: z.string().min(1, 'Organization ID is required'),\r\n /** Payment provider to use */\r\n provider: z.string().min(1, 'Provider is required'),\r\n /** Idempotency key for safe retries */\r\n idempotencyKey: IdempotencyKeySchema,\r\n /** Description of the payment */\r\n description: z.string().optional(),\r\n /** Additional metadata */\r\n metadata: MetadataSchema,\r\n /** Success redirect URL */\r\n successUrl: z.string().url().optional(),\r\n /** Cancel redirect URL */\r\n cancelUrl: z.string().url().optional(),\r\n});\r\n\r\nexport type CreatePaymentInput = z.infer<typeof CreatePaymentSchema>;\r\n\r\n/**\r\n * Verify payment params\r\n */\r\nexport const VerifyPaymentSchema = z.object({\r\n /** Transaction ID or payment intent ID */\r\n id: z.string().min(1),\r\n /** Provider name (optional, auto-detected) */\r\n provider: z.string().optional(),\r\n /** Additional verification data */\r\n data: z.record(z.string(), z.unknown()).optional(),\r\n});\r\n\r\nexport type VerifyPaymentInput = z.infer<typeof VerifyPaymentSchema>;\r\n\r\n/**\r\n * Refund params\r\n */\r\nexport const RefundSchema = z.object({\r\n /** Transaction ID to refund */\r\n transactionId: z.string().min(1),\r\n /** Amount to refund (optional, full refund if not provided) */\r\n amount: MoneyAmountSchema.optional(),\r\n /** Reason for refund */\r\n reason: z.string().optional(),\r\n /** Idempotency key */\r\n idempotencyKey: IdempotencyKeySchema,\r\n /** Additional metadata */\r\n metadata: MetadataSchema,\r\n});\r\n\r\nexport type RefundInput = z.infer<typeof RefundSchema>;\r\n\r\n// ============ SUBSCRIPTION SCHEMAS ============\r\n\r\n/**\r\n * Subscription status\r\n */\r\nexport const SubscriptionStatusSchema = z.enum([\r\n 'pending',\r\n 'active',\r\n 'paused',\r\n 'cancelled',\r\n 'expired',\r\n 'past_due',\r\n]);\r\n\r\nexport type SubscriptionStatus = z.infer<typeof SubscriptionStatusSchema>;\r\n\r\n/**\r\n * Subscription interval\r\n */\r\nexport const IntervalSchema = z.enum([\r\n 'day',\r\n 'week',\r\n 'month',\r\n 'year',\r\n 'one_time',\r\n]);\r\n\r\nexport type Interval = z.infer<typeof IntervalSchema>;\r\n\r\n/**\r\n * Create subscription params\r\n */\r\nexport const CreateSubscriptionSchema = z.object({\r\n /** Customer ID */\r\n customerId: z.string().min(1),\r\n /** Organization ID */\r\n organizationId: z.string().min(1),\r\n /** Plan identifier */\r\n planKey: z.string().min(1),\r\n /** Amount per period (smallest unit) */\r\n amount: MoneyAmountSchema,\r\n /** Currency */\r\n currency: z.string().length(3).default('USD'),\r\n /** Billing interval */\r\n interval: IntervalSchema.default('month'),\r\n /** Interval count (e.g., 2 for bi-monthly) */\r\n intervalCount: z.number().int().positive().default(1),\r\n /** Payment provider */\r\n provider: z.string().min(1),\r\n /** Reference to external entity */\r\n referenceId: z.string().optional(),\r\n /** Reference model name */\r\n referenceModel: z.string().optional(),\r\n /** Idempotency key */\r\n idempotencyKey: IdempotencyKeySchema,\r\n /** Metadata */\r\n metadata: MetadataSchema,\r\n /** Trial period in days */\r\n trialDays: z.number().int().nonnegative().optional(),\r\n});\r\n\r\nexport type CreateSubscriptionInput = z.infer<typeof CreateSubscriptionSchema>;\r\n\r\n/**\r\n * Cancel subscription params\r\n */\r\nexport const CancelSubscriptionSchema = z.object({\r\n /** Subscription ID */\r\n subscriptionId: z.string().min(1),\r\n /** Cancel immediately or at period end */\r\n immediate: z.boolean().default(false),\r\n /** Cancellation reason */\r\n reason: z.string().optional(),\r\n});\r\n\r\nexport type CancelSubscriptionInput = z.infer<typeof CancelSubscriptionSchema>;\r\n\r\n// ============ MONETIZATION SCHEMAS ============\r\n\r\n/**\r\n * Monetization type\r\n */\r\nexport const MonetizationTypeSchema = z.enum([\r\n 'purchase',\r\n 'subscription',\r\n 'free',\r\n]);\r\n\r\nexport type MonetizationType = z.infer<typeof MonetizationTypeSchema>;\r\n\r\n/**\r\n * Create monetization params (unified API)\r\n */\r\nexport const CreateMonetizationSchema = z.object({\r\n /** Type of monetization */\r\n type: MonetizationTypeSchema.default('purchase'),\r\n /** Amount (smallest unit) - required for purchase/subscription */\r\n amount: MoneyAmountSchema.optional(),\r\n /** Currency */\r\n currency: z.string().length(3).default('USD'),\r\n /** Customer ID */\r\n customerId: z.string().min(1),\r\n /** Organization ID */\r\n organizationId: z.string().min(1),\r\n /** Payment provider */\r\n provider: z.string().min(1),\r\n /** Plan key for categorization */\r\n planKey: z.string().optional(),\r\n /** Reference ID */\r\n referenceId: z.string().optional(),\r\n /** Reference model */\r\n referenceModel: z.string().optional(),\r\n /** Idempotency key */\r\n idempotencyKey: IdempotencyKeySchema,\r\n /** Metadata */\r\n metadata: MetadataSchema,\r\n /** Subscription-specific: interval */\r\n interval: IntervalSchema.optional(),\r\n /** Subscription-specific: trial days */\r\n trialDays: z.number().int().nonnegative().optional(),\r\n}).refine(\r\n (data) => {\r\n if (data.type !== 'free' && !data.amount) {\r\n return false;\r\n }\r\n return true;\r\n },\r\n { message: 'Amount is required for non-free monetization types' }\r\n);\r\n\r\nexport type CreateMonetizationInput = z.infer<typeof CreateMonetizationSchema>;\r\n\r\n// ============ COMMISSION SCHEMAS ============\r\n\r\n/**\r\n * Commission split recipient\r\n */\r\nexport const SplitRecipientSchema = z.object({\r\n /** Recipient ID */\r\n recipientId: z.string().min(1),\r\n /** Recipient type (user, organization, etc.) */\r\n recipientType: z.string().default('user'),\r\n /** Percentage of net amount (0-100) */\r\n percentage: z.number().min(0).max(100),\r\n /** Role description */\r\n role: z.string().optional(),\r\n});\r\n\r\nexport type SplitRecipient = z.infer<typeof SplitRecipientSchema>;\r\n\r\n/**\r\n * Commission configuration\r\n */\r\nexport const CommissionConfigSchema = z.object({\r\n /** Platform commission rate (0-100) */\r\n platformRate: z.number().min(0).max(100).default(0),\r\n /** Gateway fee rate (0-100) */\r\n gatewayFeeRate: z.number().min(0).max(100).default(0),\r\n /** Fixed gateway fee (smallest unit) */\r\n gatewayFixedFee: MoneyAmountSchema.default(0),\r\n /** Split recipients */\r\n splits: z.array(SplitRecipientSchema).optional(),\r\n /** Affiliate configuration */\r\n affiliate: z.object({\r\n recipientId: z.string(),\r\n recipientType: z.string().default('user'),\r\n rate: z.number().min(0).max(100),\r\n }).optional(),\r\n});\r\n\r\nexport type CommissionConfig = z.infer<typeof CommissionConfigSchema>;\r\n\r\n// ============ ESCROW SCHEMAS ============\r\n\r\n/**\r\n * Hold status\r\n */\r\nexport const HoldStatusSchema = z.enum([\r\n 'none',\r\n 'held',\r\n 'partial_release',\r\n 'released',\r\n 'cancelled',\r\n]);\r\n\r\nexport type HoldStatus = z.infer<typeof HoldStatusSchema>;\r\n\r\n/**\r\n * Create hold params\r\n */\r\nexport const CreateHoldSchema = z.object({\r\n /** Transaction ID */\r\n transactionId: z.string().min(1),\r\n /** Hold amount (optional, defaults to full transaction amount) */\r\n amount: MoneyAmountSchema.optional(),\r\n /** Hold until date */\r\n holdUntil: z.date().optional(),\r\n /** Reason for hold */\r\n reason: z.string().optional(),\r\n});\r\n\r\nexport type CreateHoldInput = z.infer<typeof CreateHoldSchema>;\r\n\r\n/**\r\n * Release hold params\r\n */\r\nexport const ReleaseHoldSchema = z.object({\r\n /** Transaction ID */\r\n transactionId: z.string().min(1),\r\n /** Amount to release (optional, full release if not provided) */\r\n amount: MoneyAmountSchema.optional(),\r\n /** Recipient ID */\r\n recipientId: z.string().min(1),\r\n /** Recipient type */\r\n recipientType: z.string().default('user'),\r\n /** Release notes */\r\n notes: z.string().optional(),\r\n});\r\n\r\nexport type ReleaseHoldInput = z.infer<typeof ReleaseHoldSchema>;\r\n\r\n// ============ CONFIG SCHEMAS ============\r\n\r\n/**\r\n * Provider configuration\r\n */\r\nexport const ProviderConfigSchema = z.record(z.string(), z.unknown());\r\n\r\n/**\r\n * Retry configuration\r\n */\r\nexport const RetryConfigSchema = z.object({\r\n /** Maximum retry attempts */\r\n maxAttempts: z.number().int().positive().default(3),\r\n /** Base delay in ms */\r\n baseDelay: z.number().positive().default(1000),\r\n /** Maximum delay in ms */\r\n maxDelay: z.number().positive().default(30000),\r\n /** Backoff multiplier */\r\n backoffMultiplier: z.number().positive().default(2),\r\n /** Jitter factor (0-1) */\r\n jitter: z.number().min(0).max(1).default(0.1),\r\n});\r\n\r\nexport type RetryConfig = z.infer<typeof RetryConfigSchema>;\r\n\r\n/**\r\n * Revenue configuration\r\n */\r\nexport const RevenueConfigSchema = z.object({\r\n /** Default currency */\r\n defaultCurrency: z.string().length(3).default('USD'),\r\n /** Commission configuration */\r\n commission: CommissionConfigSchema.optional(),\r\n /** Retry configuration */\r\n retry: RetryConfigSchema.optional(),\r\n /** Enable debug logging */\r\n debug: z.boolean().default(false),\r\n /** Environment */\r\n environment: z.enum(['development', 'staging', 'production']).default('development'),\r\n});\r\n\r\nexport type RevenueConfigInput = z.infer<typeof RevenueConfigSchema>;\r\n\r\n// ============ VALIDATION HELPERS ============\r\n\r\n/**\r\n * Validate input against schema\r\n */\r\nexport function validate<T extends z.ZodType>(\r\n schema: T,\r\n data: unknown\r\n): z.infer<T> {\r\n return schema.parse(data);\r\n}\r\n\r\n/**\r\n * Safe validate (returns result, doesn't throw)\r\n */\r\nexport function safeValidate<T extends z.ZodType>(\r\n schema: T,\r\n data: unknown\r\n): { success: true; data: z.infer<T> } | { success: false; error: z.ZodError } {\r\n const result = schema.safeParse(data);\r\n if (result.success) {\r\n return { success: true, data: result.data };\r\n }\r\n return { success: false, error: result.error };\r\n}\r\n\r\n/**\r\n * Format Zod error for display\r\n * Zod v4 uses `issues` property\r\n */\r\nexport function formatZodError(error: z.ZodError): string {\r\n return error.issues\r\n .map((issue) => `${issue.path.join('.')}: ${issue.message}`)\r\n .join(', ');\r\n}\r\n\r\nexport { z };\r\n","/**\r\n * Payment Enums\r\n * @classytic/revenue\r\n *\r\n * Library-managed payment enums only.\r\n * Users define their own payment methods in their schema.\r\n */\r\n\r\n// ============ PAYMENT STATUS ============\r\n/**\r\n * Payment Status - Library-managed states\r\n */\r\nexport const PAYMENT_STATUS = {\r\n PENDING: 'pending',\r\n VERIFIED: 'verified',\r\n FAILED: 'failed',\r\n REFUNDED: 'refunded',\r\n CANCELLED: 'cancelled',\r\n} as const;\r\n\r\nexport type PaymentStatus = typeof PAYMENT_STATUS;\r\nexport type PaymentStatusValue = PaymentStatus[keyof PaymentStatus];\r\nexport const PAYMENT_STATUS_VALUES = Object.values(PAYMENT_STATUS);\r\n\r\n// ============ PAYMENT GATEWAY TYPES ============\r\n/**\r\n * Common gateway type constants for convenience\r\n *\r\n * ⚠️ IMPORTANT: These are NOT restrictions - just common reference values\r\n *\r\n * You can register ANY custom gateway provider by passing it to createRevenue():\r\n *\r\n * @example\r\n * ```typescript\r\n * const revenue = createRevenue({\r\n * providers: {\r\n * manual: new ManualProvider(),\r\n * bkash: new BkashProvider(), // ✅ Custom gateway\r\n * nagad: new NagadProvider(), // ✅ Custom gateway\r\n * stripe: new StripeProvider(), // ✅ Custom gateway\r\n * paypal: new PaypalProvider(), // ✅ Any gateway you want\r\n * }\r\n * });\r\n *\r\n * // Use by name\r\n * await revenue.monetization.create({ gateway: 'bkash', ... });\r\n * ```\r\n *\r\n * Reference values:\r\n * - MANUAL: Built-in manual provider (@classytic/revenue-manual)\r\n * - STRIPE: Stripe provider (build with @classytic/revenue-stripe)\r\n * - SSLCOMMERZ: SSLCommerz provider (build with @classytic/revenue-sslcommerz)\r\n *\r\n * Add your own: bkash, nagad, rocket, paypal, razorpay, flutterwave, etc.\r\n */\r\nexport const PAYMENT_GATEWAY_TYPE = {\r\n MANUAL: 'manual',\r\n STRIPE: 'stripe',\r\n SSLCOMMERZ: 'sslcommerz',\r\n} as const;\r\n\r\nexport type PaymentGatewayType = typeof PAYMENT_GATEWAY_TYPE;\r\nexport type PaymentGatewayTypeValue = PaymentGatewayType[keyof PaymentGatewayType];\r\nexport const PAYMENT_GATEWAY_TYPE_VALUES = Object.values(PAYMENT_GATEWAY_TYPE);\r\n\r\n// Backward compatibility alias\r\nexport const GATEWAY_TYPES = PAYMENT_GATEWAY_TYPE;\r\nexport const GATEWAY_TYPE_VALUES = PAYMENT_GATEWAY_TYPE_VALUES;\r\n\r\n","/**\r\n * Subscription Enums\r\n * @classytic/revenue\r\n *\r\n * All subscription-related enums and constants\r\n */\r\n\r\n// ============ SUBSCRIPTION STATUS ============\r\n/**\r\n * Subscription Status\r\n */\r\nexport const SUBSCRIPTION_STATUS = {\r\n ACTIVE: 'active',\r\n PAUSED: 'paused',\r\n CANCELLED: 'cancelled',\r\n EXPIRED: 'expired',\r\n PENDING: 'pending',\r\n INACTIVE: 'inactive',\r\n} as const;\r\n\r\nexport type SubscriptionStatus = typeof SUBSCRIPTION_STATUS;\r\nexport type SubscriptionStatusValue = SubscriptionStatus[keyof SubscriptionStatus];\r\nexport const SUBSCRIPTION_STATUS_VALUES = Object.values(SUBSCRIPTION_STATUS);\r\n\r\n// ============ PLAN KEYS ============\r\n/**\r\n * Supported plan intervals\r\n */\r\nexport const PLAN_KEYS = {\r\n MONTHLY: 'monthly',\r\n QUARTERLY: 'quarterly',\r\n YEARLY: 'yearly',\r\n} as const;\r\n\r\nexport type PlanKeys = typeof PLAN_KEYS;\r\nexport type PlanKeyValue = PlanKeys[keyof PlanKeys];\r\nexport const PLAN_KEY_VALUES = Object.values(PLAN_KEYS);\r\n\r\n","/**\r\n * Common Transaction Schemas\r\n * @classytic/revenue\r\n *\r\n * Base schemas shared across transaction types\r\n */\r\n\r\nimport { Schema } from 'mongoose';\r\n\r\n/**\r\n * Base metadata schema for transactions\r\n */\r\nexport const baseMetadataSchema = new Schema(\r\n {\r\n // Flexible key-value metadata\r\n },\r\n { _id: false, strict: false }\r\n);\r\n\r\n/**\r\n * Reference schema for polymorphic associations\r\n */\r\nexport const referenceSchema = {\r\n referenceId: {\r\n type: Schema.Types.ObjectId,\r\n refPath: 'referenceModel',\r\n index: true,\r\n },\r\n referenceModel: {\r\n type: String,\r\n enum: ['Subscription', 'Order', 'Membership', 'Booking', 'Invoice'],\r\n },\r\n};\r\n\r\nexport default {\r\n baseMetadataSchema,\r\n referenceSchema,\r\n};\r\n\r\n","/**\r\n * Gateway Schema\r\n * @classytic/revenue\r\n *\r\n * Schema for payment gateway information\r\n */\r\n\r\nimport { Schema } from 'mongoose';\r\n\r\n/**\r\n * Gateway Schema - Embedded in Transaction\r\n * Tracks payment gateway details\r\n */\r\nexport const gatewaySchema = new Schema(\r\n {\r\n type: {\r\n type: String,\r\n required: true,\r\n index: true,\r\n },\r\n sessionId: {\r\n type: String,\r\n sparse: true,\r\n index: true,\r\n },\r\n paymentIntentId: {\r\n type: String,\r\n sparse: true,\r\n index: true,\r\n },\r\n provider: {\r\n type: String,\r\n },\r\n metadata: {\r\n type: Schema.Types.Mixed,\r\n default: {},\r\n },\r\n verificationData: {\r\n type: Schema.Types.Mixed,\r\n },\r\n },\r\n { _id: false }\r\n);\r\n\r\nexport default gatewaySchema;\r\n\r\n","/**\r\n * Payment Schemas for Transaction Model\r\n * @classytic/revenue\r\n *\r\n * Schemas for payment tracking in transactions\r\n */\r\n\r\nimport { Schema } from 'mongoose';\r\nimport {\r\n PAYMENT_STATUS_VALUES,\r\n} from '../../enums/index.js';\r\n\r\n/**\r\n * Current Payment Schema\r\n * Use this in your model: currentPayment: { type: currentPaymentSchema }\r\n *\r\n * Tracks the latest payment transaction for an entity\r\n */\r\nexport const currentPaymentSchema = new Schema(\r\n {\r\n transactionId: {\r\n type: Schema.Types.ObjectId,\r\n ref: 'Transaction',\r\n index: true,\r\n },\r\n amount: {\r\n type: Number,\r\n min: 0,\r\n },\r\n status: {\r\n type: String,\r\n enum: PAYMENT_STATUS_VALUES,\r\n default: 'pending',\r\n index: true,\r\n },\r\n method: {\r\n type: String,\r\n // Users define payment methods in their transaction model\r\n },\r\n reference: {\r\n type: String,\r\n trim: true,\r\n },\r\n verifiedAt: {\r\n type: Date,\r\n },\r\n verifiedBy: {\r\n type: Schema.Types.ObjectId,\r\n ref: 'User',\r\n },\r\n },\r\n { _id: false }\r\n);\r\n\r\n/**\r\n * Payment Summary Schema\r\n * Use this in your model: paymentSummary: { type: paymentSummarySchema }\r\n *\r\n * Tracks payment history and totals\r\n */\r\nexport const paymentSummarySchema = new Schema(\r\n {\r\n totalPayments: {\r\n type: Number,\r\n default: 0,\r\n min: 0,\r\n },\r\n totalAmountPaid: {\r\n type: Number,\r\n default: 0,\r\n min: 0,\r\n },\r\n lastPaymentDate: {\r\n type: Date,\r\n },\r\n lastPaymentAmount: {\r\n type: Number,\r\n min: 0,\r\n },\r\n },\r\n { _id: false }\r\n);\r\n\r\n/**\r\n * Payment Details Schema (for manual payments)\r\n * Embedded in Transaction model\r\n */\r\nexport const paymentDetailsSchema = new Schema(\r\n {\r\n provider: { type: String },\r\n walletNumber: { type: String },\r\n walletType: { type: String },\r\n trxId: { type: String },\r\n bankName: { type: String },\r\n accountNumber: { type: String },\r\n accountName: { type: String },\r\n proofUrl: { type: String },\r\n },\r\n { _id: false }\r\n);\r\n\r\n/**\r\n * Tenant Snapshot Schema\r\n * Captures organization payment details at transaction time (audit trail)\r\n */\r\nexport const tenantSnapshotSchema = new Schema(\r\n {\r\n paymentInstructions: { type: String },\r\n bkashNumber: { type: String },\r\n nagadNumber: { type: String },\r\n bankAccount: { type: String },\r\n },\r\n { _id: false }\r\n);\r\n\r\nexport default {\r\n currentPaymentSchema,\r\n paymentSummarySchema,\r\n paymentDetailsSchema,\r\n tenantSnapshotSchema,\r\n};\r\n\r\n","/**\r\n * Commission Schema\r\n * @classytic/revenue\r\n *\r\n * Schema for platform commission tracking\r\n * Embedded in Transaction model\r\n */\r\n\r\nimport { Schema } from 'mongoose';\r\n\r\n/**\r\n * Commission Schema - Embedded in Transaction\r\n * Tracks platform commission with gateway fee deduction\r\n *\r\n * Usage: commission: commissionSchema\r\n */\r\nexport const commissionSchema = new Schema(\r\n {\r\n // Commission rate (e.g., 0.10 for 10%)\r\n rate: {\r\n type: Number,\r\n min: 0,\r\n max: 1,\r\n },\r\n // Gross commission amount (before gateway fees)\r\n grossAmount: {\r\n type: Number,\r\n min: 0,\r\n },\r\n // Gateway fee rate (e.g., 0.029 for 2.9%)\r\n gatewayFeeRate: {\r\n type: Number,\r\n min: 0,\r\n max: 1,\r\n },\r\n // Gateway fee amount deducted from commission\r\n gatewayFeeAmount: {\r\n type: Number,\r\n min: 0,\r\n },\r\n // Net commission (grossAmount - gatewayFeeAmount)\r\n netAmount: {\r\n type: Number,\r\n min: 0,\r\n },\r\n // Commission status\r\n status: {\r\n type: String,\r\n enum: ['pending', 'paid', 'waived', 'reversed'],\r\n default: 'pending',\r\n },\r\n // For affiliate tracking\r\n affiliate: {\r\n recipientId: String,\r\n recipientType: {\r\n type: String,\r\n enum: ['user', 'organization', 'partner'],\r\n },\r\n rate: Number,\r\n grossAmount: Number,\r\n netAmount: Number,\r\n },\r\n // For multi-party splits\r\n splits: [\r\n {\r\n type: String,\r\n recipientId: String,\r\n rate: Number,\r\n grossAmount: Number,\r\n netAmount: Number,\r\n },\r\n ],\r\n },\r\n { _id: false }\r\n);\r\n\r\nexport default commissionSchema;\r\n\r\n","/**\r\n * Plan Schema\r\n * @classytic/revenue\r\n *\r\n * Schema for subscription plans\r\n */\r\n\r\nimport { Schema } from 'mongoose';\r\nimport { PLAN_KEY_VALUES } from '../../enums/subscription.enums.js';\r\n\r\n/**\r\n * Plan Schema - for defining subscription plans\r\n */\r\nexport const planSchema = new Schema(\r\n {\r\n key: {\r\n type: String,\r\n enum: PLAN_KEY_VALUES,\r\n required: true,\r\n },\r\n name: {\r\n type: String,\r\n required: true,\r\n },\r\n description: {\r\n type: String,\r\n },\r\n amount: {\r\n type: Number,\r\n required: true,\r\n min: 0,\r\n },\r\n currency: {\r\n type: String,\r\n default: 'BDT',\r\n },\r\n interval: {\r\n type: String,\r\n enum: ['day', 'week', 'month', 'year'],\r\n default: 'month',\r\n },\r\n intervalCount: {\r\n type: Number,\r\n default: 1,\r\n min: 1,\r\n },\r\n features: [\r\n {\r\n type: String,\r\n },\r\n ],\r\n metadata: {\r\n type: Schema.Types.Mixed,\r\n default: {},\r\n },\r\n isActive: {\r\n type: Boolean,\r\n default: true,\r\n },\r\n },\r\n { _id: false }\r\n);\r\n\r\nexport default planSchema;\r\n\r\n","/**\r\n * Subscription Info Schema\r\n * @classytic/revenue\r\n *\r\n * Schema for subscription information embedded in entities\r\n */\r\n\r\nimport { Schema } from 'mongoose';\r\nimport { SUBSCRIPTION_STATUS_VALUES, PLAN_KEY_VALUES } from '../../enums/subscription.enums.js';\r\n\r\n/**\r\n * Subscription Info Schema\r\n * Use this in your entity models that have subscriptions\r\n *\r\n * @example\r\n * const OrganizationSchema = new Schema({\r\n * name: String,\r\n * subscription: { type: subscriptionInfoSchema },\r\n * });\r\n */\r\nexport const subscriptionInfoSchema = new Schema(\r\n {\r\n planKey: {\r\n type: String,\r\n enum: PLAN_KEY_VALUES,\r\n required: true,\r\n },\r\n status: {\r\n type: String,\r\n enum: SUBSCRIPTION_STATUS_VALUES,\r\n default: 'pending',\r\n index: true,\r\n },\r\n isActive: {\r\n type: Boolean,\r\n default: false,\r\n index: true,\r\n },\r\n startDate: {\r\n type: Date,\r\n },\r\n endDate: {\r\n type: Date,\r\n index: true,\r\n },\r\n canceledAt: {\r\n type: Date,\r\n },\r\n cancelAt: {\r\n type: Date,\r\n },\r\n pausedAt: {\r\n type: Date,\r\n },\r\n lastPaymentDate: {\r\n type: Date,\r\n },\r\n lastPaymentAmount: {\r\n type: Number,\r\n },\r\n renewalCount: {\r\n type: Number,\r\n default: 0,\r\n },\r\n },\r\n { _id: false }\r\n);\r\n\r\nexport default subscriptionInfoSchema;\r\n\r\n","/**\r\n * Hold/Escrow Schema\r\n * @classytic/revenue\r\n *\r\n * Schema for platform-as-intermediary escrow flow\r\n * Spread into transaction schema when needed\r\n */\r\n\r\nimport { HOLD_STATUS, HOLD_STATUS_VALUES, HOLD_REASON_VALUES } from '../../enums/escrow.enums.js';\r\n\r\nexport const holdSchema = {\r\n status: {\r\n type: String,\r\n enum: HOLD_STATUS_VALUES,\r\n default: HOLD_STATUS.PENDING,\r\n index: true,\r\n },\r\n\r\n heldAmount: {\r\n type: Number,\r\n required: false,\r\n },\r\n\r\n releasedAmount: {\r\n type: Number,\r\n default: 0,\r\n },\r\n\r\n reason: {\r\n type: String,\r\n enum: HOLD_REASON_VALUES,\r\n required: false,\r\n },\r\n\r\n holdUntil: {\r\n type: Date,\r\n required: false,\r\n },\r\n\r\n heldAt: Date,\r\n releasedAt: Date,\r\n cancelledAt: Date,\r\n\r\n releases: [\r\n {\r\n amount: Number,\r\n recipientId: String,\r\n recipientType: String,\r\n releasedAt: Date,\r\n releasedBy: String,\r\n reason: String,\r\n metadata: Object,\r\n },\r\n ],\r\n\r\n metadata: {\r\n type: Object,\r\n default: {},\r\n },\r\n} as const;\r\n\r\nexport default holdSchema;\r\n\r\n","/**\r\n * Split Schema\r\n * @classytic/revenue\r\n *\r\n * Schema for multi-party commission splits\r\n */\r\n\r\nimport { Schema } from 'mongoose';\r\nimport {\r\n SPLIT_TYPE_VALUES,\r\n SPLIT_STATUS,\r\n SPLIT_STATUS_VALUES,\r\n PAYOUT_METHOD_VALUES,\r\n} from '../../enums/split.enums.js';\r\n\r\n/**\r\n * Split Schema - Embedded in Transaction\r\n */\r\nexport const splitSchema = new Schema(\r\n {\r\n type: {\r\n type: String,\r\n enum: SPLIT_TYPE_VALUES,\r\n required: true,\r\n },\r\n recipientId: {\r\n type: String,\r\n required: true,\r\n index: true,\r\n },\r\n recipientType: {\r\n type: String,\r\n enum: ['platform', 'organization', 'user', 'affiliate', 'partner'],\r\n required: true,\r\n },\r\n rate: {\r\n type: Number,\r\n required: true,\r\n min: 0,\r\n max: 1,\r\n },\r\n grossAmount: {\r\n type: Number,\r\n required: true,\r\n min: 0,\r\n },\r\n gatewayFeeRate: {\r\n type: Number,\r\n default: 0,\r\n min: 0,\r\n max: 1,\r\n },\r\n gatewayFeeAmount: {\r\n type: Number,\r\n default: 0,\r\n min: 0,\r\n },\r\n netAmount: {\r\n type: Number,\r\n required: true,\r\n min: 0,\r\n },\r\n status: {\r\n type: String,\r\n enum: SPLIT_STATUS_VALUES,\r\n default: SPLIT_STATUS.PENDING,\r\n index: true,\r\n },\r\n dueDate: {\r\n type: Date,\r\n },\r\n paidDate: {\r\n type: Date,\r\n },\r\n payoutMethod: {\r\n type: String,\r\n enum: PAYOUT_METHOD_VALUES,\r\n },\r\n payoutTransactionId: {\r\n type: String,\r\n },\r\n metadata: {\r\n type: Schema.Types.Mixed,\r\n default: {},\r\n },\r\n },\r\n { _id: false }\r\n);\r\n\r\nexport default splitSchema;\r\n\r\n","/**\r\n * Transaction Type Detection & Classification\r\n *\r\n * Distinguishes between:\r\n * - Monetization-managed transactions (library-controlled, strict rules)\r\n * - Manual admin transactions (flexible, admin-controlled)\r\n *\r\n * @module @classytic/revenue/utils/transaction-type\r\n */\r\n\r\nimport type {\r\n TransactionDocument,\r\n TransactionTypeOptions,\r\n FieldUpdateValidationResult,\r\n} from '../types/index.js';\r\n\r\n/**\r\n * Transaction types with different protection rules\r\n */\r\nexport const TRANSACTION_MANAGEMENT_TYPE = {\r\n MONETIZATION: 'monetization', // Library-managed (subscriptions, purchases)\r\n MANUAL: 'manual', // Admin-managed (expenses, income, adjustments)\r\n} as const;\r\n\r\nexport type TransactionManagementType = typeof TRANSACTION_MANAGEMENT_TYPE[keyof typeof TRANSACTION_MANAGEMENT_TYPE];\r\n\r\n/**\r\n * Default monetization categories\r\n * Users can extend this via config.categoryMappings\r\n */\r\nconst DEFAULT_MONETIZATION_CATEGORIES = [\r\n 'subscription',\r\n 'purchase',\r\n];\r\n\r\n/**\r\n * Check if category is monetization-related\r\n * @param category - Transaction category\r\n * @param additionalCategories - Additional categories from user config\r\n */\r\nfunction isMonetizationCategory(\r\n category: string,\r\n additionalCategories: string[] = []\r\n): boolean {\r\n const allCategories = [...DEFAULT_MONETIZATION_CATEGORIES, ...additionalCategories];\r\n return allCategories.includes(category);\r\n}\r\n\r\n/**\r\n * Check if transaction is monetization-managed\r\n *\r\n * Monetization-managed means:\r\n * - Created through subscription/purchase flows via the library\r\n * - Status controlled by payment webhooks/verification\r\n * - Amount/commission calculated by library\r\n * - Protected fields: status, amount, commission, gateway, verifiedAt, verifiedBy\r\n *\r\n * @param transaction - Transaction document or data\r\n * @param options - Options\r\n */\r\nexport function isMonetizationTransaction(\r\n transaction: Partial<TransactionDocument>,\r\n options: TransactionTypeOptions = {}\r\n): boolean {\r\n const {\r\n targetModels = ['Subscription', 'Membership'],\r\n additionalCategories = [],\r\n } = options;\r\n\r\n // Check 1: Has referenceModel from registered models\r\n if (transaction.referenceModel && targetModels.includes(transaction.referenceModel)) {\r\n return true;\r\n }\r\n\r\n // Check 2: Category is monetization-related\r\n if (transaction.category) {\r\n return isMonetizationCategory(transaction.category, additionalCategories);\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Check if transaction is manual admin transaction\r\n *\r\n * Manual transactions:\r\n * - Created directly by admins for operational expenses/income\r\n * - Can be self-verified by admins\r\n * - More flexible updates allowed\r\n * - No commission/gateway complexity\r\n *\r\n * @param transaction - Transaction document or data\r\n * @param options - Options (same as isMonetizationTransaction)\r\n */\r\nexport function isManualTransaction(\r\n transaction: Partial<TransactionDocument>,\r\n options: TransactionTypeOptions = {}\r\n): boolean {\r\n return !isMonetizationTransaction(transaction, options);\r\n}\r\n\r\n/**\r\n * Get transaction type\r\n *\r\n * @param transaction - Transaction document or data\r\n * @param options - Options (same as isMonetizationTransaction)\r\n */\r\nexport function getTransactionType(\r\n transaction: Partial<TransactionDocument>,\r\n options: TransactionTypeOptions = {}\r\n): TransactionManagementType {\r\n return isMonetizationTransaction(transaction, options)\r\n ? TRANSACTION_MANAGEMENT_TYPE.MONETIZATION\r\n : TRANSACTION_MANAGEMENT_TYPE.MANUAL;\r\n}\r\n\r\n/**\r\n * Protected fields for monetization transactions\r\n * These fields cannot be updated directly by admins\r\n */\r\nexport const PROTECTED_MONETIZATION_FIELDS = [\r\n 'status',\r\n 'amount',\r\n 'platformCommission',\r\n 'netAmount',\r\n 'verifiedAt',\r\n 'verifiedBy',\r\n 'gateway',\r\n 'webhook',\r\n 'metadata.commission',\r\n 'metadata.gateway',\r\n 'type',\r\n 'category',\r\n 'referenceModel',\r\n 'referenceId',\r\n] as const;\r\n\r\n/**\r\n * Editable fields for monetization transactions (before verification)\r\n * These fields can be updated by frontend/customer before payment is verified\r\n */\r\nexport const EDITABLE_MONETIZATION_FIELDS_PRE_VERIFICATION = [\r\n 'reference',\r\n 'paymentDetails',\r\n 'notes',\r\n] as const;\r\n\r\n/**\r\n * Allowed fields for manual transaction creation\r\n */\r\nexport const MANUAL_TRANSACTION_CREATE_FIELDS = [\r\n 'organizationId',\r\n 'type',\r\n 'category',\r\n 'amount',\r\n 'method',\r\n 'reference',\r\n 'paymentDetails',\r\n 'notes',\r\n 'date', // Transaction date (can be backdated)\r\n 'description',\r\n] as const;\r\n\r\n/**\r\n * Allowed fields for manual transaction updates\r\n */\r\nexport const MANUAL_TRANSACTION_UPDATE_FIELDS = [\r\n 'amount',\r\n 'method',\r\n 'reference',\r\n 'paymentDetails',\r\n 'notes',\r\n 'date',\r\n 'description',\r\n] as const;\r\n\r\n/**\r\n * Get allowed update fields based on transaction type and status\r\n *\r\n * @param transaction - Transaction document\r\n * @param options - Options for transaction type detection\r\n */\r\nexport function getAllowedUpdateFields(\r\n transaction: Partial<TransactionDocument>,\r\n options: TransactionTypeOptions = {}\r\n): readonly string[] {\r\n const type = getTransactionType(transaction, options);\r\n\r\n if (type === TRANSACTION_MANAGEMENT_TYPE.MONETIZATION) {\r\n // Monetization transactions: only allow pre-verification edits\r\n if (transaction.status === 'pending') {\r\n return EDITABLE_MONETIZATION_FIELDS_PRE_VERIFICATION;\r\n }\r\n // After verification, no direct updates allowed\r\n return [];\r\n }\r\n\r\n // Manual transactions: more flexible\r\n if (transaction.status === 'verified' || transaction.status === 'completed') {\r\n // Once verified/completed, only notes can be updated\r\n return ['notes'];\r\n }\r\n\r\n // Pending manual transactions can be fully edited\r\n return MANUAL_TRANSACTION_UPDATE_FIELDS;\r\n}\r\n\r\n/**\r\n * Validate if field update is allowed\r\n *\r\n * @param transaction - Transaction document\r\n * @param fieldName - Field being updated\r\n * @param options - Options for transaction type detection\r\n */\r\nexport function validateFieldUpdate(\r\n transaction: Partial<TransactionDocument>,\r\n fieldName: string,\r\n options: TransactionTypeOptions = {}\r\n): FieldUpdateValidationResult {\r\n const allowedFields = getAllowedUpdateFields(transaction, options);\r\n\r\n if (allowedFields.includes(fieldName)) {\r\n return { allowed: true };\r\n }\r\n\r\n const type = getTransactionType(transaction, options);\r\n\r\n if (type === TRANSACTION_MANAGEMENT_TYPE.MONETIZATION) {\r\n if ((PROTECTED_MONETIZATION_FIELDS as readonly string[]).includes(fieldName)) {\r\n return {\r\n allowed: false,\r\n reason: `Field \"${fieldName}\" is protected for monetization transactions. Updates must go through payment flow.`,\r\n };\r\n }\r\n }\r\n\r\n return {\r\n allowed: false,\r\n reason: `Field \"${fieldName}\" cannot be updated for ${transaction.status} transactions.`,\r\n };\r\n}\r\n\r\n/**\r\n * Check if transaction can be self-verified by admin\r\n *\r\n * @param transaction - Transaction document\r\n * @param options - Options for transaction type detection\r\n */\r\nexport function canSelfVerify(\r\n transaction: Partial<TransactionDocument>,\r\n options: TransactionTypeOptions = {}\r\n): boolean {\r\n const type = getTransactionType(transaction, options);\r\n\r\n // Only manual transactions can be self-verified\r\n if (type === TRANSACTION_MANAGEMENT_TYPE.MANUAL) {\r\n return transaction.status === 'pending';\r\n }\r\n\r\n return false;\r\n}\r\n\r\nexport default {\r\n TRANSACTION_MANAGEMENT_TYPE,\r\n isMonetizationTransaction,\r\n isManualTransaction,\r\n getTransactionType,\r\n PROTECTED_MONETIZATION_FIELDS,\r\n EDITABLE_MONETIZATION_FIELDS_PRE_VERIFICATION,\r\n MANUAL_TRANSACTION_CREATE_FIELDS,\r\n MANUAL_TRANSACTION_UPDATE_FIELDS,\r\n getAllowedUpdateFields,\r\n validateFieldUpdate,\r\n canSelfVerify,\r\n};\r\n\r\n","/**\r\n * Logger Abstraction for Monetization Library\r\n *\r\n * Defaults to console for standalone usage\r\n * Can be overridden with custom logger (pino, winston, etc)\r\n *\r\n * Usage:\r\n * ```typescript\r\n * import { setLogger } from '@classytic/revenue';\r\n *\r\n * // Optional: Use your own logger\r\n * setLogger(myPinoLogger);\r\n * ```\r\n */\r\n\r\nimport type { Logger } from '../types/index.js';\r\n\r\nlet _logger: Logger = console;\r\n\r\n/**\r\n * Set custom logger implementation\r\n * @param customLogger - Logger instance with info, warn, error, debug methods\r\n */\r\nexport function setLogger(customLogger: Logger): void {\r\n _logger = customLogger;\r\n}\r\n\r\n/**\r\n * Logger proxy - delegates to current logger implementation\r\n */\r\nexport const logger: Logger = {\r\n info: (...args: unknown[]): void => {\r\n (_logger.info ?? _logger.log)?.call(_logger, ...args);\r\n },\r\n warn: (...args: unknown[]): void => {\r\n (_logger.warn ?? _logger.log)?.call(_logger, 'WARN:', ...args);\r\n },\r\n error: (...args: unknown[]): void => {\r\n (_logger.error ?? _logger.log)?.call(_logger, 'ERROR:', ...args);\r\n },\r\n debug: (...args: unknown[]): void => {\r\n (_logger.debug ?? _logger.log)?.call(_logger, 'DEBUG:', ...args);\r\n },\r\n};\r\n\r\nexport default logger;\r\n\r\n","/**\r\n * Subscription Period Utilities\r\n * @classytic/revenue/utils/subscription\r\n *\r\n * Universal period calculation, proration, and date utilities\r\n */\r\n\r\nimport type {\r\n PeriodRangeParams,\r\n PeriodRangeResult,\r\n ProratedAmountParams,\r\n DurationResult,\r\n} from '../../types/index.js';\r\n\r\nexport type DurationUnit = 'days' | 'day' | 'weeks' | 'week' | 'months' | 'month' | 'years' | 'year';\r\n\r\n/**\r\n * Add duration to date\r\n */\r\nexport function addDuration(\r\n startDate: Date,\r\n duration: number,\r\n unit: DurationUnit = 'days'\r\n): Date {\r\n const date = new Date(startDate);\r\n\r\n switch (unit) {\r\n case 'months':\r\n case 'month':\r\n date.setMonth(date.getMonth() + duration);\r\n return date;\r\n case 'years':\r\n case 'year':\r\n date.setFullYear(date.getFullYear() + duration);\r\n return date;\r\n case 'weeks':\r\n case 'week':\r\n date.setDate(date.getDate() + (duration * 7));\r\n return date;\r\n case 'days':\r\n case 'day':\r\n default:\r\n date.setDate(date.getDate() + duration);\r\n return date;\r\n }\r\n}\r\n\r\n/**\r\n * Calculate subscription period start/end dates\r\n */\r\nexport function calculatePeriodRange(params: PeriodRangeParams): PeriodRangeResult {\r\n const {\r\n currentEndDate = null,\r\n startDate = null,\r\n duration,\r\n unit = 'days',\r\n now = new Date(),\r\n } = params;\r\n\r\n let periodStart: Date;\r\n\r\n if (startDate) {\r\n periodStart = new Date(startDate);\r\n } else if (currentEndDate) {\r\n const end = new Date(currentEndDate);\r\n periodStart = end > now ? end : now;\r\n } else {\r\n periodStart = now;\r\n }\r\n\r\n const periodEnd = addDuration(periodStart, duration, unit as DurationUnit);\r\n\r\n return { startDate: periodStart, endDate: periodEnd };\r\n}\r\n\r\n/**\r\n * Calculate prorated refund amount for unused period\r\n */\r\nexport function calculateProratedAmount(params: ProratedAmountParams): number {\r\n const {\r\n amountPaid,\r\n startDate,\r\n endDate,\r\n asOfDate = new Date(),\r\n precision = 2,\r\n } = params;\r\n\r\n if (!amountPaid || amountPaid <= 0) return 0;\r\n\r\n const start = new Date(startDate);\r\n const end = new Date(endDate);\r\n const asOf = new Date(asOfDate);\r\n\r\n const totalMs = end.getTime() - start.getTime();\r\n if (totalMs <= 0) return 0;\r\n\r\n const remainingMs = Math.max(0, end.getTime() - asOf.getTime());\r\n if (remainingMs <= 0) return 0;\r\n\r\n const ratio = remainingMs / totalMs;\r\n const amount = amountPaid * ratio;\r\n\r\n const factor = 10 ** precision;\r\n return Math.round(amount * factor) / factor;\r\n}\r\n\r\n/**\r\n * Convert interval + count to duration/unit\r\n */\r\nexport function resolveIntervalToDuration(\r\n interval: string = 'month',\r\n intervalCount: number = 1\r\n): DurationResult {\r\n const normalized = (interval || 'month').toLowerCase();\r\n const count = Number(intervalCount) > 0 ? Number(intervalCount) : 1;\r\n\r\n switch (normalized) {\r\n case 'year':\r\n case 'years':\r\n return { duration: count, unit: 'years' };\r\n case 'week':\r\n case 'weeks':\r\n return { duration: count, unit: 'weeks' };\r\n case 'quarter':\r\n case 'quarters':\r\n return { duration: count * 3, unit: 'months' };\r\n case 'day':\r\n case 'days':\r\n return { duration: count, unit: 'days' };\r\n case 'month':\r\n case 'months':\r\n default:\r\n return { duration: count, unit: 'months' };\r\n }\r\n}\r\n\r\nexport default {\r\n addDuration,\r\n calculatePeriodRange,\r\n calculateProratedAmount,\r\n resolveIntervalToDuration,\r\n};\r\n\r\n","/**\r\n * Subscription Action Utilities\r\n * @classytic/revenue/utils/subscription\r\n *\r\n * Eligibility checks for subscription actions\r\n */\r\n\r\nimport { SUBSCRIPTION_STATUS } from '../../enums/subscription.enums.js';\r\nimport type { SubscriptionEntity, SubscriptionDocument } from '../../types/index.js';\r\n\r\n/**\r\n * Check if subscription is active\r\n */\r\nexport function isSubscriptionActive(\r\n subscription: Partial<SubscriptionDocument> | null | undefined\r\n): boolean {\r\n if (!subscription) return false;\r\n if (!subscription.isActive) return false;\r\n\r\n if (subscription.endDate) {\r\n const now = new Date();\r\n const endDate = new Date(subscription.endDate);\r\n if (endDate < now) return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Check if can renew\r\n */\r\nexport function canRenewSubscription(entity: SubscriptionEntity | null | undefined): boolean {\r\n if (!entity?.subscription) return false;\r\n return isSubscriptionActive(entity.subscription as Partial<SubscriptionDocument>);\r\n}\r\n\r\n/**\r\n * Check if can cancel\r\n */\r\nexport function canCancelSubscription(entity: SubscriptionEntity | null | undefined): boolean {\r\n if (!entity?.subscription) return false;\r\n if (!isSubscriptionActive(entity.subscription as Partial<SubscriptionDocument>)) return false;\r\n return !entity.subscription.canceledAt;\r\n}\r\n\r\n/**\r\n * Check if can pause\r\n */\r\nexport function canPauseSubscription(entity: SubscriptionEntity | null | undefined): boolean {\r\n if (!entity?.subscription) return false;\r\n if (entity.status === SUBSCRIPTION_STATUS.PAUSED) return false;\r\n if (entity.status === SUBSCRIPTION_STATUS.CANCELLED) return false;\r\n return isSubscriptionActive(entity.subscription as Partial<SubscriptionDocument>);\r\n}\r\n\r\n/**\r\n * Check if can resume\r\n */\r\nexport function canResumeSubscription(entity: SubscriptionEntity | null | undefined): boolean {\r\n if (!entity?.subscription) return false;\r\n return entity.status === SUBSCRIPTION_STATUS.PAUSED;\r\n}\r\n\r\nexport default {\r\n isSubscriptionActive,\r\n canRenewSubscription,\r\n canCancelSubscription,\r\n canPauseSubscription,\r\n canResumeSubscription,\r\n};\r\n\r\n","/**\r\n * @classytic/revenue\r\n * Enterprise Revenue Management System\r\n *\r\n * Modern • Type-safe • Resilient • Composable\r\n *\r\n * @version 1.0.0\r\n * @author Classytic\r\n * @license MIT\r\n */\r\n\r\n// ============ MAIN API ============\r\nexport {\r\n Revenue,\r\n RevenueBuilder,\r\n createRevenue,\r\n type RevenueOptions,\r\n type ModelsConfig,\r\n type ProvidersConfig,\r\n type HooksConfig,\r\n} from './core/revenue.js';\r\n\r\n// ============ CONTAINER (ADVANCED) ============\r\nexport { Container } from './core/container.js';\r\n\r\n// ============ RESULT TYPE (RUST-INSPIRED) ============\r\nexport {\r\n Result,\r\n ok,\r\n err,\r\n isOk,\r\n isErr,\r\n unwrap,\r\n unwrapOr,\r\n map,\r\n mapErr,\r\n flatMap,\r\n tryCatch,\r\n tryCatchSync,\r\n all,\r\n match,\r\n type Ok,\r\n type Err,\r\n} from './core/result.js';\r\n\r\n// ============ MONEY UTILITY ============\r\nexport {\r\n Money,\r\n toSmallestUnit,\r\n fromSmallestUnit,\r\n type MoneyValue,\r\n} from './utils/money.js';\r\n\r\n// ============ EVENT SYSTEM ============\r\nexport {\r\n EventBus,\r\n createEventBus,\r\n type RevenueEvents,\r\n type BaseEvent,\r\n type PaymentSucceededEvent,\r\n type PaymentFailedEvent,\r\n type PaymentRefundedEvent,\r\n type SubscriptionCreatedEvent,\r\n type SubscriptionActivatedEvent,\r\n type SubscriptionRenewedEvent,\r\n type SubscriptionCancelledEvent,\r\n type TransactionCreatedEvent,\r\n type TransactionVerifiedEvent,\r\n type EscrowHeldEvent,\r\n type EscrowReleasedEvent,\r\n} from './core/events.js';\r\n\r\n// ============ PLUGIN SYSTEM ============\r\nexport {\r\n PluginManager,\r\n loggingPlugin,\r\n auditPlugin,\r\n metricsPlugin,\r\n definePlugin,\r\n type RevenuePlugin,\r\n type PluginContext,\r\n type PluginLogger,\r\n type PluginHooks,\r\n} from './core/plugin.js';\r\n\r\n// ============ VALIDATION (ZOD V4) ============\r\nexport {\r\n // Primitive schemas\r\n ObjectIdSchema,\r\n CurrencySchema,\r\n MoneyAmountSchema,\r\n MoneySchema,\r\n EmailSchema,\r\n IdempotencyKeySchema,\r\n MetadataSchema,\r\n // Payment schemas\r\n CreatePaymentSchema,\r\n VerifyPaymentSchema,\r\n RefundSchema,\r\n // Subscription schemas\r\n SubscriptionStatusSchema,\r\n IntervalSchema,\r\n CreateSubscriptionSchema,\r\n CancelSubscriptionSchema,\r\n // Monetization schemas\r\n MonetizationTypeSchema,\r\n CreateMonetizationSchema,\r\n // Commission schemas\r\n SplitRecipientSchema,\r\n CommissionConfigSchema,\r\n // Escrow schemas\r\n HoldStatusSchema,\r\n CreateHoldSchema,\r\n ReleaseHoldSchema,\r\n // Config schemas\r\n ProviderConfigSchema,\r\n RetryConfigSchema,\r\n RevenueConfigSchema,\r\n // Helpers\r\n validate,\r\n safeValidate,\r\n formatZodError,\r\n z,\r\n // Types\r\n type CreatePaymentInput,\r\n type VerifyPaymentInput,\r\n type RefundInput,\r\n type SubscriptionStatus,\r\n type Interval,\r\n type CreateSubscriptionInput,\r\n type CancelSubscriptionInput,\r\n type MonetizationType,\r\n type SplitRecipient,\r\n type CommissionConfig,\r\n type HoldStatus,\r\n type CreateHoldInput,\r\n type ReleaseHoldInput,\r\n type RetryConfig,\r\n type RevenueConfigInput,\r\n} from './schemas/validation.js';\r\n\r\n// ============ RESILIENCE UTILITIES ============\r\nexport {\r\n retry,\r\n retryWithResult,\r\n calculateDelay,\r\n isRetryableError,\r\n RetryExhaustedError,\r\n CircuitBreaker,\r\n createCircuitBreaker,\r\n CircuitOpenError,\r\n resilientExecute,\r\n type CircuitState,\r\n type CircuitBreakerConfig,\r\n} from './utils/retry.js';\r\n\r\n// ============ IDEMPOTENCY ============\r\nexport {\r\n IdempotencyManager,\r\n MemoryIdempotencyStore,\r\n IdempotencyError,\r\n createIdempotencyManager,\r\n type IdempotencyRecord,\r\n type IdempotencyStore,\r\n type IdempotencyConfig,\r\n} from './utils/idempotency.js';\r\n\r\n// ============ ERROR CLASSES ============\r\nexport * from './core/errors.js';\r\n\r\n// ============ PROVIDER SYSTEM ============\r\nexport {\r\n PaymentProvider,\r\n PaymentIntent,\r\n PaymentResult,\r\n RefundResult,\r\n WebhookEvent,\r\n} from './providers/base.js';\r\n\r\n// ============ SERVICES (DIRECT ACCESS IF NEEDED) ============\r\nexport { MonetizationService } from './services/monetization.service.js';\r\nexport { PaymentService } from './services/payment.service.js';\r\nexport { TransactionService } from './services/transaction.service.js';\r\nexport { EscrowService } from './services/escrow.service.js';\r\n\r\n// ============ ENUMS & MONGOOSE SCHEMAS ============\r\nexport * from './enums/index.js';\r\nexport * from './schemas/index.js';\r\n\r\n// ============ UTILITIES ============\r\nexport {\r\n logger,\r\n setLogger,\r\n calculateCommission,\r\n reverseCommission,\r\n calculateSplits,\r\n calculateOrganizationPayout,\r\n reverseSplits,\r\n calculateCommissionWithSplits,\r\n resolveCategory,\r\n isCategoryValid,\r\n isMonetizationTransaction,\r\n isManualTransaction,\r\n getTransactionType,\r\n getAllowedUpdateFields,\r\n validateFieldUpdate,\r\n canSelfVerify,\r\n TRANSACTION_MANAGEMENT_TYPE,\r\n PROTECTED_MONETIZATION_FIELDS,\r\n EDITABLE_MONETIZATION_FIELDS_PRE_VERIFICATION,\r\n MANUAL_TRANSACTION_CREATE_FIELDS,\r\n MANUAL_TRANSACTION_UPDATE_FIELDS,\r\n addDuration,\r\n calculatePeriodRange,\r\n calculateProratedAmount,\r\n resolveIntervalToDuration,\r\n isSubscriptionActive,\r\n canRenewSubscription,\r\n canCancelSubscription,\r\n canPauseSubscription,\r\n canResumeSubscription,\r\n} from './utils/index.js';\r\n\r\n// ============ TYPE EXPORTS ============\r\nexport type {\r\n // Core types\r\n ObjectId,\r\n MongooseDoc,\r\n MongooseModel,\r\n // Transaction types\r\n TransactionStatusValue,\r\n TransactionTypeValue,\r\n TransactionGateway,\r\n CommissionInfo,\r\n WebhookInfo,\r\n HoldInfo,\r\n ReleaseRecord,\r\n TransactionDocument,\r\n // Subscription types\r\n SubscriptionStatusValue,\r\n PlanKeyValue,\r\n SubscriptionDocument,\r\n // Payment types\r\n PaymentStatusValue,\r\n PaymentGatewayTypeValue,\r\n // Monetization types\r\n MonetizationTypeValue,\r\n // Escrow types\r\n HoldStatusValue,\r\n HoldReasonValue,\r\n ReleaseReasonValue,\r\n // Split types\r\n SplitTypeValue,\r\n SplitStatusValue,\r\n PayoutMethodValue,\r\n SplitRule,\r\n SplitInfo,\r\n // Provider types\r\n CreateIntentParams,\r\n PaymentIntentData,\r\n PaymentResultData,\r\n RefundResultData,\r\n WebhookEventData,\r\n ProviderCapabilities,\r\n PaymentProviderInterface,\r\n // Config types\r\n ModelsRegistry,\r\n ProvidersRegistry,\r\n HooksRegistry,\r\n Logger,\r\n RevenueConfig,\r\n CreateRevenueOptions,\r\n // Service param types\r\n MonetizationData,\r\n MonetizationCreateParams,\r\n MonetizationCreateResult,\r\n ActivateOptions,\r\n RenewalParams,\r\n CancelOptions,\r\n PauseOptions,\r\n ResumeOptions,\r\n ListOptions,\r\n PaymentVerifyOptions,\r\n PaymentVerifyResult,\r\n PaymentStatusResult,\r\n RefundOptions,\r\n PaymentRefundResult,\r\n WebhookResult,\r\n TransactionListResult,\r\n HoldOptions,\r\n ReleaseOptions,\r\n ReleaseResult,\r\n CancelHoldOptions,\r\n SplitResult,\r\n EscrowStatusResult,\r\n // Utility types\r\n PeriodRangeParams,\r\n PeriodRangeResult,\r\n ProratedAmountParams,\r\n DurationResult,\r\n SubscriptionEntity,\r\n CommissionWithSplitsOptions,\r\n TransactionTypeOptions,\r\n FieldUpdateValidationResult,\r\n} from './types/index.js';\r\n\r\n// ============ DEFAULT EXPORT ============\r\nimport { Revenue, createRevenue } from './core/revenue.js';\r\nimport { PaymentProvider } from './providers/base.js';\r\nimport { RevenueError } from './core/errors.js';\r\nimport { Money } from './utils/money.js';\r\nimport { Result } from './core/result.js';\r\nimport { EventBus } from './core/events.js';\r\n\r\nexport default {\r\n Revenue,\r\n createRevenue,\r\n PaymentProvider,\r\n RevenueError,\r\n Money,\r\n Result,\r\n EventBus,\r\n};\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/container.ts","../src/core/events.ts","../src/core/plugin.ts","../src/core/result.ts","../src/utils/idempotency.ts","../src/utils/retry.ts","../src/core/errors.ts","../src/utils/hooks.ts","../src/enums/transaction.enums.ts","../src/utils/category-resolver.ts","../src/utils/commission.ts","../src/enums/monetization.enums.ts","../src/services/monetization.service.ts","../src/services/payment.service.ts","../src/services/transaction.service.ts","../src/enums/escrow.enums.ts","../src/enums/split.enums.ts","../src/utils/commission-split.ts","../src/services/escrow.service.ts","../src/providers/base.ts","../src/core/revenue.ts","../src/utils/money.ts","../src/schemas/validation.ts","../src/enums/payment.enums.ts","../src/enums/subscription.enums.ts","../src/schemas/transaction/common.schema.ts","../src/schemas/transaction/gateway.schema.ts","../src/schemas/transaction/payment.schema.ts","../src/schemas/transaction/commission.schema.ts","../src/schemas/subscription/plan.schema.ts","../src/schemas/subscription/info.schema.ts","../src/schemas/escrow/hold.schema.ts","../src/schemas/split/split.schema.ts","../src/utils/transaction-type.ts","../src/utils/logger.ts","../src/utils/subscription/period.ts","../src/utils/subscription/actions.ts","../src/index.ts"],"names":["instance","err","record","logger","nanoid","Schema","date"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Dependency Injection Container\n * @classytic/revenue\n *\n * Lightweight DI container for managing dependencies\n * Inspired by: Awilix, InversifyJS but much simpler\n */\n\ninterface ServiceRegistration<T = unknown> {\n implementation: T | ((container: Container) => T);\n singleton: boolean;\n factory: boolean;\n}\n\nexport class Container {\n private _services: Map<string, ServiceRegistration>;\n private _singletons: Map<string, unknown>;\n\n constructor() {\n this._services = new Map();\n this._singletons = new Map();\n }\n\n /**\n * Register a service\n * @param name - Service name\n * @param implementation - Service implementation or factory\n * @param options - Registration options\n */\n register<T>(\n name: string,\n implementation: T | ((container: Container) => T),\n options: { singleton?: boolean; factory?: boolean } = {}\n ): this {\n this._services.set(name, {\n implementation,\n singleton: options.singleton !== false, // Default to singleton\n factory: options.factory ?? false,\n });\n return this;\n }\n\n /**\n * Register a singleton service\n * @param name - Service name\n * @param implementation - Service implementation\n */\n singleton<T>(name: string, implementation: T): this {\n return this.register(name, implementation, { singleton: true });\n }\n\n /**\n * Register a transient service (new instance each time)\n * @param name - Service name\n * @param factory - Factory function\n */\n transient<T>(name: string, factory: (container: Container) => T): this {\n return this.register(name, factory, { singleton: false, factory: true });\n }\n\n /**\n * Get a service from the container\n * @param name - Service name\n * @returns Service instance\n */\n get<T>(name: string): T {\n // Check if already instantiated as singleton\n if (this._singletons.has(name)) {\n return this._singletons.get(name) as T;\n }\n\n const service = this._services.get(name);\n if (!service) {\n throw new Error(`Service \"${name}\" not registered in container`);\n }\n\n // Handle factory functions\n if (service.factory) {\n const factory = service.implementation as (container: Container) => T;\n const instance = factory(this);\n if (service.singleton) {\n this._singletons.set(name, instance);\n }\n return instance;\n }\n\n // Handle direct values\n const instance = service.implementation as T;\n if (service.singleton) {\n this._singletons.set(name, instance);\n }\n return instance;\n }\n\n /**\n * Check if service is registered\n * @param name - Service name\n */\n has(name: string): boolean {\n return this._services.has(name);\n }\n\n /**\n * Get all registered service names\n */\n keys(): string[] {\n return Array.from(this._services.keys());\n }\n\n /**\n * Clear all services (useful for testing)\n */\n clear(): void {\n this._services.clear();\n this._singletons.clear();\n }\n\n /**\n * Create a child container (for scoped dependencies)\n */\n createScope(): Container {\n const scope = new Container();\n // Copy parent services\n this._services.forEach((value, key) => {\n scope._services.set(key, value);\n });\n return scope;\n }\n}\n\nexport default Container;\n\n","/**\n * Event System - Type-safe pub/sub\n * @classytic/revenue\n *\n * Strongly typed events with async handlers\n * Inspired by: Node.js EventEmitter, mitt, EventTarget\n */\n\nimport type { TransactionDocument, SubscriptionDocument } from '../types/index.js';\nimport type { PaymentResult, RefundResult } from '../providers/base.js';\n\n// ============ EVENT DEFINITIONS ============\n\n/**\n * All revenue events with their payload types\n */\nexport interface RevenueEvents {\n // Payment events\n 'payment.initiated': PaymentInitiatedEvent;\n 'payment.succeeded': PaymentSucceededEvent;\n 'payment.failed': PaymentFailedEvent;\n 'payment.refunded': PaymentRefundedEvent;\n \n // Subscription events\n 'subscription.created': SubscriptionCreatedEvent;\n 'subscription.activated': SubscriptionActivatedEvent;\n 'subscription.renewed': SubscriptionRenewedEvent;\n 'subscription.cancelled': SubscriptionCancelledEvent;\n 'subscription.paused': SubscriptionPausedEvent;\n 'subscription.resumed': SubscriptionResumedEvent;\n 'subscription.expired': SubscriptionExpiredEvent;\n \n // Transaction events\n 'transaction.created': TransactionCreatedEvent;\n 'transaction.verified': TransactionVerifiedEvent;\n 'transaction.completed': TransactionCompletedEvent;\n 'transaction.failed': TransactionFailedEvent;\n \n // Escrow events\n 'escrow.held': EscrowHeldEvent;\n 'escrow.released': EscrowReleasedEvent;\n 'escrow.cancelled': EscrowCancelledEvent;\n \n // Commission events\n 'commission.calculated': CommissionCalculatedEvent;\n 'commission.paid': CommissionPaidEvent;\n \n // Webhook events\n 'webhook.received': WebhookReceivedEvent;\n 'webhook.processed': WebhookProcessedEvent;\n \n // Wildcard - catches all events\n '*': BaseEvent;\n}\n\n// ============ EVENT PAYLOADS ============\n\nexport interface BaseEvent {\n readonly type: string;\n readonly timestamp: Date;\n readonly metadata?: Record<string, unknown>;\n}\n\nexport interface PaymentInitiatedEvent extends BaseEvent {\n type: 'payment.initiated';\n transactionId: string;\n amount: number;\n currency: string;\n provider: string;\n intentId: string;\n}\n\nexport interface PaymentSucceededEvent extends BaseEvent {\n type: 'payment.succeeded';\n transactionId: string;\n transaction: TransactionDocument;\n result: PaymentResult;\n}\n\nexport interface PaymentFailedEvent extends BaseEvent {\n type: 'payment.failed';\n transactionId: string;\n error: Error;\n provider: string;\n}\n\nexport interface PaymentRefundedEvent extends BaseEvent {\n type: 'payment.refunded';\n transactionId: string;\n result: RefundResult;\n amount: number;\n isPartial: boolean;\n}\n\nexport interface SubscriptionCreatedEvent extends BaseEvent {\n type: 'subscription.created';\n subscriptionId: string;\n subscription: SubscriptionDocument;\n transactionId?: string;\n}\n\nexport interface SubscriptionActivatedEvent extends BaseEvent {\n type: 'subscription.activated';\n subscriptionId: string;\n subscription: SubscriptionDocument;\n transactionId: string;\n}\n\nexport interface SubscriptionRenewedEvent extends BaseEvent {\n type: 'subscription.renewed';\n subscriptionId: string;\n subscription: SubscriptionDocument;\n transactionId: string;\n period: { start: Date; end: Date };\n}\n\nexport interface SubscriptionCancelledEvent extends BaseEvent {\n type: 'subscription.cancelled';\n subscriptionId: string;\n subscription: SubscriptionDocument;\n reason?: string;\n immediate: boolean;\n}\n\nexport interface SubscriptionPausedEvent extends BaseEvent {\n type: 'subscription.paused';\n subscriptionId: string;\n subscription: SubscriptionDocument;\n resumeAt?: Date;\n}\n\nexport interface SubscriptionResumedEvent extends BaseEvent {\n type: 'subscription.resumed';\n subscriptionId: string;\n subscription: SubscriptionDocument;\n}\n\nexport interface SubscriptionExpiredEvent extends BaseEvent {\n type: 'subscription.expired';\n subscriptionId: string;\n subscription: SubscriptionDocument;\n}\n\nexport interface TransactionCreatedEvent extends BaseEvent {\n type: 'transaction.created';\n transactionId: string;\n transaction: TransactionDocument;\n}\n\nexport interface TransactionVerifiedEvent extends BaseEvent {\n type: 'transaction.verified';\n transactionId: string;\n transaction: TransactionDocument;\n}\n\nexport interface TransactionCompletedEvent extends BaseEvent {\n type: 'transaction.completed';\n transactionId: string;\n transaction: TransactionDocument;\n}\n\nexport interface TransactionFailedEvent extends BaseEvent {\n type: 'transaction.failed';\n transactionId: string;\n error: Error;\n}\n\nexport interface EscrowHeldEvent extends BaseEvent {\n type: 'escrow.held';\n transactionId: string;\n amount: number;\n holdUntil?: Date;\n}\n\nexport interface EscrowReleasedEvent extends BaseEvent {\n type: 'escrow.released';\n transactionId: string;\n releasedAmount: number;\n recipientId: string;\n}\n\nexport interface EscrowCancelledEvent extends BaseEvent {\n type: 'escrow.cancelled';\n transactionId: string;\n reason: string;\n}\n\nexport interface CommissionCalculatedEvent extends BaseEvent {\n type: 'commission.calculated';\n transactionId: string;\n grossAmount: number;\n netAmount: number;\n platformFee: number;\n gatewayFee: number;\n}\n\nexport interface CommissionPaidEvent extends BaseEvent {\n type: 'commission.paid';\n transactionId: string;\n recipientId: string;\n amount: number;\n}\n\nexport interface WebhookReceivedEvent extends BaseEvent {\n type: 'webhook.received';\n provider: string;\n eventType: string;\n payload: unknown;\n}\n\nexport interface WebhookProcessedEvent extends BaseEvent {\n type: 'webhook.processed';\n provider: string;\n eventType: string;\n transactionId?: string;\n success: boolean;\n}\n\n// ============ EVENT BUS ============\n\ntype EventHandler<T> = (event: T) => void | Promise<void>;\ntype EventKey = keyof RevenueEvents;\n\n/**\n * Type-safe event bus\n */\nexport class EventBus {\n private handlers = new Map<string, Set<EventHandler<any>>>();\n private onceHandlers = new Map<string, Set<EventHandler<any>>>();\n\n /**\n * Subscribe to an event\n */\n on<K extends EventKey>(\n event: K,\n handler: EventHandler<RevenueEvents[K]>\n ): () => void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler);\n \n // Return unsubscribe function\n return () => this.off(event, handler);\n }\n\n /**\n * Subscribe to an event once\n */\n once<K extends EventKey>(\n event: K,\n handler: EventHandler<RevenueEvents[K]>\n ): () => void {\n if (!this.onceHandlers.has(event)) {\n this.onceHandlers.set(event, new Set());\n }\n this.onceHandlers.get(event)!.add(handler);\n \n return () => this.onceHandlers.get(event)?.delete(handler);\n }\n\n /**\n * Unsubscribe from an event\n */\n off<K extends EventKey>(\n event: K,\n handler: EventHandler<RevenueEvents[K]>\n ): void {\n this.handlers.get(event)?.delete(handler);\n this.onceHandlers.get(event)?.delete(handler);\n }\n\n /**\n * Emit an event (fire and forget, non-blocking)\n */\n emit<K extends EventKey>(event: K, payload: Omit<RevenueEvents[K], 'timestamp'>): void {\n const fullPayload = {\n ...payload,\n timestamp: new Date(),\n } as RevenueEvents[K];\n\n // Regular handlers\n const handlers = this.handlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n // Fire and forget - don't await\n Promise.resolve(handler(fullPayload)).catch(err => {\n console.error(`[Revenue] Event handler error for \"${event}\":`, err);\n });\n }\n }\n\n // Once handlers\n const onceHandlers = this.onceHandlers.get(event);\n if (onceHandlers) {\n for (const handler of onceHandlers) {\n Promise.resolve(handler(fullPayload)).catch(err => {\n console.error(`[Revenue] Once handler error for \"${event}\":`, err);\n });\n }\n this.onceHandlers.delete(event);\n }\n\n // Wildcard handlers\n if (event !== '*') {\n const wildcardHandlers = this.handlers.get('*');\n if (wildcardHandlers) {\n for (const handler of wildcardHandlers) {\n Promise.resolve(handler(fullPayload)).catch(err => {\n console.error(`[Revenue] Wildcard handler error:`, err);\n });\n }\n }\n }\n }\n\n /**\n * Emit and wait for all handlers to complete\n */\n async emitAsync<K extends EventKey>(\n event: K,\n payload: Omit<RevenueEvents[K], 'timestamp'>\n ): Promise<void> {\n const fullPayload = {\n ...payload,\n timestamp: new Date(),\n } as RevenueEvents[K];\n\n const promises: Promise<void>[] = [];\n\n const handlers = this.handlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n promises.push(Promise.resolve(handler(fullPayload)));\n }\n }\n\n const onceHandlers = this.onceHandlers.get(event);\n if (onceHandlers) {\n for (const handler of onceHandlers) {\n promises.push(Promise.resolve(handler(fullPayload)));\n }\n this.onceHandlers.delete(event);\n }\n\n if (event !== '*') {\n const wildcardHandlers = this.handlers.get('*');\n if (wildcardHandlers) {\n for (const handler of wildcardHandlers) {\n promises.push(Promise.resolve(handler(fullPayload)));\n }\n }\n }\n\n await Promise.all(promises);\n }\n\n /**\n * Remove all handlers\n */\n clear(): void {\n this.handlers.clear();\n this.onceHandlers.clear();\n }\n\n /**\n * Get handler count for an event\n */\n listenerCount(event: EventKey): number {\n return (this.handlers.get(event)?.size ?? 0) + \n (this.onceHandlers.get(event)?.size ?? 0);\n }\n}\n\n/**\n * Create a new event bus\n */\nexport function createEventBus(): EventBus {\n return new EventBus();\n}\n\nexport default EventBus;\n\n","/**\n * Plugin System\n * @classytic/revenue\n *\n * Composable, type-safe plugin architecture\n * Inspired by: Hono middleware, Fastify plugins, Redux middleware\n */\n\nimport type { EventBus, RevenueEvents } from './events.js';\n\n// ============ PLUGIN TYPES ============\n\n/**\n * Plugin context passed to hooks\n */\nexport interface PluginContext {\n /** Event bus for emitting events */\n events: EventBus;\n /** Logger instance */\n logger: PluginLogger;\n /** Get registered service */\n get<T>(key: string): T;\n /** Plugin-specific storage */\n storage: Map<string, unknown>;\n /** Request metadata */\n meta: {\n idempotencyKey?: string;\n requestId: string;\n timestamp: Date;\n [key: string]: unknown;\n };\n}\n\n/**\n * Plugin logger interface\n */\nexport interface PluginLogger {\n debug(message: string, data?: unknown): void;\n info(message: string, data?: unknown): void;\n warn(message: string, data?: unknown): void;\n error(message: string, data?: unknown): void;\n}\n\n/**\n * Hook function type\n */\nexport type HookFn<TInput = unknown, TOutput = unknown> = (\n ctx: PluginContext,\n input: TInput,\n next: () => Promise<TOutput>\n) => Promise<TOutput>;\n\n/**\n * Available hook points\n */\nexport interface PluginHooks {\n // Payment hooks\n 'payment.create.before': HookFn<PaymentCreateInput>;\n 'payment.create.after': HookFn<PaymentCreateInput, PaymentCreateOutput>;\n 'payment.verify.before': HookFn<PaymentVerifyInput>;\n 'payment.verify.after': HookFn<PaymentVerifyInput, PaymentVerifyOutput>;\n 'payment.refund.before': HookFn<RefundInput>;\n 'payment.refund.after': HookFn<RefundInput, RefundOutput>;\n \n // Subscription hooks\n 'subscription.create.before': HookFn<SubscriptionCreateInput>;\n 'subscription.create.after': HookFn<SubscriptionCreateInput, SubscriptionCreateOutput>;\n 'subscription.cancel.before': HookFn<SubscriptionCancelInput>;\n 'subscription.cancel.after': HookFn<SubscriptionCancelInput, SubscriptionCancelOutput>;\n \n // Transaction hooks\n 'transaction.create.before': HookFn<TransactionCreateInput>;\n 'transaction.create.after': HookFn<TransactionCreateInput, TransactionCreateOutput>;\n \n // Escrow hooks\n 'escrow.hold.before': HookFn<EscrowHoldInput>;\n 'escrow.hold.after': HookFn<EscrowHoldInput, EscrowHoldOutput>;\n 'escrow.release.before': HookFn<EscrowReleaseInput>;\n 'escrow.release.after': HookFn<EscrowReleaseInput, EscrowReleaseOutput>;\n}\n\n// Simplified input/output types for hooks\ninterface PaymentCreateInput { amount: number; currency: string; [key: string]: unknown }\ninterface PaymentCreateOutput { transactionId: string; intentId: string; [key: string]: unknown }\ninterface PaymentVerifyInput { id: string; [key: string]: unknown }\ninterface PaymentVerifyOutput { verified: boolean; [key: string]: unknown }\ninterface RefundInput { transactionId: string; amount?: number; [key: string]: unknown }\ninterface RefundOutput { refundId: string; [key: string]: unknown }\ninterface SubscriptionCreateInput { planKey: string; [key: string]: unknown }\ninterface SubscriptionCreateOutput { subscriptionId: string; [key: string]: unknown }\ninterface SubscriptionCancelInput { subscriptionId: string; [key: string]: unknown }\ninterface SubscriptionCancelOutput { cancelled: boolean; [key: string]: unknown }\ninterface TransactionCreateInput { amount: number; [key: string]: unknown }\ninterface TransactionCreateOutput { transactionId: string; [key: string]: unknown }\ninterface EscrowHoldInput { transactionId: string; [key: string]: unknown }\ninterface EscrowHoldOutput { held: boolean; [key: string]: unknown }\ninterface EscrowReleaseInput { transactionId: string; [key: string]: unknown }\ninterface EscrowReleaseOutput { released: boolean; [key: string]: unknown }\n\n/**\n * Plugin definition\n */\nexport interface RevenuePlugin {\n /** Unique plugin name */\n name: string;\n /** Plugin version */\n version?: string;\n /** Plugin description */\n description?: string;\n /** Dependencies on other plugins */\n dependencies?: string[];\n /** Hook implementations */\n hooks?: Partial<PluginHooks>;\n /** Event listeners */\n events?: Partial<{\n [K in keyof RevenueEvents]: (event: RevenueEvents[K]) => void | Promise<void>;\n }>;\n /** Initialize plugin */\n init?: (ctx: PluginContext) => void | Promise<void>;\n /** Cleanup plugin */\n destroy?: () => void | Promise<void>;\n}\n\n// ============ PLUGIN MANAGER ============\n\n/**\n * Plugin manager - handles registration and execution\n */\nexport class PluginManager {\n private plugins = new Map<string, RevenuePlugin>();\n private hooks = new Map<string, HookFn[]>();\n private initialized = false;\n\n /**\n * Register a plugin\n */\n register(plugin: RevenuePlugin): this {\n if (this.plugins.has(plugin.name)) {\n throw new Error(`Plugin \"${plugin.name}\" is already registered`);\n }\n\n // Check dependencies\n if (plugin.dependencies) {\n for (const dep of plugin.dependencies) {\n if (!this.plugins.has(dep)) {\n throw new Error(\n `Plugin \"${plugin.name}\" requires \"${dep}\" to be registered first`\n );\n }\n }\n }\n\n this.plugins.set(plugin.name, plugin);\n\n // Register hooks\n if (plugin.hooks) {\n for (const [hookName, hookFn] of Object.entries(plugin.hooks)) {\n if (!this.hooks.has(hookName)) {\n this.hooks.set(hookName, []);\n }\n this.hooks.get(hookName)!.push(hookFn as HookFn);\n }\n }\n\n return this;\n }\n\n /**\n * Initialize all plugins\n */\n async init(ctx: PluginContext): Promise<void> {\n if (this.initialized) return;\n\n for (const plugin of this.plugins.values()) {\n if (plugin.init) {\n await plugin.init(ctx);\n }\n\n // Register event listeners\n if (plugin.events) {\n for (const [event, handler] of Object.entries(plugin.events)) {\n ctx.events.on(event as keyof RevenueEvents, handler as any);\n }\n }\n }\n\n this.initialized = true;\n }\n\n /**\n * Execute a hook chain\n */\n async executeHook<TInput, TOutput>(\n hookName: string,\n ctx: PluginContext,\n input: TInput,\n execute: () => Promise<TOutput>\n ): Promise<TOutput> {\n const hooks = this.hooks.get(hookName) ?? [];\n \n if (hooks.length === 0) {\n return execute();\n }\n\n // Build middleware chain\n let index = 0;\n const next = async (): Promise<TOutput> => {\n if (index >= hooks.length) {\n return execute();\n }\n const hook = hooks[index++];\n return hook(ctx, input, next) as Promise<TOutput>;\n };\n\n return next();\n }\n\n /**\n * Check if plugin is registered\n */\n has(name: string): boolean {\n return this.plugins.has(name);\n }\n\n /**\n * Get a plugin by name\n */\n get(name: string): RevenuePlugin | undefined {\n return this.plugins.get(name);\n }\n\n /**\n * Get all registered plugins\n */\n list(): RevenuePlugin[] {\n return Array.from(this.plugins.values());\n }\n\n /**\n * Destroy all plugins\n */\n async destroy(): Promise<void> {\n for (const plugin of this.plugins.values()) {\n if (plugin.destroy) {\n await plugin.destroy();\n }\n }\n this.plugins.clear();\n this.hooks.clear();\n this.initialized = false;\n }\n}\n\n// ============ BUILT-IN PLUGINS ============\n\n/**\n * Logging plugin - logs all operations\n */\nexport function loggingPlugin(options: { level?: 'debug' | 'info' } = {}): RevenuePlugin {\n const level = options.level ?? 'info';\n \n return {\n name: 'logging',\n version: '1.0.0',\n description: 'Logs all revenue operations',\n hooks: {\n 'payment.create.before': async (ctx, input, next) => {\n ctx.logger[level]('Creating payment', { amount: input.amount, currency: input.currency });\n const result = await next();\n ctx.logger[level]('Payment created', { transactionId: (result as any)?.transactionId });\n return result;\n },\n 'payment.verify.before': async (ctx, input, next) => {\n ctx.logger[level]('Verifying payment', { id: input.id });\n const result = await next();\n ctx.logger[level]('Payment verified', { verified: (result as any)?.verified });\n return result;\n },\n 'payment.refund.before': async (ctx, input, next) => {\n ctx.logger[level]('Processing refund', { transactionId: input.transactionId, amount: input.amount });\n const result = await next();\n ctx.logger[level]('Refund processed', { refundId: (result as any)?.refundId });\n return result;\n },\n },\n };\n}\n\n/**\n * Audit plugin - records all operations for compliance\n */\nexport function auditPlugin(options: { \n store?: (entry: AuditEntry) => Promise<void> \n} = {}): RevenuePlugin {\n const entries: AuditEntry[] = [];\n \n const store = options.store ?? (async (entry: AuditEntry) => {\n entries.push(entry);\n });\n\n return {\n name: 'audit',\n version: '1.0.0',\n description: 'Audit trail for all operations',\n hooks: {\n 'payment.create.after': async (ctx, input, next) => {\n const result = await next();\n await store({\n action: 'payment.create',\n requestId: ctx.meta.requestId,\n timestamp: ctx.meta.timestamp,\n input: sanitizeInput(input),\n output: sanitizeOutput(result),\n idempotencyKey: ctx.meta.idempotencyKey,\n });\n return result;\n },\n 'payment.refund.after': async (ctx, input, next) => {\n const result = await next();\n await store({\n action: 'payment.refund',\n requestId: ctx.meta.requestId,\n timestamp: ctx.meta.timestamp,\n input: sanitizeInput(input),\n output: sanitizeOutput(result),\n idempotencyKey: ctx.meta.idempotencyKey,\n });\n return result;\n },\n },\n };\n}\n\ninterface AuditEntry {\n action: string;\n requestId: string;\n timestamp: Date;\n input: Record<string, unknown>;\n output: Record<string, unknown>;\n idempotencyKey?: string;\n}\n\nfunction sanitizeInput(input: unknown): Record<string, unknown> {\n if (typeof input !== 'object' || !input) return {};\n const sanitized = { ...input } as Record<string, unknown>;\n // Remove sensitive fields\n delete sanitized.apiKey;\n delete sanitized.secretKey;\n delete sanitized.password;\n return sanitized;\n}\n\nfunction sanitizeOutput(output: unknown): Record<string, unknown> {\n if (typeof output !== 'object' || !output) return {};\n return { ...output } as Record<string, unknown>;\n}\n\n/**\n * Metrics plugin - collects operation metrics\n */\nexport function metricsPlugin(options: {\n onMetric?: (metric: Metric) => void;\n} = {}): RevenuePlugin {\n const metrics: Metric[] = [];\n \n const record = options.onMetric ?? ((metric: Metric) => {\n metrics.push(metric);\n });\n\n return {\n name: 'metrics',\n version: '1.0.0',\n description: 'Collects operation metrics',\n hooks: {\n 'payment.create.before': async (_ctx, input, next) => {\n const start = Date.now();\n try {\n const result = await next();\n record({\n name: 'payment.create',\n duration: Date.now() - start,\n success: true,\n amount: input.amount,\n currency: input.currency,\n });\n return result;\n } catch (error) {\n record({\n name: 'payment.create',\n duration: Date.now() - start,\n success: false,\n error: (error as Error).message,\n });\n throw error;\n }\n },\n },\n };\n}\n\ninterface Metric {\n name: string;\n duration: number;\n success: boolean;\n error?: string;\n [key: string]: unknown;\n}\n\n/**\n * Create a custom plugin\n */\nexport function definePlugin(plugin: RevenuePlugin): RevenuePlugin {\n return plugin;\n}\n\nexport default PluginManager;\n\n","/**\n * Result Type - Rust-inspired error handling\n * @classytic/revenue\n *\n * No more try/catch - explicit, type-safe error handling\n * Inspired by: Rust Result<T, E>, neverthrow, Effect-TS\n */\n\n/**\n * Success result\n */\nexport interface Ok<T> {\n readonly ok: true;\n readonly value: T;\n readonly error?: never;\n}\n\n/**\n * Error result\n */\nexport interface Err<E> {\n readonly ok: false;\n readonly error: E;\n readonly value?: never;\n}\n\n/**\n * Result type - either Ok<T> or Err<E>\n */\nexport type Result<T, E = Error> = Ok<T> | Err<E>;\n\n/**\n * Create a success result\n */\nexport function ok<T>(value: T): Ok<T> {\n return { ok: true, value };\n}\n\n/**\n * Create an error result\n */\nexport function err<E>(error: E): Err<E> {\n return { ok: false, error };\n}\n\n/**\n * Check if result is Ok\n */\nexport function isOk<T, E>(result: Result<T, E>): result is Ok<T> {\n return result.ok === true;\n}\n\n/**\n * Check if result is Err\n */\nexport function isErr<T, E>(result: Result<T, E>): result is Err<E> {\n return result.ok === false;\n}\n\n/**\n * Unwrap a result, throwing if it's an error\n * Use sparingly - prefer pattern matching\n */\nexport function unwrap<T, E>(result: Result<T, E>): T {\n if (result.ok) return result.value;\n throw result.error;\n}\n\n/**\n * Unwrap a result with a default value\n */\nexport function unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T {\n return result.ok ? result.value : defaultValue;\n}\n\n/**\n * Map over a successful result\n */\nexport function map<T, U, E>(\n result: Result<T, E>,\n fn: (value: T) => U\n): Result<U, E> {\n return result.ok ? ok(fn(result.value)) : result;\n}\n\n/**\n * Map over an error result\n */\nexport function mapErr<T, E, F>(\n result: Result<T, E>,\n fn: (error: E) => F\n): Result<T, F> {\n return result.ok ? result : err(fn(result.error));\n}\n\n/**\n * Flat map (chain) results\n */\nexport function flatMap<T, U, E>(\n result: Result<T, E>,\n fn: (value: T) => Result<U, E>\n): Result<U, E> {\n return result.ok ? fn(result.value) : result;\n}\n\n/**\n * Try-catch wrapper that returns Result\n */\nexport async function tryCatch<T, E = Error>(\n fn: () => Promise<T>,\n mapError?: (e: unknown) => E\n): Promise<Result<T, E>> {\n try {\n const value = await fn();\n return ok(value);\n } catch (e) {\n const error = mapError ? mapError(e) : (e as E);\n return err(error);\n }\n}\n\n/**\n * Synchronous try-catch wrapper\n */\nexport function tryCatchSync<T, E = Error>(\n fn: () => T,\n mapError?: (e: unknown) => E\n): Result<T, E> {\n try {\n const value = fn();\n return ok(value);\n } catch (e) {\n const error = mapError ? mapError(e) : (e as E);\n return err(error);\n }\n}\n\n/**\n * Combine multiple results - all must succeed\n */\nexport function all<T extends readonly Result<unknown, unknown>[]>(\n results: T\n): Result<\n { [K in keyof T]: T[K] extends Result<infer U, unknown> ? U : never },\n T[number] extends Result<unknown, infer E> ? E : never\n> {\n const values: unknown[] = [];\n for (const result of results) {\n if (!result.ok) return result as any;\n values.push(result.value);\n }\n return ok(values as any);\n}\n\n/**\n * Pattern match on result\n */\nexport function match<T, E, U>(\n result: Result<T, E>,\n handlers: {\n ok: (value: T) => U;\n err: (error: E) => U;\n }\n): U {\n return result.ok ? handlers.ok(result.value) : handlers.err(result.error);\n}\n\nexport const Result = {\n ok,\n err,\n isOk,\n isErr,\n unwrap,\n unwrapOr,\n map,\n mapErr,\n flatMap,\n tryCatch,\n tryCatchSync,\n all,\n match,\n} as const;\n\nexport default Result;\n\n","/**\n * Idempotency Utilities\n * @classytic/revenue\n *\n * Prevent duplicate operations with idempotency keys\n * Inspired by: Stripe, Amazon SQS deduplication\n */\n\nimport { nanoid } from 'nanoid';\nimport { Result, ok, err } from '../core/result.js';\n\n// ============ TYPES ============\n\nexport interface IdempotencyRecord<T = unknown> {\n /** Idempotency key */\n key: string;\n /** Operation result (if completed) */\n result?: T;\n /** Operation status */\n status: 'pending' | 'completed' | 'failed';\n /** Creation timestamp */\n createdAt: Date;\n /** Completion timestamp */\n completedAt?: Date;\n /** Request hash for validation */\n requestHash: string;\n /** TTL - when record expires */\n expiresAt: Date;\n}\n\nexport interface IdempotencyStore {\n /** Get record by key */\n get<T>(key: string): Promise<IdempotencyRecord<T> | null>;\n /** Set or update record */\n set<T>(key: string, record: IdempotencyRecord<T>): Promise<void>;\n /** Delete record */\n delete(key: string): Promise<void>;\n /** Check if key exists */\n exists(key: string): Promise<boolean>;\n}\n\nexport interface IdempotencyConfig {\n /** TTL in milliseconds (default: 24 hours) */\n ttl?: number;\n /** Custom store implementation */\n store?: IdempotencyStore;\n /** Key prefix */\n prefix?: string;\n}\n\n// ============ IN-MEMORY STORE ============\n\n/**\n * Simple in-memory idempotency store\n * Use Redis/database store in production\n */\nexport class MemoryIdempotencyStore implements IdempotencyStore {\n private records = new Map<string, IdempotencyRecord>();\n private cleanupInterval: NodeJS.Timeout | null = null;\n\n constructor(cleanupIntervalMs = 60000) {\n // Periodic cleanup of expired records\n this.cleanupInterval = setInterval(() => {\n this.cleanup();\n }, cleanupIntervalMs);\n }\n\n async get<T>(key: string): Promise<IdempotencyRecord<T> | null> {\n const record = this.records.get(key);\n if (!record) return null;\n \n // Check if expired\n if (record.expiresAt < new Date()) {\n this.records.delete(key);\n return null;\n }\n \n return record as IdempotencyRecord<T>;\n }\n\n async set<T>(key: string, record: IdempotencyRecord<T>): Promise<void> {\n this.records.set(key, record);\n }\n\n async delete(key: string): Promise<void> {\n this.records.delete(key);\n }\n\n async exists(key: string): Promise<boolean> {\n const record = await this.get(key);\n return record !== null;\n }\n\n private cleanup(): void {\n const now = new Date();\n for (const [key, record] of this.records) {\n if (record.expiresAt < now) {\n this.records.delete(key);\n }\n }\n }\n\n destroy(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = null;\n }\n this.records.clear();\n }\n}\n\n// ============ IDEMPOTENCY MANAGER ============\n\nexport class IdempotencyError extends Error {\n constructor(\n message: string,\n public readonly code: 'DUPLICATE_REQUEST' | 'REQUEST_IN_PROGRESS' | 'REQUEST_MISMATCH'\n ) {\n super(message);\n this.name = 'IdempotencyError';\n }\n}\n\n/**\n * Idempotency manager\n */\nexport class IdempotencyManager {\n private store: IdempotencyStore;\n private ttl: number;\n private prefix: string;\n\n constructor(config: IdempotencyConfig = {}) {\n this.store = config.store ?? new MemoryIdempotencyStore();\n this.ttl = config.ttl ?? 24 * 60 * 60 * 1000; // 24 hours\n this.prefix = config.prefix ?? 'idem:';\n }\n\n /**\n * Generate a unique idempotency key\n */\n generateKey(): string {\n return `${this.prefix}${nanoid(21)}`;\n }\n\n /**\n * Hash request parameters for validation\n */\n private hashRequest(params: unknown): string {\n // Simple JSON hash - in production, use a proper hash function\n const json = JSON.stringify(params, Object.keys(params as object).sort());\n let hash = 0;\n for (let i = 0; i < json.length; i++) {\n const char = json.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return hash.toString(36);\n }\n\n /**\n * Execute operation with idempotency protection\n */\n async execute<T>(\n key: string,\n params: unknown,\n operation: () => Promise<T>\n ): Promise<Result<T, IdempotencyError>> {\n const fullKey = key.startsWith(this.prefix) ? key : `${this.prefix}${key}`;\n const requestHash = this.hashRequest(params);\n\n // Check for existing record\n const existing = await this.store.get<T>(fullKey);\n\n if (existing) {\n // Validate request hash matches\n if (existing.requestHash !== requestHash) {\n return err(new IdempotencyError(\n 'Idempotency key used with different request parameters',\n 'REQUEST_MISMATCH'\n ));\n }\n\n // If already completed, return cached result\n if (existing.status === 'completed' && existing.result !== undefined) {\n return ok(existing.result);\n }\n\n // If in progress, reject\n if (existing.status === 'pending') {\n return err(new IdempotencyError(\n 'Request with this idempotency key is already in progress',\n 'REQUEST_IN_PROGRESS'\n ));\n }\n\n // If failed, allow retry\n if (existing.status === 'failed') {\n await this.store.delete(fullKey);\n }\n }\n\n // Create pending record\n const record: IdempotencyRecord<T> = {\n key: fullKey,\n status: 'pending',\n createdAt: new Date(),\n requestHash,\n expiresAt: new Date(Date.now() + this.ttl),\n };\n\n await this.store.set(fullKey, record);\n\n try {\n // Execute operation\n const result = await operation();\n\n // Update record with result\n record.status = 'completed';\n record.result = result;\n record.completedAt = new Date();\n await this.store.set(fullKey, record);\n\n return ok(result);\n } catch (error) {\n // Mark as failed\n record.status = 'failed';\n await this.store.set(fullKey, record);\n throw error;\n }\n }\n\n /**\n * Check if operation with key was already completed\n */\n async wasCompleted(key: string): Promise<boolean> {\n const fullKey = key.startsWith(this.prefix) ? key : `${this.prefix}${key}`;\n const record = await this.store.get(fullKey);\n return record?.status === 'completed';\n }\n\n /**\n * Get cached result for key\n */\n async getCached<T>(key: string): Promise<T | null> {\n const fullKey = key.startsWith(this.prefix) ? key : `${this.prefix}${key}`;\n const record = await this.store.get<T>(fullKey);\n return record?.status === 'completed' ? (record.result ?? null) : null;\n }\n\n /**\n * Invalidate a key (force re-execution on next call)\n */\n async invalidate(key: string): Promise<void> {\n const fullKey = key.startsWith(this.prefix) ? key : `${this.prefix}${key}`;\n await this.store.delete(fullKey);\n }\n}\n\n/**\n * Create idempotency manager\n */\nexport function createIdempotencyManager(\n config?: IdempotencyConfig\n): IdempotencyManager {\n return new IdempotencyManager(config);\n}\n\n/**\n * Decorator for idempotent operations\n * @example\n * class PaymentService {\n * @withIdempotency(manager, (p) => p.idempotencyKey)\n * async createPayment(params) { ... }\n * }\n */\nexport function withIdempotency(\n manager: IdempotencyManager,\n getKey: (params: unknown) => string | undefined\n) {\n return function(\n _target: unknown,\n _propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n const original = descriptor.value;\n\n descriptor.value = async function(this: unknown, params: unknown) {\n const key = getKey(params);\n \n if (!key) {\n // No idempotency key provided, execute normally\n return original.call(this, params);\n }\n\n const result = await manager.execute(key, params, () => \n original.call(this, params)\n );\n\n if (result.ok) {\n return result.value;\n }\n\n throw result.error;\n };\n\n return descriptor;\n };\n}\n\nexport default IdempotencyManager;\n\n","/**\n * Retry Utilities\n * @classytic/revenue\n *\n * Exponential backoff with jitter for resilient operations\n * Inspired by: AWS SDK retry, Netflix Hystrix, resilience4j\n */\n\nimport { Result, ok, err } from '../core/result.js';\n\n// ============ TYPES ============\n\nexport interface RetryConfig {\n /** Maximum number of retry attempts (default: 3) */\n maxAttempts: number;\n /** Base delay in milliseconds (default: 1000) */\n baseDelay: number;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelay: number;\n /** Backoff multiplier (default: 2) */\n backoffMultiplier: number;\n /** Jitter factor 0-1 (default: 0.1) */\n jitter: number;\n /** Which errors are retryable */\n retryIf?: (error: unknown) => boolean;\n /** Callback on each retry */\n onRetry?: (error: unknown, attempt: number, delay: number) => void;\n}\n\nexport interface RetryState {\n attempt: number;\n totalDelay: number;\n errors: Error[];\n}\n\n// ============ DEFAULT CONFIG ============\n\nconst DEFAULT_CONFIG: RetryConfig = {\n maxAttempts: 3,\n baseDelay: 1000,\n maxDelay: 30000,\n backoffMultiplier: 2,\n jitter: 0.1,\n retryIf: isRetryableError,\n};\n\n// ============ RETRY LOGIC ============\n\n/**\n * Calculate delay with exponential backoff and jitter\n */\nexport function calculateDelay(\n attempt: number,\n config: RetryConfig\n): number {\n // Exponential backoff: baseDelay * multiplier^attempt\n const exponentialDelay = config.baseDelay * Math.pow(config.backoffMultiplier, attempt);\n \n // Cap at maxDelay\n const cappedDelay = Math.min(exponentialDelay, config.maxDelay);\n \n // Add jitter (random variance)\n const jitterRange = cappedDelay * config.jitter;\n const jitter = Math.random() * jitterRange * 2 - jitterRange;\n \n return Math.round(Math.max(0, cappedDelay + jitter));\n}\n\n/**\n * Sleep for specified milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Check if error is retryable by default\n */\nexport function isRetryableError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n\n // Network errors\n if (error.message.includes('ECONNREFUSED')) return true;\n if (error.message.includes('ETIMEDOUT')) return true;\n if (error.message.includes('ENOTFOUND')) return true;\n if (error.message.includes('network')) return true;\n if (error.message.includes('timeout')) return true;\n\n // Rate limiting\n if (error.message.includes('429')) return true;\n if (error.message.includes('rate limit')) return true;\n\n // Server errors (5xx)\n if (error.message.includes('500')) return true;\n if (error.message.includes('502')) return true;\n if (error.message.includes('503')) return true;\n if (error.message.includes('504')) return true;\n\n // Check for retryable property\n if ('retryable' in error && (error as any).retryable === true) return true;\n\n return false;\n}\n\n/**\n * Execute operation with retry logic\n */\nexport async function retry<T>(\n operation: () => Promise<T>,\n config: Partial<RetryConfig> = {}\n): Promise<T> {\n const fullConfig: RetryConfig = { ...DEFAULT_CONFIG, ...config };\n const state: RetryState = {\n attempt: 0,\n totalDelay: 0,\n errors: [],\n };\n\n while (state.attempt < fullConfig.maxAttempts) {\n try {\n return await operation();\n } catch (error) {\n state.errors.push(error instanceof Error ? error : new Error(String(error)));\n state.attempt++;\n\n // Check if we should retry\n const shouldRetry = fullConfig.retryIf?.(error) ?? isRetryableError(error);\n \n if (!shouldRetry || state.attempt >= fullConfig.maxAttempts) {\n throw new RetryExhaustedError(\n `Operation failed after ${state.attempt} attempts`,\n state.errors\n );\n }\n\n // Calculate delay\n const delay = calculateDelay(state.attempt - 1, fullConfig);\n state.totalDelay += delay;\n\n // Callback\n fullConfig.onRetry?.(error, state.attempt, delay);\n\n // Wait before retry\n await sleep(delay);\n }\n }\n\n // Should never reach here, but TypeScript needs it\n throw new RetryExhaustedError(\n `Operation failed after ${state.attempt} attempts`,\n state.errors\n );\n}\n\n/**\n * Execute operation with retry, returning Result instead of throwing\n */\nexport async function retryWithResult<T>(\n operation: () => Promise<T>,\n config: Partial<RetryConfig> = {}\n): Promise<Result<T, RetryExhaustedError>> {\n try {\n const result = await retry(operation, config);\n return ok(result);\n } catch (error) {\n if (error instanceof RetryExhaustedError) {\n return err(error);\n }\n return err(new RetryExhaustedError('Operation failed', [\n error instanceof Error ? error : new Error(String(error))\n ]));\n }\n}\n\n// ============ ERROR CLASSES ============\n\n/**\n * Error thrown when all retries are exhausted\n */\nexport class RetryExhaustedError extends Error {\n public readonly attempts: number;\n public readonly errors: Error[];\n\n constructor(message: string, errors: Error[]) {\n super(message);\n this.name = 'RetryExhaustedError';\n this.attempts = errors.length;\n this.errors = errors;\n }\n\n /**\n * Get the last error\n */\n get lastError(): Error | undefined {\n return this.errors[this.errors.length - 1];\n }\n\n /**\n * Get the first error\n */\n get firstError(): Error | undefined {\n return this.errors[0];\n }\n}\n\n// ============ CIRCUIT BREAKER ============\n\nexport type CircuitState = 'closed' | 'open' | 'half-open';\n\nexport interface CircuitBreakerConfig {\n /** Number of failures before opening circuit */\n failureThreshold: number;\n /** Time in ms to wait before half-opening */\n resetTimeout: number;\n /** Number of successes in half-open to close circuit */\n successThreshold: number;\n /** Monitor window in ms */\n monitorWindow: number;\n}\n\nconst DEFAULT_CIRCUIT_CONFIG: CircuitBreakerConfig = {\n failureThreshold: 5,\n resetTimeout: 30000,\n successThreshold: 3,\n monitorWindow: 60000,\n};\n\n/**\n * Circuit breaker for preventing cascade failures\n * Inspired by: Netflix Hystrix, resilience4j\n */\nexport class CircuitBreaker {\n private state: CircuitState = 'closed';\n private failures: Date[] = [];\n private successes = 0;\n private lastFailure?: Date;\n private config: CircuitBreakerConfig;\n\n constructor(config: Partial<CircuitBreakerConfig> = {}) {\n this.config = { ...DEFAULT_CIRCUIT_CONFIG, ...config };\n }\n\n /**\n * Execute operation through circuit breaker\n */\n async execute<T>(operation: () => Promise<T>): Promise<T> {\n // Check circuit state\n if (this.state === 'open') {\n if (this.shouldAttemptReset()) {\n this.state = 'half-open';\n } else {\n throw new CircuitOpenError('Circuit is open, request rejected');\n }\n }\n\n try {\n const result = await operation();\n this.onSuccess();\n return result;\n } catch (error) {\n this.onFailure();\n throw error;\n }\n }\n\n /**\n * Execute with Result type\n */\n async executeWithResult<T>(\n operation: () => Promise<T>\n ): Promise<Result<T, CircuitOpenError | Error>> {\n try {\n const result = await this.execute(operation);\n return ok(result);\n } catch (error) {\n return err(error as Error);\n }\n }\n\n private onSuccess(): void {\n if (this.state === 'half-open') {\n this.successes++;\n if (this.successes >= this.config.successThreshold) {\n this.reset();\n }\n }\n // Clean old failures outside monitor window\n this.cleanOldFailures();\n }\n\n private onFailure(): void {\n this.failures.push(new Date());\n this.lastFailure = new Date();\n this.successes = 0;\n\n // Clean old failures\n this.cleanOldFailures();\n\n // Check if we should open circuit\n if (this.failures.length >= this.config.failureThreshold) {\n this.state = 'open';\n }\n }\n\n private shouldAttemptReset(): boolean {\n if (!this.lastFailure) return true;\n return Date.now() - this.lastFailure.getTime() >= this.config.resetTimeout;\n }\n\n private cleanOldFailures(): void {\n const cutoff = Date.now() - this.config.monitorWindow;\n this.failures = this.failures.filter(f => f.getTime() > cutoff);\n }\n\n private reset(): void {\n this.state = 'closed';\n this.failures = [];\n this.successes = 0;\n }\n\n /**\n * Get current circuit state\n */\n getState(): CircuitState {\n return this.state;\n }\n\n /**\n * Manually reset circuit\n */\n forceReset(): void {\n this.reset();\n }\n\n /**\n * Get circuit statistics\n */\n getStats(): {\n state: CircuitState;\n failures: number;\n successes: number;\n lastFailure?: Date;\n } {\n return {\n state: this.state,\n failures: this.failures.length,\n successes: this.successes,\n lastFailure: this.lastFailure,\n };\n }\n}\n\n/**\n * Error thrown when circuit is open\n */\nexport class CircuitOpenError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'CircuitOpenError';\n }\n}\n\n/**\n * Create a circuit breaker\n */\nexport function createCircuitBreaker(\n config?: Partial<CircuitBreakerConfig>\n): CircuitBreaker {\n return new CircuitBreaker(config);\n}\n\n// ============ COMBINED RETRY WITH CIRCUIT BREAKER ============\n\n/**\n * Execute with both retry and circuit breaker\n */\nexport async function resilientExecute<T>(\n operation: () => Promise<T>,\n options: {\n retry?: Partial<RetryConfig>;\n circuitBreaker?: CircuitBreaker;\n } = {}\n): Promise<T> {\n const { retry: retryConfig, circuitBreaker } = options;\n\n const wrappedOperation = async () => {\n if (circuitBreaker) {\n return circuitBreaker.execute(operation);\n }\n return operation();\n };\n\n if (retryConfig) {\n return retry(wrappedOperation, retryConfig);\n }\n\n return wrappedOperation();\n}\n\nexport default retry;\n\n","/**\n * Revenue Error Classes\n * @classytic/revenue\n *\n * Typed errors with codes for better error handling\n */\n\nexport interface RevenueErrorOptions {\n retryable?: boolean;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Base Revenue Error\n */\nexport class RevenueError extends Error {\n public readonly code: string;\n public readonly retryable: boolean;\n public readonly metadata: Record<string, unknown>;\n\n constructor(\n message: string,\n code: string,\n options: RevenueErrorOptions = {}\n ) {\n super(message);\n this.name = this.constructor.name;\n this.code = code;\n this.retryable = options.retryable ?? false;\n this.metadata = options.metadata ?? {};\n Error.captureStackTrace(this, this.constructor);\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n retryable: this.retryable,\n metadata: this.metadata,\n };\n }\n}\n\n/**\n * Configuration Errors\n */\nexport class ConfigurationError extends RevenueError {\n constructor(message: string, metadata: Record<string, unknown> = {}) {\n super(message, 'CONFIGURATION_ERROR', { retryable: false, metadata });\n }\n}\n\nexport class ModelNotRegisteredError extends ConfigurationError {\n constructor(modelName: string) {\n super(\n `Model \"${modelName}\" is not registered. Register it via createRevenue({ models: { ${modelName}: ... } })`,\n { modelName }\n );\n }\n}\n\n/**\n * Provider Errors\n */\nexport class ProviderError extends RevenueError {\n constructor(\n message: string,\n code: string,\n options: RevenueErrorOptions = {}\n ) {\n super(message, code, options);\n }\n}\n\nexport class ProviderNotFoundError extends ProviderError {\n constructor(providerName: string, availableProviders: string[] = []) {\n super(\n `Payment provider \"${providerName}\" not found. Available: ${availableProviders.join(', ')}`,\n 'PROVIDER_NOT_FOUND',\n { retryable: false, metadata: { providerName, availableProviders } }\n );\n }\n}\n\nexport class ProviderCapabilityError extends ProviderError {\n constructor(providerName: string, capability: string) {\n super(\n `Provider \"${providerName}\" does not support ${capability}`,\n 'PROVIDER_CAPABILITY_NOT_SUPPORTED',\n { retryable: false, metadata: { providerName, capability } }\n );\n }\n}\n\nexport class PaymentIntentCreationError extends ProviderError {\n constructor(providerName: string, originalError: Error) {\n super(\n `Failed to create payment intent with provider \"${providerName}\": ${originalError.message}`,\n 'PAYMENT_INTENT_CREATION_FAILED',\n { retryable: true, metadata: { providerName, originalError: originalError.message } }\n );\n }\n}\n\nexport class PaymentVerificationError extends ProviderError {\n constructor(paymentIntentId: string, reason: string) {\n super(\n `Payment verification failed for intent \"${paymentIntentId}\": ${reason}`,\n 'PAYMENT_VERIFICATION_FAILED',\n { retryable: true, metadata: { paymentIntentId, reason } }\n );\n }\n}\n\n/**\n * Resource Not Found Errors\n */\nexport class NotFoundError extends RevenueError {\n constructor(\n message: string,\n code: string,\n metadata: Record<string, unknown> = {}\n ) {\n super(message, code, { retryable: false, metadata });\n }\n}\n\nexport class SubscriptionNotFoundError extends NotFoundError {\n constructor(subscriptionId: string) {\n super(\n `Subscription not found: ${subscriptionId}`,\n 'SUBSCRIPTION_NOT_FOUND',\n { subscriptionId }\n );\n }\n}\n\nexport class TransactionNotFoundError extends NotFoundError {\n constructor(transactionId: string) {\n super(\n `Transaction not found: ${transactionId}`,\n 'TRANSACTION_NOT_FOUND',\n { transactionId }\n );\n }\n}\n\n/**\n * Validation Errors\n */\nexport class ValidationError extends RevenueError {\n constructor(message: string, metadata: Record<string, unknown> = {}) {\n super(message, 'VALIDATION_ERROR', { retryable: false, metadata });\n }\n}\n\nexport class InvalidAmountError extends ValidationError {\n constructor(amount: number, message?: string) {\n super(\n message ?? `Invalid amount: ${amount}. Amount must be non-negative`,\n { amount }\n );\n }\n}\n\nexport class MissingRequiredFieldError extends ValidationError {\n constructor(fieldName: string) {\n super(`Missing required field: ${fieldName}`, { fieldName });\n }\n}\n\n/**\n * State Errors\n */\nexport class StateError extends RevenueError {\n constructor(\n message: string,\n code: string,\n metadata: Record<string, unknown> = {}\n ) {\n super(message, code, { retryable: false, metadata });\n }\n}\n\nexport class AlreadyVerifiedError extends StateError {\n constructor(transactionId: string) {\n super(\n `Transaction ${transactionId} is already verified`,\n 'ALREADY_VERIFIED',\n { transactionId }\n );\n }\n}\n\nexport class InvalidStateTransitionError extends StateError {\n constructor(\n resourceType: string,\n resourceId: string,\n fromState: string,\n toState: string\n ) {\n super(\n `Invalid state transition for ${resourceType} ${resourceId}: ${fromState} → ${toState}`,\n 'INVALID_STATE_TRANSITION',\n { resourceType, resourceId, fromState, toState }\n );\n }\n}\n\nexport class SubscriptionNotActiveError extends StateError {\n constructor(subscriptionId: string, message?: string) {\n super(\n message ?? `Subscription ${subscriptionId} is not active`,\n 'SUBSCRIPTION_NOT_ACTIVE',\n { subscriptionId }\n );\n }\n}\n\n/**\n * Operation Errors\n */\nexport class OperationError extends RevenueError {\n constructor(\n message: string,\n code: string,\n options: RevenueErrorOptions = {}\n ) {\n super(message, code, options);\n }\n}\n\nexport class RefundNotSupportedError extends OperationError {\n constructor(providerName: string) {\n super(\n `Refunds are not supported by provider \"${providerName}\"`,\n 'REFUND_NOT_SUPPORTED',\n { retryable: false, metadata: { providerName } }\n );\n }\n}\n\nexport class RefundError extends OperationError {\n constructor(transactionId: string, reason: string) {\n super(\n `Refund failed for transaction ${transactionId}: ${reason}`,\n 'REFUND_FAILED',\n { retryable: true, metadata: { transactionId, reason } }\n );\n }\n}\n\n/**\n * Error Code Constants\n */\nexport const ERROR_CODES = {\n // Configuration\n CONFIGURATION_ERROR: 'CONFIGURATION_ERROR',\n MODEL_NOT_REGISTERED: 'MODEL_NOT_REGISTERED',\n\n // Provider\n PROVIDER_NOT_FOUND: 'PROVIDER_NOT_FOUND',\n PROVIDER_CAPABILITY_NOT_SUPPORTED: 'PROVIDER_CAPABILITY_NOT_SUPPORTED',\n PAYMENT_INTENT_CREATION_FAILED: 'PAYMENT_INTENT_CREATION_FAILED',\n PAYMENT_VERIFICATION_FAILED: 'PAYMENT_VERIFICATION_FAILED',\n\n // Not Found\n SUBSCRIPTION_NOT_FOUND: 'SUBSCRIPTION_NOT_FOUND',\n TRANSACTION_NOT_FOUND: 'TRANSACTION_NOT_FOUND',\n\n // Validation\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n INVALID_AMOUNT: 'INVALID_AMOUNT',\n MISSING_REQUIRED_FIELD: 'MISSING_REQUIRED_FIELD',\n\n // State\n ALREADY_VERIFIED: 'ALREADY_VERIFIED',\n INVALID_STATE_TRANSITION: 'INVALID_STATE_TRANSITION',\n SUBSCRIPTION_NOT_ACTIVE: 'SUBSCRIPTION_NOT_ACTIVE',\n\n // Operations\n REFUND_NOT_SUPPORTED: 'REFUND_NOT_SUPPORTED',\n REFUND_FAILED: 'REFUND_FAILED',\n} as const;\n\nexport type ErrorCode = typeof ERROR_CODES[keyof typeof ERROR_CODES];\n\n/**\n * Check if error is retryable\n */\nexport function isRetryable(error: unknown): boolean {\n return error instanceof RevenueError && error.retryable;\n}\n\n/**\n * Check if error is from revenue package\n */\nexport function isRevenueError(error: unknown): error is RevenueError {\n return error instanceof RevenueError;\n}\n\n","/**\n * Hook Utilities\n * @classytic/revenue\n *\n * Fire-and-forget hook execution - never blocks main flow\n */\n\nimport type { Logger, HooksRegistry } from '../types/index.js';\n\n/**\n * Trigger hooks asynchronously without waiting\n * Errors are logged but never thrown\n *\n * @param hooks - Hooks object\n * @param event - Event name\n * @param data - Event data\n * @param logger - Logger instance\n */\nexport function triggerHook(\n hooks: HooksRegistry,\n event: string,\n data: unknown,\n logger: Logger\n): void {\n const handlers = hooks[event] ?? [];\n\n if (handlers.length === 0) {\n return; // No handlers, return immediately\n }\n\n // Fire-and-forget: Don't await, don't block\n Promise.all(\n handlers.map((handler) =>\n Promise.resolve(handler(data)).catch((error: Error) => {\n logger.error(`Hook \"${event}\" failed:`, {\n error: error.message,\n stack: error.stack,\n event,\n // Don't log full data (could be huge)\n dataKeys: Object.keys(data as object),\n });\n })\n )\n ).catch(() => {\n // Swallow any Promise.all errors (already logged individually)\n });\n\n // Return immediately - hooks run in background\n}\n\nexport default triggerHook;\n\n","/**\n * Transaction Enums\n * @classytic/revenue\n *\n * Library-managed transaction enums only.\n * Users should define their own categories and merge with these.\n */\n\n// ============ TRANSACTION TYPE ============\n/**\n * Transaction Type - Income vs Expense\n *\n * INCOME: Money coming in (payments, subscriptions, purchases)\n * EXPENSE: Money going out (refunds, payouts)\n *\n * Users can map these in their config via transactionTypeMapping\n */\nexport const TRANSACTION_TYPE = {\n INCOME: 'income',\n EXPENSE: 'expense',\n} as const;\n\nexport type TransactionType = typeof TRANSACTION_TYPE;\nexport type TransactionTypeValue = TransactionType[keyof TransactionType];\nexport const TRANSACTION_TYPE_VALUES = Object.values(TRANSACTION_TYPE);\n\n// ============ TRANSACTION STATUS ============\n/**\n * Transaction Status - Library-managed states\n */\nexport const TRANSACTION_STATUS = {\n PENDING: 'pending',\n PAYMENT_INITIATED: 'payment_initiated',\n PROCESSING: 'processing',\n REQUIRES_ACTION: 'requires_action',\n VERIFIED: 'verified',\n COMPLETED: 'completed',\n FAILED: 'failed',\n CANCELLED: 'cancelled',\n EXPIRED: 'expired',\n REFUNDED: 'refunded',\n PARTIALLY_REFUNDED: 'partially_refunded',\n} as const;\n\nexport type TransactionStatus = typeof TRANSACTION_STATUS;\nexport type TransactionStatusValue = TransactionStatus[keyof TransactionStatus];\nexport const TRANSACTION_STATUS_VALUES = Object.values(TRANSACTION_STATUS);\n\n// ============ LIBRARY CATEGORIES ============\n/**\n * Categories managed by this library\n *\n * SUBSCRIPTION: Recurring subscription payments\n * PURCHASE: One-time purchases\n *\n * Users should spread these into their own category enums:\n *\n * @example\n * import { LIBRARY_CATEGORIES } from '@classytic/revenue';\n *\n * export const MY_CATEGORIES = {\n * ...LIBRARY_CATEGORIES,\n * SALARY: 'salary',\n * RENT: 'rent',\n * EQUIPMENT: 'equipment',\n * } as const;\n */\nexport const LIBRARY_CATEGORIES = {\n SUBSCRIPTION: 'subscription',\n PURCHASE: 'purchase',\n} as const;\n\nexport type LibraryCategories = typeof LIBRARY_CATEGORIES;\nexport type LibraryCategoryValue = LibraryCategories[keyof LibraryCategories];\nexport const LIBRARY_CATEGORY_VALUES = Object.values(LIBRARY_CATEGORIES);\n\n","/**\n * Category Resolver Utility\n * @classytic/revenue\n *\n * Resolves transaction category based on referenceModel and categoryMappings\n */\n\nimport { LIBRARY_CATEGORIES } from '../enums/transaction.enums.js';\nimport type { MonetizationTypeValue } from '../types/index.js';\n\n/**\n * Resolve category for a transaction based on entity and monetizationType\n *\n * Resolution Logic:\n * 1. If categoryMappings[entity] exists → use it\n * 2. Otherwise → fall back to default library category\n *\n * @param entity - The logical entity/identifier (e.g., 'Order', 'PlatformSubscription', 'Membership')\n * NOTE: This is NOT a database model name - it's just a logical identifier\n * @param monetizationType - The monetization type ('subscription', 'purchase', 'free')\n * @param categoryMappings - User-defined category mappings from config\n * @returns Category name for the transaction\n *\n * @example\n * // With mapping defined\n * resolveCategory('Order', 'subscription', { Order: 'order_subscription' })\n * // Returns: 'order_subscription'\n *\n * @example\n * // Without mapping, falls back to library default\n * resolveCategory('Order', 'subscription', {})\n * // Returns: 'subscription'\n *\n * @example\n * // Different entities with different mappings\n * const mappings = {\n * Order: 'order_subscription',\n * PlatformSubscription: 'platform_subscription',\n * TenantUpgrade: 'tenant_upgrade',\n * Membership: 'gym_membership',\n * Enrollment: 'course_enrollment',\n * };\n * resolveCategory('PlatformSubscription', 'subscription', mappings)\n * // Returns: 'platform_subscription'\n */\nexport function resolveCategory(\n entity: string | null | undefined,\n monetizationType: MonetizationTypeValue,\n categoryMappings: Record<string, string> = {}\n): string {\n // If user has defined a custom mapping for this entity, use it\n if (entity && categoryMappings[entity]) {\n return categoryMappings[entity];\n }\n\n // Otherwise, fall back to library default based on monetization type\n switch (monetizationType) {\n case 'subscription':\n return LIBRARY_CATEGORIES.SUBSCRIPTION; // 'subscription'\n case 'purchase':\n return LIBRARY_CATEGORIES.PURCHASE; // 'purchase'\n default:\n return LIBRARY_CATEGORIES.SUBSCRIPTION; // Default to subscription\n }\n}\n\n/**\n * Validate that a category is defined in user's Transaction model enum\n * This is informational - actual validation happens at Mongoose schema level\n *\n * @param category - Category to validate\n * @param allowedCategories - List of allowed categories\n * @returns Whether category is valid\n */\nexport function isCategoryValid(\n category: string,\n allowedCategories: string[] = []\n): boolean {\n return allowedCategories.includes(category);\n}\n\nexport default resolveCategory;\n\n","/**\n * Commission Calculation Utility\n * @classytic/revenue\n *\n * Handles platform commission calculation with gateway fee deduction\n */\n\nimport type { CommissionInfo } from '../types/index.js';\n\n/**\n * Build commission object for transaction\n *\n * @param amount - Transaction amount\n * @param commissionRate - Commission rate (0 to 1, e.g., 0.10 for 10%)\n * @param gatewayFeeRate - Gateway fee rate (0 to 1, e.g., 0.018 for 1.8%)\n * @returns Commission object or null\n */\nexport function calculateCommission(\n amount: number,\n commissionRate: number,\n gatewayFeeRate: number = 0\n): CommissionInfo | null {\n // No commission if rate is 0 or negative\n if (!commissionRate || commissionRate <= 0) {\n return null;\n }\n\n // Validate inputs\n if (amount < 0) {\n throw new Error('Transaction amount cannot be negative');\n }\n\n if (commissionRate < 0 || commissionRate > 1) {\n throw new Error('Commission rate must be between 0 and 1');\n }\n\n if (gatewayFeeRate < 0 || gatewayFeeRate > 1) {\n throw new Error('Gateway fee rate must be between 0 and 1');\n }\n\n // Calculate commission\n const grossAmount = Math.round(amount * commissionRate * 100) / 100; // Round to 2 decimals\n const gatewayFeeAmount = Math.round(amount * gatewayFeeRate * 100) / 100;\n const netAmount = Math.max(0, Math.round((grossAmount - gatewayFeeAmount) * 100) / 100);\n\n return {\n rate: commissionRate,\n grossAmount,\n gatewayFeeRate,\n gatewayFeeAmount,\n netAmount,\n status: 'pending',\n };\n}\n\n/**\n * Reverse commission on refund (proportional)\n *\n * @param originalCommission - Original commission object\n * @param originalAmount - Original transaction amount\n * @param refundAmount - Amount being refunded\n * @returns Reversed commission or null\n */\nexport function reverseCommission(\n originalCommission: CommissionInfo | null | undefined,\n originalAmount: number,\n refundAmount: number\n): CommissionInfo | null {\n if (!originalCommission?.netAmount) {\n return null;\n }\n\n // Calculate proportional refund\n const refundRatio = refundAmount / originalAmount;\n const reversedNetAmount = Math.round(originalCommission.netAmount * refundRatio * 100) / 100;\n const reversedGrossAmount = Math.round(originalCommission.grossAmount * refundRatio * 100) / 100;\n const reversedGatewayFee = Math.round(originalCommission.gatewayFeeAmount * refundRatio * 100) / 100;\n\n return {\n rate: originalCommission.rate,\n grossAmount: reversedGrossAmount,\n gatewayFeeRate: originalCommission.gatewayFeeRate,\n gatewayFeeAmount: reversedGatewayFee,\n netAmount: reversedNetAmount,\n status: 'waived', // Commission waived due to refund\n };\n}\n\nexport default {\n calculateCommission,\n reverseCommission,\n};\n\n","/**\n * Monetization Enums\n * @classytic/revenue\n *\n * General monetization enums and constants\n */\n\n// ============ MONETIZATION TYPES ============\nexport const MONETIZATION_TYPES = {\n FREE: 'free',\n PURCHASE: 'purchase',\n SUBSCRIPTION: 'subscription',\n} as const;\n\nexport type MonetizationTypes = typeof MONETIZATION_TYPES;\nexport type MonetizationTypeValue = MonetizationTypes[keyof MonetizationTypes];\nexport const MONETIZATION_TYPE_VALUES = Object.values(MONETIZATION_TYPES);\n\n","/**\n * Monetization Service\n * @classytic/revenue\n *\n * Framework-agnostic monetization management service with DI\n * Handles purchases, subscriptions, and free items using provider system\n */\n\nimport { nanoid } from 'nanoid';\nimport {\n MissingRequiredFieldError,\n InvalidAmountError,\n ProviderNotFoundError,\n SubscriptionNotFoundError,\n ModelNotRegisteredError,\n SubscriptionNotActiveError,\n PaymentIntentCreationError,\n InvalidStateTransitionError,\n} from '../core/errors.js';\nimport { triggerHook } from '../utils/hooks.js';\nimport { resolveCategory } from '../utils/category-resolver.js';\nimport { calculateCommission } from '../utils/commission.js';\nimport { MONETIZATION_TYPES } from '../enums/monetization.enums.js';\nimport { TRANSACTION_TYPE } from '../enums/transaction.enums.js';\nimport type { Container } from '../core/container.js';\nimport type {\n ModelsRegistry,\n ProvidersRegistry,\n HooksRegistry,\n RevenueConfig,\n Logger,\n MonetizationCreateParams,\n MonetizationCreateResult,\n ActivateOptions,\n RenewalParams,\n CancelOptions,\n PauseOptions,\n ResumeOptions,\n ListOptions,\n SubscriptionDocument,\n TransactionDocument,\n PaymentIntentData,\n TransactionTypeValue,\n} from '../types/index.js';\n\n/**\n * Monetization Service\n * Uses DI container for all dependencies\n */\nexport class MonetizationService {\n private readonly models: ModelsRegistry;\n private readonly providers: ProvidersRegistry;\n private readonly config: RevenueConfig;\n private readonly hooks: HooksRegistry;\n private readonly logger: Logger;\n\n constructor(container: Container) {\n this.models = container.get<ModelsRegistry>('models');\n this.providers = container.get<ProvidersRegistry>('providers');\n this.config = container.get<RevenueConfig>('config');\n this.hooks = container.get<HooksRegistry>('hooks');\n this.logger = container.get<Logger>('logger');\n }\n\n /**\n * Create a new monetization (purchase, subscription, or free item)\n *\n * @param params - Monetization parameters\n *\n * @example\n * // One-time purchase\n * await revenue.monetization.create({\n * data: {\n * organizationId: '...',\n * customerId: '...',\n * referenceId: order._id,\n * referenceModel: 'Order',\n * },\n * planKey: 'one_time',\n * monetizationType: 'purchase',\n * gateway: 'bkash',\n * amount: 1500,\n * });\n *\n * // Recurring subscription\n * await revenue.monetization.create({\n * data: {\n * organizationId: '...',\n * customerId: '...',\n * referenceId: subscription._id,\n * referenceModel: 'Subscription',\n * },\n * planKey: 'monthly',\n * monetizationType: 'subscription',\n * gateway: 'stripe',\n * amount: 2000,\n * });\n *\n * @returns Result with subscription, transaction, and paymentIntent\n */\n async create(params: MonetizationCreateParams): Promise<MonetizationCreateResult> {\n const {\n data,\n planKey,\n amount,\n currency = 'BDT',\n gateway = 'manual',\n entity = null,\n monetizationType = MONETIZATION_TYPES.SUBSCRIPTION,\n paymentData,\n metadata = {},\n idempotencyKey = null,\n } = params;\n\n // Validate required fields\n // Note: organizationId is OPTIONAL (only needed for multi-tenant)\n\n if (!planKey) {\n throw new MissingRequiredFieldError('planKey');\n }\n\n if (amount < 0) {\n throw new InvalidAmountError(amount);\n }\n\n const isFree = amount === 0;\n\n // Get provider\n const provider = this.providers[gateway];\n if (!provider) {\n throw new ProviderNotFoundError(gateway, Object.keys(this.providers));\n }\n\n // Create payment intent if not free\n let paymentIntent: PaymentIntentData | null = null;\n let transaction: TransactionDocument | null = null;\n\n if (!isFree) {\n // Create payment intent via provider\n try {\n paymentIntent = await provider.createIntent({\n amount,\n currency,\n metadata: {\n ...metadata,\n type: 'subscription',\n planKey,\n },\n });\n } catch (error) {\n throw new PaymentIntentCreationError(gateway, error as Error);\n }\n\n // Resolve category based on entity and monetizationType\n const category = resolveCategory(entity, monetizationType, this.config.categoryMappings);\n\n // Resolve transaction type using config mapping or default to 'income'\n const transactionType: TransactionTypeValue = \n this.config.transactionTypeMapping?.subscription ??\n this.config.transactionTypeMapping?.[monetizationType] ??\n TRANSACTION_TYPE.INCOME;\n\n // Calculate commission if configured\n const commissionRate = this.config.commissionRates?.[category] ?? 0;\n const gatewayFeeRate = this.config.gatewayFeeRates?.[gateway] ?? 0;\n const commission = calculateCommission(amount, commissionRate, gatewayFeeRate);\n\n // Create transaction record\n const TransactionModel = this.models.Transaction;\n transaction = await TransactionModel.create({\n organizationId: data.organizationId,\n customerId: data.customerId ?? null,\n amount,\n currency,\n category,\n type: transactionType,\n method: ((paymentData as Record<string, unknown>)?.method as string) ?? 'manual',\n status: paymentIntent.status === 'succeeded' ? 'verified' : 'pending',\n gateway: {\n type: gateway,\n sessionId: paymentIntent.sessionId,\n paymentIntentId: paymentIntent.paymentIntentId,\n provider: paymentIntent.provider,\n metadata: paymentIntent.metadata,\n },\n paymentDetails: {\n provider: gateway,\n ...paymentData,\n },\n ...(commission && { commission }), // Only include if commission exists\n // Polymorphic reference (top-level, not metadata)\n ...(data.referenceId && { referenceId: data.referenceId }),\n ...(data.referenceModel && { referenceModel: data.referenceModel }),\n metadata: {\n ...metadata,\n planKey,\n entity,\n monetizationType,\n paymentIntentId: paymentIntent.id,\n },\n idempotencyKey: idempotencyKey ?? `sub_${nanoid(16)}`,\n }) as TransactionDocument;\n }\n\n // Create subscription record (if Subscription model exists)\n let subscription: SubscriptionDocument | null = null;\n if (this.models.Subscription) {\n const SubscriptionModel = this.models.Subscription;\n\n // Create subscription with proper reference tracking\n const subscriptionData = {\n organizationId: data.organizationId,\n customerId: data.customerId ?? null,\n planKey,\n amount,\n currency,\n status: isFree ? 'active' : 'pending',\n isActive: isFree,\n gateway,\n transactionId: transaction?._id ?? null,\n paymentIntentId: paymentIntent?.id ?? null,\n metadata: {\n ...metadata,\n isFree,\n entity,\n monetizationType,\n },\n ...data,\n } as Record<string, unknown>;\n\n // Remove referenceId/referenceModel from subscription (they're for transactions)\n delete subscriptionData.referenceId;\n delete subscriptionData.referenceModel;\n\n subscription = await SubscriptionModel.create(subscriptionData) as SubscriptionDocument;\n }\n\n // Trigger hooks - emit specific event based on monetization type\n const eventData = {\n subscription,\n transaction,\n paymentIntent,\n isFree,\n monetizationType,\n };\n\n // Emit specific monetization event\n if (monetizationType === MONETIZATION_TYPES.PURCHASE) {\n this._triggerHook('purchase.created', eventData);\n } else if (monetizationType === MONETIZATION_TYPES.SUBSCRIPTION) {\n this._triggerHook('subscription.created', eventData);\n } else if (monetizationType === MONETIZATION_TYPES.FREE) {\n this._triggerHook('free.created', eventData);\n }\n\n // Also emit generic event for backward compatibility\n this._triggerHook('monetization.created', eventData);\n\n return {\n subscription,\n transaction,\n paymentIntent,\n };\n }\n\n /**\n * Activate subscription after payment verification\n *\n * @param subscriptionId - Subscription ID or transaction ID\n * @param options - Activation options\n * @returns Updated subscription\n */\n async activate(\n subscriptionId: string,\n options: ActivateOptions = {}\n ): Promise<SubscriptionDocument> {\n const { timestamp = new Date() } = options;\n\n if (!this.models.Subscription) {\n throw new ModelNotRegisteredError('Subscription');\n }\n\n const SubscriptionModel = this.models.Subscription;\n const subscription = await SubscriptionModel.findById(subscriptionId) as SubscriptionDocument | null;\n\n if (!subscription) {\n throw new SubscriptionNotFoundError(subscriptionId);\n }\n\n if (subscription.isActive) {\n this.logger.warn('Subscription already active', { subscriptionId });\n return subscription;\n }\n\n // Calculate period dates based on plan\n const periodEnd = this._calculatePeriodEnd(subscription.planKey, timestamp);\n\n // Update subscription\n subscription.isActive = true;\n subscription.status = 'active';\n subscription.startDate = timestamp;\n subscription.endDate = periodEnd;\n subscription.activatedAt = timestamp;\n\n await subscription.save();\n\n // Trigger hook\n this._triggerHook('subscription.activated', {\n subscription,\n activatedAt: timestamp,\n });\n\n return subscription;\n }\n\n /**\n * Renew subscription\n *\n * @param subscriptionId - Subscription ID\n * @param params - Renewal parameters\n * @returns { subscription, transaction, paymentIntent }\n */\n async renew(\n subscriptionId: string,\n params: RenewalParams = {}\n ): Promise<MonetizationCreateResult> {\n const {\n gateway = 'manual',\n entity = null,\n paymentData,\n metadata = {},\n idempotencyKey = null,\n } = params;\n\n if (!this.models.Subscription) {\n throw new ModelNotRegisteredError('Subscription');\n }\n\n const SubscriptionModel = this.models.Subscription;\n const subscription = await SubscriptionModel.findById(subscriptionId) as SubscriptionDocument | null;\n\n if (!subscription) {\n throw new SubscriptionNotFoundError(subscriptionId);\n }\n\n if (subscription.amount === 0) {\n throw new InvalidAmountError(0, 'Free subscriptions do not require renewal');\n }\n\n // Get provider\n const provider = this.providers[gateway];\n if (!provider) {\n throw new ProviderNotFoundError(gateway, Object.keys(this.providers));\n }\n\n // Create payment intent\n let paymentIntent: PaymentIntentData | null = null;\n try {\n paymentIntent = await provider.createIntent({\n amount: subscription.amount,\n currency: subscription.currency ?? 'BDT',\n metadata: {\n ...metadata,\n type: 'subscription_renewal',\n subscriptionId: subscription._id.toString(),\n },\n });\n } catch (error) {\n this.logger.error('Failed to create payment intent for renewal:', error);\n throw new PaymentIntentCreationError(gateway, error as Error);\n }\n\n // Resolve category - use provided entity or inherit from subscription metadata\n const effectiveEntity = entity ?? (subscription.metadata as Record<string, unknown>)?.entity as string | null;\n const effectiveMonetizationType = \n ((subscription.metadata as Record<string, unknown>)?.monetizationType as string) ?? MONETIZATION_TYPES.SUBSCRIPTION;\n const category = resolveCategory(effectiveEntity, effectiveMonetizationType as 'subscription' | 'purchase' | 'free', this.config.categoryMappings);\n\n // Resolve transaction type using config mapping or default to 'income'\n const transactionType: TransactionTypeValue = \n this.config.transactionTypeMapping?.subscription_renewal ??\n this.config.transactionTypeMapping?.subscription ??\n this.config.transactionTypeMapping?.[effectiveMonetizationType] ??\n TRANSACTION_TYPE.INCOME;\n\n // Calculate commission if configured\n const commissionRate = this.config.commissionRates?.[category] ?? 0;\n const gatewayFeeRate = this.config.gatewayFeeRates?.[gateway] ?? 0;\n const commission = calculateCommission(subscription.amount, commissionRate, gatewayFeeRate);\n\n // Create transaction\n const TransactionModel = this.models.Transaction;\n const transaction = await TransactionModel.create({\n organizationId: subscription.organizationId,\n customerId: subscription.customerId,\n amount: subscription.amount,\n currency: subscription.currency ?? 'BDT',\n category,\n type: transactionType,\n method: ((paymentData as Record<string, unknown>)?.method as string) ?? 'manual',\n status: paymentIntent.status === 'succeeded' ? 'verified' : 'pending',\n gateway: {\n type: gateway,\n sessionId: paymentIntent.sessionId,\n paymentIntentId: paymentIntent.paymentIntentId,\n provider: paymentIntent.provider,\n metadata: paymentIntent.metadata,\n },\n paymentDetails: {\n provider: gateway,\n ...paymentData,\n },\n ...(commission && { commission }), // Only include if commission exists\n // Polymorphic reference to subscription\n referenceId: subscription._id,\n referenceModel: 'Subscription',\n metadata: {\n ...metadata,\n subscriptionId: subscription._id.toString(), // Keep for backward compat\n entity: effectiveEntity,\n monetizationType: effectiveMonetizationType,\n isRenewal: true,\n paymentIntentId: paymentIntent.id,\n },\n idempotencyKey: idempotencyKey ?? `renewal_${nanoid(16)}`,\n }) as TransactionDocument;\n\n // Update subscription\n subscription.status = 'pending_renewal' as SubscriptionDocument['status'];\n subscription.renewalTransactionId = transaction._id;\n subscription.renewalCount = (subscription.renewalCount ?? 0) + 1;\n await subscription.save();\n\n // Trigger hook\n this._triggerHook('subscription.renewed', {\n subscription,\n transaction,\n paymentIntent,\n renewalCount: subscription.renewalCount,\n });\n\n return {\n subscription,\n transaction,\n paymentIntent,\n };\n }\n\n /**\n * Cancel subscription\n *\n * @param subscriptionId - Subscription ID\n * @param options - Cancellation options\n * @returns Updated subscription\n */\n async cancel(\n subscriptionId: string,\n options: CancelOptions = {}\n ): Promise<SubscriptionDocument> {\n const { immediate = false, reason = null } = options;\n\n if (!this.models.Subscription) {\n throw new ModelNotRegisteredError('Subscription');\n }\n\n const SubscriptionModel = this.models.Subscription;\n const subscription = await SubscriptionModel.findById(subscriptionId) as SubscriptionDocument | null;\n\n if (!subscription) {\n throw new SubscriptionNotFoundError(subscriptionId);\n }\n\n const now = new Date();\n\n if (immediate) {\n subscription.isActive = false;\n subscription.status = 'cancelled';\n subscription.canceledAt = now;\n subscription.cancellationReason = reason;\n } else {\n // Schedule cancellation at period end\n subscription.cancelAt = subscription.endDate ?? now;\n subscription.cancellationReason = reason;\n }\n\n await subscription.save();\n\n // Trigger hook\n this._triggerHook('subscription.cancelled', {\n subscription,\n immediate,\n reason,\n canceledAt: immediate ? now : subscription.cancelAt,\n });\n\n return subscription;\n }\n\n /**\n * Pause subscription\n *\n * @param subscriptionId - Subscription ID\n * @param options - Pause options\n * @returns Updated subscription\n */\n async pause(\n subscriptionId: string,\n options: PauseOptions = {}\n ): Promise<SubscriptionDocument> {\n const { reason = null } = options;\n\n if (!this.models.Subscription) {\n throw new ModelNotRegisteredError('Subscription');\n }\n\n const SubscriptionModel = this.models.Subscription;\n const subscription = await SubscriptionModel.findById(subscriptionId) as SubscriptionDocument | null;\n\n if (!subscription) {\n throw new SubscriptionNotFoundError(subscriptionId);\n }\n\n if (!subscription.isActive) {\n throw new SubscriptionNotActiveError(subscriptionId, 'Only active subscriptions can be paused');\n }\n\n const pausedAt = new Date();\n subscription.isActive = false;\n subscription.status = 'paused';\n subscription.pausedAt = pausedAt;\n subscription.pauseReason = reason;\n\n await subscription.save();\n\n // Trigger hook\n this._triggerHook('subscription.paused', {\n subscription,\n reason,\n pausedAt,\n });\n\n return subscription;\n }\n\n /**\n * Resume subscription\n *\n * @param subscriptionId - Subscription ID\n * @param options - Resume options\n * @returns Updated subscription\n */\n async resume(\n subscriptionId: string,\n options: ResumeOptions = {}\n ): Promise<SubscriptionDocument> {\n const { extendPeriod = false } = options;\n\n if (!this.models.Subscription) {\n throw new ModelNotRegisteredError('Subscription');\n }\n\n const SubscriptionModel = this.models.Subscription;\n const subscription = await SubscriptionModel.findById(subscriptionId) as SubscriptionDocument | null;\n\n if (!subscription) {\n throw new SubscriptionNotFoundError(subscriptionId);\n }\n\n if (!subscription.pausedAt) {\n throw new InvalidStateTransitionError(\n 'resume',\n 'paused',\n subscription.status,\n 'Only paused subscriptions can be resumed'\n );\n }\n\n const now = new Date();\n const pausedAt = new Date(subscription.pausedAt);\n const pauseDuration = now.getTime() - pausedAt.getTime();\n\n subscription.isActive = true;\n subscription.status = 'active';\n subscription.pausedAt = null;\n subscription.pauseReason = null;\n\n // Optionally extend period by pause duration\n if (extendPeriod && subscription.endDate) {\n const currentEnd = new Date(subscription.endDate);\n subscription.endDate = new Date(currentEnd.getTime() + pauseDuration);\n }\n\n await subscription.save();\n\n // Trigger hook\n this._triggerHook('subscription.resumed', {\n subscription,\n extendPeriod,\n pauseDuration,\n resumedAt: now,\n });\n\n return subscription;\n }\n\n /**\n * List subscriptions with filters\n *\n * @param filters - Query filters\n * @param options - Query options (limit, skip, sort)\n * @returns Subscriptions\n */\n async list(\n filters: Record<string, unknown> = {},\n options: ListOptions = {}\n ): Promise<SubscriptionDocument[]> {\n if (!this.models.Subscription) {\n throw new ModelNotRegisteredError('Subscription');\n }\n\n const SubscriptionModel = this.models.Subscription;\n const { limit = 50, skip = 0, sort = { createdAt: -1 } } = options;\n\n const subscriptions = await (SubscriptionModel as unknown as {\n find(filter: object): { limit(n: number): { skip(n: number): { sort(s: object): Promise<SubscriptionDocument[]> } } };\n })\n .find(filters)\n .limit(limit)\n .skip(skip)\n .sort(sort);\n\n return subscriptions;\n }\n\n /**\n * Get subscription by ID\n *\n * @param subscriptionId - Subscription ID\n * @returns Subscription\n */\n async get(subscriptionId: string): Promise<SubscriptionDocument> {\n if (!this.models.Subscription) {\n throw new ModelNotRegisteredError('Subscription');\n }\n\n const SubscriptionModel = this.models.Subscription;\n const subscription = await SubscriptionModel.findById(subscriptionId) as SubscriptionDocument | null;\n\n if (!subscription) {\n throw new SubscriptionNotFoundError(subscriptionId);\n }\n\n return subscription;\n }\n\n /**\n * Calculate period end date based on plan key\n * @private\n */\n private _calculatePeriodEnd(planKey: string, startDate: Date = new Date()): Date {\n const start = new Date(startDate);\n const end = new Date(start);\n\n switch (planKey) {\n case 'monthly':\n end.setMonth(end.getMonth() + 1);\n break;\n case 'quarterly':\n end.setMonth(end.getMonth() + 3);\n break;\n case 'yearly':\n end.setFullYear(end.getFullYear() + 1);\n break;\n default:\n // Default to 30 days\n end.setDate(end.getDate() + 30);\n }\n\n return end;\n }\n\n /**\n * Trigger event hook (fire-and-forget, non-blocking)\n * @private\n */\n private _triggerHook(event: string, data: unknown): void {\n triggerHook(this.hooks, event, data, this.logger);\n }\n}\n\nexport default MonetizationService;\n\n","/**\n * Payment Service\n * @classytic/revenue\n *\n * Framework-agnostic payment verification and management service with DI\n * Handles payment verification, refunds, and status updates\n */\n\nimport {\n TransactionNotFoundError,\n ProviderNotFoundError,\n ProviderError,\n AlreadyVerifiedError,\n PaymentVerificationError,\n RefundNotSupportedError,\n RefundError,\n ProviderCapabilityError,\n ValidationError,\n} from '../core/errors.js';\nimport { triggerHook } from '../utils/hooks.js';\nimport { reverseCommission } from '../utils/commission.js';\nimport { TRANSACTION_TYPE } from '../enums/transaction.enums.js';\nimport type { Container } from '../core/container.js';\nimport type {\n ModelsRegistry,\n ProvidersRegistry,\n HooksRegistry,\n RevenueConfig,\n Logger,\n TransactionDocument,\n PaymentVerifyOptions,\n PaymentVerifyResult,\n PaymentStatusResult,\n RefundOptions,\n PaymentRefundResult,\n WebhookResult,\n ListOptions,\n PaymentResultData,\n PaymentProviderInterface,\n TransactionTypeValue,\n MongooseModel,\n} from '../types/index.js';\n\n/**\n * Payment Service\n * Uses DI container for all dependencies\n */\nexport class PaymentService {\n private readonly models: ModelsRegistry;\n private readonly providers: ProvidersRegistry;\n private readonly config: RevenueConfig;\n private readonly hooks: HooksRegistry;\n private readonly logger: Logger;\n\n constructor(container: Container) {\n this.models = container.get<ModelsRegistry>('models');\n this.providers = container.get<ProvidersRegistry>('providers');\n this.config = container.get<RevenueConfig>('config');\n this.hooks = container.get<HooksRegistry>('hooks');\n this.logger = container.get<Logger>('logger');\n }\n\n /**\n * Verify a payment\n *\n * @param paymentIntentId - Payment intent ID, session ID, or transaction ID\n * @param options - Verification options\n * @returns { transaction, status }\n */\n async verify(\n paymentIntentId: string,\n options: PaymentVerifyOptions = {}\n ): Promise<PaymentVerifyResult> {\n const { verifiedBy = null } = options;\n\n const TransactionModel = this.models.Transaction;\n const transaction = await this._findTransaction(TransactionModel, paymentIntentId);\n\n if (!transaction) {\n throw new TransactionNotFoundError(paymentIntentId);\n }\n\n if (transaction.status === 'verified' || transaction.status === 'completed') {\n throw new AlreadyVerifiedError(transaction._id.toString());\n }\n\n // Get provider for verification\n const gatewayType = transaction.gateway?.type ?? 'manual';\n const provider = this.providers[gatewayType];\n\n if (!provider) {\n throw new ProviderNotFoundError(gatewayType, Object.keys(this.providers));\n }\n\n // Verify payment with provider\n let paymentResult: PaymentResultData | null = null;\n try {\n paymentResult = await provider.verifyPayment(paymentIntentId);\n } catch (error) {\n this.logger.error('Payment verification failed:', error);\n\n // Update transaction as failed\n transaction.status = 'failed';\n transaction.failureReason = (error as Error).message;\n transaction.metadata = {\n ...transaction.metadata,\n verificationError: (error as Error).message,\n failedAt: new Date().toISOString(),\n };\n await transaction.save();\n\n // Trigger payment.failed hook\n this._triggerHook('payment.failed', {\n transaction,\n error: (error as Error).message,\n provider: gatewayType,\n paymentIntentId,\n });\n\n throw new PaymentVerificationError(paymentIntentId, (error as Error).message);\n }\n\n // Validate amount and currency match\n if (paymentResult.amount && paymentResult.amount !== transaction.amount) {\n throw new ValidationError(\n `Amount mismatch: expected ${transaction.amount}, got ${paymentResult.amount}`,\n { expected: transaction.amount, actual: paymentResult.amount }\n );\n }\n\n if (paymentResult.currency && paymentResult.currency.toUpperCase() !== transaction.currency.toUpperCase()) {\n throw new ValidationError(\n `Currency mismatch: expected ${transaction.currency}, got ${paymentResult.currency}`,\n { expected: transaction.currency, actual: paymentResult.currency }\n );\n }\n\n // Update transaction based on verification result\n transaction.status = paymentResult.status === 'succeeded' ? 'verified' : paymentResult.status;\n transaction.verifiedAt = paymentResult.paidAt ?? new Date();\n transaction.verifiedBy = verifiedBy;\n transaction.gateway = {\n ...transaction.gateway,\n type: transaction.gateway?.type ?? 'manual',\n verificationData: paymentResult.metadata,\n };\n\n await transaction.save();\n\n // Trigger hook\n this._triggerHook('payment.verified', {\n transaction,\n paymentResult,\n verifiedBy,\n });\n\n return {\n transaction,\n paymentResult,\n status: transaction.status,\n };\n }\n\n /**\n * Get payment status\n *\n * @param paymentIntentId - Payment intent ID, session ID, or transaction ID\n * @returns { transaction, status }\n */\n async getStatus(paymentIntentId: string): Promise<PaymentStatusResult> {\n const TransactionModel = this.models.Transaction;\n const transaction = await this._findTransaction(TransactionModel, paymentIntentId);\n\n if (!transaction) {\n throw new TransactionNotFoundError(paymentIntentId);\n }\n\n // Get provider\n const gatewayType = transaction.gateway?.type ?? 'manual';\n const provider = this.providers[gatewayType];\n\n if (!provider) {\n throw new ProviderNotFoundError(gatewayType, Object.keys(this.providers));\n }\n\n // Get status from provider\n let paymentResult: PaymentResultData | null = null;\n try {\n paymentResult = await provider.getStatus(paymentIntentId);\n } catch (error) {\n this.logger.warn('Failed to get payment status from provider:', error);\n // Return transaction status as fallback\n return {\n transaction,\n status: transaction.status,\n provider: gatewayType,\n };\n }\n\n return {\n transaction,\n paymentResult,\n status: paymentResult.status,\n provider: gatewayType,\n };\n }\n\n /**\n * Refund a payment\n *\n * @param paymentId - Payment intent ID, session ID, or transaction ID\n * @param amount - Amount to refund (optional, full refund if not provided)\n * @param options - Refund options\n * @returns { transaction, refundResult }\n */\n async refund(\n paymentId: string,\n amount: number | null = null,\n options: RefundOptions = {}\n ): Promise<PaymentRefundResult> {\n const { reason = null } = options;\n\n const TransactionModel = this.models.Transaction;\n const transaction = await this._findTransaction(TransactionModel, paymentId);\n\n if (!transaction) {\n throw new TransactionNotFoundError(paymentId);\n }\n\n if (transaction.status !== 'verified' && transaction.status !== 'completed') {\n throw new RefundError(transaction._id.toString(), 'Only verified/completed transactions can be refunded');\n }\n\n // Get provider\n const gatewayType = transaction.gateway?.type ?? 'manual';\n const provider = this.providers[gatewayType];\n\n if (!provider) {\n throw new ProviderNotFoundError(gatewayType, Object.keys(this.providers));\n }\n\n // Check if provider supports refunds\n const capabilities = provider.getCapabilities();\n if (!capabilities.supportsRefunds) {\n throw new RefundNotSupportedError(gatewayType);\n }\n\n // Calculate refundable amount\n const refundedSoFar = transaction.refundedAmount ?? 0;\n const refundableAmount = transaction.amount - refundedSoFar;\n const refundAmount = amount ?? refundableAmount;\n\n // Validate refund amount\n if (refundAmount <= 0) {\n throw new ValidationError(`Refund amount must be positive, got ${refundAmount}`);\n }\n\n if (refundAmount > refundableAmount) {\n throw new ValidationError(\n `Refund amount (${refundAmount}) exceeds refundable balance (${refundableAmount})`,\n { refundAmount, refundableAmount, alreadyRefunded: refundedSoFar }\n );\n }\n\n // Refund via provider\n let refundResult;\n\n try {\n refundResult = await provider.refund(paymentId, refundAmount, { reason: reason ?? undefined });\n } catch (error) {\n this.logger.error('Refund failed:', error);\n throw new RefundError(paymentId, (error as Error).message);\n }\n\n // Create separate refund transaction (EXPENSE) for proper accounting\n const refundTransactionType: TransactionTypeValue = \n this.config.transactionTypeMapping?.refund ?? TRANSACTION_TYPE.EXPENSE;\n\n // Reverse commission proportionally for refund\n const refundCommission = transaction.commission\n ? reverseCommission(transaction.commission, transaction.amount, refundAmount)\n : null;\n\n const refundTransaction = await TransactionModel.create({\n organizationId: transaction.organizationId,\n customerId: transaction.customerId,\n amount: refundAmount,\n currency: transaction.currency,\n category: transaction.category,\n type: refundTransactionType, // EXPENSE - money going out\n method: transaction.method ?? 'manual',\n status: 'completed',\n gateway: {\n type: transaction.gateway?.type ?? 'manual',\n paymentIntentId: refundResult.id,\n provider: refundResult.provider,\n },\n paymentDetails: transaction.paymentDetails,\n ...(refundCommission && { commission: refundCommission }), // Reversed commission\n // Polymorphic reference (copy from original transaction)\n ...(transaction.referenceId && { referenceId: transaction.referenceId }),\n ...(transaction.referenceModel && { referenceModel: transaction.referenceModel }),\n metadata: {\n ...transaction.metadata,\n isRefund: true,\n originalTransactionId: transaction._id.toString(),\n refundReason: reason,\n refundResult: refundResult.metadata,\n },\n idempotencyKey: `refund_${transaction._id}_${Date.now()}`,\n }) as TransactionDocument;\n\n // Update original transaction status\n const isPartialRefund = refundAmount < transaction.amount;\n transaction.status = isPartialRefund ? 'partially_refunded' : 'refunded';\n transaction.refundedAmount = (transaction.refundedAmount ?? 0) + refundAmount;\n transaction.refundedAt = refundResult.refundedAt ?? new Date();\n transaction.metadata = {\n ...transaction.metadata,\n refundTransactionId: refundTransaction._id.toString(),\n refundReason: reason,\n };\n\n await transaction.save();\n\n // Trigger hook\n this._triggerHook('payment.refunded', {\n transaction,\n refundTransaction,\n refundResult,\n refundAmount,\n reason,\n isPartialRefund,\n });\n\n return {\n transaction,\n refundTransaction,\n refundResult,\n status: transaction.status,\n };\n }\n\n /**\n * Handle webhook from payment provider\n *\n * @param provider - Provider name\n * @param payload - Webhook payload\n * @param headers - Request headers\n * @returns { event, transaction }\n */\n async handleWebhook(\n providerName: string,\n payload: unknown,\n headers: Record<string, string> = {}\n ): Promise<WebhookResult> {\n const provider = this.providers[providerName];\n\n if (!provider) {\n throw new ProviderNotFoundError(providerName, Object.keys(this.providers));\n }\n\n // Check if provider supports webhooks\n const capabilities = provider.getCapabilities();\n if (!capabilities.supportsWebhooks) {\n throw new ProviderCapabilityError(providerName, 'webhooks');\n }\n\n // Process webhook via provider\n let webhookEvent;\n try {\n webhookEvent = await provider.handleWebhook(payload, headers);\n } catch (error) {\n this.logger.error('Webhook processing failed:', error);\n throw new ProviderError(\n `Webhook processing failed for ${providerName}: ${(error as Error).message}`,\n 'WEBHOOK_PROCESSING_FAILED',\n { retryable: false }\n );\n }\n\n // Validate webhook event structure\n if (!webhookEvent?.data?.sessionId && !webhookEvent?.data?.paymentIntentId) {\n throw new ValidationError(\n `Invalid webhook event structure from ${providerName}: missing sessionId or paymentIntentId`,\n { provider: providerName, eventType: webhookEvent?.type }\n );\n }\n\n // Find transaction by sessionId first (for checkout flows), then paymentIntentId\n const TransactionModel = this.models.Transaction;\n let transaction: TransactionDocument | null = null;\n\n if (webhookEvent.data.sessionId) {\n transaction = await (TransactionModel as unknown as {\n findOne(filter: object): Promise<TransactionDocument | null>;\n }).findOne({\n 'gateway.sessionId': webhookEvent.data.sessionId,\n });\n }\n\n if (!transaction && webhookEvent.data.paymentIntentId) {\n transaction = await (TransactionModel as unknown as {\n findOne(filter: object): Promise<TransactionDocument | null>;\n }).findOne({\n 'gateway.paymentIntentId': webhookEvent.data.paymentIntentId,\n });\n }\n\n if (!transaction) {\n this.logger.warn('Transaction not found for webhook event', {\n provider: providerName,\n eventId: webhookEvent.id,\n sessionId: webhookEvent.data.sessionId,\n paymentIntentId: webhookEvent.data.paymentIntentId,\n });\n throw new TransactionNotFoundError(\n webhookEvent.data.sessionId ?? webhookEvent.data.paymentIntentId ?? 'unknown'\n );\n }\n\n // Update gateway with complete information from webhook\n if (webhookEvent.data.sessionId && !transaction.gateway?.sessionId) {\n transaction.gateway = {\n ...transaction.gateway,\n type: transaction.gateway?.type ?? 'manual',\n sessionId: webhookEvent.data.sessionId,\n };\n }\n if (webhookEvent.data.paymentIntentId && !transaction.gateway?.paymentIntentId) {\n transaction.gateway = {\n ...transaction.gateway,\n type: transaction.gateway?.type ?? 'manual',\n paymentIntentId: webhookEvent.data.paymentIntentId,\n };\n }\n\n // Check for duplicate webhook processing (idempotency)\n if (transaction.webhook?.eventId === webhookEvent.id && transaction.webhook?.processedAt) {\n this.logger.warn('Webhook already processed', {\n transactionId: transaction._id,\n eventId: webhookEvent.id,\n });\n return {\n event: webhookEvent,\n transaction,\n status: 'already_processed',\n };\n }\n\n // Update transaction based on webhook event\n transaction.webhook = {\n eventId: webhookEvent.id,\n eventType: webhookEvent.type,\n receivedAt: new Date(),\n processedAt: new Date(),\n data: webhookEvent.data,\n };\n\n // Update status based on webhook type\n if (webhookEvent.type === 'payment.succeeded') {\n transaction.status = 'verified';\n transaction.verifiedAt = webhookEvent.createdAt;\n } else if (webhookEvent.type === 'payment.failed') {\n transaction.status = 'failed';\n } else if (webhookEvent.type === 'refund.succeeded') {\n transaction.status = 'refunded';\n transaction.refundedAt = webhookEvent.createdAt;\n }\n\n await transaction.save();\n\n // Trigger hook\n this._triggerHook(`payment.webhook.${webhookEvent.type}`, {\n event: webhookEvent,\n transaction,\n });\n\n return {\n event: webhookEvent,\n transaction,\n status: 'processed',\n };\n }\n\n /**\n * List payments/transactions with filters\n *\n * @param filters - Query filters\n * @param options - Query options (limit, skip, sort)\n * @returns Transactions\n */\n async list(\n filters: Record<string, unknown> = {},\n options: ListOptions = {}\n ): Promise<TransactionDocument[]> {\n const TransactionModel = this.models.Transaction;\n const { limit = 50, skip = 0, sort = { createdAt: -1 } } = options;\n\n const transactions = await (TransactionModel as unknown as {\n find(filter: object): { limit(n: number): { skip(n: number): { sort(s: object): Promise<TransactionDocument[]> } } };\n })\n .find(filters)\n .limit(limit)\n .skip(skip)\n .sort(sort);\n\n return transactions;\n }\n\n /**\n * Get payment/transaction by ID\n *\n * @param transactionId - Transaction ID\n * @returns Transaction\n */\n async get(transactionId: string): Promise<TransactionDocument> {\n const TransactionModel = this.models.Transaction;\n const transaction = await TransactionModel.findById(transactionId) as TransactionDocument | null;\n\n if (!transaction) {\n throw new TransactionNotFoundError(transactionId);\n }\n\n return transaction;\n }\n\n /**\n * Get provider instance\n *\n * @param providerName - Provider name\n * @returns Provider instance\n */\n getProvider(providerName: string): PaymentProviderInterface {\n const provider = this.providers[providerName];\n if (!provider) {\n throw new ProviderNotFoundError(providerName, Object.keys(this.providers));\n }\n return provider;\n }\n\n /**\n * Trigger event hook (fire-and-forget, non-blocking)\n * @private\n */\n private _triggerHook(event: string, data: unknown): void {\n triggerHook(this.hooks, event, data, this.logger);\n }\n\n /**\n * Find transaction by sessionId, paymentIntentId, or transaction ID\n * @private\n */\n private async _findTransaction(\n TransactionModel: MongooseModel<TransactionDocument>,\n identifier: string\n ): Promise<TransactionDocument | null> {\n let transaction = await (TransactionModel as unknown as {\n findOne(filter: object): Promise<TransactionDocument | null>;\n }).findOne({\n 'gateway.sessionId': identifier,\n });\n\n if (!transaction) {\n transaction = await (TransactionModel as unknown as {\n findOne(filter: object): Promise<TransactionDocument | null>;\n }).findOne({\n 'gateway.paymentIntentId': identifier,\n });\n }\n\n if (!transaction) {\n transaction = await TransactionModel.findById(identifier) as TransactionDocument | null;\n }\n\n return transaction;\n }\n}\n\nexport default PaymentService;\n\n","/**\n * Transaction Service\n * @classytic/revenue\n *\n * Thin, focused transaction service for core operations\n * Users handle their own analytics, exports, and complex queries\n *\n * Works with ANY model implementation:\n * - Plain Mongoose models\n * - @classytic/mongokit Repository instances\n * - Any other abstraction with compatible interface\n */\n\nimport { TransactionNotFoundError } from '../core/errors.js';\nimport { triggerHook } from '../utils/hooks.js';\nimport type { Container } from '../core/container.js';\nimport type {\n ModelsRegistry,\n HooksRegistry,\n Logger,\n TransactionDocument,\n TransactionListResult,\n ListOptions,\n} from '../types/index.js';\n\n/**\n * Transaction Service\n * Focused on core transaction lifecycle operations\n */\nexport class TransactionService {\n private readonly models: ModelsRegistry;\n private readonly hooks: HooksRegistry;\n private readonly logger: Logger;\n\n constructor(container: Container) {\n this.models = container.get<ModelsRegistry>('models');\n this.hooks = container.get<HooksRegistry>('hooks');\n this.logger = container.get<Logger>('logger');\n }\n\n /**\n * Get transaction by ID\n *\n * @param transactionId - Transaction ID\n * @returns Transaction\n */\n async get(transactionId: string): Promise<TransactionDocument> {\n const TransactionModel = this.models.Transaction;\n const transaction = await TransactionModel.findById(transactionId) as TransactionDocument | null;\n\n if (!transaction) {\n throw new TransactionNotFoundError(transactionId);\n }\n\n return transaction;\n }\n\n /**\n * List transactions with filters\n *\n * @param filters - Query filters\n * @param options - Query options (limit, skip, sort, populate)\n * @returns { transactions, total, page, limit }\n */\n async list(\n filters: Record<string, unknown> = {},\n options: ListOptions = {}\n ): Promise<TransactionListResult> {\n const TransactionModel = this.models.Transaction;\n const {\n limit = 50,\n skip = 0,\n page = null,\n sort = { createdAt: -1 },\n populate = [],\n } = options;\n\n // Calculate pagination\n const actualSkip = page ? (page - 1) * limit : skip;\n\n // Build query\n type QueryBuilder = {\n find(filter: object): QueryBuilder;\n limit(n: number): QueryBuilder;\n skip(n: number): QueryBuilder;\n sort(s: object): QueryBuilder;\n populate(field: string): QueryBuilder;\n then<T>(resolve: (value: TransactionDocument[]) => T): Promise<T>;\n };\n\n let query = (TransactionModel as unknown as {\n find(filter: object): QueryBuilder;\n }).find(filters)\n .limit(limit)\n .skip(actualSkip)\n .sort(sort);\n\n // Apply population if supported\n if (populate.length > 0 && typeof query.populate === 'function') {\n populate.forEach((field) => {\n query = query.populate(field);\n });\n }\n\n const transactions = await query as unknown as TransactionDocument[];\n\n // Count documents (works with both Mongoose and Repository)\n type ModelWithCount = {\n countDocuments?(filter: object): Promise<number>;\n count?(filter: object): Promise<number>;\n };\n\n const model = TransactionModel as unknown as ModelWithCount;\n const total = await (model.countDocuments\n ? model.countDocuments(filters)\n : model.count?.(filters)) ?? 0;\n\n return {\n transactions,\n total,\n page: page ?? Math.floor(actualSkip / limit) + 1,\n limit,\n pages: Math.ceil(total / limit),\n };\n }\n\n /**\n * Update transaction\n *\n * @param transactionId - Transaction ID\n * @param updates - Fields to update\n * @returns Updated transaction\n */\n async update(\n transactionId: string,\n updates: Partial<TransactionDocument>\n ): Promise<TransactionDocument> {\n const TransactionModel = this.models.Transaction;\n\n // Support both Repository pattern and Mongoose\n type ModelWithUpdate = {\n update?(id: string, data: object): Promise<TransactionDocument | null>;\n findByIdAndUpdate?(id: string, data: object, options?: object): Promise<TransactionDocument | null>;\n };\n\n const model = TransactionModel as unknown as ModelWithUpdate;\n let transaction: TransactionDocument | null;\n\n if (typeof model.update === 'function') {\n // Repository pattern\n transaction = await model.update(transactionId, updates);\n } else if (typeof model.findByIdAndUpdate === 'function') {\n // Plain Mongoose\n transaction = await model.findByIdAndUpdate(\n transactionId,\n { $set: updates },\n { new: true }\n );\n } else {\n throw new Error('Transaction model does not support update operations');\n }\n\n if (!transaction) {\n throw new TransactionNotFoundError(transactionId);\n }\n\n // Trigger hook (fire-and-forget, non-blocking)\n this._triggerHook('transaction.updated', {\n transaction,\n updates,\n });\n\n return transaction;\n }\n\n /**\n * Trigger event hook (fire-and-forget, non-blocking)\n * @private\n */\n private _triggerHook(event: string, data: unknown): void {\n triggerHook(this.hooks, event, data, this.logger);\n }\n}\n\nexport default TransactionService;\n\n","/**\n * Escrow/Hold Enums\n * @classytic/revenue\n *\n * Enums for platform-as-intermediary payment flow\n */\n\nexport const HOLD_STATUS = {\n PENDING: 'pending',\n HELD: 'held',\n RELEASED: 'released',\n CANCELLED: 'cancelled',\n EXPIRED: 'expired',\n PARTIALLY_RELEASED: 'partially_released',\n} as const;\n\nexport type HoldStatus = typeof HOLD_STATUS;\nexport type HoldStatusValue = HoldStatus[keyof HoldStatus];\nexport const HOLD_STATUS_VALUES = Object.values(HOLD_STATUS);\n\nexport const RELEASE_REASON = {\n PAYMENT_VERIFIED: 'payment_verified',\n MANUAL_RELEASE: 'manual_release',\n AUTO_RELEASE: 'auto_release',\n DISPUTE_RESOLVED: 'dispute_resolved',\n} as const;\n\nexport type ReleaseReason = typeof RELEASE_REASON;\nexport type ReleaseReasonValue = ReleaseReason[keyof ReleaseReason];\nexport const RELEASE_REASON_VALUES = Object.values(RELEASE_REASON);\n\nexport const HOLD_REASON = {\n PAYMENT_VERIFICATION: 'payment_verification',\n FRAUD_CHECK: 'fraud_check',\n MANUAL_REVIEW: 'manual_review',\n DISPUTE: 'dispute',\n COMPLIANCE: 'compliance',\n} as const;\n\nexport type HoldReason = typeof HOLD_REASON;\nexport type HoldReasonValue = HoldReason[keyof HoldReason];\nexport const HOLD_REASON_VALUES = Object.values(HOLD_REASON);\n\n","/**\n * Split Payment Enums\n * @classytic/revenue\n *\n * Enums for multi-party commission splits\n */\n\nexport const SPLIT_TYPE = {\n PLATFORM_COMMISSION: 'platform_commission',\n AFFILIATE_COMMISSION: 'affiliate_commission',\n REFERRAL_COMMISSION: 'referral_commission',\n PARTNER_COMMISSION: 'partner_commission',\n CUSTOM: 'custom',\n} as const;\n\nexport type SplitType = typeof SPLIT_TYPE;\nexport type SplitTypeValue = SplitType[keyof SplitType];\nexport const SPLIT_TYPE_VALUES = Object.values(SPLIT_TYPE);\n\nexport const SPLIT_STATUS = {\n PENDING: 'pending',\n DUE: 'due',\n PAID: 'paid',\n WAIVED: 'waived',\n CANCELLED: 'cancelled',\n} as const;\n\nexport type SplitStatus = typeof SPLIT_STATUS;\nexport type SplitStatusValue = SplitStatus[keyof SplitStatus];\nexport const SPLIT_STATUS_VALUES = Object.values(SPLIT_STATUS);\n\nexport const PAYOUT_METHOD = {\n BANK_TRANSFER: 'bank_transfer',\n MOBILE_WALLET: 'mobile_wallet',\n PLATFORM_BALANCE: 'platform_balance',\n CRYPTO: 'crypto',\n CHECK: 'check',\n MANUAL: 'manual',\n} as const;\n\nexport type PayoutMethod = typeof PAYOUT_METHOD;\nexport type PayoutMethodValue = PayoutMethod[keyof PayoutMethod];\nexport const PAYOUT_METHOD_VALUES = Object.values(PAYOUT_METHOD);\n\n","/**\n * Commission Split Utilities\n * @classytic/revenue\n *\n * Multi-party commission split calculation for affiliate/referral systems\n */\n\nimport { SPLIT_TYPE, SPLIT_STATUS } from '../enums/split.enums.js';\nimport type {\n SplitRule,\n SplitInfo,\n CommissionInfo,\n CommissionWithSplitsOptions,\n} from '../types/index.js';\n\n/**\n * Calculate multi-party commission splits\n *\n * @param amount - Transaction amount\n * @param splitRules - Split configuration\n * @param gatewayFeeRate - Gateway fee rate (optional)\n * @returns Split objects\n *\n * @example\n * calculateSplits(1000, [\n * { type: 'platform_commission', recipientId: 'platform', recipientType: 'platform', rate: 0.10 },\n * { type: 'affiliate_commission', recipientId: 'affiliate-123', recipientType: 'user', rate: 0.02 },\n * ], 0.018);\n *\n * Returns:\n * [\n * { type: 'platform_commission', recipientId: 'platform', grossAmount: 100, gatewayFeeAmount: 18, netAmount: 82, ... },\n * { type: 'affiliate_commission', recipientId: 'affiliate-123', grossAmount: 20, gatewayFeeAmount: 0, netAmount: 20, ... },\n * ]\n */\nexport function calculateSplits(\n amount: number,\n splitRules: SplitRule[] = [],\n gatewayFeeRate: number = 0\n): SplitInfo[] {\n if (!splitRules || splitRules.length === 0) {\n return [];\n }\n\n if (amount < 0) {\n throw new Error('Transaction amount cannot be negative');\n }\n\n if (gatewayFeeRate < 0 || gatewayFeeRate > 1) {\n throw new Error('Gateway fee rate must be between 0 and 1');\n }\n\n const totalRate = splitRules.reduce((sum, rule) => sum + rule.rate, 0);\n if (totalRate > 1) {\n throw new Error(`Total split rate (${totalRate}) cannot exceed 1.0`);\n }\n\n return splitRules.map((rule, index) => {\n if (rule.rate < 0 || rule.rate > 1) {\n throw new Error(`Split rate must be between 0 and 1 for split ${index}`);\n }\n\n const grossAmount = Math.round(amount * rule.rate * 100) / 100;\n\n const gatewayFeeAmount = index === 0 && gatewayFeeRate > 0\n ? Math.round(amount * gatewayFeeRate * 100) / 100\n : 0;\n\n const netAmount = Math.max(0, Math.round((grossAmount - gatewayFeeAmount) * 100) / 100);\n\n return {\n type: rule.type ?? SPLIT_TYPE.CUSTOM,\n recipientId: rule.recipientId,\n recipientType: rule.recipientType,\n rate: rule.rate,\n grossAmount,\n gatewayFeeRate: gatewayFeeAmount > 0 ? gatewayFeeRate : 0,\n gatewayFeeAmount,\n netAmount,\n status: SPLIT_STATUS.PENDING,\n dueDate: rule.dueDate ?? null,\n metadata: rule.metadata ?? {},\n };\n });\n}\n\n/**\n * Calculate organization payout after splits\n *\n * @param amount - Total transaction amount\n * @param splits - Calculated splits\n * @returns Amount organization receives\n */\nexport function calculateOrganizationPayout(\n amount: number,\n splits: SplitInfo[] = []\n): number {\n const totalSplitAmount = splits.reduce((sum, split) => sum + split.grossAmount, 0);\n return Math.max(0, Math.round((amount - totalSplitAmount) * 100) / 100);\n}\n\n/**\n * Reverse splits proportionally on refund\n *\n * @param originalSplits - Original split objects\n * @param originalAmount - Original transaction amount\n * @param refundAmount - Amount being refunded\n * @returns Reversed splits\n */\nexport function reverseSplits(\n originalSplits: SplitInfo[] | undefined | null,\n originalAmount: number,\n refundAmount: number\n): SplitInfo[] {\n if (!originalSplits || originalSplits.length === 0) {\n return [];\n }\n\n const refundRatio = refundAmount / originalAmount;\n\n return originalSplits.map((split) => ({\n ...split,\n grossAmount: Math.round(split.grossAmount * refundRatio * 100) / 100,\n gatewayFeeAmount: Math.round(split.gatewayFeeAmount * refundRatio * 100) / 100,\n netAmount: Math.round(split.netAmount * refundRatio * 100) / 100,\n status: SPLIT_STATUS.WAIVED,\n }));\n}\n\n/**\n * Build commission object with splits support\n * Backward compatible with existing calculateCommission\n *\n * @param amount - Transaction amount\n * @param commissionRate - Platform commission rate\n * @param gatewayFeeRate - Gateway fee rate\n * @param options - Additional options\n * @returns Commission with optional splits\n */\nexport function calculateCommissionWithSplits(\n amount: number,\n commissionRate: number,\n gatewayFeeRate: number = 0,\n options: CommissionWithSplitsOptions = {}\n): CommissionInfo | null {\n const { affiliateRate = 0, affiliateId = null, affiliateType = 'user' } = options;\n\n if (commissionRate <= 0 && affiliateRate <= 0) {\n return null;\n }\n\n const splitRules: SplitRule[] = [];\n\n if (commissionRate > 0) {\n splitRules.push({\n type: SPLIT_TYPE.PLATFORM_COMMISSION,\n recipientId: 'platform',\n recipientType: 'platform',\n rate: commissionRate,\n });\n }\n\n if (affiliateRate > 0 && affiliateId) {\n splitRules.push({\n type: SPLIT_TYPE.AFFILIATE_COMMISSION,\n recipientId: affiliateId,\n recipientType: affiliateType,\n rate: affiliateRate,\n });\n }\n\n const splits = calculateSplits(amount, splitRules, gatewayFeeRate);\n\n const platformSplit = splits.find((s) => s.type === SPLIT_TYPE.PLATFORM_COMMISSION);\n const affiliateSplit = splits.find((s) => s.type === SPLIT_TYPE.AFFILIATE_COMMISSION);\n\n return {\n rate: commissionRate,\n grossAmount: platformSplit?.grossAmount ?? 0,\n gatewayFeeRate: platformSplit?.gatewayFeeRate ?? 0,\n gatewayFeeAmount: platformSplit?.gatewayFeeAmount ?? 0,\n netAmount: platformSplit?.netAmount ?? 0,\n status: 'pending',\n ...(splits.length > 0 && { splits }),\n ...(affiliateSplit && {\n affiliate: {\n recipientId: affiliateSplit.recipientId,\n recipientType: affiliateSplit.recipientType,\n rate: affiliateSplit.rate,\n grossAmount: affiliateSplit.grossAmount,\n netAmount: affiliateSplit.netAmount,\n },\n }),\n };\n}\n\nexport default {\n calculateSplits,\n calculateOrganizationPayout,\n reverseSplits,\n calculateCommissionWithSplits,\n};\n\n","/**\n * Escrow Service\n * @classytic/revenue\n *\n * Platform-as-intermediary payment flow\n * Hold funds → Verify → Split/Deduct → Release to organization\n */\n\nimport { TransactionNotFoundError } from '../core/errors.js';\nimport { HOLD_STATUS, RELEASE_REASON, HOLD_REASON } from '../enums/escrow.enums.js';\nimport { TRANSACTION_TYPE, TRANSACTION_STATUS } from '../enums/transaction.enums.js';\nimport { SPLIT_STATUS } from '../enums/split.enums.js';\nimport { triggerHook } from '../utils/hooks.js';\nimport { calculateSplits, calculateOrganizationPayout } from '../utils/commission-split.js';\nimport type { Container } from '../core/container.js';\nimport type {\n ModelsRegistry,\n HooksRegistry,\n Logger,\n TransactionDocument,\n HoldOptions,\n ReleaseOptions,\n ReleaseResult,\n CancelHoldOptions,\n SplitResult,\n EscrowStatusResult,\n SplitRule,\n SplitInfo,\n} from '../types/index.js';\n\nexport class EscrowService {\n private readonly models: ModelsRegistry;\n private readonly hooks: HooksRegistry;\n private readonly logger: Logger;\n\n constructor(container: Container) {\n this.models = container.get<ModelsRegistry>('models');\n this.hooks = container.get<HooksRegistry>('hooks');\n this.logger = container.get<Logger>('logger');\n }\n\n /**\n * Hold funds in escrow\n *\n * @param transactionId - Transaction to hold\n * @param options - Hold options\n * @returns Updated transaction\n */\n async hold(\n transactionId: string,\n options: HoldOptions = {}\n ): Promise<TransactionDocument> {\n const {\n reason = HOLD_REASON.PAYMENT_VERIFICATION,\n holdUntil = null,\n metadata = {},\n } = options;\n\n const TransactionModel = this.models.Transaction;\n const transaction = await TransactionModel.findById(transactionId) as TransactionDocument | null;\n\n if (!transaction) {\n throw new TransactionNotFoundError(transactionId);\n }\n\n if (transaction.status !== TRANSACTION_STATUS.VERIFIED) {\n throw new Error(`Cannot hold transaction with status: ${transaction.status}. Must be verified.`);\n }\n\n transaction.hold = {\n status: HOLD_STATUS.HELD,\n heldAmount: transaction.amount,\n releasedAmount: 0,\n reason,\n heldAt: new Date(),\n ...(holdUntil && { holdUntil }),\n releases: [],\n metadata,\n };\n\n await transaction.save();\n\n this._triggerHook('escrow.held', {\n transaction,\n heldAmount: transaction.amount,\n reason,\n });\n\n return transaction;\n }\n\n /**\n * Release funds from escrow to recipient\n *\n * @param transactionId - Transaction to release\n * @param options - Release options\n * @returns { transaction, releaseTransaction }\n */\n async release(\n transactionId: string,\n options: ReleaseOptions\n ): Promise<ReleaseResult> {\n const {\n amount = null,\n recipientId,\n recipientType = 'organization',\n reason = RELEASE_REASON.PAYMENT_VERIFIED,\n releasedBy = null,\n createTransaction = true,\n metadata = {},\n } = options;\n\n const TransactionModel = this.models.Transaction;\n const transaction = await TransactionModel.findById(transactionId) as TransactionDocument | null;\n\n if (!transaction) {\n throw new TransactionNotFoundError(transactionId);\n }\n\n if (!transaction.hold || transaction.hold.status !== HOLD_STATUS.HELD) {\n throw new Error(`Transaction is not in held status. Current: ${transaction.hold?.status ?? 'none'}`);\n }\n\n if (!recipientId) {\n throw new Error('recipientId is required for release');\n }\n\n const releaseAmount = amount ?? (transaction.hold.heldAmount - transaction.hold.releasedAmount);\n const availableAmount = transaction.hold.heldAmount - transaction.hold.releasedAmount;\n\n if (releaseAmount > availableAmount) {\n throw new Error(`Release amount (${releaseAmount}) exceeds available held amount (${availableAmount})`);\n }\n\n const releaseRecord = {\n amount: releaseAmount,\n recipientId,\n recipientType,\n releasedAt: new Date(),\n releasedBy,\n reason,\n metadata,\n };\n\n transaction.hold.releases.push(releaseRecord);\n transaction.hold.releasedAmount += releaseAmount;\n\n const isFullRelease = transaction.hold.releasedAmount >= transaction.hold.heldAmount;\n const isPartialRelease = transaction.hold.releasedAmount > 0 && transaction.hold.releasedAmount < transaction.hold.heldAmount;\n\n if (isFullRelease) {\n transaction.hold.status = HOLD_STATUS.RELEASED;\n transaction.hold.releasedAt = new Date();\n transaction.status = TRANSACTION_STATUS.COMPLETED;\n } else if (isPartialRelease) {\n transaction.hold.status = HOLD_STATUS.PARTIALLY_RELEASED;\n }\n\n await transaction.save();\n\n let releaseTransaction: TransactionDocument | null = null;\n if (createTransaction) {\n releaseTransaction = await TransactionModel.create({\n organizationId: transaction.organizationId,\n customerId: recipientId,\n amount: releaseAmount,\n currency: transaction.currency,\n category: transaction.category,\n type: TRANSACTION_TYPE.INCOME,\n method: transaction.method,\n status: TRANSACTION_STATUS.COMPLETED,\n gateway: transaction.gateway,\n referenceId: transaction.referenceId,\n referenceModel: transaction.referenceModel,\n metadata: {\n ...metadata,\n isRelease: true,\n heldTransactionId: transaction._id.toString(),\n releaseReason: reason,\n recipientType,\n },\n idempotencyKey: `release_${transaction._id}_${Date.now()}`,\n }) as TransactionDocument;\n }\n\n this._triggerHook('escrow.released', {\n transaction,\n releaseTransaction,\n releaseAmount,\n recipientId,\n recipientType,\n reason,\n isFullRelease,\n isPartialRelease,\n });\n\n return {\n transaction,\n releaseTransaction,\n releaseAmount,\n isFullRelease,\n isPartialRelease,\n };\n }\n\n /**\n * Cancel hold and release back to customer\n *\n * @param transactionId - Transaction to cancel hold\n * @param options - Cancel options\n * @returns Updated transaction\n */\n async cancel(\n transactionId: string,\n options: CancelHoldOptions = {}\n ): Promise<TransactionDocument> {\n const { reason = 'Hold cancelled', metadata = {} } = options;\n\n const TransactionModel = this.models.Transaction;\n const transaction = await TransactionModel.findById(transactionId) as TransactionDocument | null;\n\n if (!transaction) {\n throw new TransactionNotFoundError(transactionId);\n }\n\n if (!transaction.hold || transaction.hold.status !== HOLD_STATUS.HELD) {\n throw new Error(`Transaction is not in held status. Current: ${transaction.hold?.status ?? 'none'}`);\n }\n\n transaction.hold.status = HOLD_STATUS.CANCELLED;\n transaction.hold.cancelledAt = new Date();\n transaction.hold.metadata = {\n ...transaction.hold.metadata,\n ...metadata,\n cancelReason: reason,\n };\n\n transaction.status = TRANSACTION_STATUS.CANCELLED;\n\n await transaction.save();\n\n this._triggerHook('escrow.cancelled', {\n transaction,\n reason,\n });\n\n return transaction;\n }\n\n /**\n * Split payment to multiple recipients\n * Deducts splits from held amount and releases remainder to organization\n *\n * @param transactionId - Transaction to split\n * @param splitRules - Split configuration\n * @returns { transaction, splitTransactions, organizationTransaction }\n */\n async split(\n transactionId: string,\n splitRules: SplitRule[] = []\n ): Promise<SplitResult> {\n const TransactionModel = this.models.Transaction;\n const transaction = await TransactionModel.findById(transactionId) as TransactionDocument | null;\n\n if (!transaction) {\n throw new TransactionNotFoundError(transactionId);\n }\n\n if (!transaction.hold || transaction.hold.status !== HOLD_STATUS.HELD) {\n throw new Error(`Transaction must be held before splitting. Current: ${transaction.hold?.status ?? 'none'}`);\n }\n\n if (!splitRules || splitRules.length === 0) {\n throw new Error('splitRules cannot be empty');\n }\n\n const splits = calculateSplits(\n transaction.amount,\n splitRules,\n transaction.commission?.gatewayFeeRate ?? 0\n );\n\n transaction.splits = splits;\n await transaction.save();\n\n const splitTransactions: TransactionDocument[] = [];\n\n for (const split of splits) {\n const splitTransaction = await TransactionModel.create({\n organizationId: transaction.organizationId,\n customerId: split.recipientId,\n amount: split.netAmount,\n currency: transaction.currency,\n category: split.type,\n type: TRANSACTION_TYPE.EXPENSE,\n method: transaction.method,\n status: TRANSACTION_STATUS.COMPLETED,\n gateway: transaction.gateway,\n referenceId: transaction.referenceId,\n referenceModel: transaction.referenceModel,\n metadata: {\n isSplit: true,\n splitType: split.type,\n recipientType: split.recipientType,\n originalTransactionId: transaction._id.toString(),\n grossAmount: split.grossAmount,\n gatewayFeeAmount: split.gatewayFeeAmount,\n },\n idempotencyKey: `split_${transaction._id}_${split.recipientId}_${Date.now()}`,\n }) as TransactionDocument;\n\n (split as SplitInfo & { payoutTransactionId?: string }).payoutTransactionId = splitTransaction._id.toString();\n split.status = SPLIT_STATUS.PAID;\n (split as SplitInfo & { paidDate?: Date }).paidDate = new Date();\n\n splitTransactions.push(splitTransaction);\n }\n\n await transaction.save();\n\n const organizationPayout = calculateOrganizationPayout(transaction.amount, splits);\n\n const organizationTransaction = await this.release(transactionId, {\n amount: organizationPayout,\n recipientId: transaction.organizationId?.toString() ?? '',\n recipientType: 'organization',\n reason: RELEASE_REASON.PAYMENT_VERIFIED,\n createTransaction: true,\n metadata: {\n afterSplits: true,\n totalSplits: splits.length,\n totalSplitAmount: transaction.amount - organizationPayout,\n },\n });\n\n this._triggerHook('escrow.split', {\n transaction,\n splits,\n splitTransactions,\n organizationTransaction: organizationTransaction.releaseTransaction,\n organizationPayout,\n });\n\n return {\n transaction,\n splits,\n splitTransactions,\n organizationTransaction: organizationTransaction.releaseTransaction,\n organizationPayout,\n };\n }\n\n /**\n * Get escrow status\n *\n * @param transactionId - Transaction ID\n * @returns Escrow status\n */\n async getStatus(transactionId: string): Promise<EscrowStatusResult> {\n const TransactionModel = this.models.Transaction;\n const transaction = await TransactionModel.findById(transactionId) as TransactionDocument | null;\n\n if (!transaction) {\n throw new TransactionNotFoundError(transactionId);\n }\n\n return {\n transaction,\n hold: transaction.hold ?? null,\n splits: transaction.splits ?? [],\n hasHold: !!transaction.hold,\n hasSplits: transaction.splits ? transaction.splits.length > 0 : false,\n };\n }\n\n private _triggerHook(event: string, data: unknown): void {\n triggerHook(this.hooks, event, data, this.logger);\n }\n}\n\nexport default EscrowService;\n\n","/**\n * Payment Provider Base Class\n * @classytic/revenue\n *\n * Abstract base class for all payment providers\n * Inspired by: Vercel AI SDK, Stripe SDK\n */\n\nimport type {\n CreateIntentParams,\n PaymentIntentData,\n PaymentResultData,\n RefundResultData,\n WebhookEventData,\n ProviderCapabilities,\n} from '../types/index.js';\n\n/**\n * Payment Intent - standardized response from createIntent\n */\nexport class PaymentIntent implements PaymentIntentData {\n public readonly id: string;\n public readonly sessionId: string | null;\n public readonly paymentIntentId: string | null;\n public readonly provider: string;\n public readonly status: string;\n public readonly amount: number;\n public readonly currency: string;\n public readonly metadata: Record<string, unknown>;\n public readonly clientSecret?: string;\n public readonly paymentUrl?: string;\n public readonly instructions?: string;\n public readonly raw?: unknown;\n\n constructor(data: PaymentIntentData) {\n this.id = data.id;\n this.sessionId = data.sessionId ?? null;\n this.paymentIntentId = data.paymentIntentId ?? null;\n this.provider = data.provider;\n this.status = data.status;\n this.amount = data.amount;\n this.currency = data.currency ?? 'BDT';\n this.metadata = data.metadata ?? {};\n this.clientSecret = data.clientSecret;\n this.paymentUrl = data.paymentUrl;\n this.instructions = data.instructions;\n this.raw = data.raw;\n }\n}\n\n/**\n * Payment Result - standardized response from verifyPayment\n */\nexport class PaymentResult implements PaymentResultData {\n public readonly id: string;\n public readonly provider: string;\n public readonly status: 'succeeded' | 'failed' | 'processing';\n public readonly amount?: number;\n public readonly currency: string;\n public readonly paidAt?: Date;\n public readonly metadata: Record<string, unknown>;\n public readonly raw?: unknown;\n\n constructor(data: PaymentResultData) {\n this.id = data.id;\n this.provider = data.provider;\n this.status = data.status;\n this.amount = data.amount;\n this.currency = data.currency ?? 'BDT';\n this.paidAt = data.paidAt;\n this.metadata = data.metadata ?? {};\n this.raw = data.raw;\n }\n}\n\n/**\n * Refund Result - standardized response from refund\n */\nexport class RefundResult implements RefundResultData {\n public readonly id: string;\n public readonly provider: string;\n public readonly status: 'succeeded' | 'failed' | 'processing';\n public readonly amount?: number;\n public readonly currency: string;\n public readonly refundedAt?: Date;\n public readonly reason?: string;\n public readonly metadata: Record<string, unknown>;\n public readonly raw?: unknown;\n\n constructor(data: RefundResultData) {\n this.id = data.id;\n this.provider = data.provider;\n this.status = data.status;\n this.amount = data.amount;\n this.currency = data.currency ?? 'BDT';\n this.refundedAt = data.refundedAt;\n this.reason = data.reason;\n this.metadata = data.metadata ?? {};\n this.raw = data.raw;\n }\n}\n\n/**\n * Webhook Event - standardized webhook event\n */\nexport class WebhookEvent implements WebhookEventData {\n public readonly id: string;\n public readonly provider: string;\n public readonly type: string;\n public readonly data: { sessionId?: string; paymentIntentId?: string; [key: string]: unknown };\n public readonly createdAt?: Date;\n public readonly raw?: unknown;\n\n constructor(data: WebhookEventData) {\n this.id = data.id;\n this.provider = data.provider;\n this.type = data.type;\n this.data = data.data;\n this.createdAt = data.createdAt;\n this.raw = data.raw;\n }\n}\n\n/**\n * Base Payment Provider\n * All payment providers must extend this class\n */\nexport abstract class PaymentProvider {\n public readonly config: Record<string, unknown>;\n public readonly name: string;\n\n constructor(config: Record<string, unknown> = {}) {\n this.config = config;\n this.name = 'base'; // Override in subclass\n }\n\n /**\n * Create a payment intent\n * @param params - Payment parameters\n * @returns Promise<PaymentIntent>\n */\n abstract createIntent(params: CreateIntentParams): Promise<PaymentIntent>;\n\n /**\n * Verify a payment\n * @param intentId - Payment intent ID\n * @returns Promise<PaymentResult>\n */\n abstract verifyPayment(intentId: string): Promise<PaymentResult>;\n\n /**\n * Get payment status\n * @param intentId - Payment intent ID\n * @returns Promise<PaymentResult>\n */\n abstract getStatus(intentId: string): Promise<PaymentResult>;\n\n /**\n * Refund a payment\n * @param paymentId - Payment ID\n * @param amount - Amount to refund (optional, full refund if not provided)\n * @param options - Refund options\n * @returns Promise<RefundResult>\n */\n abstract refund(\n paymentId: string,\n amount?: number | null,\n options?: { reason?: string }\n ): Promise<RefundResult>;\n\n /**\n * Handle webhook from provider\n * @param payload - Webhook payload\n * @param headers - Request headers (for signature verification)\n * @returns Promise<WebhookEvent>\n */\n abstract handleWebhook(\n payload: unknown,\n headers?: Record<string, string>\n ): Promise<WebhookEvent>;\n\n /**\n * Verify webhook signature (optional)\n * @param payload - Webhook payload\n * @param signature - Webhook signature\n * @returns boolean\n */\n verifyWebhookSignature(_payload: unknown, _signature: string): boolean {\n // Override in subclass if provider supports webhook signatures\n return true;\n }\n\n /**\n * Get provider capabilities\n * @returns ProviderCapabilities\n */\n getCapabilities(): ProviderCapabilities {\n return {\n supportsWebhooks: false,\n supportsRefunds: false,\n supportsPartialRefunds: false,\n requiresManualVerification: true,\n };\n }\n}\n\nexport default PaymentProvider;\n\n","/**\n * Revenue - Modern Payment Management\n * @classytic/revenue\n *\n * Fluent Builder API with integrated services\n * Less code, more power\n *\n * Inspired by: Vercel AI SDK, Stripe SDK, tRPC\n */\n\nimport { nanoid } from 'nanoid';\nimport { Container } from './container.js';\nimport { EventBus, createEventBus } from './events.js';\nimport { PluginManager, type RevenuePlugin, type PluginContext, type PluginLogger } from './plugin.js';\nimport { type Result, tryCatch } from './result.js';\nimport { IdempotencyManager, createIdempotencyManager } from '../utils/idempotency.js';\nimport { retry, type RetryConfig, CircuitBreaker, createCircuitBreaker } from '../utils/retry.js';\nimport { MonetizationService } from '../services/monetization.service.js';\nimport { PaymentService } from '../services/payment.service.js';\nimport { TransactionService } from '../services/transaction.service.js';\nimport { EscrowService } from '../services/escrow.service.js';\nimport { ConfigurationError } from './errors.js';\nimport { PaymentProvider } from '../providers/base.js';\nimport type { HooksRegistry, MongooseModel, PaymentProviderInterface } from '../types/index.js';\n\n// ============ TYPES ============\n\n/** Internal config for Revenue instance */\nexport interface InternalConfig {\n defaultCurrency: string;\n commissionRate: number;\n gatewayFeeRate: number;\n targetModels?: string[];\n categoryMappings?: Record<string, string>;\n}\n\nexport interface RevenueOptions {\n /** Default currency (ISO 4217) */\n defaultCurrency?: string;\n /** Environment */\n environment?: 'development' | 'staging' | 'production';\n /** Debug mode */\n debug?: boolean;\n /** Retry configuration */\n retry?: Partial<RetryConfig>;\n /** Idempotency TTL in ms */\n idempotencyTtl?: number;\n /** Enable circuit breaker */\n circuitBreaker?: boolean;\n /** Custom logger */\n logger?: PluginLogger;\n /** Commission rate (0-100) */\n commissionRate?: number;\n /** Gateway fee rate (0-100) */\n gatewayFeeRate?: number;\n}\n\nexport interface ModelsConfig {\n Transaction: MongooseModel<any>;\n Subscription?: MongooseModel<any>;\n [key: string]: MongooseModel<any> | undefined;\n}\n\nexport interface ProvidersConfig {\n [name: string]: PaymentProvider;\n}\n\ntype HookHandler = (data: unknown) => void | Promise<void>;\n\n/**\n * Hooks config accepted by the builder.\n *\n * At runtime, hooks are executed via the `HooksRegistry` shape (event -> handlers[]).\n * This type also accepts a legacy shorthand (event -> handler or handlers[]).\n */\nexport type HooksConfig = HooksRegistry | Record<string, HookHandler | HookHandler[] | undefined>;\n\n// ============ REVENUE CLASS ============\n\n/**\n * Revenue - Main entry point\n *\n * @example\n * ```typescript\n * const revenue = Revenue\n * .create({ defaultCurrency: 'USD' })\n * .withModels({ Transaction, Subscription })\n * .withProvider('stripe', new StripeProvider({ apiKey: '...' }))\n * .withProvider('manual', new ManualProvider())\n * .withPlugin(auditPlugin())\n * .build();\n *\n * // Access services directly\n * await revenue.monetization.create({ ... });\n * await revenue.payments.verify({ ... });\n *\n * // Or use events\n * revenue.on('payment.succeeded', (event) => { ... });\n * ```\n */\nexport class Revenue {\n // ============ CORE ============\n private readonly _container: Container;\n private readonly _events: EventBus;\n private readonly _plugins: PluginManager;\n private readonly _idempotency: IdempotencyManager;\n private readonly _circuitBreaker?: CircuitBreaker;\n private readonly _options: Required<RevenueOptions>;\n private readonly _logger: PluginLogger;\n private readonly _providers: ProvidersConfig;\n private readonly _config: InternalConfig;\n\n // ============ SERVICES ============\n /** Monetization service - purchases, subscriptions, free items */\n public readonly monetization: MonetizationService;\n /** Payment service - verify, refund, webhooks */\n public readonly payments: PaymentService;\n /** Transaction service - query, update transactions */\n public readonly transactions: TransactionService;\n /** Escrow service - hold, release, splits */\n public readonly escrow: EscrowService;\n\n private constructor(\n container: Container,\n events: EventBus,\n plugins: PluginManager,\n options: Required<RevenueOptions>,\n providers: ProvidersConfig,\n config: InternalConfig\n ) {\n this._container = container;\n this._events = events;\n this._plugins = plugins;\n this._options = options;\n this._logger = options.logger;\n this._providers = providers;\n this._config = config;\n\n // Initialize idempotency\n this._idempotency = createIdempotencyManager({\n ttl: options.idempotencyTtl,\n });\n\n // Initialize circuit breaker\n if (options.circuitBreaker) {\n this._circuitBreaker = createCircuitBreaker();\n }\n\n // Register utilities in container\n container.singleton('events', events);\n container.singleton('plugins', plugins);\n container.singleton('idempotency', this._idempotency);\n container.singleton('logger', this._logger);\n\n // Initialize services\n this.monetization = new MonetizationService(container);\n this.payments = new PaymentService(container);\n this.transactions = new TransactionService(container);\n this.escrow = new EscrowService(container);\n\n // Freeze for immutability\n Object.freeze(this._providers);\n Object.freeze(this._config);\n }\n\n // ============ STATIC FACTORY ============\n\n /**\n * Create a new Revenue builder\n *\n * @example\n * ```typescript\n * const revenue = Revenue\n * .create({ defaultCurrency: 'BDT' })\n * .withModels({ Transaction, Subscription })\n * .withProvider('manual', new ManualProvider())\n * .build();\n * ```\n */\n static create(options: RevenueOptions = {}): RevenueBuilder {\n return new RevenueBuilder(options);\n }\n\n // ============ ACCESSORS ============\n\n /** DI container (for advanced usage) */\n get container(): Container {\n return this._container;\n }\n\n /** Event bus */\n get events(): EventBus {\n return this._events;\n }\n\n /** Registered providers (frozen) */\n get providers(): Readonly<ProvidersConfig> {\n return this._providers;\n }\n\n /** Configuration (frozen) */\n get config(): Readonly<InternalConfig> {\n return this._config;\n }\n\n /** Default currency */\n get defaultCurrency(): string {\n return this._options.defaultCurrency;\n }\n\n /** Current environment */\n get environment(): string {\n return this._options.environment;\n }\n\n // ============ PROVIDER METHODS ============\n\n /**\n * Get a provider by name\n */\n getProvider(name: string): PaymentProviderInterface {\n const provider = this._providers[name];\n if (!provider) {\n throw new ConfigurationError(\n `Provider \"${name}\" not found. Available: ${Object.keys(this._providers).join(', ')}`\n );\n }\n return provider as PaymentProviderInterface;\n }\n\n /**\n * Get all provider names\n */\n getProviderNames(): string[] {\n return Object.keys(this._providers);\n }\n\n /**\n * Check if provider exists\n */\n hasProvider(name: string): boolean {\n return name in this._providers;\n }\n\n // ============ EVENT SYSTEM ============\n\n /**\n * Subscribe to events\n *\n * @example\n * ```typescript\n * revenue.on('payment.succeeded', (event) => {\n * console.log('Payment:', event.transactionId);\n * });\n * ```\n */\n on: EventBus['on'] = (event, handler) => {\n return this._events.on(event, handler);\n };\n\n /**\n * Subscribe once\n */\n once: EventBus['once'] = (event, handler) => {\n return this._events.once(event, handler);\n };\n\n /**\n * Unsubscribe\n */\n off: EventBus['off'] = (event, handler) => {\n this._events.off(event, handler);\n };\n\n /**\n * Emit an event\n */\n emit: EventBus['emit'] = (event, payload) => {\n this._events.emit(event, payload);\n };\n\n // ============ RESILIENCE ============\n\n /**\n * Execute operation with retry and idempotency\n */\n async execute<T>(\n operation: () => Promise<T>,\n options: {\n idempotencyKey?: string;\n params?: unknown;\n useRetry?: boolean;\n useCircuitBreaker?: boolean;\n } = {}\n ): Promise<Result<T, Error>> {\n const { idempotencyKey, params, useRetry = true, useCircuitBreaker = true } = options;\n\n // Wrap with idempotency if key provided\n const idempotentOp = async () => {\n if (idempotencyKey) {\n const result = await this._idempotency.execute(idempotencyKey, params, operation);\n if (!result.ok) throw result.error;\n return result.value;\n }\n return operation();\n };\n\n // Wrap with circuit breaker\n const resilientOp = async () => {\n if (useCircuitBreaker && this._circuitBreaker) {\n return this._circuitBreaker.execute(idempotentOp);\n }\n return idempotentOp();\n };\n\n // Wrap with retry\n if (useRetry && this._options.retry) {\n return tryCatch(() => retry(resilientOp, this._options.retry));\n }\n\n return tryCatch(resilientOp);\n }\n\n /**\n * Create plugin context (for advanced usage)\n */\n createContext(meta: { idempotencyKey?: string } = {}): PluginContext {\n return {\n events: this._events,\n logger: this._logger,\n get: <T>(key: string) => this._container.get<T>(key),\n storage: new Map(),\n meta: {\n ...meta,\n requestId: nanoid(12),\n timestamp: new Date(),\n },\n };\n }\n\n /**\n * Destroy instance and cleanup\n */\n async destroy(): Promise<void> {\n await this._plugins.destroy();\n this._events.clear();\n }\n}\n\n// ============ BUILDER ============\n\n/**\n * Revenue Builder - Fluent configuration API\n */\nexport class RevenueBuilder {\n private options: RevenueOptions;\n private models: ModelsConfig | null = null;\n private providers: ProvidersConfig = {};\n private plugins: RevenuePlugin[] = [];\n private hooks: HooksRegistry = {};\n private categoryMappings: Record<string, string> = {};\n\n constructor(options: RevenueOptions = {}) {\n this.options = options;\n }\n\n /**\n * Register models (required)\n *\n * @example\n * ```typescript\n * .withModels({\n * Transaction: TransactionModel,\n * Subscription: SubscriptionModel,\n * })\n * ```\n */\n withModels(models: ModelsConfig): this {\n this.models = models;\n return this;\n }\n\n /**\n * Register a single model\n */\n withModel(name: string, model: MongooseModel<any>): this {\n if (!this.models) {\n this.models = { Transaction: model } as ModelsConfig;\n }\n (this.models as any)[name] = model;\n return this;\n }\n\n /**\n * Register a payment provider\n *\n * @example\n * ```typescript\n * .withProvider('stripe', new StripeProvider({ apiKey: '...' }))\n * .withProvider('manual', new ManualProvider())\n * ```\n */\n withProvider(name: string, provider: PaymentProvider): this {\n this.providers[name] = provider;\n return this;\n }\n\n /**\n * Register multiple providers at once\n */\n withProviders(providers: ProvidersConfig): this {\n this.providers = { ...this.providers, ...providers };\n return this;\n }\n\n /**\n * Register a plugin\n *\n * @example\n * ```typescript\n * .withPlugin(loggingPlugin())\n * .withPlugin(auditPlugin({ store: saveToDb }))\n * ```\n */\n withPlugin(plugin: RevenuePlugin): this {\n this.plugins.push(plugin);\n return this;\n }\n\n /**\n * Register multiple plugins\n */\n withPlugins(plugins: RevenuePlugin[]): this {\n this.plugins.push(...plugins);\n return this;\n }\n\n /**\n * Register event hooks (for backward compatibility)\n *\n * @example\n * ```typescript\n * .withHooks({\n * onPaymentVerified: async (tx) => { ... },\n * onSubscriptionRenewed: async (sub) => { ... },\n * })\n * ```\n */\n withHooks(hooks: HooksRegistry): this;\n withHooks(hooks: HooksConfig): this;\n withHooks(hooks: HooksConfig): this {\n const normalized: HooksRegistry = {};\n\n for (const [event, handlerOrHandlers] of Object.entries(hooks)) {\n if (!handlerOrHandlers) continue;\n normalized[event] = Array.isArray(handlerOrHandlers) ? handlerOrHandlers : [handlerOrHandlers];\n }\n\n this.hooks = { ...this.hooks, ...normalized };\n return this;\n }\n\n /**\n * Set retry configuration\n *\n * @example\n * ```typescript\n * .withRetry({ maxAttempts: 5, baseDelay: 2000 })\n * ```\n */\n withRetry(config: Partial<RetryConfig>): this {\n this.options.retry = config;\n return this;\n }\n\n /**\n * Enable circuit breaker\n */\n withCircuitBreaker(enabled = true): this {\n this.options.circuitBreaker = enabled;\n return this;\n }\n\n /**\n * Set custom logger\n */\n withLogger(logger: PluginLogger): this {\n this.options.logger = logger;\n return this;\n }\n\n /**\n * Set environment\n */\n forEnvironment(env: 'development' | 'staging' | 'production'): this {\n this.options.environment = env;\n return this;\n }\n\n /**\n * Enable debug mode\n */\n withDebug(enabled = true): this {\n this.options.debug = enabled;\n return this;\n }\n\n /**\n * Set commission rate (0-100)\n */\n withCommission(rate: number, gatewayFeeRate = 0): this {\n this.options.commissionRate = rate;\n this.options.gatewayFeeRate = gatewayFeeRate;\n return this;\n }\n\n /**\n * Set category mappings (entity → category)\n *\n * @example\n * ```typescript\n * .withCategoryMappings({\n * PlatformSubscription: 'platform_subscription',\n * CourseEnrollment: 'course_enrollment',\n * ProductOrder: 'product_order',\n * })\n * ```\n */\n withCategoryMappings(mappings: Record<string, string>): this {\n this.categoryMappings = { ...this.categoryMappings, ...mappings };\n return this;\n }\n\n /**\n * Build the Revenue instance\n */\n build(): Revenue {\n // Validate required configuration\n if (!this.models) {\n throw new ConfigurationError(\n 'Models are required. Use .withModels({ Transaction, Subscription })'\n );\n }\n\n if (!this.models.Transaction) {\n throw new ConfigurationError(\n 'Transaction model is required in models configuration'\n );\n }\n\n if (Object.keys(this.providers).length === 0) {\n throw new ConfigurationError(\n 'At least one provider is required. Use .withProvider(name, provider)'\n );\n }\n\n // Create container\n const container = new Container();\n\n // Default logger\n const defaultLogger: PluginLogger = {\n debug: (msg, data) => this.options.debug && console.debug(`[Revenue] ${msg}`, data ?? ''),\n info: (msg, data) => console.info(`[Revenue] ${msg}`, data ?? ''),\n warn: (msg, data) => console.warn(`[Revenue] ${msg}`, data ?? ''),\n error: (msg, data) => console.error(`[Revenue] ${msg}`, data ?? ''),\n };\n\n // Resolve options with defaults\n const resolvedOptions: Required<RevenueOptions> = {\n defaultCurrency: this.options.defaultCurrency ?? 'USD',\n environment: this.options.environment ?? 'development',\n debug: this.options.debug ?? false,\n retry: this.options.retry ?? { maxAttempts: 3 },\n idempotencyTtl: this.options.idempotencyTtl ?? 24 * 60 * 60 * 1000,\n circuitBreaker: this.options.circuitBreaker ?? false,\n logger: this.options.logger ?? defaultLogger,\n commissionRate: this.options.commissionRate ?? 0,\n gatewayFeeRate: this.options.gatewayFeeRate ?? 0,\n };\n\n // Build config for services\n const config: InternalConfig = {\n defaultCurrency: resolvedOptions.defaultCurrency,\n commissionRate: resolvedOptions.commissionRate,\n gatewayFeeRate: resolvedOptions.gatewayFeeRate,\n categoryMappings: this.categoryMappings,\n };\n\n // Register in container (same format as legacy for service compatibility)\n container.singleton('models', this.models);\n container.singleton('providers', this.providers as Record<string, unknown>);\n container.singleton('hooks', this.hooks);\n container.singleton('config', config);\n\n // Create event bus\n const events = createEventBus();\n\n // Create plugin manager\n const pluginManager = new PluginManager();\n for (const plugin of this.plugins) {\n pluginManager.register(plugin);\n }\n\n // Create Revenue instance using private constructor access\n const revenue = new (Revenue as any)(\n container,\n events,\n pluginManager,\n resolvedOptions,\n this.providers,\n config\n );\n\n // Initialize plugins\n const ctx = revenue.createContext();\n pluginManager.init(ctx).catch((err: Error) => {\n resolvedOptions.logger.error('Failed to initialize plugins', err);\n });\n\n return revenue;\n }\n}\n\n// ============ FACTORY FUNCTION ============\n\n/**\n * Create Revenue instance (shorthand)\n *\n * @example\n * ```typescript\n * const revenue = createRevenue({\n * models: { Transaction, Subscription },\n * providers: { manual: new ManualProvider() },\n * });\n * ```\n */\nexport function createRevenue(config: {\n models: ModelsConfig;\n providers: ProvidersConfig;\n options?: RevenueOptions;\n plugins?: RevenuePlugin[];\n hooks?: HooksConfig;\n}): Revenue {\n let builder = Revenue.create(config.options);\n\n builder = builder.withModels(config.models);\n builder = builder.withProviders(config.providers);\n\n if (config.plugins) {\n builder = builder.withPlugins(config.plugins);\n }\n\n if (config.hooks) {\n builder = builder.withHooks(config.hooks);\n }\n\n return builder.build();\n}\n\nexport default Revenue;\n","/**\n * Money Utility - Integer-safe currency handling\n * @classytic/revenue\n *\n * Never use floating point for money!\n * All amounts stored as smallest unit (cents, paisa, etc.)\n * \n * Inspired by: Stripe, Dinero.js, tc39/proposal-decimal\n */\n\nexport interface MoneyValue {\n /** Amount in smallest currency unit (cents, paisa, etc.) */\n readonly amount: number;\n /** ISO 4217 currency code */\n readonly currency: string;\n}\n\n/** Currency configuration */\ninterface CurrencyConfig {\n code: string;\n decimals: number;\n symbol: string;\n name: string;\n}\n\n/** Supported currencies with their decimal places */\nconst CURRENCIES: Record<string, CurrencyConfig> = {\n USD: { code: 'USD', decimals: 2, symbol: '$', name: 'US Dollar' },\n EUR: { code: 'EUR', decimals: 2, symbol: '€', name: 'Euro' },\n GBP: { code: 'GBP', decimals: 2, symbol: '£', name: 'British Pound' },\n BDT: { code: 'BDT', decimals: 2, symbol: '৳', name: 'Bangladeshi Taka' },\n INR: { code: 'INR', decimals: 2, symbol: '₹', name: 'Indian Rupee' },\n JPY: { code: 'JPY', decimals: 0, symbol: '¥', name: 'Japanese Yen' },\n CNY: { code: 'CNY', decimals: 2, symbol: '¥', name: 'Chinese Yuan' },\n AED: { code: 'AED', decimals: 2, symbol: 'د.إ', name: 'UAE Dirham' },\n SAR: { code: 'SAR', decimals: 2, symbol: '﷼', name: 'Saudi Riyal' },\n SGD: { code: 'SGD', decimals: 2, symbol: 'S$', name: 'Singapore Dollar' },\n AUD: { code: 'AUD', decimals: 2, symbol: 'A$', name: 'Australian Dollar' },\n CAD: { code: 'CAD', decimals: 2, symbol: 'C$', name: 'Canadian Dollar' },\n};\n\n/**\n * Money class - immutable money representation\n */\nexport class Money implements MoneyValue {\n readonly amount: number;\n readonly currency: string;\n\n private constructor(amount: number, currency: string) {\n if (!Number.isInteger(amount)) {\n throw new Error(`Money amount must be integer (smallest unit). Got: ${amount}`);\n }\n this.amount = amount;\n this.currency = currency.toUpperCase();\n }\n\n // ============ FACTORY METHODS ============\n\n /**\n * Create money from smallest unit (cents, paisa)\n * @example Money.cents(1999, 'USD') // $19.99\n */\n static cents(amount: number, currency = 'USD'): Money {\n return new Money(Math.round(amount), currency);\n }\n\n /**\n * Create money from major unit (dollars, taka)\n * @example Money.of(19.99, 'USD') // $19.99 (stored as 1999 cents)\n */\n static of(amount: number, currency = 'USD'): Money {\n const config = CURRENCIES[currency.toUpperCase()] ?? { decimals: 2 };\n const multiplier = Math.pow(10, config.decimals);\n return new Money(Math.round(amount * multiplier), currency);\n }\n\n /**\n * Create zero money\n */\n static zero(currency = 'USD'): Money {\n return new Money(0, currency);\n }\n\n // ============ SHORTHAND FACTORIES ============\n\n static usd(cents: number): Money { return Money.cents(cents, 'USD'); }\n static eur(cents: number): Money { return Money.cents(cents, 'EUR'); }\n static gbp(pence: number): Money { return Money.cents(pence, 'GBP'); }\n static bdt(paisa: number): Money { return Money.cents(paisa, 'BDT'); }\n static inr(paisa: number): Money { return Money.cents(paisa, 'INR'); }\n static jpy(yen: number): Money { return Money.cents(yen, 'JPY'); }\n\n // ============ ARITHMETIC ============\n\n /**\n * Add two money values (must be same currency)\n */\n add(other: Money): Money {\n this.assertSameCurrency(other);\n return new Money(this.amount + other.amount, this.currency);\n }\n\n /**\n * Subtract money (must be same currency)\n */\n subtract(other: Money): Money {\n this.assertSameCurrency(other);\n return new Money(this.amount - other.amount, this.currency);\n }\n\n /**\n * Multiply by a factor (rounds to nearest integer)\n */\n multiply(factor: number): Money {\n return new Money(Math.round(this.amount * factor), this.currency);\n }\n\n /**\n * Divide by a divisor (rounds to nearest integer)\n */\n divide(divisor: number): Money {\n if (divisor === 0) throw new Error('Cannot divide by zero');\n return new Money(Math.round(this.amount / divisor), this.currency);\n }\n\n /**\n * Calculate percentage\n * @example money.percentage(10) // 10% of money\n */\n percentage(percent: number): Money {\n return this.multiply(percent / 100);\n }\n\n /**\n * Allocate money among recipients (handles rounding)\n * @example Money.usd(100).allocate([1, 1, 1]) // [34, 33, 33] cents\n */\n allocate(ratios: number[]): Money[] {\n const total = ratios.reduce((a, b) => a + b, 0);\n if (total === 0) throw new Error('Ratios must sum to more than 0');\n\n let remainder = this.amount;\n const results: Money[] = [];\n\n for (let i = 0; i < ratios.length; i++) {\n const share = Math.floor((this.amount * ratios[i]) / total);\n results.push(new Money(share, this.currency));\n remainder -= share;\n }\n\n // Distribute remainder (largest remainder method)\n for (let i = 0; i < remainder; i++) {\n results[i] = new Money(results[i].amount + 1, this.currency);\n }\n\n return results;\n }\n\n /**\n * Split equally among n recipients\n */\n split(parts: number): Money[] {\n return this.allocate(Array(parts).fill(1));\n }\n\n // ============ COMPARISON ============\n\n isZero(): boolean { return this.amount === 0; }\n isPositive(): boolean { return this.amount > 0; }\n isNegative(): boolean { return this.amount < 0; }\n \n equals(other: Money): boolean {\n return this.amount === other.amount && this.currency === other.currency;\n }\n\n greaterThan(other: Money): boolean {\n this.assertSameCurrency(other);\n return this.amount > other.amount;\n }\n\n lessThan(other: Money): boolean {\n this.assertSameCurrency(other);\n return this.amount < other.amount;\n }\n\n greaterThanOrEqual(other: Money): boolean {\n return this.greaterThan(other) || this.equals(other);\n }\n\n lessThanOrEqual(other: Money): boolean {\n return this.lessThan(other) || this.equals(other);\n }\n\n // ============ FORMATTING ============\n\n /**\n * Get amount in major unit (dollars, taka)\n */\n toUnit(): number {\n const config = CURRENCIES[this.currency] ?? { decimals: 2 };\n return this.amount / Math.pow(10, config.decimals);\n }\n\n /**\n * Format for display\n * @example Money.usd(1999).format() // \"$19.99\"\n */\n format(locale = 'en-US'): string {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: this.currency,\n }).format(this.toUnit());\n }\n\n /**\n * Format without currency symbol\n */\n formatAmount(locale = 'en-US'): string {\n const config = CURRENCIES[this.currency] ?? { decimals: 2 };\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: config.decimals,\n maximumFractionDigits: config.decimals,\n }).format(this.toUnit());\n }\n\n /**\n * Convert to JSON-serializable object\n */\n toJSON(): MoneyValue {\n return { amount: this.amount, currency: this.currency };\n }\n\n /**\n * Create from JSON\n */\n static fromJSON(json: MoneyValue): Money {\n return new Money(json.amount, json.currency);\n }\n\n toString(): string {\n return `${this.currency} ${this.amount}`;\n }\n\n // ============ HELPERS ============\n\n private assertSameCurrency(other: Money): void {\n if (this.currency !== other.currency) {\n throw new Error(\n `Currency mismatch: ${this.currency} vs ${other.currency}. Convert first.`\n );\n }\n }\n}\n\n/**\n * Helper functions for legacy compatibility\n */\nexport function toSmallestUnit(amount: number, currency = 'USD'): number {\n return Money.of(amount, currency).amount;\n}\n\nexport function fromSmallestUnit(amount: number, currency = 'USD'): number {\n return Money.cents(amount, currency).toUnit();\n}\n\nexport default Money;\n\n","/**\n * Zod Validation Schemas\n * @classytic/revenue\n *\n * Runtime validation with TypeScript inference\n * Using Zod v4 - Modern schema validation\n *\n * Inspired by: tRPC, Zod best practices\n */\n\nimport * as z from 'zod';\n\n// ============ PRIMITIVE SCHEMAS ============\n\n/**\n * MongoDB ObjectId pattern\n */\nexport const ObjectIdSchema = z.string().regex(\n /^[a-fA-F0-9]{24}$/,\n 'Invalid ObjectId format'\n);\n\n/**\n * Currency code (ISO 4217)\n */\nexport const CurrencySchema = z.string()\n .length(3, 'Currency must be 3 characters')\n .transform(val => val.toUpperCase())\n .default('USD');\n\n/**\n * Money amount in smallest unit (cents, paisa)\n */\nexport const MoneyAmountSchema = z.number()\n .int('Amount must be integer (smallest unit)')\n .nonnegative('Amount cannot be negative');\n\n/**\n * Money object\n */\nexport const MoneySchema = z.object({\n amount: MoneyAmountSchema,\n currency: z.string().length(3).default('USD'),\n});\n\n/**\n * Email address\n */\nexport const EmailSchema = z.string().email();\n\n/**\n * Idempotency key (optional, auto-generated if not provided)\n */\nexport const IdempotencyKeySchema = z.string()\n .min(1)\n .max(255)\n .optional();\n\n/**\n * Metadata object - Zod v4 record syntax\n */\nexport const MetadataSchema = z.record(z.string(), z.unknown()).optional().default({});\n\n// ============ PAYMENT SCHEMAS ============\n\n/**\n * Create payment intent params\n */\nexport const CreatePaymentSchema = z.object({\n /** Amount in smallest currency unit (cents) */\n amount: MoneyAmountSchema,\n /** ISO 4217 currency code */\n currency: z.string().length(3).default('USD'),\n /** Customer identifier */\n customerId: z.string().min(1, 'Customer ID is required'),\n /** Organization/merchant identifier */\n organizationId: z.string().min(1, 'Organization ID is required'),\n /** Payment provider to use */\n provider: z.string().min(1, 'Provider is required'),\n /** Idempotency key for safe retries */\n idempotencyKey: IdempotencyKeySchema,\n /** Description of the payment */\n description: z.string().optional(),\n /** Additional metadata */\n metadata: MetadataSchema,\n /** Success redirect URL */\n successUrl: z.string().url().optional(),\n /** Cancel redirect URL */\n cancelUrl: z.string().url().optional(),\n});\n\nexport type CreatePaymentInput = z.infer<typeof CreatePaymentSchema>;\n\n/**\n * Verify payment params\n */\nexport const VerifyPaymentSchema = z.object({\n /** Transaction ID or payment intent ID */\n id: z.string().min(1),\n /** Provider name (optional, auto-detected) */\n provider: z.string().optional(),\n /** Additional verification data */\n data: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type VerifyPaymentInput = z.infer<typeof VerifyPaymentSchema>;\n\n/**\n * Refund params\n */\nexport const RefundSchema = z.object({\n /** Transaction ID to refund */\n transactionId: z.string().min(1),\n /** Amount to refund (optional, full refund if not provided) */\n amount: MoneyAmountSchema.optional(),\n /** Reason for refund */\n reason: z.string().optional(),\n /** Idempotency key */\n idempotencyKey: IdempotencyKeySchema,\n /** Additional metadata */\n metadata: MetadataSchema,\n});\n\nexport type RefundInput = z.infer<typeof RefundSchema>;\n\n// ============ SUBSCRIPTION SCHEMAS ============\n\n/**\n * Subscription status\n */\nexport const SubscriptionStatusSchema = z.enum([\n 'pending',\n 'active',\n 'paused',\n 'cancelled',\n 'expired',\n 'past_due',\n]);\n\nexport type SubscriptionStatus = z.infer<typeof SubscriptionStatusSchema>;\n\n/**\n * Subscription interval\n */\nexport const IntervalSchema = z.enum([\n 'day',\n 'week',\n 'month',\n 'year',\n 'one_time',\n]);\n\nexport type Interval = z.infer<typeof IntervalSchema>;\n\n/**\n * Create subscription params\n */\nexport const CreateSubscriptionSchema = z.object({\n /** Customer ID */\n customerId: z.string().min(1),\n /** Organization ID */\n organizationId: z.string().min(1),\n /** Plan identifier */\n planKey: z.string().min(1),\n /** Amount per period (smallest unit) */\n amount: MoneyAmountSchema,\n /** Currency */\n currency: z.string().length(3).default('USD'),\n /** Billing interval */\n interval: IntervalSchema.default('month'),\n /** Interval count (e.g., 2 for bi-monthly) */\n intervalCount: z.number().int().positive().default(1),\n /** Payment provider */\n provider: z.string().min(1),\n /** Reference to external entity */\n referenceId: z.string().optional(),\n /** Reference model name */\n referenceModel: z.string().optional(),\n /** Idempotency key */\n idempotencyKey: IdempotencyKeySchema,\n /** Metadata */\n metadata: MetadataSchema,\n /** Trial period in days */\n trialDays: z.number().int().nonnegative().optional(),\n});\n\nexport type CreateSubscriptionInput = z.infer<typeof CreateSubscriptionSchema>;\n\n/**\n * Cancel subscription params\n */\nexport const CancelSubscriptionSchema = z.object({\n /** Subscription ID */\n subscriptionId: z.string().min(1),\n /** Cancel immediately or at period end */\n immediate: z.boolean().default(false),\n /** Cancellation reason */\n reason: z.string().optional(),\n});\n\nexport type CancelSubscriptionInput = z.infer<typeof CancelSubscriptionSchema>;\n\n// ============ MONETIZATION SCHEMAS ============\n\n/**\n * Monetization type\n */\nexport const MonetizationTypeSchema = z.enum([\n 'purchase',\n 'subscription',\n 'free',\n]);\n\nexport type MonetizationType = z.infer<typeof MonetizationTypeSchema>;\n\n/**\n * Create monetization params (unified API)\n */\nexport const CreateMonetizationSchema = z.object({\n /** Type of monetization */\n type: MonetizationTypeSchema.default('purchase'),\n /** Amount (smallest unit) - required for purchase/subscription */\n amount: MoneyAmountSchema.optional(),\n /** Currency */\n currency: z.string().length(3).default('USD'),\n /** Customer ID */\n customerId: z.string().min(1),\n /** Organization ID */\n organizationId: z.string().min(1),\n /** Payment provider */\n provider: z.string().min(1),\n /** Plan key for categorization */\n planKey: z.string().optional(),\n /** Reference ID */\n referenceId: z.string().optional(),\n /** Reference model */\n referenceModel: z.string().optional(),\n /** Idempotency key */\n idempotencyKey: IdempotencyKeySchema,\n /** Metadata */\n metadata: MetadataSchema,\n /** Subscription-specific: interval */\n interval: IntervalSchema.optional(),\n /** Subscription-specific: trial days */\n trialDays: z.number().int().nonnegative().optional(),\n}).refine(\n (data) => {\n if (data.type !== 'free' && !data.amount) {\n return false;\n }\n return true;\n },\n { message: 'Amount is required for non-free monetization types' }\n);\n\nexport type CreateMonetizationInput = z.infer<typeof CreateMonetizationSchema>;\n\n// ============ COMMISSION SCHEMAS ============\n\n/**\n * Commission split recipient\n */\nexport const SplitRecipientSchema = z.object({\n /** Recipient ID */\n recipientId: z.string().min(1),\n /** Recipient type (user, organization, etc.) */\n recipientType: z.string().default('user'),\n /** Percentage of net amount (0-100) */\n percentage: z.number().min(0).max(100),\n /** Role description */\n role: z.string().optional(),\n});\n\nexport type SplitRecipient = z.infer<typeof SplitRecipientSchema>;\n\n/**\n * Commission configuration\n */\nexport const CommissionConfigSchema = z.object({\n /** Platform commission rate (0-100) */\n platformRate: z.number().min(0).max(100).default(0),\n /** Gateway fee rate (0-100) */\n gatewayFeeRate: z.number().min(0).max(100).default(0),\n /** Fixed gateway fee (smallest unit) */\n gatewayFixedFee: MoneyAmountSchema.default(0),\n /** Split recipients */\n splits: z.array(SplitRecipientSchema).optional(),\n /** Affiliate configuration */\n affiliate: z.object({\n recipientId: z.string(),\n recipientType: z.string().default('user'),\n rate: z.number().min(0).max(100),\n }).optional(),\n});\n\nexport type CommissionConfig = z.infer<typeof CommissionConfigSchema>;\n\n// ============ ESCROW SCHEMAS ============\n\n/**\n * Hold status\n */\nexport const HoldStatusSchema = z.enum([\n 'none',\n 'held',\n 'partial_release',\n 'released',\n 'cancelled',\n]);\n\nexport type HoldStatus = z.infer<typeof HoldStatusSchema>;\n\n/**\n * Create hold params\n */\nexport const CreateHoldSchema = z.object({\n /** Transaction ID */\n transactionId: z.string().min(1),\n /** Hold amount (optional, defaults to full transaction amount) */\n amount: MoneyAmountSchema.optional(),\n /** Hold until date */\n holdUntil: z.date().optional(),\n /** Reason for hold */\n reason: z.string().optional(),\n});\n\nexport type CreateHoldInput = z.infer<typeof CreateHoldSchema>;\n\n/**\n * Release hold params\n */\nexport const ReleaseHoldSchema = z.object({\n /** Transaction ID */\n transactionId: z.string().min(1),\n /** Amount to release (optional, full release if not provided) */\n amount: MoneyAmountSchema.optional(),\n /** Recipient ID */\n recipientId: z.string().min(1),\n /** Recipient type */\n recipientType: z.string().default('user'),\n /** Release notes */\n notes: z.string().optional(),\n});\n\nexport type ReleaseHoldInput = z.infer<typeof ReleaseHoldSchema>;\n\n// ============ CONFIG SCHEMAS ============\n\n/**\n * Provider configuration\n */\nexport const ProviderConfigSchema = z.record(z.string(), z.unknown());\n\n/**\n * Retry configuration\n */\nexport const RetryConfigSchema = z.object({\n /** Maximum retry attempts */\n maxAttempts: z.number().int().positive().default(3),\n /** Base delay in ms */\n baseDelay: z.number().positive().default(1000),\n /** Maximum delay in ms */\n maxDelay: z.number().positive().default(30000),\n /** Backoff multiplier */\n backoffMultiplier: z.number().positive().default(2),\n /** Jitter factor (0-1) */\n jitter: z.number().min(0).max(1).default(0.1),\n});\n\nexport type RetryConfig = z.infer<typeof RetryConfigSchema>;\n\n/**\n * Revenue configuration\n */\nexport const RevenueConfigSchema = z.object({\n /** Default currency */\n defaultCurrency: z.string().length(3).default('USD'),\n /** Commission configuration */\n commission: CommissionConfigSchema.optional(),\n /** Retry configuration */\n retry: RetryConfigSchema.optional(),\n /** Enable debug logging */\n debug: z.boolean().default(false),\n /** Environment */\n environment: z.enum(['development', 'staging', 'production']).default('development'),\n});\n\nexport type RevenueConfigInput = z.infer<typeof RevenueConfigSchema>;\n\n// ============ VALIDATION HELPERS ============\n\n/**\n * Validate input against schema\n */\nexport function validate<T extends z.ZodType>(\n schema: T,\n data: unknown\n): z.infer<T> {\n return schema.parse(data);\n}\n\n/**\n * Safe validate (returns result, doesn't throw)\n */\nexport function safeValidate<T extends z.ZodType>(\n schema: T,\n data: unknown\n): { success: true; data: z.infer<T> } | { success: false; error: z.ZodError } {\n const result = schema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error };\n}\n\n/**\n * Format Zod error for display\n * Zod v4 uses `issues` property\n */\nexport function formatZodError(error: z.ZodError): string {\n return error.issues\n .map((issue) => `${issue.path.join('.')}: ${issue.message}`)\n .join(', ');\n}\n\nexport { z };\n","/**\n * Payment Enums\n * @classytic/revenue\n *\n * Library-managed payment enums only.\n * Users define their own payment methods in their schema.\n */\n\n// ============ PAYMENT STATUS ============\n/**\n * Payment Status - Library-managed states\n */\nexport const PAYMENT_STATUS = {\n PENDING: 'pending',\n VERIFIED: 'verified',\n FAILED: 'failed',\n REFUNDED: 'refunded',\n CANCELLED: 'cancelled',\n} as const;\n\nexport type PaymentStatus = typeof PAYMENT_STATUS;\nexport type PaymentStatusValue = PaymentStatus[keyof PaymentStatus];\nexport const PAYMENT_STATUS_VALUES = Object.values(PAYMENT_STATUS);\n\n// ============ PAYMENT GATEWAY TYPES ============\n/**\n * Common gateway type constants for convenience\n *\n * ⚠️ IMPORTANT: These are NOT restrictions - just common reference values\n *\n * You can register ANY custom gateway provider by passing it to createRevenue():\n *\n * @example\n * ```typescript\n * const revenue = createRevenue({\n * providers: {\n * manual: new ManualProvider(),\n * bkash: new BkashProvider(), // ✅ Custom gateway\n * nagad: new NagadProvider(), // ✅ Custom gateway\n * stripe: new StripeProvider(), // ✅ Custom gateway\n * paypal: new PaypalProvider(), // ✅ Any gateway you want\n * }\n * });\n *\n * // Use by name\n * await revenue.monetization.create({ gateway: 'bkash', ... });\n * ```\n *\n * Reference values:\n * - MANUAL: Built-in manual provider (@classytic/revenue-manual)\n * - STRIPE: Stripe provider (build with @classytic/revenue-stripe)\n * - SSLCOMMERZ: SSLCommerz provider (build with @classytic/revenue-sslcommerz)\n *\n * Add your own: bkash, nagad, rocket, paypal, razorpay, flutterwave, etc.\n */\nexport const PAYMENT_GATEWAY_TYPE = {\n MANUAL: 'manual',\n STRIPE: 'stripe',\n SSLCOMMERZ: 'sslcommerz',\n} as const;\n\nexport type PaymentGatewayType = typeof PAYMENT_GATEWAY_TYPE;\nexport type PaymentGatewayTypeValue = PaymentGatewayType[keyof PaymentGatewayType];\nexport const PAYMENT_GATEWAY_TYPE_VALUES = Object.values(PAYMENT_GATEWAY_TYPE);\n\n// Backward compatibility alias\nexport const GATEWAY_TYPES = PAYMENT_GATEWAY_TYPE;\nexport const GATEWAY_TYPE_VALUES = PAYMENT_GATEWAY_TYPE_VALUES;\n\n","/**\n * Subscription Enums\n * @classytic/revenue\n *\n * All subscription-related enums and constants\n */\n\n// ============ SUBSCRIPTION STATUS ============\n/**\n * Subscription Status\n */\nexport const SUBSCRIPTION_STATUS = {\n ACTIVE: 'active',\n PAUSED: 'paused',\n CANCELLED: 'cancelled',\n EXPIRED: 'expired',\n PENDING: 'pending',\n INACTIVE: 'inactive',\n} as const;\n\nexport type SubscriptionStatus = typeof SUBSCRIPTION_STATUS;\nexport type SubscriptionStatusValue = SubscriptionStatus[keyof SubscriptionStatus];\nexport const SUBSCRIPTION_STATUS_VALUES = Object.values(SUBSCRIPTION_STATUS);\n\n// ============ PLAN KEYS ============\n/**\n * Supported plan intervals\n */\nexport const PLAN_KEYS = {\n MONTHLY: 'monthly',\n QUARTERLY: 'quarterly',\n YEARLY: 'yearly',\n} as const;\n\nexport type PlanKeys = typeof PLAN_KEYS;\nexport type PlanKeyValue = PlanKeys[keyof PlanKeys];\nexport const PLAN_KEY_VALUES = Object.values(PLAN_KEYS);\n\n","/**\n * Common Transaction Schemas\n * @classytic/revenue\n *\n * Base schemas shared across transaction types\n */\n\nimport { Schema } from 'mongoose';\n\n/**\n * Base metadata schema for transactions\n */\nexport const baseMetadataSchema = new Schema(\n {\n // Flexible key-value metadata\n },\n { _id: false, strict: false }\n);\n\n/**\n * Reference schema for polymorphic associations\n */\nexport const referenceSchema = {\n referenceId: {\n type: Schema.Types.ObjectId,\n refPath: 'referenceModel',\n index: true,\n },\n referenceModel: {\n type: String,\n enum: ['Subscription', 'Order', 'Membership', 'Booking', 'Invoice'],\n },\n};\n\nexport default {\n baseMetadataSchema,\n referenceSchema,\n};\n\n","/**\n * Gateway Schema\n * @classytic/revenue\n *\n * Schema for payment gateway information\n */\n\nimport { Schema } from 'mongoose';\n\n/**\n * Gateway Schema - Embedded in Transaction\n * Tracks payment gateway details\n */\nexport const gatewaySchema = new Schema(\n {\n type: {\n type: String,\n required: true,\n index: true,\n },\n sessionId: {\n type: String,\n sparse: true,\n index: true,\n },\n paymentIntentId: {\n type: String,\n sparse: true,\n index: true,\n },\n provider: {\n type: String,\n },\n metadata: {\n type: Schema.Types.Mixed,\n default: {},\n },\n verificationData: {\n type: Schema.Types.Mixed,\n },\n },\n { _id: false }\n);\n\nexport default gatewaySchema;\n\n","/**\n * Payment Schemas for Transaction Model\n * @classytic/revenue\n *\n * Schemas for payment tracking in transactions\n */\n\nimport { Schema } from 'mongoose';\nimport {\n PAYMENT_STATUS_VALUES,\n} from '../../enums/index.js';\n\n/**\n * Current Payment Schema\n * Use this in your model: currentPayment: { type: currentPaymentSchema }\n *\n * Tracks the latest payment transaction for an entity\n */\nexport const currentPaymentSchema = new Schema(\n {\n transactionId: {\n type: Schema.Types.ObjectId,\n ref: 'Transaction',\n index: true,\n },\n amount: {\n type: Number,\n min: 0,\n },\n status: {\n type: String,\n enum: PAYMENT_STATUS_VALUES,\n default: 'pending',\n index: true,\n },\n method: {\n type: String,\n // Users define payment methods in their transaction model\n },\n reference: {\n type: String,\n trim: true,\n },\n verifiedAt: {\n type: Date,\n },\n verifiedBy: {\n type: Schema.Types.ObjectId,\n ref: 'User',\n },\n },\n { _id: false }\n);\n\n/**\n * Payment Summary Schema\n * Use this in your model: paymentSummary: { type: paymentSummarySchema }\n *\n * Tracks payment history and totals\n */\nexport const paymentSummarySchema = new Schema(\n {\n totalPayments: {\n type: Number,\n default: 0,\n min: 0,\n },\n totalAmountPaid: {\n type: Number,\n default: 0,\n min: 0,\n },\n lastPaymentDate: {\n type: Date,\n },\n lastPaymentAmount: {\n type: Number,\n min: 0,\n },\n },\n { _id: false }\n);\n\n/**\n * Payment Details Schema (for manual payments)\n * Embedded in Transaction model\n */\nexport const paymentDetailsSchema = new Schema(\n {\n provider: { type: String },\n walletNumber: { type: String },\n walletType: { type: String },\n trxId: { type: String },\n bankName: { type: String },\n accountNumber: { type: String },\n accountName: { type: String },\n proofUrl: { type: String },\n },\n { _id: false }\n);\n\n/**\n * Tenant Snapshot Schema\n * Captures organization payment details at transaction time (audit trail)\n */\nexport const tenantSnapshotSchema = new Schema(\n {\n paymentInstructions: { type: String },\n bkashNumber: { type: String },\n nagadNumber: { type: String },\n bankAccount: { type: String },\n },\n { _id: false }\n);\n\nexport default {\n currentPaymentSchema,\n paymentSummarySchema,\n paymentDetailsSchema,\n tenantSnapshotSchema,\n};\n\n","/**\n * Commission Schema\n * @classytic/revenue\n *\n * Schema for platform commission tracking\n * Embedded in Transaction model\n */\n\nimport { Schema } from 'mongoose';\n\n/**\n * Commission Schema - Embedded in Transaction\n * Tracks platform commission with gateway fee deduction\n *\n * Usage: commission: commissionSchema\n */\nexport const commissionSchema = new Schema(\n {\n // Commission rate (e.g., 0.10 for 10%)\n rate: {\n type: Number,\n min: 0,\n max: 1,\n },\n // Gross commission amount (before gateway fees)\n grossAmount: {\n type: Number,\n min: 0,\n },\n // Gateway fee rate (e.g., 0.029 for 2.9%)\n gatewayFeeRate: {\n type: Number,\n min: 0,\n max: 1,\n },\n // Gateway fee amount deducted from commission\n gatewayFeeAmount: {\n type: Number,\n min: 0,\n },\n // Net commission (grossAmount - gatewayFeeAmount)\n netAmount: {\n type: Number,\n min: 0,\n },\n // Commission status\n status: {\n type: String,\n enum: ['pending', 'paid', 'waived', 'reversed'],\n default: 'pending',\n },\n // For affiliate tracking\n affiliate: {\n recipientId: String,\n recipientType: {\n type: String,\n enum: ['user', 'organization', 'partner'],\n },\n rate: Number,\n grossAmount: Number,\n netAmount: Number,\n },\n // For multi-party splits\n splits: [\n {\n type: String,\n recipientId: String,\n rate: Number,\n grossAmount: Number,\n netAmount: Number,\n },\n ],\n },\n { _id: false }\n);\n\nexport default commissionSchema;\n\n","/**\n * Plan Schema\n * @classytic/revenue\n *\n * Schema for subscription plans\n */\n\nimport { Schema } from 'mongoose';\nimport { PLAN_KEY_VALUES } from '../../enums/subscription.enums.js';\n\n/**\n * Plan Schema - for defining subscription plans\n */\nexport const planSchema = new Schema(\n {\n key: {\n type: String,\n enum: PLAN_KEY_VALUES,\n required: true,\n },\n name: {\n type: String,\n required: true,\n },\n description: {\n type: String,\n },\n amount: {\n type: Number,\n required: true,\n min: 0,\n },\n currency: {\n type: String,\n default: 'BDT',\n },\n interval: {\n type: String,\n enum: ['day', 'week', 'month', 'year'],\n default: 'month',\n },\n intervalCount: {\n type: Number,\n default: 1,\n min: 1,\n },\n features: [\n {\n type: String,\n },\n ],\n metadata: {\n type: Schema.Types.Mixed,\n default: {},\n },\n isActive: {\n type: Boolean,\n default: true,\n },\n },\n { _id: false }\n);\n\nexport default planSchema;\n\n","/**\n * Subscription Info Schema\n * @classytic/revenue\n *\n * Schema for subscription information embedded in entities\n */\n\nimport { Schema } from 'mongoose';\nimport { SUBSCRIPTION_STATUS_VALUES, PLAN_KEY_VALUES } from '../../enums/subscription.enums.js';\n\n/**\n * Subscription Info Schema\n * Use this in your entity models that have subscriptions\n *\n * @example\n * const OrganizationSchema = new Schema({\n * name: String,\n * subscription: { type: subscriptionInfoSchema },\n * });\n */\nexport const subscriptionInfoSchema = new Schema(\n {\n planKey: {\n type: String,\n enum: PLAN_KEY_VALUES,\n required: true,\n },\n status: {\n type: String,\n enum: SUBSCRIPTION_STATUS_VALUES,\n default: 'pending',\n index: true,\n },\n isActive: {\n type: Boolean,\n default: false,\n index: true,\n },\n startDate: {\n type: Date,\n },\n endDate: {\n type: Date,\n index: true,\n },\n canceledAt: {\n type: Date,\n },\n cancelAt: {\n type: Date,\n },\n pausedAt: {\n type: Date,\n },\n lastPaymentDate: {\n type: Date,\n },\n lastPaymentAmount: {\n type: Number,\n },\n renewalCount: {\n type: Number,\n default: 0,\n },\n },\n { _id: false }\n);\n\nexport default subscriptionInfoSchema;\n\n","/**\n * Hold/Escrow Schema\n * @classytic/revenue\n *\n * Schema for platform-as-intermediary escrow flow\n * Spread into transaction schema when needed\n */\n\nimport { HOLD_STATUS, HOLD_STATUS_VALUES, HOLD_REASON_VALUES } from '../../enums/escrow.enums.js';\n\nexport const holdSchema = {\n status: {\n type: String,\n enum: HOLD_STATUS_VALUES,\n default: HOLD_STATUS.PENDING,\n index: true,\n },\n\n heldAmount: {\n type: Number,\n required: false,\n },\n\n releasedAmount: {\n type: Number,\n default: 0,\n },\n\n reason: {\n type: String,\n enum: HOLD_REASON_VALUES,\n required: false,\n },\n\n holdUntil: {\n type: Date,\n required: false,\n },\n\n heldAt: Date,\n releasedAt: Date,\n cancelledAt: Date,\n\n releases: [\n {\n amount: Number,\n recipientId: String,\n recipientType: String,\n releasedAt: Date,\n releasedBy: String,\n reason: String,\n metadata: Object,\n },\n ],\n\n metadata: {\n type: Object,\n default: {},\n },\n} as const;\n\nexport default holdSchema;\n\n","/**\n * Split Schema\n * @classytic/revenue\n *\n * Schema for multi-party commission splits\n */\n\nimport { Schema } from 'mongoose';\nimport {\n SPLIT_TYPE_VALUES,\n SPLIT_STATUS,\n SPLIT_STATUS_VALUES,\n PAYOUT_METHOD_VALUES,\n} from '../../enums/split.enums.js';\n\n/**\n * Split Schema - Embedded in Transaction\n */\nexport const splitSchema = new Schema(\n {\n type: {\n type: String,\n enum: SPLIT_TYPE_VALUES,\n required: true,\n },\n recipientId: {\n type: String,\n required: true,\n index: true,\n },\n recipientType: {\n type: String,\n enum: ['platform', 'organization', 'user', 'affiliate', 'partner'],\n required: true,\n },\n rate: {\n type: Number,\n required: true,\n min: 0,\n max: 1,\n },\n grossAmount: {\n type: Number,\n required: true,\n min: 0,\n },\n gatewayFeeRate: {\n type: Number,\n default: 0,\n min: 0,\n max: 1,\n },\n gatewayFeeAmount: {\n type: Number,\n default: 0,\n min: 0,\n },\n netAmount: {\n type: Number,\n required: true,\n min: 0,\n },\n status: {\n type: String,\n enum: SPLIT_STATUS_VALUES,\n default: SPLIT_STATUS.PENDING,\n index: true,\n },\n dueDate: {\n type: Date,\n },\n paidDate: {\n type: Date,\n },\n payoutMethod: {\n type: String,\n enum: PAYOUT_METHOD_VALUES,\n },\n payoutTransactionId: {\n type: String,\n },\n metadata: {\n type: Schema.Types.Mixed,\n default: {},\n },\n },\n { _id: false }\n);\n\nexport default splitSchema;\n\n","/**\n * Transaction Type Detection & Classification\n *\n * Distinguishes between:\n * - Monetization-managed transactions (library-controlled, strict rules)\n * - Manual admin transactions (flexible, admin-controlled)\n *\n * @module @classytic/revenue/utils/transaction-type\n */\n\nimport type {\n TransactionDocument,\n TransactionTypeOptions,\n FieldUpdateValidationResult,\n} from '../types/index.js';\n\n/**\n * Transaction types with different protection rules\n */\nexport const TRANSACTION_MANAGEMENT_TYPE = {\n MONETIZATION: 'monetization', // Library-managed (subscriptions, purchases)\n MANUAL: 'manual', // Admin-managed (expenses, income, adjustments)\n} as const;\n\nexport type TransactionManagementType = typeof TRANSACTION_MANAGEMENT_TYPE[keyof typeof TRANSACTION_MANAGEMENT_TYPE];\n\n/**\n * Default monetization categories\n * Users can extend this via config.categoryMappings\n */\nconst DEFAULT_MONETIZATION_CATEGORIES = [\n 'subscription',\n 'purchase',\n];\n\n/**\n * Check if category is monetization-related\n * @param category - Transaction category\n * @param additionalCategories - Additional categories from user config\n */\nfunction isMonetizationCategory(\n category: string,\n additionalCategories: string[] = []\n): boolean {\n const allCategories = [...DEFAULT_MONETIZATION_CATEGORIES, ...additionalCategories];\n return allCategories.includes(category);\n}\n\n/**\n * Check if transaction is monetization-managed\n *\n * Monetization-managed means:\n * - Created through subscription/purchase flows via the library\n * - Status controlled by payment webhooks/verification\n * - Amount/commission calculated by library\n * - Protected fields: status, amount, commission, gateway, verifiedAt, verifiedBy\n *\n * @param transaction - Transaction document or data\n * @param options - Options\n */\nexport function isMonetizationTransaction(\n transaction: Partial<TransactionDocument>,\n options: TransactionTypeOptions = {}\n): boolean {\n const {\n targetModels = ['Subscription', 'Membership'],\n additionalCategories = [],\n } = options;\n\n // Check 1: Has referenceModel from registered models\n if (transaction.referenceModel && targetModels.includes(transaction.referenceModel)) {\n return true;\n }\n\n // Check 2: Category is monetization-related\n if (transaction.category) {\n return isMonetizationCategory(transaction.category, additionalCategories);\n }\n\n return false;\n}\n\n/**\n * Check if transaction is manual admin transaction\n *\n * Manual transactions:\n * - Created directly by admins for operational expenses/income\n * - Can be self-verified by admins\n * - More flexible updates allowed\n * - No commission/gateway complexity\n *\n * @param transaction - Transaction document or data\n * @param options - Options (same as isMonetizationTransaction)\n */\nexport function isManualTransaction(\n transaction: Partial<TransactionDocument>,\n options: TransactionTypeOptions = {}\n): boolean {\n return !isMonetizationTransaction(transaction, options);\n}\n\n/**\n * Get transaction type\n *\n * @param transaction - Transaction document or data\n * @param options - Options (same as isMonetizationTransaction)\n */\nexport function getTransactionType(\n transaction: Partial<TransactionDocument>,\n options: TransactionTypeOptions = {}\n): TransactionManagementType {\n return isMonetizationTransaction(transaction, options)\n ? TRANSACTION_MANAGEMENT_TYPE.MONETIZATION\n : TRANSACTION_MANAGEMENT_TYPE.MANUAL;\n}\n\n/**\n * Protected fields for monetization transactions\n * These fields cannot be updated directly by admins\n */\nexport const PROTECTED_MONETIZATION_FIELDS = [\n 'status',\n 'amount',\n 'platformCommission',\n 'netAmount',\n 'verifiedAt',\n 'verifiedBy',\n 'gateway',\n 'webhook',\n 'metadata.commission',\n 'metadata.gateway',\n 'type',\n 'category',\n 'referenceModel',\n 'referenceId',\n] as const;\n\n/**\n * Editable fields for monetization transactions (before verification)\n * These fields can be updated by frontend/customer before payment is verified\n */\nexport const EDITABLE_MONETIZATION_FIELDS_PRE_VERIFICATION = [\n 'reference',\n 'paymentDetails',\n 'notes',\n] as const;\n\n/**\n * Allowed fields for manual transaction creation\n */\nexport const MANUAL_TRANSACTION_CREATE_FIELDS = [\n 'organizationId',\n 'type',\n 'category',\n 'amount',\n 'method',\n 'reference',\n 'paymentDetails',\n 'notes',\n 'date', // Transaction date (can be backdated)\n 'description',\n] as const;\n\n/**\n * Allowed fields for manual transaction updates\n */\nexport const MANUAL_TRANSACTION_UPDATE_FIELDS = [\n 'amount',\n 'method',\n 'reference',\n 'paymentDetails',\n 'notes',\n 'date',\n 'description',\n] as const;\n\n/**\n * Get allowed update fields based on transaction type and status\n *\n * @param transaction - Transaction document\n * @param options - Options for transaction type detection\n */\nexport function getAllowedUpdateFields(\n transaction: Partial<TransactionDocument>,\n options: TransactionTypeOptions = {}\n): readonly string[] {\n const type = getTransactionType(transaction, options);\n\n if (type === TRANSACTION_MANAGEMENT_TYPE.MONETIZATION) {\n // Monetization transactions: only allow pre-verification edits\n if (transaction.status === 'pending') {\n return EDITABLE_MONETIZATION_FIELDS_PRE_VERIFICATION;\n }\n // After verification, no direct updates allowed\n return [];\n }\n\n // Manual transactions: more flexible\n if (transaction.status === 'verified' || transaction.status === 'completed') {\n // Once verified/completed, only notes can be updated\n return ['notes'];\n }\n\n // Pending manual transactions can be fully edited\n return MANUAL_TRANSACTION_UPDATE_FIELDS;\n}\n\n/**\n * Validate if field update is allowed\n *\n * @param transaction - Transaction document\n * @param fieldName - Field being updated\n * @param options - Options for transaction type detection\n */\nexport function validateFieldUpdate(\n transaction: Partial<TransactionDocument>,\n fieldName: string,\n options: TransactionTypeOptions = {}\n): FieldUpdateValidationResult {\n const allowedFields = getAllowedUpdateFields(transaction, options);\n\n if (allowedFields.includes(fieldName)) {\n return { allowed: true };\n }\n\n const type = getTransactionType(transaction, options);\n\n if (type === TRANSACTION_MANAGEMENT_TYPE.MONETIZATION) {\n if ((PROTECTED_MONETIZATION_FIELDS as readonly string[]).includes(fieldName)) {\n return {\n allowed: false,\n reason: `Field \"${fieldName}\" is protected for monetization transactions. Updates must go through payment flow.`,\n };\n }\n }\n\n return {\n allowed: false,\n reason: `Field \"${fieldName}\" cannot be updated for ${transaction.status} transactions.`,\n };\n}\n\n/**\n * Check if transaction can be self-verified by admin\n *\n * @param transaction - Transaction document\n * @param options - Options for transaction type detection\n */\nexport function canSelfVerify(\n transaction: Partial<TransactionDocument>,\n options: TransactionTypeOptions = {}\n): boolean {\n const type = getTransactionType(transaction, options);\n\n // Only manual transactions can be self-verified\n if (type === TRANSACTION_MANAGEMENT_TYPE.MANUAL) {\n return transaction.status === 'pending';\n }\n\n return false;\n}\n\nexport default {\n TRANSACTION_MANAGEMENT_TYPE,\n isMonetizationTransaction,\n isManualTransaction,\n getTransactionType,\n PROTECTED_MONETIZATION_FIELDS,\n EDITABLE_MONETIZATION_FIELDS_PRE_VERIFICATION,\n MANUAL_TRANSACTION_CREATE_FIELDS,\n MANUAL_TRANSACTION_UPDATE_FIELDS,\n getAllowedUpdateFields,\n validateFieldUpdate,\n canSelfVerify,\n};\n\n","/**\n * Logger Abstraction for Monetization Library\n *\n * Defaults to console for standalone usage\n * Can be overridden with custom logger (pino, winston, etc)\n *\n * Usage:\n * ```typescript\n * import { setLogger } from '@classytic/revenue';\n *\n * // Optional: Use your own logger\n * setLogger(myPinoLogger);\n * ```\n */\n\nimport type { Logger } from '../types/index.js';\n\nlet _logger: Logger = console;\n\n/**\n * Set custom logger implementation\n * @param customLogger - Logger instance with info, warn, error, debug methods\n */\nexport function setLogger(customLogger: Logger): void {\n _logger = customLogger;\n}\n\n/**\n * Logger proxy - delegates to current logger implementation\n */\nexport const logger: Logger = {\n info: (...args: unknown[]): void => {\n (_logger.info ?? _logger.log)?.call(_logger, ...args);\n },\n warn: (...args: unknown[]): void => {\n (_logger.warn ?? _logger.log)?.call(_logger, 'WARN:', ...args);\n },\n error: (...args: unknown[]): void => {\n (_logger.error ?? _logger.log)?.call(_logger, 'ERROR:', ...args);\n },\n debug: (...args: unknown[]): void => {\n (_logger.debug ?? _logger.log)?.call(_logger, 'DEBUG:', ...args);\n },\n};\n\nexport default logger;\n\n","/**\n * Subscription Period Utilities\n * @classytic/revenue/utils/subscription\n *\n * Universal period calculation, proration, and date utilities\n */\n\nimport type {\n PeriodRangeParams,\n PeriodRangeResult,\n ProratedAmountParams,\n DurationResult,\n} from '../../types/index.js';\n\nexport type DurationUnit = 'days' | 'day' | 'weeks' | 'week' | 'months' | 'month' | 'years' | 'year';\n\n/**\n * Add duration to date\n */\nexport function addDuration(\n startDate: Date,\n duration: number,\n unit: DurationUnit = 'days'\n): Date {\n const date = new Date(startDate);\n\n switch (unit) {\n case 'months':\n case 'month':\n date.setMonth(date.getMonth() + duration);\n return date;\n case 'years':\n case 'year':\n date.setFullYear(date.getFullYear() + duration);\n return date;\n case 'weeks':\n case 'week':\n date.setDate(date.getDate() + (duration * 7));\n return date;\n case 'days':\n case 'day':\n default:\n date.setDate(date.getDate() + duration);\n return date;\n }\n}\n\n/**\n * Calculate subscription period start/end dates\n */\nexport function calculatePeriodRange(params: PeriodRangeParams): PeriodRangeResult {\n const {\n currentEndDate = null,\n startDate = null,\n duration,\n unit = 'days',\n now = new Date(),\n } = params;\n\n let periodStart: Date;\n\n if (startDate) {\n periodStart = new Date(startDate);\n } else if (currentEndDate) {\n const end = new Date(currentEndDate);\n periodStart = end > now ? end : now;\n } else {\n periodStart = now;\n }\n\n const periodEnd = addDuration(periodStart, duration, unit as DurationUnit);\n\n return { startDate: periodStart, endDate: periodEnd };\n}\n\n/**\n * Calculate prorated refund amount for unused period\n */\nexport function calculateProratedAmount(params: ProratedAmountParams): number {\n const {\n amountPaid,\n startDate,\n endDate,\n asOfDate = new Date(),\n precision = 2,\n } = params;\n\n if (!amountPaid || amountPaid <= 0) return 0;\n\n const start = new Date(startDate);\n const end = new Date(endDate);\n const asOf = new Date(asOfDate);\n\n const totalMs = end.getTime() - start.getTime();\n if (totalMs <= 0) return 0;\n\n const remainingMs = Math.max(0, end.getTime() - asOf.getTime());\n if (remainingMs <= 0) return 0;\n\n const ratio = remainingMs / totalMs;\n const amount = amountPaid * ratio;\n\n const factor = 10 ** precision;\n return Math.round(amount * factor) / factor;\n}\n\n/**\n * Convert interval + count to duration/unit\n */\nexport function resolveIntervalToDuration(\n interval: string = 'month',\n intervalCount: number = 1\n): DurationResult {\n const normalized = (interval || 'month').toLowerCase();\n const count = Number(intervalCount) > 0 ? Number(intervalCount) : 1;\n\n switch (normalized) {\n case 'year':\n case 'years':\n return { duration: count, unit: 'years' };\n case 'week':\n case 'weeks':\n return { duration: count, unit: 'weeks' };\n case 'quarter':\n case 'quarters':\n return { duration: count * 3, unit: 'months' };\n case 'day':\n case 'days':\n return { duration: count, unit: 'days' };\n case 'month':\n case 'months':\n default:\n return { duration: count, unit: 'months' };\n }\n}\n\nexport default {\n addDuration,\n calculatePeriodRange,\n calculateProratedAmount,\n resolveIntervalToDuration,\n};\n\n","/**\n * Subscription Action Utilities\n * @classytic/revenue/utils/subscription\n *\n * Eligibility checks for subscription actions\n */\n\nimport { SUBSCRIPTION_STATUS } from '../../enums/subscription.enums.js';\nimport type { SubscriptionEntity, SubscriptionDocument } from '../../types/index.js';\n\n/**\n * Check if subscription is active\n */\nexport function isSubscriptionActive(\n subscription: Partial<SubscriptionDocument> | null | undefined\n): boolean {\n if (!subscription) return false;\n if (!subscription.isActive) return false;\n\n if (subscription.endDate) {\n const now = new Date();\n const endDate = new Date(subscription.endDate);\n if (endDate < now) return false;\n }\n\n return true;\n}\n\n/**\n * Check if can renew\n */\nexport function canRenewSubscription(entity: SubscriptionEntity | null | undefined): boolean {\n if (!entity?.subscription) return false;\n return isSubscriptionActive(entity.subscription as Partial<SubscriptionDocument>);\n}\n\n/**\n * Check if can cancel\n */\nexport function canCancelSubscription(entity: SubscriptionEntity | null | undefined): boolean {\n if (!entity?.subscription) return false;\n if (!isSubscriptionActive(entity.subscription as Partial<SubscriptionDocument>)) return false;\n return !entity.subscription.canceledAt;\n}\n\n/**\n * Check if can pause\n */\nexport function canPauseSubscription(entity: SubscriptionEntity | null | undefined): boolean {\n if (!entity?.subscription) return false;\n if (entity.status === SUBSCRIPTION_STATUS.PAUSED) return false;\n if (entity.status === SUBSCRIPTION_STATUS.CANCELLED) return false;\n return isSubscriptionActive(entity.subscription as Partial<SubscriptionDocument>);\n}\n\n/**\n * Check if can resume\n */\nexport function canResumeSubscription(entity: SubscriptionEntity | null | undefined): boolean {\n if (!entity?.subscription) return false;\n return entity.status === SUBSCRIPTION_STATUS.PAUSED;\n}\n\nexport default {\n isSubscriptionActive,\n canRenewSubscription,\n canCancelSubscription,\n canPauseSubscription,\n canResumeSubscription,\n};\n\n","/**\n * @classytic/revenue\n * Enterprise Revenue Management System\n *\n * Modern • Type-safe • Resilient • Composable\n *\n * @version 1.0.0\n * @author Classytic\n * @license MIT\n */\n\n// ============ MAIN API ============\nexport {\n Revenue,\n RevenueBuilder,\n createRevenue,\n type RevenueOptions,\n type ModelsConfig,\n type ProvidersConfig,\n type HooksConfig,\n} from './core/revenue.js';\n\n// ============ CONTAINER (ADVANCED) ============\nexport { Container } from './core/container.js';\n\n// ============ RESULT TYPE (RUST-INSPIRED) ============\nexport {\n Result,\n ok,\n err,\n isOk,\n isErr,\n unwrap,\n unwrapOr,\n map,\n mapErr,\n flatMap,\n tryCatch,\n tryCatchSync,\n all,\n match,\n type Ok,\n type Err,\n} from './core/result.js';\n\n// ============ MONEY UTILITY ============\nexport {\n Money,\n toSmallestUnit,\n fromSmallestUnit,\n type MoneyValue,\n} from './utils/money.js';\n\n// ============ EVENT SYSTEM ============\nexport {\n EventBus,\n createEventBus,\n type RevenueEvents,\n type BaseEvent,\n type PaymentSucceededEvent,\n type PaymentFailedEvent,\n type PaymentRefundedEvent,\n type SubscriptionCreatedEvent,\n type SubscriptionActivatedEvent,\n type SubscriptionRenewedEvent,\n type SubscriptionCancelledEvent,\n type TransactionCreatedEvent,\n type TransactionVerifiedEvent,\n type EscrowHeldEvent,\n type EscrowReleasedEvent,\n} from './core/events.js';\n\n// ============ PLUGIN SYSTEM ============\nexport {\n PluginManager,\n loggingPlugin,\n auditPlugin,\n metricsPlugin,\n definePlugin,\n type RevenuePlugin,\n type PluginContext,\n type PluginLogger,\n type PluginHooks,\n} from './core/plugin.js';\n\n// ============ VALIDATION (ZOD V4) ============\nexport {\n // Primitive schemas\n ObjectIdSchema,\n CurrencySchema,\n MoneyAmountSchema,\n MoneySchema,\n EmailSchema,\n IdempotencyKeySchema,\n MetadataSchema,\n // Payment schemas\n CreatePaymentSchema,\n VerifyPaymentSchema,\n RefundSchema,\n // Subscription schemas\n SubscriptionStatusSchema,\n IntervalSchema,\n CreateSubscriptionSchema,\n CancelSubscriptionSchema,\n // Monetization schemas\n MonetizationTypeSchema,\n CreateMonetizationSchema,\n // Commission schemas\n SplitRecipientSchema,\n CommissionConfigSchema,\n // Escrow schemas\n HoldStatusSchema,\n CreateHoldSchema,\n ReleaseHoldSchema,\n // Config schemas\n ProviderConfigSchema,\n RetryConfigSchema,\n RevenueConfigSchema,\n // Helpers\n validate,\n safeValidate,\n formatZodError,\n z,\n // Types\n type CreatePaymentInput,\n type VerifyPaymentInput,\n type RefundInput,\n type SubscriptionStatus,\n type Interval,\n type CreateSubscriptionInput,\n type CancelSubscriptionInput,\n type MonetizationType,\n type SplitRecipient,\n type CommissionConfig,\n type HoldStatus,\n type CreateHoldInput,\n type ReleaseHoldInput,\n type RetryConfig,\n type RevenueConfigInput,\n} from './schemas/validation.js';\n\n// ============ RESILIENCE UTILITIES ============\nexport {\n retry,\n retryWithResult,\n calculateDelay,\n isRetryableError,\n RetryExhaustedError,\n CircuitBreaker,\n createCircuitBreaker,\n CircuitOpenError,\n resilientExecute,\n type CircuitState,\n type CircuitBreakerConfig,\n} from './utils/retry.js';\n\n// ============ IDEMPOTENCY ============\nexport {\n IdempotencyManager,\n MemoryIdempotencyStore,\n IdempotencyError,\n createIdempotencyManager,\n type IdempotencyRecord,\n type IdempotencyStore,\n type IdempotencyConfig,\n} from './utils/idempotency.js';\n\n// ============ ERROR CLASSES ============\nexport * from './core/errors.js';\n\n// ============ PROVIDER SYSTEM ============\nexport {\n PaymentProvider,\n PaymentIntent,\n PaymentResult,\n RefundResult,\n WebhookEvent,\n} from './providers/base.js';\n\n// ============ SERVICES (DIRECT ACCESS IF NEEDED) ============\nexport { MonetizationService } from './services/monetization.service.js';\nexport { PaymentService } from './services/payment.service.js';\nexport { TransactionService } from './services/transaction.service.js';\nexport { EscrowService } from './services/escrow.service.js';\n\n// ============ ENUMS & MONGOOSE SCHEMAS ============\nexport * from './enums/index.js';\nexport * from './schemas/index.js';\n\n// ============ UTILITIES ============\nexport {\n logger,\n setLogger,\n calculateCommission,\n reverseCommission,\n calculateSplits,\n calculateOrganizationPayout,\n reverseSplits,\n calculateCommissionWithSplits,\n resolveCategory,\n isCategoryValid,\n isMonetizationTransaction,\n isManualTransaction,\n getTransactionType,\n getAllowedUpdateFields,\n validateFieldUpdate,\n canSelfVerify,\n TRANSACTION_MANAGEMENT_TYPE,\n PROTECTED_MONETIZATION_FIELDS,\n EDITABLE_MONETIZATION_FIELDS_PRE_VERIFICATION,\n MANUAL_TRANSACTION_CREATE_FIELDS,\n MANUAL_TRANSACTION_UPDATE_FIELDS,\n addDuration,\n calculatePeriodRange,\n calculateProratedAmount,\n resolveIntervalToDuration,\n isSubscriptionActive,\n canRenewSubscription,\n canCancelSubscription,\n canPauseSubscription,\n canResumeSubscription,\n} from './utils/index.js';\n\n// ============ TYPE EXPORTS ============\nexport type {\n // Core types\n ObjectId,\n MongooseDoc,\n MongooseModel,\n // Transaction types\n TransactionStatusValue,\n TransactionTypeValue,\n TransactionGateway,\n CommissionInfo,\n WebhookInfo,\n HoldInfo,\n ReleaseRecord,\n TransactionDocument,\n // Subscription types\n SubscriptionStatusValue,\n PlanKeyValue,\n SubscriptionDocument,\n // Payment types\n PaymentStatusValue,\n PaymentGatewayTypeValue,\n // Monetization types\n MonetizationTypeValue,\n // Escrow types\n HoldStatusValue,\n HoldReasonValue,\n ReleaseReasonValue,\n // Split types\n SplitTypeValue,\n SplitStatusValue,\n PayoutMethodValue,\n SplitRule,\n SplitInfo,\n // Provider types\n CreateIntentParams,\n PaymentIntentData,\n PaymentResultData,\n RefundResultData,\n WebhookEventData,\n ProviderCapabilities,\n PaymentProviderInterface,\n // Config types\n ModelsRegistry,\n ProvidersRegistry,\n HooksRegistry,\n Logger,\n RevenueConfig,\n CreateRevenueOptions,\n // Service param types\n MonetizationData,\n MonetizationCreateParams,\n MonetizationCreateResult,\n ActivateOptions,\n RenewalParams,\n CancelOptions,\n PauseOptions,\n ResumeOptions,\n ListOptions,\n PaymentVerifyOptions,\n PaymentVerifyResult,\n PaymentStatusResult,\n RefundOptions,\n PaymentRefundResult,\n WebhookResult,\n TransactionListResult,\n HoldOptions,\n ReleaseOptions,\n ReleaseResult,\n CancelHoldOptions,\n SplitResult,\n EscrowStatusResult,\n // Utility types\n PeriodRangeParams,\n PeriodRangeResult,\n ProratedAmountParams,\n DurationResult,\n SubscriptionEntity,\n CommissionWithSplitsOptions,\n TransactionTypeOptions,\n FieldUpdateValidationResult,\n} from './types/index.js';\n\n// ============ DEFAULT EXPORT ============\nimport { Revenue, createRevenue } from './core/revenue.js';\nimport { PaymentProvider } from './providers/base.js';\nimport { RevenueError } from './core/errors.js';\nimport { Money } from './utils/money.js';\nimport { Result } from './core/result.js';\nimport { EventBus } from './core/events.js';\n\nexport default {\n Revenue,\n createRevenue,\n PaymentProvider,\n RevenueError,\n Money,\n Result,\n EventBus,\n};\n"]}
|