@redocly/reef 0.132.0-next.3 → 0.132.0-next.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # @redocly/reef
2
2
 
3
+ ## 0.132.0-next.5
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [ac77c65652f]
8
+ - @redocly/asyncapi-docs@1.9.0-next.4
9
+ - @redocly/graphql-docs@1.9.0-next.4
10
+ - @redocly/openapi-docs@3.20.0-next.4
11
+ - @redocly/portal-plugin-mock-server@0.17.0-next.4
12
+
13
+ ## 0.132.0-next.4
14
+
15
+ ### Patch Changes
16
+
17
+ - 2bb8cf6c82a: Fixed an issue where URLs starting with the same characters as API reference, AsyncAPI, Scorecards, Catalog, or Developer Onboarding page slugs served data for those pages instead of showing a 404.
18
+ - Updated dependencies [94039c210d4]
19
+ - @redocly/asyncapi-docs@1.9.0-next.3
20
+ - @redocly/graphql-docs@1.9.0-next.3
21
+ - @redocly/openapi-docs@3.20.0-next.3
22
+ - @redocly/portal-plugin-mock-server@0.17.0-next.3
23
+
3
24
  ## 0.132.0-next.3
4
25
 
5
26
  ### Patch Changes
@@ -1,4 +1,3 @@
1
1
  export * from './html-script.js';
2
- export * from './ExcalidrawRenderer.js';
3
2
  export declare function openapi(): Promise<typeof import("./openapi/index.js")>;
4
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- export*from"./html-script.js";export*from"./ExcalidrawRenderer.js";async function n(){return await import("./openapi/index.js")}export{n as openapi};
1
+ export*from"./html-script.js";async function n(){return await import("./openapi/index.js")}export{n as openapi};
@@ -1,4 +1,4 @@
1
- import l from"styled-components";import*as o from"react";import{RedoclyAsyncAPIDocs as d}from"@redocly/asyncapi-docs";import{withPathPrefix as m}from"@redocly/theme/core/utils";import{usePageSharedData as p}from"../../providers/page-data/hooks";import{useCollectMarkdocOptions as f}from"./helpers.js";function h({pageProps:t}){const a=p("AsyncApiDefinition"),{document:i,apiItems:r,protocol:e,downloadUrls:n}=a,c=m(t?.settings?.baseUrlPath),s=f(t);return o.createElement(u,null,o.createElement(d,{pageProps:t,document:i,apiItems:r,routingBasePath:c,protocol:e,downloadUrls:n,markdocOptions:s}))}const u=l.div`
1
+ import m from"styled-components";import*as t from"react";import{RedoclyAsyncAPIDocs as d}from"@redocly/asyncapi-docs";import{withPathPrefix as r}from"@redocly/theme/core/utils";import{ServerRoutes as p}from"../../../constants/common.js";import{CLIENT_TELEMETRY_ENABLED as f}from"../../constants/common.js";import{PACKAGE_NAME as E}from"../../../config/product-gates";import{usePageSharedData as A}from"../../providers/page-data/hooks";import{useCollectMarkdocOptions as h}from"./helpers.js";function u({pageProps:o}){const e=A("AsyncApiDefinition"),{document:i,apiItems:a,protocol:n,downloadUrls:s}=e,c=r(o?.settings?.baseUrlPath),l=h(o);return t.createElement(g,null,t.createElement(d,{pageProps:o,document:i,apiItems:a,routingBasePath:c,protocol:n,downloadUrls:s,markdocOptions:l,telemetryConfig:{collectorUrl:new URL(r(p.OTEL_TRACES),location.origin).toString(),disabled:!f,serviceVersion:`${E}@${process.env.REDOCLY_PORTAL_VERSION}`}}))}const g=m.div`
2
2
  a[id],
3
3
  a[data-section-id],
