@dodopayments/better-auth 1.6.1 → 1.6.3

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.
Files changed (56) hide show
  1. package/README.md +2 -2
  2. package/dist/{chunk-65YIVTFE.js → chunk-6VDYFSNJ.js} +6 -6
  3. package/dist/chunk-6VDYFSNJ.js.map +1 -0
  4. package/dist/{chunk-TOPOAYYO.js → chunk-EGRIWRWP.js} +6 -3
  5. package/dist/chunk-EGRIWRWP.js.map +1 -0
  6. package/dist/{chunk-HHIXOUFD.js → chunk-XXIDSJPK.js} +4 -4
  7. package/dist/chunk-XXIDSJPK.js.map +1 -0
  8. package/dist/{chunk-DTOB4IQZ.js → chunk-YCUWFLKK.js} +15 -12
  9. package/dist/chunk-YCUWFLKK.js.map +1 -0
  10. package/dist/{chunk-ARA27DRZ.js → chunk-ZA3TNX5K.js} +11 -9
  11. package/dist/chunk-ZA3TNX5K.js.map +1 -0
  12. package/dist/client.d.cts +1 -2
  13. package/dist/client.d.ts +1 -2
  14. package/dist/hooks/customer.d.cts +1 -2
  15. package/dist/hooks/customer.d.ts +1 -2
  16. package/dist/index.cjs +36 -28
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.cts +40 -6
  19. package/dist/index.d.ts +40 -6
  20. package/dist/index.js +11 -11
  21. package/dist/index.js.map +1 -1
  22. package/dist/plugins/checkout.cjs +5 -5
  23. package/dist/plugins/checkout.cjs.map +1 -1
  24. package/dist/plugins/checkout.d.cts +2 -3
  25. package/dist/plugins/checkout.d.ts +2 -3
  26. package/dist/plugins/checkout.js +1 -1
  27. package/dist/plugins/portal.cjs +18 -12
  28. package/dist/plugins/portal.cjs.map +1 -1
  29. package/dist/plugins/portal.d.cts +2 -3
  30. package/dist/plugins/portal.d.ts +2 -3
  31. package/dist/plugins/portal.js +2 -2
  32. package/dist/plugins/usage.cjs +14 -9
  33. package/dist/plugins/usage.cjs.map +1 -1
  34. package/dist/plugins/usage.d.cts +6 -107
  35. package/dist/plugins/usage.d.ts +6 -107
  36. package/dist/plugins/usage.js +2 -2
  37. package/dist/plugins/webhooks.cjs +3 -3
  38. package/dist/plugins/webhooks.cjs.map +1 -1
  39. package/dist/plugins/webhooks.d.cts +2 -3
  40. package/dist/plugins/webhooks.d.ts +2 -3
  41. package/dist/plugins/webhooks.js +1 -1
  42. package/dist/{types-3pb2RGTM.d.cts → types-nGEm2vCL.d.cts} +148 -12
  43. package/dist/{types-DygjjcRn.d.ts → types-nGEm2vCL.d.ts} +148 -12
  44. package/dist/types.d.cts +1 -2
  45. package/dist/types.d.ts +1 -2
  46. package/dist/utils.cjs +5 -2
  47. package/dist/utils.cjs.map +1 -1
  48. package/dist/utils.d.cts +8 -1
  49. package/dist/utils.d.ts +8 -1
  50. package/dist/utils.js +1 -1
  51. package/package.json +6 -1
  52. package/dist/chunk-65YIVTFE.js.map +0 -1
  53. package/dist/chunk-ARA27DRZ.js.map +0 -1
  54. package/dist/chunk-DTOB4IQZ.js.map +0 -1
  55. package/dist/chunk-HHIXOUFD.js.map +0 -1
  56. package/dist/chunk-TOPOAYYO.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/hooks/customer.ts","../src/client.ts","../src/plugins/portal.ts","../src/utils.ts","../src/plugins/checkout.ts","../src/plugins/webhooks.ts","../src/plugins/usage.ts"],"sourcesContent":["import type { BetterAuthPlugin } from \"better-auth\";\nimport { onUserCreate, onUserUpdate } from \"./hooks/customer\";\nimport type { DodoPaymentsEndpoints, DodoPaymentsOptions } from \"./types\";\n\n// Re-export public types explicitly for wider TS compatibility\nexport type {\n Product,\n DodoPaymentsPlugin,\n DodoPaymentsPlugins,\n DodoPaymentsEndpoints,\n DodoPaymentsOptions,\n PaymentItems,\n SubscriptionItems,\n CustomerPortalResponse,\n CreateCheckoutResponse,\n WebhookResponse,\n} from \"./types\";\n\nexport { dodopaymentsClient } from \"./client\";\n\nexport { portal } from \"./plugins/portal\";\nexport { checkout, CheckoutOptions } from \"./plugins/checkout\";\nexport { webhooks } from \"./plugins/webhooks\";\nexport { usage } from \"./plugins/usage\";\n\nexport const dodopayments = (options: DodoPaymentsOptions) => {\n const plugins = options.use\n .map((use) => use(options.client))\n .reduce((acc, plugin) => {\n Object.assign(acc, plugin);\n return acc;\n }, {} as DodoPaymentsEndpoints);\n\n return {\n id: \"dodopayments\",\n schema: {\n user: {\n fields: {\n dodoCustomerId: {\n type: \"string\",\n required: false,\n input: false,\n },\n },\n },\n },\n endpoints: {\n ...plugins,\n },\n init() {\n return {\n options: {\n databaseHooks: {\n user: {\n create: {\n after: onUserCreate(options),\n },\n update: {\n after: onUserUpdate(options),\n },\n },\n },\n },\n };\n },\n } satisfies BetterAuthPlugin;\n};\n","import type { GenericEndpointContext, User } from \"better-auth\";\nimport { APIError } from \"better-auth/api\";\nimport type { DodoPaymentsOptions } from \"../types\";\n\nexport const onUserCreate =\n (options: DodoPaymentsOptions) =>\n async (user: User, ctx: GenericEndpointContext | null) => {\n if (ctx && options.createCustomerOnSignUp) {\n try {\n const customers = await options.client.customers.list({\n email: user.email,\n });\n const existingCustomer = customers.items[0];\n\n let customerId: string;\n\n const additionalParams = options.getCustomerParams\n ? await options.getCustomerParams(user)\n : undefined;\n\n if (existingCustomer) {\n await options.client.customers.update(existingCustomer.customer_id, {\n name: user.name,\n metadata: additionalParams?.metadata,\n phone_number: additionalParams?.phone_number,\n });\n customerId = existingCustomer.customer_id;\n } else {\n const newCustomer = await options.client.customers.create({\n email: user.email,\n name: user.name,\n metadata: additionalParams?.metadata,\n phone_number: additionalParams?.phone_number,\n }, { idempotencyKey: user.id });\n customerId = newCustomer.customer_id;\n }\n\n ctx.context.internalAdapter.updateUser(user.id, {\n dodoCustomerId: customerId,\n }).catch((e: unknown) => {\n ctx.context.logger.warn(\n `DodoPayments: failed to store dodoCustomerId for user ${user.id}. Error: ${e instanceof Error ? e.message : e}`,\n );\n });\n } catch (e: unknown) {\n if (e instanceof Error) {\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: `DodoPayments customer creation failed. Error: ${e.message}`,\n });\n }\n\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: `DodoPayments customer creation failed. Error: ${e}`,\n });\n }\n }\n };\n\nexport const onUserUpdate =\n (options: DodoPaymentsOptions) =>\n async (user: User, ctx: GenericEndpointContext | null) => {\n if (ctx && options.createCustomerOnSignUp) {\n try {\n let customerId = (user as User & { dodoCustomerId?: string }).dodoCustomerId;\n\n if (!customerId) {\n // Fallback to email lookup if dodoCustomerId is not stored yet\n const customers = await options.client.customers.list({\n email: user.email,\n });\n const existingCustomer = customers.items[0];\n\n if (!existingCustomer) return;\n\n customerId = existingCustomer.customer_id;\n\n // Backfill dodoCustomerId\n ctx.context.internalAdapter.updateUser(user.id, {\n dodoCustomerId: customerId,\n }).catch((e: unknown) => {\n ctx.context.logger.warn(\n `DodoPayments: failed to backfill dodoCustomerId for user ${user.id}. Error: ${e instanceof Error ? e.message : e}`,\n );\n });\n }\n\n const additionalParams = options.getCustomerParams\n ? await options.getCustomerParams(user)\n : undefined;\n\n await options.client.customers.update(customerId, {\n name: user.name,\n metadata: additionalParams?.metadata,\n phone_number: additionalParams?.phone_number,\n });\n } catch (e: unknown) {\n if (e instanceof Error) {\n ctx.context.logger.error(\n `DodoPayments customer update failed. Error: ${e.message}`,\n );\n } else {\n ctx.context.logger.error(\n `DodoPayments customer update failed. Error: ${e}`,\n );\n }\n }\n }\n };\n","import type { BetterAuthClientPlugin } from \"better-auth\";\nimport type { dodopayments } from \"./index\";\n\nexport const dodopaymentsClient = () => {\n return {\n id: \"dodopayments-client\",\n $InferServerPlugin: {} as ReturnType<typeof dodopayments>,\n } satisfies BetterAuthClientPlugin;\n};\n\nexport type {\n Product,\n DodoPaymentsEndpoints,\n DodoPaymentsOptions,\n PaymentItems,\n SubscriptionItems,\n CustomerPortalResponse,\n CreateCheckoutResponse,\n WebhookResponse,\n} from \"./types\";\n","import type { DodoPayments } from \"dodopayments\";\nimport { APIError, createAuthEndpoint, sessionMiddleware } from \"better-auth/api\";\nimport { z } from \"zod/v3\";\nimport {\n CustomerPortalResponse,\n PaymentItems,\n SubscriptionItems,\n} from \"../types\";\nimport { getOrCreateCustomerId } from \"../utils\";\n\nexport const portal = () => (dodopayments: DodoPayments) => {\n return {\n dodoPortal: createAuthEndpoint(\n \"/dodopayments/customer/portal\",\n {\n method: \"GET\",\n use: [sessionMiddleware],\n },\n async (ctx): Promise<CustomerPortalResponse> => {\n if (!ctx.context.session?.user.id) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"User not found\",\n });\n }\n\n if (!ctx.context.session?.user.emailVerified) {\n throw new APIError(\"UNAUTHORIZED\", {\n message: \"User email not verified\",\n });\n }\n\n try {\n const customerId = await getOrCreateCustomerId(\n dodopayments,\n ctx.context.session,\n ctx.context.internalAdapter,\n );\n\n const customerSession =\n await dodopayments.customers.customerPortal.create(customerId);\n\n return ctx.json({\n url: customerSession.link,\n redirect: true,\n });\n } catch (e: unknown) {\n if (e instanceof Error) {\n ctx.context.logger.error(\n `DodoPayments customer portal creation failed. Error: ${e.message}`,\n );\n }\n\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: \"Customer portal creation failed\",\n });\n }\n },\n ),\n dodoSubscriptions: createAuthEndpoint(\n \"/dodopayments/customer/subscriptions/list\",\n {\n method: \"GET\",\n query: z\n .object({\n page: z.coerce.number().optional(),\n limit: z.coerce.number().optional(),\n status: z\n .enum([\n \"active\",\n \"cancelled\",\n \"on_hold\",\n \"pending\",\n \"failed\",\n \"expired\",\n ])\n .optional(),\n })\n .optional(),\n use: [sessionMiddleware],\n },\n async (ctx): Promise<SubscriptionItems> => {\n if (!ctx.context.session.user.id) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"User not found\",\n });\n }\n\n if (!ctx.context.session?.user.emailVerified) {\n throw new APIError(\"UNAUTHORIZED\", {\n message: \"User email not verified\",\n });\n }\n\n try {\n const customerId = await getOrCreateCustomerId(\n dodopayments,\n ctx.context.session,\n ctx.context.internalAdapter,\n );\n\n const subscriptions = await dodopayments.subscriptions.list({\n customer_id: customerId,\n // page number is 0-indexed\n page_number: ctx.query?.page ? ctx.query.page - 1 : undefined,\n page_size: ctx.query?.limit,\n status: ctx.query?.status,\n });\n\n return ctx.json({ items: subscriptions.items });\n } catch (e: unknown) {\n if (e instanceof Error) {\n ctx.context.logger.error(\n `DodoPayments subscriptions list failed. Error: ${e.message}`,\n );\n }\n\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: \"DodoPayments subscriptions list failed\",\n });\n }\n },\n ),\n dodoPayments: createAuthEndpoint(\n \"/dodopayments/customer/payments/list\",\n {\n method: \"GET\",\n query: z\n .object({\n page: z.coerce.number().optional(),\n limit: z.coerce.number().optional(),\n status: z\n .enum([\n \"succeeded\",\n \"failed\",\n \"cancelled\",\n \"processing\",\n \"requires_customer_action\",\n \"requires_merchant_action\",\n \"requires_payment_method\",\n \"requires_confirmation\",\n \"requires_capture\",\n \"partially_captured\",\n \"partially_captured_and_capturable\",\n ])\n .optional(),\n })\n .optional(),\n use: [sessionMiddleware],\n },\n async (ctx): Promise<PaymentItems> => {\n if (!ctx.context.session.user.id) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"User not found\",\n });\n }\n\n if (!ctx.context.session?.user.emailVerified) {\n throw new APIError(\"UNAUTHORIZED\", {\n message: \"User email not verified\",\n });\n }\n\n try {\n const customerId = await getOrCreateCustomerId(\n dodopayments,\n ctx.context.session,\n ctx.context.internalAdapter,\n );\n\n const payments = await dodopayments.payments.list({\n customer_id: customerId,\n // page number is 0-indexed\n page_number: ctx.query?.page ? ctx.query.page - 1 : undefined,\n page_size: ctx.query?.limit,\n status: ctx.query?.status,\n });\n\n return ctx.json({ items: payments.items });\n } catch (e: unknown) {\n if (e instanceof Error) {\n ctx.context.logger.error(\n `DodoPayments orders list failed. Error: ${e.message}`,\n );\n }\n\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: \"Orders list failed\",\n });\n }\n },\n ),\n };\n};\n\n","import type { DodoPayments } from \"dodopayments\";\n\nexport async function getOrCreateCustomerId(\n dodopayments: DodoPayments,\n session: { user: { id: string; email: string; name: string } & Record<string, unknown> },\n internalAdapter: { updateUser: (id: string, data: Record<string, unknown>) => Promise<unknown> },\n): Promise<string> {\n const dodoCustomerId = session.user[\"dodoCustomerId\"] as string | undefined;\n if (dodoCustomerId) return dodoCustomerId;\n\n // Fallback to get customer from email if dodoCustomerId doesn't exist\n const customers = await dodopayments.customers.list({\n email: session.user.email,\n });\n let customer = customers.items[0];\n\n if (!customer) {\n customer = await dodopayments.customers.create({\n email: session.user.email,\n name: session.user.name,\n }, { idempotencyKey: session.user.id });\n }\n\n internalAdapter\n .updateUser(session.user.id, { dodoCustomerId: customer.customer_id })\n .catch(() => {});\n\n return customer.customer_id;\n}\n","import type DodoPayments from \"dodopayments\";\nimport { APIError, createAuthEndpoint, getSessionFromCtx } from \"better-auth/api\";\nimport { z } from \"zod/v3\";\nimport type { CreateCheckoutResponse, Product } from \"../types\";\nimport {\n buildCheckoutUrl,\n checkoutSessionPayloadSchema,\n dynamicCheckoutBodySchema,\n} from \"@dodopayments/core/checkout\";\n\nexport interface CheckoutOptions {\n /**\n * Optional list of slug -> productId mappings for easy slug checkouts\n */\n products?: Product[] | (() => Promise<Product[]>);\n /**\n * Checkout Success URL\n */\n successUrl?: string;\n /**\n * Only allow authenticated customers to checkout\n */\n authenticatedUsersOnly?: boolean;\n}\n\nexport const checkout =\n (checkoutOptions: CheckoutOptions = {}) =>\n (dodopayments: DodoPayments) => {\n return {\n /**\n * @deprecated\n */\n dodoCheckout: createAuthEndpoint(\n \"/dodopayments/checkout\",\n {\n method: \"POST\",\n body: dynamicCheckoutBodySchema.extend({\n slug: z.string().optional(),\n referenceId: z.string().optional(),\n }),\n requireRequest: true,\n },\n async (ctx): Promise<CreateCheckoutResponse> => {\n const session = await getSessionFromCtx(ctx);\n\n let dodoPaymentsProductId: string | undefined;\n\n if (ctx.body?.slug) {\n const resolvedProducts =\n typeof checkoutOptions.products === \"function\"\n ? await checkoutOptions.products()\n : checkoutOptions.products;\n\n const productId = resolvedProducts?.find(\n (product) => product.slug === ctx.body.slug,\n )?.productId;\n\n if (!productId) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Product not found\",\n });\n }\n\n dodoPaymentsProductId = productId;\n } else {\n dodoPaymentsProductId = ctx.body.product_id;\n }\n\n if (checkoutOptions.authenticatedUsersOnly && !session?.user.id) {\n throw new APIError(\"UNAUTHORIZED\", {\n message: \"You must be logged in to checkout\",\n });\n }\n\n try {\n const checkoutUrl = await buildCheckoutUrl({\n body: {\n ...ctx.body,\n product_id: dodoPaymentsProductId,\n customer: {\n email: session?.user.email,\n name: session?.user.name,\n ...ctx.body.customer,\n },\n product_cart: dodoPaymentsProductId\n ? [\n {\n product_id: dodoPaymentsProductId,\n quantity: 1,\n },\n ]\n : undefined,\n metadata: ctx.body.referenceId\n ? {\n referenceId: ctx.body.referenceId,\n ...ctx.body.metadata,\n }\n : ctx.body.metadata,\n },\n bearerToken: dodopayments.bearerToken,\n environment: dodopayments.baseURL.includes(\"test\")\n ? \"test_mode\"\n : \"live_mode\",\n returnUrl: checkoutOptions.successUrl\n ? new URL(\n checkoutOptions.successUrl,\n ctx.request?.url,\n ).toString()\n : undefined,\n type: \"dynamic\",\n });\n\n const redirectUrl = new URL(checkoutUrl);\n\n return ctx.json({\n url: redirectUrl.toString(),\n redirect: true,\n });\n } catch (e: unknown) {\n if (e instanceof Error) {\n ctx.context.logger.error(\n `DodoPayments checkout creation failed. Error: ${e.message}`,\n );\n }\n\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: \"Checkout creation failed\",\n });\n }\n },\n ),\n dodoCheckoutSession: createAuthEndpoint(\n \"/dodopayments/checkout-session\",\n {\n method: \"POST\",\n body: checkoutSessionPayloadSchema\n .extend({\n slug: z.string().optional(),\n referenceId: z.string().optional(),\n })\n .partial({\n product_cart: true,\n }),\n requireRequest: true,\n },\n async (ctx): Promise<CreateCheckoutResponse> => {\n const session = await getSessionFromCtx(ctx);\n\n let dodoPaymentsProductId: string | undefined;\n\n if (ctx.body?.slug) {\n const resolvedProducts =\n typeof checkoutOptions.products === \"function\"\n ? await checkoutOptions.products()\n : checkoutOptions.products;\n\n const productId = resolvedProducts?.find(\n (product) => product.slug === ctx.body.slug,\n )?.productId;\n\n if (!productId) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Product not found\",\n });\n }\n\n dodoPaymentsProductId = productId;\n }\n\n if (checkoutOptions.authenticatedUsersOnly && !session?.user.id) {\n throw new APIError(\"UNAUTHORIZED\", {\n message: \"You must be logged in to checkout\",\n });\n }\n\n // Ensure we have a product_cart\n const product_cart = dodoPaymentsProductId\n ? [{ product_id: dodoPaymentsProductId, quantity: 1 }]\n : ctx.body.product_cart;\n\n if (!product_cart || product_cart.length === 0) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Neither product_cart nor slug was provided\",\n });\n }\n\n try {\n const checkoutUrl = await buildCheckoutUrl({\n sessionPayload: {\n ...ctx.body,\n product_cart,\n customer: session?.user.email\n ? {\n email: session?.user.email,\n name: session?.user.name,\n }\n : ctx.body.customer,\n metadata: ctx.body.referenceId\n ? {\n referenceId: ctx.body.referenceId,\n ...ctx.body.metadata,\n }\n : ctx.body.metadata,\n return_url: checkoutOptions.successUrl\n ? new URL(\n checkoutOptions.successUrl,\n ctx.request?.url,\n ).toString()\n : undefined,\n },\n bearerToken: dodopayments.bearerToken,\n environment: dodopayments.baseURL.includes(\"test\")\n ? \"test_mode\"\n : \"live_mode\",\n type: \"session\",\n });\n\n const redirectUrl = new URL(checkoutUrl);\n\n return ctx.json({\n url: redirectUrl.toString(),\n redirect: true,\n });\n } catch (e: unknown) {\n if (e instanceof Error) {\n ctx.context.logger.error(\n `DodoPayments checkout creation failed. Error: ${e.message}`,\n );\n }\n\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: \"Checkout session creation failed\",\n });\n }\n },\n ),\n };\n };\n","import type { DodoPayments } from \"dodopayments\";\nimport {\n handleWebhookPayload,\n WebhookHandlerConfig,\n} from \"@dodopayments/core/webhook\";\nimport { APIError, createAuthEndpoint } from \"better-auth/api\";\nimport { WebhookPayload } from \"@dodopayments/core/schemas\";\nimport { verifyWebhookPayload } from \"@dodopayments/core/webhook\";\nimport type { WebhookResponse } from \"../types\";\n\nexport const webhooks =\n (options: WebhookHandlerConfig) => (_dodopayments: DodoPayments) => {\n return {\n dodopaymentsWebhooks: createAuthEndpoint(\n \"/dodopayments/webhooks\",\n {\n method: \"POST\",\n metadata: {\n isAction: false,\n },\n cloneRequest: true,\n },\n async (ctx): Promise<WebhookResponse> => {\n const { webhookKey } = options;\n\n if (!ctx.request?.body) {\n throw new APIError(\"INTERNAL_SERVER_ERROR\");\n }\n const buf = await ctx.request.text();\n let event: WebhookPayload;\n try {\n if (!webhookKey) {\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: \"DodoPayments webhook webhookKey not found\",\n });\n }\n\n const headers = {\n \"webhook-id\": ctx.request.headers.get(\"webhook-id\") as string,\n \"webhook-timestamp\": ctx.request.headers.get(\n \"webhook-timestamp\",\n ) as string,\n \"webhook-signature\": ctx.request.headers.get(\n \"webhook-signature\",\n ) as string,\n };\n\n event = await verifyWebhookPayload({\n webhookKey,\n headers,\n body: buf,\n });\n } catch (err: unknown) {\n if (err instanceof Error) {\n ctx.context.logger.error(`Webhook Error: ${err.message}`);\n throw new APIError(\"BAD_REQUEST\", {\n message: `Webhook Error: ${err.message}`,\n });\n }\n\n throw new APIError(\"BAD_REQUEST\", {\n message: `Webhook Error: ${err}`,\n });\n }\n\n try {\n await handleWebhookPayload(event, options);\n } catch (e: unknown) {\n if (e instanceof Error) {\n ctx.context.logger.error(\n `DodoPayments webhook failed. Error: ${e.message}`,\n );\n }\n\n ctx.context.logger.error(\n `DodoPayments webhook failed. Error: ${e}`,\n );\n\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Webhook error: See server logs for more information.\",\n });\n }\n\n return ctx.json({ received: true });\n },\n ),\n };\n };\n","import {\n APIError,\n createAuthEndpoint,\n sessionMiddleware,\n} from \"better-auth/api\";\nimport type { DodoPayments } from \"dodopayments\";\nimport { Event } from \"dodopayments/resources/usage-events.mjs\";\nimport { z } from \"zod/v3\";\nimport { getOrCreateCustomerId } from \"../utils\";\n\nconst EventInputSchema = z.object({\n event_id: z.string(),\n event_name: z.string(),\n metadata: z\n .record(z.union([z.string(), z.number(), z.boolean()]))\n .nullable()\n .optional(),\n timestamp: z\n // NOTE: coerce because the date object gets converted to a string over network requests\n // but we still want to enforce that it's a Date type\n .date({ coerce: true })\n .transform((d) => d.toISOString())\n .optional()\n .describe(\n \"Custom Timestamp. Defaults to current timestamp in UTC.\\\n Timestamps that are older that 1 hour or after 5 mins from\\\n current timestamp will be rejected.\",\n ),\n});\n\nexport const usage = () => (dodopayments: DodoPayments) => {\n return {\n // Ingest usage data\n dodoUsageIngest: createAuthEndpoint(\n \"/dodopayments/usage/ingest\",\n {\n method: \"POST\",\n body: EventInputSchema,\n use: [sessionMiddleware],\n },\n async (ctx): Promise<{ ingested_count: number }> => {\n if (!ctx.context.session?.user?.id) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"User not found\",\n });\n }\n\n if (!ctx.context.session?.user.emailVerified) {\n throw new APIError(\"UNAUTHORIZED\", {\n message: \"User email not verified\",\n });\n }\n\n try {\n const customerId = await getOrCreateCustomerId(\n dodopayments,\n ctx.context.session,\n ctx.context.internalAdapter,\n );\n\n const result = await dodopayments.usageEvents.ingest({\n events: [\n {\n event_id: ctx.body.event_id,\n customer_id: customerId,\n event_name: ctx.body.event_name,\n timestamp: ctx.body.timestamp,\n metadata: ctx.body.metadata,\n },\n ],\n });\n\n return ctx.json({ ingested_count: result.ingested_count });\n } catch (e: unknown) {\n if (e instanceof Error) {\n ctx.context.logger.error(\n `User usage ingestion error: ${e.message}`,\n );\n }\n\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: \"Failed to record the user usage\",\n });\n }\n },\n ),\n\n // List usage meters\n dodoUsageMetersList: createAuthEndpoint(\n \"/dodopayments/usage/meters/list\",\n {\n method: \"GET\",\n query: z\n .object({\n page_number: z.coerce.number().optional(),\n page_size: z.coerce.number().optional(),\n event_name: z.string().optional(),\n meter_id: z.string().optional(),\n start: z.string().optional(),\n end: z.string().optional(),\n })\n .optional(),\n use: [sessionMiddleware],\n },\n async (ctx): Promise<{ items: Event[] }> => {\n if (!ctx.context.session?.user?.id) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"User not found\",\n });\n }\n\n if (!ctx.context.session?.user.emailVerified) {\n throw new APIError(\"UNAUTHORIZED\", {\n message: \"User email not verified\",\n });\n }\n\n try {\n const customerId = await getOrCreateCustomerId(\n dodopayments,\n ctx.context.session,\n ctx.context.internalAdapter,\n );\n\n const meters = await dodopayments.usageEvents.list({\n customer_id: customerId,\n ...ctx.query,\n });\n\n return ctx.json({ items: meters.items });\n } catch (e: unknown) {\n if (e instanceof Error) {\n ctx.context.logger.error(\n `User usage meter list error: ${e.message}`,\n );\n }\n\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: \"Failed to fetch the user usage\",\n });\n }\n },\n ),\n };\n};\n\n"],"mappings":"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","names":["import_api","dodopayments","dodopayments","import_api","import_v3","dodopayments","import_api","import_webhook","import_api","import_v3","dodopayments"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/hooks/customer.ts","../src/client.ts","../src/plugins/portal.ts","../src/utils.ts","../src/plugins/checkout.ts","../src/plugins/webhooks.ts","../src/plugins/usage.ts"],"sourcesContent":["import type { BetterAuthPlugin } from \"better-auth\";\nimport { onUserCreate, onUserUpdate } from \"./hooks/customer\";\nimport type { DodoPaymentsEndpoints, DodoPaymentsOptions } from \"./types\";\n\n// Re-export public types explicitly for wider TS compatibility\nexport type {\n Product,\n DodoPaymentsPlugin,\n DodoPaymentsPlugins,\n DodoPaymentsEndpoints,\n DodoPaymentsOptions,\n PaymentItems,\n SubscriptionItems,\n CustomerPortalResponse,\n CreateCheckoutResponse,\n WebhookResponse,\n} from \"./types\";\n\nexport { dodopaymentsClient } from \"./client\";\n\nexport { portal } from \"./plugins/portal\";\nexport { checkout, CheckoutOptions } from \"./plugins/checkout\";\nexport { webhooks } from \"./plugins/webhooks\";\nexport { usage } from \"./plugins/usage\";\n\nexport const dodopayments = (options: DodoPaymentsOptions) => {\n const plugins = options.use\n .map((use) => use(options))\n .reduce((acc, plugin) => {\n Object.assign(acc, plugin);\n return acc;\n }, {} as DodoPaymentsEndpoints);\n\n return {\n id: \"dodopayments\",\n schema: {\n user: {\n fields: {\n dodoCustomerId: {\n type: \"string\",\n required: false,\n input: false,\n },\n },\n },\n },\n endpoints: {\n ...plugins,\n },\n init() {\n return {\n options: {\n databaseHooks: {\n user: {\n create: {\n after: onUserCreate(options),\n },\n update: {\n after: onUserUpdate(options),\n },\n },\n },\n },\n };\n },\n } satisfies BetterAuthPlugin;\n};\n","import type { GenericEndpointContext, User } from \"better-auth\";\nimport { APIError } from \"better-auth/api\";\nimport type { DodoPaymentsOptions } from \"../types\";\n\nexport const onUserCreate =\n (options: DodoPaymentsOptions) =>\n async (user: User, ctx: GenericEndpointContext | null) => {\n if (ctx && options.createCustomerOnSignUp) {\n try {\n const customers = await options.client.customers.list({\n email: user.email,\n });\n const existingCustomer = customers.items[0];\n\n let customerId: string;\n\n const additionalParams = options.getCustomerParams\n ? await options.getCustomerParams(user)\n : undefined;\n\n if (existingCustomer) {\n await options.client.customers.update(existingCustomer.customer_id, {\n name: user.name,\n metadata: additionalParams?.metadata,\n phone_number: additionalParams?.phone_number,\n });\n customerId = existingCustomer.customer_id;\n } else {\n const newCustomer = await options.client.customers.create({\n email: user.email,\n name: user.name,\n metadata: additionalParams?.metadata,\n phone_number: additionalParams?.phone_number,\n }, { idempotencyKey: user.id });\n customerId = newCustomer.customer_id;\n }\n\n ctx.context.internalAdapter.updateUser(user.id, {\n dodoCustomerId: customerId,\n }).catch((e: unknown) => {\n ctx.context.logger.warn(\n `DodoPayments: failed to store dodoCustomerId for user ${user.id}. Error: ${e instanceof Error ? e.message : e}`,\n );\n });\n } catch (e: unknown) {\n if (e instanceof Error) {\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: `DodoPayments customer creation failed. Error: ${e.message}`,\n });\n }\n\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: `DodoPayments customer creation failed. Error: ${e}`,\n });\n }\n }\n };\n\nexport const onUserUpdate =\n (options: DodoPaymentsOptions) =>\n async (user: User, ctx: GenericEndpointContext | null) => {\n if (ctx && options.createCustomerOnSignUp) {\n try {\n let customerId = (user as User & { dodoCustomerId?: string }).dodoCustomerId;\n\n if (!customerId) {\n // Fallback to email lookup if dodoCustomerId is not stored yet\n const customers = await options.client.customers.list({\n email: user.email,\n });\n const existingCustomer = customers.items[0];\n\n if (!existingCustomer) return;\n\n customerId = existingCustomer.customer_id;\n\n // Backfill dodoCustomerId\n ctx.context.internalAdapter.updateUser(user.id, {\n dodoCustomerId: customerId,\n }).catch((e: unknown) => {\n ctx.context.logger.warn(\n `DodoPayments: failed to backfill dodoCustomerId for user ${user.id}. Error: ${e instanceof Error ? e.message : e}`,\n );\n });\n }\n\n const additionalParams = options.getCustomerParams\n ? await options.getCustomerParams(user)\n : undefined;\n\n await options.client.customers.update(customerId, {\n name: user.name,\n metadata: additionalParams?.metadata,\n phone_number: additionalParams?.phone_number,\n });\n } catch (e: unknown) {\n if (e instanceof Error) {\n ctx.context.logger.error(\n `DodoPayments customer update failed. Error: ${e.message}`,\n );\n } else {\n ctx.context.logger.error(\n `DodoPayments customer update failed. Error: ${e}`,\n );\n }\n }\n }\n };\n","import type { BetterAuthClientPlugin } from \"better-auth\";\nimport type { dodopayments } from \"./index\";\n\nexport const dodopaymentsClient = () => {\n return {\n id: \"dodopayments-client\",\n $InferServerPlugin: {} as ReturnType<typeof dodopayments>,\n } satisfies BetterAuthClientPlugin;\n};\n\nexport type {\n Product,\n DodoPaymentsEndpoints,\n DodoPaymentsOptions,\n PaymentItems,\n SubscriptionItems,\n CustomerPortalResponse,\n CreateCheckoutResponse,\n WebhookResponse,\n} from \"./types\";\n","import { APIError, createAuthEndpoint, sessionMiddleware } from \"better-auth/api\";\nimport { z } from \"zod/v3\";\nimport type {\n CustomerPortalResponse,\n DodoPaymentsOptions,\n PaymentItems,\n SubscriptionItems,\n} from \"../types\";\nimport { getOrCreateCustomerId } from \"../utils\";\n\nexport const portal = () => (options: DodoPaymentsOptions) => {\n return {\n dodoPortal: createAuthEndpoint(\n \"/dodopayments/customer/portal\",\n {\n method: \"GET\",\n use: [sessionMiddleware],\n },\n async (ctx): Promise<CustomerPortalResponse> => {\n if (!ctx.context.session?.user.id) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"User not found\",\n });\n }\n\n if (!ctx.context.session?.user.emailVerified) {\n throw new APIError(\"UNAUTHORIZED\", {\n message: \"User email not verified\",\n });\n }\n\n try {\n const customerId = await getOrCreateCustomerId(\n options.client,\n ctx.context.session,\n ctx.context.internalAdapter,\n options.getCustomerParams,\n );\n\n const customerSession =\n await options.client.customers.customerPortal.create(customerId);\n\n return ctx.json({\n url: customerSession.link,\n redirect: true,\n });\n } catch (e: unknown) {\n if (e instanceof Error) {\n ctx.context.logger.error(\n `DodoPayments customer portal creation failed. Error: ${e.message}`,\n );\n }\n\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: \"Customer portal creation failed\",\n });\n }\n },\n ),\n dodoSubscriptions: createAuthEndpoint(\n \"/dodopayments/customer/subscriptions/list\",\n {\n method: \"GET\",\n query: z\n .object({\n page: z.coerce.number().optional(),\n limit: z.coerce.number().optional(),\n status: z\n .enum([\n \"active\",\n \"cancelled\",\n \"on_hold\",\n \"pending\",\n \"failed\",\n \"expired\",\n ])\n .optional(),\n })\n .optional(),\n use: [sessionMiddleware],\n },\n async (ctx): Promise<SubscriptionItems> => {\n if (!ctx.context.session.user.id) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"User not found\",\n });\n }\n\n if (!ctx.context.session?.user.emailVerified) {\n throw new APIError(\"UNAUTHORIZED\", {\n message: \"User email not verified\",\n });\n }\n\n try {\n const customerId = await getOrCreateCustomerId(\n options.client,\n ctx.context.session,\n ctx.context.internalAdapter,\n options.getCustomerParams,\n );\n\n const subscriptions = await options.client.subscriptions.list({\n customer_id: customerId,\n // page number is 0-indexed\n page_number: ctx.query?.page ? ctx.query.page - 1 : undefined,\n page_size: ctx.query?.limit,\n status: ctx.query?.status,\n });\n\n return ctx.json({ items: subscriptions.items });\n } catch (e: unknown) {\n if (e instanceof Error) {\n ctx.context.logger.error(\n `DodoPayments subscriptions list failed. Error: ${e.message}`,\n );\n }\n\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: \"DodoPayments subscriptions list failed\",\n });\n }\n },\n ),\n dodoPayments: createAuthEndpoint(\n \"/dodopayments/customer/payments/list\",\n {\n method: \"GET\",\n query: z\n .object({\n page: z.coerce.number().optional(),\n limit: z.coerce.number().optional(),\n status: z\n .enum([\n \"succeeded\",\n \"failed\",\n \"cancelled\",\n \"processing\",\n \"requires_customer_action\",\n \"requires_merchant_action\",\n \"requires_payment_method\",\n \"requires_confirmation\",\n \"requires_capture\",\n \"partially_captured\",\n \"partially_captured_and_capturable\",\n ])\n .optional(),\n })\n .optional(),\n use: [sessionMiddleware],\n },\n async (ctx): Promise<PaymentItems> => {\n if (!ctx.context.session.user.id) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"User not found\",\n });\n }\n\n if (!ctx.context.session?.user.emailVerified) {\n throw new APIError(\"UNAUTHORIZED\", {\n message: \"User email not verified\",\n });\n }\n\n try {\n const customerId = await getOrCreateCustomerId(\n options.client,\n ctx.context.session,\n ctx.context.internalAdapter,\n options.getCustomerParams,\n );\n\n const payments = await options.client.payments.list({\n customer_id: customerId,\n // page number is 0-indexed\n page_number: ctx.query?.page ? ctx.query.page - 1 : undefined,\n page_size: ctx.query?.limit,\n status: ctx.query?.status,\n });\n\n return ctx.json({ items: payments.items });\n } catch (e: unknown) {\n if (e instanceof Error) {\n ctx.context.logger.error(\n `DodoPayments orders list failed. Error: ${e.message}`,\n );\n }\n\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: \"Orders list failed\",\n });\n }\n },\n ),\n };\n};\n\n","import type { DodoPayments } from \"dodopayments\";\nimport type { User } from \"better-auth\";\n\nexport async function getOrCreateCustomerId(\n dodopayments: DodoPayments,\n session: { user: { id: string; email: string; name: string } & Record<string, unknown> },\n internalAdapter: { updateUser: (id: string, data: Record<string, unknown>) => Promise<unknown> },\n getCustomerParams?: (user: User) => { metadata?: Record<string, string>; phone_number?: string | null } | Promise<{ metadata?: Record<string, string>; phone_number?: string | null }>,\n): Promise<string> {\n const dodoCustomerId = session.user[\"dodoCustomerId\"] as string | undefined;\n if (dodoCustomerId) return dodoCustomerId;\n\n // Fallback to get customer from email if dodoCustomerId doesn't exist\n const customers = await dodopayments.customers.list({\n email: session.user.email,\n });\n let customer = customers.items[0];\n\n if (!customer) {\n const additionalParams = getCustomerParams\n ? await getCustomerParams(session.user as User)\n : undefined;\n\n customer = await dodopayments.customers.create({\n email: session.user.email,\n name: session.user.name,\n metadata: additionalParams?.metadata,\n phone_number: additionalParams?.phone_number,\n }, { idempotencyKey: session.user.id });\n }\n\n internalAdapter\n .updateUser(session.user.id, { dodoCustomerId: customer.customer_id })\n .catch(() => {});\n\n return customer.customer_id;\n}\n","import type { DodoPaymentsOptions } from \"../types\";\nimport { APIError, createAuthEndpoint, getSessionFromCtx } from \"better-auth/api\";\nimport { z } from \"zod/v3\";\nimport type { CreateCheckoutResponse, Product } from \"../types\";\nimport {\n buildCheckoutUrl,\n checkoutSessionPayloadSchema,\n dynamicCheckoutBodySchema,\n} from \"@dodopayments/core/checkout\";\n\nexport interface CheckoutOptions {\n /**\n * Optional list of slug -> productId mappings for easy slug checkouts\n */\n products?: Product[] | (() => Promise<Product[]>);\n /**\n * Checkout Success URL\n */\n successUrl?: string;\n /**\n * Only allow authenticated customers to checkout\n */\n authenticatedUsersOnly?: boolean;\n}\n\nexport const checkout =\n (checkoutOptions: CheckoutOptions = {}) =>\n (options: DodoPaymentsOptions) => {\n return {\n /**\n * @deprecated\n */\n dodoCheckout: createAuthEndpoint(\n \"/dodopayments/checkout\",\n {\n method: \"POST\",\n body: dynamicCheckoutBodySchema.extend({\n slug: z.string().optional(),\n referenceId: z.string().optional(),\n }),\n requireRequest: true,\n },\n async (ctx): Promise<CreateCheckoutResponse> => {\n const session = await getSessionFromCtx(ctx);\n\n let dodoPaymentsProductId: string | undefined;\n\n if (ctx.body?.slug) {\n const resolvedProducts =\n typeof checkoutOptions.products === \"function\"\n ? await checkoutOptions.products()\n : checkoutOptions.products;\n\n const productId = resolvedProducts?.find(\n (product) => product.slug === ctx.body.slug,\n )?.productId;\n\n if (!productId) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Product not found\",\n });\n }\n\n dodoPaymentsProductId = productId;\n } else {\n dodoPaymentsProductId = ctx.body.product_id;\n }\n\n if (checkoutOptions.authenticatedUsersOnly && !session?.user.id) {\n throw new APIError(\"UNAUTHORIZED\", {\n message: \"You must be logged in to checkout\",\n });\n }\n\n try {\n const checkoutUrl = await buildCheckoutUrl({\n body: {\n ...ctx.body,\n product_id: dodoPaymentsProductId,\n customer: {\n email: session?.user.email,\n name: session?.user.name,\n ...ctx.body.customer,\n },\n product_cart: dodoPaymentsProductId\n ? [\n {\n product_id: dodoPaymentsProductId,\n quantity: 1,\n },\n ]\n : undefined,\n metadata: ctx.body.referenceId\n ? {\n referenceId: ctx.body.referenceId,\n ...ctx.body.metadata,\n }\n : ctx.body.metadata,\n },\n bearerToken: options.client.bearerToken,\n environment: options.client.baseURL.includes(\"test\")\n ? \"test_mode\"\n : \"live_mode\",\n returnUrl: checkoutOptions.successUrl\n ? new URL(\n checkoutOptions.successUrl,\n ctx.request?.url,\n ).toString()\n : undefined,\n type: \"dynamic\",\n });\n\n const redirectUrl = new URL(checkoutUrl);\n\n return ctx.json({\n url: redirectUrl.toString(),\n redirect: true,\n });\n } catch (e: unknown) {\n if (e instanceof Error) {\n ctx.context.logger.error(\n `DodoPayments checkout creation failed. Error: ${e.message}`,\n );\n }\n\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: \"Checkout creation failed\",\n });\n }\n },\n ),\n dodoCheckoutSession: createAuthEndpoint(\n \"/dodopayments/checkout-session\",\n {\n method: \"POST\",\n body: checkoutSessionPayloadSchema\n .extend({\n slug: z.string().optional(),\n referenceId: z.string().optional(),\n })\n .partial({\n product_cart: true,\n }),\n requireRequest: true,\n },\n async (ctx): Promise<CreateCheckoutResponse> => {\n const session = await getSessionFromCtx(ctx);\n\n let dodoPaymentsProductId: string | undefined;\n\n if (ctx.body?.slug) {\n const resolvedProducts =\n typeof checkoutOptions.products === \"function\"\n ? await checkoutOptions.products()\n : checkoutOptions.products;\n\n const productId = resolvedProducts?.find(\n (product) => product.slug === ctx.body.slug,\n )?.productId;\n\n if (!productId) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Product not found\",\n });\n }\n\n dodoPaymentsProductId = productId;\n }\n\n if (checkoutOptions.authenticatedUsersOnly && !session?.user.id) {\n throw new APIError(\"UNAUTHORIZED\", {\n message: \"You must be logged in to checkout\",\n });\n }\n\n // Ensure we have a product_cart\n const product_cart = dodoPaymentsProductId\n ? [{ product_id: dodoPaymentsProductId, quantity: 1 }]\n : ctx.body.product_cart;\n\n if (!product_cart || product_cart.length === 0) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Neither product_cart nor slug was provided\",\n });\n }\n\n try {\n const checkoutUrl = await buildCheckoutUrl({\n sessionPayload: {\n ...ctx.body,\n product_cart,\n customer: session?.user.email\n ? {\n email: session?.user.email,\n name: session?.user.name,\n }\n : ctx.body.customer,\n metadata: ctx.body.referenceId\n ? {\n referenceId: ctx.body.referenceId,\n ...ctx.body.metadata,\n }\n : ctx.body.metadata,\n return_url: checkoutOptions.successUrl\n ? new URL(\n checkoutOptions.successUrl,\n ctx.request?.url,\n ).toString()\n : undefined,\n },\n bearerToken: options.client.bearerToken,\n environment: options.client.baseURL.includes(\"test\")\n ? \"test_mode\"\n : \"live_mode\",\n type: \"session\",\n });\n\n const redirectUrl = new URL(checkoutUrl);\n\n return ctx.json({\n url: redirectUrl.toString(),\n redirect: true,\n });\n } catch (e: unknown) {\n if (e instanceof Error) {\n ctx.context.logger.error(\n `DodoPayments checkout creation failed. Error: ${e.message}`,\n );\n }\n\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: \"Checkout session creation failed\",\n });\n }\n },\n ),\n };\n };\n","import type { DodoPaymentsOptions } from \"../types\";\nimport {\n handleWebhookPayload,\n WebhookHandlerConfig,\n} from \"@dodopayments/core/webhook\";\nimport { APIError, createAuthEndpoint } from \"better-auth/api\";\nimport { WebhookPayload } from \"@dodopayments/core/schemas\";\nimport { verifyWebhookPayload } from \"@dodopayments/core/webhook\";\nimport type { WebhookResponse } from \"../types\";\n\nexport const webhooks =\n (webhookOptions: WebhookHandlerConfig) => (_options: DodoPaymentsOptions) => {\n return {\n dodopaymentsWebhooks: createAuthEndpoint(\n \"/dodopayments/webhooks\",\n {\n method: \"POST\",\n metadata: {\n isAction: false,\n },\n cloneRequest: true,\n },\n async (ctx): Promise<WebhookResponse> => {\n const { webhookKey } = webhookOptions;\n\n if (!ctx.request?.body) {\n throw new APIError(\"INTERNAL_SERVER_ERROR\");\n }\n const buf = await ctx.request.text();\n let event: WebhookPayload;\n try {\n if (!webhookKey) {\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: \"DodoPayments webhook webhookKey not found\",\n });\n }\n\n const headers = {\n \"webhook-id\": ctx.request.headers.get(\"webhook-id\") as string,\n \"webhook-timestamp\": ctx.request.headers.get(\n \"webhook-timestamp\",\n ) as string,\n \"webhook-signature\": ctx.request.headers.get(\n \"webhook-signature\",\n ) as string,\n };\n\n event = await verifyWebhookPayload({\n webhookKey,\n headers,\n body: buf,\n });\n } catch (err: unknown) {\n if (err instanceof Error) {\n ctx.context.logger.error(`Webhook Error: ${err.message}`);\n throw new APIError(\"BAD_REQUEST\", {\n message: `Webhook Error: ${err.message}`,\n });\n }\n\n throw new APIError(\"BAD_REQUEST\", {\n message: `Webhook Error: ${err}`,\n });\n }\n\n try {\n await handleWebhookPayload(event, webhookOptions);\n } catch (e: unknown) {\n if (e instanceof Error) {\n ctx.context.logger.error(\n `DodoPayments webhook failed. Error: ${e.message}`,\n );\n }\n\n ctx.context.logger.error(\n `DodoPayments webhook failed. Error: ${e}`,\n );\n\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Webhook error: See server logs for more information.\",\n });\n }\n\n return ctx.json({ received: true });\n },\n ),\n };\n };\n","import {\n APIError,\n createAuthEndpoint,\n sessionMiddleware,\n} from \"better-auth/api\";\nimport type { DodoPaymentsOptions } from \"../types\";\nimport { Event } from \"dodopayments/resources/usage-events.mjs\";\nimport { z } from \"zod/v3\";\nimport { getOrCreateCustomerId } from \"../utils\";\n\nconst EventInputSchema = z.object({\n event_id: z.string(),\n event_name: z.string(),\n metadata: z\n .record(z.union([z.string(), z.number(), z.boolean()]))\n .nullable()\n .optional(),\n timestamp: z\n // NOTE: coerce because the date object gets converted to a string over network requests\n // but we still want to enforce that it's a Date type\n .date({ coerce: true })\n .transform((d) => d.toISOString())\n .optional()\n .describe(\n \"Custom Timestamp. Defaults to current timestamp in UTC.\\\n Timestamps that are older that 1 hour or after 5 mins from\\\n current timestamp will be rejected.\",\n ),\n});\n\nexport const usage = () => (options: DodoPaymentsOptions) => {\n return {\n // Ingest usage data\n dodoUsageIngest: createAuthEndpoint(\n \"/dodopayments/usage/ingest\",\n {\n method: \"POST\",\n body: EventInputSchema,\n use: [sessionMiddleware],\n },\n async (ctx): Promise<{ ingested_count: number }> => {\n if (!ctx.context.session?.user?.id) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"User not found\",\n });\n }\n\n if (!ctx.context.session?.user.emailVerified) {\n throw new APIError(\"UNAUTHORIZED\", {\n message: \"User email not verified\",\n });\n }\n\n try {\n const customerId = await getOrCreateCustomerId(\n options.client,\n ctx.context.session,\n ctx.context.internalAdapter,\n options.getCustomerParams,\n );\n\n const result = await options.client.usageEvents.ingest({\n events: [\n {\n event_id: ctx.body.event_id,\n customer_id: customerId,\n event_name: ctx.body.event_name,\n timestamp: ctx.body.timestamp,\n metadata: ctx.body.metadata,\n },\n ],\n });\n\n return ctx.json({ ingested_count: result.ingested_count });\n } catch (e: unknown) {\n if (e instanceof Error) {\n ctx.context.logger.error(\n `User usage ingestion error: ${e.message}`,\n );\n }\n\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: \"Failed to record the user usage\",\n });\n }\n },\n ),\n\n // List usage meters\n dodoUsageMetersList: createAuthEndpoint(\n \"/dodopayments/usage/meters/list\",\n {\n method: \"GET\",\n query: z\n .object({\n page_number: z.coerce.number().optional(),\n page_size: z.coerce.number().optional(),\n event_name: z.string().optional(),\n meter_id: z.string().optional(),\n start: z.string().optional(),\n end: z.string().optional(),\n })\n .optional(),\n use: [sessionMiddleware],\n },\n async (ctx): Promise<{ items: Event[] }> => {\n if (!ctx.context.session?.user?.id) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"User not found\",\n });\n }\n\n if (!ctx.context.session?.user.emailVerified) {\n throw new APIError(\"UNAUTHORIZED\", {\n message: \"User email not verified\",\n });\n }\n\n try {\n const customerId = await getOrCreateCustomerId(\n options.client,\n ctx.context.session,\n ctx.context.internalAdapter,\n options.getCustomerParams,\n );\n\n const meters = await options.client.usageEvents.list({\n customer_id: customerId,\n ...ctx.query,\n });\n\n return ctx.json({ items: meters.items });\n } catch (e: unknown) {\n if (e instanceof Error) {\n ctx.context.logger.error(\n `User usage meter list error: ${e.message}`,\n );\n }\n\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: \"Failed to fetch the user usage\",\n });\n }\n },\n ),\n };\n};\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,iBAAyB;AAGlB,IAAM,eACX,CAAC,YACD,OAAO,MAAY,QAAuC;AACxD,MAAI,OAAO,QAAQ,wBAAwB;AACzC,QAAI;AACF,YAAM,YAAY,MAAM,QAAQ,OAAO,UAAU,KAAK;AAAA,QACpD,OAAO,KAAK;AAAA,MACd,CAAC;AACD,YAAM,mBAAmB,UAAU,MAAM,CAAC;AAE1C,UAAI;AAEJ,YAAM,mBAAmB,QAAQ,oBAC7B,MAAM,QAAQ,kBAAkB,IAAI,IACpC;AAEJ,UAAI,kBAAkB;AACpB,cAAM,QAAQ,OAAO,UAAU,OAAO,iBAAiB,aAAa;AAAA,UAClE,MAAM,KAAK;AAAA,UACX,UAAU,kBAAkB;AAAA,UAC5B,cAAc,kBAAkB;AAAA,QAClC,CAAC;AACD,qBAAa,iBAAiB;AAAA,MAChC,OAAO;AACL,cAAM,cAAc,MAAM,QAAQ,OAAO,UAAU,OAAO;AAAA,UACxD,OAAO,KAAK;AAAA,UACZ,MAAM,KAAK;AAAA,UACX,UAAU,kBAAkB;AAAA,UAC5B,cAAc,kBAAkB;AAAA,QAClC,GAAG,EAAE,gBAAgB,KAAK,GAAG,CAAC;AAC9B,qBAAa,YAAY;AAAA,MAC3B;AAEA,UAAI,QAAQ,gBAAgB,WAAW,KAAK,IAAI;AAAA,QAC9C,gBAAgB;AAAA,MAClB,CAAC,EAAE,MAAM,CAAC,MAAe;AACvB,YAAI,QAAQ,OAAO;AAAA,UACjB,yDAAyD,KAAK,EAAE,YAAY,aAAa,QAAQ,EAAE,UAAU,CAAC;AAAA,QAChH;AAAA,MACF,CAAC;AAAA,IACH,SAAS,GAAY;AACnB,UAAI,aAAa,OAAO;AACtB,cAAM,IAAI,oBAAS,yBAAyB;AAAA,UAC1C,SAAS,iDAAiD,EAAE,OAAO;AAAA,QACrE,CAAC;AAAA,MACH;AAEA,YAAM,IAAI,oBAAS,yBAAyB;AAAA,QAC1C,SAAS,iDAAiD,CAAC;AAAA,MAC7D,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEK,IAAM,eACX,CAAC,YACD,OAAO,MAAY,QAAuC;AACxD,MAAI,OAAO,QAAQ,wBAAwB;AACzC,QAAI;AACF,UAAI,aAAc,KAA4C;AAE9D,UAAI,CAAC,YAAY;AAEf,cAAM,YAAY,MAAM,QAAQ,OAAO,UAAU,KAAK;AAAA,UACpD,OAAO,KAAK;AAAA,QACd,CAAC;AACD,cAAM,mBAAmB,UAAU,MAAM,CAAC;AAE1C,YAAI,CAAC,iBAAkB;AAEvB,qBAAa,iBAAiB;AAG9B,YAAI,QAAQ,gBAAgB,WAAW,KAAK,IAAI;AAAA,UAC9C,gBAAgB;AAAA,QAClB,CAAC,EAAE,MAAM,CAAC,MAAe;AACvB,cAAI,QAAQ,OAAO;AAAA,YACjB,4DAA4D,KAAK,EAAE,YAAY,aAAa,QAAQ,EAAE,UAAU,CAAC;AAAA,UACnH;AAAA,QACF,CAAC;AAAA,MACH;AAEA,YAAM,mBAAmB,QAAQ,oBAC7B,MAAM,QAAQ,kBAAkB,IAAI,IACpC;AAEJ,YAAM,QAAQ,OAAO,UAAU,OAAO,YAAY;AAAA,QAChD,MAAM,KAAK;AAAA,QACX,UAAU,kBAAkB;AAAA,QAC5B,cAAc,kBAAkB;AAAA,MAClC,CAAC;AAAA,IACH,SAAS,GAAY;AACnB,UAAI,aAAa,OAAO;AACtB,YAAI,QAAQ,OAAO;AAAA,UACjB,+CAA+C,EAAE,OAAO;AAAA,QAC1D;AAAA,MACF,OAAO;AACL,YAAI,QAAQ,OAAO;AAAA,UACjB,+CAA+C,CAAC;AAAA,QAClD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACxGK,IAAM,qBAAqB,MAAM;AACtC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,oBAAoB,CAAC;AAAA,EACvB;AACF;;;ACRA,IAAAA,cAAgE;AAChE,gBAAkB;;;ACElB,eAAsB,sBACpBC,eACA,SACA,iBACA,mBACiB;AACjB,QAAM,iBAAiB,QAAQ,KAAK,gBAAgB;AACpD,MAAI,eAAgB,QAAO;AAG3B,QAAM,YAAY,MAAMA,cAAa,UAAU,KAAK;AAAA,IAClD,OAAO,QAAQ,KAAK;AAAA,EACtB,CAAC;AACD,MAAI,WAAW,UAAU,MAAM,CAAC;AAEhC,MAAI,CAAC,UAAU;AACb,UAAM,mBAAmB,oBACrB,MAAM,kBAAkB,QAAQ,IAAY,IAC5C;AAEJ,eAAW,MAAMA,cAAa,UAAU,OAAO;AAAA,MAC7C,OAAO,QAAQ,KAAK;AAAA,MACpB,MAAM,QAAQ,KAAK;AAAA,MACnB,UAAU,kBAAkB;AAAA,MAC5B,cAAc,kBAAkB;AAAA,IAClC,GAAG,EAAE,gBAAgB,QAAQ,KAAK,GAAG,CAAC;AAAA,EACxC;AAEA,kBACG,WAAW,QAAQ,KAAK,IAAI,EAAE,gBAAgB,SAAS,YAAY,CAAC,EACpE,MAAM,MAAM;AAAA,EAAC,CAAC;AAEjB,SAAO,SAAS;AAClB;;;AD1BO,IAAM,SAAS,MAAM,CAAC,YAAiC;AAC5D,SAAO;AAAA,IACL,gBAAY;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK,CAAC,6BAAiB;AAAA,MACzB;AAAA,MACA,OAAO,QAAyC;AAC9C,YAAI,CAAC,IAAI,QAAQ,SAAS,KAAK,IAAI;AACjC,gBAAM,IAAI,qBAAS,eAAe;AAAA,YAChC,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAEA,YAAI,CAAC,IAAI,QAAQ,SAAS,KAAK,eAAe;AAC5C,gBAAM,IAAI,qBAAS,gBAAgB;AAAA,YACjC,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAEA,YAAI;AACF,gBAAM,aAAa,MAAM;AAAA,YACvB,QAAQ;AAAA,YACR,IAAI,QAAQ;AAAA,YACZ,IAAI,QAAQ;AAAA,YACZ,QAAQ;AAAA,UACV;AAEA,gBAAM,kBACJ,MAAM,QAAQ,OAAO,UAAU,eAAe,OAAO,UAAU;AAEjE,iBAAO,IAAI,KAAK;AAAA,YACd,KAAK,gBAAgB;AAAA,YACrB,UAAU;AAAA,UACZ,CAAC;AAAA,QACH,SAAS,GAAY;AACnB,cAAI,aAAa,OAAO;AACtB,gBAAI,QAAQ,OAAO;AAAA,cACjB,wDAAwD,EAAE,OAAO;AAAA,YACnE;AAAA,UACF;AAEA,gBAAM,IAAI,qBAAS,yBAAyB;AAAA,YAC1C,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,uBAAmB;AAAA,MACjB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO,YACJ,OAAO;AAAA,UACN,MAAM,YAAE,OAAO,OAAO,EAAE,SAAS;AAAA,UACjC,OAAO,YAAE,OAAO,OAAO,EAAE,SAAS;AAAA,UAClC,QAAQ,YACL,KAAK;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC,EACA,SAAS;AAAA,QACd,CAAC,EACA,SAAS;AAAA,QACZ,KAAK,CAAC,6BAAiB;AAAA,MACzB;AAAA,MACA,OAAO,QAAoC;AACzC,YAAI,CAAC,IAAI,QAAQ,QAAQ,KAAK,IAAI;AAChC,gBAAM,IAAI,qBAAS,eAAe;AAAA,YAChC,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAEA,YAAI,CAAC,IAAI,QAAQ,SAAS,KAAK,eAAe;AAC5C,gBAAM,IAAI,qBAAS,gBAAgB;AAAA,YACjC,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAEA,YAAI;AACF,gBAAM,aAAa,MAAM;AAAA,YACvB,QAAQ;AAAA,YACR,IAAI,QAAQ;AAAA,YACZ,IAAI,QAAQ;AAAA,YACZ,QAAQ;AAAA,UACV;AAEA,gBAAM,gBAAgB,MAAM,QAAQ,OAAO,cAAc,KAAK;AAAA,YAC5D,aAAa;AAAA;AAAA,YAEb,aAAa,IAAI,OAAO,OAAO,IAAI,MAAM,OAAO,IAAI;AAAA,YACpD,WAAW,IAAI,OAAO;AAAA,YACtB,QAAQ,IAAI,OAAO;AAAA,UACrB,CAAC;AAED,iBAAO,IAAI,KAAK,EAAE,OAAO,cAAc,MAAM,CAAC;AAAA,QAChD,SAAS,GAAY;AACnB,cAAI,aAAa,OAAO;AACtB,gBAAI,QAAQ,OAAO;AAAA,cACjB,kDAAkD,EAAE,OAAO;AAAA,YAC7D;AAAA,UACF;AAEA,gBAAM,IAAI,qBAAS,yBAAyB;AAAA,YAC1C,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,kBAAc;AAAA,MACZ;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO,YACJ,OAAO;AAAA,UACN,MAAM,YAAE,OAAO,OAAO,EAAE,SAAS;AAAA,UACjC,OAAO,YAAE,OAAO,OAAO,EAAE,SAAS;AAAA,UAClC,QAAQ,YACL,KAAK;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC,EACA,SAAS;AAAA,QACd,CAAC,EACA,SAAS;AAAA,QACZ,KAAK,CAAC,6BAAiB;AAAA,MACzB;AAAA,MACA,OAAO,QAA+B;AACpC,YAAI,CAAC,IAAI,QAAQ,QAAQ,KAAK,IAAI;AAChC,gBAAM,IAAI,qBAAS,eAAe;AAAA,YAChC,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAEA,YAAI,CAAC,IAAI,QAAQ,SAAS,KAAK,eAAe;AAC5C,gBAAM,IAAI,qBAAS,gBAAgB;AAAA,YACjC,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAEA,YAAI;AACF,gBAAM,aAAa,MAAM;AAAA,YACvB,QAAQ;AAAA,YACR,IAAI,QAAQ;AAAA,YACZ,IAAI,QAAQ;AAAA,YACZ,QAAQ;AAAA,UACV;AAEA,gBAAM,WAAW,MAAM,QAAQ,OAAO,SAAS,KAAK;AAAA,YAClD,aAAa;AAAA;AAAA,YAEb,aAAa,IAAI,OAAO,OAAO,IAAI,MAAM,OAAO,IAAI;AAAA,YACpD,WAAW,IAAI,OAAO;AAAA,YACtB,QAAQ,IAAI,OAAO;AAAA,UACrB,CAAC;AAED,iBAAO,IAAI,KAAK,EAAE,OAAO,SAAS,MAAM,CAAC;AAAA,QAC3C,SAAS,GAAY;AACnB,cAAI,aAAa,OAAO;AACtB,gBAAI,QAAQ,OAAO;AAAA,cACjB,2CAA2C,EAAE,OAAO;AAAA,YACtD;AAAA,UACF;AAEA,gBAAM,IAAI,qBAAS,yBAAyB;AAAA,YAC1C,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AElMA,IAAAC,cAAgE;AAChE,IAAAC,aAAkB;AAElB,sBAIO;AAiBA,IAAM,WACX,CAAC,kBAAmC,CAAC,MACrC,CAAC,YAAiC;AAChC,SAAO;AAAA;AAAA;AAAA;AAAA,IAIL,kBAAc;AAAA,MACZ;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,0CAA0B,OAAO;AAAA,UACrC,MAAM,aAAE,OAAO,EAAE,SAAS;AAAA,UAC1B,aAAa,aAAE,OAAO,EAAE,SAAS;AAAA,QACnC,CAAC;AAAA,QACD,gBAAgB;AAAA,MAClB;AAAA,MACA,OAAO,QAAyC;AAC9C,cAAM,UAAU,UAAM,+BAAkB,GAAG;AAE3C,YAAI;AAEJ,YAAI,IAAI,MAAM,MAAM;AAClB,gBAAM,mBACJ,OAAO,gBAAgB,aAAa,aAChC,MAAM,gBAAgB,SAAS,IAC/B,gBAAgB;AAEtB,gBAAM,YAAY,kBAAkB;AAAA,YAClC,CAAC,YAAY,QAAQ,SAAS,IAAI,KAAK;AAAA,UACzC,GAAG;AAEH,cAAI,CAAC,WAAW;AACd,kBAAM,IAAI,qBAAS,eAAe;AAAA,cAChC,SAAS;AAAA,YACX,CAAC;AAAA,UACH;AAEA,kCAAwB;AAAA,QAC1B,OAAO;AACL,kCAAwB,IAAI,KAAK;AAAA,QACnC;AAEA,YAAI,gBAAgB,0BAA0B,CAAC,SAAS,KAAK,IAAI;AAC/D,gBAAM,IAAI,qBAAS,gBAAgB;AAAA,YACjC,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAEA,YAAI;AACF,gBAAM,cAAc,UAAM,kCAAiB;AAAA,YACzC,MAAM;AAAA,cACJ,GAAG,IAAI;AAAA,cACP,YAAY;AAAA,cACZ,UAAU;AAAA,gBACR,OAAO,SAAS,KAAK;AAAA,gBACrB,MAAM,SAAS,KAAK;AAAA,gBACpB,GAAG,IAAI,KAAK;AAAA,cACd;AAAA,cACA,cAAc,wBACV;AAAA,gBACE;AAAA,kBACE,YAAY;AAAA,kBACZ,UAAU;AAAA,gBACZ;AAAA,cACF,IACA;AAAA,cACJ,UAAU,IAAI,KAAK,cACf;AAAA,gBACE,aAAa,IAAI,KAAK;AAAA,gBACtB,GAAG,IAAI,KAAK;AAAA,cACd,IACA,IAAI,KAAK;AAAA,YACf;AAAA,YACA,aAAa,QAAQ,OAAO;AAAA,YAC5B,aAAa,QAAQ,OAAO,QAAQ,SAAS,MAAM,IAC/C,cACA;AAAA,YACJ,WAAW,gBAAgB,aACvB,IAAI;AAAA,cACF,gBAAgB;AAAA,cAChB,IAAI,SAAS;AAAA,YACf,EAAE,SAAS,IACX;AAAA,YACJ,MAAM;AAAA,UACR,CAAC;AAED,gBAAM,cAAc,IAAI,IAAI,WAAW;AAEvC,iBAAO,IAAI,KAAK;AAAA,YACd,KAAK,YAAY,SAAS;AAAA,YAC1B,UAAU;AAAA,UACZ,CAAC;AAAA,QACH,SAAS,GAAY;AACnB,cAAI,aAAa,OAAO;AACtB,gBAAI,QAAQ,OAAO;AAAA,cACjB,iDAAiD,EAAE,OAAO;AAAA,YAC5D;AAAA,UACF;AAEA,gBAAM,IAAI,qBAAS,yBAAyB;AAAA,YAC1C,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,yBAAqB;AAAA,MACnB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,6CACH,OAAO;AAAA,UACN,MAAM,aAAE,OAAO,EAAE,SAAS;AAAA,UAC1B,aAAa,aAAE,OAAO,EAAE,SAAS;AAAA,QACnC,CAAC,EACA,QAAQ;AAAA,UACP,cAAc;AAAA,QAChB,CAAC;AAAA,QACH,gBAAgB;AAAA,MAClB;AAAA,MACA,OAAO,QAAyC;AAC9C,cAAM,UAAU,UAAM,+BAAkB,GAAG;AAE3C,YAAI;AAEJ,YAAI,IAAI,MAAM,MAAM;AAClB,gBAAM,mBACJ,OAAO,gBAAgB,aAAa,aAChC,MAAM,gBAAgB,SAAS,IAC/B,gBAAgB;AAEtB,gBAAM,YAAY,kBAAkB;AAAA,YAClC,CAAC,YAAY,QAAQ,SAAS,IAAI,KAAK;AAAA,UACzC,GAAG;AAEH,cAAI,CAAC,WAAW;AACd,kBAAM,IAAI,qBAAS,eAAe;AAAA,cAChC,SAAS;AAAA,YACX,CAAC;AAAA,UACH;AAEA,kCAAwB;AAAA,QAC1B;AAEA,YAAI,gBAAgB,0BAA0B,CAAC,SAAS,KAAK,IAAI;AAC/D,gBAAM,IAAI,qBAAS,gBAAgB;AAAA,YACjC,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAGA,cAAM,eAAe,wBACjB,CAAC,EAAE,YAAY,uBAAuB,UAAU,EAAE,CAAC,IACnD,IAAI,KAAK;AAEb,YAAI,CAAC,gBAAgB,aAAa,WAAW,GAAG;AAC9C,gBAAM,IAAI,qBAAS,eAAe;AAAA,YAChC,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAEA,YAAI;AACF,gBAAM,cAAc,UAAM,kCAAiB;AAAA,YACzC,gBAAgB;AAAA,cACd,GAAG,IAAI;AAAA,cACP;AAAA,cACA,UAAU,SAAS,KAAK,QACpB;AAAA,gBACE,OAAO,SAAS,KAAK;AAAA,gBACrB,MAAM,SAAS,KAAK;AAAA,cACtB,IACA,IAAI,KAAK;AAAA,cACb,UAAU,IAAI,KAAK,cACf;AAAA,gBACE,aAAa,IAAI,KAAK;AAAA,gBACtB,GAAG,IAAI,KAAK;AAAA,cACd,IACA,IAAI,KAAK;AAAA,cACb,YAAY,gBAAgB,aACxB,IAAI;AAAA,gBACF,gBAAgB;AAAA,gBAChB,IAAI,SAAS;AAAA,cACf,EAAE,SAAS,IACX;AAAA,YACN;AAAA,YACA,aAAa,QAAQ,OAAO;AAAA,YAC5B,aAAa,QAAQ,OAAO,QAAQ,SAAS,MAAM,IAC/C,cACA;AAAA,YACJ,MAAM;AAAA,UACR,CAAC;AAED,gBAAM,cAAc,IAAI,IAAI,WAAW;AAEvC,iBAAO,IAAI,KAAK;AAAA,YACd,KAAK,YAAY,SAAS;AAAA,YAC1B,UAAU;AAAA,UACZ,CAAC;AAAA,QACH,SAAS,GAAY;AACnB,cAAI,aAAa,OAAO;AACtB,gBAAI,QAAQ,OAAO;AAAA,cACjB,iDAAiD,EAAE,OAAO;AAAA,YAC5D;AAAA,UACF;AAEA,gBAAM,IAAI,qBAAS,yBAAyB;AAAA,YAC1C,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC5OF,qBAGO;AACP,IAAAC,cAA6C;AAE7C,IAAAC,kBAAqC;AAG9B,IAAM,WACX,CAAC,mBAAyC,CAAC,aAAkC;AAC3E,SAAO;AAAA,IACL,0BAAsB;AAAA,MACpB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,UAAU;AAAA,UACR,UAAU;AAAA,QACZ;AAAA,QACA,cAAc;AAAA,MAChB;AAAA,MACA,OAAO,QAAkC;AACvC,cAAM,EAAE,WAAW,IAAI;AAEvB,YAAI,CAAC,IAAI,SAAS,MAAM;AACtB,gBAAM,IAAI,qBAAS,uBAAuB;AAAA,QAC5C;AACA,cAAM,MAAM,MAAM,IAAI,QAAQ,KAAK;AACnC,YAAI;AACJ,YAAI;AACF,cAAI,CAAC,YAAY;AACf,kBAAM,IAAI,qBAAS,yBAAyB;AAAA,cAC1C,SAAS;AAAA,YACX,CAAC;AAAA,UACH;AAEA,gBAAM,UAAU;AAAA,YACd,cAAc,IAAI,QAAQ,QAAQ,IAAI,YAAY;AAAA,YAClD,qBAAqB,IAAI,QAAQ,QAAQ;AAAA,cACvC;AAAA,YACF;AAAA,YACA,qBAAqB,IAAI,QAAQ,QAAQ;AAAA,cACvC;AAAA,YACF;AAAA,UACF;AAEA,kBAAQ,UAAM,sCAAqB;AAAA,YACjC;AAAA,YACA;AAAA,YACA,MAAM;AAAA,UACR,CAAC;AAAA,QACH,SAAS,KAAc;AACrB,cAAI,eAAe,OAAO;AACxB,gBAAI,QAAQ,OAAO,MAAM,kBAAkB,IAAI,OAAO,EAAE;AACxD,kBAAM,IAAI,qBAAS,eAAe;AAAA,cAChC,SAAS,kBAAkB,IAAI,OAAO;AAAA,YACxC,CAAC;AAAA,UACH;AAEA,gBAAM,IAAI,qBAAS,eAAe;AAAA,YAChC,SAAS,kBAAkB,GAAG;AAAA,UAChC,CAAC;AAAA,QACH;AAEA,YAAI;AACF,oBAAM,qCAAqB,OAAO,cAAc;AAAA,QAClD,SAAS,GAAY;AACnB,cAAI,aAAa,OAAO;AACtB,gBAAI,QAAQ,OAAO;AAAA,cACjB,uCAAuC,EAAE,OAAO;AAAA,YAClD;AAAA,UACF;AAEA,cAAI,QAAQ,OAAO;AAAA,YACjB,uCAAuC,CAAC;AAAA,UAC1C;AAEA,gBAAM,IAAI,qBAAS,eAAe;AAAA,YAChC,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAEA,eAAO,IAAI,KAAK,EAAE,UAAU,KAAK,CAAC;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AACF;;;ACvFF,IAAAC,cAIO;AAGP,IAAAC,aAAkB;AAGlB,IAAM,mBAAmB,aAAE,OAAO;AAAA,EAChC,UAAU,aAAE,OAAO;AAAA,EACnB,YAAY,aAAE,OAAO;AAAA,EACrB,UAAU,aACP,OAAO,aAAE,MAAM,CAAC,aAAE,OAAO,GAAG,aAAE,OAAO,GAAG,aAAE,QAAQ,CAAC,CAAC,CAAC,EACrD,SAAS,EACT,SAAS;AAAA,EACZ,WAAW,aAGR,KAAK,EAAE,QAAQ,KAAK,CAAC,EACrB,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC,EAChC,SAAS,EACT;AAAA,IACC;AAAA,EAGF;AACJ,CAAC;AAEM,IAAM,QAAQ,MAAM,CAAC,YAAiC;AAC3D,SAAO;AAAA;AAAA,IAEL,qBAAiB;AAAA,MACf;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,KAAK,CAAC,6BAAiB;AAAA,MACzB;AAAA,MACA,OAAO,QAA6C;AAClD,YAAI,CAAC,IAAI,QAAQ,SAAS,MAAM,IAAI;AAClC,gBAAM,IAAI,qBAAS,eAAe;AAAA,YAChC,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAEA,YAAI,CAAC,IAAI,QAAQ,SAAS,KAAK,eAAe;AAC5C,gBAAM,IAAI,qBAAS,gBAAgB;AAAA,YACjC,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAEA,YAAI;AACF,gBAAM,aAAa,MAAM;AAAA,YACvB,QAAQ;AAAA,YACR,IAAI,QAAQ;AAAA,YACZ,IAAI,QAAQ;AAAA,YACZ,QAAQ;AAAA,UACV;AAEA,gBAAM,SAAS,MAAM,QAAQ,OAAO,YAAY,OAAO;AAAA,YACrD,QAAQ;AAAA,cACN;AAAA,gBACE,UAAU,IAAI,KAAK;AAAA,gBACnB,aAAa;AAAA,gBACb,YAAY,IAAI,KAAK;AAAA,gBACrB,WAAW,IAAI,KAAK;AAAA,gBACpB,UAAU,IAAI,KAAK;AAAA,cACrB;AAAA,YACF;AAAA,UACF,CAAC;AAED,iBAAO,IAAI,KAAK,EAAE,gBAAgB,OAAO,eAAe,CAAC;AAAA,QAC3D,SAAS,GAAY;AACnB,cAAI,aAAa,OAAO;AACtB,gBAAI,QAAQ,OAAO;AAAA,cACjB,+BAA+B,EAAE,OAAO;AAAA,YAC1C;AAAA,UACF;AAEA,gBAAM,IAAI,qBAAS,yBAAyB;AAAA,YAC1C,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA;AAAA,IAGA,yBAAqB;AAAA,MACnB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO,aACJ,OAAO;AAAA,UACN,aAAa,aAAE,OAAO,OAAO,EAAE,SAAS;AAAA,UACxC,WAAW,aAAE,OAAO,OAAO,EAAE,SAAS;AAAA,UACtC,YAAY,aAAE,OAAO,EAAE,SAAS;AAAA,UAChC,UAAU,aAAE,OAAO,EAAE,SAAS;AAAA,UAC9B,OAAO,aAAE,OAAO,EAAE,SAAS;AAAA,UAC3B,KAAK,aAAE,OAAO,EAAE,SAAS;AAAA,QAC3B,CAAC,EACA,SAAS;AAAA,QACZ,KAAK,CAAC,6BAAiB;AAAA,MACzB;AAAA,MACA,OAAO,QAAqC;AAC1C,YAAI,CAAC,IAAI,QAAQ,SAAS,MAAM,IAAI;AAClC,gBAAM,IAAI,qBAAS,eAAe;AAAA,YAChC,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAEA,YAAI,CAAC,IAAI,QAAQ,SAAS,KAAK,eAAe;AAC5C,gBAAM,IAAI,qBAAS,gBAAgB;AAAA,YACjC,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAEA,YAAI;AACF,gBAAM,aAAa,MAAM;AAAA,YACvB,QAAQ;AAAA,YACR,IAAI,QAAQ;AAAA,YACZ,IAAI,QAAQ;AAAA,YACZ,QAAQ;AAAA,UACV;AAEA,gBAAM,SAAS,MAAM,QAAQ,OAAO,YAAY,KAAK;AAAA,YACnD,aAAa;AAAA,YACb,GAAG,IAAI;AAAA,UACT,CAAC;AAED,iBAAO,IAAI,KAAK,EAAE,OAAO,OAAO,MAAM,CAAC;AAAA,QACzC,SAAS,GAAY;AACnB,cAAI,aAAa,OAAO;AACtB,gBAAI,QAAQ,OAAO;AAAA,cACjB,gCAAgC,EAAE,OAAO;AAAA,YAC3C;AAAA,UACF;AAEA,gBAAM,IAAI,qBAAS,yBAAyB;AAAA,YAC1C,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;APzHO,IAAM,eAAe,CAAC,YAAiC;AAC5D,QAAM,UAAU,QAAQ,IACrB,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,EACzB,OAAO,CAAC,KAAK,WAAW;AACvB,WAAO,OAAO,KAAK,MAAM;AACzB,WAAO;AAAA,EACT,GAAG,CAAC,CAA0B;AAEhC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,QAAQ;AAAA,MACN,MAAM;AAAA,QACJ,QAAQ;AAAA,UACN,gBAAgB;AAAA,YACd,MAAM;AAAA,YACN,UAAU;AAAA,YACV,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT,GAAG;AAAA,IACL;AAAA,IACA,OAAO;AACL,aAAO;AAAA,QACL,SAAS;AAAA,UACP,eAAe;AAAA,YACb,MAAM;AAAA,cACJ,QAAQ;AAAA,gBACN,OAAO,aAAa,OAAO;AAAA,cAC7B;AAAA,cACA,QAAQ;AAAA,gBACN,OAAO,aAAa,OAAO;AAAA,cAC7B;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":["import_api","dodopayments","import_api","import_v3","import_api","import_webhook","import_api","import_v3"]}
