@deiondz/better-auth-razorpay 2.0.18 → 2.0.20

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.
@@ -3,8 +3,8 @@ import * as _tanstack_react_query from '@tanstack/react-query';
3
3
  import { UseMutationOptions, UseQueryOptions } from '@tanstack/react-query';
4
4
  import * as react from 'react';
5
5
  import { ReactNode } from 'react';
6
- import { c as RazorpayAuthClient, d as CancelSubscriptionResponse, a as CancelSubscriptionInput, e as CreateOrUpdateSubscriptionResponse, C as CreateOrUpdateSubscriptionInput, P as PlanSummary, f as RestoreSubscriptionResponse, b as RestoreSubscriptionInput, g as ListSubscriptionsResponse, h as VerifyPaymentResponse, V as VerifyPaymentInput, L as ListSubscriptionsInput } from '../types-I97EgC8r.js';
7
- export { G as GetPlansResponse, i as RazorpayApiError, R as RazorpayApiResult, j as RazorpayClientActions } from '../types-I97EgC8r.js';
6
+ import { d as RazorpayAuthClient, e as CancelSubscriptionResponse, a as CancelSubscriptionInput, f as CreateOrUpdateSubscriptionResponse, C as CreateOrUpdateSubscriptionInput, P as PlanSummary, g as RestoreSubscriptionResponse, b as RestoreSubscriptionInput, h as ListSubscriptionsResponse, c as VerifyPaymentResponse, V as VerifyPaymentInput, L as ListSubscriptionsInput } from '../types-G8p2fGwj.js';
7
+ export { G as GetPlansResponse, i as RazorpayApiError, R as RazorpayApiResult, j as RazorpayClientActions } from '../types-G8p2fGwj.js';
8
8
  import 'razorpay';
9
9
 
10
10
  /**
@@ -94,6 +94,8 @@ declare function useRazorpayAuthClient(): RazorpayAuthClient | null;
94
94
  declare const razorpayQueryKeys: {
95
95
  all: readonly ["razorpay"];
96
96
  plans: () => readonly ["razorpay", "plans"];
97
+ /** Prefix for all subscription list queries (use when invalidating after payment verified, etc.). */
98
+ subscriptionsList: () => readonly ["razorpay", "subscriptions"];
97
99
  subscriptions: (referenceId?: string) => readonly ["razorpay", "subscriptions", string];
98
100
  };
99
101
  type UsePlansOptions = Omit<UseQueryOptions<PlanSummary[], Error, PlanSummary[], readonly string[]>, 'queryKey' | 'queryFn'>;
@@ -150,7 +152,7 @@ type UseVerifyPaymentOptions = UseMutationOptions<VerifyPaymentResponse['data'],
150
152
  /**
151
153
  * Verify payment signature after Razorpay checkout success.
152
154
  * Call with the payload from the Razorpay success handler (razorpay_payment_id, razorpay_subscription_id, razorpay_signature).
153
- * Invalidates subscriptions list on success.
155
+ * Revalidates all subscription list queries on success.
154
156
  * Requires RazorpayAuthProvider above in the tree.
155
157
  */
156
158
  declare function useVerifyPayment(options?: UseVerifyPaymentOptions): _tanstack_react_query.UseMutationResult<{
@@ -78,6 +78,8 @@ function requireRazorpayOrApi(client) {
78
78
  var razorpayQueryKeys = {
79
79
  all: ["razorpay"],
80
80
  plans: () => [...razorpayQueryKeys.all, "plans"],
81
+ /** Prefix for all subscription list queries (use when invalidating after payment verified, etc.). */
82
+ subscriptionsList: () => [...razorpayQueryKeys.all, "subscriptions"],
81
83
  subscriptions: (referenceId) => [...razorpayQueryKeys.all, "subscriptions", referenceId ?? "me"]
82
84
  };
83
85
  function assertSuccess(res) {
@@ -212,7 +214,7 @@ function useVerifyPayment(options) {
212
214
  },
213
215
  ...options,
214
216
  onSuccess: (data, variables, onMutateResult, context) => {
215
- queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptions() });
217
+ queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptionsList() });
216
218
  options?.onSuccess?.(data, variables, onMutateResult, context);
217
219
  }
