@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 +20 -14
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-PZ5AY32C.js.map +1 -0
- package/dist/client/hooks.d.ts +87 -0
- package/dist/client/hooks.js +182 -0
- package/dist/client/hooks.js.map +1 -0
- package/dist/client.d.ts +32 -0
- package/dist/client.js +49 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.js +4921 -0
- package/dist/index.js.map +1 -0
- package/dist/types-B25gyPpX.d.ts +208 -0
- package/dist/types-JYoruGio.d.ts +146 -0
- package/package.json +17 -18
- package/api/cancel-subscription.ts +0 -90
- package/api/create-or-update-subscription.ts +0 -254
- package/api/get-plans.ts +0 -36
- package/api/index.ts +0 -7
- package/api/list-subscriptions.ts +0 -79
- package/api/restore-subscription.ts +0 -79
- package/api/verify-payment.ts +0 -87
- package/api/webhook.ts +0 -305
- package/client/hooks.ts +0 -305
- package/client/types.ts +0 -152
- package/client.ts +0 -105
- package/index.ts +0 -162
- package/lib/error-handler.ts +0 -99
- package/lib/index.ts +0 -28
- package/lib/schemas.ts +0 -34
- package/lib/types.ts +0 -207
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
|
|
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
|
|
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
|
-
<
|
|
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(
|
|
772
|
+
const { data: plans, isLoading: plansLoading } = usePlans()
|
|
770
773
|
|
|
771
774
|
// Current user's subscriptions (requires session)
|
|
772
|
-
const { data: subscriptions, isLoading: subsLoading } = useSubscriptions(
|
|
775
|
+
const { data: subscriptions, isLoading: subsLoading } = useSubscriptions()
|
|
773
776
|
|
|
774
|
-
const createOrUpdate = useCreateOrUpdateSubscription(
|
|
775
|
-
const cancel = useCancelSubscription(
|
|
776
|
-
const restore = useRestoreSubscription(
|
|
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(
|
|
825
|
-
| `useSubscriptions(
|
|
826
|
-
| `useCreateOrUpdateSubscription(
|
|
827
|
-
| `useCancelSubscription(
|
|
828
|
-
| `useRestoreSubscription(
|
|
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
|
-
-
|
|
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 @@
|
|
|
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":"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","names":[]}
|
package/dist/client.d.ts
ADDED
|
@@ -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":[]}
|
package/dist/index.d.ts
ADDED
|
@@ -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 };
|