convex-flutterwave 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 +504 -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 +192 -0
  8. package/dist/client/index.d.ts.map +1 -0
  9. package/dist/client/index.js +364 -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 +141 -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 +117 -0
  32. package/dist/component/lib.d.ts.map +1 -0
  33. package/dist/component/lib.js +223 -0
  34. package/dist/component/lib.js.map +1 -0
  35. package/dist/component/schema.d.ts +73 -0
  36. package/dist/component/schema.d.ts.map +1 -0
  37. package/dist/component/schema.js +43 -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 +565 -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 +183 -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 +251 -0
  50. package/src/component/schema.ts +50 -0
  51. package/src/component/setup.test.ts +11 -0
  52. package/src/test.ts +18 -0
@@ -0,0 +1,223 @@
1
+ import { v } from "convex/values";
2
+ import { mutation, query } from "./_generated/server.js";
3
+ const transactionStatusValidator = v.union(v.literal("pending"), v.literal("successful"), v.literal("failed"), v.literal("cancelled"));
4
+ const subscriptionStatusValidator = v.union(v.literal("active"), v.literal("cancelled"));
5
+ const transactionValidator = v.object({
6
+ _id: v.id("transactions"),
7
+ _creationTime: v.number(),
8
+ txRef: v.string(),
9
+ flwRef: v.optional(v.string()),
10
+ transactionId: v.optional(v.string()),
11
+ customerEmail: v.string(),
12
+ amount: v.number(),
13
+ currency: v.string(),
14
+ status: transactionStatusValidator,
15
+ paymentType: v.optional(v.string()),
16
+ narration: v.optional(v.string()),
17
+ paidAt: v.optional(v.number()),
18
+ metadata: v.optional(v.string()),
19
+ createdAt: v.number(),
20
+ updatedAt: v.number(),
21
+ });
22
+ const subscriptionValidator = v.object({
23
+ _id: v.id("subscriptions"),
24
+ _creationTime: v.number(),
25
+ subscriptionId: v.string(),
26
+ customerEmail: v.string(),
27
+ planId: v.optional(v.string()),
28
+ amount: v.optional(v.number()),
29
+ status: subscriptionStatusValidator,
30
+ createdAt: v.number(),
31
+ updatedAt: v.number(),
32
+ });
33
+ const webhookEventValidator = v.object({
34
+ _id: v.id("webhookEvents"),
35
+ _creationTime: v.number(),
36
+ eventId: v.string(),
37
+ eventType: v.string(),
38
+ txRef: v.optional(v.string()),
39
+ payload: v.string(),
40
+ receivedAt: v.number(),
41
+ });
42
+ // ─── Queries ────────────────────────────────────────────────────────────────
43
+ export const getTransaction = query({
44
+ args: { txRef: v.string() },
45
+ returns: v.union(v.null(), transactionValidator),
46
+ handler: async (ctx, args) => {
47
+ return await ctx.db
48
+ .query("transactions")
49
+ .withIndex("by_txRef", (q) => q.eq("txRef", args.txRef))
50
+ .first();
51
+ },
52
+ });
53
+ export const listTransactions = query({
54
+ args: { customerEmail: v.string(), limit: v.optional(v.number()) },
55
+ returns: v.array(transactionValidator),
56
+ handler: async (ctx, args) => {
57
+ return await ctx.db
58
+ .query("transactions")
59
+ .withIndex("by_customerEmail", (q) => q.eq("customerEmail", args.customerEmail))
60
+ .order("desc")
61
+ .take(args.limit ?? 50);
62
+ },
63
+ });
64
+ export const getSubscription = query({
65
+ args: { subscriptionId: v.string() },
66
+ returns: v.union(v.null(), subscriptionValidator),
67
+ handler: async (ctx, args) => {
68
+ return await ctx.db
69
+ .query("subscriptions")
70
+ .withIndex("by_subscriptionId", (q) => q.eq("subscriptionId", args.subscriptionId))
71
+ .first();
72
+ },
73
+ });
74
+ export const listSubscriptions = query({
75
+ args: { customerEmail: v.string() },
76
+ returns: v.array(subscriptionValidator),
77
+ handler: async (ctx, args) => {
78
+ return await ctx.db
79
+ .query("subscriptions")
80
+ .withIndex("by_customerEmail", (q) => q.eq("customerEmail", args.customerEmail))
81
+ .order("desc")
82
+ .collect();
83
+ },
84
+ });
85
+ export const hasActiveSubscription = query({
86
+ args: { customerEmail: v.string() },
87
+ returns: v.boolean(),
88
+ handler: async (ctx, args) => {
89
+ const sub = await ctx.db
90
+ .query("subscriptions")
91
+ .withIndex("by_customerEmail", (q) => q.eq("customerEmail", args.customerEmail))
92
+ .order("desc")
93
+ .first();
94
+ return sub?.status === "active";
95
+ },
96
+ });
97
+ export const listRecentEvents = query({
98
+ args: { limit: v.optional(v.number()) },
99
+ returns: v.array(webhookEventValidator),
100
+ handler: async (ctx, args) => {
101
+ return await ctx.db.query("webhookEvents").order("desc").take(args.limit ?? 50);
102
+ },
103
+ });
104
+ export const getStats = query({
105
+ args: {},
106
+ returns: v.object({ transactions: v.number(), subscriptions: v.number(), events: v.number() }),
107
+ handler: async (ctx) => {
108
+ const [transactions, subscriptions, events] = await Promise.all([
109
+ ctx.db.query("transactions").collect(),
110
+ ctx.db.query("subscriptions").collect(),
111
+ ctx.db.query("webhookEvents").collect(),
112
+ ]);
113
+ return { transactions: transactions.length, subscriptions: subscriptions.length, events: events.length };
114
+ },
115
+ });
116
+ // ─── Mutations ──────────────────────────────────────────────────────────────
117
+ export const recordTransaction = mutation({
118
+ args: {
119
+ txRef: v.string(),
120
+ flwRef: v.optional(v.string()),
121
+ transactionId: v.optional(v.string()),
122
+ customerEmail: v.string(),
123
+ amount: v.number(),
124
+ currency: v.string(),
125
+ status: transactionStatusValidator,
126
+ paymentType: v.optional(v.string()),
127
+ narration: v.optional(v.string()),
128
+ paidAt: v.optional(v.number()),
129
+ metadata: v.optional(v.string()),
130
+ },
131
+ returns: v.id("transactions"),
132
+ handler: async (ctx, args) => {
133
+ const now = Date.now();
134
+ const existing = await ctx.db
135
+ .query("transactions")
136
+ .withIndex("by_txRef", (q) => q.eq("txRef", args.txRef))
137
+ .first();
138
+ if (existing) {
139
+ // Keep the email the merchant originally passed to initializeTransaction
140
+ // rather than whatever the webhook/verify response echoes back. Some
141
+ // processors (Flutterwave's test mode, notably) rewrite the customer
142
+ // email in their own responses — e.g. prefixing it with a sandbox
143
+ // routing tag like "ravesb_<hash>_" — which would otherwise silently
144
+ // overwrite the real address callers query by.
145
+ const { customerEmail: _incomingEmail, ...rest } = args;
146
+ await ctx.db.patch(existing._id, { ...rest, updatedAt: now });
147
+ return existing._id;
148
+ }
149
+ return await ctx.db.insert("transactions", {
150
+ ...args,
151
+ createdAt: now,
152
+ updatedAt: now,
153
+ });
154
+ },
155
+ });
156
+ export const recordSubscriptionEvent = mutation({
157
+ args: {
158
+ subscriptionId: v.string(),
159
+ customerEmail: v.string(),
160
+ planId: v.optional(v.string()),
161
+ amount: v.optional(v.number()),
162
+ status: subscriptionStatusValidator,
163
+ },
164
+ returns: v.id("subscriptions"),
165
+ handler: async (ctx, args) => {
166
+ const now = Date.now();
167
+ const existing = await ctx.db
168
+ .query("subscriptions")
169
+ .withIndex("by_subscriptionId", (q) => q.eq("subscriptionId", args.subscriptionId))
170
+ .first();
171
+ if (existing) {
172
+ // Same reasoning as recordTransaction: don't let a later webhook or
173
+ // sync call overwrite the email a subscription was first recorded
174
+ // under with a processor-mangled value.
175
+ const { customerEmail: _incomingEmail, ...rest } = args;
176
+ await ctx.db.patch(existing._id, { ...rest, updatedAt: now });
177
+ return existing._id;
178
+ }
179
+ return await ctx.db.insert("subscriptions", {
180
+ ...args,
181
+ createdAt: now,
182
+ updatedAt: now,
183
+ });
184
+ },
185
+ });
186
+ export const updateSubscriptionStatus = mutation({
187
+ args: {
188
+ subscriptionId: v.string(),
189
+ status: subscriptionStatusValidator,
190
+ },
191
+ returns: v.null(),
192
+ handler: async (ctx, args) => {
193
+ const existing = await ctx.db
194
+ .query("subscriptions")
195
+ .withIndex("by_subscriptionId", (q) => q.eq("subscriptionId", args.subscriptionId))
196
+ .first();
197
+ if (!existing)
198
+ return null;
199
+ await ctx.db.patch(existing._id, { status: args.status, updatedAt: Date.now() });
200
+ return null;
201
+ },
202
+ });
203
+ export const checkAndRecordEvent = mutation({
204
+ args: {
205
+ eventId: v.string(),
206
+ eventType: v.string(),
207
+ txRef: v.optional(v.string()),
208
+ payload: v.string(),
209
+ },
210
+ returns: v.object({ alreadyProcessed: v.boolean() }),
211
+ handler: async (ctx, args) => {
212
+ const existing = await ctx.db
213
+ .query("webhookEvents")
214
+ .withIndex("by_eventId", (q) => q.eq("eventId", args.eventId))
215
+ .first();
216
+ if (existing) {
217
+ return { alreadyProcessed: true };
218
+ }
219
+ await ctx.db.insert("webhookEvents", { ...args, receivedAt: Date.now() });
220
+ return { alreadyProcessed: false };
221
+ },
222
+ });
223
+ //# sourceMappingURL=lib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/component/lib.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ declare const _default: import("convex/server").SchemaDefinition<{
2
+ transactions: import("convex/server").TableDefinition<import("convex/values").VObject<{
3
+ flwRef?: string | undefined;
4
+ metadata?: string | undefined;
5
+ narration?: string | undefined;
6
+ paidAt?: number | undefined;
7
+ paymentType?: string | undefined;
8
+ transactionId?: string | undefined;
9
+ txRef: string;
10
+ customerEmail: string;
11
+ amount: number;
12
+ status: "cancelled" | "pending" | "successful" | "failed";
13
+ currency: string;
14
+ createdAt: number;
15
+ updatedAt: number;
16
+ }, {
17
+ txRef: import("convex/values").VString<string, "required">;
18
+ flwRef: import("convex/values").VString<string | undefined, "optional">;
19
+ transactionId: import("convex/values").VString<string | undefined, "optional">;
20
+ customerEmail: import("convex/values").VString<string, "required">;
21
+ amount: import("convex/values").VFloat64<number, "required">;
22
+ currency: import("convex/values").VString<string, "required">;
23
+ status: import("convex/values").VUnion<"cancelled" | "pending" | "successful" | "failed", [import("convex/values").VLiteral<"pending", "required">, import("convex/values").VLiteral<"successful", "required">, import("convex/values").VLiteral<"failed", "required">, import("convex/values").VLiteral<"cancelled", "required">], "required", never>;
24
+ paymentType: import("convex/values").VString<string | undefined, "optional">;
25
+ narration: import("convex/values").VString<string | undefined, "optional">;
26
+ paidAt: import("convex/values").VFloat64<number | undefined, "optional">;
27
+ metadata: import("convex/values").VString<string | undefined, "optional">;
28
+ createdAt: import("convex/values").VFloat64<number, "required">;
29
+ updatedAt: import("convex/values").VFloat64<number, "required">;
30
+ }, "required", "txRef" | "customerEmail" | "amount" | "status" | "currency" | "flwRef" | "metadata" | "narration" | "paidAt" | "paymentType" | "transactionId" | "createdAt" | "updatedAt">, {
31
+ by_txRef: ["txRef", "_creationTime"];
32
+ by_customerEmail: ["customerEmail", "_creationTime"];
33
+ }, {}, {}>;
34
+ subscriptions: import("convex/server").TableDefinition<import("convex/values").VObject<{
35
+ amount?: number | undefined;
36
+ planId?: string | undefined;
37
+ subscriptionId: string;
38
+ customerEmail: string;
39
+ status: "active" | "cancelled";
40
+ createdAt: number;
41
+ updatedAt: number;
42
+ }, {
43
+ subscriptionId: import("convex/values").VString<string, "required">;
44
+ customerEmail: import("convex/values").VString<string, "required">;
45
+ planId: import("convex/values").VString<string | undefined, "optional">;
46
+ amount: import("convex/values").VFloat64<number | undefined, "optional">;
47
+ status: import("convex/values").VUnion<"active" | "cancelled", [import("convex/values").VLiteral<"active", "required">, import("convex/values").VLiteral<"cancelled", "required">], "required", never>;
48
+ createdAt: import("convex/values").VFloat64<number, "required">;
49
+ updatedAt: import("convex/values").VFloat64<number, "required">;
50
+ }, "required", "subscriptionId" | "customerEmail" | "amount" | "planId" | "status" | "createdAt" | "updatedAt">, {
51
+ by_subscriptionId: ["subscriptionId", "_creationTime"];
52
+ by_customerEmail: ["customerEmail", "_creationTime"];
53
+ by_status: ["status", "_creationTime"];
54
+ }, {}, {}>;
55
+ webhookEvents: import("convex/server").TableDefinition<import("convex/values").VObject<{
56
+ txRef?: string | undefined;
57
+ eventId: string;
58
+ eventType: string;
59
+ payload: string;
60
+ receivedAt: number;
61
+ }, {
62
+ eventId: import("convex/values").VString<string, "required">;
63
+ eventType: import("convex/values").VString<string, "required">;
64
+ txRef: import("convex/values").VString<string | undefined, "optional">;
65
+ payload: import("convex/values").VString<string, "required">;
66
+ receivedAt: import("convex/values").VFloat64<number, "required">;
67
+ }, "required", "eventId" | "eventType" | "payload" | "txRef" | "receivedAt">, {
68
+ by_eventId: ["eventId", "_creationTime"];
69
+ by_eventType: ["eventType", "_creationTime"];
70
+ }, {}, {}>;
71
+ }, true>;
72
+ export default _default;
73
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,wBA8CG"}
@@ -0,0 +1,43 @@
1
+ import { defineSchema, defineTable } from "convex/server";
2
+ import { v } from "convex/values";
3
+ export default defineSchema({
4
+ transactions: defineTable({
5
+ txRef: v.string(),
6
+ flwRef: v.optional(v.string()),
7
+ transactionId: v.optional(v.string()),
8
+ customerEmail: v.string(),
9
+ amount: v.number(),
10
+ currency: v.string(),
11
+ status: v.union(v.literal("pending"), v.literal("successful"), v.literal("failed"), v.literal("cancelled")),
12
+ paymentType: v.optional(v.string()),
13
+ narration: v.optional(v.string()),
14
+ paidAt: v.optional(v.number()),
15
+ metadata: v.optional(v.string()),
16
+ createdAt: v.number(),
17
+ updatedAt: v.number(),
18
+ })
19
+ .index("by_txRef", ["txRef"])
20
+ .index("by_customerEmail", ["customerEmail"]),
21
+ subscriptions: defineTable({
22
+ subscriptionId: v.string(),
23
+ customerEmail: v.string(),
24
+ planId: v.optional(v.string()),
25
+ amount: v.optional(v.number()),
26
+ status: v.union(v.literal("active"), v.literal("cancelled")),
27
+ createdAt: v.number(),
28
+ updatedAt: v.number(),
29
+ })
30
+ .index("by_subscriptionId", ["subscriptionId"])
31
+ .index("by_customerEmail", ["customerEmail"])
32
+ .index("by_status", ["status"]),
33
+ webhookEvents: defineTable({
34
+ eventId: v.string(),
35
+ eventType: v.string(),
36
+ txRef: v.optional(v.string()),
37
+ payload: v.string(),
38
+ receivedAt: v.number(),
39
+ })
40
+ .index("by_eventId", ["eventId"])
41
+ .index("by_eventType", ["eventType"]),
42
+ });
43
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAElC,eAAe,YAAY,CAAC;IAC1B,YAAY,EAAE,WAAW,CAAC;QACxB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9B,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACrC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;QACzB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,MAAM,EAAE,CAAC,CAAC,KAAK,CACb,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EACpB,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EACvB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EACnB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CACvB;QACD,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACnC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9B,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;KACtB,CAAC;SACC,KAAK,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC;SAC5B,KAAK,CAAC,kBAAkB,EAAE,CAAC,eAAe,CAAC,CAAC;IAE/C,aAAa,EAAE,WAAW,CAAC;QACzB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;QAC1B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;QACzB,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC5D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;KACtB,CAAC;SACC,KAAK,CAAC,mBAAmB,EAAE,CAAC,gBAAgB,CAAC,CAAC;SAC9C,KAAK,CAAC,kBAAkB,EAAE,CAAC,eAAe,CAAC,CAAC;SAC5C,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC;IAEjC,aAAa,EAAE,WAAW,CAAC;QACzB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;KACvB,CAAC;SACC,KAAK,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,CAAC;SAChC,KAAK,CAAC,cAAc,EAAE,CAAC,WAAW,CAAC,CAAC;CACxC,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,106 @@
1
+ {
2
+ "name": "convex-flutterwave",
3
+ "description": "Accept payments and subscriptions with Flutterwave in your Convex app. Reactive transactions, subscription state, and webhook ingestion.",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "git+https://github.com/sholajegede/convex-flutterwave.git"
7
+ },
8
+ "homepage": "https://github.com/sholajegede/convex-flutterwave#readme",
9
+ "bugs": {
10
+ "url": "https://github.com/sholajegede/convex-flutterwave/issues"
11
+ },
12
+ "version": "0.0.1",
13
+ "license": "Apache-2.0",
14
+ "keywords": [
15
+ "convex",
16
+ "component",
17
+ "flutterwave",
18
+ "payments",
19
+ "billing",
20
+ "subscriptions",
21
+ "webhooks",
22
+ "africa"
23
+ ],
24
+ "type": "module",
25
+ "scripts": {
26
+ "dev": "run-p -r 'dev:*'",
27
+ "dev:backend": "convex dev --typecheck-components",
28
+ "dev:frontend": "cd example && vite --clearScreen false",
29
+ "dev:build": "chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial",
30
+ "predev": "path-exists .env.local dist || (npm run build && convex dev --once)",
31
+ "build": "tsc --project ./tsconfig.build.json",
32
+ "build:codegen": "npx convex codegen --component-dir ./src/component && npm run build",
33
+ "build:clean": "rm -rf dist *.tsbuildinfo && npm run build:codegen",
34
+ "typecheck": "tsc --noEmit && tsc -p example && tsc -p example/convex",
35
+ "lint": "eslint .",
36
+ "all": "run-p -r 'dev:*' 'test:watch'",
37
+ "test": "vitest run --typecheck",
38
+ "test:watch": "vitest --typecheck --clearScreen false",
39
+ "test:debug": "vitest --inspect-brk --no-file-parallelism",
40
+ "test:coverage": "vitest run --coverage --coverage.reporter=text",
41
+ "preversion": "npm install --legacy-peer-deps && npm run build:clean && run-p test lint typecheck",
42
+ "prepublishOnly": "npm whoami || npm login",
43
+ "alpha": "npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags",
44
+ "release": "npm version patch && npm publish && git push --follow-tags",
45
+ "version": "vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md"
46
+ },
47
+ "files": [
48
+ "dist",
49
+ "src"
50
+ ],
51
+ "exports": {
52
+ "./package.json": "./package.json",
53
+ ".": {
54
+ "types": "./dist/client/index.d.ts",
55
+ "default": "./dist/client/index.js"
56
+ },
57
+ "./test": "./src/test.ts",
58
+ "./_generated/component.js": {
59
+ "types": "./dist/component/_generated/component.d.ts"
60
+ },
61
+ "./_generated/component": {
62
+ "types": "./dist/component/_generated/component.d.ts"
63
+ },
64
+ "./convex.config.js": {
65
+ "types": "./dist/component/convex.config.d.ts",
66
+ "default": "./dist/component/convex.config.js"
67
+ },
68
+ "./convex.config": {
69
+ "types": "./dist/component/convex.config.d.ts",
70
+ "default": "./dist/component/convex.config.js"
71
+ }
72
+ },
73
+ "peerDependencies": {
74
+ "convex": "^1.34.1"
75
+ },
76
+ "devDependencies": {
77
+ "@convex-dev/eslint-plugin": "^1.2.0",
78
+ "@edge-runtime/vm": "^5.0.0",
79
+ "@eslint/eslintrc": "^3.3.5",
80
+ "@eslint/js": "9.39.4",
81
+ "@types/node": "^24.12.0",
82
+ "@types/react": "^19.2.14",
83
+ "@types/react-dom": "^19.2.3",
84
+ "@vitejs/plugin-react": "^5.2.0",
85
+ "chokidar-cli": "3.0.0",
86
+ "convex": "1.45.0",
87
+ "convex-test": "0.0.41",
88
+ "eslint": "9.39.4",
89
+ "eslint-plugin-react": "^7.37.5",
90
+ "eslint-plugin-react-hooks": "^7.0.1",
91
+ "eslint-plugin-react-refresh": "^0.5.2",
92
+ "globals": "^17.4.0",
93
+ "npm-run-all2": "8.0.4",
94
+ "path-exists-cli": "2.0.0",
95
+ "pkg-pr-new": "^0.0.66",
96
+ "prettier": "3.8.1",
97
+ "react": "^19.2.4",
98
+ "react-dom": "^19.2.4",
99
+ "typescript": "5.9.3",
100
+ "typescript-eslint": "8.57.1",
101
+ "vite": "7.3.1",
102
+ "vitest": "4.1.0"
103
+ },
104
+ "types": "./dist/client/index.d.ts",
105
+ "module": "./dist/client/index.js"
106
+ }
@@ -0,0 +1 @@
1
+ // This is only here so convex-test can detect a _generated folder