package/dist/index.d.cts CHANGED
@@ -1,9 +1,8 @@
1
1
  import * as dodopayments_resources_usage_events_mjs from 'dodopayments/resources/usage-events.mjs';
2
2
  import * as better_auth from 'better-auth';
3
- import { D as DodoPaymentsOptions, C as CreateCheckoutResponse, a as CustomerPortalResponse, S as SubscriptionItems, P as PaymentItems, W as WebhookResponse } from './types-3pb2RGTM.cjs';
4
- export { g as CheckoutOptions, e as DodoPaymentsEndpoints, c as DodoPaymentsPlugin, d as DodoPaymentsPlugins, b as Product, f as checkout, p as portal, w as webhooks } from './types-3pb2RGTM.cjs';
3
+ import { D as DodoPaymentsOptions, C as CreateCheckoutResponse, a as CustomerPortalResponse, S as SubscriptionItems, P as PaymentItems, W as WebhookResponse } from './types-nGEm2vCL.cjs';
4
+ export { g as CheckoutOptions, e as DodoPaymentsEndpoints, c as DodoPaymentsPlugin, d as DodoPaymentsPlugins, b as Product, f as checkout, p as portal, u as usage, w as webhooks } from './types-nGEm2vCL.cjs';
5
5
  import * as zod_v3 from 'zod/v3';
