From 7b6ddab366138e1d639a7825d47c36397a02aa63 Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Wed, 28 Oct 2026 15:04:54 -0700 Subject: [PATCH] Type Bazaar bodyType as upstream's json, form-data, text createBazaarDiscovery typed bodyType as 'json' | 'form', but the x402 discovery schema only accepts json, form-data and text, so a declaration using 'form' fails validation. Tests run each accepted value through the upstream validator after enrichment and confirm 'form' is rejected. --- src/discovery/bazaar.ts | 2 +- tests/discovery/bazaar.test.ts | 24 +++++++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/discovery/bazaar.ts b/src/discovery/bazaar.ts index a2d8dbb..140d885 100644 --- a/src/discovery/bazaar.ts +++ b/src/discovery/bazaar.ts @@ -7,7 +7,7 @@ * `@x402/extensions` is an optional peer dependency. */ interface BazaarDiscoveryConfig { - bodyType?: 'json' | 'form'; + bodyType?: 'json' | 'form-data' | 'text'; input?: Record; output?: Record; [key: string]: unknown; diff --git a/tests/discovery/bazaar.test.ts b/tests/discovery/bazaar.test.ts index b49e8cb..1522597 100644 --- a/tests/discovery/bazaar.test.ts +++ b/tests/discovery/bazaar.test.ts @@ -1,5 +1,6 @@ +import { bazaarResourceServerExtension, validateDiscoveryExtension } from '@x402/extensions/bazaar'; import { describe, expect, it } from 'vitest'; -import { createBazaarDiscovery } from '../../src/discovery/bazaar'; +import { createBazaarDiscovery, enrichBazaarDiscoveryExtensions } from '../../src/discovery/bazaar'; describe('createBazaarDiscovery', () => { it('returns a Bazaar discovery extension when @x402/extensions is installed', async () => { @@ -15,4 +16,25 @@ describe('createBazaarDiscovery', () => { }); expect(ext).toBeDefined(); }); + + it.each(['json', 'form-data', 'text'] as const)( + 'declares a %s body that the upstream validator accepts', + async (bodyType) => { + const declared = (await createBazaarDiscovery({ bodyType, input: { q: 'x' } })) as Record; + const enriched = await enrichBazaarDiscoveryExtensions(declared, { method: 'POST', path: '/search' }); + const result = validateDiscoveryExtension(enriched?.[bazaarResourceServerExtension.key] as never); + expect(result).toEqual({ valid: true }); + }, + ); + + it('the upstream validator rejects a bodyType outside the declared union', async () => { + const declared = (await createBazaarDiscovery({ bodyType: 'form' as never, input: { q: 'x' } })) as Record< + string, + unknown + >; + const enriched = await enrichBazaarDiscoveryExtensions(declared, { method: 'POST', path: '/search' }); + const result = validateDiscoveryExtension(enriched?.[bazaarResourceServerExtension.key] as never); + expect(result.valid).toBe(false); + expect(result.errors).toContainEqual(expect.stringContaining('bodyType')); + }); });