@deiondz/better-auth-razorpay 2.0.5 → 2.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/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 +50 -0
- package/dist/client.js +67 -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-C0_Sreb6.d.ts +146 -0
- package/package.json +67 -68
- 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 -352
- package/client/types.ts +0 -154
- 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
|
@@ -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 { c as RazorpayAuthClient, d as CancelSubscriptionResponse, a as CancelSubscriptionInput, e as CreateOrUpdateSubscriptionResponse, C as CreateOrUpdateSubscriptionInput, P as PlanSummary, f as RestoreSubscriptionResponse, b as RestoreSubscriptionInput, g as ListSubscriptionsResponse, h as VerifyPaymentResponse, V as VerifyPaymentInput, L as ListSubscriptionsInput } from '../types-C0_Sreb6.js';
|
|
7
|
+
export { G as GetPlansResponse, i as RazorpayApiError, R as RazorpayApiResult, j as RazorpayClientActions } from '../types-C0_Sreb6.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,50 @@
|
|
|
1
|
+
import { S as SubscriptionRecord } from './types-B25gyPpX.js';
|
|
2
|
+
import { razorpayPlugin } from './index.js';
|
|
3
|
+
import { R as RazorpayApiResult, P as PlanSummary, L as ListSubscriptionsInput, C as CreateOrUpdateSubscriptionInput, a as CancelSubscriptionInput, b as RestoreSubscriptionInput, V as VerifyPaymentInput } from './types-C0_Sreb6.js';
|
|
4
|
+
import 'razorpay';
|
|
5
|
+
import 'better-auth';
|
|
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
|
+
* Unwraps Better Auth's { data, error } so callers get the API body shape ({ success, data } / { success: false, error }).
|
|
16
|
+
* Add to createAuthClient: plugins: [razorpayClientPlugin()]
|
|
17
|
+
*/
|
|
18
|
+
declare const razorpayClientPlugin: () => {
|
|
19
|
+
id: "razorpay-plugin";
|
|
20
|
+
$InferServerPlugin: ReturnType<typeof razorpayPlugin>;
|
|
21
|
+
getActions: ($fetch: FetchFn) => {
|
|
22
|
+
razorpay: {
|
|
23
|
+
getPlans: (fetchOptions?: Parameters<FetchFn>[1]) => Promise<RazorpayApiResult<PlanSummary[]>>;
|
|
24
|
+
listSubscriptions: (input?: ListSubscriptionsInput, fetchOptions?: Parameters<FetchFn>[1]) => Promise<RazorpayApiResult<SubscriptionRecord[]>>;
|
|
25
|
+
createOrUpdateSubscription: (input: CreateOrUpdateSubscriptionInput, fetchOptions?: Parameters<FetchFn>[1]) => Promise<RazorpayApiResult<{
|
|
26
|
+
checkoutUrl: string;
|
|
27
|
+
subscriptionId: string;
|
|
28
|
+
razorpaySubscriptionId: string;
|
|
29
|
+
}>>;
|
|
30
|
+
cancelSubscription: (input: CancelSubscriptionInput, fetchOptions?: Parameters<FetchFn>[1]) => Promise<RazorpayApiResult<{
|
|
31
|
+
id: string;
|
|
32
|
+
status: string;
|
|
33
|
+
plan_id: string;
|
|
34
|
+
current_end?: number;
|
|
35
|
+
ended_at?: number | null;
|
|
36
|
+
}>>;
|
|
37
|
+
restoreSubscription: (input: RestoreSubscriptionInput, fetchOptions?: Parameters<FetchFn>[1]) => Promise<RazorpayApiResult<{
|
|
38
|
+
id: string;
|
|
39
|
+
status: string;
|
|
40
|
+
}>>;
|
|
41
|
+
verifyPayment: (input: VerifyPaymentInput, fetchOptions?: Parameters<FetchFn>[1]) => Promise<RazorpayApiResult<{
|
|
42
|
+
message: string;
|
|
43
|
+
payment_id: string;
|
|
44
|
+
subscription_id: string;
|
|
45
|
+
}>>;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export { razorpayClientPlugin };
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
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
|
+
function unwrapBetterFetch(res) {
|
|
13
|
+
if (res != null && typeof res === "object" && "data" in res && res.error == null) {
|
|
14
|
+
return res.data;
|
|
15
|
+
}
|
|
16
|
+
return res;
|
|
17
|
+
}
|
|
18
|
+
var razorpayClientPlugin = () => ({
|
|
19
|
+
id: "razorpay-plugin",
|
|
20
|
+
$InferServerPlugin: {},
|
|
21
|
+
getActions: ($fetch) => ({
|
|
22
|
+
razorpay: {
|
|
23
|
+
getPlans: async (fetchOptions) => unwrapBetterFetch(
|
|
24
|
+
await $fetch(PATHS.getPlans, { method: "GET", ...fetchOptions })
|
|
25
|
+
),
|
|
26
|
+
listSubscriptions: async (input, fetchOptions) => unwrapBetterFetch(
|
|
27
|
+
await $fetch(PATHS.listSubscriptions, {
|
|
28
|
+
method: "GET",
|
|
29
|
+
query: input?.referenceId ? { referenceId: input.referenceId } : void 0,
|
|
30
|
+
...fetchOptions
|
|
31
|
+
})
|
|
32
|
+
),
|
|
33
|
+
createOrUpdateSubscription: async (input, fetchOptions) => unwrapBetterFetch(
|
|
34
|
+
await $fetch(PATHS.createOrUpdateSubscription, {
|
|
35
|
+
method: "POST",
|
|
36
|
+
body: input,
|
|
37
|
+
...fetchOptions
|
|
38
|
+
})
|
|
39
|
+
),
|
|
40
|
+
cancelSubscription: async (input, fetchOptions) => unwrapBetterFetch(
|
|
41
|
+
await $fetch(PATHS.cancelSubscription, {
|
|
42
|
+
method: "POST",
|
|
43
|
+
body: input,
|
|
44
|
+
...fetchOptions
|
|
45
|
+
})
|
|
46
|
+
),
|
|
47
|
+
restoreSubscription: async (input, fetchOptions) => unwrapBetterFetch(
|
|
48
|
+
await $fetch(PATHS.restoreSubscription, {
|
|
49
|
+
method: "POST",
|
|
50
|
+
body: input,
|
|
51
|
+
...fetchOptions
|
|
52
|
+
})
|
|
53
|
+
),
|
|
54
|
+
verifyPayment: async (input, fetchOptions) => unwrapBetterFetch(
|
|
55
|
+
await $fetch(PATHS.verifyPayment, {
|
|
56
|
+
method: "POST",
|
|
57
|
+
body: input,
|
|
58
|
+
...fetchOptions
|
|
59
|
+
})
|
|
60
|
+
)
|
|
61
|
+
}
|
|
62
|
+
})
|
|
63
|
+
});
|
|
64
|
+
export {
|
|
65
|
+
razorpayClientPlugin
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../client.ts"],"sourcesContent":["import type { BetterAuthClientPlugin } from 'better-auth/client'\nimport type { razorpayPlugin } from './index'\nimport type {\n PlanSummary,\n CreateOrUpdateSubscriptionInput,\n CancelSubscriptionInput,\n RestoreSubscriptionInput,\n ListSubscriptionsInput,\n VerifyPaymentInput,\n ListSubscriptionsResponse,\n CreateOrUpdateSubscriptionResponse,\n CancelSubscriptionResponse,\n RestoreSubscriptionResponse,\n VerifyPaymentResponse,\n RazorpayApiResult,\n} from './client/types'\n\ntype FetchFn = (\n path: string,\n options?: {\n method?: string\n body?: Record<string, unknown>\n query?: Record<string, string>\n }\n) => Promise<RazorpayApiResult<unknown>>\n\nconst PATHS = {\n getPlans: '/razorpay/get-plans',\n listSubscriptions: '/razorpay/subscription/list',\n createOrUpdateSubscription: '/razorpay/subscription/create-or-update',\n cancelSubscription: '/razorpay/subscription/cancel',\n restoreSubscription: '/razorpay/subscription/restore',\n verifyPayment: '/razorpay/verify-payment',\n} as const\n\n/**\n * Unwrap Better Auth $fetch result { data, error } into the API body.\n * Success: return res.data (API body: { success, data }).\n * Otherwise return res so errors and non–Better Fetch responses propagate.\n */\nfunction unwrapBetterFetch<T>(res: unknown): T {\n if (\n res != null &&\n typeof res === 'object' &&\n 'data' in res &&\n (res as { error?: unknown }).error == null\n ) {\n return (res as { data: T }).data\n }\n return res as T\n}\n\n/**\n * Razorpay client plugin for Better Auth.\n * Exposes authClient.razorpay.* so requests use the correct paths and avoid 404s from api.get/post.\n * Unwraps Better Auth's { data, error } so callers get the API body shape ({ success, data } / { success: false, error }).\n * Add to createAuthClient: plugins: [razorpayClientPlugin()]\n */\nexport const razorpayClientPlugin = () =>\n ({\n id: 'razorpay-plugin',\n $InferServerPlugin: {} as ReturnType<typeof razorpayPlugin>,\n getActions: ($fetch: FetchFn) => ({\n razorpay: {\n getPlans: async (fetchOptions?: Parameters<FetchFn>[1]) =>\n unwrapBetterFetch<RazorpayApiResult<PlanSummary[]>>(\n await $fetch(PATHS.getPlans, { method: 'GET', ...fetchOptions })\n ),\n\n listSubscriptions: async (\n input?: ListSubscriptionsInput,\n fetchOptions?: Parameters<FetchFn>[1]\n ) =>\n unwrapBetterFetch<RazorpayApiResult<ListSubscriptionsResponse['data']>>(\n await $fetch(PATHS.listSubscriptions, {\n method: 'GET',\n query: input?.referenceId ? { referenceId: input.referenceId } : undefined,\n ...fetchOptions,\n })\n ),\n\n createOrUpdateSubscription: async (\n input: CreateOrUpdateSubscriptionInput,\n fetchOptions?: Parameters<FetchFn>[1]\n ) =>\n unwrapBetterFetch<\n RazorpayApiResult<CreateOrUpdateSubscriptionResponse['data']>\n >(\n await $fetch(PATHS.createOrUpdateSubscription, {\n method: 'POST',\n body: input as unknown as Record<string, unknown>,\n ...fetchOptions,\n })\n ),\n\n cancelSubscription: async (\n input: CancelSubscriptionInput,\n fetchOptions?: Parameters<FetchFn>[1]\n ) =>\n unwrapBetterFetch<RazorpayApiResult<CancelSubscriptionResponse['data']>>(\n await $fetch(PATHS.cancelSubscription, {\n method: 'POST',\n body: input as unknown as Record<string, unknown>,\n ...fetchOptions,\n })\n ),\n\n restoreSubscription: async (\n input: RestoreSubscriptionInput,\n fetchOptions?: Parameters<FetchFn>[1]\n ) =>\n unwrapBetterFetch<RazorpayApiResult<RestoreSubscriptionResponse['data']>>(\n await $fetch(PATHS.restoreSubscription, {\n method: 'POST',\n body: input as unknown as Record<string, unknown>,\n ...fetchOptions,\n })\n ),\n\n verifyPayment: async (\n input: VerifyPaymentInput,\n fetchOptions?: Parameters<FetchFn>[1]\n ) =>\n unwrapBetterFetch<RazorpayApiResult<VerifyPaymentResponse['data']>>(\n await $fetch(PATHS.verifyPayment, {\n method: 'POST',\n body: input as unknown as Record<string, unknown>,\n ...fetchOptions,\n })\n ),\n },\n }),\n }) satisfies BetterAuthClientPlugin\n"],"mappings":";;;AA0BA,IAAM,QAAQ;AAAA,EACZ,UAAU;AAAA,EACV,mBAAmB;AAAA,EACnB,4BAA4B;AAAA,EAC5B,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,eAAe;AACjB;AAOA,SAAS,kBAAqB,KAAiB;AAC7C,MACE,OAAO,QACP,OAAO,QAAQ,YACf,UAAU,OACT,IAA4B,SAAS,MACtC;AACA,WAAQ,IAAoB;AAAA,EAC9B;AACA,SAAO;AACT;AAQO,IAAM,uBAAuB,OACjC;AAAA,EACC,IAAI;AAAA,EACJ,oBAAoB,CAAC;AAAA,EACrB,YAAY,CAAC,YAAqB;AAAA,IAChC,UAAU;AAAA,MACR,UAAU,OAAO,iBACf;AAAA,QACE,MAAM,OAAO,MAAM,UAAU,EAAE,QAAQ,OAAO,GAAG,aAAa,CAAC;AAAA,MACjE;AAAA,MAEF,mBAAmB,OACjB,OACA,iBAEA;AAAA,QACE,MAAM,OAAO,MAAM,mBAAmB;AAAA,UACpC,QAAQ;AAAA,UACR,OAAO,OAAO,cAAc,EAAE,aAAa,MAAM,YAAY,IAAI;AAAA,UACjE,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,MAEF,4BAA4B,OAC1B,OACA,iBAEA;AAAA,QAGE,MAAM,OAAO,MAAM,4BAA4B;AAAA,UAC7C,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,MAEF,oBAAoB,OAClB,OACA,iBAEA;AAAA,QACE,MAAM,OAAO,MAAM,oBAAoB;AAAA,UACrC,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,MAEF,qBAAqB,OACnB,OACA,iBAEA;AAAA,QACE,MAAM,OAAO,MAAM,qBAAqB;AAAA,UACtC,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,MAEF,eAAe,OACb,OACA,iBAEA;AAAA,QACE,MAAM,OAAO,MAAM,eAAe;AAAA,UAChC,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,IACJ;AAAA,EACF;AACF;","names":[]}
|
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 };
|