@redocly/openapi-docs 3.15.0-rc.6 → 3.16.0-custom.3

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.
Files changed (58) hide show
  1. package/dist/redocly-openapi-docs.min.js +4285 -3373
  2. package/lib/components/Discriminator/DefaultMappingOption.d.ts +5 -0
  3. package/lib/components/Discriminator/DefaultMappingOption.js +15 -0
  4. package/lib/components/Discriminator/Discriminator.js +16 -2
  5. package/lib/components/Download/DownloadSpecification.js +2 -2
  6. package/lib/components/ExpandAllButton/ExpandAllButton.js +1 -1
  7. package/lib/components/Language/LanguageList.js +1 -1
  8. package/lib/components/PanelItem/styled.js +1 -1
  9. package/lib/components/RedoclyOpenAPIDocs/Providers.js +1 -1
  10. package/lib/components/RedoclyOpenAPIDocs/RedoclyOpenAPIDocs.js +1 -1
  11. package/lib/components/RedoclyOpenAPIDocs/RedoclyOpenAPIDocsStandalone.js +1 -1
  12. package/lib/components/RedoclyOpenAPIDocs/styled.js +6 -2
  13. package/lib/components/RedoclyOpenAPIDocs/types.d.ts +3 -0
  14. package/lib/components/Replay/EmbeddedReplay.d.ts +2 -1
  15. package/lib/components/Replay/EmbeddedReplay.js +3 -3
  16. package/lib/components/Replay/Replay.js +1 -1
  17. package/lib/components/Replay/utils.js +1 -1
  18. package/lib/components/RequestSamples/Example.js +1 -1
  19. package/lib/components/RequestSamples/RequestSamples.js +1 -1
  20. package/lib/components/Samples/ExampleSwitch.js +1 -1
  21. package/lib/components/SchemaCatalogLink/tests/SchemaCatalogLink.test.js +1 -1
  22. package/lib/components/ServerListDropdown/ServerListDropdown.js +1 -1
  23. package/lib/components/SideMenu/hooks/useMenuItems.js +1 -1
  24. package/lib/components/TagItem/OperationNavigationItems.js +4 -4
  25. package/lib/components/TagItem/OperationsNavigation.js +2 -2
  26. package/lib/components/common/Dropdown/Dropdown.d.ts +3 -3
  27. package/lib/components/common/Dropdown/Dropdown.js +9 -9
  28. package/lib/components/common/SchemaSelection/SchemaSelection.d.ts +2 -2
  29. package/lib/components/common/SchemaSelection/SchemaSelection.js +1 -1
  30. package/lib/hooks/index.d.ts +1 -1
  31. package/lib/hooks/index.js +1 -1
  32. package/lib/hooks/useRouter.js +1 -1
  33. package/lib/icons/DefaultMappingIcon/DefaultMappingIcon.d.ts +4 -0
  34. package/lib/icons/DefaultMappingIcon/DefaultMappingIcon.js +8 -0
  35. package/lib/icons/DefaultMappingIcon/index.d.ts +1 -0
  36. package/lib/icons/DefaultMappingIcon/index.js +1 -0
  37. package/lib/models/group.js +1 -1
  38. package/lib/models/mediaType.js +1 -1
  39. package/lib/models/operation.js +1 -1
  40. package/lib/models/schema.d.ts +2 -1
  41. package/lib/models/schema.js +2 -2
  42. package/lib/models/types.d.ts +5 -0
  43. package/lib/services/OpenAPIParser.js +1 -1
  44. package/lib/services/menu/builder.js +1 -1
  45. package/lib/services/menu/operation.js +1 -1
  46. package/lib/services/menu/tags.d.ts +1 -0
  47. package/lib/services/menu/tags.js +3 -3
  48. package/lib/services/types.d.ts +3 -0
  49. package/lib/standalone.js +1 -1
  50. package/lib/types/open-api.d.ts +4 -0
  51. package/lib/utils/configure-helpers.d.ts +2 -2
  52. package/lib/utils/configure-helpers.js +1 -1
  53. package/lib/utils/loadAndBundleSpec.js +1 -1
  54. package/lib/utils/mcp.d.ts +1 -1
  55. package/lib/utils/mcp.js +1 -1
  56. package/package.json +17 -12
  57. package/lib/components/RedoclyOpenAPIDocs/Error.d.ts +0 -3
  58. package/lib/components/RedoclyOpenAPIDocs/Error.js +0 -25
@@ -1 +1 @@
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
+ import{REDOCLY_TEAMS_RBAC as o}from"@redocly/config";import{joinWithSeparator as h}from"../services/index.js";import{getValueFromMdParsedExtension as S,safeSlugify as m}from"../utils/index.js";import{getHref as r}from"../services/menu/operation.js";import{saveTextBeforeHeading as v}from"../utils/saveTextBeforeHeading.js";function b(s,e,i){let n;i?.id&&(s==="schema"||s==="tool"||s==="rsrc"||s==="prompt")?n=h(i.id,m(e.name)):n=e.id||m(e.name);const d=e["x-displayName"]||e.name,c=e.level||1,t=e.isSchema,f=e.ast||void 0,l=v(S(e,"description")||""),a=e.items||[],x=e.externalDocs;return{id:n.toLowerCase(),type:s,parent:i,name:d,level:c,badges:e["x-badges"]||[],depth:0,isSchema:t,description:l,items:a,ast:f,externalDocs:x,href:r({id:n}),[o]:e[o]||i?.[o],keywords:s==="tag"?e["x-keywords"]:void 0}}export{b as getTagOrGroup};
@@ -1 +1 @@
1
- import{getSchema as E}from"./schema.js";import{isFormUrlEncoded as P,isJsonLike as b,isXmlLike as k,isMultipartFormData as j,JsonPointer as R,mapValues as w}from"../utils/index.js";import{getExamples as r}from"./example.js";import{safeSample as v}from"../services/code-samples/index.js";function g({parser:i,info:{encoding:e,schema:a},schema:l,mime:m,options:{isRequestType:s,onlyRequiredInSamples:u,generatedSamplesMaxDepth:p,format:d="json"}}){const f={skipReadOnly:s,skipWriteOnly:!s,skipNonRequired:s&&u,maxSampleDepth:p,quiet:!0,format:d};let n={};if(l&&l.oneOf)for(const o of l.oneOf){const t=v(o.rawSchema,f,i.definition);t!==null&&(l.discriminatorProp&&typeof t=="object"&&t&&t[l.discriminatorProp]&&(t[l.discriminatorProp]=o.title),n[o.title]=r({parser:i,infoOrRef:{value:t},mime:m,encoding:e}))}else if(l){const o=v(a,f,i.definition);o!==null?n={default:r({parser:i,infoOrRef:{value:o},mime:m,encoding:e})}:n={default:{value:null,rawValue:"null"}}}else n={default:{value:null,rawValue:"null"}};return n}function J(i,e,a,l,m,{operation:s,type:u,response:p,absolutePointer:d=""}){let f,n;const o=l.schema&&E({parser:i,schemaOrRef:l.schema,pointer:"",absolutePointer:R.join(d,["content",e,"schema"]),options:m,deps:{operation:s,type:u,response:p}}),{onlyRequiredInSamples:t,generatedSamplesMaxDepth:c}=m,{encoding:x,examples:O,example:S}=l;return m.unstable_skipSamples||(O!==void 0?f=w(O,h=>r({parser:i,infoOrRef:h,mime:e,encoding:x})):S!==void 0?f={default:r({parser:i,infoOrRef:{value:i.deref(S).resolved},mime:e,encoding:x})}:b(e)||k(e)?f=g({parser:i,info:l,schema:o,mime:e,options:{isRequestType:a,onlyRequiredInSamples:t,generatedSamplesMaxDepth:c,format:k(e)?"xml":"json"}}):(P(e)||j(e))&&(n=g({parser:i,info:l,schema:o,mime:e,options:{isRequestType:a,onlyRequiredInSamples:t,generatedSamplesMaxDepth:c}}))),{examples:f,schema:o,name:e,isRequestType:a,formExamples:n,onlyRequiredInSamples:t,operation:s}}export{J as getMediaType};
1
+ import{getSchema as E}from"./schema.js";import{isFormUrlEncoded as P,isJsonLike as b,isXmlLike as g,isMultipartFormData as j,JsonPointer as D,mapValues as M}from"../utils/index.js";import{getExamples as r}from"./example.js";import{safeSample as k}from"../services/code-samples/index.js";function v({parser:i,info:{encoding:e,schema:m},schema:l,mime:s,options:{isRequestType:a,onlyRequiredInSamples:u,generatedSamplesMaxDepth:p,format:d="json"}}){const f={skipReadOnly:a,skipWriteOnly:!a,skipNonRequired:a&&u,maxSampleDepth:p,quiet:!0,format:d};let n={};if(l&&l.oneOf)for(const o of l.oneOf){const t=k(o.rawSchema,f,i.definition);t!==null&&(l.discriminatorProp&&typeof t=="object"&&t&&t[l.discriminatorProp]&&!o.isDefaultMapping&&(t[l.discriminatorProp]=o.title),n[o.title]=r({parser:i,infoOrRef:{value:t},mime:s,encoding:e}))}else if(l){const o=k(m,f,i.definition);o!==null?n={default:r({parser:i,infoOrRef:{value:o},mime:s,encoding:e})}:n={default:{value:null,rawValue:"null"}}}else n={default:{value:null,rawValue:"null"}};return n}function J(i,e,m,l,s,{operation:a,type:u,response:p,absolutePointer:d=""}){let f,n;const o=l.schema&&E({parser:i,schemaOrRef:l.schema,pointer:"",absolutePointer:D.join(d,["content",e,"schema"]),options:s,deps:{operation:a,type:u,response:p}}),{onlyRequiredInSamples:t,generatedSamplesMaxDepth:c}=s,{encoding:x,examples:O,example:S}=l;return s.unstable_skipSamples||(O!==void 0?f=M(O,h=>r({parser:i,infoOrRef:h,mime:e,encoding:x})):S!==void 0?f={default:r({parser:i,infoOrRef:{value:i.deref(S).resolved},mime:e,encoding:x})}:b(e)||g(e)?f=v({parser:i,info:l,schema:o,mime:e,options:{isRequestType:m,onlyRequiredInSamples:t,generatedSamplesMaxDepth:c,format:g(e)?"xml":"json"}}):(P(e)||j(e))&&(n=v({parser:i,info:l,schema:o,mime:e,options:{isRequestType:m,onlyRequiredInSamples:t,generatedSamplesMaxDepth:c}}))),{examples:f,schema:o,name:e,isRequestType:m,formExamples:n,onlyRequiredInSamples:t,operation:a}}export{J as getMediaType};
@@ -1 +1 @@
1
- import{REDOCLY_TEAMS_RBAC as g}from"@redocly/config";import{removeLeadingSlash as x}from"@redocly/theme/core/openapi";import{configure as q}from"@redocly/theme/ext/configure";import{extractExtensions as R,getOperationId as P,getOperationName as B,getStatusCodeType as E,getValueFromMdParsedExtension as C,isStatusCode as k,JsonPointer as V,mergeParams as I,normalizeServers as f,sortByDeprecated as O,sortByRequired as N,updateOperationWithRequestValues as W,updateParametersWithUserValues as w}from"../utils/index.js";import{getCallback as A}from"./callback.js";import{getField as F}from"./field.js";import{getRequestBody as M}from"./request.js";import{getSecurity as n}from"./security.js";import{getResponse as j}from"./response.js";import{getHref as L}from"../services/menu/operation.js";function $(s){return s.lang==="Payload"&&"requestBodyContent"in s}function i(s,e,t,a,m,d,h,p){const c=e.isWebhook,r={operationDefinition:e,parent:t,pointer:e.pointer,description:C(e,"description"),externalDocs:e.externalDocs,deprecated:!!e.deprecated,httpVerb:e.httpVerb,operationId:e.operationId,path:e.pathName,isWebhook:c,isCallback:!!d?.isCallback,isEvent:d?.isCallback||c,name:B(e),defaultExampleName:e.defaultSampleName,[g]:e[g]||t?.[g],type:"operation",callbackId:d?.id,href:m,get callbacks(){return Object.keys(e.callbacks||[]).map(u=>A(s,u,e.callbacks?.[u],r.pointer,a,m,t,h))},get responses(){let u=!1;return Object.keys(e.responses||[]).filter(l=>l==="default"?!0:(E(l)==="success"&&(u=!0),k(l))).map(l=>j({parser:s,code:l,defaultAsError:u,infoOrRef:e.responses[l],options:a,isEvent:r.isEvent,operation:r}))},get parameters(){return T(s,e,r,a,o)}};if(d?.isCallback)r.security=n(e.security,s),r.servers=f("",e.servers||e.pathServers||[]),r.id=x(m);else{r.id=P(e,t),r.href=r.href||L(r),r.security=n(e.security||s.definition.security,s);const u=e.servers||(e.pathServers?.length?e.pathServers:null)||s.definition.servers||[];r.servers=f(s.definitionUrl,U(u,a.mockServer))}a.showExtensions&&(r.extensions=R(e,a.showExtensions)),r.requestBody=e.requestBody?M({parser:s,infoOrRef:e.requestBody,options:a,operation:r,isEvent:r.isEvent}):void 0;const y=r.requestBody?.content;r.payload={lang:"Payload",source:"",requestBodyContent:y?.hasSample?y:void 0},r.definitionSamples=e["x-codeSamples"]||[],r.badges=e["x-badges"]?.map(({name:u,color:l,position:v})=>({name:u,color:l||"var(--color-info-base)",position:v||"after"}))||[],r.hasSamples=y?.hasSample||r.definitionSamples.length>0,r.hideReplay=e["x-hideReplay"]===!0;const S={userClaims:h,info:s.definition.info||{},operation:{operationId:r.operationId,name:r.name,path:r.path,href:r.href,method:r.httpVerb},servers:r.servers},b=q(S)||{},o=p||b.requestValues||{};return W(r,o),r}function T(s,e,t,a,m){let d=I(s,e.pathParameters,e.parameters,{pathPointer:V.dirName(t.pointer),operationPointer:t.pointer}).map(({paramOrRef:h,pointer:p})=>{const c=F(s,h,p,a,{operation:t,type:"request"});return w(c,m),c});return a.sortRequiredPropsFirst&&(d=N(d)),O(d)}function U(s,e){if(!e)return s;const t={url:e.url,description:e.description};switch(e.position){case"first":return[t,...s];case"last":return[...s,t];case"replace":return[t];default:return s}}export{i as getOperation,$ as isPayloadSample,U as mergeInMockServer};
1
+ import{REDOCLY_TEAMS_RBAC as o}from"@redocly/config";import{removeLeadingSlash as x}from"@redocly/theme/core/openapi";import{configure as q}from"@redocly/theme/ext/configure";import{extractExtensions as R,getOperationId as P,getOperationName as B,getStatusCodeType as E,getValueFromMdParsedExtension as C,isStatusCode as k,JsonPointer as O,mergeParams as V,normalizeServers as n,sortByDeprecated as I,sortByRequired as A,updateOperationWithRequestValues as N,updateParametersWithUserValues as W}from"../utils/index.js";import{getCallback as w}from"./callback.js";import{getField as F}from"./field.js";import{getRequestBody as M}from"./request.js";import{getSecurity as f}from"./security.js";import{getResponse as j}from"./response.js";import{getHref as L}from"../services/menu/operation.js";function $(s){return s.lang==="Payload"&&"requestBodyContent"in s}function i(s,e,t,a,m,d,h,p){const c=e.isWebhook,r={operationDefinition:e,parent:t,pointer:e.pointer,description:C(e,"description"),externalDocs:e.externalDocs,deprecated:!!e.deprecated,httpVerb:e.httpVerb,operationId:e.operationId,path:e.pathName,isWebhook:c,isAdditionalOperation:e.isAdditionalOperation,isCallback:!!d?.isCallback,isEvent:d?.isCallback||c,name:B(e),defaultExampleName:e.defaultSampleName,[o]:e[o]||t?.[o],type:"operation",callbackId:d?.id,href:m,get callbacks(){return Object.keys(e.callbacks||[]).map(u=>w(s,u,e.callbacks?.[u],r.pointer,a,m,t,h))},get responses(){let u=!1;return Object.keys(e.responses||[]).filter(l=>l==="default"?!0:(E(l)==="success"&&(u=!0),k(l))).map(l=>j({parser:s,code:l,defaultAsError:u,infoOrRef:e.responses[l],options:a,isEvent:r.isEvent,operation:r}))},get parameters(){return T(s,e,r,a,g)}};if(d?.isCallback)r.security=f(e.security,s),r.servers=n("",e.servers||e.pathServers||[]),r.id=x(m);else{r.id=P(e,t),r.href=r.href||L(r),r.security=f(e.security||s.definition.security,s);const u=e.servers||(e.pathServers?.length?e.pathServers:null)||s.definition.servers||[];r.servers=n(s.definitionUrl,U(u,a.mockServer))}a.showExtensions&&(r.extensions=R(e,a.showExtensions)),r.requestBody=e.requestBody?M({parser:s,infoOrRef:e.requestBody,options:a,operation:r,isEvent:r.isEvent}):void 0;const y=r.requestBody?.content;r.payload={lang:"Payload",source:"",requestBodyContent:y?.hasSample?y:void 0},r.definitionSamples=e["x-codeSamples"]||[],r.badges=e["x-badges"]?.map(({name:u,color:l,position:v})=>({name:u,color:l||"var(--color-info-base)",position:v||"after"}))||[],r.hasSamples=y?.hasSample||r.definitionSamples.length>0,r.hideReplay=e["x-hideReplay"]===!0;const S={userClaims:h,info:s.definition.info||{},operation:{operationId:r.operationId,name:r.name,path:r.path,href:r.href,method:r.httpVerb},servers:r.servers},b=q(S)||{},g=p||b.requestValues||{};return N(r,g),r}function T(s,e,t,a,m){let d=V(s,e.pathParameters,e.parameters,{pathPointer:O.dirName(t.pointer),operationPointer:t.pointer}).map(({paramOrRef:h,pointer:p})=>{const c=F(s,h,p,a,{operation:t,type:"request"});return W(c,m),c});return a.sortRequiredPropsFirst&&(d=A(d)),I(d)}function U(s,e){if(!e)return s;const t={url:e.url,description:e.description};switch(e.position){case"first":return[t,...s];case"last":return[...s,t];case"replace":return[t];default:return s}}export{i as getOperation,$ as isPayloadSample,U as mergeInMockServer};
@@ -1,12 +1,13 @@
1
1
  import type { OpenAPISchema, Referenced } from '../types/index.js';
