From 260305759df6220900ec0c8038bfce773c71402c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samy=20Pess=C3=A9?= Date: Thu, 1 Feb 2024 22:29:28 +0100 Subject: [PATCH] Resolve any JSON/YAML OpenAPI file and resolve common parameters (#132) * Fix parsing of OpenAPI when content-type is unknown * Resolve common parameters * Format --- .../src/fetchOpenAPIOperation.ts | 17 +++++++++++++++- src/lib/openapi.ts | 20 +++++++++++-------- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/packages/react-openapi/src/fetchOpenAPIOperation.ts b/packages/react-openapi/src/fetchOpenAPIOperation.ts index 42d124e55..ae3674789 100644 --- a/packages/react-openapi/src/fetchOpenAPIOperation.ts +++ b/packages/react-openapi/src/fetchOpenAPIOperation.ts @@ -49,15 +49,30 @@ export async function fetchOpenAPIOperation( ): Promise { const fetcher = cacheFetcher(rawFetcher); - const operation = await resolveOpenAPI( + let operation = await resolveOpenAPI( input.url, ['paths', input.path, input.method], fetcher, ); + if (!operation) { return null; } + // Resolve common parameters + const commonParameters = await resolveOpenAPI( + input.url, + ['paths', input.path, 'parameters'], + fetcher, + ); + if (commonParameters) { + operation = { + ...operation, + parameters: [...commonParameters, ...(operation.parameters ?? [])], + }; + } + + // Resolve servers const servers = await resolveOpenAPI(input.url, ['servers'], fetcher); // Resolve securities diff --git a/src/lib/openapi.ts b/src/lib/openapi.ts index b7e4352f0..caa0924b5 100644 --- a/src/lib/openapi.ts +++ b/src/lib/openapi.ts @@ -50,15 +50,19 @@ const fetcher: OpenAPIFetcher = { let data: unknown = null; if (response.ok) { - if (response.headers.get('content-type')?.includes('yaml')) { + const text = await response.text(); + + // Try with JSON + try { + data = JSON.parse(text); + } catch (error) { + // + } + + // Try with YAML + if (!data) { try { - data = yaml.load(await response.text()); - } catch (error) { - // - } - } else if (response.headers.get('content-type')?.includes('json')) { - try { - data = await response.json(); + data = yaml.load(text); } catch (error) { // }