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..66eb74c5c78 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,42 @@ 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}; + 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}; + } + + .errors h4 { + color: ${(props) => props.theme.text}; + } + + .errors small { + color: ${(props) => props.theme.colors.text.muted}; + } + + .errors .message { + color: ${(props) => props.theme.text}; + } + } + /* ── Misc / catch-all ── */ .loading-container .loading::after { color: ${(props) => props.theme.colors.text.muted}; 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') {