2
2
  import type { OpenAPIParser, Options } from '../services/index.js';
3
3
  import type { Deps, SchemaModel } from './types.js';
4
- export declare function getSchema({ parser, schemaOrRef, pointer, options, isChild, baseRefsStack, deps, absolutePointer, }: {
4
+ export declare function getSchema({ parser, schemaOrRef, pointer, options, isChild, isDefaultMapping, baseRefsStack, deps, absolutePointer, }: {
5
5
  parser: OpenAPIParser;
6
6
  schemaOrRef: Referenced<OpenAPISchema>;
7
7
  pointer: string;
8
8
  options: Options;
9
9
  isChild?: boolean;
10
+ isDefaultMapping?: boolean;
10
11
  baseRefsStack?: string[];
11
12
  deps: Deps;
12
13
  absolutePointer?: string;
@@ -1,2 +1,2 @@
1
- import{REDOCLY_TEAMS_RBAC as h}from"@redocly/config";import{isObject as I}from"@redocly/theme/core/openapi";import{pushRef as M}from"../services/OpenAPIParser.js";import{detectType as w,extractExtensions as q,getValueFromMdParsedExtension as S,humanizeConstraints as C,isNamedDefinition as j,isPrimitiveType as E,JsonPointer as b,pluralizeType as B,sortByDeprecated as z,sortByRequired as L}from"../utils/index.js";import{getField as T}from"./field.js";function F({parser:i,schemaOrRef:n,pointer:u,options:a,isChild:y=!1,baseRefsStack:f=[],deps:o,absolutePointer:p}){const{resolved:c,refsStack:m}=i.deref(n,f,!0),r=n.$ref||u||p||"",l=M(m,r),e=i.mergeAllOf(c,r,l,n.$ref||p),d=e.type||w(e),t={operationPointer:o.operation?.pointer||p||"",schemaOrRef:n,isChild:y,typePrefix:"",pointer:r,absolutePointer:p,refsStack:l,rawSchema:c,type:d,isCircular:!!e["x-circular-ref"],isComplex:!!e["x-complex"],title:e.title||j(r)&&b.baseName(r)||"",description:S(e,"description")||"",format:e.format,enum:e.enum||[],example:e.example,deprecated:!!e.deprecated,pattern:e.pattern,externalDocs:e.externalDocs,displayFormat:e.format,isPrimitive:E(e,d),constraints:C(e),default:e.default,readOnly:!!e.readOnly,writeOnly:!!e.writeOnly,const:e.const||"",contentEncoding:e.contentEncoding,contentMediaType:e.contentMediaType,minItems:e.minItems,maxItems:e.maxItems,nullable:e.nullable||e["x-nullable"],schema:e,displayType:"",items:void 0,extensions:void 0,oneOfType:"",discriminatorProp:void 0,oneOf:void 0,[h]:e[h],"x-enumDescriptions":S(e,"x-enumDescriptions"),get fields(){if(!t.isCircular&&!t.isComplex&&($(t,"object")||$(t,"array")&&D(e)))return _(i,e,r,a,l,o)}};if((e.nullable||e["x-nullable"])&&(Array.isArray(t.type)&&!t.type.some(s=>s===null||s==="null")?t.type=[...t.type,"null"]:!Array.isArray(t.type)&&(t.type!==null||t.type!=="null")&&(t.type=[t.type,"null"])),t.displayType=Array.isArray(t.type)?t.type.map(s=>s===null?"null":s).join(" or "):t.type,t.isCircular)return t;if(e.if&&e.then||e.if&&e.else){const{oneOf:s,oneOfType:P}=V({schema:e,parser:i,pointer:r,options:a,deps:o,refsStack:l});return t.oneOf=s,t.oneOfType=P,t}if(!y&&v(e)!==void 0){const{oneOf:s,discriminatorProp:P}=J({schema:e,parser:i,deps:o,mergedSchema:e,options:a,pointer:r,refsStack:l});return t.oneOf=s,t.discriminatorProp=P,t}else y&&Array.isArray(e.oneOf)&&e.oneOf.find(s=>s.$ref===r)&&delete e.oneOf;if(e.oneOf!==void 0){const{oneOf:s,displayType:P}=k({schemaOneOf:e.oneOf,parser:i,deps:o,options:a,pointer:r,refsStack:l,schema:e});return t.oneOfType="One of",s&&(t.oneOf=s),t.displayType=P,e.anyOf!==void 0&&console.warn(`oneOf and anyOf are not supported on the same level. Skipping anyOf at ${r}`),t}if(e.anyOf!==void 0){const{oneOf:s,displayType:P}=k({schemaOneOf:e.anyOf,parser:i,deps:o,options:a,pointer:r,refsStack:l,schema:e});return s&&(t.oneOf=s),t.displayType=P,t.oneOfType="Any of",t}if($(t,"array")&&(e.items&&!D(e)&&(t.items=F({parser:i,schemaOrRef:Object.assign({type:"object"},e.items),pointer:r+"/items",options:a,baseRefsStack:l,deps:o,absolutePointer:b.join(e.absolutePointer||"",["items"])})),t.displayType=e.prefixItems||Array.isArray(e.items)?"items":B(t.items?.displayType||t.displayType),t.displayFormat=t.items?.format||"",t.typePrefix=t.items?.typePrefix||"Array of ",t.title=t.title||t.items?.title||"",t.isPrimitive=t.items?.isPrimitive!==void 0?t.items?.isPrimitive:t.isPrimitive,t.example===void 0&&t.items?.example!==void 0&&(t.example=[t.items.example]),t.items?.isPrimitive&&(t.enum=t.items.enum,t["x-enumDescriptions"]=S(t.items,"x-enumDescriptions")),Array.isArray(t.type))){const s=t.type.filter(P=>P!=="array");s.length&&(t.displayType+=` or ${s.join(" or ")}`)}return a.showExtensions&&(t.extensions=q(e,a.showExtensions)),t}function J({schema:i,parser:n,pointer:u,options:a,refsStack:y,deps:f,mergedSchema:o}){const p=v(i),c=p?.propertyName,m=n.findDerived([...o["x-parentRefs"]||[],u]);if(i.oneOf)for(const O of i.oneOf){if(O.$ref===void 0)continue;const x=b.baseName(O.$ref);m[O.$ref]=x}const r=p?.mapping||{};let l=p?.["x-explicitMappingOnly"]||!1;Object.keys(r).length===0&&(l=!1);const e={};for(const O in r){const x=r[O];Array.isArray(e[x])?e[x].push(O):e[x]=[O]}const d=l?{...e}:{...m,...e};let t=[];for(const O of Object.keys(d)){const x=d[O];if(Array.isArray(x))for(const A of x)t.push({$ref:O,name:A});else t.push({$ref:O,name:x})}const s=Object.keys(r);return s.length!==0&&(t=t.sort((O,x)=>{const A=s.indexOf(O.name),g=s.indexOf(x.name);return A<0&&g<0?O.name.localeCompare(x.name):A<0?1:g<0?-1:A-g})),{oneOf:t.map(({$ref:O,name:x},A)=>{const g=F({parser:n,schemaOrRef:{$ref:O},pointer:O,options:a,isChild:!0,baseRefsStack:y.slice(0,-1),deps:{...f,parentFieldFullPath:f.parentFieldFullPath?f.parentFieldFullPath+"&d="+A:"&d="+A.toString()},absolutePointer:o.absolutePointer});return g.title=x,g}),discriminatorProp:c}}function k({schemaOneOf:i,parser:n,refsStack:u,pointer:a,schema:y,options:f,deps:o}){const p=i.map((m,r)=>{const{resolved:l,refsStack:e}=n.deref(m,u,!0),d=n.mergeAllOf(l,a+"/oneOf/"+r,e),t=j(m.$ref)&&!d.title?b.baseName(m.$ref):`${d.title||""}${d.const&&JSON.stringify(d.const)||""}`;return F({parser:n,schemaOrRef:{...d,title:t,allOf:[{...y,oneOf:void 0,anyOf:void 0}],discriminator:l.allOf?void 0:d.discriminator},pointer:m.$ref||a+"/oneOf/"+r,options:f,baseRefsStack:e,deps:{...o,parentFieldFullPath:o.parentFieldFullPath?o.parentFieldFullPath+"&oneOf="+r:"&oneOf="+r.toString()}})}),c=[...new Set(p.map(m=>{let r=m.typePrefix+(m.title&&!f.hideSchemaTitles?`${m.title} (${m.displayType})`:m.displayType);return r.indexOf(" or ")>-1&&(r=`(${r})`),r}))].join(" or ");return{oneOf:p,displayType:c}}function V({schema:i,parser:n,pointer:u,options:a,refsStack:y,deps:f}){const{if:o,else:p={},then:c={},...m}=i;return{oneOf:[{allOf:[m,c,o],title:o&&o["x-displayName"]||o?.title||"case 1"},{allOf:[m,p],title:p&&p["x-displayName"]||p?.title||"case 2"}].map((d,t)=>F({parser:n,schemaOrRef:{...d},pointer:u+"/oneOf/"+t,options:a,baseRefsStack:y,deps:{...f,parentFieldFullPath:f.parentFieldFullPath?f.parentFieldFullPath+"&oneOf="+t:"&oneOf="+t.toString()}})),oneOfType:"One of"}}function R(i,n,u){return i||(console.warn(`Field "${n}" is invalid, skipping.
2
- Field must be an object but got ${typeof i} at "${u}"`),{})}function _(i,n,u,a,y,f){let o=n.properties||($(n,"array")?n.prefixItems||n.items:void 0)||{};const p=n.patternProperties||{},c=n.additionalProperties||n.unevaluatedProperties,m=n.prefixItems?n.items:n.additionalItems,r=n.default||{};let l=Object.keys(o).map(e=>{const d=R(o[e],e,u),t=n.required===void 0?!1:n.required.indexOf(e)>-1;return T(i,{name:n.properties?e:`[${e}]`,required:t,schema:{...d,example:n.example?.[e]||d.example,default:d.default===void 0&&r?r[e]:d.default}},u+"/properties/"+e,a,f,y,b.join(n.absolutePointer||"",["properties",e]))});return a.sortRequiredPropsFirst&&(l=L(l,n.required)),l.push(...Object.keys(p).map(e=>{const d=R(p[e],e,u);return T(i,{name:e,required:!1,schema:d,kind:"patternProperties"},`${u}/patternProperties/${e}`,a,f,y)})),(I(c)||c===!0)&&l.push(T(i,{name:(I(c)&&c["x-additionalPropertiesName"]||"property name").concat("*"),required:!1,schema:c===!0?{}:c,kind:"additionalProperties"},u+"/additionalProperties",a,f,y,b.join(n.absolutePointer||"",["additionalProperties"]))),l.push(...Y({parser:i,schema:m,fieldsCount:l.length,$ref:u,options:a,refsStack:y,deps:f})),z(l)}function Y({parser:i,schema:n=!1,fieldsCount:u,$ref:a,options:y,refsStack:f,deps:o}){return typeof n=="boolean"?n?[T(i,{name:`[${u}...]`,schema:{},kind:"additionalItems"},`${a}/additionalItems`,y,o,f)]:[]:Array.isArray(n)?[...n.map((p,c)=>T(i,{name:`[${u+c}]`,schema:p,kind:"additionalItems"},`${a}/additionalItems/${c}`,y,o,f))]:I(n)?[T(i,{name:`[${u}...]`,schema:n,kind:"additionalItems"},`${a}/additionalItems`,y,o,f)]:[]}function v(i){return i.discriminator||i["x-discriminator"]}function $(i,n){return i.type===n||Array.isArray(i.type)&&i.type.includes(n)}function D(i){return!!(Array.isArray(i.items)||Array.isArray(i.prefixItems))}export{F as getSchema};
1
+ import{REDOCLY_TEAMS_RBAC as S}from"@redocly/config";import{isObject as I}from"@redocly/theme/core/openapi";import{pushRef as w}from"../services/OpenAPIParser.js";import{detectType as q,extractExtensions as C,getValueFromMdParsedExtension as M,humanizeConstraints as E,isNamedDefinition as h,isPrimitiveType as B,JsonPointer as A,pluralizeType as z,sortByDeprecated as L,sortByRequired as J}from"../utils/index.js";import{getField as T}from"./field.js";function F({parser:i,schemaOrRef:n,pointer:u,options:l,isChild:P=!1,isDefaultMapping:f=!1,baseRefsStack:m=[],deps:a,absolutePointer:y}){const{resolved:p,refsStack:c}=i.deref(n,m,!0),s=n.$ref||u||y||"",r=w(c,s),e=i.mergeAllOf(p,s,r,n.$ref||y),O=e.type||q(e),t={operationPointer:a.operation?.pointer||y||"",schemaOrRef:n,isChild:P,isDefaultMapping:f,typePrefix:"",pointer:s,absolutePointer:y,refsStack:r,rawSchema:p,type:O,isCircular:!!e["x-circular-ref"],isComplex:!!e["x-complex"],title:e.title||h(s)&&A.baseName(s)||"",description:M(e,"description")||"",format:e.format,enum:e.enum||[],example:e.example,deprecated:!!e.deprecated,pattern:e.pattern,externalDocs:e.externalDocs,displayFormat:e.format,isPrimitive:B(e,O),constraints:E(e),default:e.default,readOnly:!!e.readOnly,writeOnly:!!e.writeOnly,const:e.const||"",contentEncoding:e.contentEncoding,contentMediaType:e.contentMediaType,minItems:e.minItems,maxItems:e.maxItems,nullable:e.nullable||e["x-nullable"],schema:e,displayType:"",items:void 0,extensions:void 0,oneOfType:"",discriminatorProp:void 0,oneOf:void 0,[S]:e[S],"x-enumDescriptions":M(e,"x-enumDescriptions"),get fields(){if(!t.isCircular&&!t.isComplex&&($(t,"object")||$(t,"array")&&v(e)))return K(i,e,s,l,r,a)}};if((e.nullable||e["x-nullable"])&&(Array.isArray(t.type)&&!t.type.some(d=>d===null||d==="null")?t.type=[...t.type,"null"]:!Array.isArray(t.type)&&(t.type!==null||t.type!=="null")&&(t.type=[t.type,"null"])),t.displayType=Array.isArray(t.type)?t.type.map(d=>d===null?"null":d).join(" or "):t.type,t.isCircular)return t;if(e.if&&e.then||e.if&&e.else){const{oneOf:d,oneOfType:o}=_({schema:e,parser:i,pointer:s,options:l,deps:a,refsStack:r});return t.oneOf=d,t.oneOfType=o,t}if(!P&&R(e)!==void 0){const{oneOf:d,discriminatorProp:o}=V({schema:e,parser:i,deps:a,mergedSchema:e,options:l,pointer:s,refsStack:r});return t.oneOf=d,t.discriminatorProp=o,t}else P&&Array.isArray(e.oneOf)&&e.oneOf.find(d=>d.$ref===s)&&delete e.oneOf;if(e.oneOf!==void 0){const{oneOf:d,displayType:o}=j({schemaOneOf:e.oneOf,parser:i,deps:a,options:l,pointer:s,refsStack:r,schema:e});return t.oneOfType="One of",d&&(t.oneOf=d),t.displayType=o,e.anyOf!==void 0&&console.warn(`oneOf and anyOf are not supported on the same level. Skipping anyOf at ${s}`),t}if(e.anyOf!==void 0){const{oneOf:d,displayType:o}=j({schemaOneOf:e.anyOf,parser:i,deps:a,options:l,pointer:s,refsStack:r,schema:e});return d&&(t.oneOf=d),t.displayType=o,t.oneOfType="Any of",t}if($(t,"array")&&(e.items&&!v(e)&&(t.items=F({parser:i,schemaOrRef:Object.assign({type:"object"},e.items),pointer:s+"/items",options:l,baseRefsStack:r,deps:a,absolutePointer:A.join(e.absolutePointer||"",["items"])})),t.displayType=e.prefixItems||Array.isArray(e.items)?"items":z(t.items?.displayType||t.displayType),t.displayFormat=t.items?.format||"",t.typePrefix=t.items?.typePrefix||"Array of ",t.title=t.title||t.items?.title||"",t.isPrimitive=t.items?.isPrimitive!==void 0?t.items?.isPrimitive:t.isPrimitive,t.example===void 0&&t.items?.example!==void 0&&(t.example=[t.items.example]),t.items?.isPrimitive&&(t.enum=t.items.enum,t["x-enumDescriptions"]=M(t.items,"x-enumDescriptions")),Array.isArray(t.type))){const d=t.type.filter(o=>o!=="array");d.length&&(t.displayType+=` or ${d.join(" or ")}`)}return l.showExtensions&&(t.extensions=C(e,l.showExtensions)),t}function V({schema:i,parser:n,pointer:u,options:l,refsStack:P,deps:f,mergedSchema:m}){const a=R(i),y=a?.propertyName,p=n.findDerived([...m["x-parentRefs"]||[],u]);if(i.oneOf)for(const o of i.oneOf){if(o.$ref===void 0)continue;const x=A.baseName(o.$ref);p[o.$ref]=x}const c=a?.mapping||{},s=a?.["x-explicitMappingOnly"]??Object.keys(c).length>0,r={};for(const o in c){const x=c[o];Array.isArray(r[x])?r[x].push(o):r[x]=[o]}const e=s?{...r}:{...p,...r};let O=[];for(const o of Object.keys(e)){const x=e[o];if(Array.isArray(x))for(const g of x)O.push({$ref:o,name:g});else O.push({$ref:o,name:x})}if(a?.defaultMapping){const o=O.findIndex(g=>g.name===A.baseName(a.defaultMapping)),x="Default mapping";~o?O[o]={$ref:a.defaultMapping,name:x,isDefaultMapping:!0}:O.push({$ref:a.defaultMapping,name:x,isDefaultMapping:!0})}const t=Object.keys(c);return t.length!==0&&(O=O.sort((o,x)=>{if(o.isDefaultMapping&&!x.isDefaultMapping)return 1;if(!o.isDefaultMapping&&x.isDefaultMapping)return-1;const g=t.indexOf(o.name),b=t.indexOf(x.name);return g<0&&b<0?o.name.localeCompare(x.name):g<0?1:b<0?-1:g-b})),{oneOf:O.map(({$ref:o,name:x,isDefaultMapping:g},b)=>{const D=F({parser:n,schemaOrRef:{$ref:o},pointer:o,options:l,isChild:!0,isDefaultMapping:g,baseRefsStack:P.slice(0,-1),deps:{...f,parentFieldFullPath:f.parentFieldFullPath?f.parentFieldFullPath+"&d="+b:"&d="+b.toString()},absolutePointer:m.absolutePointer});return D.title=x,D}),discriminatorProp:y}}function j({schemaOneOf:i,parser:n,refsStack:u,pointer:l,schema:P,options:f,deps:m}){const a=i.map((p,c)=>{const{resolved:s,refsStack:r}=n.deref(p,u,!0),e=n.mergeAllOf(s,l+"/oneOf/"+c,r),O=h(p.$ref)&&!e.title?A.baseName(p.$ref):`${e.title||""}${e.const&&JSON.stringify(e.const)||""}`;return F({parser:n,schemaOrRef:{...e,title:O,allOf:[{...P,oneOf:void 0,anyOf:void 0}],discriminator:s.allOf?void 0:e.discriminator},pointer:p.$ref||l+"/oneOf/"+c,options:f,baseRefsStack:r,deps:{...m,parentFieldFullPath:m.parentFieldFullPath?m.parentFieldFullPath+"&oneOf="+c:"&oneOf="+c.toString()}})}),y=[...new Set(a.map(p=>{let c=p.typePrefix+(p.title&&!f.hideSchemaTitles?`${p.title} (${p.displayType})`:p.displayType);return c.indexOf(" or ")>-1&&(c=`(${c})`),c}))].join(" or ");return{oneOf:a,displayType:y}}function _({schema:i,parser:n,pointer:u,options:l,refsStack:P,deps:f}){const{if:m,else:a={},then:y={},...p}=i;return{oneOf:[{allOf:[p,y,m],title:m&&m["x-displayName"]||m?.title||"case 1"},{allOf:[p,a],title:a&&a["x-displayName"]||a?.title||"case 2"}].map((e,O)=>F({parser:n,schemaOrRef:{...e},pointer:u+"/oneOf/"+O,options:l,baseRefsStack:P,deps:{...f,parentFieldFullPath:f.parentFieldFullPath?f.parentFieldFullPath+"&oneOf="+O:"&oneOf="+O.toString()}})),oneOfType:"One of"}}function k(i,n,u){return i||(console.warn(`Field "${n}" is invalid, skipping.
2
+ Field must be an object but got ${typeof i} at "${u}"`),{})}function K(i,n,u,l,P,f){let m=n.properties||($(n,"array")?n.prefixItems||n.items:void 0)||{};const a=n.patternProperties||{},y=n.additionalProperties||n.unevaluatedProperties,p=n.prefixItems?n.items:n.additionalItems,c=n.default||{};let s=Object.keys(m).map(r=>{const e=k(m[r],r,u),O=n.required===void 0?!1:n.required.indexOf(r)>-1;return T(i,{name:n.properties?r:`[${r}]`,required:O,schema:{...e,example:n.example?.[r]||e.example,default:e.default===void 0&&c?c[r]:e.default}},u+"/properties/"+r,l,f,P,A.join(n.absolutePointer||"",["properties",r]))});return l.sortRequiredPropsFirst&&(s=J(s,n.required)),s.push(...Object.keys(a).map(r=>{const e=k(a[r],r,u);return T(i,{name:r,required:!1,schema:e,kind:"patternProperties"},`${u}/patternProperties/${r}`,l,f,P)})),(I(y)||y===!0)&&s.push(T(i,{name:(I(y)&&y["x-additionalPropertiesName"]||"property name").concat("*"),required:!1,schema:y===!0?{}:y,kind:"additionalProperties"},u+"/additionalProperties",l,f,P,A.join(n.absolutePointer||"",["additionalProperties"]))),s.push(...Y({parser:i,schema:p,fieldsCount:s.length,$ref:u,options:l,refsStack:P,deps:f})),L(s)}function Y({parser:i,schema:n=!1,fieldsCount:u,$ref:l,options:P,refsStack:f,deps:m}){return typeof n=="boolean"?n?[T(i,{name:`[${u}...]`,schema:{},kind:"additionalItems"},`${l}/additionalItems`,P,m,f)]:[]:Array.isArray(n)?[...n.map((a,y)=>T(i,{name:`[${u+y}]`,schema:a,kind:"additionalItems"},`${l}/additionalItems/${y}`,P,m,f))]:I(n)?[T(i,{name:`[${u}...]`,schema:n,kind:"additionalItems"},`${l}/additionalItems`,P,m,f)]:[]}function R(i){return i.discriminator||i["x-discriminator"]}function $(i,n){return i.type===n||Array.isArray(i.type)&&i.type.includes(n)}function v(i){return!!(Array.isArray(i.items)||Array.isArray(i.prefixItems))}export{F as getSchema};
@@ -155,6 +155,7 @@ export type OperationModel = {
155
155
  extensions: GenericObject;
156
156
  isCallback: boolean;
157
157
  isWebhook: boolean;
158
+ isAdditionalOperation: boolean;
158
159
  isEvent: boolean;
159
160
  callbackId: string;
160
161
  requestBody?: RequestBodyModel;
@@ -186,6 +187,7 @@ export type GroupModel = {
186
187
  isSchema?: boolean;
187
188
  type: MenuItemGroupType;
188
189
  deprecated?: boolean;
190
+ isAdditionalOperation?: boolean;
189
191
  badges?: OpenAPIXBadges[];
190
192
  items: ContentItemModel[];
191
193
  ast?: Node[];
@@ -195,6 +197,7 @@ export type GroupModel = {
195
197
  depth: number;
196
198
  level: number;
197
199
  [REDOCLY_TEAMS_RBAC]?: Record<string, string>;
200
+ keywords?: unknown;
198
201
  };
199
202
  export type OperationMenuItem = {
200
203
  id: string;
@@ -209,6 +212,7 @@ export type OperationMenuItem = {
209
212
  httpVerb: string;
210
213
  path: string;
211
214
  isWebhook: boolean;
215
+ isAdditionalOperation: boolean;
212
216
  operationId?: string;
213
217
  badges?: OpenAPIXBadges[];
214
218
  [REDOCLY_TEAMS_RBAC]?: Record<string, string>;
@@ -245,6 +249,7 @@ export type SchemaModel = {
245
249
  oneOf?: SchemaModel[];
246
250
  oneOfType: string;
247
251
  discriminatorProp?: string;
252
+ isDefaultMapping?: boolean;
248
253
  rawSchema: OpenAPISchema;
249
254
  schema: MergedOpenAPISchema;
250
255
  extensions?: GenericObject;
@@ -1 +1 @@
1
- import{IS_BROWSER as q,isObject as S,isString as E,isUndefined as o}from"@redocly/theme/core/openapi";import{tryDecodeURIComponent as B,getDefinitionName as v}from"../utils/index.js";import{JsonPointer as x}from"../utils/JsonPointer.js";import{normalizeOptions as W}from"./config-options/normalizeOptions.js";function A(m,e){return e&&m[m.length-1]!==e?[...m,e]:m}function R(m,e){return e?m.concat(e):m}class V{options;definitionUrl;definition;allowMergeRefs=!1;constructor(e,t,l=W({})){this.options=l,this.definition=Object.assign({},e),this.validate(e),this.definition=e,this.allowMergeRefs=e.openapi.startsWith("3.1");const n=q?window.location.href:"";E(t)&&(this.definitionUrl=new URL(t,n).href)}validate(e){if(o(e.openapi))throw new Error("Document must be valid OpenAPI 3.0.0 definition")}byRef=e=>{let t;if(this.definition){e.charAt(0)!=="#"&&(e="#"+e),e=B(e);try{t=x.get(this.definition,e)}catch{}return t||{}}};isRef(e){return e?(e=e,e.$ref!==void 0&&e.$ref!==null):!1}deref(e,t=[],l=!1,n=0){const i=e?.["x-refsStack"];if(t=R(t,i),n>5)return{resolved:Object.assign({},e,{"x-complex":!0}),refsStack:t};if(this.isRef(e)){const r=v(e.$ref);if(r&&this.options.ignoreNamedSchemas.has(r))return{resolved:{type:"object",title:r},refsStack:t};let s=this.byRef(e.$ref);if(!s)throw new Error(`Failed to resolve $ref "${e.$ref}"`);return t.includes(e.$ref)?s=Object.assign({},s,{"x-circular-ref":!0}):this.isRef(s)&&(s=this.deref(s,t,l,n).resolved),this.allowMergeRefs&&(s=this.mergeRefs(e,s,l)),{resolved:s,refsStack:A(t,e.$ref)}}return{resolved:e,refsStack:R(t,i)}}mergeRefs(e,t,l){const{$ref:n,...i}=e,r=Object.keys(i);if(r.length===0)return{...t,$ref:n};if(l&&r.some(s=>!["description","title","externalDocs","x-refsStack","x-parentRefs","readOnly","writeOnly","x-complex"].includes(s))){const{description:s,title:p,readOnly:u,writeOnly:d,...O}=i;return{allOf:[{description:s,title:p,readOnly:u,writeOnly:d},t,O]}}else return{...t,...i}}mergeAllOf(e,t,l,n="",i=0){if(e["x-circular-ref"])return e;if(e=this.hoistOneOfs(e),e.allOf===void 0)return{absolutePointer:n,...e};let r={...e,"x-parentRefs":[],absolutePointer:x.join(n,["allOf"]),allOf:void 0,title:i===0?e.title||v(t):e.title};!o(r.properties)&&S(r.properties)&&(r.properties={...r.properties}),!o(r.items)&&S(r.items)&&(r.items={...r.items});const s=e.allOf.map((p,u)=>{const{resolved:d,refsStack:O}=this.deref(p,l,!0,i),f=p.$ref,y=f||x.join(n,[String(u)]);if(d["x-complex"])return{$ref:f,refsStack:A(O,f),schema:{"x-complex":!0},absolutePointer:y};const a=this.mergeAllOf(d,f,O,y,i+1);if(!(a["x-circular-ref"]&&a.allOf))return f&&r["x-parentRefs"]?.push(...a["x-parentRefs"]||[],f),{$ref:f,refsStack:A(O,f),schema:a,absolutePointer:y}}).filter(Boolean);for(const[p,{schema:u,refsStack:d,absolutePointer:O}]of s.entries()){const{type:f,enum:y,properties:a,items:b,required:w,title:I,description:D,readOnly:C,writeOnly:M,oneOf:$,anyOf:k,"x-circular-ref":g,"x-complex":P,...N}=u||{};if(!(r.type!==f&&!o(r.type)&&!o(f)&&!i)){if(o(f)||(Array.isArray(f)&&Array.isArray(r.type)?r.type=[...f,...r.type]:r.type=f),o(y)||(Array.isArray(y)&&Array.isArray(r.enum)?r.enum=Array.from(new Set([...y,...r.enum])):r.enum=y),!o(a)&&S(a)){r.properties=r.properties||{};for(const c in a){const h=R(d,a[c]?.["x-refsStack"]);if(!r.properties[c])r.properties[c]={...a[c],absolutePointer:x.join(O,["properties",c]),"x-refsStack":h};else if(!g){const U=this.mergeAllOf({allOf:[r.properties[c],a[c]],"x-refsStack":h},t+"/properties/"+c,h,x.join(O,["allOf",String(p),"properties",c]),i+1);r.properties[c]=U}}}if(!o(b)&&!g&&!P){const c=typeof r.items=="boolean"?{}:Object.assign({},r.items),h=typeof u.items=="boolean"?{}:Object.assign({},u.items);r.items=this.mergeAllOf({allOf:[c,h]},t+"/items",d,"",i+1)}o($)||(r.oneOf=$),o(k)||(r.anyOf=k),Array.isArray(w)&&(r.required=[...r.required||[],...w]),r={...r,title:r.title||I,description:r.description||D,readOnly:o(r.readOnly)?C:r.readOnly,writeOnly:o(r.writeOnly)?M:r.writeOnly,"x-circular-ref":r["x-circular-ref"]||g,"x-complex":r["x-complex"]||P,...N}}}return r}findDerived(e){const t={},l=this.definition.components&&this.definition.components.schemas||{};for(const n in l){const{resolved:i}=this.deref(l[n]);!o(i.allOf)&&i.allOf.find(r=>!o(r.$ref)&&e.indexOf(r.$ref)>-1)&&(t["#/components/schemas/"+n]=[i["x-discriminator-value"]||n])}return t}hoistOneOfs(e){if(o(e.allOf))return e;const{allOf:t,...l}=e;for(let n=0;n<t.length;n++){const{oneOf:i,...r}=t[n];if(i&&Array.isArray(i)){const s=t.slice(0,n),p=t.slice(n+1),u=Object.keys(r).length>0?[r]:[];return{...l,oneOf:i.map(d=>({allOf:[...s,...u,d,...p]}))}}}return e}}export{V as OpenAPIParser,R as concatRefStacks,A as pushRef};
1
+ import{IS_BROWSER as q,isObject as A,isString as E,isUndefined as o}from"@redocly/theme/core/openapi";import{tryDecodeURIComponent as B,getDefinitionName as v}from"../utils/index.js";import{JsonPointer as x}from"../utils/JsonPointer.js";import{normalizeOptions as W}from"./config-options/normalizeOptions.js";function S(m,e){return e&&m[m.length-1]!==e?[...m,e]:m}function R(m,e){return e?m.concat(e):m}class V{options;definitionUrl;definition;allowMergeRefs=!1;constructor(e,t,l=W({})){this.options=l,this.definition=Object.assign({},e),this.validate(e),this.definition=e,this.allowMergeRefs=e.openapi.startsWith("3.1");const n=q?window.location.href:"";E(t)&&(this.definitionUrl=new URL(t,n).href)}validate(e){if(o(e.openapi))throw new Error("Document must be valid OpenAPI 3.0.0 definition")}byRef=e=>{let t;if(this.definition){e.charAt(0)!=="#"&&(e="#"+e),e=B(e);try{t=x.get(this.definition,e)}catch{}return t||{}}};isRef(e){return e?(e=e,e.$ref!==void 0&&e.$ref!==null):!1}deref(e,t=[],l=!1,n=0){const i=e?.["x-refsStack"];if(t=R(t,i),n>5)return{resolved:Object.assign({},e,{"x-complex":!0}),refsStack:t};if(this.isRef(e)){const r=v(e.$ref);if(r&&this.options.ignoreNamedSchemas.has(r))return{resolved:{type:"object",title:r},refsStack:t};let s=this.byRef(e.$ref);if(!s)throw new Error(`Failed to resolve $ref "${e.$ref}"`);return t.includes(e.$ref)?s=Object.assign({},s,{"x-circular-ref":!0}):this.isRef(s)&&(s=this.deref(s,t,l,n).resolved),this.allowMergeRefs&&(s=this.mergeRefs(e,s,l)),{resolved:s,refsStack:s.isPureRef?t:S(t,e.$ref)}}return{resolved:e,refsStack:R(t,i)}}mergeRefs(e,t,l){const{$ref:n,...i}=e,r=Object.keys(i);if(r.length===0)return{...t,$ref:n,isPureRef:!0};if(l&&r.some(s=>!["description","title","externalDocs","x-refsStack","x-parentRefs","readOnly","writeOnly","x-complex"].includes(s))){const{description:s,title:p,readOnly:u,writeOnly:d,...O}=i;return{allOf:[{description:s,title:p,readOnly:u,writeOnly:d},t,O]}}else return{...t,...i}}mergeAllOf(e,t,l,n="",i=0){if(e["x-circular-ref"])return e;if(e=this.hoistOneOfs(e),e.allOf===void 0)return{absolutePointer:n,...e};let r={...e,"x-parentRefs":[],absolutePointer:x.join(n,["allOf"]),allOf:void 0,title:i===0?e.title||v(t):e.title};!o(r.properties)&&A(r.properties)&&(r.properties={...r.properties}),!o(r.items)&&A(r.items)&&(r.items={...r.items});const s=e.allOf.map((p,u)=>{const{resolved:d,refsStack:O}=this.deref(p,l,!0,i),f=p.$ref,y=f||x.join(n,[String(u)]);if(d["x-complex"])return{$ref:f,refsStack:S(O,f),schema:{"x-complex":!0},absolutePointer:y};const a=this.mergeAllOf(d,f,O,y,i+1);if(!(a["x-circular-ref"]&&a.allOf))return f&&r["x-parentRefs"]?.push(...a["x-parentRefs"]||[],f),{$ref:f,refsStack:S(O,f),schema:a,absolutePointer:y}}).filter(Boolean);for(const[p,{schema:u,refsStack:d,absolutePointer:O}]of s.entries()){const{type:f,enum:y,properties:a,items:I,required:w,title:b,description:D,readOnly:C,writeOnly:M,oneOf:$,anyOf:P,"x-circular-ref":g,"x-complex":k,...N}=u||{};if(!(r.type!==f&&!o(r.type)&&!o(f)&&!i)){if(o(f)||(Array.isArray(f)&&Array.isArray(r.type)?r.type=[...f,...r.type]:r.type=f),o(y)||(Array.isArray(y)&&Array.isArray(r.enum)?r.enum=Array.from(new Set([...y,...r.enum])):r.enum=y),!o(a)&&A(a)){r.properties=r.properties||{};for(const c in a){const h=R(d,a[c]?.["x-refsStack"]);if(!r.properties[c])r.properties[c]={...a[c],absolutePointer:x.join(O,["properties",c]),"x-refsStack":h};else if(!g){const U=this.mergeAllOf({allOf:[r.properties[c],a[c]],"x-refsStack":h},t+"/properties/"+c,h,x.join(O,["allOf",String(p),"properties",c]),i+1);r.properties[c]=U}}}if(!o(I)&&!g&&!k){const c=typeof r.items=="boolean"?{}:Object.assign({},r.items),h=typeof u.items=="boolean"?{}:Object.assign({},u.items);r.items=this.mergeAllOf({allOf:[c,h]},t+"/items",d,"",i+1)}o($)||(r.oneOf=$),o(P)||(r.anyOf=P),Array.isArray(w)&&(r.required=[...r.required||[],...w]),r={...r,title:r.title||b,description:r.description||D,readOnly:o(r.readOnly)?C:r.readOnly,writeOnly:o(r.writeOnly)?M:r.writeOnly,"x-circular-ref":r["x-circular-ref"]||g,"x-complex":r["x-complex"]||k,...N}}}return r}findDerived(e){const t={},l=this.definition.components&&this.definition.components.schemas||{};for(const n in l){const{resolved:i}=this.deref(l[n]);!o(i.allOf)&&i.allOf.find(r=>!o(r.$ref)&&e.indexOf(r.$ref)>-1)&&(t["#/components/schemas/"+n]=[i["x-discriminator-value"]||n])}return t}hoistOneOfs(e){if(o(e.allOf))return e;const{allOf:t,...l}=e;for(let n=0;n<t.length;n++){const{oneOf:i,...r}=t[n];if(i&&Array.isArray(i)){const s=t.slice(0,n),p=t.slice(n+1),u=Object.keys(r).length>0?[r]:[];return{...l,oneOf:i.map(d=>({allOf:[...s,...u,d,...p]}))}}}return e}}export{V as OpenAPIParser,R as concatRefStacks,S as pushRef};
@@ -1 +1 @@
1
- import{getTagGroupsItems as d,getTagsItems as c,getTagsWithOperations as p}from"./tags.js";import{addMarkdownItems as g}from"./markdown.js";import{flattenByProp as h,getValueFromMdParsedExtension as l}from"../../utils/index.js";import{DEFAULT_WEBHOOKS_TAG_NAME as r}from"../../constants.js";function x(o,s){const{definition:e}=o,{schemaDefinitionsTagName:i}=s,a=[{id:"",name:e?.info?.["x-seo"]?.title||e?.info?.title||"Overview",href:"/",depth:1,level:1,type:"section",infoDefinition:e.info,items:[]}],t=[...e.tags||[]];if(t.some(n=>n.name===r)||t.push({name:r}),!t.find(n=>n?.name===i)&&i&&t.push({name:i}),e["x-mcp"])for(const n of["Tools","Resources","Prompts"])e["x-mcp"][n]&&(t.find(u=>u?.name===n)||t.push({name:n}));const m=p(o,t),f=e["x-tagGroups"];return a.push(...g(l(e.info,"description")||"",void 0,1)),f&&f.length>0?a.push(...d(o,void 0,f,m,s)):a.push(...c(o,m,void 0,void 0,s)),a}function O(o,s){const e=x(o,s),i=h(e||[],"items");return{contentItems:e,flatItems:i}}export{O as buildContentItems,x as buildMenuStructure};
1
+ import{getTagGroupsItems as d,getTagsItems as c,getTagsWithOperations as p}from"./tags.js";import{addMarkdownItems as g}from"./markdown.js";import{flattenByProp as h,getValueFromMdParsedExtension as l}from"../../utils/index.js";import{DEFAULT_WEBHOOKS_TAG_NAME as r}from"../../constants.js";function x(o,s){const{definition:e}=o,{schemaDefinitionsTagName:i}=s,a=[{id:"",name:e?.info?.["x-seo"]?.title||e?.info?.title||"Overview",href:"/",depth:1,level:1,type:"section",infoDefinition:e.info,items:[],keywords:e["x-keywords"]}],t=[...e.tags||[]];if(t.some(n=>n.name===r)||t.push({name:r}),!t.find(n=>n?.name===i)&&i&&t.push({name:i}),e["x-mcp"])for(const n of["Tools","Resources","Prompts"])e["x-mcp"][n]&&(t.find(u=>u?.name===n)||t.push({name:n}));const m=p(o,t),f=e["x-tagGroups"];return a.push(...g(l(e.info,"description")||"",void 0,1)),f&&f.length>0?a.push(...d(o,void 0,f,m,s)):a.push(...c(o,m,void 0,void 0,s)),a}function E(o,s){const e=x(o,s),i=h(e||[],"items");return{contentItems:e,flatItems:i}}export{E as buildContentItems,x as buildMenuStructure};
@@ -1 +1 @@
1
- import{REDOCLY_TEAMS_RBAC as r}from"@redocly/config";import{encodeBackSlashes as d,getOperationId as c,getOperationName as m}from"../../utils/index.js";function g(o,n,a){if(n.operations.length===0)return[];const p=[],s=[];for(const e of n.operations){const t=c(e,o),i={id:t,type:"operation",parent:o,operationDefinition:e,depth:a,name:m(e),httpVerb:e.httpVerb,path:e.pathName,items:[],isWebhook:e.isWebhook,operationId:e.operationId,badges:e["x-badges"]||[],href:h({id:t}),deprecated:!!e.deprecated,[r]:e[r]||o?.[r]};e.isWebhook?s.push(i):p.push(i)}return[...p.sort((e,t)=>Number(e.deprecated)-Number(t.deprecated)),...s.sort((e,t)=>Number(e.deprecated)-Number(t.deprecated))]}function h({id:o}){return d(`/${o}`.toLowerCase())}export{h as getHref,g as getOperationsItems};
1
+ import{REDOCLY_TEAMS_RBAC as r}from"@redocly/config";import{encodeBackSlashes as d,getOperationId as c,getOperationName as m}from"../../utils/index.js";function N(o,i,s){if(i.operations.length===0)return[];const n=[],a=[];for(const e of i.operations){const t=c(e,o),p={id:t,type:"operation",parent:o,operationDefinition:e,depth:s,name:m(e),httpVerb:e.httpVerb,path:e.pathName,items:[],isAdditionalOperation:e.isAdditionalOperation,isWebhook:e.isWebhook,operationId:e.operationId,badges:e["x-badges"]||[],href:b({id:t}),deprecated:!!e.deprecated,[r]:e[r]||o?.[r]};e.isWebhook?a.push(p):n.push(p)}return[...n.sort((e,t)=>Number(e.deprecated)-Number(t.deprecated)||Number(e.isAdditionalOperation)-Number(t.isAdditionalOperation)),...a.sort((e,t)=>Number(e.deprecated)-Number(t.deprecated))]}function b({id:o}){return d(`/${o}`.toLowerCase())}export{b as getHref,N as getOperationsItems};
@@ -25,4 +25,5 @@ export declare function getTagGroupsItems(parser: OpenAPIParser, parent: GroupMo
25
25
  * collects tags and maps each tag to list of operations belonging to this tag
26
26
  */
27
27
  export declare function getTagsWithOperations(parser: OpenAPIParser, explicitTags: OpenAPITag[]): TagsInfoMap;
28
+ export declare function processOperation(parser: OpenAPIParser, operationName: string, operationInfo: any, pathName: string, path: any, tags: TagsInfoMap, isWebhook?: boolean, isAdditionalOperation?: boolean): void;
28
29
  export declare function capitalize(input: string): string;
@@ -1,4 +1,4 @@
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}\`
1
+ import{getTagOrGroup as d}from"../../models/group.js";import{DEFAULT_WEBHOOKS_TAG_NAME as g,GROUP_DEPTH as h}from"../../constants.js";import{getValueFromMdParsedExtension as T,isOperationName as S,JsonPointer as w,safeSlugify as k}from"../../utils/index.js";import{getOperationsItems as x}from"./operation.js";import{addMarkdownItems as O}from"./markdown.js";import{joinWithSeparator as b}from"../history/helpers.js";const y=["tools","resources","prompts"];function v(r,f,n,o,s){let t;if(o===void 0?t=Object.keys(f):t=o.tags,!Array.isArray(t))return console.warn("Unexpected values of tags. Check tags or x-tagGroups in your definition."),[];const a=t.map(e=>f[e]?(f[e].used=!0,f[e]):(console.warn(`Non-existing tag "${e}" is added to the group "${o?.name}"`),null)),i=[];for(const e of a){if(!e)continue;const c=d("tag",e,n);if(c.depth=h+1,e.name===""){const m=[...O(T(e,"description")||"",c,c.depth+1),...x(void 0,e,c.depth+1)];i.push(...m);continue}const p=A({definition:r.definition,tag:e,parent:c,schemaDefinitionsTagName:s.schemaDefinitionsTagName}),l=E(r.definition,e,c);c.items=[...p,...l,...O(T(e,"description")||"",c,c.depth+1),...x(c,e,c.depth+1)],i.push(c)}return i.filter(({name:e,items:c})=>e!==g||c.length>0)}function I(r,f,n,o,s){const t=[];for(const a of n){const i=d("group",a,f);i.depth=h,i.items=v(r,o,i,a,s),t.push(i)}return t}function A({definition:r,tag:f,parent:n,schemaDefinitionsTagName:o}){const s=o?[o]:[];return Object.entries(r.components?.schemas||{}).map(([t,a])=>{if(!(a["x-tags"]||s).includes(f.name))return null;const e=d("schema",{name:t,"x-displayName":`${a.title||t}`,description:`{% schemaDefinition showWriteOnly="true" schemaRef="#/components/schemas/${t}" /%}`,isSchema:!0,level:2},n);return e.depth=n.depth+1,e}).filter(Boolean)}function E(r,f,n){const o=[];for(const s of y)if(r["x-mcp"]?.[s]){const t=P(s),a=[t];for(const i of r["x-mcp"]?.[s]||[])if((i.tags?.length?i.tags:a).includes(f.name)){const c=b(n.id,k(i.name)),p=s==="tools"?`Tool name: \`${i.name}\`
2
2
 
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};
3
+ `:"",m=d(s==="tools"?"tool":s==="resources"?"rsrc":"prompt",{name:i.name,"x-displayName":i.title||i.name,description:`${p}${i.description||""}
4
+ {% mcp${t.slice(0,-1)} name="${i.name}" id="${c}" /%}`,isSchema:!0,level:2},n);m.depth=n.depth+1,o.push(m)}}return o}function M(r,f){const{definition:n}=r,o={},s=n["x-webhooks"]||n.webhooks,t=n["x-mcp"];for(const a of f||[])o[a.name]={...a,operations:[]};return n.paths&&u(r,n.paths,o),s&&u(r,s,o,!0),t&&j(t,o),o}function j(r,f){for(const n of y)if(r[n])for(const o of r[n]){const s=o.tags&&o.tags.length?o.tags:[P(n)];for(const t of s){let a=f[t];a===void 0&&(a={name:t,operations:[],used:!0},f[t]=a)}}}function $(r,f,n,o,s,t,a,i){if(s.$ref){const{resolved:c}=r.deref(s);u(r,{[o]:c},t,a);return}let e=n?.tags;(!e||!e.length)&&(e=a?[g]:[""]);for(const c of e){let p=t[c];p===void 0&&(p={name:c,operations:[]},t[c]=p),!p["x-traitTag"]&&p.operations.push({...n,pathName:o,pointer:w.compile(["paths",o,f]),httpVerb:f,pathParameters:s.parameters||[],pathServers:s.servers,isWebhook:!!a,isAdditionalOperation:!!i,keywords:n["x-keywords"]})}}function u(r,f,n,o){for(const s of Object.keys(f||{})){const t=f[s],a=Object.keys(t).filter(S);for(const i of a){const e=t[i];$(r,i,e,s,t,n,o)}if(t.additionalOperations)for(const[i,e]of Object.entries(t.additionalOperations))$(r,i,e,s,t,n,o,!0)}}function P(r){return r.charAt(0).toUpperCase()+r.slice(1)}export{P as capitalize,I as getTagGroupsItems,v as getTagsItems,M as getTagsWithOperations,$ as processOperation};
@@ -29,6 +29,7 @@ export interface IMenuItem {
29
29
  items: IMenuItem[];
30
30
  parent?: IMenuItem;
31
31
  deprecated?: boolean;
32
+ isAdditionalOperation?: boolean;
32
33
  type: MenuItemType;
33
34
  isSchema?: boolean;
34
35
  httpVerb?: string;
@@ -50,7 +51,9 @@ export type ExtendedOpenAPIOperation = {
50
51
  pathParameters: Array<Referenced<OpenAPIParameter>>;
51
52
  pathServers: Array<OpenAPIServer> | undefined;
52
53
  isWebhook: boolean;
54
+ isAdditionalOperation: boolean;
53
55
  defaultSampleName?: string | false;
56
+ keywords?: unknown;
54
57
  } & OpenAPIOperation;
55
58
  export type TagsInfoMap = Record<string, TagInfo>;
56
59
  export interface TagGroup {
package/lib/standalone.js CHANGED
@@ -1 +1 @@
1
- import{jsx as i}from"react/jsx-runtime";import{createElement as p}from"react";import{createRoot as u,hydrateRoot as m}from"react-dom/client";import{querySelector as a}from"./utils/dom.js";import{RedoclyOpenAPIDocs as l}from"./components/RedoclyOpenAPIDocs/RedoclyOpenAPIDocs.js";import{RedoclyOpenAPIDocsStandalone as f}from"./components/RedoclyOpenAPIDocs/RedoclyOpenAPIDocsStandalone.js";import{setSecurityDetails as P,setSecurityDetailsVariants as V}from"./utils/security-details.js";import{setParameterValue as D}from"./utils/parameters.js";function d(t){const e={},o=t.attributes;for(let r=0;r<o.length;r++){const n=o[r];e[n.name]=n.value}return e}function E(t){const e=d(t),o={};for(const r in e){const n=r.replace(/-(.)/g,(c,s)=>s.toUpperCase());o[n]=e[r]}return o}function A(t,e=document.querySelector("redoc")){m(e,i(l,{store:t}),{onRecoverableError:(o,r)=>{o.message.includes("Minified React error #418")||console.error(o.message,r)}})}function _(t,e={},o=a("redoc")){if(o===null)throw new Error('"element" argument is not provided and <redoc> tag is not found on the page');const{router:r,...n}=e;let c,s;typeof t=="string"?c=t:typeof t=="object"&&(s=t),u(o).render(p(f,{definition:s,definitionUrl:c,options:{...n,...E(o)},router:r??"hash"},["Loading..."]))}const N=__REDOCLY_API_REFERENCE_VERSION__,v=__REDOCLY_API_REFERENCE_REVISION__;function R(){const t=a("redoc");if(!t)return;const e=t.getAttribute("spec-url");e&&_(e,{},t)}R();export{A as hydrate,_ as init,v as revision,D as setParameterValue,P as setSecurityDetails,V as setSecurityDetailsVariants,N as version};
1
+ import{jsx as i}from"react/jsx-runtime";import{createElement as p}from"react";import{createRoot as u,hydrateRoot as m}from"react-dom/client";import{querySelector as a}from"./utils/dom.js";import{RedoclyOpenAPIDocs as l}from"./components/RedoclyOpenAPIDocs/RedoclyOpenAPIDocs.js";import{RedoclyOpenAPIDocsStandalone as f}from"./components/RedoclyOpenAPIDocs/RedoclyOpenAPIDocsStandalone.js";import{setSecurityDetails as P,setSecurityDetailsVariants as V}from"./utils/security-details.js";import{setParameterValue as D}from"./utils/parameters.js";function d(t){const e={},o=t.attributes;for(let r=0;r<o.length;r++){const n=o[r];e[n.name]=n.value}return e}function E(t){const e=d(t),o={};for(const r in e){const n=r.replace(/-(.)/g,(c,s)=>s.toUpperCase());o[n]=e[r]}return o}function A(t,e=document.querySelector("redoc")){m(e,i(l,{store:t}),{onRecoverableError:(o,r)=>{o.message.includes("Minified React error #418")||console.error(o.message,r)}})}function _(t,e={},o=a("redoc")){if(o===null)throw new Error('"element" argument is not provided and <redoc> tag is not found on the page');const{router:r,...n}={...e,...E(o)};let c,s;typeof t=="string"?c=t:typeof t=="object"&&(s=t),u(o).render(p(f,{definition:s,definitionUrl:c,options:n,router:r??"hash"},["Loading..."]))}const N=__REDOCLY_API_REFERENCE_VERSION__,v=__REDOCLY_API_REFERENCE_REVISION__;function R(){const t=a("redoc");if(!t)return;const e=t.getAttribute("spec-url");e&&_(e,{},t)}R();export{A as hydrate,_ as init,v as revision,D as setParameterValue,P as setSecurityDetails,V as setSecurityDetailsVariants,N as version};
@@ -19,6 +19,7 @@ export interface OpenAPIDefinition {
19
19
  }>;
20
20
  'x-feedback'?: any;
21
21
  'x-schema-catalog-link'?: string;
22
+ 'x-keywords'?: unknown;
22
23
  }
23
24
  export interface OpenAPIInfo extends ParsedDescriptionWithSummary {
24
25
  title: string;
@@ -87,6 +88,7 @@ export interface OpenAPIPath extends Partial<OpenAPIRef>, ParsedDescriptionWithS
87
88
  head?: OpenAPIOperation;
88
89
  patch?: OpenAPIOperation;
89
90
  trace?: OpenAPIOperation;
91
+ additionalOperations?: Record<string, OpenAPIOperation>;
90
92
  servers?: OpenAPIServer[];
91
93
  parameters?: Array<Referenced<OpenAPIParameter>>;
92
94
  }
@@ -214,6 +216,7 @@ export interface OpenAPIDiscriminator {
214
216
  [name: string]: string;
215
217
  };
216
218
  'x-explicitMappingOnly'?: boolean;
219
+ defaultMapping?: string;
217
220
  }
218
221
  export interface OpenAPIMediaType {
219
222
  schema?: Referenced<OpenAPISchema>;
@@ -368,6 +371,7 @@ export interface OpenAPITag extends ParsedDescription {
368
371
  externalDocs?: OpenAPIExternalDocumentation;
369
372
  'x-displayName'?: string;
370
373
  'x-rbac'?: Record<string, unknown>;
374
+ 'x-keywords'?: unknown;
371
375
  }
372
376
  export interface OpenAPIExternalDocumentation extends ParsedDescription {
373
377
  description?: string;
@@ -3,10 +3,10 @@ import type { ConfigureRequestValues, ConfigureServerRequestValues, SecurityDeta
3
3
  export declare function updateOperationWithRequestValues(operation: OperationModel, userDefinedRequestValues: ConfigureRequestValues | ConfigureServerRequestValues): void;
4
4
  export declare function updateParametersWithUserValues(param: FieldModel, userDefinedRequestValues?: ConfigureRequestValues | ConfigureServerRequestValues): void;
5
5
  export declare function updateRequestBodyWithUserValues(operation: OperationModel, userDefinedRequestValues: ConfigureRequestValues, serverUrl?: string): OperationModel | undefined;
6
- export declare function updateSecurityWithUserValues(operation: OperationModel, securityValues?: SecurityDetails, serverUrl?: string): void;
6
+ export declare function updateSecurityWithUserValues(operation: OperationModel, securityValues?: Record<string, SecurityDetails>, serverUrl?: string): void;
7
7
  export declare function updateOperationWithServerUserValues(operation: OperationModel, serverRequestValues: ConfigureServerRequestValues): void;
8
8
  export declare function updateEnvVariablesWithUserValues(operation: OperationModel, environmentValues?: Record<string, string>, serverUrl?: string): void;
9
9
  export declare function updateServerVariablesWithUserValues(operation: OperationModel, serverVariables?: Record<string, string>, serverUrl?: string): void;
10
10
  export declare function isDirectRequestValues(value: any): value is ConfigureRequestValues;
11
11
  export declare function updateObjectProperties(original: any, updates: any): any;
12
- export declare function createSecurityUpdates(scheme: any, securityValues: SecurityDetails): SecurityCredentials;
12
+ export declare function createSecurityUpdates(scheme: any, securityValues: Record<string, SecurityDetails>): SecurityCredentials;
@@ -1 +1 @@
1
- import{isObject as V}from"@redocly/theme/core/openapi";function p(e,t){Object.keys(t).length!==0&&(y(t)?(b(e,t),h(e,t.security),d(e,t.envVariables),v(e,t.serverVariables)):j(e,t))}function O(e,t){if(!t)return;const{in:r,name:s}=e;if(y(t)){const a=t,c={header:a.headers,query:a.query,path:a.path,cookie:a.cookie};r&&c[r]?.[s]&&(e.example=c[r][s])}else Object.entries(t).forEach(([a,c])=>{const f=c;if(!f)return;const n={header:f.headers,query:f.query,path:f.path,cookie:f.cookie};r&&n[r]?.[s]&&(e.serverValues||(e.serverValues={}),e.serverValues[a]={example:n[r][s]})})}function b(e,t,r){if(!e.requestBody||!t?.body)return;const s=e.requestBody.content;if(!s?.mediaTypes)return;const a=(c,f)=>{c[f]&&Object.keys(c[f]).forEach(n=>{const u=c[f]?.[n]?.value;let l;if(V(u)?l=o(u,t.body):l=t.body,!!l)if(r){const i=c[f][n];i.serverValues||(i.serverValues={}),i.serverValues[r]={value:l,rawValue:l},c[f][n]={...i,mime:c.name}}else c[f][n]={value:l,rawValue:l,mime:c.name}})};for(const c of s.mediaTypes)a(c,"examples"),a(c,"formExamples");return e}function h(e,t,r){!t||!e.security.length||e.security.forEach(s=>{r?s.schemes.forEach(a=>{a.serverValues||(a.serverValues={});const c=k(a,t);a.serverValues[r]=c}):s.schemes.forEach(a=>{const c=k(a,t);Object.assign(a,c)})})}function j(e,t){e.servers.forEach(r=>{if(t[r.url]){const s=t[r.url];s&&(b(e,s,r.url),h(e,s.security,r.url),d(e,s.envVariables,r.url),v(e,s.serverVariables,r.url))}})}function d(e,t,r){!t||Object.keys(t).length===0||(e.envVariables||(e.envVariables={}),r?(e.envVariables.serverValues||(e.envVariables.serverValues={}),e.envVariables.serverValues[r]={...e.envVariables.serverValues[r],...t}):e.envVariables.values={...e.envVariables.values,...t})}function v(e,t,r){if(!(!t||Object.keys(t).length===0))if(r){const s=e.servers.find(a=>a.url===r);if(s){s.variables||(s.variables={});for(const[a,c]of Object.entries(t))s.variables[a]&&(s.variables[a].default=c)}}else e.servers.forEach(s=>{s.variables||(s.variables={});for(const[a,c]of Object.entries(t))s.variables[a]&&(s.variables[a].default=c)})}function y(e){return!e||typeof e!="object"?!1:"headers"in e||"body"in e||"query"in e||"path"in e||"cookie"in e||"security"in e||"envVariables"in e||"serverVariables"in e}function o(e,t){if(!e||typeof e!="object")return t;if(Array.isArray(e)&&Array.isArray(t)){if(e.length>0&&typeof e[0]=="object"&&e[0]!==null){const s=Object.keys(e[0]),a=t.filter(c=>typeof c!="object"||c===null?!1:s.some(f=>f in c)&&Object.keys(c).every(f=>s.includes(f)));return a.length>0?a:e}return t}const r=Array.isArray(e)?[...e]:{...e};for(const[s,a]of Object.entries(t))s in e&&(Array.isArray(e[s])||typeof a=="object"&&a!==null&&typeof e[s]=="object"?r[s]=o(e[s],a):r[s]=a);return r}function k(e,t){const r={"x-defaultAccessToken":t.token?.access_token,"x-defaultTokenType":t.token?.token_type||"Bearer","x-defaultClientId":t.client_id,"x-defaultClientSecret":t.client_secret,scopes:t.scopes||e.scopes};return e.type==="http"&&e.scheme==="basic"?(r["x-defaultUsername"]=t.username,r["x-defaultPassword"]=t.password,delete r["x-defaultAccessToken"],delete r["x-defaultTokenType"]):e.type==="oauth2"&&!t.token?.access_token&&(delete r["x-defaultAccessToken"],delete r["x-defaultTokenType"]),r}export{k as createSecurityUpdates,y as isDirectRequestValues,d as updateEnvVariablesWithUserValues,o as updateObjectProperties,p as updateOperationWithRequestValues,j as updateOperationWithServerUserValues,O as updateParametersWithUserValues,b as updateRequestBodyWithUserValues,h as updateSecurityWithUserValues,v as updateServerVariablesWithUserValues};
1
+ import{isObject as k}from"@redocly/theme/core/openapi";function p(e,r){Object.keys(r).length!==0&&(h(r)?(b(e,r),y(e,r.security),d(e,r.envVariables),v(e,r.serverVariables)):j(e,r))}function O(e,r){if(!r)return;const{in:s,name:t}=e;if(h(r)){const a=r,c={header:a.headers,query:a.query,path:a.path,cookie:a.cookie};s&&c[s]?.[t]&&(e.example=c[s][t])}else Object.entries(r).forEach(([a,c])=>{const f=c;if(!f)return;const n={header:f.headers,query:f.query,path:f.path,cookie:f.cookie};s&&n[s]?.[t]&&(e.serverValues||(e.serverValues={}),e.serverValues[a]={example:n[s][t]})})}function b(e,r,s){if(!e.requestBody||!r?.body)return;const t=e.requestBody.content;if(!t?.mediaTypes)return;const a=(c,f)=>{c[f]&&Object.keys(c[f]).forEach(n=>{const o=c[f]?.[n]?.value;let l;if(k(o)?l=u(o,r.body):l=r.body,!!l)if(s){const i=c[f][n];i.serverValues||(i.serverValues={}),i.serverValues[s]={value:l,rawValue:l},c[f][n]={...i,mime:c.name}}else c[f][n]={value:l,rawValue:l,mime:c.name}})};for(const c of t.mediaTypes)a(c,"examples"),a(c,"formExamples");return e}function y(e,r,s){!r||!e.security.length||e.security.forEach(t=>{s?t.schemes.forEach(a=>{a.serverValues||(a.serverValues={});const c=V(a,r);a.serverValues[s]=c}):t.schemes.forEach(a=>{const c=V(a,r);Object.assign(a,c)})})}function j(e,r){e.servers.forEach(s=>{if(r[s.url]){const t=r[s.url];t&&(b(e,t,s.url),y(e,t.security,s.url),d(e,t.envVariables,s.url),v(e,t.serverVariables,s.url))}})}function d(e,r,s){!r||Object.keys(r).length===0||(e.envVariables||(e.envVariables={}),s?(e.envVariables.serverValues||(e.envVariables.serverValues={}),e.envVariables.serverValues[s]={...e.envVariables.serverValues[s],...r}):e.envVariables.values={...e.envVariables.values,...r})}function v(e,r,s){if(!(!r||Object.keys(r).length===0))if(s){const t=e.servers.find(a=>a.url===s);if(t){t.variables||(t.variables={});for(const[a,c]of Object.entries(r))t.variables[a]&&(t.variables[a].default=c)}}else e.servers.forEach(t=>{t.variables||(t.variables={});for(const[a,c]of Object.entries(r))t.variables[a]&&(t.variables[a].default=c)})}function h(e){return!e||typeof e!="object"?!1:"headers"in e||"body"in e||"query"in e||"path"in e||"cookie"in e||"security"in e||"envVariables"in e||"serverVariables"in e}function u(e,r){if(!e||typeof e!="object")return r;if(Array.isArray(e)&&Array.isArray(r)){if(e.length>0&&typeof e[0]=="object"&&e[0]!==null){const t=Object.keys(e[0]),a=r.filter(c=>typeof c!="object"||c===null?!1:t.some(f=>f in c)&&Object.keys(c).every(f=>t.includes(f)));return a.length>0?a:e}return r}const s=Array.isArray(e)?[...e]:{...e};for(const[t,a]of Object.entries(r))t in e&&(Array.isArray(e[t])||typeof a=="object"&&a!==null&&typeof e[t]=="object"?s[t]=u(e[t],a):s[t]=a);return s}function V(e,r){const s=r?.[e.id]||r?.default||{},t={"x-defaultAccessToken":s.token?.access_token,"x-defaultTokenType":s.token?.token_type||"Bearer","x-defaultClientId":s.client_id,"x-defaultClientSecret":s.client_secret,scopes:s.scopes||e.scopes};return e.type==="http"&&e.scheme==="basic"?(t["x-defaultUsername"]=s.username,t["x-defaultPassword"]=s.password,delete t["x-defaultAccessToken"],delete t["x-defaultTokenType"]):e.type==="oauth2"&&!s.token?.access_token&&(delete t["x-defaultAccessToken"],delete t["x-defaultTokenType"]),t}export{V as createSecurityUpdates,h as isDirectRequestValues,d as updateEnvVariablesWithUserValues,u as updateObjectProperties,p as updateOperationWithRequestValues,j as updateOperationWithServerUserValues,O as updateParametersWithUserValues,b as updateRequestBodyWithUserValues,y as updateSecurityWithUserValues,v as updateServerVariablesWithUserValues};
@@ -1 +1 @@
1
- import{bundle as a,loadConfig as r}from"@redocly/openapi-core";import{combineUrls as s}from"@redocly/theme/core/openapi";import{convertSwagger2OpenAPI as c}from"./convertSwagger2OpenAPI.js";import{IS_BROWSER as t}from"./dom.js";import{REDOCLY_CONFIG_FILE as f}from"../constants.js";async function w(){const o=t?window.location.origin:typeof globalThis.process<"u"?globalThis.process.cwd():"";try{return(await r({configPath:s(o,f)}))?.resolvedConfig.openapi||{}}catch{return{}}}async function b(o){const n=await r(),e={config:n,base:t?window.location.origin:typeof globalThis.process<"u"?globalThis.process.cwd():""};t&&(n.resolve.http.customFetch=globalThis.fetch),typeof o=="object"&&o!==null?e.doc=d(o):e.ref=o;const{bundle:{parsed:i}}=await a(e);return i.swagger!==void 0?c(i):i}function d(o){return{source:{absoluteRef:""},parsed:o}}export{b as loadAndBundleDefinition,w as loadOpenapiConfig};
1
+ import{bundleOas as r,createEmptyRedoclyConfig as i}from"@redocly/openapi-core/lib/bundle-oas";import{convertSwagger2OpenAPI as c}from"./convertSwagger2OpenAPI.js";import{IS_BROWSER as a}from"./dom.js";async function l(){try{return(await i())?.resolvedConfig.openapi||{}}catch{return{}}}async function p(o){const t=await i(),e={config:t,base:a?window.location.origin:typeof globalThis.process<"u"?globalThis.process.cwd():""};a&&(t.resolve.http.customFetch=globalThis.fetch),typeof o=="object"&&o!==null?e.doc=s(o):e.ref=o;const{bundle:{parsed:n}}=await r(e);return n.swagger!==void 0?c(n):n}function s(o){return{source:{absoluteRef:""},parsed:o}}export{p as loadAndBundleDefinition,l as loadOpenapiConfig};
@@ -1,3 +1,3 @@
1
1
  export declare const MCP_SERVER_CAPABILITIES: string[];
2
2
  export declare const MCP_SERVER_EXPERIMENTAL_CAPABILITIES = "experimental";
3
- export declare const PAGE_ACTIONS_MCP: "mcp-json"[];
3
+ export declare const PAGE_ACTIONS_MCP: "docs-mcp-json"[];
package/lib/utils/mcp.js CHANGED
@@ -1 +1 @@
1
- const o=["tools","resources","prompts","logging","subscribe","completions"],s="experimental",e=["mcp-json"];export{o as MCP_SERVER_CAPABILITIES,s as MCP_SERVER_EXPERIMENTAL_CAPABILITIES,e as PAGE_ACTIONS_MCP};
1
+ const o=["tools","resources","prompts","logging","subscribe","completions"],s="experimental",e=["docs-mcp-json"];export{o as MCP_SERVER_CAPABILITIES,s as MCP_SERVER_EXPERIMENTAL_CAPABILITIES,e as PAGE_ACTIONS_MCP};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redocly/openapi-docs",
3
- "version": "3.15.0-rc.6",
3
+ "version": "3.16.0-custom.3",
4
4
  "description": "Redocly OpenAPI Docs",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -14,20 +14,20 @@
14
14
  "npm": ">=10.0.0"
15
15
  },
16
16
  "peerDependencies": {
17
- "@redocly/theme": ">=0.59.0-next.0",
17
+ "@redocly/theme": ">=0.60.0-custom.0",
18
18
  "react": "^19.1.0",
19
19
  "react-dom": "^19.1.0",
20
20
  "styled-components": "^4.1.1 || ^5.3.11 || ^6.0.0"
21
21
  },
22
22
  "dependencies": {
23
23
  "@markdoc/markdoc": "0.5.2",
24
- "@redocly/openapi-core": "2.5.0",
24
+ "@redocly/openapi-core": "2.11.1",
25
25
  "deepmerge": "^4.2.2",
26
26
  "dompurify": "3.2.7",
27
27
  "fast-deep-equal": "^3.1.3",
28
28
  "jotai": "^2.12.5",
29
29
  "json-pointer": "^0.6.2",
30
- "openapi-sampler": "^1.6.1",
30
+ "openapi-sampler": "1.6.2",
31
31
  "react-router-dom": "^6.21.1",
32
32
  "slugify": "^1.4.4",
33
33
  "stringify-object": "^3.3.0",
@@ -36,8 +36,8 @@
36
36
  "url-template": "^2.0.8",
37
37
  "util": "~0.12.5",
38
38
  "web-vitals": "3.3.1",
39
- "@redocly/config": "0.36.0-rc.1",
40
- "@redocly/replay": "0.18.0-rc.1"
39
+ "@redocly/replay": "0.19.0-custom.3",
40
+ "@redocly/config": "0.38.0-custom.0"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@jest/globals": "29.5.0",
@@ -49,11 +49,11 @@
49
49
  "@types/jest-when": "3.5.5",
50
50
  "@types/json-pointer": "1.0.34",
51
51
  "@types/json-schema": "^7.0.15",
52
- "@types/node": "22.15.3",
52
+ "@types/node": "22.18.13",
53
53
  "@types/react": "^19.1.4",
54
54
  "@types/react-dom": "^19.1.4",
55
55
  "@types/styled-components": "5.1.34",
56
- "@vitejs/plugin-react": "^4.2.1",
56
+ "@vitejs/plugin-react": "5.0.4",
57
57
  "esbuild": "0.25.10",
58
58
  "jest": "29.5.0",
59
59
  "jest-environment-jsdom": "29.5.0",
@@ -74,8 +74,8 @@
74
74
  "tsx": "4.20.3",
75
75
  "typescript": "5.9.3",
76
76
  "url": "~0.11.0",
77
- "vite": "6.3.6",
78
- "@redocly/theme": "0.59.0-rc.2"
77
+ "vite": "7.1.9",
78
+ "@redocly/theme": "0.60.0-custom.2"
79
79
  },
80
80
  "scripts": {
81
81
  "start": "npm run copy-highlight-hook && vite",
@@ -85,7 +85,10 @@
85
85
  "prepare:community-source": "npx tsx scripts/prepare-community-source.ts --",
86
86
  "prepare:community-source-only": "npm run prepare:community-source --ignore /src/* private-readme.md",
87
87
  "prepare:community-dependencies": "npx tsx scripts/prepare-community-dependencies.ts",
88
- "test": "npm run prepare:community-source && cd redoc && npm install && npm run lint && npm run unit && cd ../ && jest -w 2",
88
+ "apply:community-source": "npx tsx scripts/apply-changes-from-community-source.ts",
89
+ "test": "npm run prepare:community-source && npm run redoc:use-workspace && npm run test:redoc && npm run redoc:revert-workspace && jest -w 2",
90
+ "test:redoc": "cd redoc && pnpm install && npm run lint && npm run unit",
91
+ "unit": "jest -w 2",
89
92
  "test:update": "jest -u",
90
93
  "test:watch": "jest --watch",
91
94
  "test:coverage": "jest --coverage",
@@ -98,6 +101,8 @@
98
101
  "license:check": "npx license-checker --production --onlyAllow 'MIT;ISC;Apache-2.0;Apache;CC0-1.0;BSD;BSD-2-Clause;BSD-3-Clause;UNKNOWN' --summary",
99
102
  "precdn:serve": "mkdir -p playground/cdn-test/server-dist && cp -Rf dist/* playground/cdn-test/server-dist && cp -Rf playground/cdn-test/template-source/* playground/cdn-test/server-dist",
100
103
  "cdn-serve": "http-server playground/cdn-test/server-dist",
101
- "copy-highlight-hook": "cp -r ../portal/src/client/app/hooks/codeHighlight ./playground/hooks"
104
+ "copy-highlight-hook": "cp -r ../portal/src/client/app/hooks/codeHighlight ./playground/hooks",
105
+ "redoc:use-workspace": "node scripts/use-workspace-deps.js",
106
+ "redoc:revert-workspace": "node scripts/use-workspace-deps.js revert"
102
107
  }
103
108
  }
@@ -1,3 +0,0 @@
1
- export declare function ErrorPage({ description }: {
2
- description: string;
3
- }): import("react/jsx-runtime").JSX.Element;
@@ -1,25 +0,0 @@
1
- import{jsx as e,jsxs as r,Fragment as i}from"react/jsx-runtime";import t from"styled-components";import{GlobalStyle as a}from"@redocly/theme/core/openapi";function f({description:o}){return console.error(o),r(i,{children:[e(a,{}),r(n,{children:[e(l,{children:";("}),e(s,{children:"Something went wrong..."}),r(g,{children:["Please check the console for get more details or"," ",e("a",{target:"_blank",rel:"noopener noreferrer",href:"https://redocly.com/docs/redoc",children:"documentation"}),"."]})]})]})}const n=t.div`
2
- height: 100vh;
3
- max-width: var(--page-404-max-width);
4
- display: flex;
5
- flex-direction: column;
6
- justify-content: center;
7
- margin: var(--page-404-margin-vertical) var(--page-404-margin-horizontal);
8
- font-family: var(--page-404-font-family);
9
- gap: var(--page-404-gap);
10
- `,l=t.div`
11
- color: var(--page-404-status-text-color);
12
- font-size: var(--page-404-status-font-size);
13
- line-height: var(--page-404-status-line-height);
14
- font-weight: var(--page-404-status-font-weight);
15
- `,s=t.div`
16
- color: var(--page-404-title-text-color);
17
- font-size: var(--page-404-title-font-size);
18
- line-height: var(--page-404-title-line-height);
19
- font-weight: var(--page-404-title-font-weight);
20
- `,g=t.div`
21
- color: var(--page-404-description-text-color);
22
- font-size: var(--page-404-description-font-size);
23
- line-height: var(--page-404-description-line-height);
24
- font-weight: var(--page-404-description-font-weight);
25
- `;export{f as ErrorPage};