From 57367a7a8937a30aa21667b7e36df2d9696fd0ad Mon Sep 17 00:00:00 2001 From: kutluhaneth46 Date: Sun, 27 Sep 2026 20:38:36 +0000 Subject: [PATCH] fix(ack-pay): reject empty payment option network strings When network is present, require a non-empty string in both valibot and zod schemas (#219). AI disclosure: prepared with Cursor assistance; I reviewed the schema change and tests. --- .../reject-empty-payment-option-network.md | 5 +++++ .../src/schemas/payment-option.test.ts | 20 +++++++++++++++++++ packages/ack-pay/src/schemas/valibot.ts | 2 +- packages/ack-pay/src/schemas/zod.ts | 2 +- 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 .changeset/reject-empty-payment-option-network.md diff --git a/.changeset/reject-empty-payment-option-network.md b/.changeset/reject-empty-payment-option-network.md new file mode 100644 index 00000000..c7e22ee8 --- /dev/null +++ b/.changeset/reject-empty-payment-option-network.md @@ -0,0 +1,5 @@ +--- +"@agentcommercekit/ack-pay": patch +--- + +Reject empty-string `network` values on payment options while still allowing the field to be omitted. diff --git a/packages/ack-pay/src/schemas/payment-option.test.ts b/packages/ack-pay/src/schemas/payment-option.test.ts index 166b4496..90a9ec38 100644 --- a/packages/ack-pay/src/schemas/payment-option.test.ts +++ b/packages/ack-pay/src/schemas/payment-option.test.ts @@ -35,3 +35,23 @@ describe("paymentOptionSchema amount", () => { }, ) }) + +describe("paymentOptionSchema network", () => { + it("accepts omitted network", () => { + const value = { ...paymentOption, amount: 1 } + expect(v.safeParse(valibotPaymentOptionSchema, value).success).toBe(true) + expect(zodPaymentOptionSchema.safeParse(value).success).toBe(true) + }) + + it("accepts non-empty network", () => { + const value = { ...paymentOption, amount: 1, network: "eip155:84532" } + expect(v.safeParse(valibotPaymentOptionSchema, value).success).toBe(true) + expect(zodPaymentOptionSchema.safeParse(value).success).toBe(true) + }) + + it("rejects empty network", () => { + const value = { ...paymentOption, amount: 1, network: "" } + expect(v.safeParse(valibotPaymentOptionSchema, value).success).toBe(false) + expect(zodPaymentOptionSchema.safeParse(value).success).toBe(false) + }) +}) diff --git a/packages/ack-pay/src/schemas/valibot.ts b/packages/ack-pay/src/schemas/valibot.ts index 75fc9807..40c86668 100644 --- a/packages/ack-pay/src/schemas/valibot.ts +++ b/packages/ack-pay/src/schemas/valibot.ts @@ -20,7 +20,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(v.pipe(v.string(), v.minLength(1))), 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 05cfdca8..1a5e4fa6 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(), })