diff --git a/.changeset/reject-empty-network.md b/.changeset/reject-empty-network.md new file mode 100644 index 0000000..a07ca03 --- /dev/null +++ b/.changeset/reject-empty-network.md @@ -0,0 +1,5 @@ +--- +"@agentcommercekit/ack-pay": patch +--- + +Reject an empty `network` on payment options when the field is present. diff --git a/packages/ack-pay/src/schemas/payment-option.test.ts b/packages/ack-pay/src/schemas/payment-option.test.ts index 166b449..c76cef2 100644 --- a/packages/ack-pay/src/schemas/payment-option.test.ts +++ b/packages/ack-pay/src/schemas/payment-option.test.ts @@ -35,3 +35,40 @@ describe("paymentOptionSchema amount", () => { }, ) }) + +describe.each([ + [ + "valibot", + (input: unknown) => v.safeParse(valibotPaymentOptionSchema, input).success, + ], + ["zod", (input: unknown) => zodPaymentOptionSchema.safeParse(input).success], +] as const)("%s paymentOptionSchema network", (_, accepts) => { + it("accepts a payment option with network omitted", () => { + expect( + accepts({ + ...paymentOption, + amount: 1, + }), + ).toBe(true) + }) + + it("accepts a payment option with a non-empty network", () => { + expect( + accepts({ + ...paymentOption, + amount: 1, + network: "eip155:8453", + }), + ).toBe(true) + }) + + it("rejects a payment option with an empty network", () => { + expect( + accepts({ + ...paymentOption, + amount: 1, + network: "", + }), + ).toBe(false) + }) +}) diff --git a/packages/ack-pay/src/schemas/valibot.ts b/packages/ack-pay/src/schemas/valibot.ts index 75fc980..e7f96f4 100644 --- a/packages/ack-pay/src/schemas/valibot.ts +++ b/packages/ack-pay/src/schemas/valibot.ts @@ -4,6 +4,7 @@ import * as v from "valibot" const urlOrDidUri = v.union([v.pipe(v.string(), v.url()), didUriSchema]) const positiveIntegerString = v.pipe(v.string(), v.regex(/^[1-9]\d*$/)) +const nonEmptyString = v.pipe(v.string(), v.minLength(1)) const timestampSchema = v.pipe( v.union([v.date(), v.string()]), @@ -20,7 +21,7 @@ export const paymentOptionSchema = v.object({ decimals: v.pipe(v.number(), v.integer(), v.toMinValue(0)), currency: v.string(), recipient: v.string(), - network: v.optional(v.string()), + network: v.optional(nonEmptyString), paymentService: v.optional(urlOrDidUri), receiptService: v.optional(urlOrDidUri), }) diff --git a/packages/ack-pay/src/schemas/zod.ts b/packages/ack-pay/src/schemas/zod.ts index 05cfdca..1a5e4fa 100644 --- a/packages/ack-pay/src/schemas/zod.ts +++ b/packages/ack-pay/src/schemas/zod.ts @@ -27,7 +27,7 @@ export const paymentOptionSchema = z.object({ decimals: z.number().int().nonnegative(), currency: z.string(), recipient: z.string(), - network: z.string().optional(), + network: z.string().min(1).optional(), paymentService: urlOrDidUri.optional(), receiptService: urlOrDidUri.optional(), })