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('')}