From 40df91a3639e8bfd93c589d5fb3c8ff552c5232e Mon Sep 17 00:00:00 2001 From: "Nolann B." <100787331+nolannbiron@users.noreply.github.com> Date: Mon, 26 May 2025 18:55:11 +0200 Subject: [PATCH] Deduplicate path parameters from OpenAPI spec (#3264) --- .changeset/violet-schools-care.md | 5 +++++ packages/react-openapi/src/OpenAPISpec.tsx | 22 +++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 .changeset/violet-schools-care.md diff --git a/.changeset/violet-schools-care.md b/.changeset/violet-schools-care.md new file mode 100644 index 000000000..e77a98b5c --- /dev/null +++ b/.changeset/violet-schools-care.md @@ -0,0 +1,5 @@ +--- +'@gitbook/react-openapi': patch +--- + +Deduplicate path parameters from OpenAPI spec diff --git a/packages/react-openapi/src/OpenAPISpec.tsx b/packages/react-openapi/src/OpenAPISpec.tsx index 49c41cda4..1e6e56269 100644 --- a/packages/react-openapi/src/OpenAPISpec.tsx +++ b/packages/react-openapi/src/OpenAPISpec.tsx @@ -18,7 +18,7 @@ export function OpenAPISpec(props: { const { operation } = data; - const parameters = operation.parameters ?? []; + const parameters = deduplicateParameters(operation.parameters ?? []); const parameterGroups = groupParameters(parameters, context); const securities = 'securities' in data ? data.securities : []; @@ -113,3 +113,23 @@ function getParameterGroupName(paramIn: string, context: OpenAPIClientContext): return paramIn; } } + +/** Deduplicate parameters by name and in. + * Some specs have both parameters define at path and operation level. + * We only want to display one of them. + */ +function deduplicateParameters(parameters: OpenAPI.Parameters): OpenAPI.Parameters { + const seen = new Set(); + + return parameters.filter((param) => { + const key = `${param.name}:${param.in}`; + + if (seen.has(key)) { + return false; + } + + seen.add(key); + + return true; + }); +}