From 708aa3510c9847194974e91de9f0f323da945773 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 2 Mar 2025 09:52:35 +0300 Subject: [PATCH] fix(swagger-ui): fix configuration bug (#988) * fix(swagger-ui): Handle undefined options and improve rendering logic for non-RENDER_TYPE_MAP edge cases * test(option-renderer): Add tests for filtering and handling invalid properties * fix(swagger-ui): Handle undefined options and improve rendering logic --------- Co-authored-by: Younis-Ahmed <23105954+jonaahmed@users.noreply.github.com> --- .changeset/sixty-tomatoes-fold.md | 6 ++++ packages/swagger-ui/src/swagger/renderer.ts | 31 +++++++++++-------- .../swagger-ui/test/option-renderer.test.ts | 25 +++++++++++++++ 3 files changed, 49 insertions(+), 13 deletions(-) create mode 100644 .changeset/sixty-tomatoes-fold.md diff --git a/.changeset/sixty-tomatoes-fold.md b/.changeset/sixty-tomatoes-fold.md new file mode 100644 index 00000000..5740a21d --- /dev/null +++ b/.changeset/sixty-tomatoes-fold.md @@ -0,0 +1,6 @@ +--- +'@hono/swagger-ui': patch +--- + +- fix(swagger-ui): Handle undefined options and improve rendering logic for non-RENDER_TYPE_MAP edge cases +- test(option-renderer): Add tests for filtering and handling invalid properties diff --git a/packages/swagger-ui/src/swagger/renderer.ts b/packages/swagger-ui/src/swagger/renderer.ts index ce0fe7a9..399f6abf 100644 --- a/packages/swagger-ui/src/swagger/renderer.ts +++ b/packages/swagger-ui/src/swagger/renderer.ts @@ -127,23 +127,28 @@ export const renderSwaggerUIOptions = (options: DistSwaggerUIOptions) => { const optionsStrings = Object.entries(options) .map(([k, v]) => { const key = k as keyof typeof RENDER_TYPE_MAP - if (RENDER_TYPE_MAP[key] === RENDER_TYPE.STRING) { - return `${key}: '${v}'` + + if (!RENDER_TYPE_MAP[key] || v === undefined) { + return '' } - if (RENDER_TYPE_MAP[key] === RENDER_TYPE.STRING_ARRAY) { - if (!Array.isArray(v)) { + + switch (RENDER_TYPE_MAP[key]) { + case RENDER_TYPE.STRING: + return `${key}: '${v}'` + case RENDER_TYPE.STRING_ARRAY: + if (!Array.isArray(v)) { + return '' + } + return `${key}: [${v.map((ve) => `${ve}`).join(',')}]` + case RENDER_TYPE.JSON_STRING: + return `${key}: ${JSON.stringify(v)}` + case RENDER_TYPE.RAW: + return `${key}: ${v}` + default: return '' - } - return `${key}: [${v.map((ve) => `${ve}`).join(',')}]` } - if (RENDER_TYPE_MAP[key] === RENDER_TYPE.JSON_STRING) { - return `${key}: ${JSON.stringify(v)}` - } - if (RENDER_TYPE_MAP[key] === RENDER_TYPE.RAW) { - return `${key}: ${v}` - } - return '' }) + .filter(item => item !== '') .join(',') return optionsStrings diff --git a/packages/swagger-ui/test/option-renderer.test.ts b/packages/swagger-ui/test/option-renderer.test.ts index 59702e57..0af5341d 100644 --- a/packages/swagger-ui/test/option-renderer.test.ts +++ b/packages/swagger-ui/test/option-renderer.test.ts @@ -187,6 +187,31 @@ describe('SwaggerUIOption Rendering', () => { { parameterMacro: '(parameter) => parameter', url: baseUrl }, `parameterMacro: (parameter) => parameter,url: '${baseUrl}'`, ], + [ + 'filters out properties not in RENDER_TYPE_MAP', + { url: baseUrl, title: 'My API', customProperty: 'value' } as DistSwaggerUIOptions & { title: string }, + `url: '${baseUrl}'` + ], + [ + 'filters out undefined values', + { url: baseUrl, layout: undefined }, + `url: '${baseUrl}'` + ], + [ + 'handles multiple invalid properties gracefully', + { + url: baseUrl, + title: 'My API', // Not in RENDER_TYPE_MAP but used in HTML + presets: null as unknown, // Invalid type + withCredentials: true + } as DistSwaggerUIOptions & { title: string }, + `url: '${baseUrl}',withCredentials: true` + ], + [ + 'handles empty input gracefully', + { url: '' }, + `url: ''` + ] ] it.each(commonTests)('renders correctly with %s', (_, input, expected) => {