Skip to content

Commit 3e63a7e

Browse files
authored
fix: Fail client-side on invalid Stripe event names (#492)
* Parse event names * Add changeset
1 parent 4cc690a commit 3e63a7e

File tree

3 files changed

+161
-98
lines changed

3 files changed

+161
-98
lines changed

.changeset/three-worms-impress.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@trigger.dev/stripe": patch
3+
---
4+
5+
Stripe will now fail client-side on invalid event names.

integrations/stripe/src/index.ts

Lines changed: 66 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,27 @@ import { Charges } from "./charges";
2222
import { Checkout } from "./checkout";
2323
import { Customers } from "./customers";
2424
import * as events from "./events";
25+
import {
26+
ChargeEventNames,
27+
ChargeEventNamesSchema,
28+
CheckoutSessionEventNames,
29+
CheckoutSessionEventNamesSchema,
30+
CustomerEventNames,
31+
CustomerSubscriptionEventNames,
32+
CustomerSubscriptionEventNamesSchema,
33+
ExternalAccountEventNames,
34+
ExternalAccountEventNamesSchema,
35+
PaymentIntentEventNames,
36+
PaymentIntentEventNamesSchema,
37+
PayoutEventNames,
38+
PayoutEventNamesSchema,
39+
PersonEventNames,
40+
PersonEventNamesSchema,
41+
PriceEventNames,
42+
PriceEventNamesSchema,
43+
ProductEventNames,
44+
ProductEventNamesSchema,
45+
} from "./schemas";
2546
import { Subscriptions } from "./subscriptions";
2647
import { WebhookEndpoints } from "./webhookEndpoints";
2748

@@ -183,10 +204,13 @@ export class Stripe implements TriggerIntegration {
183204
* });
184205
* ```
185206
*/
186-
onPrice(
187-
params?: TriggerParams & { events?: Array<"price.created" | "price.updated" | "price.deleted"> }
188-
) {
189-
const event = { ...events.onPrice, name: params?.events ?? events.onPrice.name };
207+
onPrice(params?: TriggerParams & { events?: PriceEventNames }) {
208+
const parsedEvents = PriceEventNamesSchema.optional().parse(params?.events);
209+
210+
const event = {
211+
...events.onPrice,
212+
name: parsedEvents ?? events.onPrice.name,
213+
};
190214

191215
return createTrigger(this.source, event, params ?? { connect: false });
192216
}
@@ -234,12 +258,13 @@ export class Stripe implements TriggerIntegration {
234258
* });
235259
* ```
236260
*/
237-
onProduct(
238-
params?: TriggerParams & {
239-
events?: Array<"product.created" | "product.updated" | "product.deleted">;
240-
}
241-
) {
242-
const event = { ...events.onProduct, name: params?.events ?? events.onProduct.name };
261+
onProduct(params?: TriggerParams & { events?: ProductEventNames }) {
262+
const parsedEvents = ProductEventNamesSchema.optional().parse(params?.events);
263+
264+
const event = {
265+
...events.onProduct,
266+
name: parsedEvents ?? events.onProduct.name,
267+
};
243268

244269
return createTrigger(this.source, event, params ?? { connect: false });
245270
}
@@ -287,19 +312,12 @@ export class Stripe implements TriggerIntegration {
287312
* });
288313
* ```
289314
*/
290-
onCheckoutSession(
291-
params?: TriggerParams & {
292-
events?: Array<
293-
| "checkout.session.completed"
294-
| "checkout.session.async_payment_succeeded"
295-
| "checkout.session.async_payment_failed"
296-
| "checkout.session.expired"
297-
>;
298-
}
299-
) {
315+
onCheckoutSession(params?: TriggerParams & { events?: CheckoutSessionEventNames }) {
316+
const parsedEvents = CheckoutSessionEventNamesSchema.optional().parse(params?.events);
317+
300318
const event = {
301319
...events.onCheckoutSession,
302-
name: params?.events ?? events.onCheckoutSession.name,
320+
name: parsedEvents ?? events.onCheckoutSession.name,
303321
};
304322

305323
return createTrigger(this.source, event, params ?? { connect: false });
@@ -349,22 +367,12 @@ export class Stripe implements TriggerIntegration {
349367
* });
350368
* ```
351369
*/
352-
onCustomerSubscription(
353-
params?: TriggerParams & {
354-
events?: Array<
355-
| "customer.subscription.created"
356-
| "customer.subscription.deleted"
357-
| "customer.subscription.updated"
358-
| "customer.subscription.paused"
359-
| "customer.subscription.pending_update_applied"
360-
| "customer.subscription.pending_update_expired"
361-
| "customer.subscription.resumed"
362-
>;
363-
}
364-
) {
370+
onCustomerSubscription(params?: TriggerParams & { events?: CustomerSubscriptionEventNames }) {
371+
const parsedEvents = CustomerSubscriptionEventNamesSchema.optional().parse(params?.events);
372+
365373
const event = {
366374
...events.onCustomerSubscription,
367-
name: params?.events ?? events.onCustomerSubscription.name,
375+
name: parsedEvents ?? events.onCustomerSubscription.name,
368376
};
369377

370378
return createTrigger(this.source, event, params ?? { connect: false });
@@ -454,11 +462,9 @@ export class Stripe implements TriggerIntegration {
454462
* });
455463
* ```
456464
*/
457-
onCustomer(
458-
params?: TriggerParams & {
459-
events?: Array<"customer.created" | "customer.deleted">;
460-
}
461-
) {
465+
onCustomer(params?: TriggerParams & { events?: CustomerEventNames }) {
466+
const parsedEvents = CustomerSubscriptionEventNamesSchema.optional().parse(params?.events);
467+
462468
const event = {
463469
...events.onCustomer,
464470
name: params?.events ?? events.onCustomer.name,
@@ -510,22 +516,12 @@ export class Stripe implements TriggerIntegration {
510516
* });
511517
* ```
512518
*/
513-
onCharge(
514-
params?: TriggerParams & {
515-
events?: Array<
516-
| "charge.captured"
517-
| "charge.expired"
518-
| "charge.failed"
519-
| "charge.pending"
520-
| "charge.refunded"
521-
| "charge.succeeded"
522-
| "charge.updated"
523-
>;
524-
}
525-
) {
519+
onCharge(params?: TriggerParams & { events?: ChargeEventNames }) {
520+
const parsedEvents = ChargeEventNamesSchema.optional().parse(params?.events);
521+
526522
const event = {
527523
...events.onCharge,
528-
name: params?.events ?? events.onCharge.name,
524+
name: parsedEvents ?? events.onCharge.name,
529525
};
530526

531527
return createTrigger(this.source, event, params ?? { connect: false });
@@ -602,18 +598,12 @@ export class Stripe implements TriggerIntegration {
602598
* });
603599
* ```
604600
*/
605-
onExternalAccount(
606-
params?: TriggerParams & {
607-
events?: Array<
608-
| "account.external_account.created"
609-
| "account.external_account.deleted"
610-
| "account.external_account.updated"
611-
>;
612-
}
613-
) {
601+
onExternalAccount(params?: TriggerParams & { events?: ExternalAccountEventNames }) {
602+
const parsedEvents = ExternalAccountEventNamesSchema.optional().parse(params?.events);
603+
614604
const event = {
615605
...events.onExternalAccount,
616-
name: params?.events ?? events.onExternalAccount.name,
606+
name: parsedEvents ?? events.onExternalAccount.name,
617607
};
618608

619609
return createTrigger(this.source, event, params ?? { connect: false });
@@ -674,14 +664,12 @@ export class Stripe implements TriggerIntegration {
674664
* });
675665
* ```
676666
*/
677-
onPerson(
678-
params?: TriggerParams & {
679-
events?: Array<"person.created" | "person.deleted" | "person.updated">;
680-
}
681-
) {
667+
onPerson(params?: TriggerParams & { events?: PersonEventNames }) {
668+
const parsedEvents = PersonEventNamesSchema.optional().parse(params?.events);
669+
682670
const event = {
683671
...events.onPerson,
684-
name: params?.events ?? events.onPerson.name,
672+
name: parsedEvents ?? events.onPerson.name,
685673
};
686674

687675
return createTrigger(this.source, event, params ?? { connect: false });
@@ -730,23 +718,12 @@ export class Stripe implements TriggerIntegration {
730718
* });
731719
* ```
732720
*/
733-
onPaymentIntent(
734-
params?: TriggerParams & {
735-
events?: Array<
736-
| "payment_intent.created"
737-
| "payment_intent.succeeded"
738-
| "payment_intent.canceled"
739-
| "payment_intent.processing"
740-
| "payment_intent.requires_action"
741-
| "payment_intent.amount_capturable_updated"
742-
| "payment_intent.payment_failed"
743-
| "payment_intent.partially_funded"
744-
>;
745-
}
746-
) {
721+
onPaymentIntent(params?: TriggerParams & { events?: PaymentIntentEventNames }) {
722+
const parsedEvents = PaymentIntentEventNamesSchema.optional().parse(params?.events);
723+
747724
const event = {
748725
...events.onPaymentIntent,
749-
name: params?.events ?? events.onPaymentIntent.name,
726+
name: parsedEvents ?? events.onPaymentIntent.name,
750727
};
751728

752729
return createTrigger(this.source, event, params ?? { connect: false });
@@ -854,21 +831,12 @@ export class Stripe implements TriggerIntegration {
854831
* });
855832
* ```
856833
*/
857-
onPayout(
858-
params?: TriggerParams & {
859-
events?: Array<
860-
| "payout.canceled"
861-
| "payout.created"
862-
| "payout.failed"
863-
| "payout.paid"
864-
| "payout.reconciliation_completed"
865-
| "payout.updated"
866-
>;
867-
}
868-
) {
834+
onPayout(params?: TriggerParams & { events?: PayoutEventNames }) {
835+
const parsedEvents = PayoutEventNamesSchema.optional().parse(params?.events);
836+
869837
const event = {
870838
...events.onPayout,
871-
name: params?.events ?? events.onPayout.name,
839+
name: parsedEvents ?? events.onPayout.name,
872840
};
873841

874842
return createTrigger(this.source, event, params ?? { connect: false });

integrations/stripe/src/schemas.ts

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import { z } from "zod"
2+
3+
export const PriceEventNamesSchema = z.array(z.enum(["price.created", "price.updated", "price.deleted"]));
4+
export type PriceEventNames = z.infer<typeof PriceEventNamesSchema>;
5+
6+
export const ProductEventNamesSchema = z.array(
7+
z.enum(["product.created", "product.updated", "product.deleted"])
8+
);
9+
export type ProductEventNames = z.infer<typeof ProductEventNamesSchema>;
10+
11+
export const CheckoutSessionEventNamesSchema = z.array(
12+
z.enum([
13+
"checkout.session.completed",
14+
"checkout.session.async_payment_succeeded",
15+
"checkout.session.async_payment_failed",
16+
"checkout.session.expired",
17+
])
18+
);
19+
export type CheckoutSessionEventNames = z.infer<typeof CheckoutSessionEventNamesSchema>;
20+
21+
export const CustomerSubscriptionEventNamesSchema = z.array(
22+
z.enum([
23+
"customer.subscription.created",
24+
"customer.subscription.deleted",
25+
"customer.subscription.updated",
26+
"customer.subscription.paused",
27+
"customer.subscription.pending_update_applied",
28+
"customer.subscription.pending_update_expired",
29+
"customer.subscription.resumed",
30+
])
31+
);
32+
export type CustomerSubscriptionEventNames = z.infer<typeof CustomerSubscriptionEventNamesSchema>;
33+
34+
export const CustomerEventNamesSchema = z.array(
35+
z.enum(["customer.created", "customer.updated", "customer.deleted"])
36+
);
37+
export type CustomerEventNames = z.infer<typeof CustomerEventNamesSchema>;
38+
39+
export const ChargeEventNamesSchema = z.array(
40+
z.enum([
41+
"charge.captured",
42+
"charge.expired",
43+
"charge.failed",
44+
"charge.pending",
45+
"charge.refunded",
46+
"charge.succeeded",
47+
"charge.updated",
48+
])
49+
);
50+
export type ChargeEventNames = z.infer<typeof ChargeEventNamesSchema>;
51+
52+
export const ExternalAccountEventNamesSchema = z.array(
53+
z.enum([
54+
"account.external_account.created",
55+
"account.external_account.updated",
56+
"account.external_account.deleted",
57+
])
58+
);
59+
export type ExternalAccountEventNames = z.infer<typeof ExternalAccountEventNamesSchema>;
60+
61+
export const PersonEventNamesSchema = z.array(
62+
z.enum(["person.created", "person.updated", "person.deleted"])
63+
);
64+
export type PersonEventNames = z.infer<typeof PersonEventNamesSchema>;
65+
66+
export const PaymentIntentEventNamesSchema = z.array(
67+
z.enum([
68+
"payment_intent.created",
69+
"payment_intent.succeeded",
70+
"payment_intent.canceled",
71+
"payment_intent.processing",
72+
"payment_intent.requires_action",
73+
"payment_intent.amount_capturable_updated",
74+
"payment_intent.payment_failed",
75+
"payment_intent.partially_funded",
76+
])
77+
);
78+
export type PaymentIntentEventNames = z.infer<typeof PaymentIntentEventNamesSchema>;
79+
80+
export const PayoutEventNamesSchema = z.array(
81+
z.enum([
82+
"payout.canceled",
83+
"payout.created",
84+
"payout.failed",
85+
"payout.paid",
86+
"payout.reconciliation_completed",
87+
"payout.updated",
88+
])
89+
);
90+
export type PayoutEventNames = z.infer<typeof PayoutEventNamesSchema>;

0 commit comments

Comments
 (0)