218
220
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../client/hooks.ts","../../client/checkout.ts"],"sourcesContent":["/**\r\n * React hooks for Razorpay subscription features using TanStack Query.\r\n * Wrap your app with <RazorpayAuthProvider client={authClient}> and use usePlans(), useSubscriptions(), etc. with no client argument.\r\n */\r\n\r\nimport { createContext, useContext, createElement, type ReactNode } from 'react'\r\nimport {\r\n useQuery,\r\n useMutation,\r\n useQueryClient,\r\n type UseQueryOptions,\r\n type UseMutationOptions,\r\n} from '@tanstack/react-query'\r\nimport type {\r\n RazorpayAuthClient,\r\n PlanSummary,\r\n CreateOrUpdateSubscriptionInput,\r\n CancelSubscriptionInput,\r\n RestoreSubscriptionInput,\r\n ListSubscriptionsInput,\r\n VerifyPaymentInput,\r\n GetPlansResponse,\r\n ListSubscriptionsResponse,\r\n CreateOrUpdateSubscriptionResponse,\r\n CancelSubscriptionResponse,\r\n RestoreSubscriptionResponse,\r\n VerifyPaymentResponse,\r\n RazorpayApiError,\r\n} from './types'\r\n\r\nconst BASE = '/razorpay'\r\n\r\nconst RAZORPAY_NO_CLIENT_MESSAGE =\r\n 'Razorpay hooks require wrapping your app with <RazorpayAuthProvider client={authClient}>.'\r\n\r\nconst RAZORPAY_NO_RAZORPAY_OR_API_MESSAGE =\r\n 'Razorpay hooks require a client created with razorpayClientPlugin() in createAuthClient({ plugins: [...] }).'\r\n\r\n/** Context holding the Razorpay-capable auth client. Default is null. */\r\nexport const RazorpayAuthContext = createContext<RazorpayAuthClient | null>(null)\r\n\r\n/** Provider that supplies the auth client to Razorpay hooks. Wrap your app once with client={authClient}. */\r\nexport function RazorpayAuthProvider({\r\n client,\r\n children,\r\n}: {\r\n client: RazorpayAuthClient | null\r\n children: ReactNode\r\n}) {\r\n return createElement(RazorpayAuthContext.Provider, { value: client }, children)\r\n}\r\n\r\n/** Returns the Razorpay-capable auth client from context, or null if not wrapped with RazorpayAuthProvider. */\r\nexport function useRazorpayAuthClient(): RazorpayAuthClient | null {\r\n return useContext(RazorpayAuthContext)\r\n}\r\n\r\nfunction requireRazorpayOrApi(client: RazorpayAuthClient): void {\r\n if (!client.razorpay && !client.api) {\r\n throw new Error(RAZORPAY_NO_RAZORPAY_OR_API_MESSAGE)\r\n }\r\n}\r\n\r\n/** Query keys for cache invalidation. */\r\nexport const razorpayQueryKeys = {\r\n all: ['razorpay'] as const,\r\n plans: () => [...razorpayQueryKeys.all, 'plans'] as const,\r\n subscriptions: (referenceId?: string) =>\r\n [...razorpayQueryKeys.all, 'subscriptions', referenceId ?? 'me'] as const,\r\n}\r\n\r\nfunction assertSuccess<T>(res: unknown): asserts res is { success: true; data: T } {\r\n if (res && typeof res === 'object' && 'success' in res) {\r\n if ((res as { success: boolean }).success) return\r\n const err = res as RazorpayApiError\r\n throw new Error(err.error?.description ?? err.error?.code ?? 'Request failed')\r\n }\r\n throw new Error('Invalid response')\r\n}\r\n\r\n/** Fetch plans (GET /razorpay/get-plans). Prefers client.razorpay when available to avoid 404s. */\r\nasync function fetchPlans(client: RazorpayAuthClient): Promise<PlanSummary[]> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.getPlans()\r\n : await client.api!.get(`${BASE}/get-plans`)\r\n assertSuccess<PlanSummary[]>(res)\r\n return res.data\r\n}\r\n\r\n/** Fetch subscriptions list (GET /razorpay/subscription/list). Prefers client.razorpay when available. */\r\nasync function fetchSubscriptions(\r\n client: RazorpayAuthClient,\r\n input?: ListSubscriptionsInput\r\n): Promise<ListSubscriptionsResponse['data']> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.listSubscriptions(input)\r\n : (() => {\r\n const query: Record<string, string> = {}\r\n if (input?.referenceId) query.referenceId = input.referenceId\r\n const path = `${BASE}/subscription/list`\r\n return Object.keys(query).length > 0\r\n ? client.api!.get(path, { query })\r\n : client.api!.get(path)\r\n })()\r\n assertSuccess<ListSubscriptionsResponse['data']>(res)\r\n return res.data\r\n}\r\n\r\n/** Create or update subscription (POST /razorpay/subscription/create-or-update). Prefers client.razorpay when available. */\r\nasync function createOrUpdateSubscription(\r\n client: RazorpayAuthClient,\r\n input: CreateOrUpdateSubscriptionInput\r\n): Promise<CreateOrUpdateSubscriptionResponse['data']> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.createOrUpdateSubscription(input)\r\n : await client.api!.post(`${BASE}/subscription/create-or-update`, {\r\n body: input as unknown as Record<string, unknown>,\r\n })\r\n assertSuccess<CreateOrUpdateSubscriptionResponse['data']>(res)\r\n return res.data\r\n}\r\n\r\n/** Cancel subscription (POST /razorpay/subscription/cancel). Prefers client.razorpay when available. */\r\nasync function cancelSubscription(\r\n client: RazorpayAuthClient,\r\n input: CancelSubscriptionInput\r\n): Promise<CancelSubscriptionResponse['data']> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.cancelSubscription(input)\r\n : await client.api!.post(`${BASE}/subscription/cancel`, {\r\n body: input as unknown as Record<string, unknown>,\r\n })\r\n assertSuccess<CancelSubscriptionResponse['data']>(res)\r\n return res.data\r\n}\r\n\r\n/** Restore subscription (POST /razorpay/subscription/restore). Prefers client.razorpay when available. */\r\nasync function restoreSubscription(\r\n client: RazorpayAuthClient,\r\n input: RestoreSubscriptionInput\r\n): Promise<RestoreSubscriptionResponse['data']> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.restoreSubscription(input)\r\n : await client.api!.post(`${BASE}/subscription/restore`, {\r\n body: input as unknown as Record<string, unknown>,\r\n })\r\n assertSuccess<RestoreSubscriptionResponse['data']>(res)\r\n return res.data\r\n}\r\n\r\n/** Verify payment (POST /razorpay/verify-payment). Prefers client.razorpay when available. */\r\nasync function verifyPayment(\r\n client: RazorpayAuthClient,\r\n input: VerifyPaymentInput\r\n): Promise<VerifyPaymentResponse['data']> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.verifyPayment(input)\r\n : await client.api!.post(`${BASE}/verify-payment`, {\r\n body: input as unknown as Record<string, unknown>,\r\n })\r\n assertSuccess<VerifyPaymentResponse['data']>(res)\r\n return res.data\r\n}\r\n\r\nexport type UsePlansOptions = Omit<\r\n UseQueryOptions<PlanSummary[], Error, PlanSummary[], readonly string[]>,\r\n 'queryKey' | 'queryFn'\r\n>\r\n\r\n/**\r\n * Fetch configured subscription plans (no auth required).\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function usePlans(options?: UsePlansOptions) {\r\n const client = useRazorpayAuthClient()\r\n return useQuery({\r\n queryKey: razorpayQueryKeys.plans(),\r\n queryFn: () => fetchPlans(client!),\r\n enabled: !!client,\r\n ...options,\r\n })\r\n}\r\n\r\nexport type UseSubscriptionsOptions = Omit<\r\n UseQueryOptions<\r\n ListSubscriptionsResponse['data'],\r\n Error,\r\n ListSubscriptionsResponse['data'],\r\n readonly (string | undefined)[]\r\n >,\r\n 'queryKey' | 'queryFn'\r\n> & { referenceId?: string }\r\n\r\n/**\r\n * List active/trialing subscriptions for the current user (or referenceId).\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function useSubscriptions(\r\n input?: ListSubscriptionsInput,\r\n options?: UseSubscriptionsOptions\r\n) {\r\n const client = useRazorpayAuthClient()\r\n const { referenceId, ...queryOptions } = options ?? {}\r\n const refId = input?.referenceId ?? referenceId\r\n return useQuery({\r\n queryKey: razorpayQueryKeys.subscriptions(refId),\r\n queryFn: () => fetchSubscriptions(client!, input),\r\n enabled: !!client,\r\n ...queryOptions,\r\n })\r\n}\r\n\r\nexport type UseCreateOrUpdateSubscriptionOptions = UseMutationOptions<\r\n CreateOrUpdateSubscriptionResponse['data'],\r\n Error,\r\n CreateOrUpdateSubscriptionInput,\r\n unknown\r\n>\r\n\r\n/**\r\n * Create or update a subscription. With embed: true returns data for in-page modal (no checkoutUrl);\r\n * use openRazorpaySubscriptionCheckout with razorpaySubscriptionId. Without embed, returns checkoutUrl for redirect.\r\n * Invalidates subscriptions list on success.\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function useCreateOrUpdateSubscription(\r\n options?: UseCreateOrUpdateSubscriptionOptions\r\n) {\r\n const client = useRazorpayAuthClient()\r\n const queryClient = useQueryClient()\r\n return useMutation({\r\n mutationFn: (input: CreateOrUpdateSubscriptionInput) => {\r\n if (!client) throw new Error(RAZORPAY_NO_CLIENT_MESSAGE)\r\n return createOrUpdateSubscription(client, input)\r\n },\r\n ...options,\r\n onSuccess: (data, variables, onMutateResult, context) => {\r\n queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptions() })\r\n options?.onSuccess?.(data, variables, onMutateResult, context)\r\n },\r\n })\r\n}\r\n\r\nexport type UseCancelSubscriptionOptions = UseMutationOptions<\r\n CancelSubscriptionResponse['data'],\r\n Error,\r\n CancelSubscriptionInput,\r\n unknown\r\n>\r\n\r\n/**\r\n * Cancel a subscription by local subscription ID (at period end or immediately).\r\n * Invalidates subscriptions list on success.\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function useCancelSubscription(options?: UseCancelSubscriptionOptions) {\r\n const client = useRazorpayAuthClient()\r\n const queryClient = useQueryClient()\r\n return useMutation({\r\n mutationFn: (input: CancelSubscriptionInput) => {\r\n if (!client) throw new Error(RAZORPAY_NO_CLIENT_MESSAGE)\r\n return cancelSubscription(client, input)\r\n },\r\n ...options,\r\n onSuccess: (data, variables, onMutateResult, context) => {\r\n queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptions() })\r\n options?.onSuccess?.(data, variables, onMutateResult, context)\r\n },\r\n })\r\n}\r\n\r\nexport type UseRestoreSubscriptionOptions = UseMutationOptions<\r\n RestoreSubscriptionResponse['data'],\r\n Error,\r\n RestoreSubscriptionInput,\r\n unknown\r\n>\r\n\r\n// Re-export client types and in-page checkout helpers\r\nexport type {\r\n RazorpayAuthClient,\r\n RazorpayClientActions,\r\n PlanSummary,\r\n CreateOrUpdateSubscriptionInput,\r\n CancelSubscriptionInput,\r\n RestoreSubscriptionInput,\r\n ListSubscriptionsInput,\r\n VerifyPaymentInput,\r\n GetPlansResponse,\r\n ListSubscriptionsResponse,\r\n CreateOrUpdateSubscriptionResponse,\r\n CancelSubscriptionResponse,\r\n RestoreSubscriptionResponse,\r\n VerifyPaymentResponse,\r\n RazorpayApiError,\r\n RazorpayApiResult,\r\n} from './types'\r\nexport {\r\n loadRazorpayCheckoutScript,\r\n openRazorpaySubscriptionCheckout,\r\n type RazorpaySubscriptionCheckoutOptions,\r\n} from './checkout'\r\n\r\n/**\r\n * Restore a subscription that was scheduled to cancel at period end.\r\n * Invalidates subscriptions list on success.\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function useRestoreSubscription(options?: UseRestoreSubscriptionOptions) {\r\n const client = useRazorpayAuthClient()\r\n const queryClient = useQueryClient()\r\n return useMutation({\r\n mutationFn: (input: RestoreSubscriptionInput) => {\r\n if (!client) throw new Error(RAZORPAY_NO_CLIENT_MESSAGE)\r\n return restoreSubscription(client, input)\r\n },\r\n ...options,\r\n onSuccess: (data, variables, onMutateResult, context) => {\r\n queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptions() })\r\n options?.onSuccess?.(data, variables, onMutateResult, context)\r\n },\r\n })\r\n}\r\n\r\nexport type UseVerifyPaymentOptions = UseMutationOptions<\r\n VerifyPaymentResponse['data'],\r\n Error,\r\n VerifyPaymentInput,\r\n unknown\r\n>\r\n\r\n/**\r\n * Verify payment signature after Razorpay checkout success.\r\n * Call with the payload from the Razorpay success handler (razorpay_payment_id, razorpay_subscription_id, razorpay_signature).\r\n * Invalidates subscriptions list on success.\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function useVerifyPayment(options?: UseVerifyPaymentOptions) {\r\n const client = useRazorpayAuthClient()\r\n const queryClient = useQueryClient()\r\n return useMutation({\r\n mutationFn: (input: VerifyPaymentInput) => {\r\n if (!client) throw new Error(RAZORPAY_NO_CLIENT_MESSAGE)\r\n return verifyPayment(client, input)\r\n },\r\n ...options,\r\n onSuccess: (data, variables, onMutateResult, context) => {\r\n queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptions() })\r\n options?.onSuccess?.(data, variables, onMutateResult, context)\r\n },\r\n })\r\n}\r\n","/**\r\n * In-page Razorpay subscription checkout (modal on your site).\r\n * Load the script once, then open the checkout with subscription_id from create-or-update (embed: true).\r\n */\r\n\r\nconst CHECKOUT_SCRIPT_URL = 'https://checkout.razorpay.com/v1/checkout.js'\r\n\r\ndeclare global {\r\n interface Window {\r\n Razorpay?: new (options: RazorpayCheckoutOptions) => RazorpayCheckoutInstance\r\n }\r\n}\r\n\r\n/** Razorpay Checkout.js options for subscription (in-page modal). */\r\nexport interface RazorpaySubscriptionCheckoutOptions {\r\n /** Razorpay key ID (e.g. from NEXT_PUBLIC_RAZORPAY_KEY_ID). */\r\n key: string\r\n /** Razorpay subscription ID (from create-or-update response when embed: true). */\r\n subscriptionId: string\r\n /** Called when payment succeeds; verify signature with verify-payment API. */\r\n handler: (response: RazorpayCheckoutSuccessPayload) => void\r\n /** Prefill name, email, contact. */\r\n prefill?: { name?: string; email?: string; contact?: string }\r\n name?: string\r\n description?: string\r\n image?: string\r\n theme?: { color?: string }\r\n /** Modal lifecycle (e.g. ondismiss when user closes without paying). */\r\n modal?: { ondismiss?: () => void }\r\n}\r\n\r\n/** Success payload from Razorpay Checkout (subscription). */\r\nexport type RazorpayCheckoutSuccessPayload = {\r\n razorpay_payment_id: string\r\n razorpay_subscription_id: string\r\n razorpay_signature: string\r\n}\r\n\r\ninterface RazorpayCheckoutOptions {\r\n key: string\r\n subscription_id: string\r\n handler: (response: RazorpayCheckoutSuccessPayload) => void\r\n prefill?: { name?: string; email?: string; contact?: string }\r\n name?: string\r\n description?: string\r\n image?: string\r\n theme?: { color?: string }\r\n modal?: { ondismiss?: () => void }\r\n}\r\n\r\ninterface RazorpayCheckoutInstance {\r\n open: () => void\r\n}\r\n\r\nlet scriptLoadPromise: Promise<void> | null = null\r\n\r\n/**\r\n * Load Razorpay Checkout.js script once. Call before openRazorpaySubscriptionCheckout\r\n * or pass it as the first step in your flow.\r\n */\r\nexport function loadRazorpayCheckoutScript(): Promise<void> {\r\n if (typeof window === 'undefined') {\r\n return Promise.reject(new Error('Razorpay Checkout runs only in the browser'))\r\n }\r\n if (window.Razorpay) {\r\n return Promise.resolve()\r\n }\r\n if (scriptLoadPromise) {\r\n return scriptLoadPromise\r\n }\r\n scriptLoadPromise = new Promise((resolve, reject) => {\r\n const script = document.createElement('script')\r\n script.src = CHECKOUT_SCRIPT_URL\r\n script.async = true\r\n script.onload = () => resolve()\r\n script.onerror = () => {\r\n scriptLoadPromise = null\r\n reject(new Error('Failed to load Razorpay Checkout script'))\r\n }\r\n document.head.appendChild(script)\r\n })\r\n return scriptLoadPromise\r\n}\r\n\r\n/**\r\n * Open Razorpay subscription checkout as a modal on the current page.\r\n * Loads the Checkout script if needed. Use with create-or-update subscription with embed: true;\r\n * pass the returned razorpaySubscriptionId.\r\n */\r\nexport async function openRazorpaySubscriptionCheckout(\r\n options: RazorpaySubscriptionCheckoutOptions\r\n): Promise<void> {\r\n if (typeof window === 'undefined') {\r\n throw new Error('Razorpay Checkout runs only in the browser')\r\n }\r\n if (!window.Razorpay) {\r\n await loadRazorpayCheckoutScript()\r\n }\r\n const Razorpay = window.Razorpay!\r\n const rzp = new Razorpay({\r\n key: options.key,\r\n subscription_id: options.subscriptionId,\r\n handler: options.handler,\r\n prefill: options.prefill,\r\n name: options.name,\r\n description: options.description,\r\n image: options.image,\r\n theme: options.theme,\r\n modal: options.modal,\r\n })\r\n rzp.open()\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../client/hooks.ts","../../client/checkout.ts"],"sourcesContent":["/**\r\n * React hooks for Razorpay subscription features using TanStack Query.\r\n * Wrap your app with <RazorpayAuthProvider client={authClient}> and use usePlans(), useSubscriptions(), etc. with no client argument.\r\n */\r\n\r\nimport { createContext, useContext, createElement, type ReactNode } from 'react'\r\nimport {\r\n useQuery,\r\n useMutation,\r\n useQueryClient,\r\n type UseQueryOptions,\r\n type UseMutationOptions,\r\n} from '@tanstack/react-query'\r\nimport type {\r\n RazorpayAuthClient,\r\n PlanSummary,\r\n CreateOrUpdateSubscriptionInput,\r\n CancelSubscriptionInput,\r\n RestoreSubscriptionInput,\r\n ListSubscriptionsInput,\r\n VerifyPaymentInput,\r\n GetPlansResponse,\r\n ListSubscriptionsResponse,\r\n CreateOrUpdateSubscriptionResponse,\r\n CancelSubscriptionResponse,\r\n RestoreSubscriptionResponse,\r\n VerifyPaymentResponse,\r\n RazorpayApiError,\r\n} from './types'\r\n\r\nconst BASE = '/razorpay'\r\n\r\nconst RAZORPAY_NO_CLIENT_MESSAGE =\r\n 'Razorpay hooks require wrapping your app with <RazorpayAuthProvider client={authClient}>.'\r\n\r\nconst RAZORPAY_NO_RAZORPAY_OR_API_MESSAGE =\r\n 'Razorpay hooks require a client created with razorpayClientPlugin() in createAuthClient({ plugins: [...] }).'\r\n\r\n/** Context holding the Razorpay-capable auth client. Default is null. */\r\nexport const RazorpayAuthContext = createContext<RazorpayAuthClient | null>(null)\r\n\r\n/** Provider that supplies the auth client to Razorpay hooks. Wrap your app once with client={authClient}. */\r\nexport function RazorpayAuthProvider({\r\n client,\r\n children,\r\n}: {\r\n client: RazorpayAuthClient | null\r\n children: ReactNode\r\n}) {\r\n return createElement(RazorpayAuthContext.Provider, { value: client }, children)\r\n}\r\n\r\n/** Returns the Razorpay-capable auth client from context, or null if not wrapped with RazorpayAuthProvider. */\r\nexport function useRazorpayAuthClient(): RazorpayAuthClient | null {\r\n return useContext(RazorpayAuthContext)\r\n}\r\n\r\nfunction requireRazorpayOrApi(client: RazorpayAuthClient): void {\r\n if (!client.razorpay && !client.api) {\r\n throw new Error(RAZORPAY_NO_RAZORPAY_OR_API_MESSAGE)\r\n }\r\n}\r\n\r\n/** Query keys for cache invalidation. */\r\nexport const razorpayQueryKeys = {\r\n all: ['razorpay'] as const,\r\n plans: () => [...razorpayQueryKeys.all, 'plans'] as const,\r\n /** Prefix for all subscription list queries (use when invalidating after payment verified, etc.). */\r\n subscriptionsList: () => [...razorpayQueryKeys.all, 'subscriptions'] as const,\r\n subscriptions: (referenceId?: string) =>\r\n [...razorpayQueryKeys.all, 'subscriptions', referenceId ?? 'me'] as const,\r\n}\r\n\r\nfunction assertSuccess<T>(res: unknown): asserts res is { success: true; data: T } {\r\n if (res && typeof res === 'object' && 'success' in res) {\r\n if ((res as { success: boolean }).success) return\r\n const err = res as RazorpayApiError\r\n throw new Error(err.error?.description ?? err.error?.code ?? 'Request failed')\r\n }\r\n throw new Error('Invalid response')\r\n}\r\n\r\n/** Fetch plans (GET /razorpay/get-plans). Prefers client.razorpay when available to avoid 404s. */\r\nasync function fetchPlans(client: RazorpayAuthClient): Promise<PlanSummary[]> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.getPlans()\r\n : await client.api!.get(`${BASE}/get-plans`)\r\n assertSuccess<PlanSummary[]>(res)\r\n return res.data\r\n}\r\n\r\n/** Fetch subscriptions list (GET /razorpay/subscription/list). Prefers client.razorpay when available. */\r\nasync function fetchSubscriptions(\r\n client: RazorpayAuthClient,\r\n input?: ListSubscriptionsInput\r\n): Promise<ListSubscriptionsResponse['data']> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.listSubscriptions(input)\r\n : (() => {\r\n const query: Record<string, string> = {}\r\n if (input?.referenceId) query.referenceId = input.referenceId\r\n const path = `${BASE}/subscription/list`\r\n return Object.keys(query).length > 0\r\n ? client.api!.get(path, { query })\r\n : client.api!.get(path)\r\n })()\r\n assertSuccess<ListSubscriptionsResponse['data']>(res)\r\n return res.data\r\n}\r\n\r\n/** Create or update subscription (POST /razorpay/subscription/create-or-update). Prefers client.razorpay when available. */\r\nasync function createOrUpdateSubscription(\r\n client: RazorpayAuthClient,\r\n input: CreateOrUpdateSubscriptionInput\r\n): Promise<CreateOrUpdateSubscriptionResponse['data']> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.createOrUpdateSubscription(input)\r\n : await client.api!.post(`${BASE}/subscription/create-or-update`, {\r\n body: input as unknown as Record<string, unknown>,\r\n })\r\n assertSuccess<CreateOrUpdateSubscriptionResponse['data']>(res)\r\n return res.data\r\n}\r\n\r\n/** Cancel subscription (POST /razorpay/subscription/cancel). Prefers client.razorpay when available. */\r\nasync function cancelSubscription(\r\n client: RazorpayAuthClient,\r\n input: CancelSubscriptionInput\r\n): Promise<CancelSubscriptionResponse['data']> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.cancelSubscription(input)\r\n : await client.api!.post(`${BASE}/subscription/cancel`, {\r\n body: input as unknown as Record<string, unknown>,\r\n })\r\n assertSuccess<CancelSubscriptionResponse['data']>(res)\r\n return res.data\r\n}\r\n\r\n/** Restore subscription (POST /razorpay/subscription/restore). Prefers client.razorpay when available. */\r\nasync function restoreSubscription(\r\n client: RazorpayAuthClient,\r\n input: RestoreSubscriptionInput\r\n): Promise<RestoreSubscriptionResponse['data']> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.restoreSubscription(input)\r\n : await client.api!.post(`${BASE}/subscription/restore`, {\r\n body: input as unknown as Record<string, unknown>,\r\n })\r\n assertSuccess<RestoreSubscriptionResponse['data']>(res)\r\n return res.data\r\n}\r\n\r\n/** Verify payment (POST /razorpay/verify-payment). Prefers client.razorpay when available. */\r\nasync function verifyPayment(\r\n client: RazorpayAuthClient,\r\n input: VerifyPaymentInput\r\n): Promise<VerifyPaymentResponse['data']> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.verifyPayment(input)\r\n : await client.api!.post(`${BASE}/verify-payment`, {\r\n body: input as unknown as Record<string, unknown>,\r\n })\r\n assertSuccess<VerifyPaymentResponse['data']>(res)\r\n return res.data\r\n}\r\n\r\nexport type UsePlansOptions = Omit<\r\n UseQueryOptions<PlanSummary[], Error, PlanSummary[], readonly string[]>,\r\n 'queryKey' | 'queryFn'\r\n>\r\n\r\n/**\r\n * Fetch configured subscription plans (no auth required).\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function usePlans(options?: UsePlansOptions) {\r\n const client = useRazorpayAuthClient()\r\n return useQuery({\r\n queryKey: razorpayQueryKeys.plans(),\r\n queryFn: () => fetchPlans(client!),\r\n enabled: !!client,\r\n ...options,\r\n })\r\n}\r\n\r\nexport type UseSubscriptionsOptions = Omit<\r\n UseQueryOptions<\r\n ListSubscriptionsResponse['data'],\r\n Error,\r\n ListSubscriptionsResponse['data'],\r\n readonly (string | undefined)[]\r\n >,\r\n 'queryKey' | 'queryFn'\r\n> & { referenceId?: string }\r\n\r\n/**\r\n * List active/trialing subscriptions for the current user (or referenceId).\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function useSubscriptions(\r\n input?: ListSubscriptionsInput,\r\n options?: UseSubscriptionsOptions\r\n) {\r\n const client = useRazorpayAuthClient()\r\n const { referenceId, ...queryOptions } = options ?? {}\r\n const refId = input?.referenceId ?? referenceId\r\n return useQuery({\r\n queryKey: razorpayQueryKeys.subscriptions(refId),\r\n queryFn: () => fetchSubscriptions(client!, input),\r\n enabled: !!client,\r\n ...queryOptions,\r\n })\r\n}\r\n\r\nexport type UseCreateOrUpdateSubscriptionOptions = UseMutationOptions<\r\n CreateOrUpdateSubscriptionResponse['data'],\r\n Error,\r\n CreateOrUpdateSubscriptionInput,\r\n unknown\r\n>\r\n\r\n/**\r\n * Create or update a subscription. With embed: true returns data for in-page modal (no checkoutUrl);\r\n * use openRazorpaySubscriptionCheckout with razorpaySubscriptionId. Without embed, returns checkoutUrl for redirect.\r\n * Invalidates subscriptions list on success.\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function useCreateOrUpdateSubscription(\r\n options?: UseCreateOrUpdateSubscriptionOptions\r\n) {\r\n const client = useRazorpayAuthClient()\r\n const queryClient = useQueryClient()\r\n return useMutation({\r\n mutationFn: (input: CreateOrUpdateSubscriptionInput) => {\r\n if (!client) throw new Error(RAZORPAY_NO_CLIENT_MESSAGE)\r\n return createOrUpdateSubscription(client, input)\r\n },\r\n ...options,\r\n onSuccess: (data, variables, onMutateResult, context) => {\r\n queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptions() })\r\n options?.onSuccess?.(data, variables, onMutateResult, context)\r\n },\r\n })\r\n}\r\n\r\nexport type UseCancelSubscriptionOptions = UseMutationOptions<\r\n CancelSubscriptionResponse['data'],\r\n Error,\r\n CancelSubscriptionInput,\r\n unknown\r\n>\r\n\r\n/**\r\n * Cancel a subscription by local subscription ID (at period end or immediately).\r\n * Invalidates subscriptions list on success.\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function useCancelSubscription(options?: UseCancelSubscriptionOptions) {\r\n const client = useRazorpayAuthClient()\r\n const queryClient = useQueryClient()\r\n return useMutation({\r\n mutationFn: (input: CancelSubscriptionInput) => {\r\n if (!client) throw new Error(RAZORPAY_NO_CLIENT_MESSAGE)\r\n return cancelSubscription(client, input)\r\n },\r\n ...options,\r\n onSuccess: (data, variables, onMutateResult, context) => {\r\n queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptions() })\r\n options?.onSuccess?.(data, variables, onMutateResult, context)\r\n },\r\n })\r\n}\r\n\r\nexport type UseRestoreSubscriptionOptions = UseMutationOptions<\r\n RestoreSubscriptionResponse['data'],\r\n Error,\r\n RestoreSubscriptionInput,\r\n unknown\r\n>\r\n\r\n// Re-export client types and in-page checkout helpers\r\nexport type {\r\n RazorpayAuthClient,\r\n RazorpayClientActions,\r\n PlanSummary,\r\n CreateOrUpdateSubscriptionInput,\r\n CancelSubscriptionInput,\r\n RestoreSubscriptionInput,\r\n ListSubscriptionsInput,\r\n VerifyPaymentInput,\r\n GetPlansResponse,\r\n ListSubscriptionsResponse,\r\n CreateOrUpdateSubscriptionResponse,\r\n CancelSubscriptionResponse,\r\n RestoreSubscriptionResponse,\r\n VerifyPaymentResponse,\r\n RazorpayApiError,\r\n RazorpayApiResult,\r\n} from './types'\r\nexport {\r\n loadRazorpayCheckoutScript,\r\n openRazorpaySubscriptionCheckout,\r\n type RazorpaySubscriptionCheckoutOptions,\r\n} from './checkout'\r\n\r\n/**\r\n * Restore a subscription that was scheduled to cancel at period end.\r\n * Invalidates subscriptions list on success.\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function useRestoreSubscription(options?: UseRestoreSubscriptionOptions) {\r\n const client = useRazorpayAuthClient()\r\n const queryClient = useQueryClient()\r\n return useMutation({\r\n mutationFn: (input: RestoreSubscriptionInput) => {\r\n if (!client) throw new Error(RAZORPAY_NO_CLIENT_MESSAGE)\r\n return restoreSubscription(client, input)\r\n },\r\n ...options,\r\n onSuccess: (data, variables, onMutateResult, context) => {\r\n queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptions() })\r\n options?.onSuccess?.(data, variables, onMutateResult, context)\r\n },\r\n })\r\n}\r\n\r\nexport type UseVerifyPaymentOptions = UseMutationOptions<\r\n VerifyPaymentResponse['data'],\r\n Error,\r\n VerifyPaymentInput,\r\n unknown\r\n>\r\n\r\n/**\r\n * Verify payment signature after Razorpay checkout success.\r\n * Call with the payload from the Razorpay success handler (razorpay_payment_id, razorpay_subscription_id, razorpay_signature).\r\n * Revalidates all subscription list queries on success.\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function useVerifyPayment(options?: UseVerifyPaymentOptions) {\r\n const client = useRazorpayAuthClient()\r\n const queryClient = useQueryClient()\r\n return useMutation({\r\n mutationFn: (input: VerifyPaymentInput) => {\r\n if (!client) throw new Error(RAZORPAY_NO_CLIENT_MESSAGE)\r\n return verifyPayment(client, input)\r\n },\r\n ...options,\r\n onSuccess: (data, variables, onMutateResult, context) => {\r\n queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptionsList() })\r\n options?.onSuccess?.(data, variables, onMutateResult, context)\r\n },\r\n })\r\n}\r\n","/**\r\n * In-page Razorpay subscription checkout (modal on your site).\r\n * Load the script once, then open the checkout with subscription_id from create-or-update (embed: true).\r\n */\r\n\r\nconst CHECKOUT_SCRIPT_URL = 'https://checkout.razorpay.com/v1/checkout.js'\r\n\r\ndeclare global {\r\n interface Window {\r\n Razorpay?: new (options: RazorpayCheckoutOptions) => RazorpayCheckoutInstance\r\n }\r\n}\r\n\r\n/** Razorpay Checkout.js options for subscription (in-page modal). */\r\nexport interface RazorpaySubscriptionCheckoutOptions {\r\n /** Razorpay key ID (e.g. from NEXT_PUBLIC_RAZORPAY_KEY_ID). */\r\n key: string\r\n /** Razorpay subscription ID (from create-or-update response when embed: true). */\r\n subscriptionId: string\r\n /** Called when payment succeeds; verify signature with verify-payment API. */\r\n handler: (response: RazorpayCheckoutSuccessPayload) => void\r\n /** Prefill name, email, contact. */\r\n prefill?: { name?: string; email?: string; contact?: string }\r\n name?: string\r\n description?: string\r\n image?: string\r\n theme?: { color?: string }\r\n /** Modal lifecycle (e.g. ondismiss when user closes without paying). */\r\n modal?: { ondismiss?: () => void }\r\n}\r\n\r\n/** Success payload from Razorpay Checkout (subscription). */\r\nexport type RazorpayCheckoutSuccessPayload = {\r\n razorpay_payment_id: string\r\n razorpay_subscription_id: string\r\n razorpay_signature: string\r\n}\r\n\r\ninterface RazorpayCheckoutOptions {\r\n key: string\r\n subscription_id: string\r\n handler: (response: RazorpayCheckoutSuccessPayload) => void\r\n prefill?: { name?: string; email?: string; contact?: string }\r\n name?: string\r\n description?: string\r\n image?: string\r\n theme?: { color?: string }\r\n modal?: { ondismiss?: () => void }\r\n}\r\n\r\ninterface RazorpayCheckoutInstance {\r\n open: () => void\r\n}\r\n\r\nlet scriptLoadPromise: Promise<void> | null = null\r\n\r\n/**\r\n * Load Razorpay Checkout.js script once. Call before openRazorpaySubscriptionCheckout\r\n * or pass it as the first step in your flow.\r\n */\r\nexport function loadRazorpayCheckoutScript(): Promise<void> {\r\n if (typeof window === 'undefined') {\r\n return Promise.reject(new Error('Razorpay Checkout runs only in the browser'))\r\n }\r\n if (window.Razorpay) {\r\n return Promise.resolve()\r\n }\r\n if (scriptLoadPromise) {\r\n return scriptLoadPromise\r\n }\r\n scriptLoadPromise = new Promise((resolve, reject) => {\r\n const script = document.createElement('script')\r\n script.src = CHECKOUT_SCRIPT_URL\r\n script.async = true\r\n script.onload = () => resolve()\r\n script.onerror = () => {\r\n scriptLoadPromise = null\r\n reject(new Error('Failed to load Razorpay Checkout script'))\r\n }\r\n document.head.appendChild(script)\r\n })\r\n return scriptLoadPromise\r\n}\r\n\r\n/**\r\n * Open Razorpay subscription checkout as a modal on the current page.\r\n * Loads the Checkout script if needed. Use with create-or-update subscription with embed: true;\r\n * pass the returned razorpaySubscriptionId.\r\n */\r\nexport async function openRazorpaySubscriptionCheckout(\r\n options: RazorpaySubscriptionCheckoutOptions\r\n): Promise<void> {\r\n if (typeof window === 'undefined') {\r\n throw new Error('Razorpay Checkout runs only in the browser')\r\n }\r\n if (!window.Razorpay) {\r\n await loadRazorpayCheckoutScript()\r\n }\r\n const Razorpay = window.Razorpay!\r\n const rzp = new Razorpay({\r\n key: options.key,\r\n subscription_id: options.subscriptionId,\r\n handler: options.handler,\r\n prefill: options.prefill,\r\n name: options.name,\r\n description: options.description,\r\n image: options.image,\r\n theme: options.theme,\r\n modal: options.modal,\r\n })\r\n rzp.open()\r\n}\r\n"],"mappings":"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","names":[]}
package/dist/client.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { S as SubscriptionRecord } from './types-CpjgfbVJ.js';
2
2
  import { razorpayPlugin } from './index.js';