6
- export { usage } from './plugins/usage.cjs';
7
6
  import 'dodopayments';
8
7
  import '@dodopayments/core/webhook';
9
8
 
@@ -81,6 +80,8 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
81
80
  }>, "many">>;
82
81
  metadata: zod_v3.ZodOptional<zod_v3.ZodRecord<zod_v3.ZodString, zod_v3.ZodString>>;
83
82
  currency: zod_v3.ZodOptional<zod_v3.ZodString>;
83
+ discount_code: zod_v3.ZodOptional<zod_v3.ZodString>;
84
+ discount_codes: zod_v3.ZodOptional<zod_v3.ZodArray<zod_v3.ZodString, "many">>;
84
85
  } & {
85
86
  slug: zod_v3.ZodOptional<zod_v3.ZodString>;
86
87
  referenceId: zod_v3.ZodOptional<zod_v3.ZodString>;
@@ -142,6 +143,8 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
142
143
  }>, "many">>;
143
144
  metadata: zod_v3.ZodOptional<zod_v3.ZodRecord<zod_v3.ZodString, zod_v3.ZodString>>;
144
145
  currency: zod_v3.ZodOptional<zod_v3.ZodString>;
146
+ discount_code: zod_v3.ZodOptional<zod_v3.ZodString>;
147
+ discount_codes: zod_v3.ZodOptional<zod_v3.ZodArray<zod_v3.ZodString, "many">>;
145
148
  } & {
146
149
  slug: zod_v3.ZodOptional<zod_v3.ZodString>;
147
150
  referenceId: zod_v3.ZodOptional<zod_v3.ZodString>;
@@ -203,6 +206,8 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
203
206
  }>, "many">>;
