diff --git a/.changeset/swagger-ui-urls-standalone-preset.md b/.changeset/swagger-ui-urls-standalone-preset.md
new file mode 100644
index 000000000..f18b39daa
--- /dev/null
+++ b/.changeset/swagger-ui-urls-standalone-preset.md
@@ -0,0 +1,5 @@
+---
+'@hono/swagger-ui': patch
+---
+
+Load the standalone preset when `urls` is set so the first definition loads and can be switched from the top bar
diff --git a/packages/swagger-ui/eslint-suppressions.json b/packages/swagger-ui/eslint-suppressions.json
index da5869f19..4a630d79c 100644
--- a/packages/swagger-ui/eslint-suppressions.json
+++ b/packages/swagger-ui/eslint-suppressions.json
@@ -10,9 +10,6 @@
"src/index.ts": {
"@typescript-eslint/no-base-to-string": {
"count": 2
- },
- "@typescript-eslint/restrict-template-expressions": {
- "count": 2
}
},
"src/swagger/renderer.ts": {
diff --git a/packages/swagger-ui/src/index.test.ts b/packages/swagger-ui/src/index.test.ts
index 6e27c4867..2e1f15dc7 100644
--- a/packages/swagger-ui/src/index.test.ts
+++ b/packages/swagger-ui/src/index.test.ts
@@ -52,11 +52,11 @@ describe('SwaggerUI Rendering', () => {
-
+
@@ -64,6 +64,25 @@ describe('SwaggerUI Rendering', () => {
`)
})
+ it('keeps user-provided presets and layout when using urls', () => {
+ const html = SwaggerUI({
+ urls: [{ name: 'Petstore', url }],
+ presets: ['SwaggerUIStandalonePreset'],
+ layout: 'BaseLayout',
+ })
+ expect(html).toContain('swagger-ui-standalone-preset.js')
+ expect(html).toContain('presets: [SwaggerUIStandalonePreset]')
+ expect(html).toContain('layout: "BaseLayout"')
+ expect(html).not.toContain('StandaloneLayout')
+ })
+
+ it('does not load the standalone preset when only url is given', () => {
+ const html = SwaggerUI({ url })
+ expect(html).not.toContain('swagger-ui-standalone-preset.js')
+ expect(html).not.toContain('presets:')
+ expect(html).not.toContain('layout:')
+ })
+
it('renders correctly with custom UI', () => {
expect(
SwaggerUI({
diff --git a/packages/swagger-ui/src/index.ts b/packages/swagger-ui/src/index.ts
index 0ea05325a..5f6e80760 100644
--- a/packages/swagger-ui/src/index.ts
+++ b/packages/swagger-ui/src/index.ts
@@ -43,22 +43,30 @@ type OriginalSwaggerUIOptions = {
type SwaggerUIOptions = OriginalSwaggerUIOptions & DistSwaggerUIOptions
const SwaggerUI = ({ baseUrl, version, ...options }: SwaggerUIOptions): string => {
- const asset = remoteAssets({
- baseUrl: baseUrl,
- version: version,
- })
-
if (options.manuallySwaggerUIHtml) {
- return options.manuallySwaggerUIHtml(asset)
+ return options.manuallySwaggerUIHtml(remoteAssets({ baseUrl, version }))
}
- const optionsStrings = renderSwaggerUIOptions(options)
+ // Swagger UI only loads a definition from `urls` through the TopBar plugin,
+ // which ships in the standalone preset, so enable it when `urls` is given.
+ const useStandalonePreset = options.urls !== undefined
+ const asset = remoteAssets({ baseUrl, version, standalonePreset: useStandalonePreset })
+
+ const optionsStrings = renderSwaggerUIOptions(
+ useStandalonePreset
+ ? {
+ ...options,
+ presets: options.presets ?? ['SwaggerUIBundle.presets.apis', 'SwaggerUIStandalonePreset'],
+ layout: options.layout ?? 'StandaloneLayout',
+ }
+ : options
+ )
return `
- ${asset.css.map((url) => html`
`)}
- ${asset.js.map((url) => html``)}
+ ${asset.css.map((url) => html`
`).join('')}
+ ${asset.js.map((url) => html``).join('')}