3
- import { R as RazorpayApiResult, P as PlanSummary, L as ListSubscriptionsInput, C as CreateOrUpdateSubscriptionInput, a as CancelSubscriptionInput, b as RestoreSubscriptionInput, V as VerifyPaymentInput } from './types-I97EgC8r.js';
3
+ import { R as RazorpayApiResult, P as PlanSummary, L as ListSubscriptionsInput, C as CreateOrUpdateSubscriptionInput, a as CancelSubscriptionInput, b as RestoreSubscriptionInput, V as VerifyPaymentInput, c as VerifyPaymentResponse } from './types-G8p2fGwj.js';
4
4
  import 'razorpay';
5
5
  import 'better-auth';
6
6
 
@@ -38,11 +38,7 @@ declare const razorpayClientPlugin: () => {
38
38
  id: string;
39
39
  status: string;
40
40
  }>>;
41
- verifyPayment: (input: VerifyPaymentInput, fetchOptions?: Parameters<FetchFn>[1]) => Promise<RazorpayApiResult<{
42
- message: string;
43
- payment_id: string;
44
- subscription_id: string;
45
- }>>;
41
+ verifyPayment: (input: VerifyPaymentInput, fetchOptions?: Parameters<FetchFn>[1]) => Promise<RazorpayApiResult<VerifyPaymentResponse["data"]>>;
46
42
  };
