@deiondz/better-auth-razorpay 2.0.4 → 2.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -725,7 +725,7 @@ type User = typeof authClient.$Infer.Session.user
725
725
 
726
726
  ## TanStack Query Hooks
727
727
 
728
- The plugin works with **TanStack Query**. We provide optional pre-built hooks that accept your auth client; when you use `razorpayClientPlugin()`, the hooks call `authClient.razorpay.*` so requests hit the correct paths. If you prefer a different setup, use `authClient.razorpay.getPlans()`, `authClient.razorpay.createOrUpdateSubscription(...)`, etc., or build your own hooks around those methods.
728
+ The plugin works with **TanStack Query**. We provide optional pre-built hooks that get the auth client from React context; wrap your app once with **`<RazorpayAuthProvider client={authClient}>`** and use **`usePlans()`**, **`useSubscriptions()`**, etc. with **no client argument**. When you use `razorpayClientPlugin()`, the hooks call `authClient.razorpay.*` so requests hit the correct paths. If you prefer a different setup, use `authClient.razorpay.getPlans()`, `authClient.razorpay.createOrUpdateSubscription(...)`, etc., or build your own hooks around those methods.
729
729
 
730
730
  To use our pre-built hooks, install peer dependencies:
731
731
 
@@ -734,13 +734,14 @@ npm install @tanstack/react-query react
734
734
  # or yarn / pnpm / bun
735
735
  ```
736
736
 
737
- Import from `@deiondz/better-auth-razorpay/hooks` and pass your Better Auth client as the first argument:
737
+ Import from `@deiondz/better-auth-razorpay/hooks` and wrap your app with **`RazorpayAuthProvider`** so hooks can read the client from context:
738
738
 
739
739
  ```tsx
740
740
  import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
741
741
  import { createAuthClient } from 'better-auth/react'
742
742
  import { razorpayClientPlugin } from '@deiondz/better-auth-razorpay/client'
