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>
pull/991/head
Younis 2025-03-02 09:52:35 +03:00 committed by GitHub
parent e0880ca4a9
commit 708aa3510c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 49 additions and 13 deletions

View File

@ -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

View File

@ -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

View File

@ -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 <title>
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) => {