47
43
  };
48
44
  };
package/dist/client.js CHANGED
@@ -51,13 +51,11 @@ var razorpayClientPlugin = () => ({
51
51
  ...fetchOptions
52
52
  })
53
53
  ),
54
- verifyPayment: async (input, fetchOptions) => unwrapBetterFetch(
55
- await $fetch(PATHS.verifyPayment, {
56
- method: "POST",
57
- body: input,
58
- ...fetchOptions
59
- })
60
- )
54
+ verifyPayment: async (input, fetchOptions) => $fetch(PATHS.verifyPayment, {
55
+ method: "POST",
56
+ body: input,
57
+ ...fetchOptions
58
+ })
61
59
  }
62
60
  })
63
61
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../client.ts"],"sourcesContent":["import type { BetterAuthClientPlugin } from 'better-auth/client'\nimport type { razorpayPlugin } from './index'\nimport type {\n PlanSummary,\n CreateOrUpdateSubscriptionInput,\n CancelSubscriptionInput,\n RestoreSubscriptionInput,\n ListSubscriptionsInput,\n VerifyPaymentInput,\n ListSubscriptionsResponse,\n CreateOrUpdateSubscriptionResponse,\n CancelSubscriptionResponse,\n RestoreSubscriptionResponse,\n VerifyPaymentResponse,\n RazorpayApiResult,\n} from './client/types'\n\ntype FetchFn = (\n path: string,\n options?: {\n method?: string\n body?: Record<string, unknown>\n query?: Record<string, string>\n }\n) => Promise<RazorpayApiResult<unknown>>\n\nconst PATHS = {\n getPlans: '/razorpay/get-plans',\n listSubscriptions: '/razorpay/subscription/list',\n createOrUpdateSubscription: '/razorpay/subscription/create-or-update',\n cancelSubscription: '/razorpay/subscription/cancel',\n restoreSubscription: '/razorpay/subscription/restore',\n verifyPayment: '/razorpay/verify-payment',\n} as const\n\n/**\n * Unwrap Better Auth $fetch result { data, error } into the API body.\n * Success: return res.data (API body: { success, data }).\n * Otherwise return res so errors and non–Better Fetch responses propagate.\n */\nfunction unwrapBetterFetch<T>(res: unknown): T {\n if (\n res != null &&\n typeof res === 'object' &&\n 'data' in res &&\n (res as { error?: unknown }).error == null\n ) {\n return (res as { data: T }).data\n }\n return res as T\n}\n\n/**\n * Razorpay client plugin for Better Auth.\n * Exposes authClient.razorpay.* so requests use the correct paths and avoid 404s from api.get/post.\n * Unwraps Better Auth's { data, error } so callers get the API body shape ({ success, data } / { success: false, error }).\n * Add to createAuthClient: plugins: [razorpayClientPlugin()]\n */\nexport const razorpayClientPlugin = () =>\n ({\n id: 'razorpay-plugin',\n $InferServerPlugin: {} as ReturnType<typeof razorpayPlugin>,\n getActions: ($fetch: FetchFn) => ({\n razorpay: {\n getPlans: async (fetchOptions?: Parameters<FetchFn>[1]) =>\n unwrapBetterFetch<RazorpayApiResult<PlanSummary[]>>(\n await $fetch(PATHS.getPlans, { method: 'GET', ...fetchOptions })\n ),\n\n listSubscriptions: async (\n input?: ListSubscriptionsInput,\n fetchOptions?: Parameters<FetchFn>[1]\n ) =>\n unwrapBetterFetch<RazorpayApiResult<ListSubscriptionsResponse['data']>>(\n await $fetch(PATHS.listSubscriptions, {\n method: 'GET',\n query: input?.referenceId ? { referenceId: input.referenceId } : undefined,\n ...fetchOptions,\n })\n ),\n\n createOrUpdateSubscription: async (\n input: CreateOrUpdateSubscriptionInput,\n fetchOptions?: Parameters<FetchFn>[1]\n ) =>\n unwrapBetterFetch<\n RazorpayApiResult<CreateOrUpdateSubscriptionResponse['data']>\n >(\n await $fetch(PATHS.createOrUpdateSubscription, {\n method: 'POST',\n body: input as unknown as Record<string, unknown>,\n ...fetchOptions,\n })\n ),\n\n cancelSubscription: async (\n input: CancelSubscriptionInput,\n fetchOptions?: Parameters<FetchFn>[1]\n ) =>\n unwrapBetterFetch<RazorpayApiResult<CancelSubscriptionResponse['data']>>(\n await $fetch(PATHS.cancelSubscription, {\n method: 'POST',\n body: input as unknown as Record<string, unknown>,\n ...fetchOptions,\n })\n ),\n\n restoreSubscription: async (\n input: RestoreSubscriptionInput,\n fetchOptions?: Parameters<FetchFn>[1]\n ) =>\n unwrapBetterFetch<RazorpayApiResult<RestoreSubscriptionResponse['data']>>(\n await $fetch(PATHS.restoreSubscription, {\n method: 'POST',\n body: input as unknown as Record<string, unknown>,\n ...fetchOptions,\n })\n ),\n\n verifyPayment: async (\n input: VerifyPaymentInput,\n fetchOptions?: Parameters<FetchFn>[1]\n ) =>\n unwrapBetterFetch<RazorpayApiResult<VerifyPaymentResponse['data']>>(\n await $fetch(PATHS.verifyPayment, {\n method: 'POST',\n body: input as unknown as Record<string, unknown>,\n ...fetchOptions,\n })\n ),\n },\n }),\n }) satisfies BetterAuthClientPlugin\n"],"mappings":";;;AA0BA,IAAM,QAAQ;AAAA,EACZ,UAAU;AAAA,EACV,mBAAmB;AAAA,EACnB,4BAA4B;AAAA,EAC5B,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,eAAe;AACjB;AAOA,SAAS,kBAAqB,KAAiB;AAC7C,MACE,OAAO,QACP,OAAO,QAAQ,YACf,UAAU,OACT,IAA4B,SAAS,MACtC;AACA,WAAQ,IAAoB;AAAA,EAC9B;AACA,SAAO;AACT;AAQO,IAAM,uBAAuB,OACjC;AAAA,EACC,IAAI;AAAA,EACJ,oBAAoB,CAAC;AAAA,EACrB,YAAY,CAAC,YAAqB;AAAA,IAChC,UAAU;AAAA,MACR,UAAU,OAAO,iBACf;AAAA,QACE,MAAM,OAAO,MAAM,UAAU,EAAE,QAAQ,OAAO,GAAG,aAAa,CAAC;AAAA,MACjE;AAAA,MAEF,mBAAmB,OACjB,OACA,iBAEA;AAAA,QACE,MAAM,OAAO,MAAM,mBAAmB;AAAA,UACpC,QAAQ;AAAA,UACR,OAAO,OAAO,cAAc,EAAE,aAAa,MAAM,YAAY,IAAI;AAAA,UACjE,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,MAEF,4BAA4B,OAC1B,OACA,iBAEA;AAAA,QAGE,MAAM,OAAO,MAAM,4BAA4B;AAAA,UAC7C,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,MAEF,oBAAoB,OAClB,OACA,iBAEA;AAAA,QACE,MAAM,OAAO,MAAM,oBAAoB;AAAA,UACrC,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,MAEF,qBAAqB,OACnB,OACA,iBAEA;AAAA,QACE,MAAM,OAAO,MAAM,qBAAqB;AAAA,UACtC,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,MAEF,eAAe,OACb,OACA,iBAEA;AAAA,QACE,MAAM,OAAO,MAAM,eAAe;AAAA,UAChC,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,IACJ;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../client.ts"],"sourcesContent":["import type { BetterAuthClientPlugin } from 'better-auth/client'\nimport type { razorpayPlugin } from './index'\nimport type {\n PlanSummary,\n CreateOrUpdateSubscriptionInput,\n CancelSubscriptionInput,\n RestoreSubscriptionInput,\n ListSubscriptionsInput,\n VerifyPaymentInput,\n ListSubscriptionsResponse,\n CreateOrUpdateSubscriptionResponse,\n CancelSubscriptionResponse,\n RestoreSubscriptionResponse,\n VerifyPaymentResponse,\n RazorpayApiResult,\n} from './client/types'\n\ntype FetchFn = (\n path: string,\n options?: {\n method?: string\n body?: Record<string, unknown>\n query?: Record<string, string>\n }\n) => Promise<RazorpayApiResult<unknown>>\n\nconst PATHS = {\n getPlans: '/razorpay/get-plans',\n listSubscriptions: '/razorpay/subscription/list',\n createOrUpdateSubscription: '/razorpay/subscription/create-or-update',\n cancelSubscription: '/razorpay/subscription/cancel',\n restoreSubscription: '/razorpay/subscription/restore',\n verifyPayment: '/razorpay/verify-payment',\n} as const\n\n/**\n * Unwrap Better Auth $fetch result { data, error } into the API body.\n * Success: return res.data (API body: { success, data }).\n * Otherwise return res so errors and non–Better Fetch responses propagate.\n */\nfunction unwrapBetterFetch<T>(res: unknown): T {\n if (\n res != null &&\n typeof res === 'object' &&\n 'data' in res &&\n (res as { error?: unknown }).error == null\n ) {\n return (res as { data: T }).data\n }\n return res as T\n}\n\n/**\n * Razorpay client plugin for Better Auth.\n * Exposes authClient.razorpay.* so requests use the correct paths and avoid 404s from api.get/post.\n * Unwraps Better Auth's { data, error } so callers get the API body shape ({ success, data } / { success: false, error }).\n * Add to createAuthClient: plugins: [razorpayClientPlugin()]\n */\nexport const razorpayClientPlugin = () =>\n ({\n id: 'razorpay-plugin',\n $InferServerPlugin: {} as ReturnType<typeof razorpayPlugin>,\n getActions: ($fetch: FetchFn) => ({\n razorpay: {\n getPlans: async (fetchOptions?: Parameters<FetchFn>[1]) =>\n unwrapBetterFetch<RazorpayApiResult<PlanSummary[]>>(\n await $fetch(PATHS.getPlans, { method: 'GET', ...fetchOptions })\n ),\n\n listSubscriptions: async (\n input?: ListSubscriptionsInput,\n fetchOptions?: Parameters<FetchFn>[1]\n ) =>\n unwrapBetterFetch<RazorpayApiResult<ListSubscriptionsResponse['data']>>(\n await $fetch(PATHS.listSubscriptions, {\n method: 'GET',\n query: input?.referenceId ? { referenceId: input.referenceId } : undefined,\n ...fetchOptions,\n })\n ),\n\n createOrUpdateSubscription: async (\n input: CreateOrUpdateSubscriptionInput,\n fetchOptions?: Parameters<FetchFn>[1]\n ) =>\n unwrapBetterFetch<\n RazorpayApiResult<CreateOrUpdateSubscriptionResponse['data']>\n >(\n await $fetch(PATHS.createOrUpdateSubscription, {\n method: 'POST',\n body: input as unknown as Record<string, unknown>,\n ...fetchOptions,\n })\n ),\n\n cancelSubscription: async (\n input: CancelSubscriptionInput,\n fetchOptions?: Parameters<FetchFn>[1]\n ) =>\n unwrapBetterFetch<RazorpayApiResult<CancelSubscriptionResponse['data']>>(\n await $fetch(PATHS.cancelSubscription, {\n method: 'POST',\n body: input as unknown as Record<string, unknown>,\n ...fetchOptions,\n })\n ),\n\n restoreSubscription: async (\n input: RestoreSubscriptionInput,\n fetchOptions?: Parameters<FetchFn>[1]\n ) =>\n unwrapBetterFetch<RazorpayApiResult<RestoreSubscriptionResponse['data']>>(\n await $fetch(PATHS.restoreSubscription, {\n method: 'POST',\n body: input as unknown as Record<string, unknown>,\n ...fetchOptions,\n })\n ),\n\n verifyPayment: async (\n input: VerifyPaymentInput,\n fetchOptions?: Parameters<FetchFn>[1]\n ): Promise<RazorpayApiResult<VerifyPaymentResponse['data']>> =>\n $fetch(PATHS.verifyPayment, {\n method: 'POST',\n body: input as unknown as Record<string, unknown>,\n ...fetchOptions,\n }) as Promise<RazorpayApiResult<VerifyPaymentResponse['data']>>,\n },\n }),\n }) satisfies BetterAuthClientPlugin\n"],"mappings":";;;AA0BA,IAAM,QAAQ;AAAA,EACZ,UAAU;AAAA,EACV,mBAAmB;AAAA,EACnB,4BAA4B;AAAA,EAC5B,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,eAAe;AACjB;AAOA,SAAS,kBAAqB,KAAiB;AAC7C,MACE,OAAO,QACP,OAAO,QAAQ,YACf,UAAU,OACT,IAA4B,SAAS,MACtC;AACA,WAAQ,IAAoB;AAAA,EAC9B;AACA,SAAO;AACT;AAQO,IAAM,uBAAuB,OACjC;AAAA,EACC,IAAI;AAAA,EACJ,oBAAoB,CAAC;AAAA,EACrB,YAAY,CAAC,YAAqB;AAAA,IAChC,UAAU;AAAA,MACR,UAAU,OAAO,iBACf;AAAA,QACE,MAAM,OAAO,MAAM,UAAU,EAAE,QAAQ,OAAO,GAAG,aAAa,CAAC;AAAA,MACjE;AAAA,MAEF,mBAAmB,OACjB,OACA,iBAEA;AAAA,QACE,MAAM,OAAO,MAAM,mBAAmB;AAAA,UACpC,QAAQ;AAAA,UACR,OAAO,OAAO,cAAc,EAAE,aAAa,MAAM,YAAY,IAAI;AAAA,UACjE,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,MAEF,4BAA4B,OAC1B,OACA,iBAEA;AAAA,QAGE,MAAM,OAAO,MAAM,4BAA4B;AAAA,UAC7C,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,MAEF,oBAAoB,OAClB,OACA,iBAEA;AAAA,QACE,MAAM,OAAO,MAAM,oBAAoB;AAAA,UACrC,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,MAEF,qBAAqB,OACnB,OACA,iBAEA;AAAA,QACE,MAAM,OAAO,MAAM,qBAAqB;AAAA,UACtC,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,MAEF,eAAe,OACb,OACA,iBAEA,OAAO,MAAM,eAAe;AAAA,QAC1B,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,GAAG;AAAA,MACL,CAAC;AAAA,IACL;AAAA,EACF;AACF;","names":[]}
@@ -151,4 +151,4 @@ interface VerifyPaymentResponse {
151
151
  };
