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
parent
e0880ca4a9
commit
708aa3510c
|
@ -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
|
|
@ -127,23 +127,28 @@ export const renderSwaggerUIOptions = (options: DistSwaggerUIOptions) => {
|
||||||
const optionsStrings = Object.entries(options)
|
const optionsStrings = Object.entries(options)
|
||||||
.map(([k, v]) => {
|
.map(([k, v]) => {
|
||||||
const key = k as keyof typeof RENDER_TYPE_MAP
|
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 ''
|
||||||
}
|
|
||||||
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(',')
|
.join(',')
|
||||||
|
|
||||||
return optionsStrings
|
return optionsStrings
|
||||||
|
|
|
@ -187,6 +187,31 @@ describe('SwaggerUIOption Rendering', () => {
|
||||||
{ parameterMacro: '(parameter) => parameter', url: baseUrl },
|
{ parameterMacro: '(parameter) => parameter', url: baseUrl },
|
||||||
`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) => {
|
it.each(commonTests)('renders correctly with %s', (_, input, expected) => {
|
||||||
|
|
Loading…
Reference in New Issue