@redocly/realm 0.130.0-custom.16 → 0.130.0-custom.17

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.
@@ -0,0 +1,10 @@
1
+ import * as React from 'react';
2
+ import type { OpenApiInstance } from '../../templates/openapi-docs/helpers.js';
3
+ type InstancePickerProps = {
4
+ instances?: OpenApiInstance[];
5
+ value?: string;
6
+ onChange: (value: string) => void;
7
+ };
8
+ export declare function InstancePicker({ instances, value, onChange }: InstancePickerProps): React.JSX.Element | null;
9
+ export {};
10
+ //# sourceMappingURL=InstancePicker.d.ts.map
@@ -0,0 +1,48 @@
1
+ import*as t from"react";import i from"styled-components";import{Select as p}from"@redocly/theme/components/Select/Select";import{SelectInputWrapper as d}from"@redocly/theme/components/Select/SelectInput";const v={element:"Default",value:""};function x({instances:r=[],value:o="",onChange:l}){if(!r.length)return null;const n=(r.some(e=>e.key==="")?r:[{key:"",title:"Default"},...r]).map(e=>{const a=e.title||(e.key?e.key:v.element);return{value:e.key,element:t.createElement(h,{title:a},a)}}),c=n.some(e=>e.value===o)?o:"",s=e=>{l(typeof e=="string"?e:"")};return t.createElement(f,{"data-component-name":"InstancePicker/InstancePicker",role:"region","aria-label":"Instance selector"},t.createElement(m,{htmlFor:"instance-picker-select"},"Instance:"),t.createElement(k,{disabled:!n.length,options:n,value:c,onChange:s,dataAttributes:{id:"instance-picker-select","aria-label":"Select instance"}}))}const m=i.label`
2
+ font-size: var(--version-picker-label-font-size);
3
+ font-weight: var(--version-picker-label-font-weight);
4
+ white-space: nowrap;
5
+ flex-shrink: 0;
6
+ `,k=i(p)`
7
+ --dropdown-menu-min-width: 100%;
8
+ --dropdown-menu-max-width: 100%;
9
+ --select-list-item-bg-color-active: var(--version-picker-list-item-bg-color-active);
10
+ --select-list-item-bg-color-hover: var(--version-picker-list-item-bg-color-hover);
11
+
12
+ flex: 1;
13
+ min-width: 0;
14
+
15
+ font-size: var(--version-picker-font-size);
16
+ font-weight: var(--version-picker-font-weight);
17
+ border-radius: var(--version-picker-border-radius);
18
+ line-height: var(--version-picker-line-height);
19
+ color: var(--version-picker-text-color);
20
+
21
+ ${d} {
22
+ border: var(--version-picker-input-border);
23
+ border-radius: var(--version-picker-input-border-radius);
24
+ padding: var(--version-picker-input-padding-vertical)
25
+ var(--version-picker-input-padding-horizontal);
26
+
27
+ &:focus-within {
28
+ outline: 1px solid var(--version-picker-focus-outline-color);
29
+ }
30
+ }
31
+ `,f=i.div`
32
+ display: flex;
33
+ flex-wrap: nowrap;
34
+ gap: 10px;
35
+ flex-direction: row;
36
+ align-items: center;
37
+ justify-content: space-between;
38
+ padding: var(--version-picker-padding-vertical) var(--version-picker-padding-horizontal);
39
+ border-bottom: var(--version-picker-border-bottom);
40
+ `,h=i.span`
41
+ display: block;
42
+ flex: 1;
43
+ min-width: 0;
44
+ max-width: 100%;
45
+ overflow: hidden;
46
+ text-overflow: ellipsis;
47
+ white-space: nowrap;
48
+ `;export{x as InstancePicker};
@@ -1,11 +1,19 @@
1
- import e,{useEffect as y,useState as p}from"react";import b from"styled-components";import{Menu as I}from"@redocly/theme/components/Menu/Menu";import{SidebarActions as L}from"@redocly/theme/components/SidebarActions/SidebarActions";import{Sidebar as w}from"@redocly/theme/components/Sidebar/Sidebar";import{VersionPicker as A}from"@redocly/theme/components/VersionPicker/VersionPicker";import{Button as B}from"@redocly/theme/components/Button/Button";import{CatalogEntityHistoryButton as P}from"@redocly/theme/components/Catalog/CatalogEntity/CatalogEntityHistory/CatalogEntityHistoryButton";import{ArrowLeftIcon as x}from"@redocly/theme/icons/ArrowLeftIcon/ArrowLeftIcon";import{withPathPrefix as D}from"@redocly/theme/core/utils";import{telemetry as h}from"../telemetry/index.js";import{usePreloadHistory as T}from"../usePreloadHistory";import{useTranslate as C}from"../hooks";import{usePageSharedData as M,usePageVersions as V}from"../../providers/page-data/hooks";import{useSidebarItems as j}from"./useSidebarItems";import{renderAdmonition as H,RequestAccessButton as R}from"./RequestAccessButton";function ie({layoutControls:s}){const{versions:l=[]}=V()||{},k=l.find(t=>t?.active),{translate:o}=C(),{currentItems:m,backLink:n,versionLabel:a,pushDrilldownState:g,popDrilldownState:v}=j(k),[c,S]=p(),{collapsedSidebar:i}=s,d=M("openAPIDocsStore")?.definition.info?.["x-metadata"]?.apiId,E=T(),[u,r]=p(void 0);return y(()=>{const t=setTimeout(()=>r(void 0),350);return()=>clearTimeout(t)},[u]),m.length?e.createElement(e.Fragment,null,e.createElement(w,{collapsed:i,menuItemsAnimation:u,versions:e.createElement(A,{versions:l,onChange:t=>{h.sendVersionPickerSelectionChangeMessage([{object:"version_picker",action:"change"}]);const f=location.hash?t?.link+location.hash:t?.link;f&&E.push(D(f))}}),menu:e.createElement(I,{items:m,onDrilldownOpen:t=>{r("slideInRight"),g(t)}}),footer:e.createElement("div",{style:{width:"100%"}},!i&&H(c),e.createElement(L,{...s,requestAccessButton:d?e.createElement(R,{apiId:d,status:c,setStatus:S}):null})),header:(n||a)&&e.createElement(q,null,n&&e.createElement(J,{icon:e.createElement(x,null),iconPosition:"left",variant:"ghost",size:"medium","data-component-name":"Sidebar/BackButton",to:n.slug,onClick:()=>{r("slideInLeft"),v(),h.sendSidebarDrilldownBackButtonClickedMessage([{object:"button",action:"click"}])}},i?"":n.label?e.createElement("div",{"data-translation-key":"sidebar.menu.backToLabel"},o("sidebar.menu.backToLabel",{value:o(n.labelTranslationKey,n.label)})):e.createElement("div",{"data-translation-key":"sidebar.menu.backLabel"},o("sidebar.menu.backLabel"))),a&&!i&&e.createElement(P,{version:a}))})):null}const q=b.div`
1
+ import e,{useEffect as j,useState as x}from"react";import u from"styled-components";import{Menu as M}from"@redocly/theme/components/Menu/Menu";import{SidebarActions as H}from"@redocly/theme/components/SidebarActions/SidebarActions";import{Sidebar as K}from"@redocly/theme/components/Sidebar/Sidebar";import{VersionPicker as q}from"@redocly/theme/components/VersionPicker/VersionPicker";import{Button as $}from"@redocly/theme/components/Button/Button";import{CatalogEntityHistoryButton as z}from"@redocly/theme/components/Catalog/CatalogEntity/CatalogEntityHistory/CatalogEntityHistoryButton";import{ArrowLeftIcon as F}from"@redocly/theme/icons/ArrowLeftIcon/ArrowLeftIcon";import{combineUrls as J,withPathPrefix as E,removeTrailingSlash as O}from"@redocly/theme/core/utils";import{telemetry as B}from"../telemetry/index.js";import{usePreloadHistory as U}from"../usePreloadHistory";import{useTranslate as W}from"../hooks";import{usePageData as _,usePageSharedData as G,usePageVersions as N}from"../../providers/page-data/hooks";import{useSidebarItems as Q}from"./useSidebarItems";import{InstancePicker as X}from"./InstancePicker";import{renderAdmonition as Y,RequestAccessButton as Z}from"./RequestAccessButton";function Ie({layoutControls:d}){const{versions:f=[]}=N()||{},L=f.find(t=>t?.active),{translate:c}=W(),{currentItems:p,backLink:a,versionLabel:l,pushDrilldownState:w,popDrilldownState:A}=Q(L),[h,D]=x(),{collapsedSidebar:s}=d,g=_(),i=G("openAPIDocsStore"),b=i?.definition?.info?.["x-metadata"]?.apiId,k=U(),[S,m]=x(void 0);if(j(()=>{const t=setTimeout(()=>m(void 0),350);return()=>clearTimeout(t)},[S]),!p.length)return null;const I=g?.props?.itemId,v=g?.props?.baseSlug,C=t=>{const n=i?.instances?.find(o=>o.key===t);if(!n||!v)return;const P=i?.instances?.find(o=>o.key===i?.currentInstanceKey);let r=v;if(P?.routePrefix){const o="/"+P.routePrefix;r.endsWith(o)&&(r=r.slice(0,-o.length))}const T=n.routePrefix?r+"/"+n.routePrefix:r,V=(I?n.routeSuffixesByItemId?.[I]:void 0)||n.routeSuffixesByItemId?.[""]||"/",y=O(J(T,V)),R=location.hash?`${y}${location.hash}`:y;k.push(E(R))};return e.createElement(e.Fragment,null,e.createElement(K,{collapsed:s,menuItemsAnimation:S,versions:e.createElement(te,null,e.createElement(q,{versions:f,onChange:t=>{B.sendVersionPickerSelectionChangeMessage([{object:"version_picker",action:"change"}]);const n=location.hash?t?.link+location.hash:t?.link;n&&k.push(E(n))}}),e.createElement(X,{instances:i?.instances||[],value:i?.currentInstanceKey||"",onChange:C})),menu:e.createElement(M,{items:p,onDrilldownOpen:t=>{m("slideInRight"),w(t)}}),footer:e.createElement("div",{style:{width:"100%"}},!s&&Y(h),e.createElement(H,{...d,requestAccessButton:b?e.createElement(Z,{apiId:b,status:h,setStatus:D}):null})),header:(a||l)&&e.createElement(ee,null,a&&e.createElement(ne,{icon:e.createElement(F,null),iconPosition:"left",variant:"ghost",size:"medium","data-component-name":"Sidebar/BackButton",to:a.slug,onClick:()=>{m("slideInLeft"),A(),B.sendSidebarDrilldownBackButtonClickedMessage([{object:"button",action:"click"}])}},s?"":a.label?e.createElement("div",{"data-translation-key":"sidebar.menu.backToLabel"},c("sidebar.menu.backToLabel",{value:c(a.labelTranslationKey,a.label)})):e.createElement("div",{"data-translation-key":"sidebar.menu.backLabel"},c("sidebar.menu.backLabel"))),l&&!s&&e.createElement(z,{version:l}))}))}const ee=u.div`
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  gap: var(--menu-header-container-gap);
5
5
  width: 100%;
