@redocly/openapi-docs 3.15.0-rc.4 → 3.15.0-rc.6

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.
@@ -1 +1 @@
1
- import{jsx as t,Fragment as i,jsxs as f}from"react/jsx-runtime";import{memo as u}from"react";import{useAtomValue as x}from"jotai";import{joinWithSeparator as I}from"../../services/index.js";import{TagItem as r}from"../TagItem/index.js";import{OperationItem as g}from"../OperationItem/index.js";import{Section as y}from"../common/index.js";import{useIsExpanded as C}from"./useIsExpanded.js";import{SectionItem as h}from"../SectionItem/index.js";import j from"../ContentItems/useScrollOnRender.js";import{isRootItem as E}from"../ContentItems/helpers.js";import{ApiInfo as R}from"../ApiInfo/index.js";import{layoutAtom as S}from"../../jotai/app.js";import{isRenderableMenuItem as A}from"../../utils/menu.js";const _={group:null,tag:r,section:h,schema:o=>t(r,{...o,item:o.item,isExpanded:!0}),operation:g,mcp:o=>t(r,{...o,item:o.item,isExpanded:!0}),root:R};function b({item:o,routingBasePath:e,children:p,layout:s}){const a=E(o),m=_[a?"root":o.type],d=o.type==="tag"&&o.items.length>0,n=C({item:o,routingBasePath:e});let l=j(o,e);const c=x(S);return f(i,{children:[m&&t(y,{id:o.id,ref:l,sectionId:I(e,o.id),underlined:A(o),expanded:d&&!n,children:t(m,{item:o,routingBasePath:e,isExpanded:n,layout:s||c})}),(n||o.type!=="tag")&&!!o.items?.length&&t(i,{children:p})]})}const J=u(b);export{J as ContentItem};
1
+ import{jsx as t,Fragment as i,jsxs as f}from"react/jsx-runtime";import{memo as u}from"react";import{useAtomValue as x}from"jotai";import{joinWithSeparator as I}from"../../services/index.js";import{TagItem as e}from"../TagItem/index.js";import{OperationItem as g}from"../OperationItem/index.js";import{Section as y}from"../common/index.js";import{useIsExpanded as C}from"./useIsExpanded.js";import{SectionItem as E}from"../SectionItem/index.js";import h from"../ContentItems/useScrollOnRender.js";import{isRootItem as j}from"../ContentItems/helpers.js";import{ApiInfo as R}from"../ApiInfo/index.js";import{layoutAtom as S}from"../../jotai/app.js";import{isRenderableMenuItem as A}from"../../utils/menu.js";const _={group:null,tag:e,section:E,schema:o=>t(e,{...o,item:o.item,isExpanded:!0}),operation:g,tool:o=>t(e,{...o,item:o.item,isExpanded:!0}),rsrc:o=>t(e,{...o,item:o.item,isExpanded:!0}),prompt:o=>t(e,{...o,item:o.item,isExpanded:!0}),root:R};function b({item:o,routingBasePath:n,children:p,layout:s}){const a=j(o),m=_[a?"root":o.type],d=o.type==="tag"&&o.items.length>0,r=C({item:o,routingBasePath:n});let l=h(o,n);const c=x(S);return f(i,{children:[m&&t(y,{id:o.id,ref:l,sectionId:I(n,o.id),underlined:A(o),expanded:d&&!r,children:t(m,{item:o,routingBasePath:n,isExpanded:r,layout:s||c})}),(r||o.type!=="tag")&&!!o.items?.length&&t(i,{children:p})]})}const J=u(b);export{J as ContentItem};
@@ -0,0 +1,6 @@
1
+ interface McpPromptProps {
2
+ name: string;
3
+ id: string;
4
+ }
5
+ export declare const McpPrompt: import("react").NamedExoticComponent<McpPromptProps>;
6
+ export {};
@@ -0,0 +1,9 @@
1
+ import{jsx as t,jsxs as c,Fragment as T}from"react/jsx-runtime";import{memo as k,useCallback as C,useMemo as u}from"react";import{useAtomValue as f}from"jotai";import{LayoutVariant as P}from"@redocly/config";import{getMediaContent as j,getSecurity as A}from"../../models/index.js";import{globalStoreAtom as g}from"../../jotai/store.js";import{Section as b,Row as q,SamplesMiddlePanel as v,SamplesPanel as F,CodeBlockPanel as L}from"../common/index.js";import{Schema as R}from"../Schema/index.js";import{layoutAtom as _}from"../../jotai/app.js";import{MediaTypeSamples as w}from"../PayloadSamples/MediaTypeSamples.js";import{useTranslate as D}from"../../hooks/index.js";import{Title as E}from"../common/OperationItemTitle.js";import{LinkToField as V}from"../common/LinkToField.js";import{makeDeepLink as B}from"../../services/index.js";import{Security as K}from"../Security/Security.js";import{styled as x}from"../../styled-components.js";function N({name:n,id:l}){const{parser:e}=f(g),i=D(),r=u(()=>(e.definition["x-mcp"]?.prompts||[]).find(p=>p.name===n),[e,n]),m=u(()=>r?A(r.security,e):null,[e,r]);return r?t(b,{children:t(z,{id:l,type:"input",prompt:r,title:i("openapi.mcp.inputSchema","Arguments"),exampleTitle:i("openapi.mcp.inputExample","Arguments example"),children:m&&t(K,{securities:m})})}):null}function z({id:n,type:l,prompt:e,title:i,exampleTitle:r,children:m}){const{parser:d,options:p}=f(g),y=f(_),h=y===P.STACKED,a=u(()=>{const S=e.arguments&&{type:"object",properties:e.arguments.reduce((o,s)=>(o[s.name]={type:"",example:s.example||"string",description:s.description,required:s.required},o),{}),required:e.arguments.filter(o=>o.required).map(o=>o.name)};return S?j({parser:d,info:{"application/json":{schema:S}},isRequestType:!1,options:p,data:{operation:{pointer:"McpPrompt"}}}):null},[p,d,e]),M=C(()=>{},[]);return c(G,{layout:y,children:[t(H,{isStacked:h,children:c("div",{children:[m,a&&c(T,{children:[" ",c(E,{children:[n&&t(V,{to:B(n,l)}),i]}),t(R,{schema:a.mediaTypes[0].schema})]})]})}),a&&t(F,{isStacked:h,children:t(L,{className:"panel-response-samples",header:r,children:t(w,{mediaType:a.mediaTypes[0],onChange:M})})})]})}const G=x(q)`
2
+ margin: calc(var(--spacing-unit) * 2) 0;
3
+
4
+ & + & {
5
+ margin-top: calc(var(--spacing-base) * 2);
6
+ }
7
+ `,H=x(v)`
8
+ padding-left: 0;
9
+ `,me=k(N);export{me as McpPrompt};
@@ -0,0 +1,7 @@
1
+ import * as React from 'react';
2
+ interface McpResourceProps {
3
+ name: string;
4
+ id: string;
5
+ }
6
+ export declare const McpResource: React.NamedExoticComponent<McpResourceProps>;
7
+ export {};
@@ -0,0 +1,14 @@
1
+ import{jsxs as l,jsx as o}from"react/jsx-runtime";import{memo as k,useMemo as T}from"react";import*as M from"react";import{useAtomValue as h}from"jotai";import{LayoutVariant as R}from"@redocly/config";import{CodeBlock as b}from"@redocly/theme/components/CodeBlock/CodeBlock";import{Tag as P}from"@redocly/theme/components/Tag/Tag";import{getSecurity as v}from"../../models/index.js";import{globalStoreAtom as j}from"../../jotai/store.js";import{Section as w,Row as A,SamplesMiddlePanel as B,SamplesPanel as F,CodeBlockPanel as E}from"../common/index.js";import{layoutAtom as I}from"../../jotai/app.js";import{useTranslate as L}from"../../hooks/index.js";import{Security as V}from"../Security/Security.js";import{styled as s}from"../../styled-components.js";function _({name:i}){const{parser:t}=h(j),c=L(),e=T(()=>(t.definition["x-mcp"]?.resources||[]).find(a=>a.name===i),[t,i]),r=T(()=>e?v(e.security,t):null,[t,e]);return e?o(w,{children:o(D,{uriTitle:c("openapi.mcp.uriTitle","Resource URI"),mimeTypeTitle:c("openapi.mcp.mimeTypeTitle","Resource MIME type"),exampleTitle:c("openapi.mcp.exampleTitle","Resource content"),uri:e.uri,mimeType:e.mimeType,content:e.blob??e.text??"",children:r&&o(V,{securities:r})})}):l("div",{children:["Resource not found: ",i]})}function D({uriTitle:i,mimeTypeTitle:t,exampleTitle:c,uri:e,mimeType:r,content:p,children:a}){const m=h(I),d=m===R.STACKED,[u,f]=M.useState(null),y=async(n,x,C)=>{C.stopPropagation();try{await navigator.clipboard.writeText(n),f(x),setTimeout(()=>f(null),2e3)}catch(g){console.error("Failed to copy text: ",g)}};return l(K,{layout:m,children:[o(N,{isStacked:d,children:l("div",{children:[a,l("p",{children:[i,":"," ",o(S,{onClick:n=>y(e,"uri",n),title:"Click to copy",children:u==="uri"?"\u2713 Copied!":e})]}),l("p",{children:[t,":"," ",o(S,{onClick:n=>y(r,"mimeType",n),title:"Click to copy",children:u==="mimeType"?"\u2713 Copied!":r})]})]})}),p&&o(F,{isStacked:d,children:o(E,{className:"panel-response-samples",header:c,children:o(U,{source:p,header:{title:r,controls:{copy:{}}}})})})]})}const K=s(A)`
2
+ margin: calc(var(--spacing-unit) * 2) 0;
3
+
4
+ & + & {
5
+ margin-top: calc(var(--spacing-base) * 2);
6
+ }
7
+ `,N=s(B)`
8
+ padding-left: 0;
9
+ `,oe=k(_),S=s(P)`
10
+ text-transform: none;
11
+ `,U=s(b)`
12
+ border: none;
13
+ padding: 0 8px;
14
+ `;export{oe as McpResource};
@@ -1,5 +1,5 @@
1
1
  interface McpToolProps {
2
- toolName: string;
2
+ name: string;
3
3
  id: string;
4
4
  }
