From 22665807128f0b2a2d8d640026e3b482ce1aaa8f Mon Sep 17 00:00:00 2001 From: Arpit Bruno Date: Thu, 6 Aug 2026 18:00:00 +0530 Subject: [PATCH 1/3] fixes: resolve 3.1 $refs resolutions in packaged app --- .../ApiSpecPanel/Renderers/Swagger/index.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/packages/bruno-app/src/components/ApiSpecPanel/Renderers/Swagger/index.js b/packages/bruno-app/src/components/ApiSpecPanel/Renderers/Swagger/index.js index faead0945e7..94b36c6105b 100644 --- a/packages/bruno-app/src/components/ApiSpecPanel/Renderers/Swagger/index.js +++ b/packages/bruno-app/src/components/ApiSpecPanel/Renderers/Swagger/index.js @@ -3,6 +3,24 @@ import SwaggerUI from 'swagger-ui-react'; import StyledWrapper from './StyledWrapper'; import { serializeBody } from './serializeBody'; +/* + OpenAPISec 3.1.0 resolver ignores to dereference "$refs" when document.baseURI is not http/https as the packaged app is loaded over "file:/", so every internal $ref fails with "Evaluation failed on URI". + + All non-http bases have no path to resolution and the error is thrown. + https://github.com/swagger-api/swagger-js/blob/v3.36.1/src/resolver/apidom/reference/dereference/strategies/openapi-3-1-swagger-client/visitors/dereference.js#L519 + + #HACK/tmp-workaround: + The fix: We fake the base URL so it just looks like an http address. Swagger never actually fetches it to verify, it only checks that it if its a valid URI. + "swagger-ui-react" pkg is the only in the app that reads this value, so faking it is safe. +*/ + +if (!/^https?:/.test(document.baseURI)) { + Object.defineProperty(document, 'baseURI', { + configurable: true, + get: () => 'http://localhost/' + }); +} + const serializeHeaders = (headers) => { if (!headers) return {}; if (typeof headers.entries === 'function') { From d22f9b91f236a1099ee358a6ec6fa0d83ef3d744 Mon Sep 17 00:00:00 2001 From: Arpit Bruno Date: Fri, 7 Aug 2026 12:31:58 +0530 Subject: [PATCH 2/3] fixes styling issues for spec error panel and long resolver messages --- .../Renderers/Swagger/StyledWrapper.js | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/packages/bruno-app/src/components/ApiSpecPanel/Renderers/Swagger/StyledWrapper.js b/packages/bruno-app/src/components/ApiSpecPanel/Renderers/Swagger/StyledWrapper.js index 1ee48fa7e0b..e788abfb2b4 100644 --- a/packages/bruno-app/src/components/ApiSpecPanel/Renderers/Swagger/StyledWrapper.js +++ b/packages/bruno-app/src/components/ApiSpecPanel/Renderers/Swagger/StyledWrapper.js @@ -653,6 +653,33 @@ const StyledWrapper = styled.div` height: 14px; } + /* ── Errors panel ── */ + .errors-wrapper { + margin: 16px 20px; + padding: 10px 16px; + border: 1px solid ${(props) => props.theme.status.danger.border}; + border-radius: 4px; + background: ${(props) => props.theme.status.danger.background}; + + .errors__title { + color: ${(props) => props.theme.status.danger.text}; + } + + .errors h4 { + color: ${(props) => props.theme.text}; + } + + .errors small { + color: ${(props) => props.theme.colors.text.muted}; + overflow-wrap: anywhere; + } + + .errors .message { + color: ${(props) => props.theme.text}; + overflow-wrap: anywhere; + } + } + /* ── Misc / catch-all ── */ .loading-container .loading::after { color: ${(props) => props.theme.colors.text.muted}; From 5be517bca74c5c97a0fbe1649133f02ca1ccaf61 Mon Sep 17 00:00:00 2001 From: Arpit Bruno Date: Fri, 7 Aug 2026 13:11:51 +0530 Subject: [PATCH 3/3] fixes styling for long error messages --- .../ApiSpecPanel/Renderers/Swagger/StyledWrapper.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/bruno-app/src/components/ApiSpecPanel/Renderers/Swagger/StyledWrapper.js b/packages/bruno-app/src/components/ApiSpecPanel/Renderers/Swagger/StyledWrapper.js index e788abfb2b4..66eb74c5c78 100644 --- a/packages/bruno-app/src/components/ApiSpecPanel/Renderers/Swagger/StyledWrapper.js +++ b/packages/bruno-app/src/components/ApiSpecPanel/Renderers/Swagger/StyledWrapper.js @@ -660,6 +660,17 @@ const StyledWrapper = styled.div` border: 1px solid ${(props) => props.theme.status.danger.border}; border-radius: 4px; background: ${(props) => props.theme.status.danger.background}; + overflow-wrap: anywhere; + min-width: 0; + max-width: 100%; + overflow-x: auto; + + .errors, + .error-wrapper, + .error-wrapper > div { + min-width: 0; + max-width: 100%; + } .errors__title { color: ${(props) => props.theme.status.danger.text}; @@ -671,12 +682,10 @@ const StyledWrapper = styled.div` .errors small { color: ${(props) => props.theme.colors.text.muted}; - overflow-wrap: anywhere; } .errors .message { color: ${(props) => props.theme.text}; - overflow-wrap: anywhere; } }