152
152
  }
153
153
 
154
- export type { CreateOrUpdateSubscriptionInput as C, GetPlansResponse as G, ListSubscriptionsInput as L, PlanSummary as P, RazorpayApiResult as R, VerifyPaymentInput as V, CancelSubscriptionInput as a, RestoreSubscriptionInput as b, RazorpayAuthClient as c, CancelSubscriptionResponse as d, CreateOrUpdateSubscriptionResponse as e, RestoreSubscriptionResponse as f, ListSubscriptionsResponse as g, VerifyPaymentResponse as h, RazorpayApiError as i, RazorpayClientActions as j };
154
+ export type { CreateOrUpdateSubscriptionInput as C, GetPlansResponse as G, ListSubscriptionsInput as L, PlanSummary as P, RazorpayApiResult as R, VerifyPaymentInput as V, CancelSubscriptionInput as a, RestoreSubscriptionInput as b, VerifyPaymentResponse as c, RazorpayAuthClient as d, CancelSubscriptionResponse as e, CreateOrUpdateSubscriptionResponse as f, RestoreSubscriptionResponse as g, ListSubscriptionsResponse as h, RazorpayApiError as i, RazorpayClientActions as j };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deiondz/better-auth-razorpay",
3
- "version": "2.0.18",
3
+ "version": "2.0.20",
4
4
  "description": "Better Auth plugin for Razorpay subscriptions and payments",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",