@alexasomba/better-auth-paystack 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,258 @@
1
+ import { GenericEndpointContext, Session, User } from "better-auth";
2
+ import { PaystackCustomerClient, PaystackPlanClient, PaystackProductClient, PaystackSubscriptionClient, PaystackTransactionClient, PaystackWebhookEvent, components } from "@alexasomba/paystack-node";
3
+ //#region src/types.d.ts
4
+ type PaystackCheckoutChannel = "card" | "bank" | "ussd" | "qr" | "mobile_money" | "bank_transfer" | "eft" | "apple_pay";
5
+ /**
6
+ * Custom models for Paystack Plugin
7
+ * These align with the database schema in src/schema.ts
8
+ */
9
+ interface PaystackTransaction {
10
+ id: string;
11
+ reference: string;
12
+ paystackId?: string;
13
+ referenceId: string;
14
+ userId: string;
15
+ amount: number;
16
+ currency: string;
17
+ status: string;
18
+ plan?: string | null;
19
+ product?: string | null;
20
+ metadata?: string | null;
21
+ createdAt: Date;
22
+ updatedAt: Date;
23
+ }
24
+ interface PaystackProduct {
25
+ id?: string;
26
+ name: string;
27
+ description?: string;
28
+ price: number;
29
+ currency: string;
30
+ quantity?: number;
31
+ unlimited?: boolean;
32
+ paystackId?: string;
33
+ slug?: string;
34
+ metadata?: string | null;
35
+ createdAt: Date;
36
+ updatedAt: Date;
37
+ }
38
+ interface PaystackPlan {
39
+ id?: string;
40
+ name: string;
41
+ description?: string;
42
+ amount?: number;
43
+ currency?: string;
44
+ interval?: string;
45
+ planCode?: string;
46
+ paystackId?: string;
47
+ seatAmount?: number;
48
+ /**
49
+ * Deprecated legacy alias for `seatAmount`.
50
+ * If used, it must still be a numeric amount in the smallest currency unit.
51
+ */
52
+ seatPriceId?: number | string;
53
+ seatPlanCode?: string;
54
+ invoiceLimit?: number;
55
+ freeTrial?: {
56
+ days?: number;
57
+ onTrialStart?: (subscription: Subscription) => Promise<void>;
58
+ };
59
+ limits?: Record<string, unknown>;
60
+ features?: string[];
61
+ metadata?: string | null;
62
+ createdAt?: Date;
63
+ updatedAt?: Date;
64
+ }
65
+ /**
66
+ * Paystack Webhook Payload structure
67
+ */
68
+ type PaystackWebhookPayload = PaystackWebhookEvent;
69
+ /**
70
+ * Paystack SDK Result types
71
+ */
72
+ type PaystackTransactionResponse = components["schemas"]["VerifyResponse"]["data"];
73
+ interface SubscriptionOptions {
74
+ /**
75
+ * Enable subscriptions
76
+ */
77
+ enabled?: boolean;
78
+ /**
79
+ * Plans configuration
80
+ */
81
+ plans: PaystackPlan[] | (() => Promise<PaystackPlan[]>);
82
+ /**
83
+ * Automatically sync quantity from local DB to Paystack (if seats are used)
84
+ */
85
+ autoSyncQuantity?: boolean;
86
+ /**
87
+ * Handling of subscription cancellation
88
+ * @default "at_period_end"
89
+ */
90
+ cancelBehavior?: "at_period_end" | "immediately";
91
+ /**
92
+ * Handlers for subscription events
93
+ */
94
+ onSubscriptionComplete?: (data: {
95
+ event: PaystackWebhookPayload;
96
+ subscription: Subscription;
97
+ plan: PaystackPlan;
98
+ }, ctx: GenericEndpointContext) => Promise<void>;
99
+ onSubscriptionCreated?: (data: {
100
+ event: PaystackWebhookPayload;
101
+ subscription: Subscription;
102
+ plan: PaystackPlan;
103
+ }, ctx: GenericEndpointContext) => Promise<void>;
104
+ onSubscriptionCancel?: (data: {
105
+ event: PaystackWebhookPayload;
106
+ subscription: Subscription;
107
+ }, ctx: GenericEndpointContext) => Promise<void>;
108
+ /**
109
+ * Authorization handler for reference checks
110
+ */
111
+ authorizeReference?: (data: {
112
+ user: User;
113
+ session: Session;
114
+ referenceId: string;
115
+ action: string;
116
+ }, ctx: GenericEndpointContext) => Promise<boolean>;
117
+ /**
118
+ * Require email verification before subscription
119
+ */
120
+ requireEmailVerification?: boolean;
121
+ /**
122
+ * Restrict checkout to specific Paystack channels for subscription flows.
123
+ * Use `["card"]` to enforce card-only subscriptions.
124
+ */
125
+ allowedPaymentChannels?: PaystackCheckoutChannel[];
126
+ }
127
+ interface PaystackOptions<TPaystackClient extends PaystackClientLike = PaystackClientLike> {
128
+ /**
129
+ * Paystack Secret Key
130
+ */
131
+ secretKey: string;
132
+ /**
133
+ * Deprecated alias for `webhook.secret`.
134
+ * Use `webhook.secret` for new code.
135
+ */
136
+ paystackWebhookSecret?: string;
137
+ /**
138
+ * Paystack Client Instance
139
+ * If provided, will be used instead of creating a new one with secretKey
140
+ */
141
+ paystackClient?: TPaystackClient;
142
+ /**
143
+ * Webhook configuration
144
+ */
145
+ webhook?: {
146
+ /**
147
+ * Webhook secret for signature verification
148
+ */
149
+ secret?: string;
150
+ /**
151
+ * Whether to verify the request origin IP address
152
+ * @default false
153
+ */
154
+ verifyIP?: boolean;
155
+ /**
156
+ * List of trusted IP addresses for webhooks.
157
+ * Defaults to official Paystack IPs if verifyIP is true and this is empty.
158
+ */
159
+ trustedIPs?: string[];
160
+ };
161
+ /**
162
+ * Subscription configuration
163
+ */
164
+ subscription?: SubscriptionOptions;
165
+ /**
166
+ * Billing pattern
167
+ * @default "native"
168
+ */
169
+ billingPattern?: "native" | "local";
170
+ /**
171
+ * Global event handler
172
+ */
173
+ onEvent?: (event: PaystackWebhookEvent) => Promise<void>;
174
+ /**
175
+ * Organization billing configuration
176
+ */
177
+ organization?: {
178
+ enabled?: boolean;
179
+ getCustomerCreateParams?: (org: {
180
+ id: string;
181
+ name: string;
182
+ email?: string | null;
183
+ }, ctx: GenericEndpointContext) => Promise<Record<string, unknown>>;
184
+ onCustomerCreate?: (data: {
185
+ paystackCustomer: Record<string, unknown>;
186
+ organization: unknown;
187
+ }, ctx: GenericEndpointContext) => Promise<void>;
188
+ };
189
+ /**
190
+ * Products configuration
191
+ */
192
+ products?: {
193
+ products?: PaystackProduct[] | (() => Promise<PaystackProduct[]>);
194
+ };
195
+ createCustomerOnSignUp?: boolean;
196
+ onCustomerCreate?: (data: {
197
+ paystackCustomer: Record<string, unknown>;
198
+ user: unknown;
199
+ }, ctx: GenericEndpointContext) => Promise<void>;
200
+ /**
201
+ * Custom database schema / model names
202
+ */
203
+ schema?: Record<string, {
204
+ modelName?: string;
205
+ fields?: Record<string, string>;
206
+ }>;
207
+ }
208
+ interface Subscription {
209
+ id: string;
210
+ userId: string;
211
+ organizationId?: string;
212
+ plan: string;
213
+ pendingPlan?: string | null;
214
+ paystackSubscriptionCode?: string;
215
+ paystackCustomerCode?: string;
216
+ paystackPlanCode?: string;
217
+ paystackAuthorizationCode?: string;
218
+ paystackTransactionReference?: string;
219
+ paystackEmailToken?: string;
220
+ status: string;
221
+ seats: number;
222
+ referenceId: string;
223
+ periodStart?: Date | null;
224
+ periodEnd?: Date | null;
225
+ cancelAtPeriodEnd: boolean;
226
+ trialStart?: Date | null;
227
+ trialEnd?: Date | null;
228
+ groupId?: string | null;
229
+ createdAt: Date;
230
+ updatedAt: Date;
231
+ }
232
+ interface ChargeRecurringSubscriptionInput {
233
+ subscriptionId: string;
234
+ amount?: number;
235
+ }
236
+ interface ChargeRecurringSubscriptionResult {
237
+ status: "success" | "failed";
238
+ data: PaystackTransactionResponse;
239
+ }
240
+ interface PaystackSyncResult {
241
+ status: "success";
242
+ count: number;
243
+ }
244
+ type AnyPaystackOptions = PaystackOptions<PaystackClientLike>;
245
+ /**
246
+ * Exact grouped SDK slices used by this plugin.
247
+ * This deliberately matches the official SDK surface instead of a handwritten approximation.
248
+ */
249
+ interface PaystackClientLike {
250
+ transaction: Pick<PaystackTransactionClient, "initialize" | "verify" | "chargeAuthorization">;
251
+ customer: Pick<PaystackCustomerClient, "create" | "update" | "fetch">;
252
+ subscription: Pick<PaystackSubscriptionClient, "create" | "fetch" | "disable" | "enable" | "manageLink">;
253
+ product: Pick<PaystackProductClient, "fetch" | "list">;
254
+ plan: Pick<PaystackPlanClient, "list" | "create">;
255
+ }
256
+ //#endregion
257
+ export { PaystackOptions as a, PaystackSyncResult as c, Subscription as d, SubscriptionOptions as f, PaystackClientLike as i, PaystackTransaction as l, ChargeRecurringSubscriptionInput as n, PaystackPlan as o, ChargeRecurringSubscriptionResult as r, PaystackProduct as s, AnyPaystackOptions as t, PaystackTransactionResponse as u };
258
+ //# sourceMappingURL=types-B5ZnlFrq.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-B5ZnlFrq.d.mts","names":["GenericEndpointContext","Session","User","Organization","Member","PaystackPaths","PaystackResponse","PaystackWebhookEvent","PaystackClient","PaystackCustomerClient","PaystackPlanClient","PaystackProductClient","PaystackSubscriptionClient","PaystackTransactionClient","components","PaystackCurrency","PaystackCheckoutChannel","PaystackTransaction","Date","id","reference","paystackId","referenceId","userId","amount","currency","status","plan","product","metadata","createdAt","updatedAt","PaystackProduct","name","description","price","quantity","unlimited","slug","InputPaystackProduct","PaystackUser","paystackCustomerCode","PaystackOrganization","PaystackPlan","Subscription","Promise","Record","interval","planCode","seatAmount","seatPriceId","seatPlanCode","invoiceLimit","freeTrial","days","onTrialStart","subscription","limits","features","PaystackWebhookPayload","PaystackTransactionResponse","PaystackPlanResponse","PaystackCustomerResponse","PaystackSubscriptionResponse","PaystackProductResponse","SubscriptionOptions","enabled","plans","autoSyncQuantity","cancelBehavior","onSubscriptionComplete","event","data","ctx","onSubscriptionCreated","onSubscriptionCancel","authorizeReference","user","session","action","requireEmailVerification","allowedPaymentChannels","PaystackOptions","TPaystackClient","PaystackClientLike","secretKey","paystackWebhookSecret","paystackClient","webhook","secret","verifyIP","trustedIPs","billingPattern","onEvent","organization","getCustomerCreateParams","email","org","onCustomerCreate","paystackCustomer","products","createCustomerOnSignUp","schema","modelName","fields","organizationId","pendingPlan","paystackSubscriptionCode","paystackPlanCode","paystackAuthorizationCode","paystackTransactionReference","paystackEmailToken","seats","periodStart","periodEnd","cancelAtPeriodEnd","trialStart","trialEnd","groupId","ChargeRecurringSubscriptionInput","subscriptionId","ChargeRecurringSubscriptionResult","PaystackSyncResult","count","AnyPaystackOptions","Pick","transaction","customer"],"sources":["../src/types.d.ts"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alexasomba/better-auth-paystack",
3
- "version": "2.1.0",
3
+ "version": "2.2.0",
4
4
  "description": "Production-ready Paystack billing plugin for Better Auth. Supports subscriptions, one-time payments, organization billing, secure webhooks and more",
