@alexasomba/better-auth-paystack 0.2.1 → 0.2.2

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/dist/client.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { n as paystack } from "./index-Bz5N0iP1.mjs";
1
+ import { n as paystack } from "./index--gwUMv-4.mjs";
2
2
 
3
3
  //#region src/client.d.ts
4
4
  declare const paystackClient: <O extends {
@@ -386,7 +386,7 @@ declare const paystack: <TPaystackClient extends PaystackClientLike = PaystackNo
386
386
  reference: any;
387
387
  data: any;
388
388
  }>;
389
- listSubscriptions: better_call0.StrictEndpoint<"/paystack/subscription/list-local", {
389
+ listLocalSubscriptions: better_call0.StrictEndpoint<"/paystack/subscription/list-local", {
390
390
  method: "GET";
391
391
  query: zod0.ZodObject<{
392
392
  referenceId: zod0.ZodOptional<zod0.ZodString>;
@@ -565,4 +565,4 @@ declare const paystack: <TPaystackClient extends PaystackClientLike = PaystackNo
565
565
  type PaystackPlugin<O extends PaystackOptions<any> = PaystackOptions> = ReturnType<typeof paystack<any, O>>;
566
566
  //#endregion
567
567
  export { PaystackProduct as a, PaystackPlan as i, paystack as n, Subscription as o, PaystackOptions as r, SubscriptionOptions as s, PaystackPlugin as t };
568
- //# sourceMappingURL=index-Bz5N0iP1.d.mts.map
568
+ //# sourceMappingURL=index--gwUMv-4.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-Bz5N0iP1.d.mts","names":["GenericEndpointContext","InferOptionSchema","Session","User","createPaystack","subscriptions","user","PaystackNodeClient","ReturnType","PaystackOpenApiFetchResponse","T","Response","data","error","response","PaystackApiResult","Promise","PaystackClientLike","customer_create","body","init","transaction_initialize","transaction_verify","params","path","reference","subscription_fetch","subscription_disable","code","token","subscription_enable","subscription_manage_link","customer","create","transaction","initialize","verify","subscription","fetch","idOrCode","disable","enable","manage","link","NoInfer","AuthSession","Record","session","PaystackPlan","name","planCode","amount","currency","interval","invoiceLimit","limits","freeTrial","days","PaystackProduct","metadata","PaystackTransaction","Date","id","paystackId","referenceId","userId","status","plan","createdAt","updatedAt","InputPaystackTransaction","Omit","Subscription","paystackCustomerCode","paystackSubscriptionCode","paystackTransactionReference","periodStart","periodEnd","trialStart","trialEnd","cancelAtPeriodEnd","groupId","seats","SubscriptionOptions","plans","requireEmailVerification","authorizeReference","action","ctx","onSubscriptionComplete","event","onSubscriptionUpdate","onSubscriptionDelete","ProductOptions","products","PaystackOptions","TPaystackClient","paystackClient","paystackWebhookSecret","createCustomerOnSignUp","onCustomerCreate","paystackCustomer","getCustomerCreateParams","enabled","onEvent","schema","InputSubscription"],"sources":["../src/schema.ts","../src/types.d.ts","../src/index.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index--gwUMv-4.d.mts","names":["GenericEndpointContext","InferOptionSchema","Session","User","createPaystack","subscriptions","user","PaystackNodeClient","ReturnType","PaystackOpenApiFetchResponse","T","Response","data","error","response","PaystackApiResult","Promise","PaystackClientLike","customer_create","body","init","transaction_initialize","transaction_verify","params","path","reference","subscription_fetch","subscription_disable","code","token","subscription_enable","subscription_manage_link","customer","create","transaction","initialize","verify","subscription","fetch","idOrCode","disable","enable","manage","link","NoInfer","AuthSession","Record","session","PaystackPlan","name","planCode","amount","currency","interval","invoiceLimit","limits","freeTrial","days","PaystackProduct","metadata","PaystackTransaction","Date","id","paystackId","referenceId","userId","status","plan","createdAt","updatedAt","InputPaystackTransaction","Omit","Subscription","paystackCustomerCode","paystackSubscriptionCode","paystackTransactionReference","periodStart","periodEnd","trialStart","trialEnd","cancelAtPeriodEnd","groupId","seats","SubscriptionOptions","plans","requireEmailVerification","authorizeReference","action","ctx","onSubscriptionComplete","event","onSubscriptionUpdate","onSubscriptionDelete","ProductOptions","products","PaystackOptions","TPaystackClient","paystackClient","paystackWebhookSecret","createCustomerOnSignUp","onCustomerCreate","paystackCustomer","getCustomerCreateParams","enabled","onEvent","schema","InputSubscription"],"sources":["../src/schema.ts","../src/types.d.ts","../src/index.ts"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { a as PaystackProduct, i as PaystackPlan, n as paystack, o as Subscription, r as PaystackOptions, s as SubscriptionOptions, t as PaystackPlugin } from "./index-Bz5N0iP1.mjs";
1
+ import { a as PaystackProduct, i as PaystackPlan, n as paystack, o as Subscription, r as PaystackOptions, s as SubscriptionOptions, t as PaystackPlugin } from "./index--gwUMv-4.mjs";
2
2
  export { PaystackOptions, PaystackPlan, PaystackPlugin, PaystackProduct, Subscription, SubscriptionOptions, paystack };
package/dist/index.mjs CHANGED
@@ -790,7 +790,7 @@ const paystack = (options) => {
790
790
  getConfig: getConfig(options),
791
791
  initializeTransaction: initializeTransaction(options),
792
792
  verifyTransaction: verifyTransaction(options),
793
- listSubscriptions: listSubscriptions(options),
793
+ listLocalSubscriptions: listSubscriptions(options),
794
794
  disablePaystackSubscription: disablePaystackSubscription(options),
795
795
  enablePaystackSubscription: enablePaystackSubscription(options),
796
796
  getSubscriptionManageLink: getSubscriptionManageLink(options)
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/utils.ts","../src/middleware.ts","../src/paystack-sdk.ts","../src/routes.ts","../src/schema.ts","../src/index.ts"],"sourcesContent":["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\nexport async function getProducts(productOptions: PaystackOptions[\"products\"]) {\n if (productOptions?.products) {\n return typeof productOptions.products === \"function\"\n ? await productOptions.products()\n : productOptions.products;\n }\n return [];\n}\n\nexport async function getProductByName(options: PaystackOptions<any>, name: string) {\n return await getProducts(options.products).then((products) =>\n products?.find((product) => product.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 | \"list-transactions\"\n | \"disable-subscription\"\n | \"enable-subscription\"\n | \"get-subscription-manage-link\",\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 { InputPaystackTransaction, InputSubscription, PaystackOptions, PaystackTransaction, Subscription } from \"./types\";\nimport { getPlanByName, getPlans, getProductByName, getProducts } 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 === \"charge.success\") {\n const reference = data?.reference;\n const paystackId = data?.id ? String(data.id) : undefined;\n if (reference) {\n await ctx.context.adapter.update({\n model: \"paystackTransaction\",\n update: {\n status: \"success\",\n paystackId,\n updatedAt: new Date(),\n },\n where: [{ field: \"reference\", value: reference }],\n });\n }\n }\n\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().optional(),\n product: z.string().optional(),\n amount: z.number().optional(), // Amount in smallest currency unit (e.g., kobo)\n currency: z.string().optional(),\n email: z.string().optional(),\n metadata: z.record(z.string(), z.any()).optional(),\n referenceId: z.string().optional(),\n callbackURL: z.string().optional(),\n});\n\nexport const initializeTransaction = (options: AnyPaystackOptions) => {\n const subscriptionOptions = options.subscription;\n // If subscriptions are enabled, use full middleware stack; otherwise just basics.\n // However, for one-time payments, we might not strictly need subscription middleware\n // checking for existing subs, but let's keep it consistent for now.\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 const { plan: planName, product: productName, amount: bodyAmount, currency, email, metadata: extraMetadata, callbackURL } = ctx.body;\n\n // 1. Validate Callback URL validation (same as before)\n if (callbackURL) {\n const checkTrusted = () => {\n try {\n if (!callbackURL) return false;\n if (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(callbackURL).origin === baseOrigin;\n } catch {\n return false;\n }\n };\n if (!checkTrusted()) {\n throw new APIError(\"FORBIDDEN\", {\n message: \"callbackURL is not a trusted origin.\",\n status: 403,\n });\n }\n }\n\n // 2. Get User & Session\n const session = await getSessionFromCtx(ctx);\n if (!session) throw new APIError(\"UNAUTHORIZED\");\n const user = session.user;\n \n // 3. Email Verification Check (only if subscription options enforce it)\n if (subscriptionOptions?.enabled && 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 // 4. Determine Payment Mode: Subscription (Plan) vs Product vs One-Time (Amount)\n let plan: ReturnType<typeof getPlanByName> extends Promise<infer U> ? U : never;\n let product: ReturnType<typeof getProductByName> extends Promise<infer U> ? U : never;\n \n if (planName) {\n if (!subscriptionOptions?.enabled) {\n throw new APIError(\"BAD_REQUEST\", { message: \"Subscriptions are not enabled.\" });\n }\n plan = await getPlanByName(options, planName);\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 } else if (productName) {\n product = await getProductByName(options, productName);\n if (!product) {\n throw new APIError(\"BAD_REQUEST\", {\n message: `Product '${productName}' not found.`,\n });\n }\n } else if (!bodyAmount) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Either 'plan', 'product', or 'amount' is required to initialize a transaction.\",\n });\n }\n\n const amount = bodyAmount || product?.amount;\n const finalCurrency = currency || product?.currency || plan?.currency || \"NGN\";\n\n // 5. Prepare Payload\n const referenceIdFromCtx = (ctx.context as any).referenceId as string | undefined;\n const referenceId = ctx.body.referenceId || referenceIdFromCtx || (session.user as any).id;\n\n let url: string | undefined;\n let reference: string | undefined;\n let accessCode: string | undefined;\n\n try {\n // Construct Metadata\n const metadata = JSON.stringify({\n referenceId,\n userId: user.id,\n plan: plan?.name.toLowerCase(), // Undefined for one-time\n product: product?.name.toLowerCase(),\n ...extraMetadata,\n });\n\n const initBody: any = {\n email: email || user.email,\n callback_url: callbackURL,\n metadata,\n // If plan/product exists, use its currency; otherwise fallback to provided or default\n currency: finalCurrency, \n };\n\n if (plan) {\n // Subscription Flow\n initBody.plan = plan.planCode;\n initBody.invoice_limit = plan.invoiceLimit;\n // If plan has no code but has amount (e.g. local plans?), Paystack usually needs amount\n if (!plan.planCode && plan.amount) {\n initBody.amount = String(plan.amount);\n }\n } else {\n // One-Time Payment Flow\n if (!amount) throw new Error(\"Amount is required for one-time payments\");\n initBody.amount = String(amount);\n }\n\n const initRaw = await paystack.transactionInitialize(initBody);\n const initRes = unwrapSdkResult<any>(initRaw);\n let data =\n initRes && typeof initRes === \"object\" && \"status\" in initRes && \"data\" in initRes\n ? (initRes as any).data\n : initRes?.data ?? initRes;\n \n if (data && typeof data === \"object\" && \"status\" in data && \"data\" in data) {\n data = data.data;\n }\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: error?.message || PAYSTACK_ERROR_CODES.FAILED_TO_INITIALIZE_TRANSACTION,\n });\n }\n\n // 6. Record Transaction & Subscription\n const paystackCustomerCode = (user as any).paystackCustomerCode;\n \n await ctx.context.adapter.create<InputPaystackTransaction, PaystackTransaction>({\n model: \"paystackTransaction\",\n data: {\n reference: reference!,\n referenceId,\n userId: user.id,\n amount: plan?.amount || amount!,\n currency: plan?.currency || currency || \"NGN\",\n status: \"pending\",\n plan: plan?.name.toLowerCase(),\n metadata: extraMetadata ? JSON.stringify(extraMetadata) : undefined,\n createdAt: new Date(),\n updatedAt: new Date(),\n },\n });\n\n if (plan) {\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\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 let data =\n verifyRes && typeof verifyRes === \"object\" && \"status\" in verifyRes && \"data\" in verifyRes\n ? (verifyRes as any).data\n : verifyRes?.data ?? verifyRes;\n \n if (data && typeof data === \"object\" && \"status\" in data && \"data\" in data) {\n data = data.data;\n }\n const status = data?.status;\n const reference = data?.reference ?? ctx.body.reference;\n const paystackId = data?.id ? String(data.id) : undefined;\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: \"paystackTransaction\",\n update: {\n status: \"success\",\n paystackId,\n updatedAt: new Date(),\n },\n where: [{ field: \"reference\", value: reference }],\n });\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 transaction/subscription after verification\",\n e,\n );\n }\n } else if (status === \"failed\" || status === \"abandoned\") {\n try {\n await ctx.context.adapter.update({\n model: \"paystackTransaction\",\n update: {\n status,\n updatedAt: new Date(),\n },\n where: [{ field: \"reference\", value: reference }],\n });\n } catch (e: any) {\n ctx.context.logger.error(\"Failed to update transaction status\", e);\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\nexport const listTransactions = (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-transactions\")]\n : [sessionMiddleware, originCheck];\n\n return createAuthEndpoint(\n \"/paystack/transaction/list\",\n {\n method: \"GET\",\n query: listQuerySchema,\n use: useMiddlewares,\n },\n async (ctx) => {\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<PaystackTransaction>({\n model: \"paystackTransaction\",\n where: [{ field: \"referenceId\", value: referenceId }],\n });\n // Sort by createdAt desc locally if adapter doesn't support it well, \n // but Better Auth adapters usually return in insertion order.\n // Let's sort to be sure.\n const sorted = res.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n return ctx.json({ transactions: sorted });\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\n\nconst subscriptionCodeSchema = z.object({\n subscriptionCode: z.string(),\n});\n\nexport const getSubscriptionManageLink = (options: AnyPaystackOptions) => {\n const subscriptionOptions = options.subscription;\n const useMiddlewares = subscriptionOptions?.enabled\n ? [sessionMiddleware, originCheck, referenceMiddleware(subscriptionOptions, \"get-subscription-manage-link\")]\n : [sessionMiddleware, originCheck];\n\n return createAuthEndpoint(\n \"/paystack/subscription/manage-link\",\n { \n method: \"GET\", \n query: subscriptionCodeSchema, \n use: useMiddlewares \n },\n async (ctx) => {\n const { subscriptionCode } = ctx.query;\n const paystack = getPaystackOps(options.paystackClient);\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 \n return ctx.json({ link: data?.link });\n } catch (error: any) {\n ctx.context.logger.error(\"Failed to get Paystack subscription manage link\", error);\n throw new APIError(\"BAD_REQUEST\", {\n message: error?.message || \"Failed to fetch subscription management link\",\n });\n }\n },\n );\n};\n\nexport const getConfig = (options: AnyPaystackOptions) => {\n return createAuthEndpoint(\n \"/paystack/get-config\",\n {\n method: \"GET\",\n metadata: {\n openapi: {\n operationId: \"getPaystackConfig\",\n },\n },\n },\n async (ctx) => {\n const [plans, products] = await Promise.all([\n options.subscription?.enabled ? getPlans(options.subscription) : Promise.resolve([]),\n getProducts(options.products),\n ]);\n return ctx.json({ plans, products });\n },\n );\n};\n\nexport { PAYSTACK_ERROR_CODES };\n\n","import type { BetterAuthPluginDBSchema } from \"@better-auth/core/db\";\nimport { mergeSchema } from \"better-auth/db\";\nimport type { PaystackOptions } from \"./types\";\n\nexport const transactions = {\n paystackTransaction: {\n fields: {\n reference: {\n type: \"string\",\n required: true,\n },\n paystackId: {\n type: \"string\",\n required: false,\n },\n referenceId: {\n type: \"string\",\n required: true,\n },\n userId: {\n type: \"string\",\n required: true,\n },\n amount: {\n type: \"number\",\n required: true,\n },\n currency: {\n type: \"string\",\n required: true,\n },\n status: {\n type: \"string\",\n required: true,\n },\n plan: {\n type: \"string\",\n required: false,\n },\n metadata: {\n type: \"string\",\n required: false,\n },\n createdAt: {\n type: \"date\",\n required: true,\n },\n updatedAt: {\n type: \"date\",\n required: true,\n },\n },\n },\n} satisfies BetterAuthPluginDBSchema;\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 ...transactions,\n ...user,\n };\n } else {\n baseSchema = {\n ...user,\n ...transactions,\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 listTransactions,\n paystackWebhook,\n verifyTransaction,\n getConfig,\n getSubscriptionManageLink,\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 PaystackProduct,\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 type GenericEndpoints = NonNullable<BetterAuthPlugin[\"endpoints\"]>;\n const endpoints = {\n paystackWebhook: paystackWebhook(options),\n listTransactions: listTransactions(options),\n getConfig: getConfig(options),\n initializeTransaction: initializeTransaction(options),\n verifyTransaction: verifyTransaction(options),\n listSubscriptions: listSubscriptions(options),\n disablePaystackSubscription: disablePaystackSubscription(options),\n enablePaystackSubscription: enablePaystackSubscription(options),\n getSubscriptionManageLink: getSubscriptionManageLink(options),\n } satisfies GenericEndpoints;\n\n type EndpointsForOptions = typeof endpoints;\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\nexport type PaystackPlugin<O extends PaystackOptions<any> = PaystackOptions> = ReturnType<\n typeof paystack<any, O>\n>;\n\nexport type { Subscription, SubscriptionOptions, PaystackPlan, PaystackOptions, PaystackProduct };\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/utils.ts","../src/middleware.ts","../src/paystack-sdk.ts","../src/routes.ts","../src/schema.ts","../src/index.ts"],"sourcesContent":["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\nexport async function getProducts(productOptions: PaystackOptions[\"products\"]) {\n if (productOptions?.products) {\n return typeof productOptions.products === \"function\"\n ? await productOptions.products()\n : productOptions.products;\n }\n return [];\n}\n\nexport async function getProductByName(options: PaystackOptions<any>, name: string) {\n return await getProducts(options.products).then((products) =>\n products?.find((product) => product.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 | \"list-transactions\"\n | \"disable-subscription\"\n | \"enable-subscription\"\n | \"get-subscription-manage-link\",\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 { InputPaystackTransaction, InputSubscription, PaystackOptions, PaystackTransaction, Subscription } from \"./types\";\nimport { getPlanByName, getPlans, getProductByName, getProducts } 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 === \"charge.success\") {\n const reference = data?.reference;\n const paystackId = data?.id ? String(data.id) : undefined;\n if (reference) {\n await ctx.context.adapter.update({\n model: \"paystackTransaction\",\n update: {\n status: \"success\",\n paystackId,\n updatedAt: new Date(),\n },\n where: [{ field: \"reference\", value: reference }],\n });\n }\n }\n\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().optional(),\n product: z.string().optional(),\n amount: z.number().optional(), // Amount in smallest currency unit (e.g., kobo)\n currency: z.string().optional(),\n email: z.string().optional(),\n metadata: z.record(z.string(), z.any()).optional(),\n referenceId: z.string().optional(),\n callbackURL: z.string().optional(),\n});\n\nexport const initializeTransaction = (options: AnyPaystackOptions) => {\n const subscriptionOptions = options.subscription;\n // If subscriptions are enabled, use full middleware stack; otherwise just basics.\n // However, for one-time payments, we might not strictly need subscription middleware\n // checking for existing subs, but let's keep it consistent for now.\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 const { plan: planName, product: productName, amount: bodyAmount, currency, email, metadata: extraMetadata, callbackURL } = ctx.body;\n\n // 1. Validate Callback URL validation (same as before)\n if (callbackURL) {\n const checkTrusted = () => {\n try {\n if (!callbackURL) return false;\n if (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(callbackURL).origin === baseOrigin;\n } catch {\n return false;\n }\n };\n if (!checkTrusted()) {\n throw new APIError(\"FORBIDDEN\", {\n message: \"callbackURL is not a trusted origin.\",\n status: 403,\n });\n }\n }\n\n // 2. Get User & Session\n const session = await getSessionFromCtx(ctx);\n if (!session) throw new APIError(\"UNAUTHORIZED\");\n const user = session.user;\n \n // 3. Email Verification Check (only if subscription options enforce it)\n if (subscriptionOptions?.enabled && 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 // 4. Determine Payment Mode: Subscription (Plan) vs Product vs One-Time (Amount)\n let plan: ReturnType<typeof getPlanByName> extends Promise<infer U> ? U : never;\n let product: ReturnType<typeof getProductByName> extends Promise<infer U> ? U : never;\n \n if (planName) {\n if (!subscriptionOptions?.enabled) {\n throw new APIError(\"BAD_REQUEST\", { message: \"Subscriptions are not enabled.\" });\n }\n plan = await getPlanByName(options, planName);\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 } else if (productName) {\n product = await getProductByName(options, productName);\n if (!product) {\n throw new APIError(\"BAD_REQUEST\", {\n message: `Product '${productName}' not found.`,\n });\n }\n } else if (!bodyAmount) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Either 'plan', 'product', or 'amount' is required to initialize a transaction.\",\n });\n }\n\n const amount = bodyAmount || product?.amount;\n const finalCurrency = currency || product?.currency || plan?.currency || \"NGN\";\n\n // 5. Prepare Payload\n const referenceIdFromCtx = (ctx.context as any).referenceId as string | undefined;\n const referenceId = ctx.body.referenceId || referenceIdFromCtx || (session.user as any).id;\n\n let url: string | undefined;\n let reference: string | undefined;\n let accessCode: string | undefined;\n\n try {\n // Construct Metadata\n const metadata = JSON.stringify({\n referenceId,\n userId: user.id,\n plan: plan?.name.toLowerCase(), // Undefined for one-time\n product: product?.name.toLowerCase(),\n ...extraMetadata,\n });\n\n const initBody: any = {\n email: email || user.email,\n callback_url: callbackURL,\n metadata,\n // If plan/product exists, use its currency; otherwise fallback to provided or default\n currency: finalCurrency, \n };\n\n if (plan) {\n // Subscription Flow\n initBody.plan = plan.planCode;\n initBody.invoice_limit = plan.invoiceLimit;\n // If plan has no code but has amount (e.g. local plans?), Paystack usually needs amount\n if (!plan.planCode && plan.amount) {\n initBody.amount = String(plan.amount);\n }\n } else {\n // One-Time Payment Flow\n if (!amount) throw new Error(\"Amount is required for one-time payments\");\n initBody.amount = String(amount);\n }\n\n const initRaw = await paystack.transactionInitialize(initBody);\n const initRes = unwrapSdkResult<any>(initRaw);\n let data =\n initRes && typeof initRes === \"object\" && \"status\" in initRes && \"data\" in initRes\n ? (initRes as any).data\n : initRes?.data ?? initRes;\n \n if (data && typeof data === \"object\" && \"status\" in data && \"data\" in data) {\n data = data.data;\n }\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: error?.message || PAYSTACK_ERROR_CODES.FAILED_TO_INITIALIZE_TRANSACTION,\n });\n }\n\n // 6. Record Transaction & Subscription\n const paystackCustomerCode = (user as any).paystackCustomerCode;\n \n await ctx.context.adapter.create<InputPaystackTransaction, PaystackTransaction>({\n model: \"paystackTransaction\",\n data: {\n reference: reference!,\n referenceId,\n userId: user.id,\n amount: plan?.amount || amount!,\n currency: plan?.currency || currency || \"NGN\",\n status: \"pending\",\n plan: plan?.name.toLowerCase(),\n metadata: extraMetadata ? JSON.stringify(extraMetadata) : undefined,\n createdAt: new Date(),\n updatedAt: new Date(),\n },\n });\n\n if (plan) {\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\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 let data =\n verifyRes && typeof verifyRes === \"object\" && \"status\" in verifyRes && \"data\" in verifyRes\n ? (verifyRes as any).data\n : verifyRes?.data ?? verifyRes;\n \n if (data && typeof data === \"object\" && \"status\" in data && \"data\" in data) {\n data = data.data;\n }\n const status = data?.status;\n const reference = data?.reference ?? ctx.body.reference;\n const paystackId = data?.id ? String(data.id) : undefined;\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: \"paystackTransaction\",\n update: {\n status: \"success\",\n paystackId,\n updatedAt: new Date(),\n },\n where: [{ field: \"reference\", value: reference }],\n });\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 transaction/subscription after verification\",\n e,\n );\n }\n } else if (status === \"failed\" || status === \"abandoned\") {\n try {\n await ctx.context.adapter.update({\n model: \"paystackTransaction\",\n update: {\n status,\n updatedAt: new Date(),\n },\n where: [{ field: \"reference\", value: reference }],\n });\n } catch (e: any) {\n ctx.context.logger.error(\"Failed to update transaction status\", e);\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\nexport const listTransactions = (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-transactions\")]\n : [sessionMiddleware, originCheck];\n\n return createAuthEndpoint(\n \"/paystack/transaction/list\",\n {\n method: \"GET\",\n query: listQuerySchema,\n use: useMiddlewares,\n },\n async (ctx) => {\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<PaystackTransaction>({\n model: \"paystackTransaction\",\n where: [{ field: \"referenceId\", value: referenceId }],\n });\n // Sort by createdAt desc locally if adapter doesn't support it well, \n // but Better Auth adapters usually return in insertion order.\n // Let's sort to be sure.\n const sorted = res.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n return ctx.json({ transactions: sorted });\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\n\nconst subscriptionCodeSchema = z.object({\n subscriptionCode: z.string(),\n});\n\nexport const getSubscriptionManageLink = (options: AnyPaystackOptions) => {\n const subscriptionOptions = options.subscription;\n const useMiddlewares = subscriptionOptions?.enabled\n ? [sessionMiddleware, originCheck, referenceMiddleware(subscriptionOptions, \"get-subscription-manage-link\")]\n : [sessionMiddleware, originCheck];\n\n return createAuthEndpoint(\n \"/paystack/subscription/manage-link\",\n { \n method: \"GET\", \n query: subscriptionCodeSchema, \n use: useMiddlewares \n },\n async (ctx) => {\n const { subscriptionCode } = ctx.query;\n const paystack = getPaystackOps(options.paystackClient);\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 \n return ctx.json({ link: data?.link });\n } catch (error: any) {\n ctx.context.logger.error(\"Failed to get Paystack subscription manage link\", error);\n throw new APIError(\"BAD_REQUEST\", {\n message: error?.message || \"Failed to fetch subscription management link\",\n });\n }\n },\n );\n};\n\nexport const getConfig = (options: AnyPaystackOptions) => {\n return createAuthEndpoint(\n \"/paystack/get-config\",\n {\n method: \"GET\",\n metadata: {\n openapi: {\n operationId: \"getPaystackConfig\",\n },\n },\n },\n async (ctx) => {\n const [plans, products] = await Promise.all([\n options.subscription?.enabled ? getPlans(options.subscription) : Promise.resolve([]),\n getProducts(options.products),\n ]);\n return ctx.json({ plans, products });\n },\n );\n};\n\nexport { PAYSTACK_ERROR_CODES };\n\n","import type { BetterAuthPluginDBSchema } from \"@better-auth/core/db\";\nimport { mergeSchema } from \"better-auth/db\";\nimport type { PaystackOptions } from \"./types\";\n\nexport const transactions = {\n paystackTransaction: {\n fields: {\n reference: {\n type: \"string\",\n required: true,\n },\n paystackId: {\n type: \"string\",\n required: false,\n },\n referenceId: {\n type: \"string\",\n required: true,\n },\n userId: {\n type: \"string\",\n required: true,\n },\n amount: {\n type: \"number\",\n required: true,\n },\n currency: {\n type: \"string\",\n required: true,\n },\n status: {\n type: \"string\",\n required: true,\n },\n plan: {\n type: \"string\",\n required: false,\n },\n metadata: {\n type: \"string\",\n required: false,\n },\n createdAt: {\n type: \"date\",\n required: true,\n },\n updatedAt: {\n type: \"date\",\n required: true,\n },\n },\n },\n} satisfies BetterAuthPluginDBSchema;\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 ...transactions,\n ...user,\n };\n } else {\n baseSchema = {\n ...user,\n ...transactions,\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 listTransactions,\n paystackWebhook,\n verifyTransaction,\n getConfig,\n getSubscriptionManageLink,\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 PaystackProduct,\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 type GenericEndpoints = NonNullable<BetterAuthPlugin[\"endpoints\"]>;\n const endpoints = {\n paystackWebhook: paystackWebhook(options),\n listTransactions: listTransactions(options),\n getConfig: getConfig(options),\n initializeTransaction: initializeTransaction(options),\n verifyTransaction: verifyTransaction(options),\n listLocalSubscriptions: listSubscriptions(options),\n disablePaystackSubscription: disablePaystackSubscription(options),\n enablePaystackSubscription: enablePaystackSubscription(options),\n getSubscriptionManageLink: getSubscriptionManageLink(options),\n } satisfies GenericEndpoints;\n\n type EndpointsForOptions = typeof endpoints;\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\nexport type PaystackPlugin<O extends PaystackOptions<any> = PaystackOptions> = ReturnType<\n typeof paystack<any, O>\n>;\n\nexport type { Subscription, SubscriptionOptions, PaystackPlan, PaystackOptions, PaystackProduct };\n"],"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.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "Community Better Auth plugin for Paystack (by alexasomba)",
5
5
  "license": "MIT",
6
6
  "author": "alexasomba",
@@ -21,10 +21,12 @@
21
21
  "exports": {
22
22
  ".": {
23
23
  "types": "./dist/index.d.mts",
24
+ "import": "./dist/index.mjs",
24
25
  "default": "./dist/index.mjs"
25
26
  },
26
27
  "./client": {
27
28
  "types": "./dist/client.d.mts",
29
+ "import": "./dist/client.mjs",
28
30
  "default": "./dist/client.mjs"
29
31
  }
30
32
  },
@@ -51,11 +53,19 @@
51
53
  "@types/node": "^22.19.7",
52
54
  "@vitest/coverage-v8": "^4.0.18",
53
55
  "better-auth": "^1.4.18",
56
+ "husky": "^9.1.7",
57
+ "lint-staged": "^16.2.7",
54
58
  "publint": "^0.3.17",
55
59
  "tsdown": "^0.20.1",
56
60
  "typescript": "^5.9.3",
57
61
  "vitest": "^4.0.18"
58
62
  },
63
+ "lint-staged": {
64
+ "*.{ts,tsx}": [
65
+ "bash -c 'pnpm tsc --noEmit'",
66
+ "vitest related --run"
67
+ ]
68
+ },
59
69
  "scripts": {
60
70
  "build": "tsdown",
61
71
  "bd": "node ./scripts/bd.mjs",