6
- `,J=b(B)`
6
+ `,te=u.div`
7
+ [data-component-name='VersionPicker/VersionPicker'],
8
+ [data-component-name='InstancePicker/InstancePicker'] {
9
+ flex-direction: column;
10
+ align-items: stretch;
11
+ justify-content: flex-start;
12
+ gap: 6px;
13
+ }
14
+ `,ne=u($)`
7
15
  padding: var(--menu-item-padding-vertical) 0;
8
16
  height: calc(var(--line-height-base) + var(--menu-item-padding-vertical) * 2);
9
17
  justify-content: flex-start;
10
18
  width: 100%;
11
- `;export{ie as Sidebar};
19
+ `;export{Ie as Sidebar};
@@ -1 +1 @@
1
- import{useMemo as k}from"react";import{useLocation as T}from"react-router-dom";import{useThemeConfig as y}from"@redocly/theme/core/hooks";import{withoutPathPrefix as K}from"@redocly/theme/core/utils";import{usePageVersions as g,useTranslate as v,usePageSharedData as d}from"../hooks";import{useSidebarItems as x}from"./useSidebarItems";function D(){const a=d("sidebar")?.relatedNavbarItem,n=d("current-catalog-info"),r=y(),{translate:l}=v(),{versions:e=[]}=g()||{},c=e.find(m=>m?.active),{allSidebarItems:i}=x(c),t=T().pathname,o=n?.item,s=n?.catalog,b=r.breadcrumbs?.prefixItems,f=r.breadcrumbs?.hide;return k(()=>{const m=B({allSidebarItems:i,pathname:K(t),catalogItemInfo:o,relatedNavbarItem:a,catalogInfo:s,prefixItems:b,hide:f,translate:l}),p=S(i,m);return{breadcrumbs:m,currentItemSiblings:p}},[t,a,i,o,s,b,f,l])}const B=({allSidebarItems:a=[],pathname:n,catalogItemInfo:r,relatedNavbarItem:l,catalogInfo:e,prefixItems:c,hide:i,translate:u})=>{if(i===!0)return[];const t=h(a);if(t.length===0)return[];if(r){const o=t[t.length-1];o&&o.label!==r.label&&t.unshift({label:r.label,link:r.link})}if(l&&l.label!==t[0].label&&t.unshift(l),e&&t.unshift({label:u(e.labelTranslationKey,e.label),labelTranslationKey:e.labelTranslationKey,link:e.link,icon:e.icon}),c?.length){const o=c.map(s=>({label:u(s.labelTranslationKey,s.label),labelTranslationKey:s.labelTranslationKey,link:s.link,icon:s.icon}));t.unshift(...o)}return t.length===1&&(!t[0]?.link||t[0]?.link===n)?[]:t},S=(a,n)=>{if(n.length===0)return[];const r=(e,c)=>{for(const i of e){if(i.active)return{item:i,parent:c};if(i.items?.length){const u=r(i.items,i);if(u)return u}}},l=r(a);return l?.parent?l.parent.items?.filter(e=>!!(e.link&&e.link!==l.item.link&&e.label)).map(e=>({label:e.label,labelTranslationKey:e.labelTranslationKey,link:e.link,icon:e.icon}))||[]:[]},h=a=>{const n=a.find(({active:l,hasActiveSubItem:e})=>l||e);if(!n?.label)return[];const r={label:n.label,labelTranslationKey:n.labelTranslationKey,link:n.link,icon:n.icon};return n.type==="group"&&n.selectFirstItemOnExpand&&n.items?.[0]?.link&&(r.link=n.items[0].link),n.items?.length||(r.link=void 0),[r,...h(n.items||[])]};export{B as generateBreadcrumbs,S as generateSiblings,D as useBreadcrumbs};
1
+ import{useMemo as v,useRef as y}from"react";import{useLocation as K}from"react-router-dom";import{useThemeConfig as g}from"@redocly/theme/core/hooks";import{withoutPathPrefix as x}from"@redocly/theme/core/utils";import{usePageVersions as B,useTranslate as S,usePageSharedData as p}from"../hooks";import{useSidebarItems as A}from"./useSidebarItems";function F(){const a=p("sidebar")?.relatedNavbarItem,t=p("current-catalog-info"),r=g(),{translate:i}=S(),{versions:e=[]}=B()||{},u=e.find(c=>c?.active),{allSidebarItems:l}=A(u),n=K().pathname,o=t?.item,s=t?.catalog,b=r.breadcrumbs?.prefixItems,f=r.breadcrumbs?.hide,h=v(()=>{const c=I({allSidebarItems:l,pathname:x(n),catalogItemInfo:o,relatedNavbarItem:a,catalogInfo:s,prefixItems:b,hide:f,translate:i}),T=P(l,c);return{breadcrumbs:c,currentItemSiblings:T}},[n,a,l,o,s,b,f,i]),d=y(h);return(l.some(c=>c.active||c.hasActiveSubItem)||l.length===0)&&(d.current=h),d.current}const I=({allSidebarItems:a=[],pathname:t,catalogItemInfo:r,relatedNavbarItem:i,catalogInfo:e,prefixItems:u,hide:l,translate:m})=>{if(l===!0)return[];const n=k(a);if(n.length===0)return[];if(r){const o=n[n.length-1];o&&o.label!==r.label&&n.unshift({label:r.label,link:r.link})}if(i&&i.label!==n[0].label&&n.unshift(i),e&&n.unshift({label:m(e.labelTranslationKey,e.label),labelTranslationKey:e.labelTranslationKey,link:e.link,icon:e.icon}),u?.length){const o=u.map(s=>({label:m(s.labelTranslationKey,s.label),labelTranslationKey:s.labelTranslationKey,link:s.link,icon:s.icon}));n.unshift(...o)}return n.length===1&&(!n[0]?.link||n[0]?.link===t)?[]:n},P=(a,t)=>{if(t.length===0)return[];const r=(e,u)=>{for(const l of e){if(l.active)return{item:l,parent:u};if(l.items?.length){const m=r(l.items,l);if(m)return m}}},i=r(a);return i?.parent?i.parent.items?.filter(e=>!!(e.link&&e.link!==i.item.link&&e.label)).map(e=>({label:e.label,labelTranslationKey:e.labelTranslationKey,link:e.link,icon:e.icon}))||[]:[]},k=a=>{const t=a.find(({active:i,hasActiveSubItem:e})=>i||e);if(!t?.label)return[];const r={label:t.label,labelTranslationKey:t.labelTranslationKey,link:t.link,icon:t.icon};return t.type==="group"&&t.selectFirstItemOnExpand&&t.items?.[0]?.link&&(r.link=t.items[0].link),t.items?.length||(r.link=void 0),[r,...k(t.items||[])]};export{I as generateBreadcrumbs,P as generateSiblings,F as useBreadcrumbs};
@@ -1 +1 @@
1
- import*as y from"react";import{useLocation as $,useNavigate as R}from"react-router-dom";import{usePageData as V,usePageSharedData as K}from"../../hooks";import{useProcessScorecard as q}from"@redocly/theme/ext/process-scorecard";import{withoutHash as j}from"@redocly/theme/core/utils";import{telemetry as L}from"../../telemetry/index.js";import{toStringIfDefined as A}from"../../../../utils/string/to-string-if-defined.js";import{findDeepFirst as G}from"../../../../utils/tree/find-deep-first.js";function ne(e,o,t){const c=$(),a=R(),n=V(),l=J(c),s=K("catalog"),[r,f]=y.useState(()=>(e.filters??[]).map(u=>{if(u.type==="date-range"){const[d,p]=l.get(u.property)?.split("--")??[];return!d&&!p?{}:{from:d,to:p}}return new Set(l.getAll(u.property))})),[i,v]=y.useState(()=>l.get("filter")||"");o||(o=[...s]);const g=y.useMemo(()=>D(o??[],e.filters),[o,e.filters]),{processScorecard:O}=q(),C=n?.props?.customFields,I=y.useMemo(()=>Z(o??[],e,C||{},O,t),[o,e,C,O,t]),b=y.useCallback((u,d)=>{f(p=>{const S=p[u]?p[u]:new Set;return S instanceof Set?(S.has(d)?p.forEach((m,h)=>{m instanceof Set&&m.has(d)&&m.delete(d)}):S.add(d),[...p.slice(0,u),S,...p.slice(u+1)]):p}),L.sendCatalogFilterChangedMessage([{object:"catalog_filter",type:"toggle"}]),window.scrollTo(0,0)},[]),P=y.useCallback((u,d)=>{f(p=>{const S=p[u]instanceof Set?new Set(d?[d]:[]):{from:d?.from,to:d?.to},m=g[u];return p.map((h,F)=>F===u?S:g[F].parentFilter===m.property?new Set:h)}),L.sendCatalogFilterChangedMessage([{object:"catalog_filter",type:"select"}]),window.scrollTo(0,0)},[g]),N=()=>{const u=new URLSearchParams(Array.from(l.entries()));i?l.set("filter",i):l.delete("filter"),r.forEach((p,S)=>{const m=e.filters?.[S];if(!m)return;const h=Y(p);X(m.property,h,u)});const d=u.toString();d!==c.search.substring(1)&&a({search:d})};y.useEffect(()=>{N()},[e.filters,r,i,a,c]);const k=y.useMemo(()=>Q(e.filters),[e.filters]);return y.useMemo(()=>{const u=g.map((m,h)=>({...m,toggleOption:F=>b(h,F),selectOption:F=>P(h,F),selectedOptions:r[h]??new Set,isFilterUsed:(r[h]?.size??0)>0||!!r[h]?.from})),d=T(I,u,i),p=u.map((m,h)=>{const F=u.findIndex(w=>w.property===m.parentFilter),z=m.parentFilter?(r[F]?.size??0)>0||!!r[F].from:!0,U=u.filter((w,M)=>M!==h&&!k[h]?.has(M)),_=T(I,U,i),B=D(_.map(w=>({metadata:w})),e.filters);return{...m,parentUsed:z,filteredOptions:B[h].options}});return{groups:e.groupByFirstFilter&&p.length>0?H(p,d):[{title:"APIs",items:d}],filters:p,setFilterTerm:m=>{v(m),L.sendCatalogFilterChangedMessage([{object:"catalog_filter",type:"term"}])},filterTerm:i}},[g,I,i,e.groupByFirstFilter,e.filters,r,b,P,k])}function H(e,o){return e[0].options.map(t=>({title:t.value,items:o.filter(c=>{const a=c?.[e[0].property]||e[0].missingCategoryName||"Others";return Array.isArray(a)?a.includes(t.value):a===t.value})})).filter(t=>t.items.length>0)}function J(e){return y.useMemo(()=>new URLSearchParams(e.search),[e.search])}function Z(e,o,t,c,a){let n;if(o.separateVersions)n=e.map(l);else{const s={};for(const r of e){if(!r.versionFolderId){const i=r.link||r.fsPath||JSON.stringify(r);s[i]=[r];continue}let f=r.versionFolderId;if(s[f]?.find(i=>i.version===r.version)){const i=r.fsPath?.replace(/\/@.*?\//,"/@version/")??"";f=`${f}-${i}`}s[f]||(s[f]=[]),s[f].push(r)}n=Object.values(s).map(r=>{r.sort((v,g)=>(v.version||"").localeCompare(g.version||""));const f=r.map(l);return{...l(r.find(v=>v.isDefault)||r[r.length-1]),versions:f}})}return a&&(n=n.filter(s=>!!s.scorecardLevel)),n.sort((s,r)=>s.title.localeCompare(r.title)),n;function l(s){const r=s.metadata||{},f=t[s.fsPath||""]||{},i=s.link||G(s.items||[],C=>"link"in C&&!!C.link)?.link,v=s.sidebar?.[0],g={...r,...f,publishedAt:r.publishedAt||r.createdAt,title:A(r?.title)||s.label||"Untitled",description:A(r?.description),link:j(i)??"#",docsLink:j(v?.link),image:A(r?.image),version:s.version,versionFolderId:s.versionFolderId},O=c({levels:g.scorecardLevels,status:g.scorecardStatus,scorecardLevel:g.scorecardLevel,scorecardLevelIdx:g.scorecardLevelIdx},g);return{...g,scorecardLevels:O?.levels,scorecardStatus:O?.status,scorecardLevel:O?.scorecardLevel,scorecardLevelIdx:O?.scorecardLevelIdx}}}function Q(e){if(!e)return[];const o=[];for(let t=0;t<e.length;t++){const c=e[t];if(c.parentFilter){const a=e.findIndex(n=>n.property===c.parentFilter);o[a]=o[a]||new Set,o[a].add(t)}}return o}function D(e,o){return(o??[]).map(t=>{const c=t.options?Object.fromEntries(t.options.map(s=>[s,0])):void 0,a=c??{};let n=0;for(const s of e){const r=Array.isArray(s.metadata?.[t.property])?s.metadata?.[t.property]:[s.metadata?.[t.property]];for(const f of r){const i=E(String(f),t.valuesMapping);if(c){i in c&&(a[i]=a[i]+1);continue}f?a[i]=(a[i]??0)+1:n++}}const l=Object.entries(a).map(([s,r])=>({value:s,count:r}));return c||l.sort((s,r)=>s.value.localeCompare(r.value)),n&&l.push({value:t.missingCategoryNameTranslationKey||t.missingCategoryName||"Others",count:n}),{...t,options:l}})}function T(e,o,t){const c=e.filter(a=>o.every(n=>{if(n.selectedOptions&&!(n.selectedOptions instanceof Set))try{const s=new Date(a[n.property]).toISOString().split("T")[0];return s>=(n.selectedOptions.from??"")&&s<=(n.selectedOptions.to??"Z")}catch{return!0}if(n.selectedOptions.size===0)return!0;const l=E(a?.[n.property]||n.missingCategoryName||"Others",n.valuesMapping);return Array.isArray(l)?l.some(s=>n.selectedOptions.has(s)):n.selectedOptions.has(l)}));return t?(t=t.toLowerCase(),c.filter(a=>Object.values(a).some(n=>Array.isArray(n)?n.some(l=>String(l).toLowerCase().includes(t)):String(n).toLowerCase().includes(t)))):c}function E(e,o){return o?Array.isArray(e)?e.map(t=>o[String(t)]||o["*"]||t):o[String(e)]||o["*"]||e:e}function X(e,o,t){t.delete(e),o.forEach(c=>{t.append(e,c)})}function Y(e){const o=new Set;return e instanceof Set?e.forEach(t=>o.add(t)):(e.from||e.to)&&o.add(`${e.from||""}--${e.to||""}`),o}export{X as fillSearchParams,Y as getFilterValues,ne as useCatalogClassic};
1
+ import*as y from"react";import{useLocation as $,useNavigate as R}from"react-router-dom";import{usePageData as V,usePageSharedData as K}from"../../hooks";import{useProcessScorecard as q}from"@redocly/theme/ext/process-scorecard";import{withoutHash as j}from"@redocly/theme/core/utils";import{telemetry as L}from"../../telemetry/index.js";import{toStringIfDefined as A}from"../../../../utils/string/to-string-if-defined.js";import{findDeepFirst as G}from"../../../../utils/tree/find-deep-first.js";function ne(e,o,t){const c=$(),a=R(),n=V(),l=J(c),s=K("catalog"),[r,f]=y.useState(()=>(e.filters??[]).map(u=>{if(u.type==="date-range"){const[d,p]=l.get(u.property)?.split("--")??[];return!d&&!p?{}:{from:d,to:p}}return new Set(l.getAll(u.property))})),[i,v]=y.useState(()=>l.get("filter")||"");o||(o=[...s]);const g=y.useMemo(()=>D(o??[],e.filters),[o,e.filters]),{processScorecard:O}=q(),C=n?.props?.customFields,I=y.useMemo(()=>Z(o??[],e,C||{},O,t),[o,e,C,O,t]),b=y.useCallback((u,d)=>{f(p=>{const F=p[u]?p[u]:new Set;return F instanceof Set?(F.has(d)?p.forEach((m,h)=>{m instanceof Set&&m.has(d)&&m.delete(d)}):F.add(d),[...p.slice(0,u),F,...p.slice(u+1)]):p}),L.sendCatalogFilterChangedMessage([{object:"catalog_filter",type:"toggle"}]),window.scrollTo(0,0)},[]),P=y.useCallback((u,d)=>{f(p=>{const F=p[u]instanceof Set?new Set(d?[d]:[]):{from:d?.from,to:d?.to},m=g[u];return p.map((h,S)=>S===u?F:g[S].parentFilter===m.property?new Set:h)}),L.sendCatalogFilterChangedMessage([{object:"catalog_filter",type:"select"}]),window.scrollTo(0,0)},[g]),N=()=>{const u=new URLSearchParams(Array.from(l.entries()));i?l.set("filter",i):l.delete("filter"),r.forEach((p,F)=>{const m=e.filters?.[F];if(!m)return;const h=Y(p);X(m.property,h,u)});const d=u.toString();d!==c.search.substring(1)&&a({search:d})};y.useEffect(()=>{N()},[e.filters,r,i,a,c]);const k=y.useMemo(()=>Q(e.filters),[e.filters]);return y.useMemo(()=>{const u=g.map((m,h)=>({...m,toggleOption:S=>b(h,S),selectOption:S=>P(h,S),selectedOptions:r[h]??new Set,isFilterUsed:(r[h]?.size??0)>0||!!r[h]?.from})),d=T(I,u,i),p=u.map((m,h)=>{const S=u.findIndex(w=>w.property===m.parentFilter),z=m.parentFilter?(r[S]?.size??0)>0||!!r[S].from:!0,U=u.filter((w,M)=>M!==h&&!k[h]?.has(M)),_=T(I,U,i),B=D(_.map(w=>({metadata:w})),e.filters);return{...m,parentUsed:z,filteredOptions:B[h].options}});return{groups:e.groupByFirstFilter&&p.length>0?H(p,d):[{title:"APIs",items:d}],filters:p,setFilterTerm:m=>{v(m),L.sendCatalogFilterChangedMessage([{object:"catalog_filter",type:"term"}])},filterTerm:i}},[g,I,i,e.groupByFirstFilter,e.filters,r,b,P,k])}function H(e,o){return e[0].options.map(t=>({title:t.value,items:o.filter(c=>{const a=c?.[e[0].property]||e[0].missingCategoryName||"Others";return Array.isArray(a)?a.includes(t.value):a===t.value})})).filter(t=>t.items.length>0)}function J(e){return y.useMemo(()=>new URLSearchParams(e.search),[e.search])}function Z(e,o,t,c,a){a||(e=e.filter(s=>!s.metadata?.isInstance));let n;if(o.separateVersions)n=e.map(l);else{const s={};for(const r of e){if(!r.versionFolderId){const i=r.link||r.fsPath||JSON.stringify(r);s[i]=[r];continue}let f=r.versionFolderId;if(s[f]?.find(i=>i.version===r.version)){const i=r.fsPath?.replace(/\/@.*?\//,"/@version/")??"";f=`${f}-${i}`}s[f]||(s[f]=[]),s[f].push(r)}n=Object.values(s).map(r=>{r.sort((v,g)=>(v.version||"").localeCompare(g.version||""));const f=r.map(l);return{...l(r.find(v=>v.isDefault)||r[r.length-1]),versions:f}})}return a&&(n=n.filter(s=>!!s.scorecardLevel)),n.sort((s,r)=>s.title.localeCompare(r.title)),n;function l(s){const r=s.metadata||{},f=t[s.fsPath||""]||{},i=s.link||G(s.items||[],C=>"link"in C&&!!C.link)?.link,v=s.sidebar?.[0],g={...r,...f,publishedAt:r.publishedAt||r.createdAt,title:A(r?.title)||s.label||"Untitled",description:A(r?.description),link:j(i)??"#",docsLink:j(v?.link),image:A(r?.image),version:s.version,versionFolderId:s.versionFolderId},O=c({levels:g.scorecardLevels,status:g.scorecardStatus,scorecardLevel:g.scorecardLevel,scorecardLevelIdx:g.scorecardLevelIdx},g);return{...g,scorecardLevels:O?.levels,scorecardStatus:O?.status,scorecardLevel:O?.scorecardLevel,scorecardLevelIdx:O?.scorecardLevelIdx}}}function Q(e){if(!e)return[];const o=[];for(let t=0;t<e.length;t++){const c=e[t];if(c.parentFilter){const a=e.findIndex(n=>n.property===c.parentFilter);o[a]=o[a]||new Set,o[a].add(t)}}return o}function D(e,o){return(o??[]).map(t=>{const c=t.options?Object.fromEntries(t.options.map(s=>[s,0])):void 0,a=c??{};let n=0;for(const s of e){const r=Array.isArray(s.metadata?.[t.property])?s.metadata?.[t.property]:[s.metadata?.[t.property]];for(const f of r){const i=E(String(f),t.valuesMapping);if(c){i in c&&(a[i]=a[i]+1);continue}f?a[i]=(a[i]??0)+1:n++}}const l=Object.entries(a).map(([s,r])=>({value:s,count:r}));return c||l.sort((s,r)=>s.value.localeCompare(r.value)),n&&l.push({value:t.missingCategoryNameTranslationKey||t.missingCategoryName||"Others",count:n}),{...t,options:l}})}function T(e,o,t){const c=e.filter(a=>o.every(n=>{if(n.selectedOptions&&!(n.selectedOptions instanceof Set))try{const s=new Date(a[n.property]).toISOString().split("T")[0];return s>=(n.selectedOptions.from??"")&&s<=(n.selectedOptions.to??"Z")}catch{return!0}if(n.selectedOptions.size===0)return!0;const l=E(a?.[n.property]||n.missingCategoryName||"Others",n.valuesMapping);return Array.isArray(l)?l.some(s=>n.selectedOptions.has(s)):n.selectedOptions.has(l)}));return t?(t=t.toLowerCase(),c.filter(a=>Object.values(a).some(n=>Array.isArray(n)?n.some(l=>String(l).toLowerCase().includes(t)):String(n).toLowerCase().includes(t)))):c}function E(e,o){return o?Array.isArray(e)?e.map(t=>o[String(t)]||o["*"]||t):o[String(e)]||o["*"]||e:e}function X(e,o,t){t.delete(e),o.forEach(c=>{t.append(e,c)})}function Y(e){const o=new Set;return e instanceof Set?e.forEach(t=>o.add(t)):(e.from||e.to)&&o.add(`${e.from||""}--${e.to||""}`),o}export{X as fillSearchParams,Y as getFilterValues,ne as useCatalogClassic};
@@ -4,14 +4,26 @@ import type { OpenAPIDefinition } from '@redocly/openapi-docs';
4
4
  import type { EventType } from '@redocly/openapi-docs/src/events/types';
5
5
  import type { RedocConfig, PageProps } from '@redocly/config';
6
6
  type EventFunctionInput = string | ((event: EventType) => void) | undefined;
7
+ export type OpenApiInstance = {
8
+ key: string;
9
+ title?: string;
10
+ summary?: string;
11
+ tags?: string[];
12
+ routePrefix?: string;
13
+ routeSuffixesByItemId?: Record<string, string>;
14
+ };
7
15
  type OpenAPIDocsStore = {
8
16
  definition: OpenAPIDefinition;
9
17
  options: RedocConfig;
10
18
  basePath?: string;
19
+ fsPath?: string;
20
+ instances?: OpenApiInstance[];
21
+ currentInstanceKey?: string;
11
22
  };
12
23
  export declare function joinWithSeparator(base?: string, path?: string, sep?: string): string;
13
24
  export declare function parsePartials(partials?: Record<string, any>): Record<string, Node | Node[]> | undefined;
14
- export declare function usePatchedStore(storeJs: OpenAPIDocsStore, { markdown, baseSlug, customFields }: PageProps): OpenAPIDocsStore;
25
+ export declare function usePatchedStore(storeJs: OpenAPIDocsStore | undefined, { markdown, baseSlug, customFields }: PageProps): OpenAPIDocsStore | undefined;
26
+ export declare function patchOpenApiDefinitionWithVariables(definition: OpenAPIDefinition, variables: Record<string, unknown>): OpenAPIDefinition;
15
27
  export declare function safeParseFunction(fnInput: EventFunctionInput): ((event: EventType) => void) | null;
16
28
  export declare function mergeEvents(userFunction: ((event: EventType) => void) | null, telemetryEvent?: AsyncApiRealmUI.GetEventData<'openapi_docs'>[number]['eventType']): (event: EventType) => void;
17
29
  export {};
@@ -1,5 +1,5 @@
1
- import{useMemo as v}from"react";import{components as _}from"@redocly-markdoc/components";import{Ast as S}from"@markdoc/markdoc";import{PageNavigation as y}from"@redocly/theme/components/PageNavigation/PageNavigation";import{tags as w,components as P}from"@redocly/theme/markdoc/default";import{Breadcrumbs as O}from"@redocly/theme/components/Breadcrumbs/Breadcrumbs";import{withPathPrefix as u}from"@redocly/theme/core/utils";import{OPENAPI_DOCS_TEMPLATE_ID as b,ServerRoutes as d}from"../../../constants/common.js";import{isBrowser as C}from"../../../utils/env/is-browser.js";import*as x from"../../../markdoc/nodes/index.js";import E from"../../../markdoc/tags/index.js";import*as A from"../../app/markdoc/custom-components/index.js";import{usePageData as R,useSidebarSiblingsData as T}from"../../providers/page-data/hooks";import{telemetry as U}from"../../app/telemetry/index.js";import{getMockServerDocsConfig as $}from"./mock-server-config.js";function K(e="",t="",o="/"){return e.endsWith(o)&&(e=e.slice(0,-o.length)),t.startsWith(o)&&(t=t.slice(o.length)),!e||!t?e+t:e+o+t}function D(e){if(e)return Object.entries(e).reduce((t,[o,s])=>(t[o]=S.fromJSON(JSON.stringify(s)),t),{})}function X(e,{markdown:t,baseSlug:o,customFields:s}){return v(()=>{const a=C();function m(n,i){return n?.replace(/\/$/,"")===i?.replace(/\/$/,"")}function g(n){return e.definition.servers?.find(i=>m(i.url,n.host))?.description||(n.environment?n.environment+" server":null)||"Computed server"}const c=s?.computedServers||e.definition["x-computed-servers"];if(c){const n=e.definition.servers?.filter(r=>!c.some(l=>m(l.host,r.url))),i=c.map(r=>{const l=g(r);return{...r,url:r.host,"x-isLive":!0,description:l,"x-labels":[r.tenant?{label:"Gateway Name",color:"gold",value:r.tenant}:null,r.environment?{label:"Env",color:"blue",value:r.environment}:null,r.version?{label:"Version",color:"green",value:r.version}:null].filter(Boolean)}});e.definition.servers=[...i||[],...n||[]]}if(e.options.oAuth2RedirectURI=a?`${window.location.origin}${u(d.REPLAY_OAUTH2_CALLBACK)}`:null,e.options.routingBasePath=u(o),e.options.mockServer=$(e.options.mockServer,o),!e.options.corsProxyUrl){const n=u(`${d.CORS_PROXY}/`);e.options.corsProxyUrl=a?new URL(n,window.location.origin).toString():n}e.options.scrollYOffset=a?parseInt(getComputedStyle(document.documentElement).getPropertyValue("--navbar-height"),10):0,e.options.markdocOptions={tags:{...E,...w},nodes:{...x},components:{...A,...P,..._,...globalThis.__LOADER.markdocComponents},...t,partials:D(t?.partials)},e.options.unstable_hooks={...e.options.unstable_hooks,MiddlePanelFooter:()=>{const{templateId:n}=R()||{},{nextPage:i,prevPage:r}=T()||{};return n===b?null:y({nextPage:i,prevPage:r})},MiddlePanelHeader:()=>O({})};const h={codeSamplesLanguageSwitch:"samples_language_switch",codeSamplesCopy:"code_samples_copy",panelToggle:"panel_toggle",targetServerSwitch:"target_server_switch",tryItOpen:"try_it_toggle",tryItSent:"try_it_sent"},f={};for(const[n,i]of Object.entries(h)){const r=I(e.options.events?.[n]);f[n]=L(r,i)}return e.options.events=f,e},[e,t,o,s])}function I(e){if(typeof window>"u")return null;if(typeof e=="function")return e;if(typeof e!="string")return null;try{const t=e.trim();if(!t.match(/^(\([^)]*\)\s*=>\s*.+|[a-zA-Z_$][\w$]*\s*=>\s*.+)$/))throw new Error("Invalid function format. Only arrow functions allowed.");if(["eval","Function","constructor","prototype","__proto__","import","require","process","global","window","document"].some(p=>t.includes(p)))throw new Error("Function contains prohibited keywords");return new Function("event",`
1
+ import{useMemo as b}from"react";import{components as O}from"@redocly-markdoc/components";import{Ast as A}from"@markdoc/markdoc";import{PageNavigation as C}from"@redocly/theme/components/PageNavigation/PageNavigation";import{tags as E,components as L}from"@redocly/theme/markdoc/default";import{Breadcrumbs as T}from"@redocly/theme/components/Breadcrumbs/Breadcrumbs";import{withPathPrefix as f}from"@redocly/theme/core/utils";import{OPENAPI_DOCS_TEMPLATE_ID as V,ServerRoutes as y}from"../../../constants/common.js";import{isBrowser as $}from"../../../utils/env/is-browser.js";import*as x from"../../../markdoc/nodes/index.js";import R from"../../../markdoc/tags/index.js";import*as v from"../../app/markdoc/custom-components/index.js";import{usePageData as I,useSidebarSiblingsData as N}from"../../providers/page-data/hooks";import{telemetry as M}from"../../app/telemetry/index.js";import{getMockServerDocsConfig as U}from"./mock-server-config.js";function oe(e="",t="",r="/"){return e.endsWith(r)&&(e=e.slice(0,-r.length)),t.startsWith(r)&&(t=t.slice(r.length)),!e||!t?e+t:e+r+t}function k(e){if(e)return Object.entries(e).reduce((t,[r,o])=>(t[r]=A.fromJSON(JSON.stringify(o)),t),{})}const D=/\$\{([^}|]+)(?:\|([^}]*))?\}/g,j=/^\$\{([^}|]+)(?:\|([^}]*))?\}$/;function ie(e,{markdown:t,baseSlug:r,customFields:o}){return b(()=>{if(!e)return e;const n=B(e),i=$();function d(s,u){return s?.replace(/\/$/,"")===u?.replace(/\/$/,"")}function w(s){return n.definition.servers?.find(u=>d(u.url,s.host))?.description||(s.environment?s.environment+" server":null)||"Computed server"}const p=o?.computedServers||n.definition["x-computed-servers"];if(p){const s=n.definition.servers?.filter(a=>!p.some(l=>d(l.host,a.url))),u=p.map(a=>{const l=w(a);return{...a,url:a.host,"x-isLive":!0,description:l,"x-labels":[a.tenant?{label:"Gateway Name",color:"gold",value:a.tenant}:null,a.environment?{label:"Env",color:"blue",value:a.environment}:null,a.version?{label:"Version",color:"green",value:a.version}:null].filter(Boolean)}});n.definition.servers=[...u||[],...s||[]]}if(n.options.oAuth2RedirectURI=i?`${window.location.origin}${f(y.REPLAY_OAUTH2_CALLBACK)}`:null,n.options.routingBasePath=f(r),n.options.mockServer=U(n.options.mockServer,r),!n.options.corsProxyUrl){const s=f(`${y.CORS_PROXY}/`);n.options.corsProxyUrl=i?new URL(s,window.location.origin).toString():s}n.options.scrollYOffset=i?parseInt(getComputedStyle(document.documentElement).getPropertyValue("--navbar-height"),10):0,n.options.markdocOptions={tags:{...R,...E},nodes:{...x},components:{...v,...L,...O,...globalThis.__LOADER.markdocComponents},...t,partials:k(t?.partials)},n.options.unstable_hooks={...n.options.unstable_hooks,MiddlePanelFooter:()=>{const{templateId:s}=I()||{},{nextPage:u,prevPage:a}=N()||{};return s===V?null:C({nextPage:u,prevPage:a})},MiddlePanelHeader:()=>T({})};const P={codeSamplesLanguageSwitch:"samples_language_switch",codeSamplesCopy:"code_samples_copy",panelToggle:"panel_toggle",targetServerSwitch:"target_server_switch",tryItOpen:"try_it_toggle",tryItSent:"try_it_sent"},g={};for(const[s,u]of Object.entries(P)){const a=z(n.options.events?.[s]);g[s]=W(a,u)}return n.options.events=g,n},[e,t,r,o])}function B(e){return{...e,definition:JSON.parse(JSON.stringify(e.definition)),options:{...e.options}}}function se(e,t){return m(e,t)}function m(e,t){return typeof e=="string"?h(e,t):Array.isArray(e)?e.map(r=>m(r,t)):e&&typeof e=="object"?Object.entries(e).reduce((r,[o,c])=>{const n=h(o,t),i=typeof n=="string"?n:S(n);return r[i]=m(c,t),r},{}):e}function h(e,t){const r=e.match(j);if(r){const o=_(r[1]||"",t,r[2]);return o.found?o.value:e}return e.replace(D,(o,c,n)=>{const i=_(c,t,n);return i.found?S(i.value):o})}function _(e,t,r){const o=F(e);for(const i of o)if(Object.prototype.hasOwnProperty.call(t,i))return{found:!0,value:t[i]};const c=e.trim().toLowerCase(),n=Object.keys(t).find(i=>i.trim().toLowerCase()===c);return n?{found:!0,value:t[n]}:r!==void 0?{found:!0,value:r}:{found:!1,value:void 0}}function F(e){const t=e.trim(),r=t.replace(/_/g,"-").replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),o=t.replace(/-/g,"_").replace(/([a-z0-9])([A-Z])/g,"$1_$2").toLowerCase(),c=t.replace(/[-_]+([a-zA-Z0-9])/g,(n,i)=>i.toUpperCase());return Array.from(new Set([t,r,o,c]))}function S(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean"||typeof e=="bigint")return String(e);try{return JSON.stringify(e)}catch{return String(e)}}function z(e){if(typeof window>"u")return null;if(typeof e=="function")return e;if(typeof e!="string")return null;try{const t=e.trim();if(!t.match(/^(\([^)]*\)\s*=>\s*.+|[a-zA-Z_$][\w$]*\s*=>\s*.+)$/))throw new Error("Invalid function format. Only arrow functions allowed.");if(["eval","Function","constructor","prototype","__proto__","import","require","process","global","window","document"].some(c=>t.includes(c)))throw new Error("Function contains prohibited keywords");return new Function("event",`
2
2
  'use strict';
3
3
  const userFn = ${t};
4
4
  return userFn(event);
5
- `)}catch(t){return console.error("Function parsing error:",t),null}}function L(e,t){return o=>{if(e)try{e(o)}catch(s){console.error("User event handler error:",s)}if(t)try{U.sendOpenapiDocsMessage([{object:"openapi_docs",eventType:t,operationHttpVerb:o.operationHttpVerb,operationPath:o.operationPath,lang:"lang"in o?o.lang:void 0,action:o.action,state:"state"in o?o.state:void 0,serverUrl:"serverUrl"in o?o.serverUrl:void 0}])}catch{}}}export{K as joinWithSeparator,L as mergeEvents,D as parsePartials,I as safeParseFunction,X as usePatchedStore};
5
+ `)}catch(t){return console.error("Function parsing error:",t),null}}function W(e,t){return r=>{if(e)try{e(r)}catch(o){console.error("User event handler error:",o)}if(t)try{M.sendOpenapiDocsMessage([{object:"openapi_docs",eventType:t,operationHttpVerb:r.operationHttpVerb,operationPath:r.operationPath,lang:"lang"in r?r.lang:void 0,action:r.action,state:"state"in r?r.state:void 0,serverUrl:"serverUrl"in r?r.serverUrl:void 0}])}catch{}}}export{oe as joinWithSeparator,W as mergeEvents,k as parsePartials,se as patchOpenApiDefinitionWithVariables,z as safeParseFunction,ie as usePatchedStore};
@@ -1,4 +1,4 @@
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 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 e=h(),r=u("openAPIDocsStore"),n=a.useMemo(()=>({layout:t.apiOptions?.layout,userClaims:e}),[t.apiOptions?.layout,e]),o=d(r,t);if(!r||!o)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:o.options,definition:o.definition,withState:n}}))}const v=i(m)`
2
2
  && {
3
3
  padding-right: ${({layout:t})=>t===s.THREE_PANEL?"calc(var(--panel-gap-horizontal) * 2)":"var(--panel-gap-horizontal)"};
4
4
  }
@@ -1 +1 @@
1
- import p from"path";import{REGISTRY_APIS_PATHS_API_URL as o}from"../../constants/common.js";import{logger as i}from"../../tools/notifiers/logger.js";async function l(a,d,{variables:f}){const m=p.posix.dirname(a.fsPath);let n={},r={};const t=process.env.REDOCLY_LOCAL_DEV_TOKEN||f.idpAccessToken;if(t&&o)try{const s=o+"/"+encodeURIComponent(m);let e=await fetch(s,{headers:{Cookie:`accessToken=${t}`}});if(e.ok||(e=await fetch(o+"/"+encodeURIComponent(a.fsPath),{headers:{Cookie:`accessToken=${t}`}})),e.status!==200)i.warnProd(`Failed to fetch custom fields. API response status: ${e.status}. Request URL: ${s}`);else{const c=await e.json();n=c.customFields||{},r=c.metadata||{}}}catch(s){i.warnProd("Failed to fetch custom fields: "+s.message)}return{customFields:n,metadata:r,...d.props}}export{l as default};
1
+ import m from"path";import{REGISTRY_APIS_PATHS_API_URL as a}from"../../constants/common.js";import{logger as i}from"../../tools/notifiers/logger.js";async function l(n,d,{variables:f}){const p=m.posix.dirname(n.fsPath);let r={},c={};const t=process.env.REDOCLY_LOCAL_DEV_TOKEN||f.idpAccessToken;if(t&&a)try{const s=a+"/"+encodeURIComponent(p);let e=await fetch(s,{headers:{Cookie:`accessToken=${t}`}});if(e.ok||(e=await fetch(a+"/"+encodeURIComponent(n.fsPath),{headers:{Cookie:`accessToken=${t}`}})),e.status!==200)i.warnProd(`Failed to fetch custom fields. API response status: ${e.status}. Request URL: ${s}`);else{const o=await e.json();r={apiId:o.id,...o.customFields},c=o.metadata||{}}}catch(s){i.warnProd("Failed to fetch custom fields: "+s.message)}return{customFields:r,metadata:c,...d.props}}export{l as default};
@@ -1 +1 @@
1
- import{REDOCLY_TEAMS_RBAC as D}from"@redocly/config";import{OPENAPI_DOCS_TEMPLATE_ID as j,PUBLIC_RBAC_SCOPE_ITEM as U}from"../../../constants/common.js";import{DEPRECATED_PUBLIC_API_DEFINITIONS_FOLDER as te,PUBLIC_API_DEFINITIONS_FOLDER as oe}from"../../constants/common.js";import{OPENAPI_CUSTOM_FIELDS_SERVER_PROPS_GETTER_ID as ae,OPENAPI_SHARED_DATA_PREFIX as V}from"../../constants/plugins/openapi-docs.js";import{envConfig as q}from"../../config/env-config.js";import{logger as _}from"../../tools/notifiers/logger.js";import{searchResolver as re}from"./search/search-resolver.js";import{convertOpenAPIDocs2Sidebar as se,shouldAddRoute as ne}from"./utils.js";import{getTemplatePath as L}from"./get-template-path.js";import{storeDefinitionBundles as ie}from"./store-definition-bundles.js";import{definitionLoader as pe,definitionsLoader as de}from"./load-definition.js";import{getAiDocumentsStore as ce}from"./search/get-ai-search-documents.js";import{fromCurrentDir as le}from"../../utils/paths.js";import{telemetryTraceStep as me}from"../../../cli/telemetry/helpers/trace-step.js";const k="openapi-spec-download";async function Ce(){let w=[],E={},M=new Set;return{id:"openapi",requiredEntitlements:["openapi"],loaders:{"load-oas-docs":de,"load-oas":pe},processContent:async(e,i)=>{await me("build.plugin.openapi_docs",async R=>{e.createRequestHandler(k,le(import.meta.url,"./spec-download.api.js")),e.addApiRoute({slug:oe+"/*",requestHandlerId:k,httpMethod:"all",[D]:U,getStaticData:async()=>({props:{}})}),e.addApiRoute({slug:te+"/*",requestHandlerId:k,httpMethod:"all",[D]:U,getStaticData:async()=>({props:{}})});const d=e.createTemplate(j,L("../../../client/templates/openapi-docs/template.js")),h=e.registerServerPropsGetter(j,L("./get-server-props.js")),s=e.registerServerPropsGetter(ae,L("./get-server-props-custom-fields.js")),a=await i.getConfig();R?.setAttribute("config",JSON.stringify(a.openapi||{}));const A=a.rules?.["custom-fields-schema"];E={};const T=_.startTiming("Loading openapi definitions..."),c=await e.loadOpenApiDefinitions(i);_.infoTime(T,"Loading openapi definitions..."),w=c.map(({markdocChunks:m,relativePath:u,customOutputRelativeFile:n,isVirtual:r,realRelativePath:f})=>({chunks:m,relativePath:u,realRelativePath:f,isVirtual:n!=null||r})),ie(c,e.outdir);const l={};for(const m of c||[]){const{definition:u,config:n,relativePath:r,customOutputRelativeFile:f,contentItems:J,flatItems:B,parser:v,options:N,rawOptions:Q,hash:W}=m,x=f||r,o=[],G={},{definition:X}=v||{},{info:p}=X||{},C=p?.["x-metadata"],O=!!n.openapi?.excludeFromSearch||!!n.theme?.openapi?.excludeFromSearch||!!a.openapi?.excludeFromSearch||!!a.theme?.openapi?.excludeFromSearch,H={title:p?.title,description:p?.description,summary:p?.summary,...n.metadata,...C},g={untagged:[],tagged:new Map};for(const t of B){const{id:y,href:S,operationDefinition:I}=t;if(I){const{tags:P}=I;if(P)for(const b of P)g.tagged.has(b)||g.tagged.set(b,[]),g.tagged.get(b)?.push(t);else g.untagged.push(t);q.isDevelopMode&&(G[`#${I.pointer}`]=t.href)}if(!ne({item:t}))continue;const F=t,K=F.type==="section"&&!!F.infoDefinition,Z=S.split("#")[0]+"/",ee=I?.[D];o.push({excludeFromSearch:O,slugSuffix:Z,fsPath:x,metadata:{subType:"openapi-operation"},httpVerb:t?.httpVerb||"",path:r,templateId:d,[D]:ee||n.rbac,getAiDocumentsStore:ce({parser:v,options:N,info:p,tagOperations:g,openapiContentItem:F,metadata:H,relativePath:r,getSearchFacets:e.getSearchFacets,includeInLLMsTxt:K,excludeFromSearch:O}),getStaticData:async P=>({props:{dynamicMarkdocComponents:["openapi"],baseSlug:P.baseSlug,seo:t["x-metadata"]?.seo||{title:t.name,description:t.description},itemId:y,disableAutoScroll:!0}})})}o[0]={...o[0],metadata:{type:"openapi",...H},hasClientRoutes:!0,getSidebar:(t,y)=>{const S=[];return se({contentItems:J,sidebarItems:S,routeSlug:t.slug,navItem:y}),S},getNavText:()=>p?.title,getSearchDocuments:re(v,N,B,e.getSearchFacets,e.setSearchFacets,O)},C?.apiId&&(l[C.apiId]={slug:o[0]?.slug||""});const Y=o[0];o[0]=o[o.length-1],o[o.length-1]=Y;const z=q.isDevelopMode?r:void 0,$=`${V}${r}`;E[$]={fsPath:x,definition:u,options:Q,sourcePath:z,routesMapping:G,hash:W};for(const t of o)e.addRoute({...t,sharedData:[{id:$,key:"openAPIDocsStore"}],serverPropsGetterIds:A?[h,s]:[h]})}e.setGlobalData({apiProducts:l})})},afterRoutesCreated:async(e,i)=>{const R=_.startTiming("Parsing openapi markdoc chunks..."),d=new Set;for(const{chunks:s,relativePath:a,isVirtual:A,realRelativePath:T}of w){const c=(await i.cache.load(T,"load-oas")).compoundHash;await i.cache.load(a,{loader:async function(){for(const{node:m,markdown:u,key:n,relativePath:r}of s){const{ast:f}=await e.parseMarkdoc({content:u,relativePath:r,isVirtual:A},i,{sharedDataIds:[`${V}${r}`]});m[`x-parsed-md-${n}`]={result:f}}},name:"openapi-markdoc-inline-parser"},[c]);for(const{pointer:l}of s)d.add(l)}_.infoTime(R,"Parsing openapi markdoc chunks...");const h=M.difference(d);for(const s of h)i.cache.delete(s);M=d;for(const[s,a]of Object.entries(E))await e.createSharedData(s,{...a,baseSlug:e.getRouteByFsPath(a.fsPath)?.baseSlug},a.hash)}}}export{Ce as openAPIDocsPlugin};
1
+ import{REDOCLY_TEAMS_RBAC as C}from"@redocly/config";import{combineUrls as Y}from"@redocly/theme/core/utils";import{OPENAPI_DOCS_TEMPLATE_ID as Z,PUBLIC_RBAC_SCOPE_ITEM as ee}from"../../../constants/common.js";import{DEPRECATED_PUBLIC_API_DEFINITIONS_FOLDER as ge,PUBLIC_API_DEFINITIONS_FOLDER as Ie}from"../../constants/common.js";import{OPENAPI_CUSTOM_FIELDS_SERVER_PROPS_GETTER_ID as Pe,OPENAPI_SHARED_DATA_PREFIX as Se}from"../../constants/plugins/openapi-docs.js";import{envConfig as te}from"../../config/env-config.js";import{logger as O}from"../../tools/notifiers/logger.js";import{searchResolver as De}from"./search/search-resolver.js";import{convertOpenAPIDocs2Sidebar as ye,shouldAddRoute as Ae}from"./utils.js";import{getTemplatePath as U}from"./get-template-path.js";import{storeDefinitionBundles as Re}from"./store-definition-bundles.js";import{definitionLoader as ke,definitionsLoader as ve}from"./load-definition.js";import{getAiDocumentsStore as _e}from"./search/get-ai-search-documents.js";import{buildInstanceMetadata as Ee,fetchRegistryApiIdByPath as Te,filterInstancesForApiVersion as be,getResolvedApiVersion as xe,hasTemplateVariables as Ce,loadLinkedInstancesByApiId as Oe,patchOpenApiDefinitionWithVariables as Fe,resolveApiIdForDefinition as we}from"./instances.js";import{fromCurrentDir as Be}from"../../utils/paths.js";import{telemetryTraceStep as Me}from"../../../cli/telemetry/helpers/trace-step.js";const j="openapi-spec-download";async function at(){let n=[],s={},a={},m=new Set;return{id:"openapi",requiredEntitlements:["openapi"],loaders:{"load-oas-docs":ve,"load-oas":ke},processContent:async(e,r)=>{await Me("build.plugin.openapi_docs",async f=>{e.createRequestHandler(j,Be(import.meta.url,"./spec-download.api.js")),e.addApiRoute({slug:Ie+"/*",requestHandlerId:j,httpMethod:"all",[C]:ee,getStaticData:async()=>({props:{}})}),e.addApiRoute({slug:ge+"/*",requestHandlerId:j,httpMethod:"all",[C]:ee,getStaticData:async()=>({props:{}})});const h=e.createTemplate(Z,U("../../../client/templates/openapi-docs/template.js")),g=e.registerServerPropsGetter(Z,U("./get-server-props.js")),p=e.registerServerPropsGetter(Pe,U("./get-server-props-custom-fields.js")),c=await r.getConfig();f?.setAttribute("config",JSON.stringify(c.openapi||{}));const F=c.rules?.["custom-fields-schema"];s={},a={};const w=O.startTiming("Loading openapi definitions..."),A=await e.loadOpenApiDefinitions(r);O.infoTime(w,"Loading openapi definitions...");const B=await Te(),_=await Oe(r);n=A.map(({markdocChunks:P,relativePath:u,customOutputRelativeFile:I,isVirtual:d,realRelativePath:M})=>({chunks:P,relativePath:u,realRelativePath:M,isVirtual:I!=null||d})),Re(A,e.outdir);const E={};for(const P of A||[]){const{definition:u,config:I,relativePath:d,customOutputRelativeFile:M,contentItems:oe,flatItems:L,parser:$,options:q,rawOptions:ne,hash:ae}=P,T=M||d,{definition:ie}=$||{},{info:D}=ie||{},l=we(P,B),se={...D?.["x-metadata"]||{},...l?{apiId:l}:{}};l&&(u.info={...u.info,"x-metadata":{...u.info?.["x-metadata"]||{},apiId:l}});const N=!!I.openapi?.excludeFromSearch||!!I.theme?.openapi?.excludeFromSearch||!!c.openapi?.excludeFromSearch||!!c.theme?.openapi?.excludeFromSearch,z={title:D?.title,description:D?.description,summary:D?.summary,...I.metadata,...se},re=xe(P),b=l?be(_.get(l)||[],re):[],K=Le(u,b),W=K.map(t=>({key:t.key,title:t.title,summary:t.summary,tags:t.tags,routePrefix:t.routePrefix,routeSuffixesByItemId:{}})),ce=new Map(W.map(t=>[t.key,t])),R={untagged:[],tagged:new Map};for(const t of L){const{operationDefinition:o}=t;if(o){const{tags:k}=o;if(k)for(const y of k)R.tagged.has(y)||R.tagged.set(y,[]),R.tagged.get(y)?.push(t);else R.untagged.push(t)}}for(const t of K){const o=[],k={},y=ce.get(t.key);if(!y)continue;const pe=t.routePrefix?`${T.replace(/\.[^.]+$/,"")}/${t.routePrefix}`:T;for(const i of L){const{id:v,href:S,operationDefinition:Q}=i;if(te.isDevelopMode){const x=Q?.pointer;x&&(k[`#${x}`]=Ne(i.href,t.routePrefix))}if(!Ae({item:i}))continue;const H=i,me=H.type==="section"&&!!H.infoDefinition,X=$e(S,"");y.routeSuffixesByItemId[v]=X;const he=Q?.[C];o.push({excludeFromSearch:N,slugSuffix:X,fsPath:pe,metadata:{subType:"openapi-operation"},httpVerb:i?.httpVerb||"",path:d,templateId:h,[C]:he||I.rbac,getAiDocumentsStore:_e({parser:$,options:q,info:D,tagOperations:R,openapiContentItem:H,metadata:z,relativePath:d,getSearchFacets:e.getSearchFacets,includeInLLMsTxt:me,excludeFromSearch:N}),getStaticData:async x=>({props:{dynamicMarkdocComponents:["openapi"],baseSlug:x.baseSlug,seo:i["x-metadata"]?.seo||{title:i.name,description:i.description},itemId:v,disableAutoScroll:!0}})})}if(!o.length)continue;const J=t.key!==""&&!!t.sourceInstance,de=J&&l&&t.sourceInstance?Ee(t.sourceInstance,l):{},le=J?{}:{...b.length>0?{instanceCount:b.length}:{},...b.length===0&&Ce(u)?{isTemplate:!0}:{}},V=t.definition?.info?.title;o[0]={...o[0],metadata:{type:"openapi",...z,...de,...le},hasClientRoutes:!0,getSidebar:(i,v)=>{const S=[];return ye({contentItems:oe,sidebarItems:S,routeSlug:i.slug,navItem:v}),V&&S.length>0&&S[0]&&!v?.label&&(S[0].label=V),S},getNavText:()=>V||D?.title,getSearchDocuments:De($,q,L,e.getSearchFacets,e.setSearchFacets,N)},l&&t.key===""&&(E[l]={slug:o[0]?.slug||""});const fe=o[0];o[0]=o[o.length-1],o[o.length-1]=fe;const ue=te.isDevelopMode?d:void 0,G=`${Se}${T}::${t.id}`;a[d]=[...a[d]||[],G],s[G]={fsPath:T,definition:t.definition,options:ne,instances:W,currentInstanceKey:t.key,sourcePath:ue,routesMapping:k,hash:ae};for(const i of o)e.addRoute({...i,sharedData:[{id:G,key:"openAPIDocsStore"}],serverPropsGetterIds:F?[g,p]:[g]})}}e.setGlobalData({apiProducts:E})})},afterRoutesCreated:async(e,r)=>{const f=O.startTiming("Parsing openapi markdoc chunks..."),h=new Set;for(const{chunks:p,relativePath:c,isVirtual:F,realRelativePath:w}of n){const A=(await r.cache.load(w,"load-oas")).compoundHash,B=a[c]||[];await r.cache.load(c,{loader:async function(){for(const{node:E,markdown:P,key:u,relativePath:I}of p){const{ast:d}=await e.parseMarkdoc({content:P,relativePath:I,isVirtual:F},r,{sharedDataIds:B});E[`x-parsed-md-${u}`]={result:d}}},name:"openapi-markdoc-inline-parser"},[A]);for(const{pointer:_}of p)h.add(_)}O.infoTime(f,"Parsing openapi markdoc chunks...");const g=m.difference(h);for(const p of g)r.cache.delete(p);m=h;for(const[p,c]of Object.entries(s))await e.createSharedData(p,{...c,baseSlug:e.getRouteByFsPath(c.fsPath)?.baseSlug},c.hash)}}}function Le(n,s){const a=[{id:"default",key:"",title:"Default",routePrefix:"",definition:n}],m=new Set;for(const e of s){const r=Ve(e.key)||"instance";let f=`instances/${r}`,h=2;for(;m.has(f);)f=`instances/${r}-${h}`,h++;m.add(f);const g=Fe(n,e.variables),p=e.title?{...g,info:{...g.info||{},title:e.title}}:g;a.push({id:`instance-${f.replace(/[\/:]/g,"-")}`,key:e.key,title:e.title,summary:e.summary,tags:e.tags,routePrefix:f,definition:p,sourceInstance:e})}return a}function $e(n,s){const a=n.split("#")[0]+"/";return s?Y("/",s,a):a}function Ne(n,s){if(!s)return n;const[a="",m]=n.split("#"),e=Y("/",s,a||"/");return m?`${e}#${m}`:e}function Ve(n){return n.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+/,"").replace(/-+$/,"")}export{at as openAPIDocsPlugin};
@@ -0,0 +1,33 @@
1
+ import type { LifecycleContext } from '../../types';
2
+ import type { BundledDefinition } from './load-definition.js';
3
+ export type OpenApiLinkedInstance = {
4
+ key: string;
5
+ title?: string;
6
+ summary?: string;
7
+ tags?: string[];
8
+ version: string;
9
+ variables: Record<string, unknown>;
10
+ };
11
+ export type OpenApiInstanceMetadata = {
12
+ isInstance: true;
13
+ parentApiId: string;
14
+ entityKey: string;
15
+ entityTitle?: string;
16
+ entitySummary?: string;
17
+ entityTags?: string[];
18
+ instanceVariables: Record<string, unknown>;
19
+ };
20
+ export declare function fetchRegistryApiIdByPath(): Promise<Map<string, string>>;
21
+ export declare function resolveApiIdForDefinition(definition: Pick<BundledDefinition, 'relativePath' | 'realRelativePath' | 'definition'>, registryApiIdByPath: Map<string, string>): string | undefined;
22
+ export declare function loadLinkedInstancesByApiId(context: Pick<LifecycleContext, 'fs' | 'cache' | 'logger'>): Promise<Map<string, OpenApiLinkedInstance[]>>;
23
+ export declare function getResolvedApiVersion(definition: Pick<BundledDefinition, 'definition' | 'realRelativePath'>): string;
24
+ export declare function filterInstancesForApiVersion(instances: OpenApiLinkedInstance[], apiVersion: string): OpenApiLinkedInstance[];
25
+ export declare function patchOpenApiDefinitionWithVariables<T = unknown>(definition: T, variables: Record<string, unknown>): T;
26
+ /**
27
+ * Recursive walk with early termination — stops on the first `${` match.
28
+ * Checks both string values and object keys (template vars can appear in keys).
29
+ */
30
+ export declare function hasTemplateVariables(value: unknown): boolean;
31
+ export declare function buildInstanceMetadata(instance: OpenApiLinkedInstance, parentApiId: string): OpenApiInstanceMetadata;
32
+ export declare function applyInstanceToDefinition<T = unknown>(definition: T, instance: OpenApiLinkedInstance): T;
33
+ //# sourceMappingURL=instances.d.ts.map
@@ -0,0 +1 @@
1
+ import A from"path";import{VERSION_NOT_SPECIFIED as d}from"@redocly/theme/core/constants";import{CATALOG_ENTITIES_FILES_REGEX as w,ENTITY_SCHEMA_EXCLUDED_FOLDERS as C}from"../../constants/plugins/catalog-entities.js";import{REGISTRY_APIS_API_URL as I}from"../../constants/common.js";import{logger as y}from"../../tools/notifiers/logger.js";import{readEnvVariable as h}from"../../utils/envs/read-env-variable.js";import{resolveEntityVersion as E}from"../catalog-entities/utils/resolve-entity-version.js";import{parsePathVersions as S}from"../../../utils/path/parse-path-versions.js";const O=/\$\{([^}|]+)(?:\|([^}]*))?\}/g,D=/^\$\{([^}|]+)(?:\|([^}]*))?\}$/,P="${";async function H(){const e=new Map;if(!I)return e;const t=h("REGISTRY_API_KEY")||"",n=h("REDOCLY_LOCAL_DEV_TOKEN")||"";if(!t&&!n)return y.warnProd("Cannot fetch API registry entries for OpenAPI instances: authentication token is missing"),e;try{const r=`${I}?limit=5000&fields=id,contentPath,fsPath`,i=t?{Authorization:`Bearer ${t}`}:{Cookie:`accessToken=${n}`},o=await fetch(r,{headers:i});if(o.status!==200)return y.warnProd(`Failed to fetch API registry entries for OpenAPI instances. API response status: ${o.status}. Request URL: ${r}`),e;const a=await o.json();for(const s of a.items||[]){if(!s?.id)continue;const f=s.contentPath||s.fsPath;if(!f||typeof f!="string")continue;const c=u(f);c&&e.set(c,s.id)}}catch(r){const i=r instanceof Error?r.message:String(r);y.warnProd(`Failed to fetch API registry entries for OpenAPI instances: ${i}`)}return e}function W(e,t){const n=e.definition.info?.["x-metadata"]?.apiId;if(typeof n=="string"&&n.trim())return n.trim();const r=new Set;for(const i of[e.relativePath,e.realRelativePath])for(const o of F(i))r.add(o);for(const i of r){const o=t.get(i);if(o)return o}}async function Q(e){const t=new Map,n=e.fs.scan(w).filter(({relativePath:r})=>N(r));for(const{relativePath:r}of n){let i;try{i=(await e.cache.load(r,"yaml")).data}catch(a){const s=a instanceof Error?a.message:String(a);e.logger.warn(`Failed to parse entity file ${r}: ${s}`);continue}const o=Array.isArray(i)?i:[i];for(const a of o){const s=a;if(!s||typeof s!="object")continue;const f=M(s);if(!f)continue;const c=typeof s.key=="string"?s.key.trim():"";if(!c)continue;const p=E(s.version,r);if(!p.success){e.logger.warn(`Skipping entity ${c} in ${r}: version "${p.fileVersion}" conflicts with folder version "${p.folderVersion}"`);continue}const T=p.version??d,g=z(s.relations);if(!g.length)continue;const $={key:c,title:typeof s.title=="string"?s.title:void 0,summary:typeof s.summary=="string"?s.summary:void 0,tags:Array.isArray(s.tags)?s.tags.filter(l=>typeof l=="string"):void 0,version:T,variables:f};for(const l of g){const k=t.get(l)||[],L=K([...k,$]);t.set(l,L)}}}return t}function ee(e){const t=e.definition.info?.version,n=E(t,e.realRelativePath);return n.success?n.version??d:d}function te(e,t){return e.filter(n=>B(n.version,t)).sort((n,r)=>{const i=n.title||n.key,o=r.title||r.key;return i.localeCompare(o)})}function j(e,t){return m(e,t)}function V(e){if(typeof e=="string")return e.includes(P);if(Array.isArray(e))return e.some(t=>V(t));if(e&&typeof e=="object"){for(const t of Object.keys(e))if(t.includes(P)||V(e[t]))return!0}return!1}function m(e,t){return typeof e=="string"?b(e,t):Array.isArray(e)?e.map(n=>m(n,t)):e&&typeof e=="object"?Object.entries(e).reduce((n,[r,i])=>{const o=b(r,t),a=typeof o=="string"?o:R(o);return n[a]=m(i,t),n},{}):e}function b(e,t){const n=e.match(D);if(n){const r=_(n[1]||"",t,n[2]);return r.found?r.value:e}return e.replace(O,(r,i,o)=>{const a=_(i,t,o);return a.found?R(a.value):r})}function _(e,t,n){const r=x(e);for(const a of r)if(Object.prototype.hasOwnProperty.call(t,a))return{found:!0,value:t[a]};const i=e.trim().toLowerCase(),o=Object.keys(t).find(a=>a.trim().toLowerCase()===i);return o?{found:!0,value:t[o]}:n!==void 0?{found:!0,value:n}:{found:!1,value:void 0}}function x(e){const t=e.trim(),n=t.replace(/_/g,"-").replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),r=t.replace(/-/g,"_").replace(/([a-z0-9])([A-Z])/g,"$1_$2").toLowerCase(),i=t.replace(/[-_]+([a-zA-Z0-9])/g,(o,a)=>a.toUpperCase());return Array.from(new Set([t,n,r,i]))}function R(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean"||typeof e=="bigint")return String(e);try{return JSON.stringify(e)}catch{return String(e)}}function F(e){const t=u(e),n=new Set;if(t){n.add(t);const i=u(A.posix.dirname(t));i&&n.add(i)}const r=S(e);if(r?.filePathInVersion){const i=u(r.filePathInVersion);if(i){n.add(i);const o=u(A.posix.dirname(i));o&&n.add(o)}}return Array.from(n)}function u(e){return e?e.replace(/^\/+/,"").replace(/\/+$/,"").trim():""}function M(e){if(!e.metadata||typeof e.metadata!="object")return;const t=e.metadata;if(!(!t.variables||typeof t.variables!="object"||Array.isArray(t.variables)))return t.variables}function z(e){return Array.isArray(e)?e.map(t=>t).filter(t=>t?.type==="implements"&&typeof t.key=="string").map(t=>t.key):[]}function B(e,t){return e===d||t===d?!0:e===t}function K(e){const t=new Map;for(const n of e)t.set(`${n.key}:${n.version}`,n);return Array.from(t.values())}function N(e){return!C.some(t=>e.includes(t))}function ne(e,t){return{isInstance:!0,parentApiId:t,entityKey:e.key,entityTitle:e.title,entitySummary:e.summary,entityTags:e.tags,instanceVariables:e.variables}}function re(e,t){const n=j(e,t.variables);return t.title&&n&&typeof n=="object"?{...n,info:{...n.info,title:t.title}}:n}export{re as applyInstanceToDefinition,ne as buildInstanceMetadata,H as fetchRegistryApiIdByPath,te as filterInstancesForApiVersion,ee as getResolvedApiVersion,V as hasTemplateVariables,Q as loadLinkedInstancesByApiId,j as patchOpenApiDefinitionWithVariables,W as resolveApiIdForDefinition};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redocly/realm",
3
- "version": "0.130.0-custom.16",
3
+ "version": "0.130.0-custom.17",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "bin": {
@@ -92,13 +92,13 @@
92
92
  "yaml-ast-parser": "0.0.43",
93
93
  "zod": "^3.25.76",
94
94
  "@redocly/asyncapi-docs": "1.7.0-custom.2",
95
- "@redocly/config": "0.43.0-custom.1",
95
+ "@redocly/graphql-docs": "1.7.0-custom.2",
96
+ "@redocly/portal-plugin-mock-server": "0.16.0-next.4",
97
+ "@redocly/portal-legacy-ui": "0.14.0-next.0",
96
98
  "@redocly/realm-asyncapi-sdk": "0.9.0-next.1",
97
99
  "@redocly/openapi-docs": "3.18.0-custom.1",
98
- "@redocly/graphql-docs": "1.7.0-custom.2",
99
100
  "@redocly/theme": "0.62.0-custom.2",
100
- "@redocly/portal-legacy-ui": "0.14.0-next.0",
101
- "@redocly/portal-plugin-mock-server": "0.16.0-next.4"
101
+ "@redocly/config": "0.43.0-custom.1"
102
102
  },
103
103
  "peerDependencies": {
104
104
  "react": "^19.2.4",