5
5
  "keywords": [
6
6
  "africa",
@@ -65,7 +65,7 @@
65
65
  "access": "public"
66
66
  },
67
67
  "dependencies": {
68
- "@alexasomba/paystack-node": "^1.9.2",
68
+ "@alexasomba/paystack-node": "^1.9.4",
69
69
  "better-call": "^1.3.5",
70
70
  "defu": "^6.1.7",
71
71
  "zod": "^4.3.6"
@@ -85,7 +85,7 @@
85
85
  "better-auth": "1.7.0-beta.1",
86
86
  "eslint-plugin-import-x": "^4.16.2",
87
87
  "eslint-plugin-promise": "^7.2.1",
88
- "eslint-plugin-react-hooks": "^7.1.0",
88
+ "eslint-plugin-react-hooks": "^7.1.1",
89
89
  "eslint-plugin-unicorn": "^64.0.0",
90
90
  "publint": "^0.3.18",
91
91
  "typescript": "^5.9.3",
@@ -97,7 +97,7 @@
97
97
  "better-auth": "^1.6.5"
98
98
  },
99
99
  "optionalDependencies": {
100
- "@rollup/rollup-linux-x64-gnu": "^4.60.1"
100
+ "@rollup/rollup-linux-x64-gnu": "^4.60.2"
101
101
  },
102
102
  "engines": {
103
103
  "node": ">=24.0.0"