5
5
  export declare const McpTool: import("react").NamedExoticComponent<McpToolProps>;
@@ -1,4 +1,4 @@
1
- import{jsxs as a,jsx as n}from"react/jsx-runtime";import{memo as M,useCallback as g,useMemo as l}from"react";import{useAtomValue as s}from"jotai";import{LayoutVariant as k}from"@redocly/config";import{getMediaContent as C,getSecurity as j}from"../../models/index.js";import{globalStoreAtom as f}from"../../jotai/store.js";import{Section as P,Row as b,SamplesMiddlePanel as v,SamplesPanel as A,CodeBlockPanel as E}from"../common/index.js";import{Schema as R}from"../Schema/index.js";import{getSchema as F}from"../../models/schema.js";import{layoutAtom as L}from"../../jotai/app.js";import{MediaTypeSamples as O}from"../PayloadSamples/MediaTypeSamples.js";import{useTranslate as w}from"../../hooks/index.js";import{Title as D}from"../common/OperationItemTitle.js";import{LinkToField as I}from"../common/LinkToField.js";import{makeDeepLink as V}from"../../services/index.js";import{Security as _}from"../Security/Security.js";import{styled as h}from"../../styled-components.js";function q({toolName:t,id:m}){const{parser:i}=s(f),o=w(),e=l(()=>(i.definition["x-mcp"]?.tools||[]).find(r=>r.name===t),[i,t]),c=l(()=>e?j(e.security,i):null,[i,e]);return e?a(P,{children:[n(S,{id:m,type:"input",schema:e.inputSchema,title:o("openapi.mcp.inputSchema","Input schema"),exampleTitle:o("openapi.mcp.inputExample","Input example"),children:c&&n(_,{securities:c})}),e.outputSchema&&n(S,{id:m,type:"output",schema:e.outputSchema,title:o("openapi.mcp.outputSchema","Output schema"),exampleTitle:o("openapi.mcp.outputExample","Output example")})]}):a("div",{children:["Tool not found: ",t]})}function S({schema:t,title:m,exampleTitle:i,id:o,type:e,children:c}){const{parser:p,options:r}=s(f),u=s(L),d=u===k.STACKED,T=l(()=>C({parser:p,info:{"application/json":{schema:t}},isRequestType:!1,options:r,data:{operation:{pointer:"McpTool"}}}),[r,p,t]),y=l(()=>t&&F({parser:p,schemaOrRef:t,pointer:"#",options:r,deps:{operation:{pointer:o},parentFieldFullPath:e+"-schema"}}),[r,p,t,o,e]),x=g(()=>{},[]);return a(B,{layout:u,children:[n(K,{isStacked:d,children:a("div",{children:[a(D,{children:[o&&n(I,{to:V(o,e)}),m]}),c,n(R,{schema:y})]})}),n(A,{isStacked:d,children:n(E,{className:"panel-response-samples",header:i,children:n(O,{mediaType:T.mediaTypes[0],onChange:x})})})]})}const B=h(b)`
1
+ import{jsxs as a,jsx as n}from"react/jsx-runtime";import{memo as M,useCallback as g,useMemo as c}from"react";import{useAtomValue as s}from"jotai";import{LayoutVariant as k}from"@redocly/config";import{getMediaContent as C,getSecurity as j}from"../../models/index.js";import{globalStoreAtom as f}from"../../jotai/store.js";import{Section as P,Row as b,SamplesMiddlePanel as v,SamplesPanel as A,CodeBlockPanel as E}from"../common/index.js";import{Schema as R}from"../Schema/index.js";import{getSchema as F}from"../../models/schema.js";import{layoutAtom as L}from"../../jotai/app.js";import{MediaTypeSamples as O}from"../PayloadSamples/MediaTypeSamples.js";import{useTranslate as w}from"../../hooks/index.js";import{Title as D}from"../common/OperationItemTitle.js";import{LinkToField as I}from"../common/LinkToField.js";import{makeDeepLink as V}from"../../services/index.js";import{Security as _}from"../Security/Security.js";import{styled as h}from"../../styled-components.js";function q({name:t,id:m}){const{parser:i}=s(f),o=w(),e=c(()=>(i.definition["x-mcp"]?.tools||[]).find(r=>r.name===t),[i,t]),l=c(()=>e?j(e.security,i):null,[i,e]);return e?a(P,{children:[n(S,{id:m,type:"input",schema:e.inputSchema,title:o("openapi.mcp.inputSchema","Input schema"),exampleTitle:o("openapi.mcp.inputExample","Input example"),children:l&&n(_,{securities:l})}),e.outputSchema&&n(S,{id:m,type:"output",schema:e.outputSchema,title:o("openapi.mcp.outputSchema","Output schema"),exampleTitle:o("openapi.mcp.outputExample","Output example")})]}):a("div",{children:["Tool not found: ",t]})}function S({schema:t,title:m,exampleTitle:i,id:o,type:e,children:l}){const{parser:p,options:r}=s(f),u=s(L),d=u===k.STACKED,T=c(()=>C({parser:p,info:{"application/json":{schema:t}},isRequestType:!1,options:r,data:{operation:{pointer:"McpTool"}}}),[r,p,t]),y=c(()=>t&&F({parser:p,schemaOrRef:t,pointer:"#",options:r,deps:{operation:{pointer:o},parentFieldFullPath:e+"-schema"}}),[r,p,t,o,e]),x=g(()=>{},[]);return a(B,{layout:u,children:[n(K,{isStacked:d,children:a("div",{children:[a(D,{children:[o&&n(I,{to:V(o,e)}),m]}),l,n(R,{schema:y})]})}),n(A,{isStacked:d,children:n(E,{className:"panel-response-samples",header:i,children:n(O,{mediaType:T.mediaTypes[0],onChange:x})})})]})}const B=h(b)`
2
2
  margin: calc(var(--spacing-unit) * 2) 0;
