@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 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
- paystackWebhookSecret: process.env.PAYSTACK_WEBHOOK_SECRET!,
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 `GET {AUTH_BASE}/paystack/transaction/verify?reference=...`
179
+ 3. On your callback route/page, call `POST {AUTH_BASE}/paystack/transaction/verify` (this updates local subscription state)
128
180
 
129
- Example (framework-agnostic):
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 initRes = await fetch("/api/auth/paystack/transaction/initialize", {
134
- method: "POST",
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 fetch(
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
- - `user.paystackCustomerCode?: string`
187
- - `subscription` table with fields like: `plan`, `referenceId`, `paystackCustomerCode`, `paystackSubscriptionCode`, `paystackTransactionReference`, `status`, and optional period/trial fields.
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-CZ3Le7Er.mjs";
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-client";
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": "GET";
21
+ "/paystack/transaction/verify": "POST";
23
22
  "/paystack/subscription/list-local": "GET";
24
23
  "/paystack/subscription/disable": "POST";
25
24
  "/paystack/subscription/enable": "POST";
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.mts","names":[],"sources":["../src/client.ts"],"sourcesContent":[],"mappings":";;;cAIa;EAAA,YAAA,EAAA,OAoCZ;CA/Bc,CAAA,CAAA,QAAA,CAAA,EAAA,CAAA,GAAA,SAAA,EAAA,GAAA;EAMC,EAAA,EAAA,iBAAA;EACA,kBAAA,EAHkB,UAGlB,CAAA,OAFG,QAEH,CADA,kBACA,EAAA,CAAA,CAAA,cAAA,CAAA,SAAA,IAAA,GAAA;IAEoB,cAAA,EAAA,kBAAA;IAQA,qBAAA,EAAA,MAAA;IAZjB,YAAA,EAAA;MADe,OAAA,EAAA,IAAA;MAAU,KAAA,EAAA,EAAA;;;oBAaR"}
1
+ {"version":3,"file":"client.d.mts","names":[],"sources":["../src/client.ts"],"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-client",
4
+ id: "paystack",
5
5
  $InferServerPlugin: {},
6
6
  pathMethods: {
7
- "/paystack/webhook": "POST",
8
7
  "/paystack/transaction/initialize": "POST",
9
- "/paystack/transaction/verify": "GET",
8
+ "/paystack/transaction/verify": "POST",
10
9
  "/paystack/subscription/list-local": "GET",
11
10
  "/paystack/subscription/disable": "POST",
12
11
  "/paystack/subscription/enable": "POST"
@@ -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-client\",\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/webhook\": \"POST\",\n \"/paystack/transaction/initialize\": \"POST\",\n \"/paystack/transaction/verify\": \"GET\",\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,qBAAqB;GACrB,oCAAoC;GACpC,gCAAgC;GAChC,qCAAqC;GACrC,kCAAkC;GAClC,iCAAiC;GACpC;EACJ"}
1
+ {"version":3,"file":"client.mjs","names":[],"sources":["../src/client.ts"],"sourcesContent":["import type { BetterAuthClientPlugin } from \"better-auth\";\nimport type { paystack } from \"./index\";\nimport type { PaystackNodeClient } 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
- paystackWebhook: better_auth0.StrictEndpoint<"/paystack/webhook", {
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: better_auth0.GenericEndpointContext<better_auth0.BetterAuthOptions> | null): Promise<void>;
459
+ } & Record<string, unknown>, hookCtx?: GenericEndpointContext | null): Promise<void>;
253
460
  };
254
461
  };
255
462
  };
256
463
  };
257
464
  };
258
- schema: better_auth0.BetterAuthPluginDBSchema;
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-CZ3Le7Er.d.mts.map
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-CZ3Le7Er.mjs";
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-call_3563929c6579aa89e38f28ea99bd09aa/node_modules/@better-auth/core/dist/env-DbssmzoK.mjs
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-call_3563929c6579aa89e38f28ea99bd09aa/node_modules/@better-auth/core/dist/utils-NloIXYE0.mjs
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-call_3563929c6579aa89e38f28ea99bd09aa/node_modules/@better-auth/core/dist/async_hooks/index.mjs
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-call_3563929c6579aa89e38f28ea99bd09aa/node_modules/@better-auth/core/dist/context-DblZrIwO.mjs
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-call_3563929c6579aa89e38f28ea99bd09aa/node_modules/@better-auth/core/dist/api/index.mjs
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: PAYSTACK_ERROR_CODES.EMAIL_VERIFICATION_REQUIRED,
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: PAYSTACK_ERROR_CODES.SUBSCRIPTION_PLAN_NOT_FOUND,
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: PAYSTACK_ERROR_CODES.FAILED_TO_INITIALIZE_TRANSACTION,
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 verifyQuerySchema = z.object({ reference: z.string() });
608
+ const verifyBodySchema = z.object({ reference: z.string() });
592
609
  const subscriptionOptions = options.subscription;
593
610
  return createAuthEndpoint("/paystack/transaction/verify", {
594
- method: "GET",
595
- query: verifyQuerySchema,
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.query.reference));
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: PAYSTACK_ERROR_CODES.FAILED_TO_VERIFY_TRANSACTION,
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.query.reference;
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: PAYSTACK_ERROR_CODES.FAILED_TO_DISABLE_SUBSCRIPTION,
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: PAYSTACK_ERROR_CODES.FAILED_TO_ENABLE_SUBSCRIPTION,
783
+ code: "FAILED_TO_ENABLE_SUBSCRIPTION",
762
784
  message: error?.message || PAYSTACK_ERROR_CODES.FAILED_TO_ENABLE_SUBSCRIPTION
763
785
  });
764
786
  }
@@ -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.4",
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.0.0"
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.0"
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
- "publint": "^0.3.16",
53
+ "@vitest/coverage-v8": "^4.0.16",
49
54
  "better-auth": "^1.4.7",
50
- "tsdown": "^0.18.0",
55
+ "publint": "^0.3.16",
56
+ "tsdown": "^0.18.1",
51
57
  "typescript": "^5.9.3",
52
- "vitest": "^4.0.15"
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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"}