204
207
  metadata: zod_v3.ZodOptional<zod_v3.ZodRecord<zod_v3.ZodString, zod_v3.ZodString>>;
205
208
  currency: zod_v3.ZodOptional<zod_v3.ZodString>;
209
+ discount_code: zod_v3.ZodOptional<zod_v3.ZodString>;
210
+ discount_codes: zod_v3.ZodOptional<zod_v3.ZodArray<zod_v3.ZodString, "many">>;
206
211
  } & {
207
212
  slug: zod_v3.ZodOptional<zod_v3.ZodString>;
208
213
  referenceId: zod_v3.ZodOptional<zod_v3.ZodString>;
@@ -228,6 +233,16 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
228
233
  addon_id: string;
229
234
  }>, "many">>;
230
235
  amount: zod_v3.ZodOptional<zod_v3.ZodNumber>;
236
+ credit_entitlements: zod_v3.ZodOptional<zod_v3.ZodArray<zod_v3.ZodObject<{
237
+ credit_entitlement_id: zod_v3.ZodString;
238
+ credits_amount: zod_v3.ZodString;
239
+ }, "strip", zod_v3.ZodTypeAny, {
240
+ credit_entitlement_id: string;
241
+ credits_amount: string;
242
+ }, {
243
+ credit_entitlement_id: string;
244
+ credits_amount: string;
245
+ }>, "many">>;
231
246
  }, "strip", zod_v3.ZodTypeAny, {
232
247
  quantity: number;
233
248
  product_id: string;
@@ -236,6 +251,10 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
236
251
  addon_id: string;
237
252
  }[] | undefined;
