@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 +94 -66
- package/dist/client.d.mts +5 -12
- package/dist/client.d.mts.map +1 -1
- package/dist/client.mjs +4 -1
- package/dist/client.mjs.map +1 -1
- package/dist/{index-DWhjFOp2.d.mts → index-Bz5N0iP1.d.mts} +139 -52
- package/dist/index-Bz5N0iP1.d.mts.map +1 -0
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +266 -349
- package/dist/index.mjs.map +1 -1
- package/package.json +12 -13
- package/dist/index-DWhjFOp2.d.mts.map +0 -1
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
39
|
+
---
|
|
67
40
|
|
|
68
|
-
|
|
69
|
-
pnpm -r build
|
|
70
|
-
```
|
|
41
|
+
## ⚙️ Configuration
|
|
71
42
|
|
|
72
|
-
|
|
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: "
|
|
65
|
+
name: "pro",
|
|
104
66
|
amount: 500000,
|
|
105
67
|
currency: "NGN",
|
|
106
|
-
|
|
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
|
-
//
|
|
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
|
|
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<
|
|
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
|
package/dist/client.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.mts","names":[],"sources":["../src/client.ts"],"
|
|
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
|
};
|
package/dist/client.mjs.map
CHANGED
|
@@ -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
|
|
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
|
-
|
|
145
|
-
/**
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
|
|
149
|
-
/**
|
|
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:
|
|
228
|
-
|
|
229
|
-
|
|
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
|
-
|
|
419
|
-
method: "
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
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
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
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
|
-
|
|
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
|
-
|
|
531
|
+
link: any;
|
|
444
532
|
}>;
|
|
445
533
|
};
|
|
446
|
-
init(ctx: better_auth0.AuthContext
|
|
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
|
|
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 {
|
|
481
|
-
//# sourceMappingURL=index-
|
|
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
|
|
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 };
|