@alexasomba/better-auth-paystack 0.0.4 → 0.1.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 +105 -18
- package/dist/client.d.mts +3 -4
- package/dist/client.d.mts.map +1 -1
- package/dist/client.mjs +2 -3
- package/dist/client.mjs.map +1 -1
- package/dist/{index-CZ3Le7Er.d.mts → index-DWhjFOp2.d.mts} +212 -5
- package/dist/index-DWhjFOp2.d.mts.map +1 -0
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +39 -17
- package/dist/index.mjs.map +1 -1
- package/package.json +14 -6
- package/dist/index-CZ3Le7Er.d.mts.map +0 -1
package/README.md
CHANGED
|
@@ -19,6 +19,56 @@ Better Auth plugin that integrates Paystack for customer creation, checkout, and
|
|
|
19
19
|
npm install better-auth @alexasomba/better-auth-paystack
|
|
20
20
|
```
|
|
21
21
|
|
|
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:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# Cloudflare Workers + Hono
|
|
57
|
+
pnpm --filter hono dev
|
|
58
|
+
|
|
59
|
+
# Next.js (OpenNext / Cloudflare)
|
|
60
|
+
pnpm --filter my-next-app dev
|
|
61
|
+
|
|
62
|
+
# TanStack Start
|
|
63
|
+
pnpm --filter tanstack-start dev
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Build all workspace packages (library + examples):
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
pnpm -r build
|
|
70
|
+
```
|
|
71
|
+
|
|
22
72
|
If you want strict typing and the recommended server SDK client:
|
|
23
73
|
|
|
24
74
|
```bash
|
|
@@ -42,7 +92,9 @@ export const auth = betterAuth({
|
|
|
42
92
|
plugins: [
|
|
43
93
|
paystack({
|
|
44
94
|
paystackClient,
|
|
45
|
-
|
|
95
|
+
// 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
|
+
paystackWebhookSecret: process.env.PAYSTACK_SECRET_KEY!,
|
|
46
98
|
createCustomerOnSignUp: true,
|
|
47
99
|
subscription: {
|
|
48
100
|
enabled: true,
|
|
@@ -124,36 +176,50 @@ This flow matches Paystack’s transaction initialize/verify APIs:
|
|
|
124
176
|
|
|
125
177
|
1. Call `POST {AUTH_BASE}/paystack/transaction/initialize`
|
|
126
178
|
2. Redirect the user to the returned Paystack `url`
|
|
127
|
-
3. On your callback route/page, call `
|
|
179
|
+
3. On your callback route/page, call `POST {AUTH_BASE}/paystack/transaction/verify` (this updates local subscription state)
|
|
128
180
|
|
|
129
|
-
Example (
|
|
181
|
+
Example (typed via Better Auth client plugin):
|
|
130
182
|
|
|
131
183
|
```ts
|
|
184
|
+
import { createAuthClient } from "better-auth/client";
|
|
185
|
+
import { paystackClient } from "@alexasomba/better-auth-paystack/client";
|
|
186
|
+
|
|
187
|
+
const plugins = [paystackClient({ subscription: true })];
|
|
188
|
+
|
|
189
|
+
const authClient = createAuthClient({
|
|
190
|
+
// Your Better Auth base URL (commonly "/api/auth" in Next.js)
|
|
191
|
+
baseURL: "/api/auth",
|
|
192
|
+
plugins,
|
|
193
|
+
});
|
|
194
|
+
|
|
132
195
|
// Start checkout
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
headers: { "content-type": "application/json" },
|
|
136
|
-
body: JSON.stringify({
|
|
196
|
+
const init = await authClient.paystack.transaction.initialize(
|
|
197
|
+
{
|
|
137
198
|
plan: "starter",
|
|
138
199
|
callbackURL: `${window.location.origin}/billing/paystack/callback`,
|
|
139
200
|
// Optional for org/team billing (requires authorizeReference)
|
|
140
201
|
// referenceId: "org_123",
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
const init = await initRes.json();
|
|
202
|
+
},
|
|
203
|
+
{ throw: true },
|
|
204
|
+
);
|
|
145
205
|
// { url, reference, accessCode, redirect: true }
|
|
146
206
|
if (init?.url) window.location.href = init.url;
|
|
147
207
|
|
|
148
208
|
// On your callback page/route
|
|
149
209
|
const reference = new URLSearchParams(window.location.search).get("reference");
|
|
150
210
|
if (reference) {
|
|
151
|
-
await
|
|
152
|
-
`/api/auth/paystack/transaction/verify?reference=${encodeURIComponent(reference)}`,
|
|
153
|
-
);
|
|
211
|
+
await authClient.paystack.transaction.verify({ reference }, { throw: true });
|
|
154
212
|
}
|
|
155
213
|
```
|
|
156
214
|
|
|
215
|
+
Server-side (no HTTP fetch needed):
|
|
216
|
+
|
|
217
|
+
```ts
|
|
218
|
+
// On the server you can call the endpoints directly:
|
|
219
|
+
// const init = await auth.api.initializeTransaction({ headers: req.headers, body: { plan: "starter" } })
|
|
220
|
+
// const verify = await auth.api.verifyTransaction({ headers: req.headers, body: { reference } })
|
|
221
|
+
```
|
|
222
|
+
|
|
157
223
|
### Inline modal checkout (optional)
|
|
158
224
|
|
|
159
225
|
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.
|
|
@@ -181,10 +247,31 @@ Paystack documents these as `code` + `token`. If the server cannot fetch `emailT
|
|
|
181
247
|
|
|
182
248
|
## Schema
|
|
183
249
|
|
|
184
|
-
The plugin adds
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
250
|
+
The plugin adds the following to your Better Auth database schema.
|
|
251
|
+
|
|
252
|
+
### `user`
|
|
253
|
+
|
|
254
|
+
| Field | Type | Required | Default |
|
|
255
|
+
| ---------------------- | -------- | -------- | ------- |
|
|
256
|
+
| `paystackCustomerCode` | `string` | no | — |
|
|
257
|
+
|
|
258
|
+
### `subscription` (only when `subscription.enabled: true`)
|
|
259
|
+
|
|
260
|
+
| Field | Type | Required | Default |
|
|
261
|
+
| ------------------------------ | --------- | -------- | -------------- |
|
|
262
|
+
| `plan` | `string` | yes | — |
|
|
263
|
+
| `referenceId` | `string` | yes | — |
|
|
264
|
+
| `paystackCustomerCode` | `string` | no | — |
|
|
265
|
+
| `paystackSubscriptionCode` | `string` | no | — |
|
|
266
|
+
| `paystackTransactionReference` | `string` | no | — |
|
|
267
|
+
| `status` | `string` | no | `"incomplete"` |
|
|
268
|
+
| `periodStart` | `date` | no | — |
|
|
269
|
+
| `periodEnd` | `date` | no | — |
|
|
270
|
+
| `trialStart` | `date` | no | — |
|
|
271
|
+
| `trialEnd` | `date` | no | — |
|
|
272
|
+
| `cancelAtPeriodEnd` | `boolean` | no | `false` |
|
|
273
|
+
| `groupId` | `string` | no | — |
|
|
274
|
+
| `seats` | `number` | no | — |
|
|
188
275
|
|
|
189
276
|
## Options
|
|
190
277
|
|
package/dist/client.d.mts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { n as paystack, r as PaystackNodeClient } from "./index-
|
|
1
|
+
import { n as paystack, r as PaystackNodeClient } from "./index-DWhjFOp2.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
|
-
id: "paystack
|
|
7
|
+
id: "paystack";
|
|
8
8
|
$InferServerPlugin: ReturnType<typeof paystack<PaystackNodeClient, O["subscription"] extends true ? {
|
|
9
9
|
paystackClient: PaystackNodeClient;
|
|
10
10
|
paystackWebhookSecret: string;
|
|
@@ -17,9 +17,8 @@ declare const paystackClient: <O extends {
|
|
|
17
17
|
paystackWebhookSecret: string;
|
|
18
18
|
}>>;
|
|
19
19
|
pathMethods: {
|
|
20
|
-
"/paystack/webhook": "POST";
|
|
21
20
|
"/paystack/transaction/initialize": "POST";
|
|
22
|
-
"/paystack/transaction/verify": "
|
|
21
|
+
"/paystack/transaction/verify": "POST";
|
|
23
22
|
"/paystack/subscription/list-local": "GET";
|
|
24
23
|
"/paystack/subscription/disable": "POST";
|
|
25
24
|
"/paystack/subscription/enable": "POST";
|
package/dist/client.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.mts","names":[],"sources":["../src/client.ts"],"sourcesContent":[],"mappings":";;;cAIa;EAAA,YAAA,EAAA,
|
|
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"}
|
package/dist/client.mjs
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
//#region src/client.ts
|
|
2
2
|
const paystackClient = (_options) => {
|
|
3
3
|
return {
|
|
4
|
-
id: "paystack
|
|
4
|
+
id: "paystack",
|
|
5
5
|
$InferServerPlugin: {},
|
|
6
6
|
pathMethods: {
|
|
7
|
-
"/paystack/webhook": "POST",
|
|
8
7
|
"/paystack/transaction/initialize": "POST",
|
|
9
|
-
"/paystack/transaction/verify": "
|
|
8
|
+
"/paystack/transaction/verify": "POST",
|
|
10
9
|
"/paystack/subscription/list-local": "GET",
|
|
11
10
|
"/paystack/subscription/disable": "POST",
|
|
12
11
|
"/paystack/subscription/enable": "POST"
|
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
|
|
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,5 +1,8 @@
|
|
|
1
|
+
import * as better_call0 from "better-call";
|
|
1
2
|
import * as better_auth0 from "better-auth";
|
|
2
3
|
import { GenericEndpointContext, InferOptionSchema, Session, User } from "better-auth";
|
|
4
|
+
import * as zod0 from "zod";
|
|
5
|
+
import * as _better_auth_core_db0 from "@better-auth/core/db";
|
|
3
6
|
import { createPaystack } from "@alexasomba/paystack-node";
|
|
4
7
|
|
|
5
8
|
//#region src/schema.d.ts
|
|
@@ -221,8 +224,212 @@ interface PaystackOptions<TPaystackClient extends PaystackClientLike = PaystackN
|
|
|
221
224
|
//#region src/index.d.ts
|
|
222
225
|
declare const paystack: <TPaystackClient extends PaystackClientLike = PaystackNodeClient, O extends PaystackOptions<TPaystackClient> = PaystackOptions<TPaystackClient>>(options: O) => {
|
|
223
226
|
id: "paystack";
|
|
224
|
-
endpoints: {
|
|
225
|
-
|
|
227
|
+
endpoints: O extends {
|
|
228
|
+
subscription: {
|
|
229
|
+
enabled: true;
|
|
230
|
+
};
|
|
231
|
+
} ? {
|
|
232
|
+
initializeTransaction: better_call0.StrictEndpoint<"/paystack/transaction/initialize", {
|
|
233
|
+
method: "POST";
|
|
234
|
+
body: zod0.ZodObject<{
|
|
235
|
+
plan: zod0.ZodString;
|
|
236
|
+
referenceId: zod0.ZodOptional<zod0.ZodString>;
|
|
237
|
+
callbackURL: zod0.ZodOptional<zod0.ZodString>;
|
|
238
|
+
}, better_auth0.$strip>;
|
|
239
|
+
use: (((inputContext: better_call0.MiddlewareInputContext<better_call0.MiddlewareOptions>) => Promise<{
|
|
240
|
+
context: {
|
|
241
|
+
referenceId: any;
|
|
242
|
+
};
|
|
243
|
+
}>) | ((inputContext: better_auth0.MiddlewareInputContext<better_auth0.MiddlewareOptions>) => Promise<{
|
|
244
|
+
session: {
|
|
245
|
+
session: Record<string, any> & {
|
|
246
|
+
id: string;
|
|
247
|
+
createdAt: Date;
|
|
248
|
+
updatedAt: Date;
|
|
249
|
+
userId: string;
|
|
250
|
+
expiresAt: Date;
|
|
251
|
+
token: string;
|
|
252
|
+
ipAddress?: string | null | undefined;
|
|
253
|
+
userAgent?: string | null | undefined;
|
|
254
|
+
};
|
|
255
|
+
user: Record<string, any> & {
|
|
256
|
+
id: string;
|
|
257
|
+
createdAt: Date;
|
|
258
|
+
updatedAt: Date;
|
|
259
|
+
email: string;
|
|
260
|
+
emailVerified: boolean;
|
|
261
|
+
name: string;
|
|
262
|
+
image?: string | null | undefined;
|
|
263
|
+
};
|
|
264
|
+
};
|
|
265
|
+
}>) | ((getValue: (ctx: GenericEndpointContext) => string | string[]) => (inputContext: better_auth0.MiddlewareInputContext<better_auth0.MiddlewareOptions>) => Promise<void>))[];
|
|
266
|
+
}, {
|
|
267
|
+
url: string | undefined;
|
|
268
|
+
reference: string | undefined;
|
|
269
|
+
accessCode: string | undefined;
|
|
270
|
+
redirect: boolean;
|
|
271
|
+
}>;
|
|
272
|
+
verifyTransaction: better_call0.StrictEndpoint<"/paystack/transaction/verify", {
|
|
273
|
+
method: "POST";
|
|
274
|
+
body: zod0.ZodObject<{
|
|
275
|
+
reference: zod0.ZodString;
|
|
276
|
+
}, better_auth0.$strip>;
|
|
277
|
+
use: (((inputContext: better_call0.MiddlewareInputContext<better_call0.MiddlewareOptions>) => Promise<{
|
|
278
|
+
context: {
|
|
279
|
+
referenceId: any;
|
|
280
|
+
};
|
|
281
|
+
}>) | ((inputContext: better_auth0.MiddlewareInputContext<better_auth0.MiddlewareOptions>) => Promise<{
|
|
282
|
+
session: {
|
|
283
|
+
session: Record<string, any> & {
|
|
284
|
+
id: string;
|
|
285
|
+
createdAt: Date;
|
|
286
|
+
updatedAt: Date;
|
|
287
|
+
userId: string;
|
|
288
|
+
expiresAt: Date;
|
|
289
|
+
token: string;
|
|
290
|
+
ipAddress?: string | null | undefined;
|
|
291
|
+
userAgent?: string | null | undefined;
|
|
292
|
+
};
|
|
293
|
+
user: Record<string, any> & {
|
|
294
|
+
id: string;
|
|
295
|
+
createdAt: Date;
|
|
296
|
+
updatedAt: Date;
|
|
297
|
+
email: string;
|
|
298
|
+
emailVerified: boolean;
|
|
299
|
+
name: string;
|
|
300
|
+
image?: string | null | undefined;
|
|
301
|
+
};
|
|
302
|
+
};
|
|
303
|
+
}>) | ((getValue: (ctx: GenericEndpointContext) => string | string[]) => (inputContext: better_auth0.MiddlewareInputContext<better_auth0.MiddlewareOptions>) => Promise<void>))[];
|
|
304
|
+
}, {
|
|
305
|
+
status: any;
|
|
306
|
+
reference: any;
|
|
307
|
+
data: any;
|
|
308
|
+
}>;
|
|
309
|
+
listSubscriptions: better_call0.StrictEndpoint<"/paystack/subscription/list-local", {
|
|
310
|
+
method: "GET";
|
|
311
|
+
query: zod0.ZodObject<{
|
|
312
|
+
referenceId: zod0.ZodOptional<zod0.ZodString>;
|
|
313
|
+
}, better_auth0.$strip>;
|
|
314
|
+
use: (((inputContext: better_call0.MiddlewareInputContext<better_call0.MiddlewareOptions>) => Promise<{
|
|
315
|
+
context: {
|
|
316
|
+
referenceId: any;
|
|
317
|
+
};
|
|
318
|
+
}>) | ((inputContext: better_auth0.MiddlewareInputContext<better_auth0.MiddlewareOptions>) => Promise<{
|
|
319
|
+
session: {
|
|
320
|
+
session: Record<string, any> & {
|
|
321
|
+
id: string;
|
|
322
|
+
createdAt: Date;
|
|
323
|
+
updatedAt: Date;
|
|
324
|
+
userId: string;
|
|
325
|
+
expiresAt: Date;
|
|
326
|
+
token: string;
|
|
327
|
+
ipAddress?: string | null | undefined;
|
|
328
|
+
userAgent?: string | null | undefined;
|
|
329
|
+
};
|
|
330
|
+
user: Record<string, any> & {
|
|
331
|
+
id: string;
|
|
332
|
+
createdAt: Date;
|
|
333
|
+
updatedAt: Date;
|
|
334
|
+
email: string;
|
|
335
|
+
emailVerified: boolean;
|
|
336
|
+
name: string;
|
|
337
|
+
image?: string | null | undefined;
|
|
338
|
+
};
|
|
339
|
+
};
|
|
340
|
+
}>) | ((getValue: (ctx: GenericEndpointContext) => string | string[]) => (inputContext: better_auth0.MiddlewareInputContext<better_auth0.MiddlewareOptions>) => Promise<void>))[];
|
|
341
|
+
}, {
|
|
342
|
+
subscriptions: Subscription[];
|
|
343
|
+
}>;
|
|
344
|
+
disablePaystackSubscription: better_call0.StrictEndpoint<"/paystack/subscription/disable", {
|
|
345
|
+
method: "POST";
|
|
346
|
+
body: zod0.ZodObject<{
|
|
347
|
+
referenceId: zod0.ZodOptional<zod0.ZodString>;
|
|
348
|
+
subscriptionCode: zod0.ZodString;
|
|
349
|
+
emailToken: zod0.ZodOptional<zod0.ZodString>;
|
|
350
|
+
}, better_auth0.$strip>;
|
|
351
|
+
use: (((inputContext: better_call0.MiddlewareInputContext<better_call0.MiddlewareOptions>) => Promise<{
|
|
352
|
+
context: {
|
|
353
|
+
referenceId: any;
|
|
354
|
+
};
|
|
355
|
+
}>) | ((inputContext: better_auth0.MiddlewareInputContext<better_auth0.MiddlewareOptions>) => Promise<{
|
|
356
|
+
session: {
|
|
357
|
+
session: Record<string, any> & {
|
|
358
|
+
id: string;
|
|
359
|
+
createdAt: Date;
|
|
360
|
+
updatedAt: Date;
|
|
361
|
+
userId: string;
|
|
362
|
+
expiresAt: Date;
|
|
363
|
+
token: string;
|
|
364
|
+
ipAddress?: string | null | undefined;
|
|
365
|
+
userAgent?: string | null | undefined;
|
|
366
|
+
};
|
|
367
|
+
user: Record<string, any> & {
|
|
368
|
+
id: string;
|
|
369
|
+
createdAt: Date;
|
|
370
|
+
updatedAt: Date;
|
|
371
|
+
email: string;
|
|
372
|
+
emailVerified: boolean;
|
|
373
|
+
name: string;
|
|
374
|
+
image?: string | null | undefined;
|
|
375
|
+
};
|
|
376
|
+
};
|
|
377
|
+
}>) | ((getValue: (ctx: GenericEndpointContext) => string | string[]) => (inputContext: better_auth0.MiddlewareInputContext<better_auth0.MiddlewareOptions>) => Promise<void>))[];
|
|
378
|
+
}, {
|
|
379
|
+
result: any;
|
|
380
|
+
}>;
|
|
381
|
+
enablePaystackSubscription: better_call0.StrictEndpoint<"/paystack/subscription/enable", {
|
|
382
|
+
method: "POST";
|
|
383
|
+
body: zod0.ZodObject<{
|
|
384
|
+
referenceId: zod0.ZodOptional<zod0.ZodString>;
|
|
385
|
+
subscriptionCode: zod0.ZodString;
|
|
386
|
+
emailToken: zod0.ZodOptional<zod0.ZodString>;
|
|
387
|
+
}, better_auth0.$strip>;
|
|
388
|
+
use: (((inputContext: better_call0.MiddlewareInputContext<better_call0.MiddlewareOptions>) => Promise<{
|
|
389
|
+
context: {
|
|
390
|
+
referenceId: any;
|
|
391
|
+
};
|
|
392
|
+
}>) | ((inputContext: better_auth0.MiddlewareInputContext<better_auth0.MiddlewareOptions>) => Promise<{
|
|
393
|
+
session: {
|
|
394
|
+
session: Record<string, any> & {
|
|
395
|
+
id: string;
|
|
396
|
+
createdAt: Date;
|
|
397
|
+
updatedAt: Date;
|
|
398
|
+
userId: string;
|
|
399
|
+
expiresAt: Date;
|
|
400
|
+
token: string;
|
|
401
|
+
ipAddress?: string | null | undefined;
|
|
402
|
+
userAgent?: string | null | undefined;
|
|
403
|
+
};
|
|
404
|
+
user: Record<string, any> & {
|
|
405
|
+
id: string;
|
|
406
|
+
createdAt: Date;
|
|
407
|
+
updatedAt: Date;
|
|
408
|
+
email: string;
|
|
409
|
+
emailVerified: boolean;
|
|
410
|
+
name: string;
|
|
411
|
+
image?: string | null | undefined;
|
|
412
|
+
};
|
|
413
|
+
};
|
|
414
|
+
}>) | ((getValue: (ctx: GenericEndpointContext) => string | string[]) => (inputContext: better_auth0.MiddlewareInputContext<better_auth0.MiddlewareOptions>) => Promise<void>))[];
|
|
415
|
+
}, {
|
|
416
|
+
result: any;
|
|
417
|
+
}>;
|
|
418
|
+
paystackWebhook: better_call0.StrictEndpoint<"/paystack/webhook", {
|
|
419
|
+
method: "POST";
|
|
420
|
+
metadata: {
|
|
421
|
+
openapi: {
|
|
422
|
+
operationId: string;
|
|
423
|
+
};
|
|
424
|
+
scope: "server";
|
|
425
|
+
};
|
|
426
|
+
cloneRequest: true;
|
|
427
|
+
disableBody: true;
|
|
428
|
+
}, {
|
|
429
|
+
received: boolean;
|
|
430
|
+
}>;
|
|
431
|
+
} : {
|
|
432
|
+
paystackWebhook: better_call0.StrictEndpoint<"/paystack/webhook", {
|
|
226
433
|
method: "POST";
|
|
227
434
|
metadata: {
|
|
228
435
|
openapi: {
|
|
@@ -249,13 +456,13 @@ declare const paystack: <TPaystackClient extends PaystackClientLike = PaystackNo
|
|
|
249
456
|
emailVerified: boolean;
|
|
250
457
|
name: string;
|
|
251
458
|
image?: string | null | undefined;
|
|
252
|
-
} & Record<string, unknown>, hookCtx
|
|
459
|
+
} & Record<string, unknown>, hookCtx?: GenericEndpointContext | null): Promise<void>;
|
|
253
460
|
};
|
|
254
461
|
};
|
|
255
462
|
};
|
|
256
463
|
};
|
|
257
464
|
};
|
|
258
|
-
schema:
|
|
465
|
+
schema: _better_auth_core_db0.BetterAuthPluginDBSchema;
|
|
259
466
|
$ERROR_CODES: {
|
|
260
467
|
readonly SUBSCRIPTION_NOT_FOUND: "Subscription not found";
|
|
261
468
|
readonly SUBSCRIPTION_PLAN_NOT_FOUND: "Subscription plan not found";
|
|
@@ -271,4 +478,4 @@ type PaystackClientFromOptions<O extends PaystackOptions<any>> = O extends Payst
|
|
|
271
478
|
type PaystackPlugin<O extends PaystackOptions<any> = PaystackOptions> = ReturnType<typeof paystack<PaystackClientFromOptions<O>, O>>;
|
|
272
479
|
//#endregion
|
|
273
480
|
export { PaystackPlan as a, PaystackOptions as i, paystack as n, Subscription as o, PaystackNodeClient as r, SubscriptionOptions as s, PaystackPlugin as t };
|
|
274
|
-
//# sourceMappingURL=index-
|
|
481
|
+
//# sourceMappingURL=index-DWhjFOp2.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-DWhjFOp2.d.mts","names":["GenericEndpointContext","InferOptionSchema","Session","User","createPaystack","subscriptions","user","PaystackNodeClient","ReturnType","PaystackOpenApiFetchResponse","T","Response","PaystackApiResult","Promise","PaystackClientLike","NoInfer","AuthSession","Record","PaystackPlan","Subscription","Date","SubscriptionOptions","PaystackOptions","TPaystackClient","InputSubscription","Omit"],"sources":["../src/schema.ts","../src/types.d.ts","../src/index.ts"],"sourcesContent":["import type { GenericEndpointContext, InferOptionSchema, Session, User } from \"better-auth\";\nimport type { createPaystack } from \"@alexasomba/paystack-node\";\nimport type { subscriptions, user } from \"./schema\";\nexport type PaystackNodeClient = ReturnType<typeof createPaystack>;\nexport type PaystackOpenApiFetchResponse<T = unknown> = {\n data?: T;\n error?: unknown;\n response?: Response;\n};\nexport type PaystackApiResult<T = unknown> = Promise<T | PaystackOpenApiFetchResponse<T>>;\nexport type PaystackClientLike = {\n customer_create?: (init?: {\n body?: any;\n } | undefined) => PaystackApiResult<any>;\n transaction_initialize?: (init?: {\n body?: any;\n } | undefined) => PaystackApiResult<any>;\n transaction_verify?: (init: {\n params: {\n path: {\n reference: string;\n };\n };\n }) => PaystackApiResult<any>;\n subscription_fetch?: (init: any) => PaystackApiResult<any>;\n subscription_disable?: (init?: {\n body?: {\n code: string;\n token: string;\n };\n } | undefined) => PaystackApiResult<any>;\n subscription_enable?: (init?: {\n body?: {\n code: string;\n token: string;\n };\n } | undefined) => PaystackApiResult<any>;\n subscription_manage_link?: (init: {\n params: {\n path: {\n code: string;\n };\n };\n }) => PaystackApiResult<any>;\n customer?: {\n create?: (params: any) => Promise<any>;\n };\n transaction?: {\n initialize?: (params: any) => Promise<any>;\n verify?: (reference: string) => Promise<any>;\n };\n subscription?: {\n fetch?: (idOrCode: string) => Promise<any>;\n disable?: (params: any) => Promise<any>;\n enable?: (params: any) => Promise<any>;\n manage?: {\n link?: (code: string) => Promise<any>;\n };\n };\n};\ntype NoInfer<T> = [T][T extends any ? 0 : never];\nexport type AuthSession = {\n user: User;\n session: Session;\n} & Record<string, any>;\nexport type PaystackPlan = {\n /** Human name stored in DB (lowercased). */\n name: string;\n /** Paystack plan code (if you use Paystack plans). */\n planCode?: string | undefined;\n /** Amount in the smallest currency unit (e.g. kobo). */\n amount?: number | undefined;\n /** Currency ISO code (e.g. NGN). */\n currency?: string | undefined;\n /** Paystack interval keyword (when using Paystack plans). */\n interval?: \"daily\" | \"weekly\" | \"monthly\" | \"quarterly\" | \"biannually\" | \"annually\" | undefined;\n /** Optional invoice limit; Paystack uses `invoice_limit` during init. */\n invoiceLimit?: number | undefined;\n /** Arbitrary limits (stored/consumed by your app). */\n limits?: Record<string, unknown> | undefined;\n /** Optional free trial config, if your app supports it. */\n freeTrial?: {\n days: number;\n } | undefined;\n};\nexport interface Subscription {\n id: string;\n plan: string;\n referenceId: string;\n paystackCustomerCode?: string | undefined;\n paystackSubscriptionCode?: string | undefined;\n paystackTransactionReference?: string | undefined;\n status: \"active\" | \"canceled\" | \"incomplete\" | \"incomplete_expired\" | \"paused\" | \"trialing\" | \"unpaid\";\n periodStart?: Date | undefined;\n periodEnd?: Date | undefined;\n trialStart?: Date | undefined;\n trialEnd?: Date | undefined;\n cancelAtPeriodEnd?: boolean | undefined;\n groupId?: string | undefined;\n seats?: number | undefined;\n}\nexport type SubscriptionOptions = {\n plans: PaystackPlan[] | (() => PaystackPlan[] | Promise<PaystackPlan[]>);\n requireEmailVerification?: boolean | undefined;\n authorizeReference?: ((data: {\n user: User;\n session: AuthSession;\n referenceId: string;\n action: \"initialize-transaction\" | \"verify-transaction\" | \"list-subscriptions\" | \"disable-subscription\" | \"enable-subscription\";\n }, ctx: GenericEndpointContext) => Promise<boolean>) | undefined;\n onSubscriptionComplete?: ((data: {\n event: any;\n subscription: Subscription;\n plan: PaystackPlan;\n }, ctx: GenericEndpointContext) => Promise<void>) | undefined;\n onSubscriptionUpdate?: ((data: {\n event: any;\n subscription: Subscription;\n }, ctx: GenericEndpointContext) => Promise<void>) | undefined;\n onSubscriptionDelete?: ((data: {\n event: any;\n subscription: Subscription;\n }, ctx: GenericEndpointContext) => Promise<void>) | undefined;\n};\nexport interface PaystackOptions<TPaystackClient extends PaystackClientLike = PaystackNodeClient> {\n /** Paystack SDK instance (recommended: `@alexasomba/paystack-node` via `createPaystack({ secretKey })`). */\n paystackClient: NoInfer<TPaystackClient>;\n /** Paystack webhook secret used to verify `x-paystack-signature`. */\n paystackWebhookSecret: string;\n /** Enable customer creation on Better Auth sign up. */\n createCustomerOnSignUp?: boolean | undefined;\n onCustomerCreate?: ((data: {\n paystackCustomer: any;\n user: User & {\n paystackCustomerCode: string;\n };\n }, ctx: GenericEndpointContext) => Promise<void>) | undefined;\n getCustomerCreateParams?: ((user: User, ctx: GenericEndpointContext) => Promise<Record<string, any>>) | undefined;\n subscription?: ({\n enabled: false;\n } | ({\n enabled: true;\n } & SubscriptionOptions)) | undefined;\n onEvent?: ((event: any) => Promise<void>) | undefined;\n schema?: InferOptionSchema<typeof subscriptions & typeof user> | undefined;\n}\nexport interface InputSubscription extends Omit<Subscription, \"id\"> {\n}\nexport {};\n//# sourceMappingURL=types.d.ts.map"],"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-
|
|
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
2
|
export { PaystackOptions, PaystackPlan, PaystackPlugin, Subscription, SubscriptionOptions, paystack };
|
package/dist/index.mjs
CHANGED
|
@@ -5,7 +5,7 @@ import { APIError, getSessionFromCtx, originCheck, sessionMiddleware } from "bet
|
|
|
5
5
|
import * as z from "zod/v4";
|
|
6
6
|
import { mergeSchema } from "better-auth/db";
|
|
7
7
|
|
|
8
|
-
//#region node_modules/.pnpm/@better-auth+core@1.4.7_@better-auth+utils@0.3.0_@better-fetch+fetch@1.1.21_better-
|
|
8
|
+
//#region node_modules/.pnpm/@better-auth+core@1.4.7_@better-auth+utils@0.3.0_@better-fetch+fetch@1.1.21_better-call_d24665956e428978271bbb947eda0893/node_modules/@better-auth/core/dist/env-DbssmzoK.mjs
|
|
9
9
|
const _envShim = Object.create(null);
|
|
10
10
|
const _getEnv = (useShim) => globalThis.process?.env || globalThis.Deno?.env.toObject() || globalThis.__env__ || (useShim ? _envShim : globalThis);
|
|
11
11
|
const env = new Proxy(_envShim, {
|
|
@@ -226,13 +226,13 @@ const createLogger = (options) => {
|
|
|
226
226
|
const logger$1 = createLogger();
|
|
227
227
|
|
|
228
228
|
//#endregion
|
|
229
|
-
//#region node_modules/.pnpm/@better-auth+core@1.4.7_@better-auth+utils@0.3.0_@better-fetch+fetch@1.1.21_better-
|
|
229
|
+
//#region node_modules/.pnpm/@better-auth+core@1.4.7_@better-auth+utils@0.3.0_@better-fetch+fetch@1.1.21_better-call_d24665956e428978271bbb947eda0893/node_modules/@better-auth/core/dist/utils-NloIXYE0.mjs
|
|
230
230
|
function defineErrorCodes(codes) {
|
|
231
231
|
return codes;
|
|
232
232
|
}
|
|
233
233
|
|
|
234
234
|
//#endregion
|
|
235
|
-
//#region node_modules/.pnpm/@better-auth+core@1.4.7_@better-auth+utils@0.3.0_@better-fetch+fetch@1.1.21_better-
|
|
235
|
+
//#region node_modules/.pnpm/@better-auth+core@1.4.7_@better-auth+utils@0.3.0_@better-fetch+fetch@1.1.21_better-call_d24665956e428978271bbb947eda0893/node_modules/@better-auth/core/dist/async_hooks/index.mjs
|
|
236
236
|
const AsyncLocalStoragePromise = import(
|
|
237
237
|
/* @vite-ignore */
|
|
238
238
|
/* webpackIgnore: true */
|
|
@@ -252,7 +252,7 @@ async function getAsyncLocalStorage() {
|
|
|
252
252
|
}
|
|
253
253
|
|
|
254
254
|
//#endregion
|
|
255
|
-
//#region node_modules/.pnpm/@better-auth+core@1.4.7_@better-auth+utils@0.3.0_@better-fetch+fetch@1.1.21_better-
|
|
255
|
+
//#region node_modules/.pnpm/@better-auth+core@1.4.7_@better-auth+utils@0.3.0_@better-fetch+fetch@1.1.21_better-call_d24665956e428978271bbb947eda0893/node_modules/@better-auth/core/dist/context-DblZrIwO.mjs
|
|
256
256
|
let currentContextAsyncStorage = null;
|
|
257
257
|
const ensureAsyncStorage$2 = async () => {
|
|
258
258
|
if (!currentContextAsyncStorage) currentContextAsyncStorage = new (await (getAsyncLocalStorage()))();
|
|
@@ -263,7 +263,7 @@ async function runWithEndpointContext(context, fn) {
|
|
|
263
263
|
}
|
|
264
264
|
|
|
265
265
|
//#endregion
|
|
266
|
-
//#region node_modules/.pnpm/@better-auth+core@1.4.7_@better-auth+utils@0.3.0_@better-fetch+fetch@1.1.21_better-
|
|
266
|
+
//#region node_modules/.pnpm/@better-auth+core@1.4.7_@better-auth+utils@0.3.0_@better-fetch+fetch@1.1.21_better-call_d24665956e428978271bbb947eda0893/node_modules/@better-auth/core/dist/api/index.mjs
|
|
267
267
|
const optionsMiddleware = createMiddleware(async () => {
|
|
268
268
|
/**
|
|
269
269
|
* This will be passed on the instance of
|
|
@@ -523,18 +523,35 @@ const initializeTransaction = (options) => {
|
|
|
523
523
|
}, async (ctx) => {
|
|
524
524
|
const paystack$1 = getPaystackOps(options.paystackClient);
|
|
525
525
|
if (!subscriptionOptions?.enabled) throw new APIError("BAD_REQUEST", { message: "Subscriptions are not enabled in the Paystack options." });
|
|
526
|
+
if (ctx.body.callbackURL) {
|
|
527
|
+
const isTrustedOriginFn = ctx.context?.isTrustedOrigin;
|
|
528
|
+
if (!(isTrustedOriginFn ? isTrustedOriginFn(ctx.body.callbackURL, { allowRelativePaths: true }) : (() => {
|
|
529
|
+
try {
|
|
530
|
+
if (ctx.body.callbackURL.startsWith("/")) return true;
|
|
531
|
+
const baseUrl = ctx.context?.baseURL ?? ctx.request?.url ?? "";
|
|
532
|
+
if (!baseUrl) return false;
|
|
533
|
+
const baseOrigin = new URL(baseUrl).origin;
|
|
534
|
+
return new URL(ctx.body.callbackURL).origin === baseOrigin;
|
|
535
|
+
} catch {
|
|
536
|
+
return false;
|
|
537
|
+
}
|
|
538
|
+
})())) throw new APIError("FORBIDDEN", {
|
|
539
|
+
message: "callbackURL is not a trusted origin.",
|
|
540
|
+
status: 403
|
|
541
|
+
});
|
|
542
|
+
}
|
|
526
543
|
const session = await getSessionFromCtx(ctx);
|
|
527
544
|
if (!session) throw new APIError("UNAUTHORIZED");
|
|
528
545
|
const user$1 = session.user;
|
|
529
546
|
const referenceIdFromCtx = ctx.context.referenceId;
|
|
530
547
|
const referenceId = ctx.body.referenceId || referenceIdFromCtx || session.user.id;
|
|
531
548
|
if (subscriptionOptions.requireEmailVerification && !user$1.emailVerified) throw new APIError("BAD_REQUEST", {
|
|
532
|
-
code:
|
|
549
|
+
code: "EMAIL_VERIFICATION_REQUIRED",
|
|
533
550
|
message: PAYSTACK_ERROR_CODES.EMAIL_VERIFICATION_REQUIRED
|
|
534
551
|
});
|
|
535
552
|
const plan = await getPlanByName(options, ctx.body.plan);
|
|
536
553
|
if (!plan) throw new APIError("BAD_REQUEST", {
|
|
537
|
-
code:
|
|
554
|
+
code: "SUBSCRIPTION_PLAN_NOT_FOUND",
|
|
538
555
|
message: PAYSTACK_ERROR_CODES.SUBSCRIPTION_PLAN_NOT_FOUND
|
|
539
556
|
});
|
|
540
557
|
if (!plan.planCode && !plan.amount) throw new APIError("BAD_REQUEST", { message: "Paystack transaction initialization requires either plan.planCode (Paystack plan code) or plan.amount (smallest unit)." });
|
|
@@ -564,7 +581,7 @@ const initializeTransaction = (options) => {
|
|
|
564
581
|
} catch (error) {
|
|
565
582
|
ctx.context.logger.error("Failed to initialize Paystack transaction", error);
|
|
566
583
|
throw new APIError("BAD_REQUEST", {
|
|
567
|
-
code:
|
|
584
|
+
code: "FAILED_TO_INITIALIZE_TRANSACTION",
|
|
568
585
|
message: error?.message || PAYSTACK_ERROR_CODES.FAILED_TO_INITIALIZE_TRANSACTION
|
|
569
586
|
});
|
|
570
587
|
}
|
|
@@ -588,11 +605,11 @@ const initializeTransaction = (options) => {
|
|
|
588
605
|
});
|
|
589
606
|
};
|
|
590
607
|
const verifyTransaction = (options) => {
|
|
591
|
-
const
|
|
608
|
+
const verifyBodySchema = z.object({ reference: z.string() });
|
|
592
609
|
const subscriptionOptions = options.subscription;
|
|
593
610
|
return createAuthEndpoint("/paystack/transaction/verify", {
|
|
594
|
-
method: "
|
|
595
|
-
|
|
611
|
+
method: "POST",
|
|
612
|
+
body: verifyBodySchema,
|
|
596
613
|
use: subscriptionOptions?.enabled ? [
|
|
597
614
|
sessionMiddleware,
|
|
598
615
|
originCheck,
|
|
@@ -602,18 +619,20 @@ const verifyTransaction = (options) => {
|
|
|
602
619
|
const paystack$1 = getPaystackOps(options.paystackClient);
|
|
603
620
|
let verifyRes;
|
|
604
621
|
try {
|
|
605
|
-
verifyRes = unwrapSdkResult(await paystack$1.transactionVerify(ctx.
|
|
622
|
+
verifyRes = unwrapSdkResult(await paystack$1.transactionVerify(ctx.body.reference));
|
|
606
623
|
} catch (error) {
|
|
607
624
|
ctx.context.logger.error("Failed to verify Paystack transaction", error);
|
|
608
625
|
throw new APIError("BAD_REQUEST", {
|
|
609
|
-
code:
|
|
626
|
+
code: "FAILED_TO_VERIFY_TRANSACTION",
|
|
610
627
|
message: error?.message || PAYSTACK_ERROR_CODES.FAILED_TO_VERIFY_TRANSACTION
|
|
611
628
|
});
|
|
612
629
|
}
|
|
613
630
|
const data = verifyRes && typeof verifyRes === "object" && "status" in verifyRes && "data" in verifyRes ? verifyRes.data : verifyRes?.data ?? verifyRes;
|
|
614
631
|
const status = data?.status;
|
|
615
|
-
const reference = data?.reference ?? ctx.
|
|
632
|
+
const reference = data?.reference ?? ctx.body.reference;
|
|
616
633
|
if (status === "success") try {
|
|
634
|
+
const session = await getSessionFromCtx(ctx);
|
|
635
|
+
const referenceId = ctx.context.referenceId ?? (session?.user)?.id;
|
|
617
636
|
await ctx.context.adapter.update({
|
|
618
637
|
model: "subscription",
|
|
619
638
|
update: {
|
|
@@ -624,7 +643,10 @@ const verifyTransaction = (options) => {
|
|
|
624
643
|
where: [{
|
|
625
644
|
field: "paystackTransactionReference",
|
|
626
645
|
value: reference
|
|
627
|
-
}
|
|
646
|
+
}, ...referenceId ? [{
|
|
647
|
+
field: "referenceId",
|
|
648
|
+
value: referenceId
|
|
649
|
+
}] : []]
|
|
628
650
|
});
|
|
629
651
|
} catch (e) {
|
|
630
652
|
ctx.context.logger.error("Failed to update subscription after transaction verification", e);
|
|
@@ -719,7 +741,7 @@ const disablePaystackSubscription = (options) => {
|
|
|
719
741
|
} catch (error) {
|
|
720
742
|
ctx.context.logger.error("Failed to disable Paystack subscription", error);
|
|
721
743
|
throw new APIError("BAD_REQUEST", {
|
|
722
|
-
code:
|
|
744
|
+
code: "FAILED_TO_DISABLE_SUBSCRIPTION",
|
|
723
745
|
message: error?.message || PAYSTACK_ERROR_CODES.FAILED_TO_DISABLE_SUBSCRIPTION
|
|
724
746
|
});
|
|
725
747
|
}
|
|
@@ -758,7 +780,7 @@ const enablePaystackSubscription = (options) => {
|
|
|
758
780
|
} catch (error) {
|
|
759
781
|
ctx.context.logger.error("Failed to enable Paystack subscription", error);
|
|
760
782
|
throw new APIError("BAD_REQUEST", {
|
|
761
|
-
code:
|
|
783
|
+
code: "FAILED_TO_ENABLE_SUBSCRIPTION",
|
|
762
784
|
message: error?.message || PAYSTACK_ERROR_CODES.FAILED_TO_ENABLE_SUBSCRIPTION
|
|
763
785
|
});
|
|
764
786
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["logger","metadata: any","where: Array<{ field: string; value: any }>","e: any","paystack","user","url: string | undefined","reference: string | undefined","accessCode: string | undefined","initBody: any","error: any","verifyRes: any","baseSchema: BetterAuthPluginDBSchema","user","e: any"],"sources":["../node_modules/.pnpm/@better-auth+core@1.4.7_@better-auth+utils@0.3.0_@better-fetch+fetch@1.1.21_better-call_3563929c6579aa89e38f28ea99bd09aa/node_modules/@better-auth/core/dist/env-DbssmzoK.mjs","../node_modules/.pnpm/@better-auth+core@1.4.7_@better-auth+utils@0.3.0_@better-fetch+fetch@1.1.21_better-call_3563929c6579aa89e38f28ea99bd09aa/node_modules/@better-auth/core/dist/utils-NloIXYE0.mjs","../node_modules/.pnpm/@better-auth+core@1.4.7_@better-auth+utils@0.3.0_@better-fetch+fetch@1.1.21_better-call_3563929c6579aa89e38f28ea99bd09aa/node_modules/@better-auth/core/dist/async_hooks/index.mjs","../node_modules/.pnpm/@better-auth+core@1.4.7_@better-auth+utils@0.3.0_@better-fetch+fetch@1.1.21_better-call_3563929c6579aa89e38f28ea99bd09aa/node_modules/@better-auth/core/dist/context-DblZrIwO.mjs","../node_modules/.pnpm/@better-auth+core@1.4.7_@better-auth+utils@0.3.0_@better-fetch+fetch@1.1.21_better-call_3563929c6579aa89e38f28ea99bd09aa/node_modules/@better-auth/core/dist/api/index.mjs","../src/utils.ts","../src/middleware.ts","../src/paystack-sdk.ts","../src/routes.ts","../src/schema.ts","../src/index.ts"],"sourcesContent":["//#region src/env/env-impl.ts\nconst _envShim = Object.create(null);\nconst _getEnv = (useShim) => globalThis.process?.env || globalThis.Deno?.env.toObject() || globalThis.__env__ || (useShim ? _envShim : globalThis);\nconst env = new Proxy(_envShim, {\n\tget(_, prop) {\n\t\treturn _getEnv()[prop] ?? _envShim[prop];\n\t},\n\thas(_, prop) {\n\t\treturn prop in _getEnv() || prop in _envShim;\n\t},\n\tset(_, prop, value) {\n\t\tconst env$1 = _getEnv(true);\n\t\tenv$1[prop] = value;\n\t\treturn true;\n\t},\n\tdeleteProperty(_, prop) {\n\t\tif (!prop) return false;\n\t\tconst env$1 = _getEnv(true);\n\t\tdelete env$1[prop];\n\t\treturn true;\n\t},\n\townKeys() {\n\t\tconst env$1 = _getEnv(true);\n\t\treturn Object.keys(env$1);\n\t}\n});\nfunction toBoolean(val) {\n\treturn val ? val !== \"false\" : false;\n}\nconst nodeENV = typeof process !== \"undefined\" && process.env && process.env.NODE_ENV || \"\";\n/** Detect if `NODE_ENV` environment variable is `production` */\nconst isProduction = nodeENV === \"production\";\n/** Detect if `NODE_ENV` environment variable is `dev` or `development` */\nconst isDevelopment = () => nodeENV === \"dev\" || nodeENV === \"development\";\n/** Detect if `NODE_ENV` environment variable is `test` */\nconst isTest = () => nodeENV === \"test\" || toBoolean(env.TEST);\n/**\n* Get environment variable with fallback\n*/\nfunction getEnvVar(key, fallback) {\n\tif (typeof process !== \"undefined\" && process.env) return process.env[key] ?? fallback;\n\tif (typeof Deno !== \"undefined\") return Deno.env.get(key) ?? fallback;\n\tif (typeof Bun !== \"undefined\") return Bun.env[key] ?? fallback;\n\treturn fallback;\n}\n/**\n* Get boolean environment variable\n*/\nfunction getBooleanEnvVar(key, fallback = true) {\n\tconst value = getEnvVar(key);\n\tif (!value) return fallback;\n\treturn value !== \"0\" && value.toLowerCase() !== \"false\" && value !== \"\";\n}\n/**\n* Common environment variables used in Better Auth\n*/\nconst ENV = Object.freeze({\n\tget BETTER_AUTH_SECRET() {\n\t\treturn getEnvVar(\"BETTER_AUTH_SECRET\");\n\t},\n\tget AUTH_SECRET() {\n\t\treturn getEnvVar(\"AUTH_SECRET\");\n\t},\n\tget BETTER_AUTH_TELEMETRY() {\n\t\treturn getEnvVar(\"BETTER_AUTH_TELEMETRY\");\n\t},\n\tget BETTER_AUTH_TELEMETRY_ID() {\n\t\treturn getEnvVar(\"BETTER_AUTH_TELEMETRY_ID\");\n\t},\n\tget NODE_ENV() {\n\t\treturn getEnvVar(\"NODE_ENV\", \"development\");\n\t},\n\tget PACKAGE_VERSION() {\n\t\treturn getEnvVar(\"PACKAGE_VERSION\", \"0.0.0\");\n\t},\n\tget BETTER_AUTH_TELEMETRY_ENDPOINT() {\n\t\treturn getEnvVar(\"BETTER_AUTH_TELEMETRY_ENDPOINT\", \"https://telemetry.better-auth.com/v1/track\");\n\t}\n});\n\n//#endregion\n//#region src/env/color-depth.ts\nconst COLORS_2 = 1;\nconst COLORS_16 = 4;\nconst COLORS_256 = 8;\nconst COLORS_16m = 24;\nconst TERM_ENVS = {\n\teterm: COLORS_16,\n\tcons25: COLORS_16,\n\tconsole: COLORS_16,\n\tcygwin: COLORS_16,\n\tdtterm: COLORS_16,\n\tgnome: COLORS_16,\n\thurd: COLORS_16,\n\tjfbterm: COLORS_16,\n\tkonsole: COLORS_16,\n\tkterm: COLORS_16,\n\tmlterm: COLORS_16,\n\tmosh: COLORS_16m,\n\tputty: COLORS_16,\n\tst: COLORS_16,\n\t\"rxvt-unicode-24bit\": COLORS_16m,\n\tterminator: COLORS_16m,\n\t\"xterm-kitty\": COLORS_16m\n};\nconst CI_ENVS_MAP = new Map(Object.entries({\n\tAPPVEYOR: COLORS_256,\n\tBUILDKITE: COLORS_256,\n\tCIRCLECI: COLORS_16m,\n\tDRONE: COLORS_256,\n\tGITEA_ACTIONS: COLORS_16m,\n\tGITHUB_ACTIONS: COLORS_16m,\n\tGITLAB_CI: COLORS_256,\n\tTRAVIS: COLORS_256\n}));\nconst TERM_ENVS_REG_EXP = [\n\t/ansi/,\n\t/color/,\n\t/linux/,\n\t/direct/,\n\t/^con[0-9]*x[0-9]/,\n\t/^rxvt/,\n\t/^screen/,\n\t/^xterm/,\n\t/^vt100/,\n\t/^vt220/\n];\nfunction getColorDepth() {\n\tif (getEnvVar(\"FORCE_COLOR\") !== void 0) switch (getEnvVar(\"FORCE_COLOR\")) {\n\t\tcase \"\":\n\t\tcase \"1\":\n\t\tcase \"true\": return COLORS_16;\n\t\tcase \"2\": return COLORS_256;\n\t\tcase \"3\": return COLORS_16m;\n\t\tdefault: return COLORS_2;\n\t}\n\tif (getEnvVar(\"NODE_DISABLE_COLORS\") !== void 0 && getEnvVar(\"NODE_DISABLE_COLORS\") !== \"\" || getEnvVar(\"NO_COLOR\") !== void 0 && getEnvVar(\"NO_COLOR\") !== \"\" || getEnvVar(\"TERM\") === \"dumb\") return COLORS_2;\n\tif (getEnvVar(\"TMUX\")) return COLORS_16m;\n\tif (\"TF_BUILD\" in env && \"AGENT_NAME\" in env) return COLORS_16;\n\tif (\"CI\" in env) {\n\t\tfor (const { 0: envName, 1: colors } of CI_ENVS_MAP) if (envName in env) return colors;\n\t\tif (getEnvVar(\"CI_NAME\") === \"codeship\") return COLORS_256;\n\t\treturn COLORS_2;\n\t}\n\tif (\"TEAMCITY_VERSION\" in env) return /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.exec(getEnvVar(\"TEAMCITY_VERSION\")) !== null ? COLORS_16 : COLORS_2;\n\tswitch (getEnvVar(\"TERM_PROGRAM\")) {\n\t\tcase \"iTerm.app\":\n\t\t\tif (!getEnvVar(\"TERM_PROGRAM_VERSION\") || /^[0-2]\\./.exec(getEnvVar(\"TERM_PROGRAM_VERSION\")) !== null) return COLORS_256;\n\t\t\treturn COLORS_16m;\n\t\tcase \"HyperTerm\":\n\t\tcase \"MacTerm\": return COLORS_16m;\n\t\tcase \"Apple_Terminal\": return COLORS_256;\n\t}\n\tif (getEnvVar(\"COLORTERM\") === \"truecolor\" || getEnvVar(\"COLORTERM\") === \"24bit\") return COLORS_16m;\n\tif (getEnvVar(\"TERM\")) {\n\t\tif (/truecolor/.exec(getEnvVar(\"TERM\")) !== null) return COLORS_16m;\n\t\tif (/^xterm-256/.exec(getEnvVar(\"TERM\")) !== null) return COLORS_256;\n\t\tconst termEnv = getEnvVar(\"TERM\").toLowerCase();\n\t\tif (TERM_ENVS[termEnv]) return TERM_ENVS[termEnv];\n\t\tif (TERM_ENVS_REG_EXP.some((term) => term.exec(termEnv) !== null)) return COLORS_16;\n\t}\n\tif (getEnvVar(\"COLORTERM\")) return COLORS_16;\n\treturn COLORS_2;\n}\n\n//#endregion\n//#region src/env/logger.ts\nconst TTY_COLORS = {\n\treset: \"\\x1B[0m\",\n\tbright: \"\\x1B[1m\",\n\tdim: \"\\x1B[2m\",\n\tundim: \"\\x1B[22m\",\n\tunderscore: \"\\x1B[4m\",\n\tblink: \"\\x1B[5m\",\n\treverse: \"\\x1B[7m\",\n\thidden: \"\\x1B[8m\",\n\tfg: {\n\t\tblack: \"\\x1B[30m\",\n\t\tred: \"\\x1B[31m\",\n\t\tgreen: \"\\x1B[32m\",\n\t\tyellow: \"\\x1B[33m\",\n\t\tblue: \"\\x1B[34m\",\n\t\tmagenta: \"\\x1B[35m\",\n\t\tcyan: \"\\x1B[36m\",\n\t\twhite: \"\\x1B[37m\"\n\t},\n\tbg: {\n\t\tblack: \"\\x1B[40m\",\n\t\tred: \"\\x1B[41m\",\n\t\tgreen: \"\\x1B[42m\",\n\t\tyellow: \"\\x1B[43m\",\n\t\tblue: \"\\x1B[44m\",\n\t\tmagenta: \"\\x1B[45m\",\n\t\tcyan: \"\\x1B[46m\",\n\t\twhite: \"\\x1B[47m\"\n\t}\n};\nconst levels = [\n\t\"debug\",\n\t\"info\",\n\t\"success\",\n\t\"warn\",\n\t\"error\"\n];\nfunction shouldPublishLog(currentLogLevel, logLevel) {\n\treturn levels.indexOf(logLevel) >= levels.indexOf(currentLogLevel);\n}\nconst levelColors = {\n\tinfo: TTY_COLORS.fg.blue,\n\tsuccess: TTY_COLORS.fg.green,\n\twarn: TTY_COLORS.fg.yellow,\n\terror: TTY_COLORS.fg.red,\n\tdebug: TTY_COLORS.fg.magenta\n};\nconst formatMessage = (level, message, colorsEnabled) => {\n\tconst timestamp = (/* @__PURE__ */ new Date()).toISOString();\n\tif (colorsEnabled) return `${TTY_COLORS.dim}${timestamp}${TTY_COLORS.reset} ${levelColors[level]}${level.toUpperCase()}${TTY_COLORS.reset} ${TTY_COLORS.bright}[Better Auth]:${TTY_COLORS.reset} ${message}`;\n\treturn `${timestamp} ${level.toUpperCase()} [Better Auth]: ${message}`;\n};\nconst createLogger = (options) => {\n\tconst enabled = options?.disabled !== true;\n\tconst logLevel = options?.level ?? \"error\";\n\tconst colorsEnabled = options?.disableColors !== void 0 ? !options.disableColors : getColorDepth() !== 1;\n\tconst LogFunc = (level, message, args = []) => {\n\t\tif (!enabled || !shouldPublishLog(logLevel, level)) return;\n\t\tconst formattedMessage = formatMessage(level, message, colorsEnabled);\n\t\tif (!options || typeof options.log !== \"function\") {\n\t\t\tif (level === \"error\") console.error(formattedMessage, ...args);\n\t\t\telse if (level === \"warn\") console.warn(formattedMessage, ...args);\n\t\t\telse console.log(formattedMessage, ...args);\n\t\t\treturn;\n\t\t}\n\t\toptions.log(level === \"success\" ? \"info\" : level, message, ...args);\n\t};\n\treturn {\n\t\t...Object.fromEntries(levels.map((level) => [level, (...[message, ...args]) => LogFunc(level, message, args)])),\n\t\tget level() {\n\t\t\treturn logLevel;\n\t\t}\n\t};\n};\nconst logger = createLogger();\n\n//#endregion\nexport { shouldPublishLog as a, env as c, isDevelopment as d, isProduction as f, logger as i, getBooleanEnvVar as l, nodeENV as m, createLogger as n, getColorDepth as o, isTest as p, levels as r, ENV as s, TTY_COLORS as t, getEnvVar as u };","import { i as logger } from \"./env-DbssmzoK.mjs\";\nimport { createRandomStringGenerator } from \"@better-auth/utils/random\";\n\n//#region src/utils/error-codes.ts\nfunction defineErrorCodes(codes) {\n\treturn codes;\n}\n\n//#endregion\n//#region src/utils/id.ts\nconst generateId = (size) => {\n\treturn createRandomStringGenerator(\"a-z\", \"A-Z\", \"0-9\")(size || 32);\n};\n\n//#endregion\n//#region src/utils/json.ts\nfunction safeJSONParse(data) {\n\tfunction reviver(_, value) {\n\t\tif (typeof value === \"string\") {\n\t\t\tif (/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z$/.test(value)) {\n\t\t\t\tconst date = new Date(value);\n\t\t\t\tif (!isNaN(date.getTime())) return date;\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t}\n\ttry {\n\t\tif (typeof data !== \"string\") return data;\n\t\treturn JSON.parse(data, reviver);\n\t} catch (e) {\n\t\tlogger.error(\"Error parsing JSON\", { error: e });\n\t\treturn null;\n\t}\n}\n\n//#endregion\n//#region src/utils/string.ts\nfunction capitalizeFirstLetter(str) {\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n//#endregion\nexport { defineErrorCodes as i, safeJSONParse as n, generateId as r, capitalizeFirstLetter as t };","//#region src/async_hooks/index.ts\nconst AsyncLocalStoragePromise = import(\n\t/* @vite-ignore */\n\t/* webpackIgnore: true */\n\t\"node:async_hooks\"\n).then((mod) => mod.AsyncLocalStorage).catch((err) => {\n\tif (\"AsyncLocalStorage\" in globalThis) return globalThis.AsyncLocalStorage;\n\tif (typeof window !== \"undefined\") return null;\n\tconsole.warn(\"[better-auth] Warning: AsyncLocalStorage is not available in this environment. Some features may not work as expected.\");\n\tconsole.warn(\"[better-auth] Please read more about this warning at https://better-auth.com/docs/installation#mount-handler\");\n\tconsole.warn(\"[better-auth] If you are using Cloudflare Workers, please see: https://developers.cloudflare.com/workers/configuration/compatibility-flags/#nodejs-compatibility-flag\");\n\tthrow err;\n});\nasync function getAsyncLocalStorage() {\n\tconst mod = await AsyncLocalStoragePromise;\n\tif (mod === null) throw new Error(\"getAsyncLocalStorage is only available in server code\");\n\telse return mod;\n}\n\n//#endregion\nexport { getAsyncLocalStorage };","import { getAsyncLocalStorage } from \"@better-auth/core/async_hooks\";\n\n//#region src/context/endpoint-context.ts\nlet currentContextAsyncStorage = null;\nconst ensureAsyncStorage$2 = async () => {\n\tif (!currentContextAsyncStorage) currentContextAsyncStorage = new (await (getAsyncLocalStorage()))();\n\treturn currentContextAsyncStorage;\n};\n/**\n* This is for internal use only. Most users should use `getCurrentAuthContext` instead.\n*\n* It is exposed for advanced use cases where you need direct access to the AsyncLocalStorage instance.\n*/\nasync function getCurrentAuthContextAsyncLocalStorage() {\n\treturn ensureAsyncStorage$2();\n}\nasync function getCurrentAuthContext() {\n\tconst context = (await ensureAsyncStorage$2()).getStore();\n\tif (!context) throw new Error(\"No auth context found. Please make sure you are calling this function within a `runWithEndpointContext` callback.\");\n\treturn context;\n}\nasync function runWithEndpointContext(context, fn) {\n\treturn (await ensureAsyncStorage$2()).run(context, fn);\n}\n\n//#endregion\n//#region src/context/request-state.ts\nlet requestStateAsyncStorage = null;\nconst ensureAsyncStorage$1 = async () => {\n\tif (!requestStateAsyncStorage) requestStateAsyncStorage = new (await (getAsyncLocalStorage()))();\n\treturn requestStateAsyncStorage;\n};\nasync function getRequestStateAsyncLocalStorage() {\n\treturn ensureAsyncStorage$1();\n}\nasync function hasRequestState() {\n\treturn (await ensureAsyncStorage$1()).getStore() !== void 0;\n}\nasync function getCurrentRequestState() {\n\tconst store = (await ensureAsyncStorage$1()).getStore();\n\tif (!store) throw new Error(\"No request state found. Please make sure you are calling this function within a `runWithRequestState` callback.\");\n\treturn store;\n}\nasync function runWithRequestState(store, fn) {\n\treturn (await ensureAsyncStorage$1()).run(store, fn);\n}\nfunction defineRequestState(initFn) {\n\tconst ref = Object.freeze({});\n\treturn {\n\t\tget ref() {\n\t\t\treturn ref;\n\t\t},\n\t\tasync get() {\n\t\t\tconst store = await getCurrentRequestState();\n\t\t\tif (!store.has(ref)) {\n\t\t\t\tconst initialValue = await initFn();\n\t\t\t\tstore.set(ref, initialValue);\n\t\t\t\treturn initialValue;\n\t\t\t}\n\t\t\treturn store.get(ref);\n\t\t},\n\t\tasync set(value) {\n\t\t\t(await getCurrentRequestState()).set(ref, value);\n\t\t}\n\t};\n}\n\n//#endregion\n//#region src/context/transaction.ts\nlet currentAdapterAsyncStorage = null;\nconst ensureAsyncStorage = async () => {\n\tif (!currentAdapterAsyncStorage) currentAdapterAsyncStorage = new (await (getAsyncLocalStorage()))();\n\treturn currentAdapterAsyncStorage;\n};\n/**\n* This is for internal use only. Most users should use `getCurrentAdapter` instead.\n*\n* It is exposed for advanced use cases where you need direct access to the AsyncLocalStorage instance.\n*/\nconst getCurrentDBAdapterAsyncLocalStorage = async () => {\n\treturn ensureAsyncStorage();\n};\nconst getCurrentAdapter = async (fallback) => {\n\treturn ensureAsyncStorage().then((als) => {\n\t\treturn als.getStore() || fallback;\n\t}).catch(() => {\n\t\treturn fallback;\n\t});\n};\nconst runWithAdapter = async (adapter, fn) => {\n\tlet called = true;\n\treturn ensureAsyncStorage().then((als) => {\n\t\tcalled = true;\n\t\treturn als.run(adapter, fn);\n\t}).catch((err) => {\n\t\tif (!called) return fn();\n\t\tthrow err;\n\t});\n};\nconst runWithTransaction = async (adapter, fn) => {\n\tlet called = true;\n\treturn ensureAsyncStorage().then((als) => {\n\t\tcalled = true;\n\t\treturn adapter.transaction(async (trx) => {\n\t\t\treturn als.run(trx, fn);\n\t\t});\n\t}).catch((err) => {\n\t\tif (!called) return fn();\n\t\tthrow err;\n\t});\n};\n\n//#endregion\nexport { defineRequestState as a, hasRequestState as c, getCurrentAuthContextAsyncLocalStorage as d, runWithEndpointContext as f, runWithTransaction as i, runWithRequestState as l, getCurrentDBAdapterAsyncLocalStorage as n, getCurrentRequestState as o, runWithAdapter as r, getRequestStateAsyncLocalStorage as s, getCurrentAdapter as t, getCurrentAuthContext as u };","import { f as runWithEndpointContext } from \"../context-DblZrIwO.mjs\";\nimport { createEndpoint, createMiddleware } from \"better-call\";\n\n//#region src/api/index.ts\nconst optionsMiddleware = createMiddleware(async () => {\n\t/**\n\t* This will be passed on the instance of\n\t* the context. Used to infer the type\n\t* here.\n\t*/\n\treturn {};\n});\nconst createAuthMiddleware = createMiddleware.create({ use: [optionsMiddleware, createMiddleware(async () => {\n\treturn {};\n})] });\nconst use = [optionsMiddleware];\nfunction createAuthEndpoint(pathOrOptions, handlerOrOptions, handlerOrNever) {\n\tconst path = typeof pathOrOptions === \"string\" ? pathOrOptions : void 0;\n\tconst options = typeof handlerOrOptions === \"object\" ? handlerOrOptions : pathOrOptions;\n\tconst handler = typeof handlerOrOptions === \"function\" ? handlerOrOptions : handlerOrNever;\n\tif (path) return createEndpoint(path, {\n\t\t...options,\n\t\tuse: [...options?.use || [], ...use]\n\t}, async (ctx) => runWithEndpointContext(ctx, () => handler(ctx)));\n\treturn createEndpoint({\n\t\t...options,\n\t\tuse: [...options?.use || [], ...use]\n\t}, async (ctx) => runWithEndpointContext(ctx, () => handler(ctx)));\n}\n\n//#endregion\nexport { createAuthEndpoint, createAuthMiddleware, optionsMiddleware };","import type { PaystackOptions } from \"./types\";\n\nexport async function getPlans(subscriptionOptions: PaystackOptions[\"subscription\"]) {\n if (subscriptionOptions?.enabled) {\n return typeof subscriptionOptions.plans === \"function\"\n ? await subscriptionOptions.plans()\n : subscriptionOptions.plans;\n }\n throw new Error(\"Subscriptions are not enabled in the Paystack options.\");\n}\n\nexport async function getPlanByName(options: PaystackOptions<any>, name: string) {\n return await getPlans(options.subscription).then((plans) =>\n plans?.find((plan) => plan.name.toLowerCase() === name.toLowerCase()),\n );\n}\n","import { createAuthMiddleware } from \"@better-auth/core/api\";\nimport { logger } from \"better-auth\";\nimport { APIError } from \"better-auth/api\";\nimport type { SubscriptionOptions } from \"./types\";\n\nexport const referenceMiddleware = (\n subscriptionOptions: SubscriptionOptions,\n action:\n | \"initialize-transaction\"\n | \"verify-transaction\"\n | \"list-subscriptions\"\n | \"disable-subscription\"\n | \"enable-subscription\",\n) =>\n createAuthMiddleware(async (ctx) => {\n const session = ctx.context.session as any;\n if (!session) {\n throw new APIError(\"UNAUTHORIZED\");\n }\n const referenceId =\n ctx.body?.referenceId || ctx.query?.referenceId || session.user.id;\n\n if (referenceId !== session.user.id && !subscriptionOptions.authorizeReference) {\n logger.error(\n `Passing referenceId into a subscription action isn't allowed if subscription.authorizeReference isn't defined in your paystack plugin config.`,\n );\n throw new APIError(\"BAD_REQUEST\", {\n message:\n \"Passing referenceId isn't allowed without subscription.authorizeReference.\",\n });\n }\n\n if (referenceId !== session.user.id && subscriptionOptions.authorizeReference) {\n const authorized = await subscriptionOptions.authorizeReference(\n {\n user: session.user,\n session,\n referenceId,\n action,\n },\n ctx,\n );\n if (!authorized) {\n throw new APIError(\"UNAUTHORIZED\");\n }\n }\n\n return {\n context: {\n referenceId,\n },\n };\n });\n","import type { PaystackClientLike, PaystackOpenApiFetchResponse } from \"./types\";\n\nfunction isOpenApiFetchResponse(value: any): value is PaystackOpenApiFetchResponse {\n return (\n value &&\n typeof value === \"object\" &&\n (\"data\" in value || \"error\" in value || \"response\" in value)\n );\n}\n\nexport function unwrapSdkResult<T = any>(result: any): T {\n if (isOpenApiFetchResponse(result)) {\n if (result.error) {\n throw result.error;\n }\n return result.data as T;\n }\n return (result?.data ?? result) as T;\n}\n\nexport function getPaystackOps(paystackClient: PaystackClientLike | any) {\n return {\n customerCreate: async (params: any) => {\n if (paystackClient?.customer_create) {\n return paystackClient.customer_create({ body: params });\n }\n return paystackClient?.customer?.create?.(params);\n },\n transactionInitialize: async (body: any) => {\n if (paystackClient?.transaction_initialize) {\n return paystackClient.transaction_initialize({ body });\n }\n return paystackClient?.transaction?.initialize?.(body);\n },\n transactionVerify: async (reference: string) => {\n if (paystackClient?.transaction_verify) {\n return paystackClient.transaction_verify({\n params: { path: { reference } },\n });\n }\n return paystackClient?.transaction?.verify?.(reference);\n },\n subscriptionDisable: async (body: { code: string; token: string }) => {\n if (paystackClient?.subscription_disable) {\n return paystackClient.subscription_disable({ body });\n }\n return paystackClient?.subscription?.disable?.(body);\n },\n subscriptionEnable: async (body: { code: string; token: string }) => {\n if (paystackClient?.subscription_enable) {\n return paystackClient.subscription_enable({ body });\n }\n return paystackClient?.subscription?.enable?.(body);\n },\n subscriptionFetch: async (idOrCode: string) => {\n if (paystackClient?.subscription_fetch) {\n try {\n return await paystackClient.subscription_fetch({\n params: { path: { code: idOrCode } },\n });\n } catch {\n return paystackClient.subscription_fetch({\n params: { path: { id_or_code: idOrCode } },\n });\n }\n }\n return paystackClient?.subscription?.fetch?.(idOrCode);\n },\n subscriptionManageLink: async (code: string) => {\n if (paystackClient?.subscription_manage_link) {\n return paystackClient.subscription_manage_link({\n params: { path: { code } },\n });\n }\n return paystackClient?.subscription?.manage?.link?.(code);\n },\n };\n}\n","import { createAuthEndpoint } from \"@better-auth/core/api\";\nimport { defineErrorCodes } from \"@better-auth/core/utils\";\nimport type { GenericEndpointContext } from \"better-auth\";\nimport { HIDE_METADATA } from \"better-auth\";\nimport {\n APIError,\n getSessionFromCtx,\n originCheck,\n sessionMiddleware,\n} from \"better-auth/api\";\nimport * as z from \"zod/v4\";\nimport type { InputSubscription, PaystackOptions, Subscription } from \"./types\";\nimport { getPlanByName, getPlans } from \"./utils\";\nimport { referenceMiddleware } from \"./middleware\";\nimport { getPaystackOps, unwrapSdkResult } from \"./paystack-sdk\";\n\ntype AnyPaystackOptions = PaystackOptions<any>;\n\nconst PAYSTACK_ERROR_CODES = defineErrorCodes({\n SUBSCRIPTION_NOT_FOUND: \"Subscription not found\",\n SUBSCRIPTION_PLAN_NOT_FOUND: \"Subscription plan not found\",\n UNABLE_TO_CREATE_CUSTOMER: \"Unable to create customer\",\n FAILED_TO_INITIALIZE_TRANSACTION: \"Failed to initialize transaction\",\n FAILED_TO_VERIFY_TRANSACTION: \"Failed to verify transaction\",\n FAILED_TO_DISABLE_SUBSCRIPTION: \"Failed to disable subscription\",\n FAILED_TO_ENABLE_SUBSCRIPTION: \"Failed to enable subscription\",\n EMAIL_VERIFICATION_REQUIRED:\n \"Email verification is required before you can subscribe to a plan\",\n});\n\nasync function hmacSha512Hex(secret: string, message: string): Promise<string> {\n const encoder = new TextEncoder();\n const keyData = encoder.encode(secret);\n const msgData = encoder.encode(message);\n\n const subtle = (globalThis.crypto as any)?.subtle;\n if (subtle) {\n const key = await subtle.importKey(\n \"raw\",\n keyData,\n { name: \"HMAC\", hash: \"SHA-512\" },\n false,\n [\"sign\"],\n );\n const signature = await subtle.sign(\"HMAC\", key, msgData);\n return Array.from(new Uint8Array(signature))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n }\n\n const { createHmac } = await import(\"node:crypto\");\n return createHmac(\"sha512\", secret).update(message).digest(\"hex\");\n}\n\nexport const paystackWebhook = (options: AnyPaystackOptions) => {\n return createAuthEndpoint(\n \"/paystack/webhook\",\n {\n method: \"POST\",\n metadata: {\n ...HIDE_METADATA,\n openapi: {\n operationId: \"handlePaystackWebhook\",\n },\n },\n cloneRequest: true,\n disableBody: true,\n },\n async (ctx) => {\n const request = (ctx as any).requestClone ?? ctx.request;\n const payload = await request.text();\n const headers = (ctx as any).headers ?? (ctx.request as any)?.headers;\n const signature = headers?.get(\"x-paystack-signature\") as\n | string\n | null\n | undefined;\n\n if (!signature) {\n throw new APIError(\"UNAUTHORIZED\", {\n message: \"Missing x-paystack-signature header\",\n status: 401,\n });\n }\n\n const expected = await hmacSha512Hex(options.paystackWebhookSecret, payload);\n if (expected !== signature) {\n throw new APIError(\"UNAUTHORIZED\", {\n message: \"Invalid Paystack webhook signature\",\n status: 401,\n });\n }\n\n const event = JSON.parse(payload) as any;\n\n // Best-effort local state sync for subscription lifecycle.\n if (options.subscription?.enabled) {\n const eventName = String(event?.event ?? \"\");\n const data = event?.data as any;\n try {\n if (eventName === \"subscription.create\") {\n const subscriptionCode =\n data?.subscription_code ??\n data?.subscription?.subscription_code ??\n data?.code;\n const customerCode =\n data?.customer?.customer_code ??\n data?.customer_code ??\n data?.customer?.code;\n const planCode =\n data?.plan?.plan_code ?? data?.plan_code ?? data?.plan;\n\n let metadata: any = data?.metadata;\n if (typeof metadata === \"string\") {\n try {\n metadata = JSON.parse(metadata);\n } catch {\n // ignore\n }\n }\n\n const referenceIdFromMetadata =\n typeof metadata === \"object\" && metadata\n ? (metadata.referenceId as string | undefined)\n : undefined;\n\n let planNameFromMetadata =\n typeof metadata === \"object\" && metadata\n ? (metadata.plan as string | undefined)\n : undefined;\n if (typeof planNameFromMetadata === \"string\") {\n planNameFromMetadata = planNameFromMetadata.toLowerCase();\n }\n\n const plans = await getPlans(options.subscription);\n const planFromCode = planCode\n ? plans.find((p) => p.planCode && p.planCode === planCode)\n : undefined;\n const planName = (planFromCode?.name ?? planNameFromMetadata)?.toLowerCase();\n\n if (subscriptionCode) {\n const where: Array<{ field: string; value: any }> = [];\n if (referenceIdFromMetadata) {\n where.push({ field: \"referenceId\", value: referenceIdFromMetadata });\n } else if (customerCode) {\n where.push({ field: \"paystackCustomerCode\", value: customerCode });\n }\n if (planName) {\n where.push({ field: \"plan\", value: planName });\n }\n\n if (where.length > 0) {\n const matches = await ctx.context.adapter.findMany<Subscription>({\n model: \"subscription\",\n where,\n });\n const subscription = matches?.[0];\n if (subscription) {\n await ctx.context.adapter.update({\n model: \"subscription\",\n update: {\n paystackSubscriptionCode: subscriptionCode,\n status: \"active\",\n updatedAt: new Date(),\n },\n where: [{ field: \"id\", value: subscription.id }],\n });\n\n const plan = planFromCode ?? (planName ? await getPlanByName(options, planName) : undefined);\n if (plan) {\n await options.subscription.onSubscriptionComplete?.(\n { event, subscription: { ...subscription, paystackSubscriptionCode: subscriptionCode, status: \"active\" }, plan },\n ctx as any,\n );\n }\n }\n }\n }\n }\n\n if (eventName === \"subscription.disable\" || eventName === \"subscription.not_renew\") {\n const subscriptionCode =\n data?.subscription_code ??\n data?.subscription?.subscription_code ??\n data?.code;\n if (subscriptionCode) {\n await ctx.context.adapter.update({\n model: \"subscription\",\n update: {\n status: \"canceled\",\n updatedAt: new Date(),\n },\n where: [\n { field: \"paystackSubscriptionCode\", value: subscriptionCode },\n ],\n });\n }\n }\n } catch (e: any) {\n ctx.context.logger.error(\"Failed to sync Paystack webhook event\", e);\n }\n }\n\n await options.onEvent?.(event);\n return ctx.json({ received: true });\n },\n );\n};\n\n\nconst initializeTransactionBodySchema = z.object({\n plan: z.string(),\n referenceId: z.string().optional(),\n callbackURL: z.string().optional(),\n});\n\nexport const initializeTransaction = (options: AnyPaystackOptions) => {\n const subscriptionOptions = options.subscription;\n const useMiddlewares = subscriptionOptions?.enabled\n ? [sessionMiddleware, originCheck, referenceMiddleware(subscriptionOptions, \"initialize-transaction\")]\n : [sessionMiddleware, originCheck];\n\n return createAuthEndpoint(\n \"/paystack/transaction/initialize\",\n {\n method: \"POST\",\n body: initializeTransactionBodySchema,\n use: useMiddlewares,\n },\n async (ctx) => {\n const paystack = getPaystackOps(options.paystackClient);\n if (!subscriptionOptions?.enabled) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Subscriptions are not enabled in the Paystack options.\",\n });\n }\n\n const session = await getSessionFromCtx(ctx);\n if (!session) throw new APIError(\"UNAUTHORIZED\");\n const user = session.user;\n const referenceIdFromCtx = (ctx.context as any).referenceId as\n | string\n | undefined;\n const referenceId =\n ctx.body.referenceId || referenceIdFromCtx || (session.user as any).id;\n\n if (subscriptionOptions.requireEmailVerification && !user.emailVerified) {\n throw new APIError(\"BAD_REQUEST\", {\n code: PAYSTACK_ERROR_CODES.EMAIL_VERIFICATION_REQUIRED,\n message: PAYSTACK_ERROR_CODES.EMAIL_VERIFICATION_REQUIRED,\n });\n }\n\n const plan = await getPlanByName(options, ctx.body.plan);\n if (!plan) {\n throw new APIError(\"BAD_REQUEST\", {\n code: PAYSTACK_ERROR_CODES.SUBSCRIPTION_PLAN_NOT_FOUND,\n message: PAYSTACK_ERROR_CODES.SUBSCRIPTION_PLAN_NOT_FOUND,\n });\n }\n\n if (!plan.planCode && !plan.amount) {\n throw new APIError(\"BAD_REQUEST\", {\n message:\n \"Paystack transaction initialization requires either plan.planCode (Paystack plan code) or plan.amount (smallest unit).\",\n });\n }\n\n let url: string | undefined;\n let reference: string | undefined;\n let accessCode: string | undefined;\n try {\n const metadata = JSON.stringify({\n referenceId,\n userId: user.id,\n plan: plan.name.toLowerCase(),\n });\n\n const initBody: any = {\n email: user.email,\n callback_url: ctx.body.callbackURL,\n currency: plan.currency,\n plan: plan.planCode,\n invoice_limit: plan.invoiceLimit,\n metadata,\n };\n\n // Paystack docs: when `plan` is provided, it invalidates `amount`.\n if (!plan.planCode && plan.amount) {\n initBody.amount = String(plan.amount);\n }\n\n const initRaw = await paystack.transactionInitialize(initBody);\n const initRes = unwrapSdkResult<any>(initRaw);\n const data =\n initRes && typeof initRes === \"object\" && \"status\" in initRes && \"data\" in initRes\n ? (initRes as any).data\n : initRes?.data ?? initRes;\n url = data?.authorization_url;\n reference = data?.reference;\n accessCode = data?.access_code;\n } catch (error: any) {\n ctx.context.logger.error(\"Failed to initialize Paystack transaction\", error);\n throw new APIError(\"BAD_REQUEST\", {\n code: PAYSTACK_ERROR_CODES.FAILED_TO_INITIALIZE_TRANSACTION,\n message:\n error?.message || PAYSTACK_ERROR_CODES.FAILED_TO_INITIALIZE_TRANSACTION,\n });\n }\n\n const paystackCustomerCode = (user as any).paystackCustomerCode;\n\n await ctx.context.adapter.create<InputSubscription, Subscription>({\n model: \"subscription\",\n data: {\n plan: plan.name.toLowerCase(),\n referenceId,\n paystackCustomerCode,\n paystackTransactionReference: reference,\n status: \"incomplete\",\n },\n });\n\n return ctx.json({\n url,\n reference,\n accessCode,\n redirect: true,\n });\n },\n );\n};\n\nexport const verifyTransaction = (options: AnyPaystackOptions) => {\n const verifyQuerySchema = z.object({\n reference: z.string(),\n });\n\n const subscriptionOptions = options.subscription;\n const useMiddlewares = subscriptionOptions?.enabled\n ? [sessionMiddleware, originCheck, referenceMiddleware(subscriptionOptions, \"verify-transaction\")]\n : [sessionMiddleware, originCheck];\n\n return createAuthEndpoint(\n \"/paystack/transaction/verify\",\n {\n method: \"GET\",\n query: verifyQuerySchema,\n use: useMiddlewares,\n },\n async (ctx) => {\n const paystack = getPaystackOps(options.paystackClient);\n let verifyRes: any;\n try {\n const verifyRaw = await paystack.transactionVerify(ctx.query.reference);\n verifyRes = unwrapSdkResult<any>(verifyRaw);\n } catch (error: any) {\n ctx.context.logger.error(\"Failed to verify Paystack transaction\", error);\n throw new APIError(\"BAD_REQUEST\", {\n code: PAYSTACK_ERROR_CODES.FAILED_TO_VERIFY_TRANSACTION,\n message:\n error?.message || PAYSTACK_ERROR_CODES.FAILED_TO_VERIFY_TRANSACTION,\n });\n }\n const data =\n verifyRes && typeof verifyRes === \"object\" && \"status\" in verifyRes && \"data\" in verifyRes\n ? (verifyRes as any).data\n : verifyRes?.data ?? verifyRes;\n const status = data?.status;\n const reference = data?.reference ?? ctx.query.reference;\n\n if (status === \"success\") {\n try {\n await ctx.context.adapter.update({\n model: \"subscription\",\n update: {\n status: \"active\",\n periodStart: new Date(),\n updatedAt: new Date(),\n },\n where: [\n {\n field: \"paystackTransactionReference\",\n value: reference,\n },\n ],\n });\n } catch (e: any) {\n ctx.context.logger.error(\n \"Failed to update subscription after transaction verification\",\n e,\n );\n }\n }\n\n return ctx.json({\n status,\n reference,\n data,\n });\n },\n );\n};\n\nexport const listSubscriptions = (options: AnyPaystackOptions) => {\n const listQuerySchema = z.object({\n referenceId: z.string().optional(),\n });\n\n const subscriptionOptions = options.subscription;\n const useMiddlewares = subscriptionOptions?.enabled\n ? [sessionMiddleware, originCheck, referenceMiddleware(subscriptionOptions, \"list-subscriptions\")]\n : [sessionMiddleware, originCheck];\n\n return createAuthEndpoint(\n \"/paystack/subscription/list-local\",\n {\n method: \"GET\",\n query: listQuerySchema,\n use: useMiddlewares,\n },\n async (ctx) => {\n if (!subscriptionOptions?.enabled) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Subscriptions are not enabled in the Paystack options.\",\n });\n }\n const session = await getSessionFromCtx(ctx);\n if (!session) throw new APIError(\"UNAUTHORIZED\");\n const referenceId =\n ((ctx.context as any).referenceId as string | undefined) ??\n (ctx.query?.referenceId as string | undefined) ??\n ((session.user as any).id as string);\n const res = await ctx.context.adapter.findMany<Subscription>({\n model: \"subscription\",\n where: [{ field: \"referenceId\", value: referenceId }],\n });\n return ctx.json({ subscriptions: res });\n },\n );\n};\n\nconst enableDisableBodySchema = z.object({\n referenceId: z.string().optional(),\n subscriptionCode: z.string(),\n emailToken: z.string().optional(),\n});\n\nfunction decodeBase64UrlToString(value: string): string {\n const normalized = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = normalized + \"===\".slice((normalized.length + 3) % 4);\n if (typeof (globalThis as any).atob === \"function\") {\n return (globalThis as any).atob(padded);\n }\n // Node fallback\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n return Buffer.from(padded, \"base64\").toString(\"utf8\");\n}\n\nfunction tryGetEmailTokenFromSubscriptionManageLink(link: string): string | undefined {\n try {\n const url = new URL(link);\n const subscriptionToken = url.searchParams.get(\"subscription_token\");\n if (!subscriptionToken) return undefined;\n const parts = subscriptionToken.split(\".\");\n if (parts.length < 2) return undefined;\n const payloadJson = decodeBase64UrlToString(parts[1]!);\n const payload = JSON.parse(payloadJson) as any;\n return typeof payload?.email_token === \"string\" ? payload.email_token : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport const disablePaystackSubscription = (options: AnyPaystackOptions) => {\n const subscriptionOptions = options.subscription;\n const useMiddlewares = subscriptionOptions?.enabled\n ? [sessionMiddleware, originCheck, referenceMiddleware(subscriptionOptions, \"disable-subscription\")]\n : [sessionMiddleware, originCheck];\n\n return createAuthEndpoint(\n \"/paystack/subscription/disable\",\n { method: \"POST\", body: enableDisableBodySchema, use: useMiddlewares },\n async (ctx) => {\n const { subscriptionCode } = ctx.body;\n const paystack = getPaystackOps(options.paystackClient);\n try {\n let emailToken = ctx.body.emailToken;\n if (!emailToken) {\n try {\n const raw = await paystack.subscriptionFetch(subscriptionCode);\n const fetchRes = unwrapSdkResult<any>(raw);\n const data =\n fetchRes && typeof fetchRes === \"object\" && \"status\" in fetchRes && \"data\" in fetchRes\n ? (fetchRes as any).data\n : fetchRes?.data ?? fetchRes;\n emailToken = data?.email_token;\n } catch {\n // ignore; try manage-link fallback below\n }\n }\n\n if (!emailToken) {\n try {\n const raw = await paystack.subscriptionManageLink(subscriptionCode);\n const linkRes = unwrapSdkResult<any>(raw);\n const data =\n linkRes && typeof linkRes === \"object\" && \"status\" in linkRes && \"data\" in linkRes\n ? (linkRes as any).data\n : linkRes?.data ?? linkRes;\n const link = data?.link;\n if (typeof link === \"string\") {\n emailToken = tryGetEmailTokenFromSubscriptionManageLink(link);\n }\n } catch {\n // ignore\n }\n }\n\n if (!emailToken) {\n throw new APIError(\"BAD_REQUEST\", {\n message:\n \"Missing emailToken. Provide it explicitly or ensure your server can fetch it from Paystack using the subscription code.\",\n });\n }\n\n const raw = await paystack.subscriptionDisable({\n code: subscriptionCode,\n token: emailToken,\n });\n const result = unwrapSdkResult<any>(raw);\n return ctx.json({ result });\n } catch (error: any) {\n ctx.context.logger.error(\"Failed to disable Paystack subscription\", error);\n throw new APIError(\"BAD_REQUEST\", {\n code: PAYSTACK_ERROR_CODES.FAILED_TO_DISABLE_SUBSCRIPTION,\n message:\n error?.message || PAYSTACK_ERROR_CODES.FAILED_TO_DISABLE_SUBSCRIPTION,\n });\n }\n },\n );\n};\n\nexport const enablePaystackSubscription = (options: AnyPaystackOptions) => {\n const subscriptionOptions = options.subscription;\n const useMiddlewares = subscriptionOptions?.enabled\n ? [sessionMiddleware, originCheck, referenceMiddleware(subscriptionOptions, \"enable-subscription\")]\n : [sessionMiddleware, originCheck];\n\n return createAuthEndpoint(\n \"/paystack/subscription/enable\",\n { method: \"POST\", body: enableDisableBodySchema, use: useMiddlewares },\n async (ctx) => {\n const { subscriptionCode } = ctx.body;\n const paystack = getPaystackOps(options.paystackClient);\n try {\n let emailToken = ctx.body.emailToken;\n if (!emailToken) {\n try {\n const raw = await paystack.subscriptionFetch(subscriptionCode);\n const fetchRes = unwrapSdkResult<any>(raw);\n const data =\n fetchRes && typeof fetchRes === \"object\" && \"status\" in fetchRes && \"data\" in fetchRes\n ? (fetchRes as any).data\n : fetchRes?.data ?? fetchRes;\n emailToken = data?.email_token;\n } catch {\n // ignore; try manage-link fallback below\n }\n }\n\n if (!emailToken) {\n try {\n const raw = await paystack.subscriptionManageLink(subscriptionCode);\n const linkRes = unwrapSdkResult<any>(raw);\n const data =\n linkRes && typeof linkRes === \"object\" && \"status\" in linkRes && \"data\" in linkRes\n ? (linkRes as any).data\n : linkRes?.data ?? linkRes;\n const link = data?.link;\n if (typeof link === \"string\") {\n emailToken = tryGetEmailTokenFromSubscriptionManageLink(link);\n }\n } catch {\n // ignore\n }\n }\n\n if (!emailToken) {\n throw new APIError(\"BAD_REQUEST\", {\n message:\n \"Missing emailToken. Provide it explicitly or ensure your server can fetch it from Paystack using the subscription code.\",\n });\n }\n\n const raw = await paystack.subscriptionEnable({\n code: subscriptionCode,\n token: emailToken,\n });\n const result = unwrapSdkResult<any>(raw);\n return ctx.json({ result });\n } catch (error: any) {\n ctx.context.logger.error(\"Failed to enable Paystack subscription\", error);\n throw new APIError(\"BAD_REQUEST\", {\n code: PAYSTACK_ERROR_CODES.FAILED_TO_ENABLE_SUBSCRIPTION,\n message:\n error?.message || PAYSTACK_ERROR_CODES.FAILED_TO_ENABLE_SUBSCRIPTION,\n });\n }\n },\n );\n};\n\nexport { PAYSTACK_ERROR_CODES };\n","import type { BetterAuthPluginDBSchema } from \"@better-auth/core/db\";\nimport { mergeSchema } from \"better-auth/db\";\nimport type { PaystackOptions } from \"./types\";\n\nexport const subscriptions = {\n subscription: {\n fields: {\n plan: {\n type: \"string\",\n required: true,\n },\n referenceId: {\n type: \"string\",\n required: true,\n },\n paystackCustomerCode: {\n type: \"string\",\n required: false,\n },\n paystackSubscriptionCode: {\n type: \"string\",\n required: false,\n },\n paystackTransactionReference: {\n type: \"string\",\n required: false,\n },\n status: {\n type: \"string\",\n defaultValue: \"incomplete\",\n },\n periodStart: {\n type: \"date\",\n required: false,\n },\n periodEnd: {\n type: \"date\",\n required: false,\n },\n trialStart: {\n type: \"date\",\n required: false,\n },\n trialEnd: {\n type: \"date\",\n required: false,\n },\n cancelAtPeriodEnd: {\n type: \"boolean\",\n required: false,\n defaultValue: false,\n },\n groupId: {\n type: \"string\",\n required: false,\n },\n seats: {\n type: \"number\",\n required: false,\n },\n },\n },\n} satisfies BetterAuthPluginDBSchema;\n\nexport const user = {\n user: {\n fields: {\n paystackCustomerCode: {\n type: \"string\",\n required: false,\n },\n },\n },\n} satisfies BetterAuthPluginDBSchema;\n\nexport const getSchema = (options: PaystackOptions<any>) => {\n let baseSchema: BetterAuthPluginDBSchema;\n\n if (options.subscription?.enabled) {\n baseSchema = {\n ...subscriptions,\n ...user,\n };\n } else {\n baseSchema = {\n ...user,\n };\n }\n\n if (\n options.schema &&\n !options.subscription?.enabled &&\n \"subscription\" in options.schema\n ) {\n const { subscription: _subscription, ...restSchema } = options.schema as any;\n return mergeSchema(baseSchema, restSchema);\n }\n\n return mergeSchema(baseSchema, options.schema);\n};\n","import { defineErrorCodes } from \"@better-auth/core/utils\";\nimport type { BetterAuthPlugin } from \"better-auth\";\nimport { defu } from \"defu\";\nimport {\n disablePaystackSubscription,\n enablePaystackSubscription,\n initializeTransaction,\n listSubscriptions,\n paystackWebhook,\n verifyTransaction,\n PAYSTACK_ERROR_CODES,\n} from \"./routes\";\nimport { getSchema } from \"./schema\";\nimport type {\n PaystackNodeClient,\n PaystackClientLike,\n PaystackOptions,\n PaystackPlan,\n Subscription,\n SubscriptionOptions,\n} from \"./types\";\nimport { getPaystackOps, unwrapSdkResult } from \"./paystack-sdk\";\n\nconst INTERNAL_ERROR_CODES = defineErrorCodes({\n ...PAYSTACK_ERROR_CODES,\n});\n\nexport const paystack = <\n TPaystackClient extends PaystackClientLike = PaystackNodeClient,\n O extends PaystackOptions<TPaystackClient> = PaystackOptions<TPaystackClient>,\n>(\n options: O,\n) => {\n const baseEndpoints = {\n paystackWebhook: paystackWebhook(options),\n } satisfies NonNullable<BetterAuthPlugin[\"endpoints\"]>;\n\n const subscriptionEnabledEndpoints = {\n ...baseEndpoints,\n initializeTransaction: initializeTransaction(options),\n verifyTransaction: verifyTransaction(options),\n listSubscriptions: listSubscriptions(options),\n disablePaystackSubscription: disablePaystackSubscription(options),\n enablePaystackSubscription: enablePaystackSubscription(options),\n } satisfies NonNullable<BetterAuthPlugin[\"endpoints\"]>;\n\n const endpoints = options.subscription?.enabled\n ? subscriptionEnabledEndpoints\n : baseEndpoints;\n\n return {\n id: \"paystack\",\n endpoints,\n init(ctx) {\n return {\n options: {\n databaseHooks: {\n user: {\n create: {\n async after(user, hookCtx) {\n if (!hookCtx || !options.createCustomerOnSignUp) return;\n\n try {\n const firstName = user.name?.split(\" \")[0];\n const lastName = user.name?.split(\" \").slice(1).join(\" \") || undefined;\n\n const extraCreateParams = options.getCustomerCreateParams\n ? await options.getCustomerCreateParams(user as any, hookCtx as any)\n : {};\n\n const params = defu(\n {\n email: user.email,\n first_name: firstName,\n last_name: lastName,\n metadata: { userId: user.id },\n },\n extraCreateParams,\n );\n const paystack = getPaystackOps(options.paystackClient);\n const raw = await paystack.customerCreate(params);\n const res = unwrapSdkResult<any>(raw);\n const paystackCustomer =\n res && typeof res === \"object\" && \"status\" in res && \"data\" in res\n ? (res as any).data\n : res?.data ?? res;\n const customerCode = paystackCustomer?.customer_code;\n\n if (!customerCode) return;\n\n await hookCtx.context.internalAdapter.updateUser(user.id, {\n paystackCustomerCode: customerCode,\n });\n\n await options.onCustomerCreate?.(\n {\n paystackCustomer,\n user: {\n ...(user as any),\n paystackCustomerCode: customerCode,\n },\n },\n hookCtx as any,\n );\n } catch (e: any) {\n hookCtx.context.logger.error(\n `Failed to create Paystack customer: ${e?.message || \"Unknown error\"}`,\n e,\n );\n }\n },\n },\n },\n },\n },\n };\n },\n schema: getSchema(options),\n $ERROR_CODES: INTERNAL_ERROR_CODES,\n } satisfies BetterAuthPlugin;\n};\n\ntype PaystackClientFromOptions<O extends PaystackOptions<any>> =\n O extends PaystackOptions<infer TClient> ? TClient : PaystackNodeClient;\n\nexport type PaystackPlugin<O extends PaystackOptions<any> = PaystackOptions> = ReturnType<\n typeof paystack<PaystackClientFromOptions<O>, O>\n>;\n\nexport type { Subscription, SubscriptionOptions, PaystackPlan, PaystackOptions };\n"],"x_google_ignoreList":[0,1,2,3,4],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["logger","metadata: any","where: Array<{ field: string; value: any }>","e: any","paystack","user","url: string | undefined","reference: string | undefined","accessCode: string | undefined","initBody: any","error: any","verifyRes: any","baseSchema: BetterAuthPluginDBSchema","user","e: any"],"sources":["../node_modules/.pnpm/@better-auth+core@1.4.7_@better-auth+utils@0.3.0_@better-fetch+fetch@1.1.21_better-call_d24665956e428978271bbb947eda0893/node_modules/@better-auth/core/dist/env-DbssmzoK.mjs","../node_modules/.pnpm/@better-auth+core@1.4.7_@better-auth+utils@0.3.0_@better-fetch+fetch@1.1.21_better-call_d24665956e428978271bbb947eda0893/node_modules/@better-auth/core/dist/utils-NloIXYE0.mjs","../node_modules/.pnpm/@better-auth+core@1.4.7_@better-auth+utils@0.3.0_@better-fetch+fetch@1.1.21_better-call_d24665956e428978271bbb947eda0893/node_modules/@better-auth/core/dist/async_hooks/index.mjs","../node_modules/.pnpm/@better-auth+core@1.4.7_@better-auth+utils@0.3.0_@better-fetch+fetch@1.1.21_better-call_d24665956e428978271bbb947eda0893/node_modules/@better-auth/core/dist/context-DblZrIwO.mjs","../node_modules/.pnpm/@better-auth+core@1.4.7_@better-auth+utils@0.3.0_@better-fetch+fetch@1.1.21_better-call_d24665956e428978271bbb947eda0893/node_modules/@better-auth/core/dist/api/index.mjs","../src/utils.ts","../src/middleware.ts","../src/paystack-sdk.ts","../src/routes.ts","../src/schema.ts","../src/index.ts"],"sourcesContent":["//#region src/env/env-impl.ts\nconst _envShim = Object.create(null);\nconst _getEnv = (useShim) => globalThis.process?.env || globalThis.Deno?.env.toObject() || globalThis.__env__ || (useShim ? _envShim : globalThis);\nconst env = new Proxy(_envShim, {\n\tget(_, prop) {\n\t\treturn _getEnv()[prop] ?? _envShim[prop];\n\t},\n\thas(_, prop) {\n\t\treturn prop in _getEnv() || prop in _envShim;\n\t},\n\tset(_, prop, value) {\n\t\tconst env$1 = _getEnv(true);\n\t\tenv$1[prop] = value;\n\t\treturn true;\n\t},\n\tdeleteProperty(_, prop) {\n\t\tif (!prop) return false;\n\t\tconst env$1 = _getEnv(true);\n\t\tdelete env$1[prop];\n\t\treturn true;\n\t},\n\townKeys() {\n\t\tconst env$1 = _getEnv(true);\n\t\treturn Object.keys(env$1);\n\t}\n});\nfunction toBoolean(val) {\n\treturn val ? val !== \"false\" : false;\n}\nconst nodeENV = typeof process !== \"undefined\" && process.env && process.env.NODE_ENV || \"\";\n/** Detect if `NODE_ENV` environment variable is `production` */\nconst isProduction = nodeENV === \"production\";\n/** Detect if `NODE_ENV` environment variable is `dev` or `development` */\nconst isDevelopment = () => nodeENV === \"dev\" || nodeENV === \"development\";\n/** Detect if `NODE_ENV` environment variable is `test` */\nconst isTest = () => nodeENV === \"test\" || toBoolean(env.TEST);\n/**\n* Get environment variable with fallback\n*/\nfunction getEnvVar(key, fallback) {\n\tif (typeof process !== \"undefined\" && process.env) return process.env[key] ?? fallback;\n\tif (typeof Deno !== \"undefined\") return Deno.env.get(key) ?? fallback;\n\tif (typeof Bun !== \"undefined\") return Bun.env[key] ?? fallback;\n\treturn fallback;\n}\n/**\n* Get boolean environment variable\n*/\nfunction getBooleanEnvVar(key, fallback = true) {\n\tconst value = getEnvVar(key);\n\tif (!value) return fallback;\n\treturn value !== \"0\" && value.toLowerCase() !== \"false\" && value !== \"\";\n}\n/**\n* Common environment variables used in Better Auth\n*/\nconst ENV = Object.freeze({\n\tget BETTER_AUTH_SECRET() {\n\t\treturn getEnvVar(\"BETTER_AUTH_SECRET\");\n\t},\n\tget AUTH_SECRET() {\n\t\treturn getEnvVar(\"AUTH_SECRET\");\n\t},\n\tget BETTER_AUTH_TELEMETRY() {\n\t\treturn getEnvVar(\"BETTER_AUTH_TELEMETRY\");\n\t},\n\tget BETTER_AUTH_TELEMETRY_ID() {\n\t\treturn getEnvVar(\"BETTER_AUTH_TELEMETRY_ID\");\n\t},\n\tget NODE_ENV() {\n\t\treturn getEnvVar(\"NODE_ENV\", \"development\");\n\t},\n\tget PACKAGE_VERSION() {\n\t\treturn getEnvVar(\"PACKAGE_VERSION\", \"0.0.0\");\n\t},\n\tget BETTER_AUTH_TELEMETRY_ENDPOINT() {\n\t\treturn getEnvVar(\"BETTER_AUTH_TELEMETRY_ENDPOINT\", \"https://telemetry.better-auth.com/v1/track\");\n\t}\n});\n\n//#endregion\n//#region src/env/color-depth.ts\nconst COLORS_2 = 1;\nconst COLORS_16 = 4;\nconst COLORS_256 = 8;\nconst COLORS_16m = 24;\nconst TERM_ENVS = {\n\teterm: COLORS_16,\n\tcons25: COLORS_16,\n\tconsole: COLORS_16,\n\tcygwin: COLORS_16,\n\tdtterm: COLORS_16,\n\tgnome: COLORS_16,\n\thurd: COLORS_16,\n\tjfbterm: COLORS_16,\n\tkonsole: COLORS_16,\n\tkterm: COLORS_16,\n\tmlterm: COLORS_16,\n\tmosh: COLORS_16m,\n\tputty: COLORS_16,\n\tst: COLORS_16,\n\t\"rxvt-unicode-24bit\": COLORS_16m,\n\tterminator: COLORS_16m,\n\t\"xterm-kitty\": COLORS_16m\n};\nconst CI_ENVS_MAP = new Map(Object.entries({\n\tAPPVEYOR: COLORS_256,\n\tBUILDKITE: COLORS_256,\n\tCIRCLECI: COLORS_16m,\n\tDRONE: COLORS_256,\n\tGITEA_ACTIONS: COLORS_16m,\n\tGITHUB_ACTIONS: COLORS_16m,\n\tGITLAB_CI: COLORS_256,\n\tTRAVIS: COLORS_256\n}));\nconst TERM_ENVS_REG_EXP = [\n\t/ansi/,\n\t/color/,\n\t/linux/,\n\t/direct/,\n\t/^con[0-9]*x[0-9]/,\n\t/^rxvt/,\n\t/^screen/,\n\t/^xterm/,\n\t/^vt100/,\n\t/^vt220/\n];\nfunction getColorDepth() {\n\tif (getEnvVar(\"FORCE_COLOR\") !== void 0) switch (getEnvVar(\"FORCE_COLOR\")) {\n\t\tcase \"\":\n\t\tcase \"1\":\n\t\tcase \"true\": return COLORS_16;\n\t\tcase \"2\": return COLORS_256;\n\t\tcase \"3\": return COLORS_16m;\n\t\tdefault: return COLORS_2;\n\t}\n\tif (getEnvVar(\"NODE_DISABLE_COLORS\") !== void 0 && getEnvVar(\"NODE_DISABLE_COLORS\") !== \"\" || getEnvVar(\"NO_COLOR\") !== void 0 && getEnvVar(\"NO_COLOR\") !== \"\" || getEnvVar(\"TERM\") === \"dumb\") return COLORS_2;\n\tif (getEnvVar(\"TMUX\")) return COLORS_16m;\n\tif (\"TF_BUILD\" in env && \"AGENT_NAME\" in env) return COLORS_16;\n\tif (\"CI\" in env) {\n\t\tfor (const { 0: envName, 1: colors } of CI_ENVS_MAP) if (envName in env) return colors;\n\t\tif (getEnvVar(\"CI_NAME\") === \"codeship\") return COLORS_256;\n\t\treturn COLORS_2;\n\t}\n\tif (\"TEAMCITY_VERSION\" in env) return /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.exec(getEnvVar(\"TEAMCITY_VERSION\")) !== null ? COLORS_16 : COLORS_2;\n\tswitch (getEnvVar(\"TERM_PROGRAM\")) {\n\t\tcase \"iTerm.app\":\n\t\t\tif (!getEnvVar(\"TERM_PROGRAM_VERSION\") || /^[0-2]\\./.exec(getEnvVar(\"TERM_PROGRAM_VERSION\")) !== null) return COLORS_256;\n\t\t\treturn COLORS_16m;\n\t\tcase \"HyperTerm\":\n\t\tcase \"MacTerm\": return COLORS_16m;\n\t\tcase \"Apple_Terminal\": return COLORS_256;\n\t}\n\tif (getEnvVar(\"COLORTERM\") === \"truecolor\" || getEnvVar(\"COLORTERM\") === \"24bit\") return COLORS_16m;\n\tif (getEnvVar(\"TERM\")) {\n\t\tif (/truecolor/.exec(getEnvVar(\"TERM\")) !== null) return COLORS_16m;\n\t\tif (/^xterm-256/.exec(getEnvVar(\"TERM\")) !== null) return COLORS_256;\n\t\tconst termEnv = getEnvVar(\"TERM\").toLowerCase();\n\t\tif (TERM_ENVS[termEnv]) return TERM_ENVS[termEnv];\n\t\tif (TERM_ENVS_REG_EXP.some((term) => term.exec(termEnv) !== null)) return COLORS_16;\n\t}\n\tif (getEnvVar(\"COLORTERM\")) return COLORS_16;\n\treturn COLORS_2;\n}\n\n//#endregion\n//#region src/env/logger.ts\nconst TTY_COLORS = {\n\treset: \"\\x1B[0m\",\n\tbright: \"\\x1B[1m\",\n\tdim: \"\\x1B[2m\",\n\tundim: \"\\x1B[22m\",\n\tunderscore: \"\\x1B[4m\",\n\tblink: \"\\x1B[5m\",\n\treverse: \"\\x1B[7m\",\n\thidden: \"\\x1B[8m\",\n\tfg: {\n\t\tblack: \"\\x1B[30m\",\n\t\tred: \"\\x1B[31m\",\n\t\tgreen: \"\\x1B[32m\",\n\t\tyellow: \"\\x1B[33m\",\n\t\tblue: \"\\x1B[34m\",\n\t\tmagenta: \"\\x1B[35m\",\n\t\tcyan: \"\\x1B[36m\",\n\t\twhite: \"\\x1B[37m\"\n\t},\n\tbg: {\n\t\tblack: \"\\x1B[40m\",\n\t\tred: \"\\x1B[41m\",\n\t\tgreen: \"\\x1B[42m\",\n\t\tyellow: \"\\x1B[43m\",\n\t\tblue: \"\\x1B[44m\",\n\t\tmagenta: \"\\x1B[45m\",\n\t\tcyan: \"\\x1B[46m\",\n\t\twhite: \"\\x1B[47m\"\n\t}\n};\nconst levels = [\n\t\"debug\",\n\t\"info\",\n\t\"success\",\n\t\"warn\",\n\t\"error\"\n];\nfunction shouldPublishLog(currentLogLevel, logLevel) {\n\treturn levels.indexOf(logLevel) >= levels.indexOf(currentLogLevel);\n}\nconst levelColors = {\n\tinfo: TTY_COLORS.fg.blue,\n\tsuccess: TTY_COLORS.fg.green,\n\twarn: TTY_COLORS.fg.yellow,\n\terror: TTY_COLORS.fg.red,\n\tdebug: TTY_COLORS.fg.magenta\n};\nconst formatMessage = (level, message, colorsEnabled) => {\n\tconst timestamp = (/* @__PURE__ */ new Date()).toISOString();\n\tif (colorsEnabled) return `${TTY_COLORS.dim}${timestamp}${TTY_COLORS.reset} ${levelColors[level]}${level.toUpperCase()}${TTY_COLORS.reset} ${TTY_COLORS.bright}[Better Auth]:${TTY_COLORS.reset} ${message}`;\n\treturn `${timestamp} ${level.toUpperCase()} [Better Auth]: ${message}`;\n};\nconst createLogger = (options) => {\n\tconst enabled = options?.disabled !== true;\n\tconst logLevel = options?.level ?? \"error\";\n\tconst colorsEnabled = options?.disableColors !== void 0 ? !options.disableColors : getColorDepth() !== 1;\n\tconst LogFunc = (level, message, args = []) => {\n\t\tif (!enabled || !shouldPublishLog(logLevel, level)) return;\n\t\tconst formattedMessage = formatMessage(level, message, colorsEnabled);\n\t\tif (!options || typeof options.log !== \"function\") {\n\t\t\tif (level === \"error\") console.error(formattedMessage, ...args);\n\t\t\telse if (level === \"warn\") console.warn(formattedMessage, ...args);\n\t\t\telse console.log(formattedMessage, ...args);\n\t\t\treturn;\n\t\t}\n\t\toptions.log(level === \"success\" ? \"info\" : level, message, ...args);\n\t};\n\treturn {\n\t\t...Object.fromEntries(levels.map((level) => [level, (...[message, ...args]) => LogFunc(level, message, args)])),\n\t\tget level() {\n\t\t\treturn logLevel;\n\t\t}\n\t};\n};\nconst logger = createLogger();\n\n//#endregion\nexport { shouldPublishLog as a, env as c, isDevelopment as d, isProduction as f, logger as i, getBooleanEnvVar as l, nodeENV as m, createLogger as n, getColorDepth as o, isTest as p, levels as r, ENV as s, TTY_COLORS as t, getEnvVar as u };","import { i as logger } from \"./env-DbssmzoK.mjs\";\nimport { createRandomStringGenerator } from \"@better-auth/utils/random\";\n\n//#region src/utils/error-codes.ts\nfunction defineErrorCodes(codes) {\n\treturn codes;\n}\n\n//#endregion\n//#region src/utils/id.ts\nconst generateId = (size) => {\n\treturn createRandomStringGenerator(\"a-z\", \"A-Z\", \"0-9\")(size || 32);\n};\n\n//#endregion\n//#region src/utils/json.ts\nfunction safeJSONParse(data) {\n\tfunction reviver(_, value) {\n\t\tif (typeof value === \"string\") {\n\t\t\tif (/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z$/.test(value)) {\n\t\t\t\tconst date = new Date(value);\n\t\t\t\tif (!isNaN(date.getTime())) return date;\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t}\n\ttry {\n\t\tif (typeof data !== \"string\") return data;\n\t\treturn JSON.parse(data, reviver);\n\t} catch (e) {\n\t\tlogger.error(\"Error parsing JSON\", { error: e });\n\t\treturn null;\n\t}\n}\n\n//#endregion\n//#region src/utils/string.ts\nfunction capitalizeFirstLetter(str) {\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n//#endregion\nexport { defineErrorCodes as i, safeJSONParse as n, generateId as r, capitalizeFirstLetter as t };","//#region src/async_hooks/index.ts\nconst AsyncLocalStoragePromise = import(\n\t/* @vite-ignore */\n\t/* webpackIgnore: true */\n\t\"node:async_hooks\"\n).then((mod) => mod.AsyncLocalStorage).catch((err) => {\n\tif (\"AsyncLocalStorage\" in globalThis) return globalThis.AsyncLocalStorage;\n\tif (typeof window !== \"undefined\") return null;\n\tconsole.warn(\"[better-auth] Warning: AsyncLocalStorage is not available in this environment. Some features may not work as expected.\");\n\tconsole.warn(\"[better-auth] Please read more about this warning at https://better-auth.com/docs/installation#mount-handler\");\n\tconsole.warn(\"[better-auth] If you are using Cloudflare Workers, please see: https://developers.cloudflare.com/workers/configuration/compatibility-flags/#nodejs-compatibility-flag\");\n\tthrow err;\n});\nasync function getAsyncLocalStorage() {\n\tconst mod = await AsyncLocalStoragePromise;\n\tif (mod === null) throw new Error(\"getAsyncLocalStorage is only available in server code\");\n\telse return mod;\n}\n\n//#endregion\nexport { getAsyncLocalStorage };","import { getAsyncLocalStorage } from \"@better-auth/core/async_hooks\";\n\n//#region src/context/endpoint-context.ts\nlet currentContextAsyncStorage = null;\nconst ensureAsyncStorage$2 = async () => {\n\tif (!currentContextAsyncStorage) currentContextAsyncStorage = new (await (getAsyncLocalStorage()))();\n\treturn currentContextAsyncStorage;\n};\n/**\n* This is for internal use only. Most users should use `getCurrentAuthContext` instead.\n*\n* It is exposed for advanced use cases where you need direct access to the AsyncLocalStorage instance.\n*/\nasync function getCurrentAuthContextAsyncLocalStorage() {\n\treturn ensureAsyncStorage$2();\n}\nasync function getCurrentAuthContext() {\n\tconst context = (await ensureAsyncStorage$2()).getStore();\n\tif (!context) throw new Error(\"No auth context found. Please make sure you are calling this function within a `runWithEndpointContext` callback.\");\n\treturn context;\n}\nasync function runWithEndpointContext(context, fn) {\n\treturn (await ensureAsyncStorage$2()).run(context, fn);\n}\n\n//#endregion\n//#region src/context/request-state.ts\nlet requestStateAsyncStorage = null;\nconst ensureAsyncStorage$1 = async () => {\n\tif (!requestStateAsyncStorage) requestStateAsyncStorage = new (await (getAsyncLocalStorage()))();\n\treturn requestStateAsyncStorage;\n};\nasync function getRequestStateAsyncLocalStorage() {\n\treturn ensureAsyncStorage$1();\n}\nasync function hasRequestState() {\n\treturn (await ensureAsyncStorage$1()).getStore() !== void 0;\n}\nasync function getCurrentRequestState() {\n\tconst store = (await ensureAsyncStorage$1()).getStore();\n\tif (!store) throw new Error(\"No request state found. Please make sure you are calling this function within a `runWithRequestState` callback.\");\n\treturn store;\n}\nasync function runWithRequestState(store, fn) {\n\treturn (await ensureAsyncStorage$1()).run(store, fn);\n}\nfunction defineRequestState(initFn) {\n\tconst ref = Object.freeze({});\n\treturn {\n\t\tget ref() {\n\t\t\treturn ref;\n\t\t},\n\t\tasync get() {\n\t\t\tconst store = await getCurrentRequestState();\n\t\t\tif (!store.has(ref)) {\n\t\t\t\tconst initialValue = await initFn();\n\t\t\t\tstore.set(ref, initialValue);\n\t\t\t\treturn initialValue;\n\t\t\t}\n\t\t\treturn store.get(ref);\n\t\t},\n\t\tasync set(value) {\n\t\t\t(await getCurrentRequestState()).set(ref, value);\n\t\t}\n\t};\n}\n\n//#endregion\n//#region src/context/transaction.ts\nlet currentAdapterAsyncStorage = null;\nconst ensureAsyncStorage = async () => {\n\tif (!currentAdapterAsyncStorage) currentAdapterAsyncStorage = new (await (getAsyncLocalStorage()))();\n\treturn currentAdapterAsyncStorage;\n};\n/**\n* This is for internal use only. Most users should use `getCurrentAdapter` instead.\n*\n* It is exposed for advanced use cases where you need direct access to the AsyncLocalStorage instance.\n*/\nconst getCurrentDBAdapterAsyncLocalStorage = async () => {\n\treturn ensureAsyncStorage();\n};\nconst getCurrentAdapter = async (fallback) => {\n\treturn ensureAsyncStorage().then((als) => {\n\t\treturn als.getStore() || fallback;\n\t}).catch(() => {\n\t\treturn fallback;\n\t});\n};\nconst runWithAdapter = async (adapter, fn) => {\n\tlet called = true;\n\treturn ensureAsyncStorage().then((als) => {\n\t\tcalled = true;\n\t\treturn als.run(adapter, fn);\n\t}).catch((err) => {\n\t\tif (!called) return fn();\n\t\tthrow err;\n\t});\n};\nconst runWithTransaction = async (adapter, fn) => {\n\tlet called = true;\n\treturn ensureAsyncStorage().then((als) => {\n\t\tcalled = true;\n\t\treturn adapter.transaction(async (trx) => {\n\t\t\treturn als.run(trx, fn);\n\t\t});\n\t}).catch((err) => {\n\t\tif (!called) return fn();\n\t\tthrow err;\n\t});\n};\n\n//#endregion\nexport { defineRequestState as a, hasRequestState as c, getCurrentAuthContextAsyncLocalStorage as d, runWithEndpointContext as f, runWithTransaction as i, runWithRequestState as l, getCurrentDBAdapterAsyncLocalStorage as n, getCurrentRequestState as o, runWithAdapter as r, getRequestStateAsyncLocalStorage as s, getCurrentAdapter as t, getCurrentAuthContext as u };","import { f as runWithEndpointContext } from \"../context-DblZrIwO.mjs\";\nimport { createEndpoint, createMiddleware } from \"better-call\";\n\n//#region src/api/index.ts\nconst optionsMiddleware = createMiddleware(async () => {\n\t/**\n\t* This will be passed on the instance of\n\t* the context. Used to infer the type\n\t* here.\n\t*/\n\treturn {};\n});\nconst createAuthMiddleware = createMiddleware.create({ use: [optionsMiddleware, createMiddleware(async () => {\n\treturn {};\n})] });\nconst use = [optionsMiddleware];\nfunction createAuthEndpoint(pathOrOptions, handlerOrOptions, handlerOrNever) {\n\tconst path = typeof pathOrOptions === \"string\" ? pathOrOptions : void 0;\n\tconst options = typeof handlerOrOptions === \"object\" ? handlerOrOptions : pathOrOptions;\n\tconst handler = typeof handlerOrOptions === \"function\" ? handlerOrOptions : handlerOrNever;\n\tif (path) return createEndpoint(path, {\n\t\t...options,\n\t\tuse: [...options?.use || [], ...use]\n\t}, async (ctx) => runWithEndpointContext(ctx, () => handler(ctx)));\n\treturn createEndpoint({\n\t\t...options,\n\t\tuse: [...options?.use || [], ...use]\n\t}, async (ctx) => runWithEndpointContext(ctx, () => handler(ctx)));\n}\n\n//#endregion\nexport { createAuthEndpoint, createAuthMiddleware, optionsMiddleware };","import type { PaystackOptions } from \"./types\";\n\nexport async function getPlans(subscriptionOptions: PaystackOptions[\"subscription\"]) {\n if (subscriptionOptions?.enabled) {\n return typeof subscriptionOptions.plans === \"function\"\n ? await subscriptionOptions.plans()\n : subscriptionOptions.plans;\n }\n throw new Error(\"Subscriptions are not enabled in the Paystack options.\");\n}\n\nexport async function getPlanByName(options: PaystackOptions<any>, name: string) {\n return await getPlans(options.subscription).then((plans) =>\n plans?.find((plan) => plan.name.toLowerCase() === name.toLowerCase()),\n );\n}\n","import { createAuthMiddleware } from \"@better-auth/core/api\";\nimport { logger } from \"better-auth\";\nimport { APIError } from \"better-auth/api\";\nimport type { SubscriptionOptions } from \"./types\";\n\nexport const referenceMiddleware = (\n subscriptionOptions: SubscriptionOptions,\n action:\n | \"initialize-transaction\"\n | \"verify-transaction\"\n | \"list-subscriptions\"\n | \"disable-subscription\"\n | \"enable-subscription\",\n) =>\n createAuthMiddleware(async (ctx) => {\n const session = ctx.context.session as any;\n if (!session) {\n throw new APIError(\"UNAUTHORIZED\");\n }\n const referenceId =\n ctx.body?.referenceId || ctx.query?.referenceId || session.user.id;\n\n if (referenceId !== session.user.id && !subscriptionOptions.authorizeReference) {\n logger.error(\n `Passing referenceId into a subscription action isn't allowed if subscription.authorizeReference isn't defined in your paystack plugin config.`,\n );\n throw new APIError(\"BAD_REQUEST\", {\n message:\n \"Passing referenceId isn't allowed without subscription.authorizeReference.\",\n });\n }\n\n if (referenceId !== session.user.id && subscriptionOptions.authorizeReference) {\n const authorized = await subscriptionOptions.authorizeReference(\n {\n user: session.user,\n session,\n referenceId,\n action,\n },\n ctx,\n );\n if (!authorized) {\n throw new APIError(\"UNAUTHORIZED\");\n }\n }\n\n return {\n context: {\n referenceId,\n },\n };\n });\n","import type { PaystackClientLike, PaystackOpenApiFetchResponse } from \"./types\";\n\nfunction isOpenApiFetchResponse(value: any): value is PaystackOpenApiFetchResponse {\n return (\n value &&\n typeof value === \"object\" &&\n (\"data\" in value || \"error\" in value || \"response\" in value)\n );\n}\n\nexport function unwrapSdkResult<T = any>(result: any): T {\n if (isOpenApiFetchResponse(result)) {\n if (result.error) {\n throw result.error;\n }\n return result.data as T;\n }\n return (result?.data ?? result) as T;\n}\n\nexport function getPaystackOps(paystackClient: PaystackClientLike | any) {\n return {\n customerCreate: async (params: any) => {\n if (paystackClient?.customer_create) {\n return paystackClient.customer_create({ body: params });\n }\n return paystackClient?.customer?.create?.(params);\n },\n transactionInitialize: async (body: any) => {\n if (paystackClient?.transaction_initialize) {\n return paystackClient.transaction_initialize({ body });\n }\n return paystackClient?.transaction?.initialize?.(body);\n },\n transactionVerify: async (reference: string) => {\n if (paystackClient?.transaction_verify) {\n return paystackClient.transaction_verify({\n params: { path: { reference } },\n });\n }\n return paystackClient?.transaction?.verify?.(reference);\n },\n subscriptionDisable: async (body: { code: string; token: string }) => {\n if (paystackClient?.subscription_disable) {\n return paystackClient.subscription_disable({ body });\n }\n return paystackClient?.subscription?.disable?.(body);\n },\n subscriptionEnable: async (body: { code: string; token: string }) => {\n if (paystackClient?.subscription_enable) {\n return paystackClient.subscription_enable({ body });\n }\n return paystackClient?.subscription?.enable?.(body);\n },\n subscriptionFetch: async (idOrCode: string) => {\n if (paystackClient?.subscription_fetch) {\n try {\n return await paystackClient.subscription_fetch({\n params: { path: { code: idOrCode } },\n });\n } catch {\n return paystackClient.subscription_fetch({\n params: { path: { id_or_code: idOrCode } },\n });\n }\n }\n return paystackClient?.subscription?.fetch?.(idOrCode);\n },\n subscriptionManageLink: async (code: string) => {\n if (paystackClient?.subscription_manage_link) {\n return paystackClient.subscription_manage_link({\n params: { path: { code } },\n });\n }\n return paystackClient?.subscription?.manage?.link?.(code);\n },\n };\n}\n","import { createAuthEndpoint } from \"@better-auth/core/api\";\nimport { defineErrorCodes } from \"@better-auth/core/utils\";\nimport type { GenericEndpointContext } from \"better-auth\";\nimport { HIDE_METADATA } from \"better-auth\";\nimport {\n APIError,\n getSessionFromCtx,\n originCheck,\n sessionMiddleware,\n} from \"better-auth/api\";\nimport * as z from \"zod/v4\";\nimport type { InputSubscription, PaystackOptions, Subscription } from \"./types\";\nimport { getPlanByName, getPlans } from \"./utils\";\nimport { referenceMiddleware } from \"./middleware\";\nimport { getPaystackOps, unwrapSdkResult } from \"./paystack-sdk\";\n\ntype AnyPaystackOptions = PaystackOptions<any>;\n\nconst PAYSTACK_ERROR_CODES = defineErrorCodes({\n SUBSCRIPTION_NOT_FOUND: \"Subscription not found\",\n SUBSCRIPTION_PLAN_NOT_FOUND: \"Subscription plan not found\",\n UNABLE_TO_CREATE_CUSTOMER: \"Unable to create customer\",\n FAILED_TO_INITIALIZE_TRANSACTION: \"Failed to initialize transaction\",\n FAILED_TO_VERIFY_TRANSACTION: \"Failed to verify transaction\",\n FAILED_TO_DISABLE_SUBSCRIPTION: \"Failed to disable subscription\",\n FAILED_TO_ENABLE_SUBSCRIPTION: \"Failed to enable subscription\",\n EMAIL_VERIFICATION_REQUIRED:\n \"Email verification is required before you can subscribe to a plan\",\n});\n\nasync function hmacSha512Hex(secret: string, message: string): Promise<string> {\n const encoder = new TextEncoder();\n const keyData = encoder.encode(secret);\n const msgData = encoder.encode(message);\n\n const subtle = (globalThis.crypto as any)?.subtle;\n if (subtle) {\n const key = await subtle.importKey(\n \"raw\",\n keyData,\n { name: \"HMAC\", hash: \"SHA-512\" },\n false,\n [\"sign\"],\n );\n const signature = await subtle.sign(\"HMAC\", key, msgData);\n return Array.from(new Uint8Array(signature))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n }\n\n const { createHmac } = await import(\"node:crypto\");\n return createHmac(\"sha512\", secret).update(message).digest(\"hex\");\n}\n\nexport const paystackWebhook = (options: AnyPaystackOptions) => {\n return createAuthEndpoint(\n \"/paystack/webhook\",\n {\n method: \"POST\",\n metadata: {\n ...HIDE_METADATA,\n openapi: {\n operationId: \"handlePaystackWebhook\",\n },\n },\n cloneRequest: true,\n disableBody: true,\n },\n async (ctx) => {\n const request = (ctx as any).requestClone ?? ctx.request;\n const payload = await request.text();\n const headers = (ctx as any).headers ?? (ctx.request as any)?.headers;\n const signature = headers?.get(\"x-paystack-signature\") as\n | string\n | null\n | undefined;\n\n if (!signature) {\n throw new APIError(\"UNAUTHORIZED\", {\n message: \"Missing x-paystack-signature header\",\n status: 401,\n });\n }\n\n const expected = await hmacSha512Hex(options.paystackWebhookSecret, payload);\n if (expected !== signature) {\n throw new APIError(\"UNAUTHORIZED\", {\n message: \"Invalid Paystack webhook signature\",\n status: 401,\n });\n }\n\n const event = JSON.parse(payload) as any;\n\n // Best-effort local state sync for subscription lifecycle.\n if (options.subscription?.enabled) {\n const eventName = String(event?.event ?? \"\");\n const data = event?.data as any;\n try {\n if (eventName === \"subscription.create\") {\n const subscriptionCode =\n data?.subscription_code ??\n data?.subscription?.subscription_code ??\n data?.code;\n const customerCode =\n data?.customer?.customer_code ??\n data?.customer_code ??\n data?.customer?.code;\n const planCode =\n data?.plan?.plan_code ?? data?.plan_code ?? data?.plan;\n\n let metadata: any = data?.metadata;\n if (typeof metadata === \"string\") {\n try {\n metadata = JSON.parse(metadata);\n } catch {\n // ignore\n }\n }\n\n const referenceIdFromMetadata =\n typeof metadata === \"object\" && metadata\n ? (metadata.referenceId as string | undefined)\n : undefined;\n\n let planNameFromMetadata =\n typeof metadata === \"object\" && metadata\n ? (metadata.plan as string | undefined)\n : undefined;\n if (typeof planNameFromMetadata === \"string\") {\n planNameFromMetadata = planNameFromMetadata.toLowerCase();\n }\n\n const plans = await getPlans(options.subscription);\n const planFromCode = planCode\n ? plans.find((p) => p.planCode && p.planCode === planCode)\n : undefined;\n const planName = (planFromCode?.name ?? planNameFromMetadata)?.toLowerCase();\n\n if (subscriptionCode) {\n const where: Array<{ field: string; value: any }> = [];\n if (referenceIdFromMetadata) {\n where.push({ field: \"referenceId\", value: referenceIdFromMetadata });\n } else if (customerCode) {\n where.push({ field: \"paystackCustomerCode\", value: customerCode });\n }\n if (planName) {\n where.push({ field: \"plan\", value: planName });\n }\n\n if (where.length > 0) {\n const matches = await ctx.context.adapter.findMany<Subscription>({\n model: \"subscription\",\n where,\n });\n const subscription = matches?.[0];\n if (subscription) {\n await ctx.context.adapter.update({\n model: \"subscription\",\n update: {\n paystackSubscriptionCode: subscriptionCode,\n status: \"active\",\n updatedAt: new Date(),\n },\n where: [{ field: \"id\", value: subscription.id }],\n });\n\n const plan = planFromCode ?? (planName ? await getPlanByName(options, planName) : undefined);\n if (plan) {\n await options.subscription.onSubscriptionComplete?.(\n { event, subscription: { ...subscription, paystackSubscriptionCode: subscriptionCode, status: \"active\" }, plan },\n ctx as any,\n );\n }\n }\n }\n }\n }\n\n if (eventName === \"subscription.disable\" || eventName === \"subscription.not_renew\") {\n const subscriptionCode =\n data?.subscription_code ??\n data?.subscription?.subscription_code ??\n data?.code;\n if (subscriptionCode) {\n await ctx.context.adapter.update({\n model: \"subscription\",\n update: {\n status: \"canceled\",\n updatedAt: new Date(),\n },\n where: [\n { field: \"paystackSubscriptionCode\", value: subscriptionCode },\n ],\n });\n }\n }\n } catch (e: any) {\n ctx.context.logger.error(\"Failed to sync Paystack webhook event\", e);\n }\n }\n\n await options.onEvent?.(event);\n return ctx.json({ received: true });\n },\n );\n};\n\n\nconst initializeTransactionBodySchema = z.object({\n plan: z.string(),\n referenceId: z.string().optional(),\n callbackURL: z.string().optional(),\n});\n\nexport const initializeTransaction = (options: AnyPaystackOptions) => {\n const subscriptionOptions = options.subscription;\n const useMiddlewares = subscriptionOptions?.enabled\n ? [sessionMiddleware, originCheck, referenceMiddleware(subscriptionOptions, \"initialize-transaction\")]\n : [sessionMiddleware, originCheck];\n\n return createAuthEndpoint(\n \"/paystack/transaction/initialize\",\n {\n method: \"POST\",\n body: initializeTransactionBodySchema,\n use: useMiddlewares,\n },\n async (ctx) => {\n const paystack = getPaystackOps(options.paystackClient);\n if (!subscriptionOptions?.enabled) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Subscriptions are not enabled in the Paystack options.\",\n });\n }\n\n if (ctx.body.callbackURL) {\n const isTrustedOriginFn = (ctx.context as any)?.isTrustedOrigin as\n | ((value: string, opts?: { allowRelativePaths?: boolean }) => boolean)\n | undefined;\n\n const trusted = isTrustedOriginFn\n ? isTrustedOriginFn(ctx.body.callbackURL, { allowRelativePaths: true })\n : (() => {\n try {\n if (ctx.body.callbackURL.startsWith(\"/\")) return true;\n const baseUrl =\n (ctx.context as any)?.baseURL ??\n (ctx.request as any)?.url ??\n \"\";\n if (!baseUrl) return false;\n const baseOrigin = new URL(baseUrl).origin;\n return new URL(ctx.body.callbackURL).origin === baseOrigin;\n } catch {\n return false;\n }\n })();\n\n if (!trusted) {\n throw new APIError(\"FORBIDDEN\", {\n message: \"callbackURL is not a trusted origin.\",\n status: 403,\n });\n }\n }\n\n const session = await getSessionFromCtx(ctx);\n if (!session) throw new APIError(\"UNAUTHORIZED\");\n const user = session.user;\n const referenceIdFromCtx = (ctx.context as any).referenceId as\n | string\n | undefined;\n const referenceId =\n ctx.body.referenceId || referenceIdFromCtx || (session.user as any).id;\n\n if (subscriptionOptions.requireEmailVerification && !user.emailVerified) {\n throw new APIError(\"BAD_REQUEST\", {\n code: \"EMAIL_VERIFICATION_REQUIRED\",\n message: PAYSTACK_ERROR_CODES.EMAIL_VERIFICATION_REQUIRED,\n });\n }\n\n const plan = await getPlanByName(options, ctx.body.plan);\n if (!plan) {\n throw new APIError(\"BAD_REQUEST\", {\n code: \"SUBSCRIPTION_PLAN_NOT_FOUND\",\n message: PAYSTACK_ERROR_CODES.SUBSCRIPTION_PLAN_NOT_FOUND,\n });\n }\n\n if (!plan.planCode && !plan.amount) {\n throw new APIError(\"BAD_REQUEST\", {\n message:\n \"Paystack transaction initialization requires either plan.planCode (Paystack plan code) or plan.amount (smallest unit).\",\n });\n }\n\n let url: string | undefined;\n let reference: string | undefined;\n let accessCode: string | undefined;\n try {\n const metadata = JSON.stringify({\n referenceId,\n userId: user.id,\n plan: plan.name.toLowerCase(),\n });\n\n const initBody: any = {\n email: user.email,\n callback_url: ctx.body.callbackURL,\n currency: plan.currency,\n plan: plan.planCode,\n invoice_limit: plan.invoiceLimit,\n metadata,\n };\n\n // Paystack docs: when `plan` is provided, it invalidates `amount`.\n if (!plan.planCode && plan.amount) {\n initBody.amount = String(plan.amount);\n }\n\n const initRaw = await paystack.transactionInitialize(initBody);\n const initRes = unwrapSdkResult<any>(initRaw);\n const data =\n initRes && typeof initRes === \"object\" && \"status\" in initRes && \"data\" in initRes\n ? (initRes as any).data\n : initRes?.data ?? initRes;\n url = data?.authorization_url;\n reference = data?.reference;\n accessCode = data?.access_code;\n } catch (error: any) {\n ctx.context.logger.error(\"Failed to initialize Paystack transaction\", error);\n throw new APIError(\"BAD_REQUEST\", {\n code: \"FAILED_TO_INITIALIZE_TRANSACTION\",\n message:\n error?.message || PAYSTACK_ERROR_CODES.FAILED_TO_INITIALIZE_TRANSACTION,\n });\n }\n\n const paystackCustomerCode = (user as any).paystackCustomerCode;\n\n await ctx.context.adapter.create<InputSubscription, Subscription>({\n model: \"subscription\",\n data: {\n plan: plan.name.toLowerCase(),\n referenceId,\n paystackCustomerCode,\n paystackTransactionReference: reference,\n status: \"incomplete\",\n },\n });\n\n return ctx.json({\n url,\n reference,\n accessCode,\n redirect: true,\n });\n },\n );\n};\n\nexport const verifyTransaction = (options: AnyPaystackOptions) => {\n const verifyBodySchema = z.object({\n reference: z.string(),\n });\n\n const subscriptionOptions = options.subscription;\n const useMiddlewares = subscriptionOptions?.enabled\n ? [sessionMiddleware, originCheck, referenceMiddleware(subscriptionOptions, \"verify-transaction\")]\n : [sessionMiddleware, originCheck];\n\n return createAuthEndpoint(\n \"/paystack/transaction/verify\",\n {\n method: \"POST\",\n body: verifyBodySchema,\n use: useMiddlewares,\n },\n async (ctx) => {\n const paystack = getPaystackOps(options.paystackClient);\n let verifyRes: any;\n try {\n const verifyRaw = await paystack.transactionVerify(ctx.body.reference);\n verifyRes = unwrapSdkResult<any>(verifyRaw);\n } catch (error: any) {\n ctx.context.logger.error(\"Failed to verify Paystack transaction\", error);\n throw new APIError(\"BAD_REQUEST\", {\n code: \"FAILED_TO_VERIFY_TRANSACTION\",\n message:\n error?.message || PAYSTACK_ERROR_CODES.FAILED_TO_VERIFY_TRANSACTION,\n });\n }\n const data =\n verifyRes && typeof verifyRes === \"object\" && \"status\" in verifyRes && \"data\" in verifyRes\n ? (verifyRes as any).data\n : verifyRes?.data ?? verifyRes;\n const status = data?.status;\n const reference = data?.reference ?? ctx.body.reference;\n\n if (status === \"success\") {\n try {\n const session = await getSessionFromCtx(ctx);\n const referenceIdFromCtx = (ctx.context as any).referenceId as\n | string\n | undefined;\n const referenceId = referenceIdFromCtx ?? (session?.user as any)?.id;\n\n await ctx.context.adapter.update({\n model: \"subscription\",\n update: {\n status: \"active\",\n periodStart: new Date(),\n updatedAt: new Date(),\n },\n where: [\n { field: \"paystackTransactionReference\", value: reference },\n ...(referenceId ? [{ field: \"referenceId\", value: referenceId }] : []),\n ],\n });\n } catch (e: any) {\n ctx.context.logger.error(\n \"Failed to update subscription after transaction verification\",\n e,\n );\n }\n }\n\n return ctx.json({\n status,\n reference,\n data,\n });\n },\n );\n};\n\nexport const listSubscriptions = (options: AnyPaystackOptions) => {\n const listQuerySchema = z.object({\n referenceId: z.string().optional(),\n });\n\n const subscriptionOptions = options.subscription;\n const useMiddlewares = subscriptionOptions?.enabled\n ? [sessionMiddleware, originCheck, referenceMiddleware(subscriptionOptions, \"list-subscriptions\")]\n : [sessionMiddleware, originCheck];\n\n return createAuthEndpoint(\n \"/paystack/subscription/list-local\",\n {\n method: \"GET\",\n query: listQuerySchema,\n use: useMiddlewares,\n },\n async (ctx) => {\n if (!subscriptionOptions?.enabled) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Subscriptions are not enabled in the Paystack options.\",\n });\n }\n const session = await getSessionFromCtx(ctx);\n if (!session) throw new APIError(\"UNAUTHORIZED\");\n const referenceId =\n ((ctx.context as any).referenceId as string | undefined) ??\n (ctx.query?.referenceId as string | undefined) ??\n ((session.user as any).id as string);\n const res = await ctx.context.adapter.findMany<Subscription>({\n model: \"subscription\",\n where: [{ field: \"referenceId\", value: referenceId }],\n });\n return ctx.json({ subscriptions: res });\n },\n );\n};\n\nconst enableDisableBodySchema = z.object({\n referenceId: z.string().optional(),\n subscriptionCode: z.string(),\n emailToken: z.string().optional(),\n});\n\nfunction decodeBase64UrlToString(value: string): string {\n const normalized = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = normalized + \"===\".slice((normalized.length + 3) % 4);\n if (typeof (globalThis as any).atob === \"function\") {\n return (globalThis as any).atob(padded);\n }\n // Node fallback\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n return Buffer.from(padded, \"base64\").toString(\"utf8\");\n}\n\nfunction tryGetEmailTokenFromSubscriptionManageLink(link: string): string | undefined {\n try {\n const url = new URL(link);\n const subscriptionToken = url.searchParams.get(\"subscription_token\");\n if (!subscriptionToken) return undefined;\n const parts = subscriptionToken.split(\".\");\n if (parts.length < 2) return undefined;\n const payloadJson = decodeBase64UrlToString(parts[1]!);\n const payload = JSON.parse(payloadJson) as any;\n return typeof payload?.email_token === \"string\" ? payload.email_token : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport const disablePaystackSubscription = (options: AnyPaystackOptions) => {\n const subscriptionOptions = options.subscription;\n const useMiddlewares = subscriptionOptions?.enabled\n ? [sessionMiddleware, originCheck, referenceMiddleware(subscriptionOptions, \"disable-subscription\")]\n : [sessionMiddleware, originCheck];\n\n return createAuthEndpoint(\n \"/paystack/subscription/disable\",\n { method: \"POST\", body: enableDisableBodySchema, use: useMiddlewares },\n async (ctx) => {\n const { subscriptionCode } = ctx.body;\n const paystack = getPaystackOps(options.paystackClient);\n try {\n let emailToken = ctx.body.emailToken;\n if (!emailToken) {\n try {\n const raw = await paystack.subscriptionFetch(subscriptionCode);\n const fetchRes = unwrapSdkResult<any>(raw);\n const data =\n fetchRes && typeof fetchRes === \"object\" && \"status\" in fetchRes && \"data\" in fetchRes\n ? (fetchRes as any).data\n : fetchRes?.data ?? fetchRes;\n emailToken = data?.email_token;\n } catch {\n // ignore; try manage-link fallback below\n }\n }\n\n if (!emailToken) {\n try {\n const raw = await paystack.subscriptionManageLink(subscriptionCode);\n const linkRes = unwrapSdkResult<any>(raw);\n const data =\n linkRes && typeof linkRes === \"object\" && \"status\" in linkRes && \"data\" in linkRes\n ? (linkRes as any).data\n : linkRes?.data ?? linkRes;\n const link = data?.link;\n if (typeof link === \"string\") {\n emailToken = tryGetEmailTokenFromSubscriptionManageLink(link);\n }\n } catch {\n // ignore\n }\n }\n\n if (!emailToken) {\n throw new APIError(\"BAD_REQUEST\", {\n message:\n \"Missing emailToken. Provide it explicitly or ensure your server can fetch it from Paystack using the subscription code.\",\n });\n }\n\n const raw = await paystack.subscriptionDisable({\n code: subscriptionCode,\n token: emailToken,\n });\n const result = unwrapSdkResult<any>(raw);\n return ctx.json({ result });\n } catch (error: any) {\n ctx.context.logger.error(\"Failed to disable Paystack subscription\", error);\n throw new APIError(\"BAD_REQUEST\", {\n code: \"FAILED_TO_DISABLE_SUBSCRIPTION\",\n message:\n error?.message || PAYSTACK_ERROR_CODES.FAILED_TO_DISABLE_SUBSCRIPTION,\n });\n }\n },\n );\n};\n\nexport const enablePaystackSubscription = (options: AnyPaystackOptions) => {\n const subscriptionOptions = options.subscription;\n const useMiddlewares = subscriptionOptions?.enabled\n ? [sessionMiddleware, originCheck, referenceMiddleware(subscriptionOptions, \"enable-subscription\")]\n : [sessionMiddleware, originCheck];\n\n return createAuthEndpoint(\n \"/paystack/subscription/enable\",\n { method: \"POST\", body: enableDisableBodySchema, use: useMiddlewares },\n async (ctx) => {\n const { subscriptionCode } = ctx.body;\n const paystack = getPaystackOps(options.paystackClient);\n try {\n let emailToken = ctx.body.emailToken;\n if (!emailToken) {\n try {\n const raw = await paystack.subscriptionFetch(subscriptionCode);\n const fetchRes = unwrapSdkResult<any>(raw);\n const data =\n fetchRes && typeof fetchRes === \"object\" && \"status\" in fetchRes && \"data\" in fetchRes\n ? (fetchRes as any).data\n : fetchRes?.data ?? fetchRes;\n emailToken = data?.email_token;\n } catch {\n // ignore; try manage-link fallback below\n }\n }\n\n if (!emailToken) {\n try {\n const raw = await paystack.subscriptionManageLink(subscriptionCode);\n const linkRes = unwrapSdkResult<any>(raw);\n const data =\n linkRes && typeof linkRes === \"object\" && \"status\" in linkRes && \"data\" in linkRes\n ? (linkRes as any).data\n : linkRes?.data ?? linkRes;\n const link = data?.link;\n if (typeof link === \"string\") {\n emailToken = tryGetEmailTokenFromSubscriptionManageLink(link);\n }\n } catch {\n // ignore\n }\n }\n\n if (!emailToken) {\n throw new APIError(\"BAD_REQUEST\", {\n message:\n \"Missing emailToken. Provide it explicitly or ensure your server can fetch it from Paystack using the subscription code.\",\n });\n }\n\n const raw = await paystack.subscriptionEnable({\n code: subscriptionCode,\n token: emailToken,\n });\n const result = unwrapSdkResult<any>(raw);\n return ctx.json({ result });\n } catch (error: any) {\n ctx.context.logger.error(\"Failed to enable Paystack subscription\", error);\n throw new APIError(\"BAD_REQUEST\", {\n code: \"FAILED_TO_ENABLE_SUBSCRIPTION\",\n message:\n error?.message || PAYSTACK_ERROR_CODES.FAILED_TO_ENABLE_SUBSCRIPTION,\n });\n }\n },\n );\n};\n\nexport { PAYSTACK_ERROR_CODES };\n","import type { BetterAuthPluginDBSchema } from \"@better-auth/core/db\";\nimport { mergeSchema } from \"better-auth/db\";\nimport type { PaystackOptions } from \"./types\";\n\nexport const subscriptions = {\n subscription: {\n fields: {\n plan: {\n type: \"string\",\n required: true,\n },\n referenceId: {\n type: \"string\",\n required: true,\n },\n paystackCustomerCode: {\n type: \"string\",\n required: false,\n },\n paystackSubscriptionCode: {\n type: \"string\",\n required: false,\n },\n paystackTransactionReference: {\n type: \"string\",\n required: false,\n },\n status: {\n type: \"string\",\n defaultValue: \"incomplete\",\n },\n periodStart: {\n type: \"date\",\n required: false,\n },\n periodEnd: {\n type: \"date\",\n required: false,\n },\n trialStart: {\n type: \"date\",\n required: false,\n },\n trialEnd: {\n type: \"date\",\n required: false,\n },\n cancelAtPeriodEnd: {\n type: \"boolean\",\n required: false,\n defaultValue: false,\n },\n groupId: {\n type: \"string\",\n required: false,\n },\n seats: {\n type: \"number\",\n required: false,\n },\n },\n },\n} satisfies BetterAuthPluginDBSchema;\n\nexport const user = {\n user: {\n fields: {\n paystackCustomerCode: {\n type: \"string\",\n required: false,\n },\n },\n },\n} satisfies BetterAuthPluginDBSchema;\n\nexport const getSchema = (options: PaystackOptions<any>) => {\n let baseSchema: BetterAuthPluginDBSchema;\n\n if (options.subscription?.enabled) {\n baseSchema = {\n ...subscriptions,\n ...user,\n };\n } else {\n baseSchema = {\n ...user,\n };\n }\n\n if (\n options.schema &&\n !options.subscription?.enabled &&\n \"subscription\" in options.schema\n ) {\n const { subscription: _subscription, ...restSchema } = options.schema as any;\n return mergeSchema(baseSchema, restSchema);\n }\n\n return mergeSchema(baseSchema, options.schema);\n};\n","import { defineErrorCodes } from \"@better-auth/core/utils\";\nimport type { BetterAuthPlugin } from \"better-auth\";\nimport type { GenericEndpointContext } from \"better-auth\";\nimport { defu } from \"defu\";\nimport {\n disablePaystackSubscription,\n enablePaystackSubscription,\n initializeTransaction,\n listSubscriptions,\n paystackWebhook,\n verifyTransaction,\n PAYSTACK_ERROR_CODES,\n} from \"./routes\";\nimport { getSchema } from \"./schema\";\nimport type {\n PaystackNodeClient,\n PaystackClientLike,\n PaystackOptions,\n PaystackPlan,\n Subscription,\n SubscriptionOptions,\n} from \"./types\";\nimport { getPaystackOps, unwrapSdkResult } from \"./paystack-sdk\";\n\nconst INTERNAL_ERROR_CODES = defineErrorCodes({\n ...PAYSTACK_ERROR_CODES,\n});\n\nexport const paystack = <\n TPaystackClient extends PaystackClientLike = PaystackNodeClient,\n O extends PaystackOptions<TPaystackClient> = PaystackOptions<TPaystackClient>,\n>(\n options: O,\n) => {\n const baseEndpoints = {\n paystackWebhook: paystackWebhook(options),\n } satisfies NonNullable<BetterAuthPlugin[\"endpoints\"]>;\n\n const subscriptionEnabledEndpoints = {\n ...baseEndpoints,\n initializeTransaction: initializeTransaction(options),\n verifyTransaction: verifyTransaction(options),\n listSubscriptions: listSubscriptions(options),\n disablePaystackSubscription: disablePaystackSubscription(options),\n enablePaystackSubscription: enablePaystackSubscription(options),\n } satisfies NonNullable<BetterAuthPlugin[\"endpoints\"]>;\n\n type EndpointsForOptions = O extends { subscription: { enabled: true } }\n ? typeof subscriptionEnabledEndpoints\n : typeof baseEndpoints;\n\n const endpoints = (\n options.subscription?.enabled\n ? subscriptionEnabledEndpoints\n : baseEndpoints\n ) as EndpointsForOptions;\n\n return {\n id: \"paystack\",\n endpoints,\n init(ctx) {\n return {\n options: {\n databaseHooks: {\n user: {\n create: {\n async after(user, hookCtx?: GenericEndpointContext | null) {\n if (!hookCtx || !options.createCustomerOnSignUp) return;\n\n try {\n const firstName = user.name?.split(\" \")[0];\n const lastName = user.name?.split(\" \").slice(1).join(\" \") || undefined;\n\n const extraCreateParams = options.getCustomerCreateParams\n ? await options.getCustomerCreateParams(user as any, hookCtx as any)\n : {};\n\n const params = defu(\n {\n email: user.email,\n first_name: firstName,\n last_name: lastName,\n metadata: { userId: user.id },\n },\n extraCreateParams,\n );\n const paystack = getPaystackOps(options.paystackClient);\n const raw = await paystack.customerCreate(params);\n const res = unwrapSdkResult<any>(raw);\n const paystackCustomer =\n res && typeof res === \"object\" && \"status\" in res && \"data\" in res\n ? (res as any).data\n : res?.data ?? res;\n const customerCode = paystackCustomer?.customer_code;\n\n if (!customerCode) return;\n\n await (hookCtx as any).context.internalAdapter.updateUser(user.id, {\n paystackCustomerCode: customerCode,\n });\n\n await options.onCustomerCreate?.(\n {\n paystackCustomer,\n user: {\n ...(user as any),\n paystackCustomerCode: customerCode,\n },\n },\n hookCtx as any,\n );\n } catch (e: any) {\n (hookCtx as any).context.logger.error(\n `Failed to create Paystack customer: ${e?.message || \"Unknown error\"}`,\n e,\n );\n }\n },\n },\n },\n },\n },\n };\n },\n schema: getSchema(options),\n $ERROR_CODES: INTERNAL_ERROR_CODES,\n } satisfies BetterAuthPlugin;\n};\n\ntype PaystackClientFromOptions<O extends PaystackOptions<any>> =\n O extends PaystackOptions<infer TClient> ? TClient : PaystackNodeClient;\n\nexport type PaystackPlugin<O extends PaystackOptions<any> = PaystackOptions> = ReturnType<\n typeof paystack<PaystackClientFromOptions<O>, O>\n>;\n\nexport type { Subscription, SubscriptionOptions, PaystackPlan, PaystackOptions };\n"],"x_google_ignoreList":[0,1,2,3,4],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alexasomba/better-auth-paystack",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "Community Better Auth plugin for Paystack (by alexasomba)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "alexasomba",
|
|
@@ -33,28 +33,36 @@
|
|
|
33
33
|
"access": "public"
|
|
34
34
|
},
|
|
35
35
|
"peerDependencies": {
|
|
36
|
-
"better-auth": ">=1.
|
|
36
|
+
"better-auth": ">=1.3.0"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"@alexasomba/paystack-browser": "^1.1.6",
|
|
40
40
|
"@alexasomba/paystack-node": "^1.1.6",
|
|
41
|
+
"better-call": "^1.1.6",
|
|
41
42
|
"defu": "^6.1.4",
|
|
42
|
-
"zod": "^4.2.
|
|
43
|
+
"zod": "^4.2.1"
|
|
44
|
+
},
|
|
45
|
+
"optionalDependencies": {
|
|
46
|
+
"@rollup/rollup-linux-x64-gnu": "4.53.5"
|
|
43
47
|
},
|
|
44
48
|
"devDependencies": {
|
|
45
49
|
"@arethetypeswrong/cli": "^0.18.2",
|
|
46
50
|
"@better-auth/core": "^1.4.7",
|
|
51
|
+
"@rollup/rollup-linux-x64-gnu": "4.53.5",
|
|
47
52
|
"@types/node": "^24.10.4",
|
|
48
|
-
"
|
|
53
|
+
"@vitest/coverage-v8": "^4.0.16",
|
|
49
54
|
"better-auth": "^1.4.7",
|
|
50
|
-
"
|
|
55
|
+
"publint": "^0.3.16",
|
|
56
|
+
"tsdown": "^0.18.1",
|
|
51
57
|
"typescript": "^5.9.3",
|
|
52
|
-
"vitest": "^4.0.
|
|
58
|
+
"vitest": "^4.0.16"
|
|
53
59
|
},
|
|
54
60
|
"scripts": {
|
|
55
61
|
"build": "tsdown",
|
|
62
|
+
"bd": "node ./scripts/bd.mjs",
|
|
56
63
|
"dev": "tsdown --watch",
|
|
57
64
|
"test": "vitest run",
|
|
65
|
+
"test:integration": "RUN_INTEGRATION_TESTS=1 vitest run",
|
|
58
66
|
"coverage": "vitest run --coverage",
|
|
59
67
|
"lint:package": "publint run --strict",
|
|
60
68
|
"lint:types": "attw --profile esm-only --pack .",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-CZ3Le7Er.d.mts","names":["GenericEndpointContext","InferOptionSchema","Session","User","createPaystack","subscriptions","user","PaystackNodeClient","ReturnType","PaystackOpenApiFetchResponse","T","Response","PaystackApiResult","Promise","PaystackClientLike","NoInfer","AuthSession","Record","PaystackPlan","Subscription","Date","SubscriptionOptions","PaystackOptions","TPaystackClient","InputSubscription","Omit"],"sources":["../src/schema.ts","../src/types.d.ts","../src/index.ts"],"sourcesContent":["import type { GenericEndpointContext, InferOptionSchema, Session, User } from \"better-auth\";\nimport type { createPaystack } from \"@alexasomba/paystack-node\";\nimport type { subscriptions, user } from \"./schema\";\nexport type PaystackNodeClient = ReturnType<typeof createPaystack>;\nexport type PaystackOpenApiFetchResponse<T = unknown> = {\n data?: T;\n error?: unknown;\n response?: Response;\n};\nexport type PaystackApiResult<T = unknown> = Promise<T | PaystackOpenApiFetchResponse<T>>;\nexport type PaystackClientLike = {\n customer_create?: (init?: {\n body?: any;\n } | undefined) => PaystackApiResult<any>;\n transaction_initialize?: (init?: {\n body?: any;\n } | undefined) => PaystackApiResult<any>;\n transaction_verify?: (init: {\n params: {\n path: {\n reference: string;\n };\n };\n }) => PaystackApiResult<any>;\n subscription_fetch?: (init: any) => PaystackApiResult<any>;\n subscription_disable?: (init?: {\n body?: {\n code: string;\n token: string;\n };\n } | undefined) => PaystackApiResult<any>;\n subscription_enable?: (init?: {\n body?: {\n code: string;\n token: string;\n };\n } | undefined) => PaystackApiResult<any>;\n subscription_manage_link?: (init: {\n params: {\n path: {\n code: string;\n };\n };\n }) => PaystackApiResult<any>;\n customer?: {\n create?: (params: any) => Promise<any>;\n };\n transaction?: {\n initialize?: (params: any) => Promise<any>;\n verify?: (reference: string) => Promise<any>;\n };\n subscription?: {\n fetch?: (idOrCode: string) => Promise<any>;\n disable?: (params: any) => Promise<any>;\n enable?: (params: any) => Promise<any>;\n manage?: {\n link?: (code: string) => Promise<any>;\n };\n };\n};\ntype NoInfer<T> = [T][T extends any ? 0 : never];\nexport type AuthSession = {\n user: User;\n session: Session;\n} & Record<string, any>;\nexport type PaystackPlan = {\n /** Human name stored in DB (lowercased). */\n name: string;\n /** Paystack plan code (if you use Paystack plans). */\n planCode?: string | undefined;\n /** Amount in the smallest currency unit (e.g. kobo). */\n amount?: number | undefined;\n /** Currency ISO code (e.g. NGN). */\n currency?: string | undefined;\n /** Paystack interval keyword (when using Paystack plans). */\n interval?: \"daily\" | \"weekly\" | \"monthly\" | \"quarterly\" | \"biannually\" | \"annually\" | undefined;\n /** Optional invoice limit; Paystack uses `invoice_limit` during init. */\n invoiceLimit?: number | undefined;\n /** Arbitrary limits (stored/consumed by your app). */\n limits?: Record<string, unknown> | undefined;\n /** Optional free trial config, if your app supports it. */\n freeTrial?: {\n days: number;\n } | undefined;\n};\nexport interface Subscription {\n id: string;\n plan: string;\n referenceId: string;\n paystackCustomerCode?: string | undefined;\n paystackSubscriptionCode?: string | undefined;\n paystackTransactionReference?: string | undefined;\n status: \"active\" | \"canceled\" | \"incomplete\" | \"incomplete_expired\" | \"paused\" | \"trialing\" | \"unpaid\";\n periodStart?: Date | undefined;\n periodEnd?: Date | undefined;\n trialStart?: Date | undefined;\n trialEnd?: Date | undefined;\n cancelAtPeriodEnd?: boolean | undefined;\n groupId?: string | undefined;\n seats?: number | undefined;\n}\nexport type SubscriptionOptions = {\n plans: PaystackPlan[] | (() => PaystackPlan[] | Promise<PaystackPlan[]>);\n requireEmailVerification?: boolean | undefined;\n authorizeReference?: ((data: {\n user: User;\n session: AuthSession;\n referenceId: string;\n action: \"initialize-transaction\" | \"verify-transaction\" | \"list-subscriptions\" | \"disable-subscription\" | \"enable-subscription\";\n }, ctx: GenericEndpointContext) => Promise<boolean>) | undefined;\n onSubscriptionComplete?: ((data: {\n event: any;\n subscription: Subscription;\n plan: PaystackPlan;\n }, ctx: GenericEndpointContext) => Promise<void>) | undefined;\n onSubscriptionUpdate?: ((data: {\n event: any;\n subscription: Subscription;\n }, ctx: GenericEndpointContext) => Promise<void>) | undefined;\n onSubscriptionDelete?: ((data: {\n event: any;\n subscription: Subscription;\n }, ctx: GenericEndpointContext) => Promise<void>) | undefined;\n};\nexport interface PaystackOptions<TPaystackClient extends PaystackClientLike = PaystackNodeClient> {\n /** Paystack SDK instance (recommended: `@alexasomba/paystack-node` via `createPaystack({ secretKey })`). */\n paystackClient: NoInfer<TPaystackClient>;\n /** Paystack webhook secret used to verify `x-paystack-signature`. */\n paystackWebhookSecret: string;\n /** Enable customer creation on Better Auth sign up. */\n createCustomerOnSignUp?: boolean | undefined;\n onCustomerCreate?: ((data: {\n paystackCustomer: any;\n user: User & {\n paystackCustomerCode: string;\n };\n }, ctx: GenericEndpointContext) => Promise<void>) | undefined;\n getCustomerCreateParams?: ((user: User, ctx: GenericEndpointContext) => Promise<Record<string, any>>) | undefined;\n subscription?: ({\n enabled: false;\n } | ({\n enabled: true;\n } & SubscriptionOptions)) | undefined;\n onEvent?: ((event: any) => Promise<void>) | undefined;\n schema?: InferOptionSchema<typeof subscriptions & typeof user> | undefined;\n}\nexport interface InputSubscription extends Omit<Subscription, \"id\"> {\n}\nexport {};\n//# sourceMappingURL=types.d.ts.map"],"mappings":"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"}
|