238
253
  amount?: number | undefined;
254
+ credit_entitlements?: {
255
+ credit_entitlement_id: string;
256
+ credits_amount: string;
257
+ }[] | undefined;
239
258
  }, {
240
259
  quantity: number;
241
260
  product_id: string;
@@ -244,6 +263,10 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
244
263
  addon_id: string;
245
264
  }[] | undefined;
246
265
  amount?: number | undefined;
266
+ credit_entitlements?: {
267
+ credit_entitlement_id: string;
268
+ credits_amount: string;
269
+ }[] | undefined;
247
270
  }>, "many">>;
248
271
  customer: zod_v3.ZodOptional<zod_v3.ZodUnion<[zod_v3.ZodObject<{
249
272
  email: zod_v3.ZodString;
@@ -265,6 +288,8 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
265
288
  customer_id: string;
266
289
  }>]>>;
267
290
  metadata: zod_v3.ZodOptional<zod_v3.ZodRecord<zod_v3.ZodString, zod_v3.ZodString>>;
291
+ discount_code: zod_v3.ZodOptional<zod_v3.ZodString>;
292
+ discount_codes: zod_v3.ZodOptional<zod_v3.ZodArray<zod_v3.ZodString, "many">>;
268
293
  slug: zod_v3.ZodOptional<zod_v3.ZodString>;
