@alexasomba/better-auth-paystack 0.1.0 → 0.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.
package/README.md CHANGED
@@ -2,13 +2,19 @@
2
2
 
3
3
  Better Auth plugin that integrates Paystack for customer creation, checkout, and Paystack-native subscription flows.
4
4
 
5
+ [**Live Demo (Next.js)**](https://better-auth-paystack.gittech.workers.dev)
6
+
5
7
  ## Features
6
8
 
7
9
  - Optional Paystack customer creation on sign up (`createCustomerOnSignUp`)
8
10
  - Paystack checkout via transaction initialize + verify (redirect-first)
9
11
  - Paystack webhook signature verification (`x-paystack-signature`, HMAC-SHA512)
10
12
  - Local subscription records stored in your Better Auth database
11
- - Subscription management endpoints using Paystack’s email-token flows (`/subscription/enable` + `/subscription/disable`)
13
+ - Subscription management via Paystack-hosted pages (`/subscription/manage-link`)
14
+ - Subscription activation/deactivation endpoints (`/subscription/enable` + `/subscription/disable`)
15
+ - Support for one-time payment products (e.g., credit packs, top-ups)
16
+ - Explicit billing interval support for plans (monthly, annually, etc.)
17
+ - Dynamic configuration sharing via `/paystack/get-config`
12
18
  - Reference ID support (user by default; org/team via `referenceId` + `authorizeReference`)
13
19
 
14
20
  ## Installation
@@ -19,65 +25,22 @@ Better Auth plugin that integrates Paystack for customer creation, checkout, and
19
25
  npm install better-auth @alexasomba/better-auth-paystack
20
26
  ```
21
27
 
22
- ### Install from GitHub Packages (optional)
23
-
24
- If you want to install this package from GitHub Packages (`npm.pkg.github.com`) instead of npmjs, configure a project-level `.npmrc` (or your user `~/.npmrc`) to route the `@alexasomba` scope:
25
-
26
- ```ini
27
- @alexasomba:registry=https://npm.pkg.github.com
28
- ```
29
-
30
- Then authenticate and install:
31
-
32
- ```bash
33
- # npm v9+ may require legacy auth prompts for private registries
34
- npm login --scope=@alexasomba --auth-type=legacy --registry=https://npm.pkg.github.com
35
-
36
- npm install @alexasomba/better-auth-paystack
37
- ```
38
-
39
- ## Development (pnpm workspace)
40
-
41
- This repo is set up as a pnpm workspace so you can install once at the repo root and run/build any example via `--filter`.
42
-
43
- ```bash
44
- pnpm install
45
- ```
46
-
47
- Build the library:
48
-
49
- ```bash
50
- pnpm --filter "@alexasomba/better-auth-paystack" build
51
- ```
52
-
53
- Run an example:
28
+ ## 🔑 Environment Variables
54
29
 
55
- ```bash
56
- # Cloudflare Workers + Hono
57
- pnpm --filter hono dev
30
+ To use this plugin, you'll need to configure the following in your `.env`:
58
31
 
59
- # Next.js (OpenNext / Cloudflare)
60
- pnpm --filter my-next-app dev
61
-
62
- # TanStack Start
63
- pnpm --filter tanstack-start dev
32
+ ```env
33
+ PAYSTACK_SECRET_KEY=sk_test_...
34
+ PAYSTACK_WEBHOOK_SECRET=sk_test_... # Usually the same as SECRET_KEY
35
+ BETTER_AUTH_SECRET=...
36
+ BETTER_AUTH_URL=http://localhost:3000
64
37
  ```
65
38
 
66
- Build all workspace packages (library + examples):
39
+ ---
67
40
 
68
- ```bash
69
- pnpm -r build
70
- ```
41
+ ## ⚙️ Configuration
71
42
 
72
- If you want strict typing and the recommended server SDK client:
73
-
74
- ```bash
75
- npm install @alexasomba/paystack-node
76
- ```
77
-
78
- If your app has separate client + server bundles, install the plugin in both.
79
-
80
- ### Configure the server plugin
43
+ ### 1. Server Plugin
81
44
 
82
45
  ```ts
83
46
  import { betterAuth } from "better-auth";
@@ -93,26 +56,18 @@ export const auth = betterAuth({
93
56
  paystack({
94
57
  paystackClient,
95
58
  // Paystack signs webhooks with an HMAC SHA-512 using your Paystack secret key.
96
- // Use the same secret key you configured in `createPaystack({ secretKey })`.
97
59
  paystackWebhookSecret: process.env.PAYSTACK_SECRET_KEY!,
98
60
  createCustomerOnSignUp: true,
99
61
  subscription: {
100
62
  enabled: true,
101
63
  plans: [
102
64
  {
103
- name: "starter",
65
+ name: "pro",
104
66
  amount: 500000,
105
67
  currency: "NGN",
106
- // If you use Paystack Plans, prefer planCode + (optional) invoiceLimit.
107
- // planCode: "PLN_...",
108
- // invoiceLimit: 12,
68
+ interval: "monthly",
109
69
  },
110
70
  ],
111
- authorizeReference: async ({ user, referenceId, action }, ctx) => {
112
- // Allow only the current user by default; authorize org/team IDs here.
113
- // return await canUserManageOrg(user.id, referenceId)
114
- return referenceId === user.id;
115
- },
116
71
  },
117
72
  }),
118
73
  ],
@@ -178,7 +133,7 @@ This flow matches Paystack’s transaction initialize/verify APIs:
178
133
  2. Redirect the user to the returned Paystack `url`
179
134
  3. On your callback route/page, call `POST {AUTH_BASE}/paystack/transaction/verify` (this updates local subscription state)
180
135
 
181
- Example (typed via Better Auth client plugin):
136
+ **Example (typed via Better Auth client plugin):**
182
137
 
183
138
  ```ts
184
139
  import { createAuthClient } from "better-auth/client";
@@ -205,13 +160,35 @@ const init = await authClient.paystack.transaction.initialize(
205
160
  // { url, reference, accessCode, redirect: true }
206
161
  if (init?.url) window.location.href = init.url;
207
162
 
208
- // On your callback page/route
163
+ // 2. Manage / Upgrade / Downgrade (via Paystack-hosted management page)
164
+ const manage = await authClient.paystack.getSubscriptionManageLink({
165
+ query: { subscriptionCode: "SUB_..." },
166
+ });
167
+ if (manage.data?.link) window.location.href = manage.data.link;
168
+
169
+ // 3. Purchase a One-Time Product
170
+ await authClient.paystack.transaction.initialize({
171
+ amount: 250000,
172
+ currency: "NGN",
173
+ metadata: { type: "credits", quantity: 50 },
174
+ callbackURL: `${window.location.origin}/billing/paystack/callback`,
175
+ });
176
+
177
+ // 4. On your callback page/route
209
178
  const reference = new URLSearchParams(window.location.search).get("reference");
210
179
  if (reference) {
211
180
  await authClient.paystack.transaction.verify({ reference }, { throw: true });
212
181
  }
213
182
  ```
214
183
 
184
+ ### Dynamic Configuration
185
+
186
+ The plugin exposes an endpoint to share your configured plans and products with the client, reducing hard-coding in your components:
187
+
188
+ `GET {AUTH_BASE}/paystack/get-config`
189
+
190
+ Returns: `{ plans: PaystackPlan[], products: PaystackProduct[] }`
191
+
215
192
  Server-side (no HTTP fetch needed):
216
193
 
217
194
  ```ts
@@ -220,6 +197,36 @@ Server-side (no HTTP fetch needed):
220
197
  // const verify = await auth.api.verifyTransaction({ headers: req.headers, body: { reference } })
221
198
  ```
222
199
 
200
+ **Example (framework-agnostic):**
201
+
202
+ On your callback route/page, call `GET {AUTH_BASE}/paystack/transaction/verify?reference=...`
203
+
204
+ ```ts
205
+ // Start checkout
206
+ const initRes = await fetch("/api/auth/paystack/transaction/initialize", {
207
+ method: "POST",
208
+ headers: { "content-type": "application/json" },
209
+ body: JSON.stringify({
210
+ plan: "starter",
211
+ callbackURL: `${window.location.origin}/billing/paystack/callback`,
212
+ // Optional for org/team billing (requires authorizeReference)
213
+ // referenceId: "org_123",
214
+ }),
215
+ });
216
+
217
+ const init = await initRes.json();
218
+ // { url, reference, accessCode, redirect: true }
219
+ if (init?.url) window.location.href = init.url;
220
+
221
+ // On your callback page/route
222
+ const reference = new URLSearchParams(window.location.search).get("reference");
223
+ if (reference) {
224
+ await fetch(
225
+ `/api/auth/paystack/transaction/verify?reference=${encodeURIComponent(reference)}`,
226
+ );
227
+ }
228
+ ```
229
+
223
230
  ### Inline modal checkout (optional)
224
231
 
225
232
  If you prefer an inline checkout experience, initialize the transaction the same way and use `@alexasomba/paystack-browser` in your UI. This plugin does not render UI — it only provides server endpoints.
@@ -297,8 +304,29 @@ Subscription options (when `subscription.enabled: true`):
297
304
  - Subscription list returns empty: verify you’re passing the correct `referenceId`, and that `authorizeReference` allows it.
298
305
  - Transaction initializes but verify doesn’t update: ensure you call the verify endpoint after redirect, and confirm Paystack returns `status: "success"` for the reference.
299
306
 
307
+ ---
308
+
309
+ ## 🏗️ Development & Contributing
310
+
311
+ This repository is set up as a pnpm workspace. You can run and build examples via `--filter`.
312
+
313
+ ```bash
314
+ # Install everything
315
+ pnpm install
316
+
317
+ # Build the core library
318
+ pnpm --filter "@alexasomba/better-auth-paystack" build
319
+
320
+ # Run Next.js example (Next.js + Better Auth)
321
+ pnpm --filter nextjs-better-auth-paystack dev
322
+
323
+ # Run TanStack Start example (TanStack Start + Better Auth)
324
+ pnpm --filter tanstack-start-better-auth-paystack dev
325
+ ```
326
+
300
327
  ## Links
301
328
 
329
+ - GitHub Repository: [alexasomba/better-auth-paystack](https://github.com/alexasomba/better-auth-paystack)
302
330
  - Paystack Webhooks: https://paystack.com/docs/payments/webhooks/
303
331
  - Paystack Transaction API: https://paystack.com/docs/api/transaction/
304
332
  - Paystack Subscription API: https://paystack.com/docs/api/subscription/
package/dist/client.d.mts CHANGED
@@ -1,27 +1,20 @@
1
- import { n as paystack, r as PaystackNodeClient } from "./index-DWhjFOp2.mjs";
1
+ import { n as paystack } from "./index-Bz5N0iP1.mjs";
2
2
 
3
3
  //#region src/client.d.ts
4
4
  declare const paystackClient: <O extends {
5
5
  subscription: boolean;
6
6
  }>(_options?: O | undefined) => {
7
7
  id: "paystack";
8
- $InferServerPlugin: ReturnType<typeof paystack<PaystackNodeClient, O["subscription"] extends true ? {
9
- paystackClient: PaystackNodeClient;
10
- paystackWebhookSecret: string;
11
- subscription: {
12
- enabled: true;
13
- plans: [];
14
- };
15
- } : {
16
- paystackClient: PaystackNodeClient;
17
- paystackWebhookSecret: string;
18
- }>>;
8
+ $InferServerPlugin: ReturnType<typeof paystack<any, any>>;
19
9
  pathMethods: {
20
10
  "/paystack/transaction/initialize": "POST";
21
11
  "/paystack/transaction/verify": "POST";
12
+ "/paystack/transaction/list": "GET";
13
+ "/paystack/get-config": "GET";
22
14
  "/paystack/subscription/list-local": "GET";
23
15
  "/paystack/subscription/disable": "POST";
24
16
  "/paystack/subscription/enable": "POST";
17
+ "/paystack/subscription/manage-link": "GET";
25
18
  };
26
19
  };
27
20
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.mts","names":[],"sources":["../src/client.ts"],"sourcesContent":[],"mappings":";;;cAIa;EAAA,YAAA,EAAA,OAmCZ;CA9Bc,CAAA,CAAA,QAAA,CAAA,EAAA,CAAA,GAAA,SAAA,EAAA,GAAA;EAMC,EAAA,EAAA,UAAA;EACA,kBAAA,EAHkB,UAGlB,CAAA,OAFG,QAEH,CADA,kBACA,EAAA,CAAA,CAAA,cAAA,CAAA,SAAA,IAAA,GAAA;IAEoB,cAAA,EAAA,kBAAA;IAQA,qBAAA,EAAA,MAAA;IAZjB,YAAA,EAAA;MADe,OAAA,EAAA,IAAA;MAAU,KAAA,EAAA,EAAA;;;oBAaR"}
1
+ {"version":3,"file":"client.d.mts","names":[],"sources":["../src/client.ts"],"mappings":";;;cAIa,cAAA;EAEL,YAAA;AAAA,GAGJ,QAAA,GAAW,CAAA;;sBAImB,UAAA,QAAkB,QAAA"}
package/dist/client.mjs CHANGED
@@ -6,9 +6,12 @@ const paystackClient = (_options) => {
6
6
  pathMethods: {
7
7
  "/paystack/transaction/initialize": "POST",
8
8
  "/paystack/transaction/verify": "POST",
9
+ "/paystack/transaction/list": "GET",
10
+ "/paystack/get-config": "GET",
9
11
  "/paystack/subscription/list-local": "GET",
10
12
  "/paystack/subscription/disable": "POST",
11
- "/paystack/subscription/enable": "POST"
13
+ "/paystack/subscription/enable": "POST",
14
+ "/paystack/subscription/manage-link": "GET"
12
15
  }
13
16
  };
14
17
  };
@@ -1 +1 @@
1
- {"version":3,"file":"client.mjs","names":[],"sources":["../src/client.ts"],"sourcesContent":["import type { BetterAuthClientPlugin } from \"better-auth\";\nimport type { paystack } from \"./index\";\nimport type { PaystackNodeClient } from \"./types\";\n\nexport const paystackClient = <\n O extends {\n subscription: boolean;\n },\n>(\n _options?: O | undefined,\n) => {\n return {\n id: \"paystack\",\n $InferServerPlugin: {} as ReturnType<\n typeof paystack<\n PaystackNodeClient,\n O[\"subscription\"] extends true\n ? {\n paystackClient: PaystackNodeClient;\n paystackWebhookSecret: string;\n subscription: {\n enabled: true;\n plans: [];\n };\n }\n : {\n paystackClient: PaystackNodeClient;\n paystackWebhookSecret: string;\n }\n >\n >,\n pathMethods: {\n \"/paystack/transaction/initialize\": \"POST\",\n \"/paystack/transaction/verify\": \"POST\",\n \"/paystack/subscription/list-local\": \"GET\",\n \"/paystack/subscription/disable\": \"POST\",\n \"/paystack/subscription/enable\": \"POST\",\n },\n } satisfies BetterAuthClientPlugin;\n};\n"],"mappings":";AAIA,MAAa,kBAKT,aACC;AACD,QAAO;EACH,IAAI;EACJ,oBAAoB,EAAE;EAkBtB,aAAa;GACT,oCAAoC;GACpC,gCAAgC;GAChC,qCAAqC;GACrC,kCAAkC;GAClC,iCAAiC;GACpC;EACJ"}
1
+ {"version":3,"file":"client.mjs","names":[],"sources":["../src/client.ts"],"sourcesContent":["import type { BetterAuthClientPlugin } from \"better-auth\";\nimport type { paystack } from \"./index\";\nimport type { PaystackNodeClient, PaystackTransaction } from \"./types\";\n\nexport const paystackClient = <\n O extends {\n subscription: boolean;\n },\n>(\n _options?: O | undefined,\n) => {\n return {\n id: \"paystack\",\n $InferServerPlugin: {} as ReturnType<typeof paystack<any, any>>,\n pathMethods: {\n \"/paystack/transaction/initialize\": \"POST\",\n \"/paystack/transaction/verify\": \"POST\",\n \"/paystack/transaction/list\": \"GET\",\n \"/paystack/get-config\": \"GET\",\n \"/paystack/subscription/list-local\": \"GET\",\n \"/paystack/subscription/disable\": \"POST\",\n \"/paystack/subscription/enable\": \"POST\",\n \"/paystack/subscription/manage-link\": \"GET\",\n },\n } satisfies BetterAuthClientPlugin;\n};\n"],"mappings":";AAIA,MAAa,kBAKT,aACC;AACD,QAAO;EACH,IAAI;EACJ,oBAAoB,EAAE;EACtB,aAAa;GACT,oCAAoC;GACpC,gCAAgC;GAChC,8BAA8B;GAC9B,wBAAwB;GACxB,qCAAqC;GACrC,kCAAkC;GAClC,iCAAiC;GACjC,sCAAsC;GACzC;EACJ"}
@@ -1,9 +1,9 @@
1
- import * as better_call0 from "better-call";
2
1
  import * as better_auth0 from "better-auth";
3
2
  import { GenericEndpointContext, InferOptionSchema, Session, User } from "better-auth";
3
+ import * as better_call0 from "better-call";
4
4
  import * as zod0 from "zod";
5
- import * as _better_auth_core_db0 from "@better-auth/core/db";
6
5
  import { createPaystack } from "@alexasomba/paystack-node";
6
+ import * as _better_auth_core_db0 from "@better-auth/core/db";
7
7
 
8
8
  //#region src/schema.d.ts
9
9
  declare const subscriptions: {
@@ -140,25 +140,41 @@ type AuthSession = {
140
140
  session: Session;
141
141
  } & Record<string, any>;
142
142
  type PaystackPlan = {
143
- /** Human name stored in DB (lowercased). */
144
- name: string;
145
- /** Paystack plan code (if you use Paystack plans). */
146
- planCode?: string | undefined;
147
- /** Amount in the smallest currency unit (e.g. kobo). */
148
- amount?: number | undefined;
149
- /** Currency ISO code (e.g. NGN). */
150
- currency?: string | undefined;
151
- /** Paystack interval keyword (when using Paystack plans). */
152
- interval?: "daily" | "weekly" | "monthly" | "quarterly" | "biannually" | "annually" | undefined;
153
- /** Optional invoice limit; Paystack uses `invoice_limit` during init. */
154
- invoiceLimit?: number | undefined;
155
- /** Arbitrary limits (stored/consumed by your app). */
156
- limits?: Record<string, unknown> | undefined;
157
- /** Optional free trial config, if your app supports it. */
143
+ /** Human name stored in DB (lowercased). */name: string; /** Paystack plan code (if you use Paystack plans). */
144
+ planCode?: string | undefined; /** Amount in the smallest currency unit (e.g. kobo). */
145
+ amount?: number | undefined; /** Currency ISO code (e.g. NGN). */
146
+ currency?: string | undefined; /** Paystack interval keyword (when using Paystack plans). */
147
+ interval?: "daily" | "weekly" | "monthly" | "quarterly" | "biannually" | "annually" | undefined; /** Optional invoice limit; Paystack uses `invoice_limit` during init. */
148
+ invoiceLimit?: number | undefined; /** Arbitrary limits (stored/consumed by your app). */
149
+ limits?: Record<string, unknown> | undefined; /** Optional free trial config, if your app supports it. */
158
150
  freeTrial?: {
159
151
  days: number;
160
152
  } | undefined;
161
153
  };
154
+ interface PaystackProduct {
155
+ /** Human-readable name of the product. */
156
+ name: string;
157
+ /** Amount in the smallest currency unit (e.g., kobo). */
158
+ amount: number;
159
+ /** Currency ISO code (e.g., NGN). */
160
+ currency: string;
161
+ /** Optional metadata to include with the transaction. */
162
+ metadata?: Record<string, unknown> | undefined;
163
+ }
164
+ interface PaystackTransaction {
165
+ id: string;
166
+ reference: string;
167
+ paystackId?: string | undefined;
168
+ referenceId: string;
169
+ userId: string;
170
+ amount: number;
171
+ currency: string;
172
+ status: string;
173
+ plan?: string | undefined;
174
+ metadata?: string | undefined;
175
+ createdAt: Date;
176
+ updatedAt: Date;
177
+ }
162
178
  interface Subscription {
163
179
  id: string;
164
180
  plan: string;
@@ -182,7 +198,7 @@ type SubscriptionOptions = {
182
198
  user: User;
183
199
  session: AuthSession;
184
200
  referenceId: string;
185
- action: "initialize-transaction" | "verify-transaction" | "list-subscriptions" | "disable-subscription" | "enable-subscription";
201
+ action: "initialize-transaction" | "verify-transaction" | "list-subscriptions" | "list-transactions" | "disable-subscription" | "enable-subscription" | "get-subscription-manage-link";
186
202
  }, ctx: GenericEndpointContext) => Promise<boolean>) | undefined;
187
203
  onSubscriptionComplete?: ((data: {
188
204
  event: any;
@@ -198,6 +214,9 @@ type SubscriptionOptions = {
198
214
  subscription: Subscription;
199
215
  }, ctx: GenericEndpointContext) => Promise<void>) | undefined;
200
216
  };
217
+ type ProductOptions = {
218
+ products: PaystackProduct[] | (() => PaystackProduct[] | Promise<PaystackProduct[]>);
219
+ };
201
220
  interface PaystackOptions<TPaystackClient extends PaystackClientLike = PaystackNodeClient> {
202
221
  /** Paystack SDK instance (recommended: `@alexasomba/paystack-node` via `createPaystack({ secretKey })`). */
203
222
  paystackClient: NoInfer<TPaystackClient>;
@@ -217,6 +236,7 @@ interface PaystackOptions<TPaystackClient extends PaystackClientLike = PaystackN
217
236
  } | ({
218
237
  enabled: true;
219
238
  } & SubscriptionOptions)) | undefined;
239
+ products?: ProductOptions | undefined;
220
240
  onEvent?: ((event: any) => Promise<void>) | undefined;
221
241
  schema?: InferOptionSchema<typeof subscriptions & typeof user> | undefined;
222
242
  }
@@ -224,15 +244,75 @@ interface PaystackOptions<TPaystackClient extends PaystackClientLike = PaystackN
224
244
  //#region src/index.d.ts
225
245
  declare const paystack: <TPaystackClient extends PaystackClientLike = PaystackNodeClient, O extends PaystackOptions<TPaystackClient> = PaystackOptions<TPaystackClient>>(options: O) => {
226
246
  id: "paystack";
227
- endpoints: O extends {
228
- subscription: {
229
- enabled: true;
230
- };
231
- } ? {
247
+ endpoints: {
248
+ paystackWebhook: better_call0.StrictEndpoint<"/paystack/webhook", {
249
+ method: "POST";
250
+ metadata: {
251
+ openapi: {
252
+ operationId: string;
253
+ };
254
+ scope: "server";
255
+ };
256
+ cloneRequest: true;
257
+ disableBody: true;
258
+ }, {
259
+ received: boolean;
260
+ }>;
261
+ listTransactions: better_call0.StrictEndpoint<"/paystack/transaction/list", {
262
+ method: "GET";
263
+ query: zod0.ZodObject<{
264
+ referenceId: zod0.ZodOptional<zod0.ZodString>;
265
+ }, better_auth0.$strip>;
266
+ use: (((inputContext: better_call0.MiddlewareInputContext<better_call0.MiddlewareOptions>) => Promise<{
267
+ context: {
268
+ referenceId: any;
269
+ };
270
+ }>) | ((inputContext: better_auth0.MiddlewareInputContext<better_auth0.MiddlewareOptions>) => Promise<{
271
+ session: {
272
+ session: Record<string, any> & {
273
+ id: string;
274
+ createdAt: Date;
275
+ updatedAt: Date;
276
+ userId: string;
277
+ expiresAt: Date;
278
+ token: string;
279
+ ipAddress?: string | null | undefined;
280
+ userAgent?: string | null | undefined;
281
+ };
282
+ user: Record<string, any> & {
283
+ id: string;
284
+ createdAt: Date;
285
+ updatedAt: Date;
286
+ email: string;
287
+ emailVerified: boolean;
288
+ name: string;
289
+ image?: string | null | undefined;
290
+ };
291
+ };
292
+ }>) | ((getValue: (ctx: GenericEndpointContext) => string | string[]) => (inputContext: better_auth0.MiddlewareInputContext<better_auth0.MiddlewareOptions>) => Promise<void>))[];
293
+ }, {
294
+ transactions: PaystackTransaction[];
295
+ }>;
296
+ getConfig: better_call0.StrictEndpoint<"/paystack/get-config", {
297
+ method: "GET";
298
+ metadata: {
299
+ openapi: {
300
+ operationId: string;
301
+ };
302
+ };
303
+ }, {
304
+ plans: PaystackPlan[];
305
+ products: PaystackProduct[];
306
+ }>;
232
307
  initializeTransaction: better_call0.StrictEndpoint<"/paystack/transaction/initialize", {
233
308
  method: "POST";
234
309
  body: zod0.ZodObject<{
235
- plan: zod0.ZodString;
310
+ plan: zod0.ZodOptional<zod0.ZodString>;
311
+ product: zod0.ZodOptional<zod0.ZodString>;
312
+ amount: zod0.ZodOptional<zod0.ZodNumber>;
313
+ currency: zod0.ZodOptional<zod0.ZodString>;
314
+ email: zod0.ZodOptional<zod0.ZodString>;
315
+ metadata: zod0.ZodOptional<zod0.ZodRecord<zod0.ZodString, zod0.ZodAny>>;
236
316
  referenceId: zod0.ZodOptional<zod0.ZodString>;
237
317
  callbackURL: zod0.ZodOptional<zod0.ZodString>;
238
318
  }, better_auth0.$strip>;
@@ -415,35 +495,43 @@ declare const paystack: <TPaystackClient extends PaystackClientLike = PaystackNo
415
495
  }, {
416
496
  result: any;
417
497
  }>;
418
- paystackWebhook: better_call0.StrictEndpoint<"/paystack/webhook", {
419
- method: "POST";
420
- metadata: {
421
- openapi: {
422
- operationId: string;
498
+ getSubscriptionManageLink: better_call0.StrictEndpoint<"/paystack/subscription/manage-link", {
499
+ method: "GET";
500
+ query: zod0.ZodObject<{
501
+ subscriptionCode: zod0.ZodString;
502
+ }, better_auth0.$strip>;
503
+ use: (((inputContext: better_call0.MiddlewareInputContext<better_call0.MiddlewareOptions>) => Promise<{
504
+ context: {
505
+ referenceId: any;
423
506
  };
424
- scope: "server";
425
- };
426
- cloneRequest: true;
427
- disableBody: true;
428
- }, {
429
- received: boolean;
430
- }>;
431
- } : {
432
- paystackWebhook: better_call0.StrictEndpoint<"/paystack/webhook", {
433
- method: "POST";
434
- metadata: {
435
- openapi: {
436
- operationId: string;
507
+ }>) | ((inputContext: better_auth0.MiddlewareInputContext<better_auth0.MiddlewareOptions>) => Promise<{
508
+ session: {
509
+ session: Record<string, any> & {
510
+ id: string;
511
+ createdAt: Date;
512
+ updatedAt: Date;
513
+ userId: string;
514
+ expiresAt: Date;
515
+ token: string;
516
+ ipAddress?: string | null | undefined;
517
+ userAgent?: string | null | undefined;
518
+ };
519
+ user: Record<string, any> & {
520
+ id: string;
521
+ createdAt: Date;
522
+ updatedAt: Date;
523
+ email: string;
524
+ emailVerified: boolean;
525
+ name: string;
526
+ image?: string | null | undefined;
527
+ };
437
528
  };
438
- scope: "server";
439
- };
440
- cloneRequest: true;
441
- disableBody: true;
529
+ }>) | ((getValue: (ctx: GenericEndpointContext) => string | string[]) => (inputContext: better_auth0.MiddlewareInputContext<better_auth0.MiddlewareOptions>) => Promise<void>))[];
442
530
  }, {
443
- received: boolean;
531
+ link: any;
444
532
  }>;
445
533
  };
446
- init(ctx: better_auth0.AuthContext<better_auth0.BetterAuthOptions>): {
534
+ init(ctx: better_auth0.AuthContext): {
447
535
  options: {
448
536
  databaseHooks: {
449
537
  user: {
@@ -474,8 +562,7 @@ declare const paystack: <TPaystackClient extends PaystackClientLike = PaystackNo
474
562
  readonly EMAIL_VERIFICATION_REQUIRED: "Email verification is required before you can subscribe to a plan";
475
563
  };
476
564
  };
477
- type PaystackClientFromOptions<O extends PaystackOptions<any>> = O extends PaystackOptions<infer TClient> ? TClient : PaystackNodeClient;
478
- type PaystackPlugin<O extends PaystackOptions<any> = PaystackOptions> = ReturnType<typeof paystack<PaystackClientFromOptions<O>, O>>;
565
+ type PaystackPlugin<O extends PaystackOptions<any> = PaystackOptions> = ReturnType<typeof paystack<any, O>>;
479
566
  //#endregion
480
- export { PaystackPlan as a, PaystackOptions as i, paystack as n, Subscription as o, PaystackNodeClient as r, SubscriptionOptions as s, PaystackPlugin as t };
481
- //# sourceMappingURL=index-DWhjFOp2.d.mts.map
567
+ export { PaystackProduct as a, PaystackPlan as i, paystack as n, Subscription as o, PaystackOptions as r, SubscriptionOptions as s, PaystackPlugin as t };
568
+ //# sourceMappingURL=index-Bz5N0iP1.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-Bz5N0iP1.d.mts","names":["GenericEndpointContext","InferOptionSchema","Session","User","createPaystack","subscriptions","user","PaystackNodeClient","ReturnType","PaystackOpenApiFetchResponse","T","Response","data","error","response","PaystackApiResult","Promise","PaystackClientLike","customer_create","body","init","transaction_initialize","transaction_verify","params","path","reference","subscription_fetch","subscription_disable","code","token","subscription_enable","subscription_manage_link","customer","create","transaction","initialize","verify","subscription","fetch","idOrCode","disable","enable","manage","link","NoInfer","AuthSession","Record","session","PaystackPlan","name","planCode","amount","currency","interval","invoiceLimit","limits","freeTrial","days","PaystackProduct","metadata","PaystackTransaction","Date","id","paystackId","referenceId","userId","status","plan","createdAt","updatedAt","InputPaystackTransaction","Omit","Subscription","paystackCustomerCode","paystackSubscriptionCode","paystackTransactionReference","periodStart","periodEnd","trialStart","trialEnd","cancelAtPeriodEnd","groupId","seats","SubscriptionOptions","plans","requireEmailVerification","authorizeReference","action","ctx","onSubscriptionComplete","event","onSubscriptionUpdate","onSubscriptionDelete","ProductOptions","products","PaystackOptions","TPaystackClient","paystackClient","paystackWebhookSecret","createCustomerOnSignUp","onCustomerCreate","paystackCustomer","getCustomerCreateParams","enabled","onEvent","schema","InputSubscription"],"sources":["../src/schema.ts","../src/types.d.ts","../src/index.ts"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { a as PaystackPlan, i as PaystackOptions, n as paystack, o as Subscription, s as SubscriptionOptions, t as PaystackPlugin } from "./index-DWhjFOp2.mjs";
2
- export { PaystackOptions, PaystackPlan, PaystackPlugin, Subscription, SubscriptionOptions, paystack };
1
+ import { a as PaystackProduct, i as PaystackPlan, n as paystack, o as Subscription, r as PaystackOptions, s as SubscriptionOptions, t as PaystackPlugin } from "./index-Bz5N0iP1.mjs";
2
+ export { PaystackOptions, PaystackPlan, PaystackPlugin, PaystackProduct, Subscription, SubscriptionOptions, paystack };