Skip to content

Commit 708aa35

Browse files
authored
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>
1 parent e0880ca commit 708aa35

File tree

3 files changed

+49
-13
lines changed

3 files changed

+49
-13
lines changed

.changeset/sixty-tomatoes-fold.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@hono/swagger-ui': patch
3+
---
4+
5+
- fix(swagger-ui): Handle undefined options and improve rendering logic for non-RENDER_TYPE_MAP edge cases
6+
- test(option-renderer): Add tests for filtering and handling invalid properties

packages/swagger-ui/src/swagger/renderer.ts

+18-13
Original file line numberDiff line numberDiff line change
@@ -127,23 +127,28 @@ export const renderSwaggerUIOptions = (options: DistSwaggerUIOptions) => {
127127
const optionsStrings = Object.entries(options)
128128
.map(([k, v]) => {
129129
const key = k as keyof typeof RENDER_TYPE_MAP
130-
if (RENDER_TYPE_MAP[key] === RENDER_TYPE.STRING) {
131-
return `${key}: '${v}'`
130+
131+
if (!RENDER_TYPE_MAP[key] || v === undefined) {
132+
return ''
132133
}
133-
if (RENDER_TYPE_MAP[key] === RENDER_TYPE.STRING_ARRAY) {
134-
if (!Array.isArray(v)) {
134+
135+
switch (RENDER_TYPE_MAP[key]) {
136+
case RENDER_TYPE.STRING:
137+
return `${key}: '${v}'`
138+
case RENDER_TYPE.STRING_ARRAY:
139+
if (!Array.isArray(v)) {
140+
return ''
141+
}
142+
return `${key}: [${v.map((ve) => `${ve}`).join(',')}]`
143+
case RENDER_TYPE.JSON_STRING:
144+
return `${key}: ${JSON.stringify(v)}`
145+
case RENDER_TYPE.RAW:
146+
return `${key}: ${v}`
147+
default:
135148
return ''
136-
}
137-
return `${key}: [${v.map((ve) => `${ve}`).join(',')}]`
138-
}
139-
if (RENDER_TYPE_MAP[key] === RENDER_TYPE.JSON_STRING) {
140-
return `${key}: ${JSON.stringify(v)}`
141-
}
142-
if (RENDER_TYPE_MAP[key] === RENDER_TYPE.RAW) {
143-
return `${key}: ${v}`
144149
}
145-
return ''
146150
})
151+
.filter(item => item !== '')
147152
.join(',')
148153

149154
return optionsStrings

packages/swagger-ui/test/option-renderer.test.ts

+25
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,31 @@ describe('SwaggerUIOption Rendering', () => {
187187
{ parameterMacro: '(parameter) => parameter', url: baseUrl },
188188
`parameterMacro: (parameter) => parameter,url: '${baseUrl}'`,
189189
],
190+
[
191+
'filters out properties not in RENDER_TYPE_MAP',
192+
{ url: baseUrl, title: 'My API', customProperty: 'value' } as DistSwaggerUIOptions & { title: string },
193+
`url: '${baseUrl}'`
194+
],
195+
[
196+
'filters out undefined values',
197+
{ url: baseUrl, layout: undefined },
198+
`url: '${baseUrl}'`
199+
],
200+
[
201+
'handles multiple invalid properties gracefully',
202+
{
203+
url: baseUrl,
204+
title: 'My API', // Not in RENDER_TYPE_MAP but used in HTML <title>
205+
presets: null as unknown, // Invalid type
206+
withCredentials: true
207+
} as DistSwaggerUIOptions & { title: string },
208+
`url: '${baseUrl}',withCredentials: true`
209+
],
210+
[
211+
'handles empty input gracefully',
212+
{ url: '' },
213+
`url: ''`
214+
]
190215
]
191216

192217
it.each(commonTests)('renders correctly with %s', (_, input, expected) => {

0 commit comments

Comments
 (0)