269
294
  referenceId: zod_v3.ZodOptional<zod_v3.ZodString>;
270
295
  billing_address: zod_v3.ZodOptional<zod_v3.ZodObject<{
@@ -291,7 +316,6 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
291
316
  billing_currency: zod_v3.ZodOptional<zod_v3.ZodString>;
292
317
  show_saved_payment_methods: zod_v3.ZodOptional<zod_v3.ZodBoolean>;
293
318
  confirm: zod_v3.ZodOptional<zod_v3.ZodBoolean>;
294
- discount_code: zod_v3.ZodOptional<zod_v3.ZodString>;
295
319
  customization: zod_v3.ZodOptional<zod_v3.ZodObject<{
296
320
  theme: zod_v3.ZodOptional<zod_v3.ZodEnum<["light", "dark", "system"]>>;
297
321
  show_order_details: zod_v3.ZodOptional<zod_v3.ZodBoolean>;
@@ -398,6 +422,10 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
398
422
  addon_id: string;
399
423
  }[] | undefined;
400
424
  amount?: number | undefined;
425
+ credit_entitlements?: {
426
+ credit_entitlement_id: string;
427
+ credits_amount: string;
428
+ }[] | undefined;
401
429
  }[] | undefined;
402
430
  customer?: {
403
431
  email: string;
@@ -407,6 +435,8 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
407
435
  customer_id: string;
408
436
  } | undefined;
