convex-paystack 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +490 -0
  3. package/dist/client/_generated/_ignore.d.ts +1 -0
  4. package/dist/client/_generated/_ignore.d.ts.map +1 -0
  5. package/dist/client/_generated/_ignore.js +3 -0
  6. package/dist/client/_generated/_ignore.js.map +1 -0
  7. package/dist/client/index.d.ts +201 -0
  8. package/dist/client/index.d.ts.map +1 -0
  9. package/dist/client/index.js +383 -0
  10. package/dist/client/index.js.map +1 -0
  11. package/dist/component/_generated/api.d.ts +34 -0
  12. package/dist/component/_generated/api.d.ts.map +1 -0
  13. package/dist/component/_generated/api.js +31 -0
  14. package/dist/component/_generated/api.js.map +1 -0
  15. package/dist/component/_generated/component.d.ts +147 -0
  16. package/dist/component/_generated/component.d.ts.map +1 -0
  17. package/dist/component/_generated/component.js +11 -0
  18. package/dist/component/_generated/component.js.map +1 -0
  19. package/dist/component/_generated/dataModel.d.ts +46 -0
  20. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  21. package/dist/component/_generated/dataModel.js +11 -0
  22. package/dist/component/_generated/dataModel.js.map +1 -0
  23. package/dist/component/_generated/server.d.ts +133 -0
  24. package/dist/component/_generated/server.d.ts.map +1 -0
  25. package/dist/component/_generated/server.js +80 -0
  26. package/dist/component/_generated/server.js.map +1 -0
  27. package/dist/component/convex.config.d.ts +3 -0
  28. package/dist/component/convex.config.d.ts.map +1 -0
  29. package/dist/component/convex.config.js +4 -0
  30. package/dist/component/convex.config.js.map +1 -0
  31. package/dist/component/lib.d.ts +137 -0
  32. package/dist/component/lib.d.ts.map +1 -0
  33. package/dist/component/lib.js +241 -0
  34. package/dist/component/lib.js.map +1 -0
  35. package/dist/component/schema.d.ts +77 -0
  36. package/dist/component/schema.d.ts.map +1 -0
  37. package/dist/component/schema.js +45 -0
  38. package/dist/component/schema.js.map +1 -0
  39. package/package.json +106 -0
  40. package/src/client/_generated/_ignore.ts +1 -0
  41. package/src/client/index.ts +570 -0
  42. package/src/client/setup.test.ts +26 -0
  43. package/src/component/_generated/api.ts +50 -0
  44. package/src/component/_generated/component.ts +217 -0
  45. package/src/component/_generated/dataModel.ts +60 -0
  46. package/src/component/_generated/server.ts +169 -0
  47. package/src/component/convex.config.ts +5 -0
  48. package/src/component/lib.test.ts +110 -0
  49. package/src/component/lib.ts +278 -0
  50. package/src/component/schema.ts +58 -0
  51. package/src/component/setup.test.ts +11 -0
  52. package/src/test.ts +18 -0
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=_ignore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_ignore.d.ts","sourceRoot":"","sources":["../../../src/client/_generated/_ignore.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ // This is only here so convex-test can detect a _generated folder
3
+ //# sourceMappingURL=_ignore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_ignore.js","sourceRoot":"","sources":["../../../src/client/_generated/_ignore.ts"],"names":[],"mappings":";AAAA,kEAAkE"}
@@ -0,0 +1,201 @@
1
+ import { httpActionGeneric } from "convex/server";
2
+ import type { GenericActionCtx, GenericDataModel } from "convex/server";
3
+ import type { ComponentApi } from "../component/_generated/component.js";
4
+ export type PaystackOptions = {
5
+ secretKey: string;
6
+ };
7
+ export type PaystackChannel = "card" | "bank" | "apple_pay" | "ussd" | "qr" | "mobile_money" | "bank_transfer" | "eft" | "capitec_pay" | "payattitude";
8
+ export type InitializeTransactionArgs = {
9
+ email: string;
10
+ amount: number;
11
+ currency?: string;
12
+ callbackUrl?: string;
13
+ reference?: string;
14
+ channels?: PaystackChannel[];
15
+ plan?: string;
16
+ metadata?: Record<string, unknown>;
17
+ };
18
+ export type InitializeTransactionResult = {
19
+ authorizationUrl: string;
20
+ accessCode: string;
21
+ reference: string;
22
+ };
23
+ export type VerifyTransactionResult = {
24
+ status: string;
25
+ reference: string;
26
+ amount: number;
27
+ currency: string;
28
+ channel?: string;
29
+ gatewayResponse?: string;
30
+ paidAt?: number;
31
+ authorizationCode?: string;
32
+ customerEmail: string;
33
+ };
34
+ export type PlanInterval = "daily" | "weekly" | "monthly" | "quarterly" | "biannually" | "annually";
35
+ export type CreatePlanArgs = {
36
+ name: string;
37
+ amount: number;
38
+ interval: PlanInterval;
39
+ currency?: string;
40
+ description?: string;
41
+ };
42
+ export type PlanResult = {
43
+ planCode: string;
44
+ name: string;
45
+ amount: number;
46
+ interval: string;
47
+ currency: string;
48
+ description?: string;
49
+ };
50
+ export type Balance = {
51
+ currency: string;
52
+ balance: number;
53
+ };
54
+ export declare class Paystack {
55
+ private component;
56
+ private options;
57
+ webhookHandler: ReturnType<typeof httpActionGeneric>;
58
+ constructor(component: ComponentApi, options: PaystackOptions);
59
+ initializeTransaction(ctx: GenericActionCtx<GenericDataModel>, args: InitializeTransactionArgs): Promise<InitializeTransactionResult>;
60
+ verifyTransaction(ctx: GenericActionCtx<GenericDataModel>, args: {
61
+ reference: string;
62
+ }): Promise<VerifyTransactionResult>;
63
+ cancelSubscription(ctx: GenericActionCtx<GenericDataModel>, args: {
64
+ code: string;
65
+ token: string;
66
+ }): Promise<void>;
67
+ enableSubscription(ctx: GenericActionCtx<GenericDataModel>, args: {
68
+ code: string;
69
+ token: string;
70
+ }): Promise<void>;
71
+ /**
72
+ * Create a Paystack billing plan. Plans are the foundation for
73
+ * subscriptions: pass the returned `planCode` as `plan` to
74
+ * `initializeTransaction` to start a subscription on first payment.
75
+ */
76
+ createPlan(ctx: GenericActionCtx<GenericDataModel>, args: CreatePlanArgs): Promise<PlanResult>;
77
+ /**
78
+ * Lists the currencies this Paystack account actually has enabled, with
79
+ * their current balance. Use this to build a currency picker that only
80
+ * ever offers currencies that will really work — `initializeTransaction`
81
+ * throws "Currency not supported by merchant" for anything else.
82
+ * Requires the secret key to have balance-read access; if it doesn't,
83
+ * catch the error and fall back to your account's default currency.
84
+ */
85
+ listBalances(_ctx: GenericActionCtx<GenericDataModel>): Promise<Balance[]>;
86
+ /**
87
+ * Fetches a customer's subscriptions directly from Paystack (via the
88
+ * Fetch Customer endpoint, which returns them inline) and upserts each
89
+ * one locally. A checkout initialized with `plan` starts a subscription
90
+ * on Paystack's side immediately, but this component only learns about
91
+ * it when the `subscription.create` webhook arrives — which, in local
92
+ * development, requires that webhook URL to actually be registered in
93
+ * the Paystack Dashboard. Call this right after a subscription checkout
94
+ * returns to reconcile state even if that webhook hasn't fired yet.
95
+ * Returns the number of subscriptions synced.
96
+ */
97
+ syncCustomerSubscriptions(ctx: GenericActionCtx<GenericDataModel>, args: {
98
+ email: string;
99
+ }): Promise<number>;
100
+ /** List billing plans already created on this Paystack account. */
101
+ listPlans(_ctx: GenericActionCtx<GenericDataModel>): Promise<PlanResult[]>;
102
+ getTransaction(ctx: RunQueryCtx, args: {
103
+ reference: string;
104
+ }): Promise<{
105
+ _creationTime: number;
106
+ _id: string;
107
+ amount: number;
108
+ authorizationCode?: string;
109
+ channel?: string;
110
+ createdAt: number;
111
+ currency: string;
112
+ customerEmail: string;
113
+ gatewayResponse?: string;
114
+ metadata?: string;
115
+ paidAt?: number;
116
+ reference: string;
117
+ status: "pending" | "success" | "failed" | "abandoned";
118
+ updatedAt: number;
119
+ } | null>;
120
+ listTransactions(ctx: RunQueryCtx, args: {
121
+ customerEmail: string;
122
+ limit?: number;
123
+ }): Promise<{
124
+ _creationTime: number;
125
+ _id: string;
126
+ amount: number;
127
+ authorizationCode?: string;
128
+ channel?: string;
129
+ createdAt: number;
130
+ currency: string;
131
+ customerEmail: string;
132
+ gatewayResponse?: string;
133
+ metadata?: string;
134
+ paidAt?: number;
135
+ reference: string;
136
+ status: "pending" | "success" | "failed" | "abandoned";
137
+ updatedAt: number;
138
+ }[]>;
139
+ getSubscription(ctx: RunQueryCtx, args: {
140
+ subscriptionCode: string;
141
+ }): Promise<{
142
+ _creationTime: number;
143
+ _id: string;
144
+ amount?: number;
145
+ createdAt: number;
146
+ customerCode?: string;
147
+ customerEmail: string;
148
+ emailToken?: string;
149
+ nextPaymentDate?: number;
150
+ planCode: string;
151
+ status: "active" | "non-renewing" | "attention" | "completed" | "cancelled";
152
+ subscriptionCode: string;
153
+ updatedAt: number;
154
+ } | null>;
155
+ listSubscriptions(ctx: RunQueryCtx, args: {
156
+ customerEmail: string;
157
+ }): Promise<{
158
+ _creationTime: number;
159
+ _id: string;
160
+ amount?: number;
161
+ createdAt: number;
162
+ customerCode?: string;
163
+ customerEmail: string;
164
+ emailToken?: string;
165
+ nextPaymentDate?: number;
166
+ planCode: string;
167
+ status: "active" | "non-renewing" | "attention" | "completed" | "cancelled";
168
+ subscriptionCode: string;
169
+ updatedAt: number;
170
+ }[]>;
171
+ hasActiveSubscription(ctx: RunQueryCtx, args: {
172
+ customerEmail: string;
173
+ }): Promise<boolean>;
174
+ /**
175
+ * Reads the raw webhook event log, newest first — every event Paystack
176
+ * has sent this component, whether or not it changed local state.
177
+ * Handy for an audit trail or a live "what just happened" console.
178
+ */
179
+ listRecentEvents(ctx: RunQueryCtx, args?: {
180
+ limit?: number;
181
+ }): Promise<{
182
+ _creationTime: number;
183
+ _id: string;
184
+ eventId: string;
185
+ eventType: string;
186
+ payload: string;
187
+ receivedAt: number;
188
+ reference?: string;
189
+ }[]>;
190
+ /** Aggregate row counts — see {@link ComponentApi}'s `lib.getStats`. */
191
+ getStats(ctx: RunQueryCtx): Promise<{
192
+ events: number;
193
+ subscriptions: number;
194
+ transactions: number;
195
+ }>;
196
+ }
197
+ type RunQueryCtx = {
198
+ runQuery: GenericActionCtx<GenericDataModel>["runQuery"];
199
+ };
200
+ export {};
201
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,383 @@
1
+ import { httpActionGeneric } from "convex/server";
2
+ const PAYSTACK_API_BASE = "https://api.paystack.co";
3
+ function timingSafeEqual(a, b) {
4
+ if (a.length !== b.length)
5
+ return false;
6
+ let mismatch = 0;
7
+ for (let i = 0; i < a.length; i++) {
8
+ mismatch |= a.charCodeAt(i) ^ b.charCodeAt(i);
9
+ }
10
+ return mismatch === 0;
11
+ }
12
+ async function hmacSha512Hex(secret, payload) {
13
+ const enc = new TextEncoder();
14
+ const key = await crypto.subtle.importKey("raw", enc.encode(secret), { name: "HMAC", hash: "SHA-512" }, false, ["sign"]);
15
+ const signature = await crypto.subtle.sign("HMAC", key, enc.encode(payload));
16
+ return Array.from(new Uint8Array(signature))
17
+ .map((byte) => byte.toString(16).padStart(2, "0"))
18
+ .join("");
19
+ }
20
+ function planFromPaystack(plan) {
21
+ return {
22
+ planCode: plan.plan_code,
23
+ name: plan.name,
24
+ amount: plan.amount,
25
+ interval: plan.interval,
26
+ currency: plan.currency ?? "NGN",
27
+ description: plan.description ?? undefined,
28
+ };
29
+ }
30
+ export class Paystack {
31
+ component;
32
+ options;
33
+ webhookHandler;
34
+ constructor(component, options) {
35
+ this.component = component;
36
+ this.options = options;
37
+ const component_ = component;
38
+ const secretKey = options.secretKey;
39
+ this.webhookHandler = httpActionGeneric(async (ctx, request) => {
40
+ const rawBody = await request.text();
41
+ const signature = request.headers.get("x-paystack-signature");
42
+ if (!signature) {
43
+ return new Response(JSON.stringify({ error: "Missing signature" }), {
44
+ status: 400,
45
+ headers: { "Content-Type": "application/json" },
46
+ });
47
+ }
48
+ const expected = await hmacSha512Hex(secretKey, rawBody);
49
+ if (!timingSafeEqual(expected, signature)) {
50
+ console.error("convex-paystack: webhook signature mismatch");
51
+ return new Response(JSON.stringify({ error: "Invalid signature" }), {
52
+ status: 401,
53
+ headers: { "Content-Type": "application/json" },
54
+ });
55
+ }
56
+ let event;
57
+ try {
58
+ event = JSON.parse(rawBody);
59
+ }
60
+ catch {
61
+ return new Response(JSON.stringify({ error: "Invalid JSON" }), {
62
+ status: 400,
63
+ headers: { "Content-Type": "application/json" },
64
+ });
65
+ }
66
+ const data = event.data ?? {};
67
+ const eventId = data.id !== undefined
68
+ ? `${event.event}:${data.id}`
69
+ : `${event.event}:${data.reference ?? data.subscription_code ?? crypto.randomUUID()}`;
70
+ const { alreadyProcessed } = await ctx.runMutation(component_.lib.checkAndRecordEvent, {
71
+ eventId,
72
+ eventType: event.event,
73
+ reference: data.reference ?? undefined,
74
+ payload: rawBody,
75
+ });
76
+ if (alreadyProcessed) {
77
+ return new Response(JSON.stringify({ success: true, duplicate: true }), {
78
+ status: 200,
79
+ headers: { "Content-Type": "application/json" },
80
+ });
81
+ }
82
+ switch (event.event) {
83
+ case "charge.success": {
84
+ const customer = data.customer;
85
+ const authorization = data.authorization;
86
+ await ctx.runMutation(component_.lib.recordTransaction, {
87
+ reference: data.reference,
88
+ customerEmail: customer?.email ?? "",
89
+ amount: data.amount,
90
+ currency: data.currency ?? "NGN",
91
+ status: "success",
92
+ channel: data.channel ?? undefined,
93
+ gatewayResponse: data.gateway_response ?? undefined,
94
+ authorizationCode: authorization?.authorization_code ?? undefined,
95
+ paidAt: data.paid_at ? new Date(data.paid_at).getTime() : undefined,
96
+ metadata: data.metadata ? JSON.stringify(data.metadata) : undefined,
97
+ });
98
+ break;
99
+ }
100
+ case "subscription.create": {
101
+ const customer = data.customer;
102
+ const plan = data.plan;
103
+ await ctx.runMutation(component_.lib.recordSubscriptionEvent, {
104
+ subscriptionCode: data.subscription_code,
105
+ emailToken: data.email_token ?? undefined,
106
+ customerEmail: customer?.email ?? "",
107
+ customerCode: customer?.customer_code ?? undefined,
108
+ planCode: plan?.plan_code ?? "",
109
+ status: data.status ?? "active",
110
+ amount: data.amount ?? undefined,
111
+ nextPaymentDate: data.next_payment_date
112
+ ? new Date(data.next_payment_date).getTime()
113
+ : undefined,
114
+ });
115
+ break;
116
+ }
117
+ case "subscription.disable": {
118
+ await ctx.runMutation(component_.lib.updateSubscriptionStatus, {
119
+ subscriptionCode: data.subscription_code,
120
+ status: "cancelled",
121
+ });
122
+ break;
123
+ }
124
+ case "subscription.not_renew": {
125
+ await ctx.runMutation(component_.lib.updateSubscriptionStatus, {
126
+ subscriptionCode: data.subscription_code,
127
+ status: "non-renewing",
128
+ });
129
+ break;
130
+ }
131
+ case "invoice.update": {
132
+ const subscription = data.subscription;
133
+ const subscriptionCode = subscription?.subscription_code;
134
+ if (subscriptionCode) {
135
+ await ctx.runMutation(component_.lib.updateSubscriptionStatus, {
136
+ subscriptionCode,
137
+ status: data.status === "success" ? "active" : "attention",
138
+ });
139
+ }
140
+ break;
141
+ }
142
+ case "invoice.payment_failed": {
143
+ const subscription = data.subscription;
144
+ const subscriptionCode = subscription?.subscription_code;
145
+ if (subscriptionCode) {
146
+ await ctx.runMutation(component_.lib.updateSubscriptionStatus, {
147
+ subscriptionCode,
148
+ status: "attention",
149
+ });
150
+ }
151
+ break;
152
+ }
153
+ default:
154
+ break;
155
+ }
156
+ return new Response(JSON.stringify({ success: true }), {
157
+ status: 200,
158
+ headers: { "Content-Type": "application/json" },
159
+ });
160
+ });
161
+ }
162
+ async initializeTransaction(ctx, args) {
163
+ const res = await fetch(`${PAYSTACK_API_BASE}/transaction/initialize`, {
164
+ method: "POST",
165
+ headers: {
166
+ Authorization: `Bearer ${this.options.secretKey}`,
167
+ "Content-Type": "application/json",
168
+ },
169
+ body: JSON.stringify({
170
+ email: args.email,
171
+ amount: args.amount,
172
+ currency: args.currency,
173
+ callback_url: args.callbackUrl,
174
+ reference: args.reference,
175
+ channels: args.channels,
176
+ plan: args.plan,
177
+ metadata: args.metadata,
178
+ }),
179
+ });
180
+ const json = (await res.json());
181
+ if (!json.status) {
182
+ throw new Error(json.message ?? "Failed to initialize Paystack transaction");
183
+ }
184
+ await ctx.runMutation(this.component.lib.recordTransaction, {
185
+ reference: json.data.reference,
186
+ customerEmail: args.email,
187
+ amount: args.amount,
188
+ currency: args.currency ?? "NGN",
189
+ status: "pending",
190
+ metadata: args.metadata ? JSON.stringify(args.metadata) : undefined,
191
+ });
192
+ return {
193
+ authorizationUrl: json.data.authorization_url,
194
+ accessCode: json.data.access_code,
195
+ reference: json.data.reference,
196
+ };
197
+ }
198
+ async verifyTransaction(ctx, args) {
199
+ const res = await fetch(`${PAYSTACK_API_BASE}/transaction/verify/${encodeURIComponent(args.reference)}`, { headers: { Authorization: `Bearer ${this.options.secretKey}` } });
200
+ const json = (await res.json());
201
+ if (!json.status) {
202
+ throw new Error(json.message ?? "Failed to verify Paystack transaction");
203
+ }
204
+ const data = json.data;
205
+ await ctx.runMutation(this.component.lib.recordTransaction, {
206
+ reference: data.reference,
207
+ customerEmail: data.customer?.email ?? "",
208
+ amount: data.amount,
209
+ currency: data.currency,
210
+ status: data.status,
211
+ channel: data.channel ?? undefined,
212
+ gatewayResponse: data.gateway_response ?? undefined,
213
+ authorizationCode: data.authorization?.authorization_code ?? undefined,
214
+ paidAt: data.paid_at ? new Date(data.paid_at).getTime() : undefined,
215
+ });
216
+ return {
217
+ status: data.status,
218
+ reference: data.reference,
219
+ amount: data.amount,
220
+ currency: data.currency,
221
+ channel: data.channel ?? undefined,
222
+ gatewayResponse: data.gateway_response ?? undefined,
223
+ paidAt: data.paid_at ? new Date(data.paid_at).getTime() : undefined,
224
+ authorizationCode: data.authorization?.authorization_code ?? undefined,
225
+ customerEmail: data.customer?.email ?? "",
226
+ };
227
+ }
228
+ async cancelSubscription(ctx, args) {
229
+ const res = await fetch(`${PAYSTACK_API_BASE}/subscription/disable`, {
230
+ method: "POST",
231
+ headers: {
232
+ Authorization: `Bearer ${this.options.secretKey}`,
233
+ "Content-Type": "application/json",
234
+ },
235
+ body: JSON.stringify({ code: args.code, token: args.token }),
236
+ });
237
+ const json = (await res.json());
238
+ if (!json.status) {
239
+ throw new Error(json.message ?? "Failed to cancel Paystack subscription");
240
+ }
241
+ await ctx.runMutation(this.component.lib.updateSubscriptionStatus, {
242
+ subscriptionCode: args.code,
243
+ status: "cancelled",
244
+ });
245
+ }
246
+ async enableSubscription(ctx, args) {
247
+ const res = await fetch(`${PAYSTACK_API_BASE}/subscription/enable`, {
248
+ method: "POST",
249
+ headers: {
250
+ Authorization: `Bearer ${this.options.secretKey}`,
251
+ "Content-Type": "application/json",
252
+ },
253
+ body: JSON.stringify({ code: args.code, token: args.token }),
254
+ });
255
+ const json = (await res.json());
256
+ if (!json.status) {
257
+ throw new Error(json.message ?? "Failed to enable Paystack subscription");
258
+ }
259
+ await ctx.runMutation(this.component.lib.updateSubscriptionStatus, {
260
+ subscriptionCode: args.code,
261
+ status: "active",
262
+ });
263
+ }
264
+ /**
265
+ * Create a Paystack billing plan. Plans are the foundation for
266
+ * subscriptions: pass the returned `planCode` as `plan` to
267
+ * `initializeTransaction` to start a subscription on first payment.
268
+ */
269
+ async createPlan(ctx, args) {
270
+ const res = await fetch(`${PAYSTACK_API_BASE}/plan`, {
271
+ method: "POST",
272
+ headers: {
273
+ Authorization: `Bearer ${this.options.secretKey}`,
274
+ "Content-Type": "application/json",
275
+ },
276
+ body: JSON.stringify({
277
+ name: args.name,
278
+ amount: args.amount,
279
+ interval: args.interval,
280
+ currency: args.currency,
281
+ description: args.description,
282
+ }),
283
+ });
284
+ const json = (await res.json());
285
+ if (!json.status) {
286
+ throw new Error(json.message ?? "Failed to create Paystack plan");
287
+ }
288
+ return planFromPaystack(json.data);
289
+ }
290
+ /**
291
+ * Lists the currencies this Paystack account actually has enabled, with
292
+ * their current balance. Use this to build a currency picker that only
293
+ * ever offers currencies that will really work — `initializeTransaction`
294
+ * throws "Currency not supported by merchant" for anything else.
295
+ * Requires the secret key to have balance-read access; if it doesn't,
296
+ * catch the error and fall back to your account's default currency.
297
+ */
298
+ async listBalances(_ctx) {
299
+ const res = await fetch(`${PAYSTACK_API_BASE}/balance`, {
300
+ headers: { Authorization: `Bearer ${this.options.secretKey}` },
301
+ });
302
+ const json = (await res.json());
303
+ if (!json.status) {
304
+ throw new Error(json.message ?? "Failed to fetch Paystack balance");
305
+ }
306
+ return json.data;
307
+ }
308
+ /**
309
+ * Fetches a customer's subscriptions directly from Paystack (via the
310
+ * Fetch Customer endpoint, which returns them inline) and upserts each
311
+ * one locally. A checkout initialized with `plan` starts a subscription
312
+ * on Paystack's side immediately, but this component only learns about
313
+ * it when the `subscription.create` webhook arrives — which, in local
314
+ * development, requires that webhook URL to actually be registered in
315
+ * the Paystack Dashboard. Call this right after a subscription checkout
316
+ * returns to reconcile state even if that webhook hasn't fired yet.
317
+ * Returns the number of subscriptions synced.
318
+ */
319
+ async syncCustomerSubscriptions(ctx, args) {
320
+ const res = await fetch(`${PAYSTACK_API_BASE}/customer/${encodeURIComponent(args.email)}`, { headers: { Authorization: `Bearer ${this.options.secretKey}` } });
321
+ const json = (await res.json());
322
+ if (!json.status) {
323
+ throw new Error(json.message ?? "Failed to fetch Paystack customer");
324
+ }
325
+ const subscriptions = json.data?.subscriptions ?? [];
326
+ for (const sub of subscriptions) {
327
+ const plan = sub.plan;
328
+ const customer = sub.customer;
329
+ await ctx.runMutation(this.component.lib.recordSubscriptionEvent, {
330
+ subscriptionCode: sub.subscription_code,
331
+ emailToken: sub.email_token ?? undefined,
332
+ customerEmail: args.email,
333
+ customerCode: customer?.customer_code ?? undefined,
334
+ planCode: plan?.plan_code ?? "",
335
+ status: sub.status ?? "active",
336
+ amount: sub.amount ?? plan?.amount ?? undefined,
337
+ nextPaymentDate: sub.next_payment_date
338
+ ? new Date(sub.next_payment_date).getTime()
339
+ : undefined,
340
+ });
341
+ }
342
+ return subscriptions.length;
343
+ }
344
+ /** List billing plans already created on this Paystack account. */
345
+ async listPlans(_ctx) {
346
+ const res = await fetch(`${PAYSTACK_API_BASE}/plan?perPage=100`, {
347
+ headers: { Authorization: `Bearer ${this.options.secretKey}` },
348
+ });
349
+ const json = (await res.json());
350
+ if (!json.status) {
351
+ throw new Error(json.message ?? "Failed to list Paystack plans");
352
+ }
353
+ return json.data.map(planFromPaystack);
354
+ }
355
+ async getTransaction(ctx, args) {
356
+ return await ctx.runQuery(this.component.lib.getTransaction, args);
357
+ }
358
+ async listTransactions(ctx, args) {
359
+ return await ctx.runQuery(this.component.lib.listTransactions, args);
360
+ }
361
+ async getSubscription(ctx, args) {
362
+ return await ctx.runQuery(this.component.lib.getSubscription, args);
363
+ }
364
+ async listSubscriptions(ctx, args) {
365
+ return await ctx.runQuery(this.component.lib.listSubscriptions, args);
366
+ }
367
+ async hasActiveSubscription(ctx, args) {
368
+ return await ctx.runQuery(this.component.lib.hasActiveSubscription, args);
369
+ }
370
+ /**
371
+ * Reads the raw webhook event log, newest first — every event Paystack
372
+ * has sent this component, whether or not it changed local state.
373
+ * Handy for an audit trail or a live "what just happened" console.
374
+ */
375
+ async listRecentEvents(ctx, args) {
376
+ return await ctx.runQuery(this.component.lib.listRecentEvents, args ?? {});
377
+ }
378
+ /** Aggregate row counts — see {@link ComponentApi}'s `lib.getStats`. */
379
+ async getStats(ctx) {
380
+ return await ctx.runQuery(this.component.lib.getStats, {});
381
+ }
382
+ }
383
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAIlD,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AA6EpD,SAAS,eAAe,CAAC,CAAS,EAAE,CAAS;IAC3C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,QAAQ,KAAK,CAAC,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,MAAc,EAAE,OAAe;IAC1D,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CACvC,KAAK,EACL,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAClB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EACjC,KAAK,EACL,CAAC,MAAM,CAAC,CACT,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;SACzC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SACjD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,IAA6B;IACrD,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,SAAmB;QAClC,IAAI,EAAE,IAAI,CAAC,IAAc;QACzB,MAAM,EAAE,IAAI,CAAC,MAAgB;QAC7B,QAAQ,EAAE,IAAI,CAAC,QAAkB;QACjC,QAAQ,EAAG,IAAI,CAAC,QAAmB,IAAI,KAAK;QAC5C,WAAW,EAAG,IAAI,CAAC,WAAsB,IAAI,SAAS;KACvD,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,QAAQ;IAIT;IACA;IAJV,cAAc,CAAuC;IAErD,YACU,SAAuB,EACvB,OAAwB;QADxB,cAAS,GAAT,SAAS,CAAc;QACvB,YAAO,GAAP,OAAO,CAAiB;QAEhC,MAAM,UAAU,GAAG,SAAS,CAAC;QAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAEpC,IAAI,CAAC,cAAc,GAAG,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;YAC7D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YAE9D,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,EAAE;oBAClE,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAChD,CAAC,CAAC;YACL,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACzD,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;gBAC1C,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;gBAC7D,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,EAAE;oBAClE,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAChD,CAAC,CAAC;YACL,CAAC;YAED,IAAI,KAAuD,CAAC;YAC5D,IAAI,CAAC;gBACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE;oBAC7D,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAChD,CAAC,CAAC;YACL,CAAC;YAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;YAC9B,MAAM,OAAO,GACX,IAAI,CAAC,EAAE,KAAK,SAAS;gBACnB,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,EAAE;gBAC7B,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,IAAK,IAAI,CAAC,SAAoB,IAAK,IAAI,CAAC,iBAA4B,IAAI,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;YAElH,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,mBAAmB,EAAE;gBACrF,OAAO;gBACP,SAAS,EAAE,KAAK,CAAC,KAAK;gBACtB,SAAS,EAAG,IAAI,CAAC,SAAoB,IAAI,SAAS;gBAClD,OAAO,EAAE,OAAO;aACjB,CAAC,CAAC;YAEH,IAAI,gBAAgB,EAAE,CAAC;gBACrB,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE;oBACtE,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAChD,CAAC,CAAC;YACL,CAAC;YAED,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;gBACpB,KAAK,gBAAgB,CAAC,CAAC,CAAC;oBACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAA+C,CAAC;oBACtE,MAAM,aAAa,GAAG,IAAI,CAAC,aAAoD,CAAC;oBAChF,MAAM,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,iBAAiB,EAAE;wBACtD,SAAS,EAAE,IAAI,CAAC,SAAmB;wBACnC,aAAa,EAAG,QAAQ,EAAE,KAAgB,IAAI,EAAE;wBAChD,MAAM,EAAE,IAAI,CAAC,MAAgB;wBAC7B,QAAQ,EAAG,IAAI,CAAC,QAAmB,IAAI,KAAK;wBAC5C,MAAM,EAAE,SAAS;wBACjB,OAAO,EAAG,IAAI,CAAC,OAAkB,IAAI,SAAS;wBAC9C,eAAe,EAAG,IAAI,CAAC,gBAA2B,IAAI,SAAS;wBAC/D,iBAAiB,EAAG,aAAa,EAAE,kBAA6B,IAAI,SAAS;wBAC7E,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAiB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS;wBAC7E,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;qBACpE,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;gBACD,KAAK,qBAAqB,CAAC,CAAC,CAAC;oBAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAA+C,CAAC;oBACtE,MAAM,IAAI,GAAG,IAAI,CAAC,IAA2C,CAAC;oBAC9D,MAAM,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,uBAAuB,EAAE;wBAC5D,gBAAgB,EAAE,IAAI,CAAC,iBAA2B;wBAClD,UAAU,EAAG,IAAI,CAAC,WAAsB,IAAI,SAAS;wBACrD,aAAa,EAAG,QAAQ,EAAE,KAAgB,IAAI,EAAE;wBAChD,YAAY,EAAG,QAAQ,EAAE,aAAwB,IAAI,SAAS;wBAC9D,QAAQ,EAAG,IAAI,EAAE,SAAoB,IAAI,EAAE;wBAC3C,MAAM,EAAG,IAAI,CAAC,MAKE,IAAI,QAAQ;wBAC5B,MAAM,EAAG,IAAI,CAAC,MAAiB,IAAI,SAAS;wBAC5C,eAAe,EAAE,IAAI,CAAC,iBAAiB;4BACrC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,iBAA2B,CAAC,CAAC,OAAO,EAAE;4BACtD,CAAC,CAAC,SAAS;qBACd,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;gBACD,KAAK,sBAAsB,CAAC,CAAC,CAAC;oBAC5B,MAAM,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,wBAAwB,EAAE;wBAC7D,gBAAgB,EAAE,IAAI,CAAC,iBAA2B;wBAClD,MAAM,EAAE,WAAW;qBACpB,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;gBACD,KAAK,wBAAwB,CAAC,CAAC,CAAC;oBAC9B,MAAM,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,wBAAwB,EAAE;wBAC7D,gBAAgB,EAAE,IAAI,CAAC,iBAA2B;wBAClD,MAAM,EAAE,cAAc;qBACvB,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;gBACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;oBACtB,MAAM,YAAY,GAAG,IAAI,CAAC,YAAmD,CAAC;oBAC9E,MAAM,gBAAgB,GAAG,YAAY,EAAE,iBAAuC,CAAC;oBAC/E,IAAI,gBAAgB,EAAE,CAAC;wBACrB,MAAM,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,wBAAwB,EAAE;4BAC7D,gBAAgB;4BAChB,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW;yBAC3D,CAAC,CAAC;oBACL,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,wBAAwB,CAAC,CAAC,CAAC;oBAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,YAAmD,CAAC;oBAC9E,MAAM,gBAAgB,GAAG,YAAY,EAAE,iBAAuC,CAAC;oBAC/E,IAAI,gBAAgB,EAAE,CAAC;wBACrB,MAAM,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,wBAAwB,EAAE;4BAC7D,gBAAgB;4BAChB,MAAM,EAAE,WAAW;yBACpB,CAAC,CAAC;oBACL,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD;oBACE,MAAM;YACV,CAAC;YAED,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE;gBACrD,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAChD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,qBAAqB,CACzB,GAAuC,EACvC,IAA+B;QAE/B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,iBAAiB,yBAAyB,EAAE;YACrE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;gBACjD,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,YAAY,EAAE,IAAI,CAAC,WAAW;gBAC9B,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC;SACH,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAI7B,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,2CAA2C,CAAC,CAAC;QAC/E,CAAC;QAED,MAAM,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,EAAE;YAC1D,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS;YAC9B,aAAa,EAAE,IAAI,CAAC,KAAK;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK;YAChC,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;SACpE,CAAC,CAAC;QAEH,OAAO;YACL,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAC7C,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW;YACjC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS;SAC/B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,GAAuC,EACvC,IAA2B;QAE3B,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,GAAG,iBAAiB,uBAAuB,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAC/E,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,EAAE,CACnE,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAc7B,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,uCAAuC,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAEvB,MAAM,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,EAAE;YAC1D,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAwD;YACrE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,SAAS;YAClC,eAAe,EAAE,IAAI,CAAC,gBAAgB,IAAI,SAAS;YACnD,iBAAiB,EAAE,IAAI,CAAC,aAAa,EAAE,kBAAkB,IAAI,SAAS;YACtE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS;SACpE,CAAC,CAAC;QAEH,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,SAAS;YAClC,eAAe,EAAE,IAAI,CAAC,gBAAgB,IAAI,SAAS;YACnD,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS;YACnE,iBAAiB,EAAE,IAAI,CAAC,aAAa,EAAE,kBAAkB,IAAI,SAAS;YACtE,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;SAC1C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,GAAuC,EACvC,IAAqC;QAErC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,iBAAiB,uBAAuB,EAAE;YACnE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;gBACjD,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;SAC7D,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0C,CAAC;QACzE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,wCAAwC,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,wBAAwB,EAAE;YACjE,gBAAgB,EAAE,IAAI,CAAC,IAAI;YAC3B,MAAM,EAAE,WAAW;SACpB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,GAAuC,EACvC,IAAqC;QAErC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,iBAAiB,sBAAsB,EAAE;YAClE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;gBACjD,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;SAC7D,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0C,CAAC;QACzE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,wCAAwC,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,wBAAwB,EAAE;YACjE,gBAAgB,EAAE,IAAI,CAAC,IAAI;YAC3B,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU,CACd,GAAuC,EACvC,IAAoB;QAEpB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,iBAAiB,OAAO,EAAE;YACnD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;gBACjD,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,WAAW,EAAE,IAAI,CAAC,WAAW;aAC9B,CAAC;SACH,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAI7B,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,gCAAgC,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,YAAY,CAAC,IAAwC;QACzD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,iBAAiB,UAAU,EAAE;YACtD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE;SAC/D,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAI7B,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,kCAAkC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,yBAAyB,CAC7B,GAAuC,EACvC,IAAuB;QAEvB,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,GAAG,iBAAiB,aAAa,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EACjE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,EAAE,CACnE,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAI7B,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,mCAAmC,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,IAAI,EAAE,CAAC;QACrD,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,GAAG,CAAC,IAA2C,CAAC;YAC7D,MAAM,QAAQ,GAAG,GAAG,CAAC,QAA+C,CAAC;YACrE,MAAM,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,uBAAuB,EAAE;gBAChE,gBAAgB,EAAE,GAAG,CAAC,iBAA2B;gBACjD,UAAU,EAAG,GAAG,CAAC,WAAsB,IAAI,SAAS;gBACpD,aAAa,EAAE,IAAI,CAAC,KAAK;gBACzB,YAAY,EAAG,QAAQ,EAAE,aAAwB,IAAI,SAAS;gBAC9D,QAAQ,EAAG,IAAI,EAAE,SAAoB,IAAI,EAAE;gBAC3C,MAAM,EAAG,GAAG,CAAC,MAKG,IAAI,QAAQ;gBAC5B,MAAM,EAAG,GAAG,CAAC,MAAiB,IAAK,IAAI,EAAE,MAAiB,IAAI,SAAS;gBACvE,eAAe,EAAE,GAAG,CAAC,iBAAiB;oBACpC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,iBAA2B,CAAC,CAAC,OAAO,EAAE;oBACrD,CAAC,CAAC,SAAS;aACd,CAAC,CAAC;QACL,CAAC;QACD,OAAO,aAAa,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,mEAAmE;IACnE,KAAK,CAAC,SAAS,CAAC,IAAwC;QACtD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,iBAAiB,mBAAmB,EAAE;YAC/D,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE;SAC/D,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAI7B,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,+BAA+B,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAAgB,EAAE,IAA2B;QAChE,OAAO,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,GAAgB,EAAE,IAA+C;QACtF,OAAO,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,GAAgB,EAAE,IAAkC;QACxE,OAAO,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,GAAgB,EAAE,IAA+B;QACvE,OAAO,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,GAAgB,EAAE,IAA+B;QAC3E,OAAO,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;IAC5E,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,gBAAgB,CAAC,GAAgB,EAAE,IAAyB;QAChE,OAAO,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,wEAAwE;IACxE,KAAK,CAAC,QAAQ,CAAC,GAAgB;QAC7B,OAAO,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;CACF"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Generated `api` utility.
3
+ *
4
+ * THIS CODE IS AUTOMATICALLY GENERATED.
5
+ *
6
+ * To regenerate, run `npx convex dev`.
7
+ * @module
8
+ */
9
+ import type * as lib from "../lib.js";
10
+ import type { ApiFromModules, FilterApi, FunctionReference } from "convex/server";
11
+ declare const fullApi: ApiFromModules<{
12
+ lib: typeof lib;
13
+ }>;
14
+ /**
15
+ * A utility for referencing Convex functions in your app's public API.
16
+ *
17
+ * Usage:
18
+ * ```js
19
+ * const myFunctionReference = api.myModule.myFunction;
20
+ * ```
21
+ */
22
+ export declare const api: FilterApi<typeof fullApi, FunctionReference<any, "public">>;
23
+ /**
24
+ * A utility for referencing Convex functions in your app's internal API.
25
+ *
26
+ * Usage:
27
+ * ```js
28
+ * const myFunctionReference = internal.myModule.myFunction;
29
+ * ```
30
+ */
31
+ export declare const internal: FilterApi<typeof fullApi, FunctionReference<any, "internal">>;
32
+ export declare const components: {};
33
+ export {};
34
+ //# sourceMappingURL=api.d.ts.map