3
3
 
4
4
  & + & {
@@ -1 +1,3 @@
1
1
  export * from './McpTool.js';
2
+ export * from './McpResource.js';
3
+ export * from './McpPrompt.js';
@@ -1 +1 @@
1
- export*from"./McpTool.js";
1
+ export*from"./McpTool.js";export*from"./McpResource.js";export*from"./McpPrompt.js";
@@ -1 +1 @@
1
- import{jsx as d}from"react/jsx-runtime";import{memo as v,useCallback as g,useEffect as y,useMemo as b}from"react";import S from"@markdoc/markdoc";import{LayoutVariant as E}from"@redocly/config";import{createStore as O,Provider as A}from"jotai";import{html as N}from"@redocly/theme/markdoc/tags/html";import{Heading as M}from"@redocly/theme/markdoc/components/Heading/Heading";import{normalizeOptions as T,OpenAPIParser as D}from"../../services/index.js";import{SchemaDefinition as j}from"../SchemaDefinition/index.js";import{McpTool as k}from"../McpTool/index.js";import{getMarkdownHeaderId as x}from"./utils.js";import{mergeInMockServer as C}from"../../models/operation.js";import{normalizeServers as P}from"../../utils/index.js";import{appStore as H,appStoreOverrideAtom as I,layoutAtom as p,allowedEnvironmentsAtom as L,environmentAtom as R,userClaimsAtom as V}from"../../jotai/app.js";import{mapObject as z}from"../../utils/object.js";import{getServerEnvName as _}from"../../utils/environments.js";import{globalStoreAtom as h}from"../../jotai/store.js";import{getDefaultOperationStore as q,operationStore as B}from"../../jotai/operation.js";const F={ignoreNamedSchemas:["java.io.ObjectStreamField"],maxDisplayedEnumValues:10,markdocOptions:{tags:{html:N.schema,schemaDefinition:{render:"SchemaDefinition",attributes:{schemaRef:{type:String},exampleRef:{type:String},showReadOnly:{type:Boolean},showWriteOnly:{type:Boolean},htmlWrap:{type:String,default:!1}}},mcpTool:{render:"McpTool",attributes:{toolName:{type:String},id:{type:String}}}},nodes:{heading:{children:["inline"],attributes:{id:{type:String},level:{type:Number,required:!0,default:1}},transform(n,i){const t=n.transformAttributes(i),m=n.transformChildren(i),e=typeof t.id=="string"?t.id:x(m);return new S.Tag("Heading",{...t,id:e,level:n.attributes.level},m)}}},components:{SchemaDefinition:j,McpTool:k,Heading:M}}},se=v(({children:n,options:i,definitionUrl:t,definition:m,withState:e})=>{const l=g(()=>{const r=T(i,F),o=new D(m,t,r);return{options:r,parser:o}},[m,t,i]),a=b(()=>{const r=O(),o=l();r.set(h,o);const c=P(o.parser.definitionUrl,C(o.parser.definition?.servers||[],o.options.mockServer));r.sub(H,()=>{}),r.set(p,o.options?.layout||E.THREE_PANEL);const f=Object.fromEntries(c.map(s=>[_(s),{server:s.url,...z(s.variables||{},u=>u.default||"")}]));if(r.set(R,{environments:f}),r.set(V,e?.userClaims||{}),r.set(L,e?.allowedEnvironments),e&&r.set(I,{activeMimeName:e.activeMimeName,userClaims:e.userClaims,environment:e.environment,environments:e.environments}),e?.operation){const s=q(e.operation.pointer,e.operation.state.requestValues,e.operation.state.activeExampleName);r.set(B(e.operation.pointer),s)}return r},[l,e]);return y(()=>{e?.layout&&a.set(p,e?.layout)},[a,e?.layout]),d(A,{store:a,children:n})});export{se as StoreProvider};
1
+ import{jsx as d}from"react/jsx-runtime";import{memo as v,useCallback as g,useEffect as y,useMemo as b}from"react";import S from"@markdoc/markdoc";import{LayoutVariant as M}from"@redocly/config";import{createStore as E,Provider as O}from"jotai";import{html as A}from"@redocly/theme/markdoc/tags/html";import{Heading as P}from"@redocly/theme/markdoc/components/Heading/Heading";import{normalizeOptions as N,OpenAPIParser as R}from"../../services/index.js";import{SchemaDefinition as T}from"../SchemaDefinition/index.js";import{McpTool as D,McpResource as j,McpPrompt as k}from"../McpTool/index.js";import{getMarkdownHeaderId as x}from"./utils.js";import{mergeInMockServer as C}from"../../models/operation.js";import{normalizeServers as H}from"../../utils/index.js";import{appStore as I,appStoreOverrideAtom as L,layoutAtom as l,allowedEnvironmentsAtom as V,environmentAtom as z,userClaimsAtom as _}from"../../jotai/app.js";import{mapObject as h}from"../../utils/object.js";import{getServerEnvName as q}from"../../utils/environments.js";import{globalStoreAtom as B}from"../../jotai/store.js";import{getDefaultOperationStore as F,operationStore as W}from"../../jotai/operation.js";const G={ignoreNamedSchemas:["java.io.ObjectStreamField"],maxDisplayedEnumValues:10,markdocOptions:{tags:{html:A.schema,schemaDefinition:{render:"SchemaDefinition",attributes:{schemaRef:{type:String},exampleRef:{type:String},showReadOnly:{type:Boolean},showWriteOnly:{type:Boolean},htmlWrap:{type:String,default:!1}}},mcpTool:{render:"McpTool",attributes:{name:{type:String},id:{type:String}}},mcpResource:{render:"McpResource",attributes:{name:{type:String},id:{type:String}}},mcpPrompt:{render:"McpPrompt",attributes:{name:{type:String},id:{type:String}}}},nodes:{heading:{children:["inline"],attributes:{id:{type:String},level:{type:Number,required:!0,default:1}},transform(n,i){const t=n.transformAttributes(i),m=n.transformChildren(i),e=typeof t.id=="string"?t.id:x(m);return new S.Tag("Heading",{...t,id:e,level:n.attributes.level},m)}}},components:{SchemaDefinition:T,McpTool:D,McpResource:j,McpPrompt:k,Heading:P}}},pe=v(({children:n,options:i,definitionUrl:t,definition:m,withState:e})=>{const p=g(()=>{const r=N(i,G),o=new R(m,t,r);return{options:r,parser:o}},[m,t,i]),a=b(()=>{const r=E(),o=p();r.set(B,o);const c=H(o.parser.definitionUrl,C(o.parser.definition?.servers||[],o.options.mockServer));r.sub(I,()=>{}),r.set(l,o.options?.layout||M.THREE_PANEL);const u=Object.fromEntries(c.map(s=>[q(s),{server:s.url,...h(s.variables||{},f=>f.default||"")}]));if(r.set(z,{environments:u}),r.set(_,e?.userClaims||{}),r.set(V,e?.allowedEnvironments),e&&r.set(L,{activeMimeName:e.activeMimeName,userClaims:e.userClaims,environment:e.environment,environments:e.environments}),e?.operation){const s=F(e.operation.pointer,e.operation.state.requestValues,e.operation.state.activeExampleName);r.set(W(e.operation.pointer),s)}return r},[p,e]);return y(()=>{e?.layout&&a.set(l,e?.layout)},[a,e?.layout]),d(O,{store:a,children:n})});export{pe as StoreProvider};
@@ -1 +1 @@
1
- import{useMemo as l}from"react";import{useLocation as h}from"react-router-dom";import{useActiveSectionId as I}from"@redocly/theme/core/openapi";import{pathMatchedLink as k}from"../../../utils/index.js";import{DEFAULT_WEBHOOKS_TAG_NAME as A}from"../../../constants.js";import{joinWithSeparator as y}from"../../../services/history/helpers.js";function O({items:o,routingBasePath:r}){const t=h(),s=I(t,!1,!1);return l(()=>S(o,s,t,r),[s,o,t,r])}function S(o,r="",t,s){const n=[];return c({contentItems:o,sidebarItems:n,activeItemId:r,location:t,routingBasePath:s}),n}function b(o,r="",t,s){return o.href?r&&s?y(s,o.id)===r:r&&!s?o.id===r:k(t,o.href):!1}function d(o,r="",t,s){return(o.items||[]).some(i=>b(i,r,t,s)||d(i,r,t,s))}function c(o){const{contentItems:r,sidebarItems:t,activeItemId:s,location:n,routingBasePath:i}=o;let p=!0;for(const e of r){const a=b(e,s,n,i),m=d(e,s,n,i);switch(e.type){case"group":t.push({type:"separator",label:e.name,active:a,hasActiveSubItem:m}),c({...o,contentItems:e.items,sidebarItems:t});break;case"tag":const f={type:"group",label:e.name,items:[],link:e.href,active:a,hasActiveSubItem:m,modified:!0};t.push(f),c({contentItems:e.items,sidebarItems:f.items||[],activeItemId:s,location:n,routingBasePath:i});break;case"operation":case"schema":case"mcp":e.isWebhook&&p&&e.parent.name!==A&&(t.push({type:"separator",label:"Webhooks",variant:"secondary"}),p=!1),t.push({type:"link",label:e.name,httpVerb:e.type=="operation"?e.httpVerb:e.type,link:e.href,badges:e.badges,active:a,hasActiveSubItem:m,modified:!0,deprecated:e.deprecated});break;case"section":if(e.depth===-1)continue;const u={type:e.items.length?"group":"link",label:e.name,link:e.href,items:[],active:a,hasActiveSubItem:m,modified:!0};t.push(u),e.items.length&&c({contentItems:e.items,sidebarItems:u.items,activeItemId:s,location:n,routingBasePath:i});break}}}export{O as useMenuItems};
1
+ import{useMemo as d}from"react";import{useLocation as h}from"react-router-dom";import{useActiveSectionId as I}from"@redocly/theme/core/openapi";import{pathMatchedLink as k}from"../../../utils/index.js";import{DEFAULT_WEBHOOKS_TAG_NAME as A}from"../../../constants.js";import{joinWithSeparator as y}from"../../../services/history/helpers.js";function O({items:o,routingBasePath:r}){const t=h(),s=I(t,!1,!1);return d(()=>S(o,s,t,r),[s,o,t,r])}function S(o,r="",t,s){const n=[];return c({contentItems:o,sidebarItems:n,activeItemId:r,location:t,routingBasePath:s}),n}function l(o,r="",t,s){return o.href?r&&s?y(s,o.id)===r:r&&!s?o.id===r:k(t,o.href):!1}function b(o,r="",t,s){return(o.items||[]).some(i=>l(i,r,t,s)||b(i,r,t,s))}function c(o){const{contentItems:r,sidebarItems:t,activeItemId:s,location:n,routingBasePath:i}=o;let p=!0;for(const e of r){const a=l(e,s,n,i),m=b(e,s,n,i);switch(e.type){case"group":t.push({type:"separator",label:e.name,active:a,hasActiveSubItem:m}),c({...o,contentItems:e.items,sidebarItems:t});break;case"tag":const f={type:"group",label:e.name,items:[],link:e.href,active:a,hasActiveSubItem:m,modified:!0};t.push(f),c({contentItems:e.items,sidebarItems:f.items||[],activeItemId:s,location:n,routingBasePath:i});break;case"operation":case"schema":case"tool":case"rsrc":case"prompt":e.isWebhook&&p&&e.parent.name!==A&&(t.push({type:"separator",label:"Webhooks",variant:"secondary"}),p=!1),t.push({type:"link",label:e.name,httpVerb:e.type=="operation"?e.httpVerb:e.type,link:e.href,badges:e.badges,active:a,hasActiveSubItem:m,modified:!0,deprecated:e.deprecated});break;case"section":if(e.depth===-1)continue;const u={type:e.items.length?"group":"link",label:e.name,link:e.href,items:[],active:a,hasActiveSubItem:m,modified:!0};t.push(u),e.items.length&&c({contentItems:e.items,sidebarItems:u.items,activeItemId:s,location:n,routingBasePath:i});break}}}export{O as useMenuItems};
@@ -1,6 +1,6 @@
1
- import{jsx as r,jsxs as k}from"react/jsx-runtime";import{useMemo as O,memo as M,useState as A,useCallback as N}from"react";import{useNavigate as j}from"react-router-dom";import{LayoutVariant as E}from"@redocly/config";import{useAtomValue as I}from"jotai/index";import{SamplesPanel as P}from"../common/index.js";import{layoutAtom as W}from"../../jotai/app.js";import{OperationNavigationItems as l}from"./OperationNavigationItems.js";import{StyledButton as B}from"./styled.js";import{useTranslate as _}from"../../hooks/index.js";import{styled as R}from"../../styled-components.js";import{isRenderableMenuItem as V}from"../../utils/menu.js";const p=8;function z({items:m,routingBasePath:n}){const o=_(),[a,x]=A(!1),c=j(),C=I(W)===E.STACKED,{operations:h,webhooks:u,schemas:f,mcpTools:d,showMoreCount:g,totalCount:y}=O(()=>{const e=m.filter(s=>V(s)),w=a?e:e.slice(0,p),{operations:b,webhooks:v,schemas:S,mcpTools:T}=w.reduce((s,t)=>(t.type==="operation"&&t.isWebhook?s.webhooks.push(t):t.type==="operation"?s.operations.push(t):t.type==="schema"?s.schemas.push(t):t.type==="mcp"&&s.mcpTools.push(t),s),{operations:[],webhooks:[],schemas:[],mcpTools:[]});return{operations:b,schemas:S,mcpTools:T,webhooks:v,showMoreCount:!a&&e.length>p?e.length-p:0,totalCount:e.length}},[a,m]),i=N(e=>c(e),[c]);return y?k(D,{isStacked:C,"data-testid":"operation-navigation-list",children:[f.length>0&&r(l,{items:f,onClick:i,routingBasePath:n,translate:o,title:o("openapi.schemas","Schemas")}),d.length>0&&r(l,{items:d,onClick:i,routingBasePath:n,translate:o,title:o("openapi.mcp.tools","MCP Tools")}),h.length>0&&r(l,{items:h,onClick:i,routingBasePath:n,translate:o,title:o("openapi.operations","Operations")}),u.length>0&&r(l,{items:u,onClick:i,routingBasePath:n,translate:o,title:o("openapi.webhooks","Webhooks")}),!a&&!!g&&k(B,{variant:"link",size:"large","data-testid":"show-more-operations",fullWidth:!0,onClick:()=>x(!0),children:[o("openapi.actions.show","Show")," ",g," ",o("openapi.actions.more","more"),"..."]})]}):null}const oo=M(z),D=R(P)`
1
+ import{jsx as r,jsxs as x}from"react/jsx-runtime";import{useMemo as A,memo as N,useState as j,useCallback as E}from"react";import{useNavigate as I}from"react-router-dom";import{LayoutVariant as W}from"@redocly/config";import{useAtomValue as B}from"jotai/index";import{SamplesPanel as _}from"../common/index.js";import{layoutAtom as V}from"../../jotai/app.js";import{OperationNavigationItems as p}from"./OperationNavigationItems.js";import{StyledButton as z}from"./styled.js";import{useTranslate as D}from"../../hooks/index.js";import{styled as K}from"../../styled-components.js";import{isRenderableMenuItem as L}from"../../utils/menu.js";const l=8;function X({items:m,routingBasePath:n}){const o=D(),[i,y]=j(!1),c=I(),P=B(V)===W.STACKED,{operations:u,webhooks:h,schemas:f,mcpTools:d,showMoreCount:g,totalCount:w,mcpResources:k,mcpPrompts:C}=A(()=>{const s=m.filter(e=>L(e)),b=i?s:s.slice(0,l),{operations:v,webhooks:S,schemas:M,mcpTools:T,mcpResources:O,mcpPrompts:R}=b.reduce((e,t)=>(t.type==="operation"&&t.isWebhook?e.webhooks.push(t):t.type==="operation"?e.operations.push(t):t.type==="schema"?e.schemas.push(t):t.type==="tool"?e.mcpTools.push(t):t.type==="rsrc"?e.mcpResources.push(t):t.type==="prompt"&&e.mcpPrompts.push(t),e),{operations:[],webhooks:[],schemas:[],mcpTools:[],mcpResources:[],mcpPrompts:[]});return{operations:v,schemas:M,mcpTools:T,webhooks:S,mcpResources:O,mcpPrompts:R,showMoreCount:!i&&s.length>l?s.length-l:0,totalCount:s.length}},[i,m]),a=E(s=>c(s),[c]);return w?x(q,{isStacked:P,"data-testid":"operation-navigation-list",children:[f.length>0&&r(p,{items:f,onClick:a,routingBasePath:n,translate:o,title:o("openapi.schemas","Schemas")}),d.length>0&&r(p,{items:d,onClick:a,routingBasePath:n,translate:o,title:o("openapi.mcp.tools","MCP Tools")}),k.length>0&&r(p,{items:k,onClick:a,routingBasePath:n,translate:o,title:o("openapi.mcp.resources","MCP Resources")}),C.length>0&&r(p,{items:C,onClick:a,routingBasePath:n,translate:o,title:o("openapi.mcp.prompts","MCP Prompts")}),u.length>0&&r(p,{items:u,onClick:a,routingBasePath:n,translate:o,title:o("openapi.operations","Operations")}),h.length>0&&r(p,{items:h,onClick:a,routingBasePath:n,translate:o,title:o("openapi.webhooks","Webhooks")}),!i&&!!g&&x(z,{variant:"link",size:"large","data-testid":"show-more-operations",fullWidth:!0,onClick:()=>y(!0),children:[o("openapi.actions.show","Show")," ",g," ",o("openapi.actions.more","more"),"..."]})]}):null}const no=N(X),q=K(_)`
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  gap: var(--spacing-xxs);
5
5
  padding-top: var(--spacing-xxl);
6
- `;export{oo as OperationsNavigation,z as OperationsNavigationComponent};
6
+ `;export{no as OperationsNavigation,X as OperationsNavigationComponent};
@@ -1 +1 @@
1
- import{REDOCLY_TEAMS_RBAC as n}from"@redocly/config";import{joinWithSeparator as h}from"../services/index.js";import{getValueFromMdParsedExtension as S,safeSlugify as o}from"../utils/index.js";import{getHref as v}from"../services/menu/operation.js";import{saveTextBeforeHeading as C}from"../utils/saveTextBeforeHeading.js";function B(m,e,i){let s;i?.id&&(m==="schema"||m==="mcp")?s=h(i.id,o(e.name)):s=e.id||o(e.name);const c=e["x-displayName"]||e.name,d=e.level||1,t=e.isSchema,f=e.ast||void 0,l=C(S(e,"description")||""),a=e.items||[],x=e.externalDocs;return{id:s.toLowerCase(),type:m,parent:i,name:c,level:d,badges:e["x-badges"]||[],depth:0,isSchema:t,description:l,items:a,ast:f,externalDocs:x,href:v({id:s}),[n]:e[n]||i?.[n]}}export{B as getTagOrGroup};
1
+ import{REDOCLY_TEAMS_RBAC as o}from"@redocly/config";import{joinWithSeparator as h}from"../services/index.js";import{getValueFromMdParsedExtension as S,safeSlugify as n}from"../utils/index.js";import{getHref as r}from"../services/menu/operation.js";import{saveTextBeforeHeading as v}from"../utils/saveTextBeforeHeading.js";function A(s,e,i){let m;i?.id&&(s==="schema"||s==="tool"||s==="rsrc"||s==="prompt")?m=h(i.id,n(e.name)):m=e.id||n(e.name);const c=e["x-displayName"]||e.name,d=e.level||1,t=e.isSchema,f=e.ast||void 0,l=v(S(e,"description")||""),a=e.items||[],x=e.externalDocs;return{id:m.toLowerCase(),type:s,parent:i,name:c,level:d,badges:e["x-badges"]||[],depth:0,isSchema:t,description:l,items:a,ast:f,externalDocs:x,href:r({id:m}),[o]:e[o]||i?.[o]}}export{A as getTagOrGroup};
@@ -1,4 +1,4 @@
1
- import{getTagOrGroup as d}from"../../models/group.js";import{DEFAULT_WEBHOOKS_TAG_NAME as u,GROUP_DEPTH as g}from"../../constants.js";import{getValueFromMdParsedExtension as h,isOperationName as S,JsonPointer as $,safeSlugify as N}from"../../utils/index.js";import{getOperationsItems as T}from"./operation.js";import{addMarkdownItems as x}from"./markdown.js";import{joinWithSeparator as b}from"../history/helpers.js";const y=["tools"];function k(i,c,o,e,a){let t;if(e===void 0?t=Object.keys(c):t=e.tags,!Array.isArray(t))return console.warn("Unexpected values of tags. Check tags or x-tagGroups in your definition."),[];const f=t.map(s=>c[s]?(c[s].used=!0,c[s]):(console.warn(`Non-existing tag "${s}" is added to the group "${e?.name}"`),null)),n=[];for(const s of f){if(!s)continue;const r=d("tag",s,o);if(r.depth=g+1,s.name===""){const P=[...x(h(s,"description")||"",r,r.depth+1),...T(void 0,s,r.depth+1)];n.push(...P);continue}const p=v({definition:i.definition,tag:s,parent:r,schemaDefinitionsTagName:a.schemaDefinitionsTagName}),m=w(i.definition,s,r);r.items=[...p,...m,...x(h(s,"description")||"",r,r.depth+1),...T(r,s,r.depth+1)],n.push(r)}return n.filter(({name:s,items:r})=>s!==u||r.length>0)}function R(i,c,o,e,a){const t=[];for(const f of o){const n=d("group",f,c);n.depth=g,n.items=k(i,e,n,f,a),t.push(n)}return t}function v({definition:i,tag:c,parent:o,schemaDefinitionsTagName:e}){const a=e?[e]:[];return Object.entries(i.components?.schemas||{}).map(([t,f])=>{if(!(f["x-tags"]||a).includes(c.name))return null;const s=d("schema",{name:t,"x-displayName":`${f.title||t}`,description:`{% schemaDefinition showWriteOnly="true" schemaRef="#/components/schemas/${t}" /%}`,isSchema:!0,level:2},o);return s.depth=o.depth+1,s}).filter(Boolean)}function w(i,c,o){const e=[];for(const a of y)if(i["x-mcp"]?.[a]){const t=O(a),f=[t];for(const n of i["x-mcp"]?.[a]||[])if((n.tags?.length?n.tags:f).includes(c.name)){const r=b(o.id,N(n.name)),p=d("mcp",{name:n.name,"x-displayName":n.title||n.name,description:`Tool name: \`${n.name}\`
1
+ import{getTagOrGroup as l}from"../../models/group.js";import{DEFAULT_WEBHOOKS_TAG_NAME as g,GROUP_DEPTH as h}from"../../constants.js";import{getValueFromMdParsedExtension as T,isOperationName as P,JsonPointer as S,safeSlugify as b}from"../../utils/index.js";import{getOperationsItems as x}from"./operation.js";import{addMarkdownItems as y}from"./markdown.js";import{joinWithSeparator as k}from"../history/helpers.js";const O=["tools","resources","prompts"];function v(i,c,o,e,r){let t;if(e===void 0?t=Object.keys(c):t=e.tags,!Array.isArray(t))return console.warn("Unexpected values of tags. Check tags or x-tagGroups in your definition."),[];const f=t.map(s=>c[s]?(c[s].used=!0,c[s]):(console.warn(`Non-existing tag "${s}" is added to the group "${e?.name}"`),null)),n=[];for(const s of f){if(!s)continue;const a=l("tag",s,o);if(a.depth=h+1,s.name===""){const u=[...y(T(s,"description")||"",a,a.depth+1),...x(void 0,s,a.depth+1)];n.push(...u);continue}const p=w({definition:i.definition,tag:s,parent:a,schemaDefinitionsTagName:r.schemaDefinitionsTagName}),m=E(i.definition,s,a);a.items=[...p,...m,...y(T(s,"description")||"",a,a.depth+1),...x(a,s,a.depth+1)],n.push(a)}return n.filter(({name:s,items:a})=>s!==g||a.length>0)}function R(i,c,o,e,r){const t=[];for(const f of o){const n=l("group",f,c);n.depth=h,n.items=v(i,e,n,f,r),t.push(n)}return t}function w({definition:i,tag:c,parent:o,schemaDefinitionsTagName:e}){const r=e?[e]:[];return Object.entries(i.components?.schemas||{}).map(([t,f])=>{if(!(f["x-tags"]||r).includes(c.name))return null;const s=l("schema",{name:t,"x-displayName":`${f.title||t}`,description:`{% schemaDefinition showWriteOnly="true" schemaRef="#/components/schemas/${t}" /%}`,isSchema:!0,level:2},o);return s.depth=o.depth+1,s}).filter(Boolean)}function E(i,c,o){const e=[];for(const r of O)if(i["x-mcp"]?.[r]){const t=$(r),f=[t];for(const n of i["x-mcp"]?.[r]||[])if((n.tags?.length?n.tags:f).includes(c.name)){const a=k(o.id,b(n.name)),p=r==="tools"?`Tool name: \`${n.name}\`
2
2
 
3
- ${n.description||""}
4
- {% mcp${t.slice(0,-1)} toolName="${n.name}" id="${r}" /%}`,isSchema:!0,level:2},o);p.depth=o.depth+1,e.push(p)}}return e}function U(i,c){const{definition:o}=i,e={},a=o["x-webhooks"]||o.webhooks,t=o["x-mcp"];for(const f of c||[])e[f.name]={...f,operations:[]};return o.paths&&l(i,o.paths,e),a&&l(i,a,e,!0),t&&E(t,e),e}function E(i,c){for(const o of y)if(i[o])for(const e of i[o]){const a=e.tags&&e.tags.length?e.tags:[O(o)];for(const t of a){let f=c[t];f===void 0&&(f={name:t,operations:[],used:!0},c[t]=f)}}}function l(i,c,o,e){for(const a of Object.keys(c||{})){const t=c[a],f=Object.keys(t).filter(S);for(const n of f){const s=t[n];if(t.$ref){const{resolved:p}=i.deref(t);l(i,{[a]:p},o,e);continue}let r=s?.tags;(!r||!r.length)&&(r=e?[u]:[""]);for(const p of r){let m=o[p];m===void 0&&(m={name:p,operations:[]},o[p]=m),!m["x-traitTag"]&&m.operations.push({...s,pathName:a,pointer:$.compile(["paths",a,n]),httpVerb:n,pathParameters:t.parameters||[],pathServers:t.servers,isWebhook:!!e})}}}}function O(i){return i.charAt(0).toUpperCase()+i.slice(1)}export{O as capitalize,R as getTagGroupsItems,k as getTagsItems,U as getTagsWithOperations};
3
+ `:"",u=l(r==="tools"?"tool":r==="resources"?"rsrc":"prompt",{name:n.name,"x-displayName":n.title||n.name,description:`${p}${n.description||""}
4
+ {% mcp${t.slice(0,-1)} name="${n.name}" id="${a}" /%}`,isSchema:!0,level:2},o);u.depth=o.depth+1,e.push(u)}}return e}function U(i,c){const{definition:o}=i,e={},r=o["x-webhooks"]||o.webhooks,t=o["x-mcp"];for(const f of c||[])e[f.name]={...f,operations:[]};return o.paths&&d(i,o.paths,e),r&&d(i,r,e,!0),t&&N(t,e),e}function N(i,c){for(const o of O)if(i[o])for(const e of i[o]){const r=e.tags&&e.tags.length?e.tags:[$(o)];for(const t of r){let f=c[t];f===void 0&&(f={name:t,operations:[],used:!0},c[t]=f)}}}function d(i,c,o,e){for(const r of Object.keys(c||{})){const t=c[r],f=Object.keys(t).filter(P);for(const n of f){const s=t[n];if(t.$ref){const{resolved:p}=i.deref(t);d(i,{[r]:p},o,e);continue}let a=s?.tags;(!a||!a.length)&&(a=e?[g]:[""]);for(const p of a){let m=o[p];m===void 0&&(m={name:p,operations:[]},o[p]=m),!m["x-traitTag"]&&m.operations.push({...s,pathName:r,pointer:S.compile(["paths",r,n]),httpVerb:n,pathParameters:t.parameters||[],pathServers:t.servers,isWebhook:!!e})}}}}function $(i){return i.charAt(0).toUpperCase()+i.slice(1)}export{$ as capitalize,R as getTagGroupsItems,v as getTagsItems,U as getTagsWithOperations};
@@ -17,7 +17,7 @@ export type ExternalLinkSeparator = {
17
17
  separator?: string;
18
18
  separatorLine?: boolean;
19
19
  };
20
- export type MenuItemGroupType = 'group' | 'tag' | 'section' | 'schema' | 'mcp';
20
+ export type MenuItemGroupType = 'group' | 'tag' | 'section' | 'schema' | 'tool' | 'rsrc' | 'prompt';
21
21
  export type MenuItemType = MenuItemGroupType | 'operation';
22
22
  /** Generic interface for MenuItems */
23
23
  export interface IMenuItem {
@@ -422,6 +422,8 @@ export interface McpResource {
422
422
  description?: string;
423
423
  uri: string;
424
424
  mimeType: string;
425
+ blob?: string;
426
+ text?: string;
425
427
  security?: OpenAPISecurityRequirement[];
426
428
  tags?: string[];
427
429
  'x-badges'?: OpenAPIXBadges[];
@@ -431,9 +433,13 @@ export interface McpPrompt {
431
433
  title?: string;
432
434
  description: string;
433
435
  arguments: McpPromptArgument[];
436
+ security?: OpenAPISecurityRequirement[];
437
+ tags?: string[];
438
+ 'x-badges'?: OpenAPIXBadges[];
434
439
  }
435
440
  export interface McpPromptArgument {
436
441
  name: string;
437
442
  description: string;
438
443
  required: boolean;
444
+ example?: string;
439
445
  }
package/lib/utils/menu.js CHANGED
@@ -1 +1 @@
1
- function n(e){return e.type==="operation"||e.type==="schema"||e.type==="mcp"}export{n as isRenderableMenuItem};
1
+ function p(e){return e.type==="operation"||e.type==="schema"||e.type==="tool"||e.type==="rsrc"||e.type==="prompt"}export{p as isRenderableMenuItem};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redocly/openapi-docs",
3
- "version": "3.15.0-rc.4",
3
+ "version": "3.15.0-rc.6",
4
4
  "description": "Redocly OpenAPI Docs",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",