409
437
  metadata?: Record<string, string> | undefined;
438
+ discount_code?: string | undefined;
439
+ discount_codes?: string[] | undefined;
410
440
  slug?: string | undefined;
411
441
  referenceId?: string | undefined;
412
442
  billing_address?: {
@@ -421,7 +451,6 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
421
451
  billing_currency?: string | undefined;
422
452
  show_saved_payment_methods?: boolean | undefined;
423
453
  confirm?: boolean | undefined;
424
- discount_code?: string | undefined;
425
454
  customization?: {
426
455
  theme?: "light" | "dark" | "system" | undefined;
427
456
  show_order_details?: boolean | undefined;
@@ -462,6 +491,10 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
462
491
  addon_id: string;
463
492
  }[] | undefined;
464
493
  amount?: number | undefined;
494
+ credit_entitlements?: {
495
+ credit_entitlement_id: string;
496
+ credits_amount: string;
497
+ }[] | undefined;
465
498
  }[] | undefined;
466
499
  customer?: {
467
500
  email: string;
@@ -471,6 +504,8 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
471
504
  customer_id: string;
472
505
  } | undefined;
473
506
  metadata?: Record<string, string> | undefined;
507
+ discount_code?: string | undefined;
508
+ discount_codes?: string[] | undefined;
474
509
  slug?: string | undefined;
475
510
  referenceId?: string | undefined;
476
511
  billing_address?: {
@@ -485,7 +520,6 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
485
520
  billing_currency?: string | undefined;
486
521
  show_saved_payment_methods?: boolean | undefined;
487
522
  confirm?: boolean | undefined;
488
- discount_code?: string | undefined;
489
523
  customization?: {
490
524
  theme?: "light" | "dark" | "system" | undefined;
491
525
  show_order_details?: boolean | undefined;
package/dist/index.d.ts CHANGED
@@ -1,9 +1,8 @@
1
1
  import * as dodopayments_resources_usage_events_mjs from 'dodopayments/resources/usage-events.mjs';
2
2
  import * as better_auth from 'better-auth';
3
- import { D as DodoPaymentsOptions, C as CreateCheckoutResponse, a as CustomerPortalResponse, S as SubscriptionItems, P as PaymentItems, W as WebhookResponse } from './types-DygjjcRn.js';
4
- export { g as CheckoutOptions, e as DodoPaymentsEndpoints, c as DodoPaymentsPlugin, d as DodoPaymentsPlugins, b as Product, f as checkout, p as portal, w as webhooks } from './types-DygjjcRn.js';
3
+ import { D as DodoPaymentsOptions, C as CreateCheckoutResponse, a as CustomerPortalResponse, S as SubscriptionItems, P as PaymentItems, W as WebhookResponse } from './types-nGEm2vCL.js';
4
+ export { g as CheckoutOptions, e as DodoPaymentsEndpoints, c as DodoPaymentsPlugin, d as DodoPaymentsPlugins, b as Product, f as checkout, p as portal, u as usage, w as webhooks } from './types-nGEm2vCL.js';
5
5
  import * as zod_v3 from 'zod/v3';
6
- export { usage } from './plugins/usage.js';
7
6
  import 'dodopayments';
8
7
  import '@dodopayments/core/webhook';
9
8
 
@@ -81,6 +80,8 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
81
80
  }>, "many">>;
82
81
  metadata: zod_v3.ZodOptional<zod_v3.ZodRecord<zod_v3.ZodString, zod_v3.ZodString>>;
83
82
  currency: zod_v3.ZodOptional<zod_v3.ZodString>;
83
+ discount_code: zod_v3.ZodOptional<zod_v3.ZodString>;
84
+ discount_codes: zod_v3.ZodOptional<zod_v3.ZodArray<zod_v3.ZodString, "many">>;
84
85
  } & {
85
86
  slug: zod_v3.ZodOptional<zod_v3.ZodString>;
86
87
  referenceId: zod_v3.ZodOptional<zod_v3.ZodString>;
@@ -142,6 +143,8 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
142
143
  }>, "many">>;
143
144
  metadata: zod_v3.ZodOptional<zod_v3.ZodRecord<zod_v3.ZodString, zod_v3.ZodString>>;
144
145
  currency: zod_v3.ZodOptional<zod_v3.ZodString>;
146
+ discount_code: zod_v3.ZodOptional<zod_v3.ZodString>;
147
+ discount_codes: zod_v3.ZodOptional<zod_v3.ZodArray<zod_v3.ZodString, "many">>;
145
148
  } & {
146
149
  slug: zod_v3.ZodOptional<zod_v3.ZodString>;
147
150
  referenceId: zod_v3.ZodOptional<zod_v3.ZodString>;
@@ -203,6 +206,8 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
203
206
  }>, "many">>;
204
207
  metadata: zod_v3.ZodOptional<zod_v3.ZodRecord<zod_v3.ZodString, zod_v3.ZodString>>;
205
208
  currency: zod_v3.ZodOptional<zod_v3.ZodString>;
209
+ discount_code: zod_v3.ZodOptional<zod_v3.ZodString>;
210
+ discount_codes: zod_v3.ZodOptional<zod_v3.ZodArray<zod_v3.ZodString, "many">>;
206
211
  } & {
207
212
  slug: zod_v3.ZodOptional<zod_v3.ZodString>;
208
213
  referenceId: zod_v3.ZodOptional<zod_v3.ZodString>;
@@ -228,6 +233,16 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
228
233
  addon_id: string;
229
234
  }>, "many">>;
230
235
  amount: zod_v3.ZodOptional<zod_v3.ZodNumber>;
236
+ credit_entitlements: zod_v3.ZodOptional<zod_v3.ZodArray<zod_v3.ZodObject<{
237
+ credit_entitlement_id: zod_v3.ZodString;
238
+ credits_amount: zod_v3.ZodString;
239
+ }, "strip", zod_v3.ZodTypeAny, {
240
+ credit_entitlement_id: string;
241
+ credits_amount: string;
242
+ }, {
243
+ credit_entitlement_id: string;
244
+ credits_amount: string;
245
+ }>, "many">>;
231
246
  }, "strip", zod_v3.ZodTypeAny, {
232
247
  quantity: number;
233
248
  product_id: string;
@@ -236,6 +251,10 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
236
251
  addon_id: string;
237
252
  }[] | undefined;