4
4
  div[data-section-id] {
@@ -6,4 +6,4 @@ import l from"styled-components";import*as o from"react";import{RedoclyAsyncAPID
6
6
  }
7
7
 
8
8
  --sidebar-width: 0px;
9
- `;export{h as default};
9
+ `;export{u as default};
@@ -1,8 +1,8 @@
1
- import*as a from"react";import i from"styled-components";import{RedoclyOpenAPIDocs as c}from"@redocly/openapi-docs";import{LayoutVariant as s}from"@redocly/config";import{ThreePanelLayout as m}from"@redocly/theme/layouts/ThreePanelLayout";import{CatalogClassicInfoBlock as p}from"@redocly/theme/components/CatalogClassic/CatalogClassicInfoBlock";import{useUserClaims as h}from"../../app/hooks";import{usePageSharedData as u}from"../../providers/page-data/hooks";import{usePatchedStore as d}from"./helpers.js";function f({pageProps:t}){const o=h(),e=u("openAPIDocsStore"),n=a.useMemo(()=>({layout:t.apiOptions?.layout,userClaims:o}),[t.apiOptions?.layout,o]),r=d(e,t);if(!e)return"Something went wrong";const l=t.apiOptions?.layout;return a.createElement(g,null,a.createElement(v,{layout:l},a.createElement(p,{metadata:t.metadata})),a.createElement(c,{store:{options:r.options,definition:r.definition,withState:n}}))}const v=i(m)`
1
+ import*as o from"react";import i from"styled-components";import{RedoclyOpenAPIDocs as m}from"@redocly/openapi-docs";import{LayoutVariant as c}from"@redocly/config";import{CLIENT_TELEMETRY_ENABLED as s}from"../../constants/common.js";import{ThreePanelLayout as p}from"@redocly/theme/layouts/ThreePanelLayout";import{CatalogClassicInfoBlock as f}from"@redocly/theme/components/CatalogClassic/CatalogClassicInfoBlock";import{withPathPrefix as h}from"@redocly/theme/core/utils";import{useUserClaims as d}from"../../app/hooks";import{ServerRoutes as u}from"../../../constants/common.js";import{PACKAGE_NAME as E}from"../../../config/product-gates";import{usePageSharedData as v}from"../../providers/page-data/hooks";import{usePatchedStore as g}from"./helpers.js";function y({pageProps:t}){const r=d(),e=v("openAPIDocsStore"),n=o.useMemo(()=>({layout:t.apiOptions?.layout,userClaims:r}),[t.apiOptions?.layout,r]),a=g(e,t);if(!e)return"Something went wrong";const l=t.apiOptions?.layout;return o.createElement(A,null,o.createElement(S,{layout:l},o.createElement(f,{metadata:t.metadata})),o.createElement(m,{store:{options:a.options,definition:a.definition,withState:n},telemetryConfig:{collectorUrl:new URL(h(u.OTEL_TRACES),location.origin).toString(),disabled:!s,serviceVersion:`${E}@${process.env.REDOCLY_PORTAL_VERSION}`}}))}const S=i(p)`
2
2
  && {
3
- padding-right: ${({layout:t})=>t===s.THREE_PANEL?"calc(var(--panel-gap-horizontal) * 2)":"var(--panel-gap-horizontal)"};
3
+ padding-right: ${({layout:t})=>t===c.THREE_PANEL?"calc(var(--panel-gap-horizontal) * 2)":"var(--panel-gap-horizontal)"};
4
4
  }
5
- `,g=i.div`
5
+ `,A=i.div`
6
6
  div[id] {
7
7
  scroll-margin-top: calc(var(--navbar-height) + var(--banner-height) - var(--panel-gap-vertical));
8
8
  }
@@ -11,4 +11,4 @@ import*as a from"react";import i from"styled-components";import{RedoclyOpenAPIDo
11
11
  }
12
12
 
13
13
  --sidebar-width: 0px;
14
- `;export{f as default};
14
+ `;export{y as default};
@@ -1 +1 @@
1
- import a from"@markdoc/markdoc";import{isPrimitive as u}from"../../../utils/guards/is-primitive.js";import{isStringNode as i}from"../../helpers/guards/is-string-node.js";import{isTag as m}from"../../helpers/guards/is-tag.js";const g=a.nodes.fence,h={...g,attributes:{...g.attributes,label:{type:String,render:"data-label"},title:{type:String,render:"data-title"},highlight:{type:String,render:"data-highlight"}},transform(e,s){const r=e.transformAttributes(s);let t=e.transformChildren(s);const o=r["data-language"],c=r["data-title"];switch(e.attributes.process===!1&&(t=[e.attributes.content]),o){case"mermaid":return i(t[0])?new a.Tag("Mermaid",{...r,diagramSource:t[0]},t):new a.Tag(e.tag,r,t);case"excalidraw":return i(t[0])?new a.Tag("ExcalidrawRenderer",{...r,diagramSource:t[0]},t):new a.Tag(e.tag,r,t);default:const l=t.map(n=>u(n)?n.toString():m(n)?n?.attributes?.rawtag:"").join("");return i(t[0])?new a.Tag("CodeBlock",{...r,header:{title:c,controls:{copy:{}}},source:l,lang:o},[]):new a.Tag(e.tag,r,t)}}};export{h as fence};
1
+ import a from"@markdoc/markdoc";import{isPrimitive as m}from"../../../utils/guards/is-primitive.js";import{isStringNode as s}from"../../helpers/guards/is-string-node.js";import{isTag as u}from"../../helpers/guards/is-tag.js";const g=a.nodes.fence,w={...g,attributes:{...g.attributes,label:{type:String,render:"data-label"},title:{type:String,render:"data-title"},highlight:{type:String,render:"data-highlight"}},transform(r,i){const e=r.transformAttributes(i);let t=r.transformChildren(i);const o=e["data-language"],l=e["data-title"];switch(r.attributes.process===!1&&(t=[r.attributes.content]),o){case"mermaid":return s(t[0])?new a.Tag("Mermaid",{...e,diagramSource:t[0]},t):new a.Tag(r.tag,e,t);default:const c=t.map(n=>m(n)?n.toString():u(n)?n?.attributes?.rawtag:"").join("");return s(t[0])?new a.Tag("CodeBlock",{...e,header:{title:l,controls:{copy:{}}},source:c,lang:o},[]):new a.Tag(r.tag,e,t)}}};export{w as fence};
@@ -4,7 +4,6 @@ import { openApiExample } from './openapi-example.js';
4
4
  import { replayOpenApi } from './replay-openapi.js';
5
5
  import { openApiResponseSample } from './openapi-response-sample.js';
6
6
  import { jsonExample } from './json-example.js';
7
- import { excalidraw } from './excalidraw.js';
8
7
  declare const _default: {
9
8
  [jsonSchema.tagName]: import("@markdoc/markdoc").Schema & {
10
9
  dynamicComponentLib?: string;
@@ -24,9 +23,6 @@ declare const _default: {
24
23
  [jsonExample.tagName]: import("@markdoc/markdoc").Schema & {
25
24
  dynamicComponentLib?: string;
26
25
  };
27
- [excalidraw.tagName]: import("@markdoc/markdoc").Schema & {
28
- dynamicComponentLib?: string;
29
- };
30
26
  };
31
27
  export default _default;
32
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- import{jsonSchema as m}from"./json-schema.js";import{openApiCodeSample as a}from"./openapi-code-sample.js";import{openApiExample as e}from"./openapi-example.js";import{replayOpenApi as o}from"./replay-openapi.js";import{openApiResponseSample as p}from"./openapi-response-sample.js";import{jsonExample as r}from"./json-example.js";import{excalidraw as t}from"./excalidraw.js";var n={[m.tagName]:m.schema,[a.tagName]:a.schema,[e.tagName]:e.schema,[o.tagName]:o.schema,[p.tagName]:p.schema,[r.tagName]:r.schema,[t.tagName]:t.schema};export{n as default};
1
+ import{jsonSchema as m}from"./json-schema.js";import{openApiCodeSample as e}from"./openapi-code-sample.js";import{openApiExample as a}from"./openapi-example.js";import{replayOpenApi as p}from"./replay-openapi.js";import{openApiResponseSample as o}from"./openapi-response-sample.js";import{jsonExample as r}from"./json-example.js";var n={[m.tagName]:m.schema,[e.tagName]:e.schema,[a.tagName]:a.schema,[p.tagName]:p.schema,[o.tagName]:o.schema,[r.tagName]:r.schema};export{n as default};
@@ -1,4 +1,4 @@
1
- import t from"react";import c from"styled-components";import{RedoclyGraphQLDocs as h}from"@redocly/graphql-docs";import{buildSchema as l}from"graphql";import{LayoutVariant as g}from"@redocly/theme/components/SidebarActions/SidebarActions";import{useThemeConfig as p}from"@redocly/theme/core/hooks";import{usePageSharedData as f}from"../../../../client/providers/page-data/hooks.js";import{useCodeHighlight as u}from"../../../../client/app/hooks/codeHighlight/useCodeHighlight.js";function d({pageProps:o}){const e=f("graphQlSettings"),{settings:r}=o,{graphql:a}=p(),{highlight:i}=u(),s=t.useMemo(()=>({graphql:l(e)}),[e]),m=t.useMemo(()=>{const n={...a,...r};return{layout:o.apiOptions?.layout??g.THREE_PANEL,...n,markdown:{...n.markdown,highlight:i},navigation:{contentPrefix:""}}},[a,r,i,o.apiOptions?.layout]);return t.createElement(S,null,t.createElement(h,{schema:s,settings:m}))}const S=c.div`
1
+ import t from"react";import c from"styled-components";import{RedoclyGraphQLDocs as h}from"@redocly/graphql-docs";import{buildSchema as l}from"graphql";import{LayoutVariant as f}from"@redocly/theme/components/SidebarActions/SidebarActions";import{useThemeConfig as p}from"@redocly/theme/core/hooks";import{withPathPrefix as g}from"@redocly/theme/core/utils";import{ServerRoutes as E}from"../../../../constants/common.js";import{CLIENT_TELEMETRY_ENABLED as u}from"../../../../client/constants/common.js";import{PACKAGE_NAME as d}from"../../../../config/product-gates.js";import{envConfig as S}from"../../../config/env-config.js";import{usePageSharedData as L}from"../../../../client/providers/page-data/hooks.js";import{useCodeHighlight as R}from"../../../../client/app/hooks/codeHighlight/useCodeHighlight.js";function v({pageProps:o}){const e=L("graphQlSettings"),{settings:r}=o,{graphql:i}=p(),{highlight:n}=R(),m=t.useMemo(()=>({graphql:l(e)}),[e]),s=t.useMemo(()=>{const a={...i,...r};return{layout:o.apiOptions?.layout??f.THREE_PANEL,...a,markdown:{...a.markdown,highlight:n},navigation:{contentPrefix:""}}},[i,r,n,o.apiOptions?.layout]);return t.createElement(C,null,t.createElement(h,{schema:m,settings:s,telemetryConfig:{collectorUrl:new URL(g(E.OTEL_TRACES),location.origin).toString(),disabled:!u,serviceVersion:`${d}@${S.REDOCLY_PORTAL_VERSION}`}}))}const C=c.div`
2
2
  --navigation-anchor-offset: var(--navbar-height);
3
3
  --sidebar-width: 0px;
4
- `;export{d as default};
4
+ `;export{v as default};
@@ -102,6 +102,12 @@ export declare function parseSamlResponse(responseXml: string): {
102
102
  nameFormat: string;
103
103
  destination: string;
104
104
  };
105
+ export declare const oidcMetadataCache: Record<string, OidcIssuerMetadata>;
106
+ export declare const oidcJwksCache: {
107
+ jwks: Record<string, (OidcJwk & {
108
+ idpId: string;
109
+ }) | null>;
110
+ };
105
111
  export declare function getOidcMetadata(idpId: string, providerConfig: OidcProviderConfig): Promise<OidcIssuerMetadata>;
106
112
  export declare function getRedoclyTokenPayload(token: string): Promise<Record<string, unknown>>;
107
113
  export declare function isRedoclySso(config: OidcProviderConfig): boolean;
@@ -9,4 +9,4 @@ import"../node-crypto-polyfill.js";import{DOMParser as b}from"@xmldom/xmldom";im
9
9
  <samlp:NameIDPolicy
10
10
  AllowCreate="true"
11
11
  Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"/>
12
- </samlp:AuthnRequest>`,s=he(o);return{loginUrl:Z(t.ssoUrl,{SAMLRequest:s,RelayState:JSON.stringify({idpId:t.idpId,redirectTo:r,inviteCode:n,source:"portal"})})}}function he(e){return ae(H(new TextEncoder().encode(e)).buffer)}function Ke(e){const t=R(e);if(t.startsWith("<samlp:Response")||t.indexOf("<saml2p:Response")>-1)return t;const r=J(new Uint8Array(atob(e).split("").map(n=>n.charCodeAt(0))));return new TextDecoder().decode(r)}function Qe(e){try{return JSON.parse(R(e||""))}catch{throw new Error("Invalid OAuth2 state")}}function Xe(e){const t=new b().parseFromString(e,"application/xml"),n=i(t,"//*[local-name(.)='StatusCode']/@Value")[0]?.nodeValue?.endsWith("Success")||!1,o=i(t,"//*[local-name(.)='Response']/@Destination")[0]?.nodeValue||"",s=i(t,"//*[local-name(.)='Assertion']//*[local-name(.)='Issuer']/text()")[0],l=s&&s.nodeValue||void 0,m=i(t,"//*[local-name(.)='Audience']/text()")[0],A=m&&m.nodeValue||void 0,c=i(t,"//*[local-name(.)='Assertion']//*[local-name(.)='X509Certificate']/text()")[0]?.nodeValue||"",f=i(t,"//*[local-name(.)='Subject']//*[local-name(.)='NameID']/text()")[0],_=f&&f.nodeValue||"",h=i(t,"//*[local-name(.)='Subject']//*[local-name(.)='NameID']/@Format")[0],d=h&&h.nodeValue||"",x=i(t,"//*[local-name(.)='Conditions']/@NotOnOrAfter")[0],g=ye(x),T={},k=i(t,"//*[local-name(.)='AttributeStatement']//*[local-name(.)='Attribute']");if(k.length)for(const C of k){const O=i(C,"./@Name")[0];if(O.nodeValue){const U=i(C,"./*[local-name(.)='AttributeValue']/text()")[0];U?.nodeValue&&(T[O.nodeValue]=U.nodeValue)}}return{uid:_,success:n,expiresAt:g,issuerId:l,entityId:A,attrs:T,cert:c,nameFormat:d,destination:o}}function ye(e){const t=typeof e?.nodeValue=="string"&&L(Date.parse(e.nodeValue)),r=L(Date.now()),n=L(Date.now()+720*60*1e3);return t?t>r&&t<n?n:t:r}function L(e){return Math.floor(e/1e3)}const M={},w={jwks:{}};async function V(e,t){return M[e]||(M[e]=t.configurationUrl?await $(t.configurationUrl):t.configuration),M[e]}async function we(e){for(const t of Object.keys(e)){const r=e[t];if(!j(r))continue;const n=await V(t,r);if(n.jwks_uri){const a=await $(n.jwks_uri);for(const o of a.keys)w.jwks[o.kid]={...o,idpId:t}}}}async function $(e){return fetch(e,{headers:{Accept:"application/json"}}).then(t=>t.json())}async function Ye(e){return fetch(`${Q}/oidc/userinfo`,{headers:{Accept:"application/json",Authorization:`Bearer ${e}`}}).then(t=>t.status===200?t.json():void 0).catch(()=>{})}function Ge(e){if(!e.configurationUrl)return!1;const t=new URL(e.configurationUrl);return["localhost","127.0.0.1","blueharvest.cloud","bhstage.cloud","cloud.redocly.com","beta.redocly.com","cloud.eu.redocly.com","beta.eu.redocly.com","cba.au.redocly.com"].some(n=>Se(t.hostname,n))}function Se(e,t){return e===t||e.endsWith(`.${t}`)}async function Ze(e,t){const r=new b().parseFromString(e),n=i(r,"//*[local-name(.)='Signature' and namespace-uri(.)='http://www.w3.org/2000/09/xmldsig#']")[0];if(!n)throw new Error("Cannot find Signature in the SAML response");const a=se(t),o=new B({publicCert:a});o.loadSignature(n);try{return o.checkSignature(e)}catch{return!1}}function et(e,t,r,n){t==="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"&&(e=r["http://schemas.microsoft.com/identity/claims/objectidentifier"]);let a;(t==="urn:oasis:names:tc:SAML:2.0:nameid-format:email"||t==="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress")&&(a=e),t==="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"&&e?.match(/.+@.+/)&&(a=e);const o=r["http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"],s=o?.match(/.+@.+/);return a=a||r["http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"]||(s?o:void 0),a=a?.toLowerCase(),{sub:e,given_name:r["http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname"],family_name:r["http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname"],name:r["http://schemas.microsoft.com/identity/claims/displayname"]||o,email:a,email_verified:!0,teams:n?re(r[n]):[]}}function z(e,t={}){return e.map(r=>t[r]||r)}async function tt(e,t){if(!t)return{};const r=t.authorization;if(!r)return{};try{const n=p.decode(r);if(n.header.alg===y.RS256){w.jwks[n.header.kid]===void 0&&await we(e);const m=w.jwks[n.header.kid];if(!m)return w.jwks[n.header.kid]=null,{};await p.verify(r,m,y.RS256)}else await p.verify(r,I,y.HS256);const a=n.payload.idpId||w.jwks[n.header.kid]?.idpId,o=e[a]||{},s=xe(o),l=_e(o);return{...n.payload,email:n.payload.email?.toLowerCase(),idpId:a,teams:Array.from(new Set([...z(n.payload.teams||[],l),..."defaultTeams"in o&&o.defaultTeams||[],...z("teamsClaimName"in o&&n.payload[s||""]||[],l),G])),name:Ae(n.payload),isAuthenticated:!0,idpAccessToken:n.payload.idp_access_token||t.idp_access_token,federatedAccessToken:t.federated_access_token,federatedIdToken:t.federated_id_token,authCookie:r}}catch(n){n instanceof ne||ee.error("Malformed JWT token: %s",n.message)}return{}}function Ae(e){return(e.firstName&&e.lastName?`${e.firstName} ${e.lastName}`:e.name||e.given_name||e.firstName||e.lastName)||e.email}function _e(e){switch(e.type){case u.SAML2:return e.teamsAttributeMap;case u.OIDC:return e.teamsClaimMap;default:return}}function xe(e){switch(e.type){case u.SAML2:return e.teamsAttributeName;case u.OIDC:return e.teamsClaimName;default:return K}}function i(e,t){return F.select(t,e)||[]}export{We as buildLoginUrl,de as buildOidcLoginUrl,Fe as buildOidcLogoutUrl,fe as buildSAML2LoginUrl,He as createMcpAuthorizationCode,qe as createMcpSessionResource,Ke as decodeSamlResponse,he as encodeSAML2,et as extractUserClaims,ze as getAuthProviderLoginParams,ce as getOidcLoginParams,V as getOidcMetadata,Ye as getRedoclyTokenPayload,ue as getSaml2LoginParams,tt as getUserParamsFromCookies,Ae as getUsernameFromPayload,j as isOidcProviderConfig,Ge as isRedoclySso,ie as isSaml2ProviderConfig,Be as oidcExchangeCodeForToken,Qe as parseOidcState,me as parsePreviewBranch,Xe as parseSamlResponse,E as rewritePreviewAuthRedirectUri,Je as verifyMcpAuthorizationCode,Ze as verifySAMLResponse};
12
+ </samlp:AuthnRequest>`,s=he(o);return{loginUrl:Z(t.ssoUrl,{SAMLRequest:s,RelayState:JSON.stringify({idpId:t.idpId,redirectTo:r,inviteCode:n,source:"portal"})})}}function he(e){return ae(H(new TextEncoder().encode(e)).buffer)}function Ke(e){const t=R(e);if(t.startsWith("<samlp:Response")||t.indexOf("<saml2p:Response")>-1)return t;const r=J(new Uint8Array(atob(e).split("").map(n=>n.charCodeAt(0))));return new TextDecoder().decode(r)}function Qe(e){try{return JSON.parse(R(e||""))}catch{throw new Error("Invalid OAuth2 state")}}function Xe(e){const t=new b().parseFromString(e,"application/xml"),n=i(t,"//*[local-name(.)='StatusCode']/@Value")[0]?.nodeValue?.endsWith("Success")||!1,o=i(t,"//*[local-name(.)='Response']/@Destination")[0]?.nodeValue||"",s=i(t,"//*[local-name(.)='Assertion']//*[local-name(.)='Issuer']/text()")[0],l=s&&s.nodeValue||void 0,m=i(t,"//*[local-name(.)='Audience']/text()")[0],A=m&&m.nodeValue||void 0,c=i(t,"//*[local-name(.)='Assertion']//*[local-name(.)='X509Certificate']/text()")[0]?.nodeValue||"",f=i(t,"//*[local-name(.)='Subject']//*[local-name(.)='NameID']/text()")[0],_=f&&f.nodeValue||"",h=i(t,"//*[local-name(.)='Subject']//*[local-name(.)='NameID']/@Format")[0],d=h&&h.nodeValue||"",x=i(t,"//*[local-name(.)='Conditions']/@NotOnOrAfter")[0],g=ye(x),T={},k=i(t,"//*[local-name(.)='AttributeStatement']//*[local-name(.)='Attribute']");if(k.length)for(const C of k){const O=i(C,"./@Name")[0];if(O.nodeValue){const U=i(C,"./*[local-name(.)='AttributeValue']/text()")[0];U?.nodeValue&&(T[O.nodeValue]=U.nodeValue)}}return{uid:_,success:n,expiresAt:g,issuerId:l,entityId:A,attrs:T,cert:c,nameFormat:d,destination:o}}function ye(e){const t=typeof e?.nodeValue=="string"&&L(Date.parse(e.nodeValue)),r=L(Date.now()),n=L(Date.now()+720*60*1e3);return t?t>r&&t<n?n:t:r}function L(e){return Math.floor(e/1e3)}const M={},w={jwks:{}};async function V(e,t){return M[e]||(M[e]=t.configurationUrl?await $(t.configurationUrl):t.configuration),M[e]}async function we(e){for(const t of Object.keys(e)){const r=e[t];if(!j(r))continue;const n=await V(t,r);if(n.jwks_uri){const a=await $(n.jwks_uri);for(const o of a.keys)w.jwks[o.kid]={...o,idpId:t}}}}async function $(e){return fetch(e,{headers:{Accept:"application/json"}}).then(t=>t.json())}async function Ye(e){return fetch(`${Q}/oidc/userinfo`,{headers:{Accept:"application/json",Authorization:`Bearer ${e}`}}).then(t=>t.status===200?t.json():void 0).catch(()=>{})}function Ge(e){if(!e.configurationUrl)return!1;const t=new URL(e.configurationUrl);return["localhost","127.0.0.1","blueharvest.cloud","bhstage.cloud","cloud.redocly.com","beta.redocly.com","cloud.eu.redocly.com","beta.eu.redocly.com","cba.au.redocly.com"].some(n=>Se(t.hostname,n))}function Se(e,t){return e===t||e.endsWith(`.${t}`)}async function Ze(e,t){const r=new b().parseFromString(e),n=i(r,"//*[local-name(.)='Signature' and namespace-uri(.)='http://www.w3.org/2000/09/xmldsig#']")[0];if(!n)throw new Error("Cannot find Signature in the SAML response");const a=se(t),o=new B({publicCert:a});o.loadSignature(n);try{return o.checkSignature(e)}catch{return!1}}function et(e,t,r,n){t==="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"&&(e=r["http://schemas.microsoft.com/identity/claims/objectidentifier"]);let a;(t==="urn:oasis:names:tc:SAML:2.0:nameid-format:email"||t==="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress")&&(a=e),t==="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"&&e?.match(/.+@.+/)&&(a=e);const o=r["http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"],s=o?.match(/.+@.+/);return a=a||r["http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"]||(s?o:void 0),a=a?.toLowerCase(),{sub:e,given_name:r["http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname"],family_name:r["http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname"],name:r["http://schemas.microsoft.com/identity/claims/displayname"]||o,email:a,email_verified:!0,teams:n?re(r[n]):[]}}function z(e,t={}){return e.map(r=>t[r]||r)}async function tt(e,t){if(!t)return{};const r=t.authorization;if(!r)return{};try{const n=p.decode(r);if(n.header.alg===y.RS256){w.jwks[n.header.kid]===void 0&&await we(e);const m=w.jwks[n.header.kid];if(!m)return w.jwks[n.header.kid]=null,{};await p.verify(r,m,y.RS256)}else await p.verify(r,I,y.HS256);const a=n.payload.idpId||w.jwks[n.header.kid]?.idpId,o=e[a]||{},s=xe(o),l=_e(o);return{...n.payload,email:n.payload.email?.toLowerCase(),idpId:a,teams:Array.from(new Set([...z(n.payload.teams||[],l),..."defaultTeams"in o&&o.defaultTeams||[],...z("teamsClaimName"in o&&n.payload[s||""]||[],l),G])),name:Ae(n.payload),isAuthenticated:!0,idpAccessToken:n.payload.idp_access_token||t.idp_access_token,federatedAccessToken:t.federated_access_token,federatedIdToken:t.federated_id_token,authCookie:r}}catch(n){n instanceof ne||ee.error("Malformed JWT token: %s",n.message)}return{}}function Ae(e){return(e.firstName&&e.lastName?`${e.firstName} ${e.lastName}`:e.name||e.given_name||e.firstName||e.lastName)||e.email}function _e(e){switch(e.type){case u.SAML2:return e.teamsAttributeMap;case u.OIDC:return e.teamsClaimMap;default:return}}function xe(e){switch(e.type){case u.SAML2:return e.teamsAttributeName;case u.OIDC:return e.teamsClaimName;default:return K}}function i(e,t){return F.select(t,e)||[]}export{We as buildLoginUrl,de as buildOidcLoginUrl,Fe as buildOidcLogoutUrl,fe as buildSAML2LoginUrl,He as createMcpAuthorizationCode,qe as createMcpSessionResource,Ke as decodeSamlResponse,he as encodeSAML2,et as extractUserClaims,ze as getAuthProviderLoginParams,ce as getOidcLoginParams,V as getOidcMetadata,Ye as getRedoclyTokenPayload,ue as getSaml2LoginParams,tt as getUserParamsFromCookies,Ae as getUsernameFromPayload,j as isOidcProviderConfig,Ge as isRedoclySso,ie as isSaml2ProviderConfig,Be as oidcExchangeCodeForToken,w as oidcJwksCache,M as oidcMetadataCache,Qe as parseOidcState,me as parsePreviewBranch,Xe as parseSamlResponse,E as rewritePreviewAuthRedirectUri,Je as verifyMcpAuthorizationCode,Ze as verifySAMLResponse};
@@ -1 +1 @@
1
- import{DEV_LOGIN_SLUG as U,ServerRoutes as $}from"../../../constants/common.js";import{CACHE_CONTROL_NO_CACHE_HEADER_VALUE as a,DEFAULT_TITLE as F}from"../../constants/common.js";import{findInIterable as O}from"../../../utils/collection/find-in-iterable.js";import{removeTrailingSlash as N}from"../../../utils/url/remove-trailing-slash.js";import{envConfig as b}from"../../config/env-config.js";import{canAccessResource as q,filterDataByAccessDeep as j,isResourcePubliclyAccessible as B}from"../../utils/rbac.js";import{getServerProps as H}from"../../ssr/index.js";import{readSharedData as G}from"../../utils/index.js";import{getRedirectLoginUrl as M}from"../utils/get-redirect-login-url.js";import{processRedirects as V}from"./helpers/process-redirects.js";import{removeErrorDetails as k}from"../utils/remove-error-details.js";import{telemetry as K}from"../../telemetry/index.js";function ae(e,s){return async(t,p)=>{const l=t.get("logger"),{req:u}=t,{pathname:d}=new URL(u.url),{seo:f,ssoDirect:h}=e.getConfig(),i=f?.title||F;if(e?.compilationErrors?.length&&b.isDevelopMode)return t.json({templateId:"compilation-error",props:{compilationErrors:e?.compilationErrors},sharedDataIds:{}},500,{"Cache-Control":a});const g=d.match(/page-data(.*)data.json$/);if(!g)return p();const c=decodeURI(g[1]),n=c==="/index/"?"/":N(c),o=e.getRouteBySlug(n,{followRedirect:!1})||O(e.routesBySlug.values(),r=>r.hasClientRoutes&&c.startsWith(r.slug));if(c===$.OIDC_CALLBACK+"/")return t.json({templateId:"403OIDC",sharedDataIds:{},props:{seo:{title:`${i} - Forbidden`}}},200,{"Cache-Control":a});const{isAuthenticated:C,teams:D,claims:{name:v,picture:A,email:I}}=t.get("auth"),R={isAuthenticated:C,email:I,teams:D},m={isAuthenticated:C,name:v,picture:A,email:I,teams:D},L=e.getRedirect(n);if(L){const r=V({redirect:L}).location;return K.sendRedirectMessage([{object:"redirect",from:n,templateId:"404"}]),t.json({templateId:"404",redirectTo:r,sharedDataIds:{},props:{}},301,{"Cache-Control":a})}if(!o){const r=e.getRouteBySlug(n,{followRedirect:!0});return l.error(`Page not found: ${d}`),t.json({templateId:"404",redirectTo:r?.slug,sharedDataIds:{},props:{seo:{title:`${i} - Not Found`}},userData:m},404,{"Cache-Control":a})}if(l.verbose(`Page viewed: ${o.slug}`),!q(o,R,e.config.access?.rbac,e.config.access?.requiresLogin)&&o.slug!==U){if(C)return t.json({templateId:"403",sharedDataIds:{},props:{seo:{title:`${i} - Forbidden`}},userData:m},403,{"Cache-Control":a});const r=Object.keys(h||{}).length>0;return t.json({templateId:"404",sharedDataIds:{},props:{seo:{title:`${i} - Not Found`}},userData:m,...r?{redirectTo:M(e,o.slug)}:{}},r?401:404,{"Cache-Control":a})}const S=j(o.versions,R,e.config.access?.rbac,e.config.access?.requiresLogin),P=e.routesSharedData.get(o.slug)||{},T=await s(o),y=await H(o,t,T,e),{sharedDataIds:_,...E}=y,w={templateId:o.templateId,versions:S,sharedDataIds:{...P,..._||{}},props:b.isProductionEnv?k(E):E,slug:o.slug,userData:m,isPublic:B(o,e.config)};return t.json(w,200,{"Cache-Control":a})}}function se(e){return async(s,t)=>{const p=s.get("logger"),{req:l}=s,{pathname:u}=new URL(l.url),d=u.match(/\/page-data\/shared\/(.*)\.json/);if(!d)return t();const f=decodeURIComponent(d[1]),h=await G(f,e.outdir),{isAuthenticated:i,teams:g,claims:{email:c}}=s.get("auth"),n=j(h,{isAuthenticated:i,email:c,teams:g},e.config.access?.rbac,e.config.access?.requiresLogin);return n?s.json(n,200,{"Cache-Control":a}):(p.error(`Shared data not found: ${u}`),s.text("Not Found",404,{"Cache-Control":a}))}}export{ae as pageDataHandler,se as sharedPageDataHandler};
1
+ import{DEV_LOGIN_SLUG as U,ServerRoutes as $}from"../../../constants/common.js";import{CACHE_CONTROL_NO_CACHE_HEADER_VALUE as a,DEFAULT_TITLE as F}from"../../constants/common.js";import{findInIterable as O}from"../../../utils/collection/find-in-iterable.js";import{removeTrailingSlash as N}from"../../../utils/url/remove-trailing-slash.js";import{envConfig as b}from"../../config/env-config.js";import{canAccessResource as q,filterDataByAccessDeep as j,isResourcePubliclyAccessible as B}from"../../utils/rbac.js";import{getServerProps as H}from"../../ssr/index.js";import{readSharedData as G}from"../../utils/index.js";import{getRedirectLoginUrl as M}from"../utils/get-redirect-login-url.js";import{processRedirects as V}from"./helpers/process-redirects.js";import{removeErrorDetails as k}from"../utils/remove-error-details.js";import{telemetry as K}from"../../telemetry/index.js";function ae(e,s){return async(t,p)=>{const l=t.get("logger"),{req:u}=t,{pathname:d}=new URL(u.url),{seo:f,ssoDirect:h}=e.getConfig(),i=f?.title||F;if(e?.compilationErrors?.length&&b.isDevelopMode)return t.json({templateId:"compilation-error",props:{compilationErrors:e?.compilationErrors},sharedDataIds:{}},500,{"Cache-Control":a});const g=d.match(/page-data(.*)data.json$/);if(!g)return p();const c=decodeURI(g[1]),n=c==="/index/"?"/":N(c),o=e.getRouteBySlug(n,{followRedirect:!1})||O(e.routesBySlug.values(),r=>r.hasClientRoutes&&c.startsWith(r.slug+"/"));if(c===$.OIDC_CALLBACK+"/")return t.json({templateId:"403OIDC",sharedDataIds:{},props:{seo:{title:`${i} - Forbidden`}}},200,{"Cache-Control":a});const{isAuthenticated:C,teams:D,claims:{name:v,picture:A,email:I}}=t.get("auth"),R={isAuthenticated:C,email:I,teams:D},m={isAuthenticated:C,name:v,picture:A,email:I,teams:D},L=e.getRedirect(n);if(L){const r=V({redirect:L}).location;return K.sendRedirectMessage([{object:"redirect",from:n,templateId:"404"}]),t.json({templateId:"404",redirectTo:r,sharedDataIds:{},props:{}},301,{"Cache-Control":a})}if(!o){const r=e.getRouteBySlug(n,{followRedirect:!0});return l.error(`Page not found: ${d}`),t.json({templateId:"404",redirectTo:r?.slug,sharedDataIds:{},props:{seo:{title:`${i} - Not Found`}},userData:m},404,{"Cache-Control":a})}if(l.verbose(`Page viewed: ${o.slug}`),!q(o,R,e.config.access?.rbac,e.config.access?.requiresLogin)&&o.slug!==U){if(C)return t.json({templateId:"403",sharedDataIds:{},props:{seo:{title:`${i} - Forbidden`}},userData:m},403,{"Cache-Control":a});const r=Object.keys(h||{}).length>0;return t.json({templateId:"404",sharedDataIds:{},props:{seo:{title:`${i} - Not Found`}},userData:m,...r?{redirectTo:M(e,o.slug)}:{}},r?401:404,{"Cache-Control":a})}const S=j(o.versions,R,e.config.access?.rbac,e.config.access?.requiresLogin),P=e.routesSharedData.get(o.slug)||{},T=await s(o),y=await H(o,t,T,e),{sharedDataIds:_,...E}=y,w={templateId:o.templateId,versions:S,sharedDataIds:{...P,..._||{}},props:b.isProductionEnv?k(E):E,slug:o.slug,userData:m,isPublic:B(o,e.config)};return t.json(w,200,{"Cache-Control":a})}}function se(e){return async(s,t)=>{const p=s.get("logger"),{req:l}=s,{pathname:u}=new URL(l.url),d=u.match(/\/page-data\/shared\/(.*)\.json/);if(!d)return t();const f=decodeURIComponent(d[1]),h=await G(f,e.outdir),{isAuthenticated:i,teams:g,claims:{email:c}}=s.get("auth"),n=j(h,{isAuthenticated:i,email:c,teams:g},e.config.access?.rbac,e.config.access?.requiresLogin);return n?s.json(n,200,{"Cache-Control":a}):(p.error(`Shared data not found: ${u}`),s.text("Not Found",404,{"Cache-Control":a}))}}export{ae as pageDataHandler,se as sharedPageDataHandler};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redocly/reef",
3
- "version": "0.132.0-next.3",
3
+ "version": "0.132.0-next.5",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "bin": {
@@ -16,7 +16,6 @@
16
16
  "dependencies": {
17
17
  "@babel/core": "7.23.5",
18
18
  "@dr.pogodin/react-helmet": "3.0.2",
19
- "@excalidraw/excalidraw": "0.18.0",
20
19
  "@libsql/client": "0.15.4",
21
20
  "@markdoc/markdoc": "0.5.2",
22
21
  "@opentelemetry/api": "1.9.0",
@@ -92,12 +91,12 @@
92
91
  "xpath": "0.0.34",
93
92
  "yaml-ast-parser": "0.0.43",
94
93
  "zod": "^3.25.76",
95
- "@redocly/asyncapi-docs": "1.9.0-next.2",
94
+ "@redocly/asyncapi-docs": "1.9.0-next.4",
96
95
  "@redocly/config": "0.44.2",
97
- "@redocly/graphql-docs": "1.9.0-next.2",
98
- "@redocly/openapi-docs": "3.20.0-next.2",
96
+ "@redocly/graphql-docs": "1.9.0-next.4",
97
+ "@redocly/openapi-docs": "3.20.0-next.4",
99
98
  "@redocly/portal-legacy-ui": "0.15.0-next.0",
100
- "@redocly/portal-plugin-mock-server": "0.17.0-next.2",
99
+ "@redocly/portal-plugin-mock-server": "0.17.0-next.4",
101
100
  "@redocly/realm-asyncapi-sdk": "0.10.0-next.0",
102
101
  "@redocly/theme": "0.64.0-next.2"
103
102
  },
@@ -1,8 +0,0 @@
1
- import type { JSX } from 'react';
2
- type ExcalidrawRendererProps = {
3
- diagramSource: string;
4
- className?: string;
5
- };
6
- export declare function ExcalidrawRenderer({ diagramSource, className, }: ExcalidrawRendererProps): JSX.Element;
7
- export {};
8
- //# sourceMappingURL=ExcalidrawRenderer.d.ts.map
@@ -1,14 +0,0 @@
1
- import o,{useState as f,useEffect as g,useMemo as h,useRef as b}from"react";import x from"styled-components";import{useColorSwitcher as y}from"@redocly/theme/core/hooks";import{ExcalidrawDiagram as k}from"@redocly/theme/markdoc/components/ExcalidrawDiagram/ExcalidrawDiagram";import{SpinnerLoader as S}from"@redocly/theme/components/Loaders/SpinnerLoader";function F({diagramSource:n,className:v}){const{activeColorMode:w}=y(),[u,l]=f(null),[m,r]=f(null),c=b({}),i=w==="dark",s=i?"dark":"light",e=h(()=>{try{return{data:JSON.parse(n),error:null}}catch(a){return{data:null,error:a instanceof Error?a.message:"Failed to parse Excalidraw diagram"}}},[n]);return g(()=>{c.current={},l(null),r(null)},[n]),g(()=>{if(e.error){r(e.error);return}if(!e.data){r("Failed to parse Excalidraw diagram");return}const a=c.current[s];if(a){l(a),r(null);return}let d=!1;async function E(){try{const{exportToSvg:t}=await import("@excalidraw/excalidraw"),p=await t({elements:e.data?.elements||[],appState:{...e.data?.appState||{},exportWithDarkMode:i,exportBackground:!1},files:e.data?.files||null});d||(c.current[s]=p.outerHTML,l(p.outerHTML),r(null))}catch(t){d||r(t instanceof Error?t.message:"Failed to render Excalidraw diagram")}}return r(null),E(),()=>{d=!0}},[e,i,s]),m?o.createElement(M,{className:"excalidraw-wrapper"},m):u?o.createElement(k,{diagramHtml:u,className:v}):o.createElement(H,{className:"excalidraw-wrapper"},o.createElement(S,{color:"var(--border-color-secondary)",size:"32px"}))}const H=x.div`
2
- background-color: var(--excalidraw-bg-color);
3
- border-radius: var(--excalidraw-border-radius);
4
- min-height: 200px;
5
- display: flex;
6
- align-items: center;
7
- justify-content: center;
8
- `,M=x.div`
9
- background-color: var(--admonition-danger-bg-color);
10
- color: var(--admonition-danger-text-color);
11
- border-radius: var(--excalidraw-border-radius);
12
- padding: var(--spacing-md);
13
- font-size: var(--font-size-sm);
14
- `;export{F as ExcalidrawRenderer};
@@ -1,3 +0,0 @@
1
- import type { CustomMarkdocTag } from '../types.js';
2
- export declare const excalidraw: CustomMarkdocTag;
3
- //# sourceMappingURL=excalidraw.d.ts.map
@@ -1 +0,0 @@
1
- import a from"@markdoc/markdoc";import{RawContent as s}from"../attributes/raw-content.js";const c={schema:{attributes:{src:{type:s,required:!0},srcRawContent:{type:String,render:!1}},render:"ExcalidrawRenderer",selfClosing:!0,transform:(r,n)=>{const t=r.transformAttributes(n),e=r.attributes.srcRawContent;return typeof e=="string"?new a.Tag("ExcalidrawRenderer",{...t,diagramSource:e},[]):new a.Tag(r.tag,t,[])}},tagName:"excalidraw"};export{c as excalidraw};