743
743
  import {
744
+ RazorpayAuthProvider,
744
745
  usePlans,
745
746
  useSubscriptions,
746
747
  useCreateOrUpdateSubscription,
@@ -759,21 +760,23 @@ const authClient = createAuthClient<typeof auth>({
759
760
  function App() {
760
761
  return (
761
762
  <QueryClientProvider client={queryClient}>
762
- <SubscriptionUI />
763
+ <RazorpayAuthProvider client={authClient}>
764
+ <SubscriptionUI />
765
+ </RazorpayAuthProvider>
763
766
  </QueryClientProvider>
764
767
  )
765
768
  }
766
769
 
767
770
  function SubscriptionUI() {
768
771
  // Plans (no auth required)
769
- const { data: plans, isLoading: plansLoading } = usePlans(authClient)
772
+ const { data: plans, isLoading: plansLoading } = usePlans()
770
773
 
771
774
  // Current user's subscriptions (requires session)
772
- const { data: subscriptions, isLoading: subsLoading } = useSubscriptions(authClient)
775
+ const { data: subscriptions, isLoading: subsLoading } = useSubscriptions()
773
776
 
774
- const createOrUpdate = useCreateOrUpdateSubscription(authClient)
775
- const cancel = useCancelSubscription(authClient)
776
- const restore = useRestoreSubscription(authClient)
777
+ const createOrUpdate = useCreateOrUpdateSubscription()
778
+ const cancel = useCancelSubscription()
779
+ const restore = useRestoreSubscription()
777
780
 
778
781
  const handleSubscribe = () => {
779
782
  createOrUpdate.mutate(
@@ -821,11 +824,11 @@ function SubscriptionUI() {
821
824
 
822
825
  | Hook | Type | Description |
823
826
  |------|------|-------------|
824
- | `usePlans(client, options?)` | `useQuery` | Fetches configured plans (GET `/razorpay/get-plans`). |
825
- | `useSubscriptions(client, input?, options?)` | `useQuery` | Lists active/trialing subscriptions (GET `/razorpay/subscription/list`). Optional `referenceId` in input or options. |
826
- | `useCreateOrUpdateSubscription(client, options?)` | `useMutation` | Creates or updates subscription; returns `checkoutUrl`. Invalidates subscriptions list on success. |
827
- | `useCancelSubscription(client, options?)` | `useMutation` | Cancels by local subscription ID; optional `immediately`. Invalidates subscriptions list on success. |
828
- | `useRestoreSubscription(client, options?)` | `useMutation` | Restores a subscription scheduled to cancel. Invalidates subscriptions list on success. |
827
+ | `usePlans(options?)` | `useQuery` | Fetches configured plans (GET `/razorpay/get-plans`). Requires `RazorpayAuthProvider` above in the tree. |
828
+ | `useSubscriptions(input?, options?)` | `useQuery` | Lists active/trialing subscriptions (GET `/razorpay/subscription/list`). Optional `referenceId` in input or options. Requires `RazorpayAuthProvider`. |
829
+ | `useCreateOrUpdateSubscription(options?)` | `useMutation` | Creates or updates subscription; returns `checkoutUrl`. Invalidates subscriptions list on success. Requires `RazorpayAuthProvider`. |
830
+ | `useCancelSubscription(options?)` | `useMutation` | Cancels by local subscription ID; optional `immediately`. Invalidates subscriptions list on success. Requires `RazorpayAuthProvider`. |
831
+ | `useRestoreSubscription(options?)` | `useMutation` | Restores a subscription scheduled to cancel. Invalidates subscriptions list on success. Requires `RazorpayAuthProvider`. |
829
832
 
830
833
  **Query keys** (for manual invalidation or prefetching):
831
834
 
@@ -1381,7 +1384,10 @@ async function initializeRazorpayCheckout(subscriptionId: string) {
1381
1384
  **1. "POST /api/auth/api/get 404" or Razorpay requests returning 404**
1382
1385
  - Add the **client plugin** to your auth client: `createAuthClient({ plugins: [razorpayClientPlugin(), ...] })`
1383
1386
  - Use **method-based API** instead of `authClient.api.get/post`: call `authClient.razorpay.getPlans()`, `authClient.razorpay.createOrUpdateSubscription(...)`, etc., so requests use the plugin’s route map and hit the correct paths
1384
- - The TanStack hooks (`usePlans`, `useSubscriptions`, etc.) use `authClient.razorpay` when present, so they work correctly once the client plugin is added
1387
+ - Wrap your app with **`<RazorpayAuthProvider client={authClient}>`** so hooks get the client from context; use **`usePlans()`**, **`useSubscriptions()`**, etc. with no client argument
1388
+ - The TanStack hooks use `authClient.razorpay` when present, so they work correctly once the client plugin is added
1389
+
1390
+ **For maintainers:** See [Razorpay plugin × Better Auth client (problem and solution)](docs/BETTER_AUTH_CLIENT_CONTEXT.md) for the 404/TypeScript root cause and plugin-side fixes.
1385
1391
 
1386
1392
  **2. "Plan not found in configured plans"**
1387
1393
  - Ensure the plan ID exists in Razorpay dashboard
@@ -0,0 +1,10 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, { get: all[name], enumerable: true });
5
+ };
6
+
7
+ export {
8
+ __export
9
+ };
10
+ //# sourceMappingURL=chunk-PZ5AY32C.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,87 @@
1
+ import { S as SubscriptionRecord } from '../types-B25gyPpX.js';
2
+ import * as _tanstack_react_query from '@tanstack/react-query';
3
+ import { UseMutationOptions, UseQueryOptions } from '@tanstack/react-query';
4
+ import * as react from 'react';
5
+ import { ReactNode } from 'react';
6
+ import { h as RazorpayAuthClient, d as CancelSubscriptionResponse, c as CancelSubscriptionInput, b as CreateOrUpdateSubscriptionResponse, C as CreateOrUpdateSubscriptionInput, P as PlanSummary, f as RestoreSubscriptionResponse, e as RestoreSubscriptionInput, a as ListSubscriptionsResponse, g as VerifyPaymentResponse, V as VerifyPaymentInput, L as ListSubscriptionsInput } from '../types-JYoruGio.js';
7
+ export { G as GetPlansResponse, i as RazorpayApiError, R as RazorpayApiResult, j as RazorpayClientActions } from '../types-JYoruGio.js';
8
+ import 'razorpay';
9
+
10
+ /** Context holding the Razorpay-capable auth client. Default is null. */
11
+ declare const RazorpayAuthContext: react.Context<RazorpayAuthClient | null>;
12
+ /** Provider that supplies the auth client to Razorpay hooks. Wrap your app once with client={authClient}. */
13
+ declare function RazorpayAuthProvider({ client, children, }: {
14
+ client: RazorpayAuthClient | null;
15
+ children: ReactNode;
16
+ }): react.FunctionComponentElement<react.ProviderProps<RazorpayAuthClient | null>>;
17
+ /** Returns the Razorpay-capable auth client from context, or null if not wrapped with RazorpayAuthProvider. */
18
+ declare function useRazorpayAuthClient(): RazorpayAuthClient | null;
19
+ /** Query keys for cache invalidation. */
20
+ declare const razorpayQueryKeys: {
21
+ all: readonly ["razorpay"];
22
+ plans: () => readonly ["razorpay", "plans"];
23
+ subscriptions: (referenceId?: string) => readonly ["razorpay", "subscriptions", string];
24
+ };
25
+ type UsePlansOptions = Omit<UseQueryOptions<PlanSummary[], Error, PlanSummary[], readonly string[]>, 'queryKey' | 'queryFn'>;
26
+ /**
27
+ * Fetch configured subscription plans (no auth required).
28
+ * Requires RazorpayAuthProvider above in the tree.
29
+ */
30
+ declare function usePlans(options?: UsePlansOptions): _tanstack_react_query.UseQueryResult<PlanSummary[], Error>;
31
+ type UseSubscriptionsOptions = Omit<UseQueryOptions<ListSubscriptionsResponse['data'], Error, ListSubscriptionsResponse['data'], readonly (string | undefined)[]>, 'queryKey' | 'queryFn'> & {
32
+ referenceId?: string;
33
+ };
34
+ /**
35
+ * List active/trialing subscriptions for the current user (or referenceId).
36
+ * Requires RazorpayAuthProvider above in the tree.
37
+ */
38
+ declare function useSubscriptions(input?: ListSubscriptionsInput, options?: UseSubscriptionsOptions): _tanstack_react_query.UseQueryResult<SubscriptionRecord[], Error>;
39
+ type UseCreateOrUpdateSubscriptionOptions = UseMutationOptions<CreateOrUpdateSubscriptionResponse['data'], Error, CreateOrUpdateSubscriptionInput, unknown>;
40
+ /**
41
+ * Create or update a subscription. Returns checkoutUrl for Razorpay payment page.
42
+ * Invalidates subscriptions list on success.
43
+ * Requires RazorpayAuthProvider above in the tree.
44
+ */
45
+ declare function useCreateOrUpdateSubscription(options?: UseCreateOrUpdateSubscriptionOptions): _tanstack_react_query.UseMutationResult<{
46
+ checkoutUrl: string;
47
+ subscriptionId: string;
48
+ razorpaySubscriptionId: string;
49
+ }, Error, CreateOrUpdateSubscriptionInput, unknown>;
50
+ type UseCancelSubscriptionOptions = UseMutationOptions<CancelSubscriptionResponse['data'], Error, CancelSubscriptionInput, unknown>;
51
+ /**
52
+ * Cancel a subscription by local subscription ID (at period end or immediately).
53
+ * Invalidates subscriptions list on success.
54
+ * Requires RazorpayAuthProvider above in the tree.
55
+ */
56
+ declare function useCancelSubscription(options?: UseCancelSubscriptionOptions): _tanstack_react_query.UseMutationResult<{
57
+ id: string;
58
+ status: string;
59
+ plan_id: string;
60
+ current_end?: number;
61
+ ended_at?: number | null;
62
+ }, Error, CancelSubscriptionInput, unknown>;
63
+ type UseRestoreSubscriptionOptions = UseMutationOptions<RestoreSubscriptionResponse['data'], Error, RestoreSubscriptionInput, unknown>;
64
+
65
+ /**
66
+ * Restore a subscription that was scheduled to cancel at period end.
67
+ * Invalidates subscriptions list on success.
68
+ * Requires RazorpayAuthProvider above in the tree.
69
+ */
70
+ declare function useRestoreSubscription(options?: UseRestoreSubscriptionOptions): _tanstack_react_query.UseMutationResult<{
71
+ id: string;
72
+ status: string;
73
+ }, Error, RestoreSubscriptionInput, unknown>;
74
+ type UseVerifyPaymentOptions = UseMutationOptions<VerifyPaymentResponse['data'], Error, VerifyPaymentInput, unknown>;
75
+ /**
76
+ * Verify payment signature after Razorpay checkout success.
77
+ * Call with the payload from the Razorpay success handler (razorpay_payment_id, razorpay_subscription_id, razorpay_signature).
78
+ * Invalidates subscriptions list on success.
79
+ * Requires RazorpayAuthProvider above in the tree.
80
+ */
81
+ declare function useVerifyPayment(options?: UseVerifyPaymentOptions): _tanstack_react_query.UseMutationResult<{
82
+ message: string;
83
+ payment_id: string;
84
+ subscription_id: string;
85
+ }, Error, VerifyPaymentInput, unknown>;
86
+
87
+ export { CancelSubscriptionInput, CancelSubscriptionResponse, CreateOrUpdateSubscriptionInput, CreateOrUpdateSubscriptionResponse, ListSubscriptionsInput, ListSubscriptionsResponse, PlanSummary, RazorpayAuthClient, RazorpayAuthContext, RazorpayAuthProvider, RestoreSubscriptionInput, RestoreSubscriptionResponse, type UseCancelSubscriptionOptions, type UseCreateOrUpdateSubscriptionOptions, type UsePlansOptions, type UseRestoreSubscriptionOptions, type UseSubscriptionsOptions, type UseVerifyPaymentOptions, VerifyPaymentInput, VerifyPaymentResponse, razorpayQueryKeys, useCancelSubscription, useCreateOrUpdateSubscription, usePlans, useRazorpayAuthClient, useRestoreSubscription, useSubscriptions, useVerifyPayment };
@@ -0,0 +1,182 @@
1
+ import "../chunk-PZ5AY32C.js";
2
+
3
+ // client/hooks.ts
4
+ import { createContext, useContext, createElement } from "react";
5
+ import {
6
+ useQuery,
7
+ useMutation,
8
+ useQueryClient
9
+ } from "@tanstack/react-query";
10
+ var BASE = "/razorpay";
11
+ var RAZORPAY_NO_CLIENT_MESSAGE = "Razorpay hooks require wrapping your app with <RazorpayAuthProvider client={authClient}>.";
12
+ var RAZORPAY_NO_RAZORPAY_OR_API_MESSAGE = "Razorpay hooks require a client created with razorpayClientPlugin() in createAuthClient({ plugins: [...] }).";
13
+ var RazorpayAuthContext = createContext(null);
14
+ function RazorpayAuthProvider({
15
+ client,
16
+ children
17
+ }) {
18
+ return createElement(RazorpayAuthContext.Provider, { value: client }, children);
19
+ }
20
+ function useRazorpayAuthClient() {
21
+ return useContext(RazorpayAuthContext);
22
+ }
23
+ function requireRazorpayOrApi(client) {
24
+ if (!client.razorpay && !client.api) {
25
+ throw new Error(RAZORPAY_NO_RAZORPAY_OR_API_MESSAGE);
26
+ }
27
+ }
28
+ var razorpayQueryKeys = {
29
+ all: ["razorpay"],
30
+ plans: () => [...razorpayQueryKeys.all, "plans"],
31
+ subscriptions: (referenceId) => [...razorpayQueryKeys.all, "subscriptions", referenceId ?? "me"]
32
+ };
33
+ function assertSuccess(res) {
34
+ if (res && typeof res === "object" && "success" in res) {
35
+ if (res.success) return;
36
+ const err = res;
37
+ throw new Error(err.error?.description ?? err.error?.code ?? "Request failed");
38
+ }
39
+ throw new Error("Invalid response");
40
+ }
41
+ async function fetchPlans(client) {
42
+ requireRazorpayOrApi(client);
43
+ const res = client.razorpay ? await client.razorpay.getPlans() : await client.api.get(`${BASE}/get-plans`);
44
+ assertSuccess(res);
45
+ return res.data;
46
+ }
47
+ async function fetchSubscriptions(client, input) {
48
+ requireRazorpayOrApi(client);
49
+ const res = client.razorpay ? await client.razorpay.listSubscriptions(input) : (() => {
50
+ const query = {};
51
+ if (input?.referenceId) query.referenceId = input.referenceId;
52
+ const path = `${BASE}/subscription/list`;
53
+ return Object.keys(query).length > 0 ? client.api.get(path, { query }) : client.api.get(path);
54
+ })();
55
+ assertSuccess(res);
56
+ return res.data;
57
+ }
58
+ async function createOrUpdateSubscription(client, input) {
59
+ requireRazorpayOrApi(client);
60
+ const res = client.razorpay ? await client.razorpay.createOrUpdateSubscription(input) : await client.api.post(`${BASE}/subscription/create-or-update`, {
61
+ body: input
62
+ });
63
+ assertSuccess(res);
64
+ return res.data;
65
+ }
66
+ async function cancelSubscription(client, input) {
67
+ requireRazorpayOrApi(client);
68
+ const res = client.razorpay ? await client.razorpay.cancelSubscription(input) : await client.api.post(`${BASE}/subscription/cancel`, {
69
+ body: input
70
+ });
71
+ assertSuccess(res);
72
+ return res.data;
73
+ }
74
+ async function restoreSubscription(client, input) {
75
+ requireRazorpayOrApi(client);
76
+ const res = client.razorpay ? await client.razorpay.restoreSubscription(input) : await client.api.post(`${BASE}/subscription/restore`, {
77
+ body: input
78
+ });
79
+ assertSuccess(res);
80
+ return res.data;
81
+ }
82
+ async function verifyPayment(client, input) {
83
+ requireRazorpayOrApi(client);
84
+ const res = client.razorpay ? await client.razorpay.verifyPayment(input) : await client.api.post(`${BASE}/verify-payment`, {
85
+ body: input
86
+ });
87
+ assertSuccess(res);
88
+ return res.data;
89
+ }
90
+ function usePlans(options) {
91
+ const client = useRazorpayAuthClient();
92
+ return useQuery({
93
+ queryKey: razorpayQueryKeys.plans(),
94
+ queryFn: () => fetchPlans(client),
95
+ enabled: !!client,
96
+ ...options
97
+ });
98
+ }
99
+ function useSubscriptions(input, options) {
100
+ const client = useRazorpayAuthClient();
101
+ const { referenceId, ...queryOptions } = options ?? {};
102
+ const refId = input?.referenceId ?? referenceId;
103
+ return useQuery({
104
+ queryKey: razorpayQueryKeys.subscriptions(refId),
105
+ queryFn: () => fetchSubscriptions(client, input),
106
+ enabled: !!client,
107
+ ...queryOptions
108
+ });
109
+ }
110
+ function useCreateOrUpdateSubscription(options) {
111
+ const client = useRazorpayAuthClient();
112
+ const queryClient = useQueryClient();
113
+ return useMutation({
114
+ mutationFn: (input) => {
115
+ if (!client) throw new Error(RAZORPAY_NO_CLIENT_MESSAGE);
116
+ return createOrUpdateSubscription(client, input);
117
+ },
118
+ ...options,
119
+ onSuccess: (data, variables, onMutateResult, context) => {
120
+ queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptions() });
121
+ options?.onSuccess?.(data, variables, onMutateResult, context);
122
+ }
123
+ });
124
+ }
125
+ function useCancelSubscription(options) {
126
+ const client = useRazorpayAuthClient();
127
+ const queryClient = useQueryClient();
128
+ return useMutation({
129
+ mutationFn: (input) => {
130
+ if (!client) throw new Error(RAZORPAY_NO_CLIENT_MESSAGE);
131
+ return cancelSubscription(client, input);
132
+ },
133
+ ...options,
134
+ onSuccess: (data, variables, onMutateResult, context) => {
135
+ queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptions() });
136
+ options?.onSuccess?.(data, variables, onMutateResult, context);
137
+ }
138
+ });
139
+ }
140
+ function useRestoreSubscription(options) {
141
+ const client = useRazorpayAuthClient();
142
+ const queryClient = useQueryClient();
143
+ return useMutation({
144
+ mutationFn: (input) => {
145
+ if (!client) throw new Error(RAZORPAY_NO_CLIENT_MESSAGE);
146
+ return restoreSubscription(client, input);
147
+ },
148
+ ...options,
149
+ onSuccess: (data, variables, onMutateResult, context) => {
150
+ queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptions() });
151
+ options?.onSuccess?.(data, variables, onMutateResult, context);
152
+ }
153
+ });
154
+ }
155
+ function useVerifyPayment(options) {
156
+ const client = useRazorpayAuthClient();
157
+ const queryClient = useQueryClient();
158
+ return useMutation({
159
+ mutationFn: (input) => {
160
+ if (!client) throw new Error(RAZORPAY_NO_CLIENT_MESSAGE);
161
+ return verifyPayment(client, input);
162
+ },
163
+ ...options,
164
+ onSuccess: (data, variables, onMutateResult, context) => {
165
+ queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptions() });
166
+ options?.onSuccess?.(data, variables, onMutateResult, context);
167
+ }
168
+ });
169
+ }
170
+ export {
171
+ RazorpayAuthContext,
172
+ RazorpayAuthProvider,
173
+ razorpayQueryKeys,
174
+ useCancelSubscription,
175
+ useCreateOrUpdateSubscription,
176
+ usePlans,
177
+ useRazorpayAuthClient,
178
+ useRestoreSubscription,
179
+ useSubscriptions,
180
+ useVerifyPayment
181
+ };
182
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../client/hooks.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. Returns checkoutUrl for Razorpay payment page.\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 for convenience when importing from this entry\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\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"],"mappings":";;;AAKA,SAAS,eAAe,YAAY,qBAAqC;AACzE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAkBP,IAAM,OAAO;AAEb,IAAM,6BACJ;AAEF,IAAM,sCACJ;AAGK,IAAM,sBAAsB,cAAyC,IAAI;AAGzE,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AACF,GAGG;AACD,SAAO,cAAc,oBAAoB,UAAU,EAAE,OAAO,OAAO,GAAG,QAAQ;AAChF;AAGO,SAAS,wBAAmD;AACjE,SAAO,WAAW,mBAAmB;AACvC;AAEA,SAAS,qBAAqB,QAAkC;AAC9D,MAAI,CAAC,OAAO,YAAY,CAAC,OAAO,KAAK;AACnC,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AACF;AAGO,IAAM,oBAAoB;AAAA,EAC/B,KAAK,CAAC,UAAU;AAAA,EAChB,OAAO,MAAM,CAAC,GAAG,kBAAkB,KAAK,OAAO;AAAA,EAC/C,eAAe,CAAC,gBACd,CAAC,GAAG,kBAAkB,KAAK,iBAAiB,eAAe,IAAI;AACnE;AAEA,SAAS,cAAiB,KAAyD;AACjF,MAAI,OAAO,OAAO,QAAQ,YAAY,aAAa,KAAK;AACtD,QAAK,IAA6B,QAAS;AAC3C,UAAM,MAAM;AACZ,UAAM,IAAI,MAAM,IAAI,OAAO,eAAe,IAAI,OAAO,QAAQ,gBAAgB;AAAA,EAC/E;AACA,QAAM,IAAI,MAAM,kBAAkB;AACpC;AAGA,eAAe,WAAW,QAAoD;AAC5E,uBAAqB,MAAM;AAC3B,QAAM,MAAM,OAAO,WACf,MAAM,OAAO,SAAS,SAAS,IAC/B,MAAM,OAAO,IAAK,IAAI,GAAG,IAAI,YAAY;AAC7C,gBAA6B,GAAG;AAChC,SAAO,IAAI;AACb;AAGA,eAAe,mBACb,QACA,OAC4C;AAC5C,uBAAqB,MAAM;AAC3B,QAAM,MAAM,OAAO,WACf,MAAM,OAAO,SAAS,kBAAkB,KAAK,KAC5C,MAAM;AACP,UAAM,QAAgC,CAAC;AACvC,QAAI,OAAO,YAAa,OAAM,cAAc,MAAM;AAClD,UAAM,OAAO,GAAG,IAAI;AACpB,WAAO,OAAO,KAAK,KAAK,EAAE,SAAS,IAC/B,OAAO,IAAK,IAAI,MAAM,EAAE,MAAM,CAAC,IAC/B,OAAO,IAAK,IAAI,IAAI;AAAA,EAC1B,GAAG;AACL,gBAAiD,GAAG;AACpD,SAAO,IAAI;AACb;AAGA,eAAe,2BACb,QACA,OACqD;AACrD,uBAAqB,MAAM;AAC3B,QAAM,MAAM,OAAO,WACf,MAAM,OAAO,SAAS,2BAA2B,KAAK,IACtD,MAAM,OAAO,IAAK,KAAK,GAAG,IAAI,kCAAkC;AAAA,IAChE,MAAM;AAAA,EACR,CAAC;AACH,gBAA0D,GAAG;AAC7D,SAAO,IAAI;AACb;AAGA,eAAe,mBACb,QACA,OAC6C;AAC7C,uBAAqB,MAAM;AAC3B,QAAM,MAAM,OAAO,WACf,MAAM,OAAO,SAAS,mBAAmB,KAAK,IAC9C,MAAM,OAAO,IAAK,KAAK,GAAG,IAAI,wBAAwB;AAAA,IACtD,MAAM;AAAA,EACR,CAAC;AACH,gBAAkD,GAAG;AACrD,SAAO,IAAI;AACb;AAGA,eAAe,oBACb,QACA,OAC8C;AAC9C,uBAAqB,MAAM;AAC3B,QAAM,MAAM,OAAO,WACf,MAAM,OAAO,SAAS,oBAAoB,KAAK,IAC/C,MAAM,OAAO,IAAK,KAAK,GAAG,IAAI,yBAAyB;AAAA,IACvD,MAAM;AAAA,EACR,CAAC;AACH,gBAAmD,GAAG;AACtD,SAAO,IAAI;AACb;AAGA,eAAe,cACb,QACA,OACwC;AACxC,uBAAqB,MAAM;AAC3B,QAAM,MAAM,OAAO,WACf,MAAM,OAAO,SAAS,cAAc,KAAK,IACzC,MAAM,OAAO,IAAK,KAAK,GAAG,IAAI,mBAAmB;AAAA,IACjD,MAAM;AAAA,EACR,CAAC;AACH,gBAA6C,GAAG;AAChD,SAAO,IAAI;AACb;AAWO,SAAS,SAAS,SAA2B;AAClD,QAAM,SAAS,sBAAsB;AACrC,SAAO,SAAS;AAAA,IACd,UAAU,kBAAkB,MAAM;AAAA,IAClC,SAAS,MAAM,WAAW,MAAO;AAAA,IACjC,SAAS,CAAC,CAAC;AAAA,IACX,GAAG;AAAA,EACL,CAAC;AACH;AAgBO,SAAS,iBACd,OACA,SACA;AACA,QAAM,SAAS,sBAAsB;AACrC,QAAM,EAAE,aAAa,GAAG,aAAa,IAAI,WAAW,CAAC;AACrD,QAAM,QAAQ,OAAO,eAAe;AACpC,SAAO,SAAS;AAAA,IACd,UAAU,kBAAkB,cAAc,KAAK;AAAA,IAC/C,SAAS,MAAM,mBAAmB,QAAS,KAAK;AAAA,IAChD,SAAS,CAAC,CAAC;AAAA,IACX,GAAG;AAAA,EACL,CAAC;AACH;AAcO,SAAS,8BACd,SACA;AACA,QAAM,SAAS,sBAAsB;AACrC,QAAM,cAAc,eAAe;AACnC,SAAO,YAAY;AAAA,IACjB,YAAY,CAAC,UAA2C;AACtD,UAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,0BAA0B;AACvD,aAAO,2BAA2B,QAAQ,KAAK;AAAA,IACjD;AAAA,IACA,GAAG;AAAA,IACH,WAAW,CAAC,MAAM,WAAW,gBAAgB,YAAY;AACvD,kBAAY,kBAAkB,EAAE,UAAU,kBAAkB,cAAc,EAAE,CAAC;AAC7E,eAAS,YAAY,MAAM,WAAW,gBAAgB,OAAO;AAAA,IAC/D;AAAA,EACF,CAAC;AACH;AAcO,SAAS,sBAAsB,SAAwC;AAC5E,QAAM,SAAS,sBAAsB;AACrC,QAAM,cAAc,eAAe;AACnC,SAAO,YAAY;AAAA,IACjB,YAAY,CAAC,UAAmC;AAC9C,UAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,0BAA0B;AACvD,aAAO,mBAAmB,QAAQ,KAAK;AAAA,IACzC;AAAA,IACA,GAAG;AAAA,IACH,WAAW,CAAC,MAAM,WAAW,gBAAgB,YAAY;AACvD,kBAAY,kBAAkB,EAAE,UAAU,kBAAkB,cAAc,EAAE,CAAC;AAC7E,eAAS,YAAY,MAAM,WAAW,gBAAgB,OAAO;AAAA,IAC/D;AAAA,EACF,CAAC;AACH;AAkCO,SAAS,uBAAuB,SAAyC;AAC9E,QAAM,SAAS,sBAAsB;AACrC,QAAM,cAAc,eAAe;AACnC,SAAO,YAAY;AAAA,IACjB,YAAY,CAAC,UAAoC;AAC/C,UAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,0BAA0B;AACvD,aAAO,oBAAoB,QAAQ,KAAK;AAAA,IAC1C;AAAA,IACA,GAAG;AAAA,IACH,WAAW,CAAC,MAAM,WAAW,gBAAgB,YAAY;AACvD,kBAAY,kBAAkB,EAAE,UAAU,kBAAkB,cAAc,EAAE,CAAC;AAC7E,eAAS,YAAY,MAAM,WAAW,gBAAgB,OAAO;AAAA,IAC/D;AAAA,EACF,CAAC;AACH;AAeO,SAAS,iBAAiB,SAAmC;AAClE,QAAM,SAAS,sBAAsB;AACrC,QAAM,cAAc,eAAe;AACnC,SAAO,YAAY;AAAA,IACjB,YAAY,CAAC,UAA8B;AACzC,UAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,0BAA0B;AACvD,aAAO,cAAc,QAAQ,KAAK;AAAA,IACpC;AAAA,IACA,GAAG;AAAA,IACH,WAAW,CAAC,MAAM,WAAW,gBAAgB,YAAY;AACvD,kBAAY,kBAAkB,EAAE,UAAU,kBAAkB,cAAc,EAAE,CAAC;AAC7E,eAAS,YAAY,MAAM,WAAW,gBAAgB,OAAO;AAAA,IAC/D;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,32 @@
1
+ import { razorpayPlugin } from './index.js';
2
+ import { R as RazorpayApiResult, P as PlanSummary, L as ListSubscriptionsInput, a as ListSubscriptionsResponse, C as CreateOrUpdateSubscriptionInput, b as CreateOrUpdateSubscriptionResponse, c as CancelSubscriptionInput, d as CancelSubscriptionResponse, e as RestoreSubscriptionInput, f as RestoreSubscriptionResponse, V as VerifyPaymentInput, g as VerifyPaymentResponse } from './types-JYoruGio.js';
3
+ import 'better-auth';
4
+ import './types-B25gyPpX.js';
5
+ import 'razorpay';
6
+
7
+ type FetchFn = (path: string, options?: {
8
+ method?: string;
9
+ body?: Record<string, unknown>;
10
+ query?: Record<string, string>;
11
+ }) => Promise<RazorpayApiResult<unknown>>;
12
+ /**
13
+ * Razorpay client plugin for Better Auth.
14
+ * Exposes authClient.razorpay.* so requests use the correct paths and avoid 404s from api.get/post.
15
+ * Add to createAuthClient: plugins: [razorpayClientPlugin()]
16
+ */
17
+ declare const razorpayClientPlugin: () => {
18
+ id: "razorpay-plugin";
19
+ $InferServerPlugin: ReturnType<typeof razorpayPlugin>;
20
+ getActions: ($fetch: FetchFn) => {
21
+ razorpay: {
22
+ getPlans: (fetchOptions?: Parameters<FetchFn>[1]) => Promise<RazorpayApiResult<PlanSummary[]>>;
23
+ listSubscriptions: (input?: ListSubscriptionsInput, fetchOptions?: Parameters<FetchFn>[1]) => Promise<RazorpayApiResult<ListSubscriptionsResponse["data"]>>;
24
+ createOrUpdateSubscription: (input: CreateOrUpdateSubscriptionInput, fetchOptions?: Parameters<FetchFn>[1]) => Promise<RazorpayApiResult<CreateOrUpdateSubscriptionResponse["data"]>>;
25
+ cancelSubscription: (input: CancelSubscriptionInput, fetchOptions?: Parameters<FetchFn>[1]) => Promise<RazorpayApiResult<CancelSubscriptionResponse["data"]>>;
26
+ restoreSubscription: (input: RestoreSubscriptionInput, fetchOptions?: Parameters<FetchFn>[1]) => Promise<RazorpayApiResult<RestoreSubscriptionResponse["data"]>>;
27
+ verifyPayment: (input: VerifyPaymentInput, fetchOptions?: Parameters<FetchFn>[1]) => Promise<RazorpayApiResult<VerifyPaymentResponse["data"]>>;
28
+ };
29
+ };
30
+ };
31
+
32
+ export { razorpayClientPlugin };
package/dist/client.js ADDED
@@ -0,0 +1,49 @@
1
+ import "./chunk-PZ5AY32C.js";
2
+
3
+ // client.ts
4
+ var PATHS = {
5
+ getPlans: "/razorpay/get-plans",
6
+ listSubscriptions: "/razorpay/subscription/list",
7
+ createOrUpdateSubscription: "/razorpay/subscription/create-or-update",
8
+ cancelSubscription: "/razorpay/subscription/cancel",
9
+ restoreSubscription: "/razorpay/subscription/restore",
10
+ verifyPayment: "/razorpay/verify-payment"
11
+ };
12
+ var razorpayClientPlugin = () => ({
13
+ id: "razorpay-plugin",
14
+ $InferServerPlugin: {},
15
+ getActions: ($fetch) => ({
16
+ razorpay: {
17
+ getPlans: (fetchOptions) => $fetch(PATHS.getPlans, { method: "GET", ...fetchOptions }),
18
+ listSubscriptions: (input, fetchOptions) => $fetch(PATHS.listSubscriptions, {
19
+ method: "GET",
20
+ query: input?.referenceId ? { referenceId: input.referenceId } : void 0,
21
+ ...fetchOptions
22
+ }),
23
+ createOrUpdateSubscription: (input, fetchOptions) => $fetch(PATHS.createOrUpdateSubscription, {
24
+ method: "POST",
25
+ body: input,
26
+ ...fetchOptions
27
+ }),
28
+ cancelSubscription: (input, fetchOptions) => $fetch(PATHS.cancelSubscription, {
29
+ method: "POST",
30
+ body: input,
31
+ ...fetchOptions
32
+ }),
33
+ restoreSubscription: (input, fetchOptions) => $fetch(PATHS.restoreSubscription, {
34
+ method: "POST",
35
+ body: input,
36
+ ...fetchOptions
37
+ }),
38
+ verifyPayment: (input, fetchOptions) => $fetch(PATHS.verifyPayment, {
39
+ method: "POST",
40
+ body: input,
41
+ ...fetchOptions
42
+ })
43
+ }
44
+ })
45
+ });
46
+ export {
47
+ razorpayClientPlugin
48
+ };
49
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../client.ts"],"sourcesContent":["import type { BetterAuthClientPlugin } from 'better-auth/client'\r\nimport type { razorpayPlugin } from './index'\r\nimport type {\r\n PlanSummary,\r\n CreateOrUpdateSubscriptionInput,\r\n CancelSubscriptionInput,\r\n RestoreSubscriptionInput,\r\n ListSubscriptionsInput,\r\n VerifyPaymentInput,\r\n ListSubscriptionsResponse,\r\n CreateOrUpdateSubscriptionResponse,\r\n CancelSubscriptionResponse,\r\n RestoreSubscriptionResponse,\r\n VerifyPaymentResponse,\r\n RazorpayApiResult,\r\n} from './client/types'\r\n\r\ntype FetchFn = (\r\n path: string,\r\n options?: {\r\n method?: string\r\n body?: Record<string, unknown>\r\n query?: Record<string, string>\r\n }\r\n) => Promise<RazorpayApiResult<unknown>>\r\n\r\nconst PATHS = {\r\n getPlans: '/razorpay/get-plans',\r\n listSubscriptions: '/razorpay/subscription/list',\r\n createOrUpdateSubscription: '/razorpay/subscription/create-or-update',\r\n cancelSubscription: '/razorpay/subscription/cancel',\r\n restoreSubscription: '/razorpay/subscription/restore',\r\n verifyPayment: '/razorpay/verify-payment',\r\n} as const\r\n\r\n/**\r\n * Razorpay client plugin for Better Auth.\r\n * Exposes authClient.razorpay.* so requests use the correct paths and avoid 404s from api.get/post.\r\n * Add to createAuthClient: plugins: [razorpayClientPlugin()]\r\n */\r\nexport const razorpayClientPlugin = () =>\r\n ({\r\n id: 'razorpay-plugin',\r\n $InferServerPlugin: {} as ReturnType<typeof razorpayPlugin>,\r\n getActions: ($fetch: FetchFn) => ({\r\n razorpay: {\r\n getPlans: (fetchOptions?: Parameters<FetchFn>[1]) =>\r\n $fetch(PATHS.getPlans, { method: 'GET', ...fetchOptions }) as Promise<\r\n RazorpayApiResult<PlanSummary[]>\r\n >,\r\n\r\n listSubscriptions: (\r\n input?: ListSubscriptionsInput,\r\n fetchOptions?: Parameters<FetchFn>[1]\r\n ) =>\r\n $fetch(PATHS.listSubscriptions, {\r\n method: 'GET',\r\n query: input?.referenceId ? { referenceId: input.referenceId } : undefined,\r\n ...fetchOptions,\r\n }) as Promise<RazorpayApiResult<ListSubscriptionsResponse['data']>>,\r\n\r\n createOrUpdateSubscription: (\r\n input: CreateOrUpdateSubscriptionInput,\r\n fetchOptions?: Parameters<FetchFn>[1]\r\n ) =>\r\n $fetch(PATHS.createOrUpdateSubscription, {\r\n method: 'POST',\r\n body: input as unknown as Record<string, unknown>,\r\n ...fetchOptions,\r\n }) as Promise<\r\n RazorpayApiResult<CreateOrUpdateSubscriptionResponse['data']>\r\n >,\r\n\r\n cancelSubscription: (\r\n input: CancelSubscriptionInput,\r\n fetchOptions?: Parameters<FetchFn>[1]\r\n ) =>\r\n $fetch(PATHS.cancelSubscription, {\r\n method: 'POST',\r\n body: input as unknown as Record<string, unknown>,\r\n ...fetchOptions,\r\n }) as Promise<RazorpayApiResult<CancelSubscriptionResponse['data']>>,\r\n\r\n restoreSubscription: (\r\n input: RestoreSubscriptionInput,\r\n fetchOptions?: Parameters<FetchFn>[1]\r\n ) =>\r\n $fetch(PATHS.restoreSubscription, {\r\n method: 'POST',\r\n body: input as unknown as Record<string, unknown>,\r\n ...fetchOptions,\r\n }) as Promise<RazorpayApiResult<RestoreSubscriptionResponse['data']>>,\r\n\r\n verifyPayment: (\r\n input: VerifyPaymentInput,\r\n fetchOptions?: Parameters<FetchFn>[1]\r\n ) =>\r\n $fetch(PATHS.verifyPayment, {\r\n method: 'POST',\r\n body: input as unknown as Record<string, unknown>,\r\n ...fetchOptions,\r\n }) as Promise<RazorpayApiResult<VerifyPaymentResponse['data']>>,\r\n },\r\n }),\r\n }) satisfies BetterAuthClientPlugin\r\n"],"mappings":";;;AA0BA,IAAM,QAAQ;AAAA,EACZ,UAAU;AAAA,EACV,mBAAmB;AAAA,EACnB,4BAA4B;AAAA,EAC5B,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,eAAe;AACjB;AAOO,IAAM,uBAAuB,OACjC;AAAA,EACC,IAAI;AAAA,EACJ,oBAAoB,CAAC;AAAA,EACrB,YAAY,CAAC,YAAqB;AAAA,IAChC,UAAU;AAAA,MACR,UAAU,CAAC,iBACT,OAAO,MAAM,UAAU,EAAE,QAAQ,OAAO,GAAG,aAAa,CAAC;AAAA,MAI3D,mBAAmB,CACjB,OACA,iBAEA,OAAO,MAAM,mBAAmB;AAAA,QAC9B,QAAQ;AAAA,QACR,OAAO,OAAO,cAAc,EAAE,aAAa,MAAM,YAAY,IAAI;AAAA,QACjE,GAAG;AAAA,MACL,CAAC;AAAA,MAEH,4BAA4B,CAC1B,OACA,iBAEA,OAAO,MAAM,4BAA4B;AAAA,QACvC,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,GAAG;AAAA,MACL,CAAC;AAAA,MAIH,oBAAoB,CAClB,OACA,iBAEA,OAAO,MAAM,oBAAoB;AAAA,QAC/B,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,GAAG;AAAA,MACL,CAAC;AAAA,MAEH,qBAAqB,CACnB,OACA,iBAEA,OAAO,MAAM,qBAAqB;AAAA,QAChC,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,GAAG;AAAA,MACL,CAAC;AAAA,MAEH,eAAe,CACb,OACA,iBAEA,OAAO,MAAM,eAAe;AAAA,QAC1B,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,GAAG;AAAA,MACL,CAAC;AAAA,IACL;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,32 @@
1
+ import { BetterAuthPlugin } from 'better-auth';
2
+ import { R as RazorpayPluginOptions } from './types-B25gyPpX.js';
3
+ export { O as OnWebhookEventCallback, a as RazorpayApiResponse, b as RazorpayErrorResponse, c as RazorpayPlan, d as RazorpaySubscription, e as RazorpaySuccessResponse, f as RazorpayUserRecord, g as RazorpayWebhookContext, h as RazorpayWebhookEvent, i as RazorpayWebhookPayload, S as SubscriptionRecord, j as SubscriptionStatus } from './types-B25gyPpX.js';
4
+ import 'razorpay';
5
+
6
+ interface WebhookResult {
7
+ success: boolean;
8
+ message?: string;
9
+ }
10
+
11
+ /**
12
+ * Razorpay plugin for Better Auth.
13
+ *
14
+ * Aligns with the subscription flow from the community plugin:
15
+ * - Subscription: create-or-update (checkout URL), cancel, restore, list
16
+ * - Customer: optional creation on sign-up, callbacks and params
17
+ * - Webhooks: subscription events (activated, cancelled, expired, etc.) with optional callbacks
18
+ * - Plans: named plans with monthly/annual IDs, limits, free trial
19
+ *
20
+ * @param options - Plugin configuration
21
+ * @param options.razorpayClient - Initialized Razorpay instance (key_id, key_secret)
22
+ * @param options.razorpayWebhookSecret - Webhook secret for signature verification
23
+ * @param options.razorpayKeySecret - API key secret for payment signature verification (optional; when set, enables POST /razorpay/verify-payment)
24
+ * @param options.createCustomerOnSignUp - Create Razorpay customer when user signs up (default: false)
25
+ * @param options.onCustomerCreate - Callback after customer is created
26
+ * @param options.getCustomerCreateParams - Custom params when creating customer
27
+ * @param options.subscription - Subscription config (enabled, plans, callbacks, authorizeReference)
28
+ * @param options.onEvent - Global callback for all webhook events
29
+ */
30
+ declare const razorpayPlugin: (options: RazorpayPluginOptions) => BetterAuthPlugin;
31
+
32
+ export { RazorpayPluginOptions, type WebhookResult, razorpayPlugin };