238
253
  amount?: number | undefined;
254
+ credit_entitlements?: {
255
+ credit_entitlement_id: string;
256
+ credits_amount: string;
257
+ }[] | undefined;
239
258
  }, {
240
259
  quantity: number;
241
260
  product_id: string;
@@ -244,6 +263,10 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
244
263
  addon_id: string;
245
264
  }[] | undefined;
246
265
  amount?: number | undefined;
266
+ credit_entitlements?: {
267
+ credit_entitlement_id: string;
268
+ credits_amount: string;
269
+ }[] | undefined;
247
270
  }>, "many">>;
248
271
  customer: zod_v3.ZodOptional<zod_v3.ZodUnion<[zod_v3.ZodObject<{
249
272
  email: zod_v3.ZodString;
@@ -265,6 +288,8 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
265
288
  customer_id: string;
266
289
  }>]>>;
267
290
  metadata: zod_v3.ZodOptional<zod_v3.ZodRecord<zod_v3.ZodString, zod_v3.ZodString>>;
291
+ discount_code: zod_v3.ZodOptional<zod_v3.ZodString>;
292
+ discount_codes: zod_v3.ZodOptional<zod_v3.ZodArray<zod_v3.ZodString, "many">>;
268
293
  slug: zod_v3.ZodOptional<zod_v3.ZodString>;
269
294
  referenceId: zod_v3.ZodOptional<zod_v3.ZodString>;
270
295
  billing_address: zod_v3.ZodOptional<zod_v3.ZodObject<{
@@ -291,7 +316,6 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
291
316
  billing_currency: zod_v3.ZodOptional<zod_v3.ZodString>;
292
317
  show_saved_payment_methods: zod_v3.ZodOptional<zod_v3.ZodBoolean>;
293
318
  confirm: zod_v3.ZodOptional<zod_v3.ZodBoolean>;
294
- discount_code: zod_v3.ZodOptional<zod_v3.ZodString>;
295
319
  customization: zod_v3.ZodOptional<zod_v3.ZodObject<{
296
320
  theme: zod_v3.ZodOptional<zod_v3.ZodEnum<["light", "dark", "system"]>>;
297
321
  show_order_details: zod_v3.ZodOptional<zod_v3.ZodBoolean>;
@@ -398,6 +422,10 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
398
422
  addon_id: string;
399
423
  }[] | undefined;
400
424
  amount?: number | undefined;
425
+ credit_entitlements?: {
426
+ credit_entitlement_id: string;
427
+ credits_amount: string;
428
+ }[] | undefined;
401
429
  }[] | undefined;
402
430
  customer?: {
403
431
  email: string;
@@ -407,6 +435,8 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
407
435
  customer_id: string;
408
436
  } | undefined;
409
437
  metadata?: Record<string, string> | undefined;
438
+ discount_code?: string | undefined;
439
+ discount_codes?: string[] | undefined;
410
440
  slug?: string | undefined;
411
441
  referenceId?: string | undefined;
412
442
  billing_address?: {
@@ -421,7 +451,6 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
421
451
  billing_currency?: string | undefined;
422
452
  show_saved_payment_methods?: boolean | undefined;
423
453
  confirm?: boolean | undefined;
424
- discount_code?: string | undefined;
425
454
  customization?: {
426
455
  theme?: "light" | "dark" | "system" | undefined;
427
456
  show_order_details?: boolean | undefined;
@@ -462,6 +491,10 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
462
491
  addon_id: string;
463
492
  }[] | undefined;
464
493
  amount?: number | undefined;
494
+ credit_entitlements?: {
495
+ credit_entitlement_id: string;
496
+ credits_amount: string;
497
+ }[] | undefined;
465
498
  }[] | undefined;
466
499
  customer?: {
467
500
  email: string;
@@ -471,6 +504,8 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
471
504
  customer_id: string;
472
505
  } | undefined;
473
506
  metadata?: Record<string, string> | undefined;
507
+ discount_code?: string | undefined;
508
+ discount_codes?: string[] | undefined;
474
509
  slug?: string | undefined;
475
510
  referenceId?: string | undefined;
476
511
  billing_address?: {
@@ -485,7 +520,6 @@ declare const dodopayments: (options: DodoPaymentsOptions) => {
485
520
  billing_currency?: string | undefined;
486
521
  show_saved_payment_methods?: boolean | undefined;
487
522
  confirm?: boolean | undefined;
488
- discount_code?: string | undefined;
489
523
  customization?: {
490
524
  theme?: "light" | "dark" | "system" | undefined;
491
525
  show_order_details?: boolean | undefined;
package/dist/index.js CHANGED
@@ -1,27 +1,27 @@
1
- import {
2
- webhooks
3
- } from "./chunk-HHIXOUFD.js";
4
- import {
5
- dodopaymentsClient
6
- } from "./chunk-HZNE63HR.js";
7
1
  import {
8
2
  onUserCreate,
9
3
  onUserUpdate
10
4
  } from "./chunk-527Y7FSE.js";
5
+ import {
6
+ dodopaymentsClient
7
+ } from "./chunk-HZNE63HR.js";
11
8
  import {
12
9
  checkout
13
- } from "./chunk-65YIVTFE.js";
10
+ } from "./chunk-6VDYFSNJ.js";
14
11
  import {
15
12
  portal
16
- } from "./chunk-DTOB4IQZ.js";
13
+ } from "./chunk-YCUWFLKK.js";
17
14
  import {
18
15
  usage
19
- } from "./chunk-ARA27DRZ.js";
20
- import "./chunk-TOPOAYYO.js";
16
+ } from "./chunk-ZA3TNX5K.js";
17
+ import "./chunk-EGRIWRWP.js";
18
+ import {
19
+ webhooks
20
+ } from "./chunk-XXIDSJPK.js";
21
21
 
22
22
  // src/index.ts
23
23
  var dodopayments = (options) => {
24
- const plugins = options.use.map((use) => use(options.client)).reduce((acc, plugin) => {
24
+ const plugins = options.use.map((use) => use(options)).reduce((acc, plugin) => {
25
25
  Object.assign(acc, plugin);
26
26
  return acc;
27
27
  }, {});
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { BetterAuthPlugin } from \"better-auth\";\nimport { onUserCreate, onUserUpdate } from \"./hooks/customer\";\nimport type { DodoPaymentsEndpoints, DodoPaymentsOptions } from \"./types\";\n\n// Re-export public types explicitly for wider TS compatibility\nexport type {\n Product,\n DodoPaymentsPlugin,\n DodoPaymentsPlugins,\n DodoPaymentsEndpoints,\n DodoPaymentsOptions,\n PaymentItems,\n SubscriptionItems,\n CustomerPortalResponse,\n CreateCheckoutResponse,\n WebhookResponse,\n} from \"./types\";\n\nexport { dodopaymentsClient } from \"./client\";\n\nexport { portal } from \"./plugins/portal\";\nexport { checkout, CheckoutOptions } from \"./plugins/checkout\";\nexport { webhooks } from \"./plugins/webhooks\";\nexport { usage } from \"./plugins/usage\";\n\nexport const dodopayments = (options: DodoPaymentsOptions) => {\n const plugins = options.use\n .map((use) => use(options.client))\n .reduce((acc, plugin) => {\n Object.assign(acc, plugin);\n return acc;\n }, {} as DodoPaymentsEndpoints);\n\n return {\n id: \"dodopayments\",\n schema: {\n user: {\n fields: {\n dodoCustomerId: {\n type: \"string\",\n required: false,\n input: false,\n },\n },\n },\n },\n endpoints: {\n ...plugins,\n },\n init() {\n return {\n options: {\n databaseHooks: {\n user: {\n create: {\n after: onUserCreate(options),\n },\n update: {\n after: onUserUpdate(options),\n },\n },\n },\n },\n };\n },\n } satisfies BetterAuthPlugin;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAyBO,IAAM,eAAe,CAAC,YAAiC;AAC5D,QAAM,UAAU,QAAQ,IACrB,IAAI,CAAC,QAAQ,IAAI,QAAQ,MAAM,CAAC,EAChC,OAAO,CAAC,KAAK,WAAW;AACvB,WAAO,OAAO,KAAK,MAAM;AACzB,WAAO;AAAA,EACT,GAAG,CAAC,CAA0B;AAEhC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,QAAQ;AAAA,MACN,MAAM;AAAA,QACJ,QAAQ;AAAA,UACN,gBAAgB;AAAA,YACd,MAAM;AAAA,YACN,UAAU;AAAA,YACV,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT,GAAG;AAAA,IACL;AAAA,IACA,OAAO;AACL,aAAO;AAAA,QACL,SAAS;AAAA,UACP,eAAe;AAAA,YACb,MAAM;AAAA,cACJ,QAAQ;AAAA,gBACN,OAAO,aAAa,OAAO;AAAA,cAC7B;AAAA,cACA,QAAQ;AAAA,gBACN,OAAO,aAAa,OAAO;AAAA,cAC7B;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { BetterAuthPlugin } from \"better-auth\";\nimport { onUserCreate, onUserUpdate } from \"./hooks/customer\";\nimport type { DodoPaymentsEndpoints, DodoPaymentsOptions } from \"./types\";\n\n// Re-export public types explicitly for wider TS compatibility\nexport type {\n Product,\n DodoPaymentsPlugin,\n DodoPaymentsPlugins,\n DodoPaymentsEndpoints,\n DodoPaymentsOptions,\n PaymentItems,\n SubscriptionItems,\n CustomerPortalResponse,\n CreateCheckoutResponse,\n WebhookResponse,\n} from \"./types\";\n\nexport { dodopaymentsClient } from \"./client\";\n\nexport { portal } from \"./plugins/portal\";\nexport { checkout, CheckoutOptions } from \"./plugins/checkout\";\nexport { webhooks } from \"./plugins/webhooks\";\nexport { usage } from \"./plugins/usage\";\n\nexport const dodopayments = (options: DodoPaymentsOptions) => {\n const plugins = options.use\n .map((use) => use(options))\n .reduce((acc, plugin) => {\n Object.assign(acc, plugin);\n return acc;\n }, {} as DodoPaymentsEndpoints);\n\n return {\n id: \"dodopayments\",\n schema: {\n user: {\n fields: {\n dodoCustomerId: {\n type: \"string\",\n required: false,\n input: false,\n },\n },\n },\n },\n endpoints: {\n ...plugins,\n },\n init() {\n return {\n options: {\n databaseHooks: {\n user: {\n create: {\n after: onUserCreate(options),\n },\n update: {\n after: onUserUpdate(options),\n },\n },\n },\n },\n };\n },\n } satisfies BetterAuthPlugin;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAyBO,IAAM,eAAe,CAAC,YAAiC;AAC5D,QAAM,UAAU,QAAQ,IACrB,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,EACzB,OAAO,CAAC,KAAK,WAAW;AACvB,WAAO,OAAO,KAAK,MAAM;AACzB,WAAO;AAAA,EACT,GAAG,CAAC,CAA0B;AAEhC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,QAAQ;AAAA,MACN,MAAM;AAAA,QACJ,QAAQ;AAAA,UACN,gBAAgB;AAAA,YACd,MAAM;AAAA,YACN,UAAU;AAAA,YACV,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT,GAAG;AAAA,IACL;AAAA,IACA,OAAO;AACL,aAAO;AAAA,QACL,SAAS;AAAA,UACP,eAAe;AAAA,YACb,MAAM;AAAA,cACJ,QAAQ;AAAA,gBACN,OAAO,aAAa,OAAO;AAAA,cAC7B;AAAA,cACA,QAAQ;AAAA,gBACN,OAAO,aAAa,OAAO;AAAA,cAC7B;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -26,7 +26,7 @@ module.exports = __toCommonJS(checkout_exports);
26
26
  var import_api = require("better-auth/api");
27
27
  var import_v3 = require("zod/v3");
28
28
  var import_checkout = require("@dodopayments/core/checkout");
29
- var checkout = (checkoutOptions = {}) => (dodopayments) => {
29
+ var checkout = (checkoutOptions = {}) => (options) => {
30
30
  return {
31
31
  /**
32
32
  * @deprecated
@@ -84,8 +84,8 @@ var checkout = (checkoutOptions = {}) => (dodopayments) => {
84
84
  ...ctx.body.metadata
85
85
  } : ctx.body.metadata
86
86
  },
87
- bearerToken: dodopayments.bearerToken,
88
- environment: dodopayments.baseURL.includes("test") ? "test_mode" : "live_mode",
87
+ bearerToken: options.client.bearerToken,
88
+ environment: options.client.baseURL.includes("test") ? "test_mode" : "live_mode",
89
89
  returnUrl: checkoutOptions.successUrl ? new URL(
90
90
  checkoutOptions.successUrl,
91
91
  ctx.request?.url
@@ -165,8 +165,8 @@ var checkout = (checkoutOptions = {}) => (dodopayments) => {
165
165
  ctx.request?.url
166
166
  ).toString() : void 0
167
167
  },
168
- bearerToken: dodopayments.bearerToken,
169
- environment: dodopayments.baseURL.includes("test") ? "test_mode" : "live_mode",
168
+ bearerToken: options.client.bearerToken,
169
+ environment: options.client.baseURL.includes("test") ? "test_mode" : "live_mode",
170
170
  type: "session"
171
171
  });
172
172
  const redirectUrl = new URL(checkoutUrl);