@redocly/realm 0.130.0-custom.22 → 0.130.0-custom.24
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{parseYaml as
|
|
1
|
+
import{parseYaml as i}from"@redocly/openapi-core";import{logger as a}from"../../../tools/notifiers/logger.js";import{validateNoDuplicateEntityKeys as s}from"../../openapi-docs/instances.js";const m=async(r,o)=>{let t;try{const e=await o.fs.read(r);if(!e)return null;t=i(e)}catch(e){return a.error(`Error reading file ${r}:`,e),null}const n=Array.isArray(t)?t:[t];return s(n,r),{path:r,entities:n}};export{m as extractFileContent};
|
|
@@ -28,6 +28,7 @@ export declare function patchOpenApiDefinitionWithVariables<T = unknown>(definit
|
|
|
28
28
|
* Checks both string values and object keys (template vars can appear in keys).
|
|
29
29
|
*/
|
|
30
30
|
export declare function hasTemplateVariables(value: unknown): boolean;
|
|
31
|
+
export declare function validateNoDuplicateEntityKeys(entities: unknown[], filePath: string): void;
|
|
31
32
|
export declare function buildInstanceMetadata(instance: OpenApiLinkedInstance, parentApiId: string): OpenApiInstanceMetadata;
|
|
32
33
|
export declare function applyInstanceToDefinition<T = unknown>(definition: T, instance: OpenApiLinkedInstance): T;
|
|
33
34
|
//# sourceMappingURL=instances.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import A from"path";import{VERSION_NOT_SPECIFIED as
|
|
1
|
+
import A from"path";import{VERSION_NOT_SPECIFIED as u}from"@redocly/theme/core/constants";import{CATALOG_ENTITIES_FILES_REGEX as L,ENTITY_SCHEMA_EXCLUDED_FOLDERS as C}from"../../constants/plugins/catalog-entities.js";import{REGISTRY_APIS_API_URL as h}from"../../constants/common.js";import{logger as l}from"../../tools/notifiers/logger.js";import{readEnvVariable as I}from"../../utils/envs/read-env-variable.js";import{resolveEntityVersion as E}from"../catalog-entities/utils/resolve-entity-version.js";import{parsePathVersions as S}from"../../../utils/path/parse-path-versions.js";const O=/\$\{([^}|]+)(?:\|([^}]*))?\}/g,D=/^\$\{([^}|]+)(?:\|([^}]*))?\}$/,P="${";async function W(){const e=new Map;if(!h)return e;const t=I("REGISTRY_API_KEY")||"",n=I("REDOCLY_LOCAL_DEV_TOKEN")||"";if(!t&&!n)return l.warnProd("Cannot fetch API registry entries for OpenAPI instances: authentication token is missing"),e;try{const r=`${h}?limit=6000&fields=id,contentPath`,i=t?{Authorization:`Bearer ${t}`}:{Cookie:`accessToken=${n}`},o=await fetch(r,{headers:i});if(o.status!==200)return l.warnProd(`Failed to fetch API registry entries for OpenAPI instances. API response status: ${o.status}. Request URL: ${r}`),e;const s=await o.json();for(const a of s.items||[]){if(!a?.id)continue;const c=a.contentPath;if(!c||typeof c!="string")continue;const f=d(c);f&&e.set(f,a.id)}}catch(r){const i=r instanceof Error?r.message:String(r);l.warnProd(`Failed to fetch API registry entries for OpenAPI instances: ${i}`)}return e}function Q(e,t){const n=e.definition.info?.["x-metadata"]?.apiId;if(typeof n=="string"&&n.trim())return n.trim();const r=new Set;for(const i of[e.relativePath,e.realRelativePath])for(const o of M(i))r.add(o);for(const i of r){const o=t.get(i);if(o)return o}}async function ee(e){const t=new Map,n=e.fs.scan(L).filter(({relativePath:r})=>v(r));for(const{relativePath:r}of n){let i;try{i=(await e.cache.load(r,"yaml")).data}catch(s){const a=s instanceof Error?s.message:String(s);e.logger.warn(`Failed to parse entity file ${r}: ${a}`);continue}const o=Array.isArray(i)?i:[i];B(o,r);for(const s of o){const a=s;if(!a||typeof a!="object")continue;const c=F(a);if(!c)continue;const f=typeof a.key=="string"?a.key.trim():"";if(!f)continue;const p=E(a.version,r);if(!p.success){e.logger.warn(`Skipping entity ${f} in ${r}: version "${p.fileVersion}" conflicts with folder version "${p.folderVersion}"`);continue}const k=p.version??u,g=K(a.relations);if(!g.length)continue;const R={key:f,title:typeof a.title=="string"?a.title:void 0,summary:typeof a.summary=="string"?a.summary:void 0,tags:Array.isArray(a.tags)?a.tags.filter(y=>typeof y=="string"):void 0,version:k,variables:c};for(const y of g){const T=t.get(y)||[],w=N([...T,R]);t.set(y,w)}}}return t}function te(e){const t=e.definition.info?.version,n=E(t,e.realRelativePath);return n.success?n.version??u:u}function ne(e,t){return e.filter(n=>z(n.version,t)).sort((n,r)=>{const i=n.title||n.key,o=r.title||r.key;return i.localeCompare(o)})}function j(e,t){return m(e,t)}function b(e){if(typeof e=="string")return e.includes(P);if(Array.isArray(e))return e.some(t=>b(t));if(e&&typeof e=="object"){for(const t of Object.keys(e))if(t.includes(P)||b(e[t]))return!0}return!1}function m(e,t){return typeof e=="string"?V(e,t):Array.isArray(e)?e.map(n=>m(n,t)):e&&typeof e=="object"?Object.entries(e).reduce((n,[r,i])=>{const o=V(r,t),s=typeof o=="string"?o:$(o);return n[s]=m(i,t),n},{}):e}function V(e,t){const n=e.match(D);if(n){const r=_(n[1]||"",t,n[2]);return r.found?r.value:e}return e.replace(O,(r,i,o)=>{const s=_(i,t,o);return s.found?$(s.value):r})}function _(e,t,n){const r=x(e);for(const s of r)if(Object.prototype.hasOwnProperty.call(t,s))return{found:!0,value:t[s]};const i=e.trim().toLowerCase(),o=Object.keys(t).find(s=>s.trim().toLowerCase()===i);return o?{found:!0,value:t[o]}:n!==void 0?{found:!0,value:n}:{found:!1,value:void 0}}function x(e){const t=e.trim(),n=t.replace(/_/g,"-").replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),r=t.replace(/-/g,"_").replace(/([a-z0-9])([A-Z])/g,"$1_$2").toLowerCase(),i=t.replace(/[-_]+([a-zA-Z0-9])/g,(o,s)=>s.toUpperCase());return Array.from(new Set([t,n,r,i]))}function $(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean"||typeof e=="bigint")return String(e);try{return JSON.stringify(e)}catch{return String(e)}}function M(e){const t=d(e),n=new Set;if(t){n.add(t);const i=d(A.posix.dirname(t));i&&n.add(i)}const r=S(e);if(r?.filePathInVersion){const i=d(r.filePathInVersion);if(i){n.add(i);const o=d(A.posix.dirname(i));o&&n.add(o)}}return Array.from(n)}function d(e){return e?e.replace(/^\/+/,"").replace(/\/+$/,"").trim():""}function F(e){if(!e.metadata||typeof e.metadata!="object")return;const t=e.metadata;if(!(!t.variables||typeof t.variables!="object"||Array.isArray(t.variables)))return t.variables}function K(e){return Array.isArray(e)?e.map(t=>t).filter(t=>t?.type==="implements"&&typeof t.key=="string").map(t=>t.key):[]}function z(e,t){return e===u||t===u?!0:e===t}function N(e){const t=new Map;for(const n of e)t.set(`${n.key}:${n.version}`,n);return Array.from(t.values())}function v(e){return!C.some(t=>e.includes(t))}function B(e,t){const n=new Map;for(const i of e){if(!i||typeof i!="object")continue;const o=i.key;if(typeof o!="string"||!o.trim())continue;const s=o.trim();n.set(s,(n.get(s)||0)+1)}const r=Array.from(n.entries()).filter(([,i])=>i>1).map(([i,o])=>`"${i}" (${o} times)`);if(r.length>0)throw new Error(`Duplicate entity keys in ${t}: ${r.join(", ")}. Each entity must have a unique key within a file.`)}function re(e,t){return{isInstance:!0,parentApiId:t,entityKey:e.key,entityTitle:e.title,entitySummary:e.summary,entityTags:e.tags,instanceVariables:e.variables}}function ie(e,t){const n=j(e,t.variables);return t.title&&n&&typeof n=="object"?{...n,info:{...n.info,title:t.title}}:n}export{ie as applyInstanceToDefinition,re as buildInstanceMetadata,W as fetchRegistryApiIdByPath,ne as filterInstancesForApiVersion,te as getResolvedApiVersion,b as hasTemplateVariables,ee as loadLinkedInstancesByApiId,j as patchOpenApiDefinitionWithVariables,Q as resolveApiIdForDefinition,B as validateNoDuplicateEntityKeys};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{writeFileSync as
|
|
2
|
-
Circular dependency chain: ${
|
|
3
|
-
`);for(const t of
|
|
1
|
+
import{writeFileSync as ot}from"node:fs";import*as u from"path";import{withoutHash as at}from"@redocly/theme/core/utils";import{DEFAULT_LOCALE_PLACEHOLDER as _,SIDEBAR_PREFIX as rt,CONFIG_FILE_NAME as K}from"../../../constants/common.js";import{CATALOG_OUTPUT_FILE_NAME as it}from"../../constants/common.js";import{findDeepFirst as B}from"../../../utils/tree/find-deep-first.js";import{isDefined as X}from"../../../utils/guards/is-defined.js";import{partition as st}from"../../../utils/array/partition.js";import{collectPropValueDeep as x}from"../../../utils/tree/collect-prop-value-deep.js";import{envConfig as nt}from"../../config/env-config.js";import{isLocalLink as lt}from"../../../utils/path/is-local-link.js";import{normalizeRouteSlug as Y}from"../../../utils/path/normalize-route-slug.js";import{slash as ct}from"../../../utils/path/slash.js";import{parsePathVersions as ft}from"../../../utils/path/parse-path-versions.js";import{reporter as A}from"../../tools/notifiers/reporter.js";import{logger as v}from"../../tools/notifiers/logger.js";import{sha1 as dt}from"../../utils/crypto/sha1.js";import{collectItemsLinkedToSidebars as ut,resolveItems as Z}from"../nav-utils.js";import{getExcludedFromLinkCheckerPatterns as gt,getSidebarReferences as mt,hasCircularDependency as pt}from"./utils.js";import{getLocaleFromRelativePath as St}from"../../fs/utils/get-locale-from-relative-path.js";import{isSystemRouteSlug as ht}from"../../utils/system-routes.js";import{ENTITIES_MAP_GLOBAL_DATA_KEY as yt}from"../../constants/plugins/catalog-entities.js";import{telemetryTraceStep as bt}from"../../../cli/telemetry/helpers/trace-step.js";import{OPENAPI_CUSTOM_FIELDS_SERVER_PROPS_GETTER_ID as J}from"../../constants/plugins/openapi-docs.js";const It=180,Pt=170,Ft=10;async function Yt({contentDir:c}){return{id:"sidebars",async afterRoutesCreated(o,f){v.info("Calculating sidebars..."),await bt("build.plugin.sidebars",async()=>{const{cache:y,fs:s}=f,P=o.getConfig(),C=new Map,D=new Set,M=[_,...s.localeFolders],G=o.getGlobalData()[yt]||{},U={};let T=s.scan(/sidebars.yaml$/).map(({relativePath:t})=>t).filter(t=>!Dt(P.ignore??[],t)&&t);const $=await mt(f,c,T),Q=st(T.filter(t=>!$.has(t)),t=>ft(t)?.versionFolderPath||t),O=gt(P),tt=await ut(P?.navbar,o,f,{navFile:K,excludedFromLinkCheckerPatterns:O});let E;const N=pt($);N&&Array.isArray(N)&&await A.panicOnBuildContentError(`Sidebar references have circular dependency. Please check your sidebar files.
|
|
2
|
+
Circular dependency chain: ${N.reverse().join(" -> ")}
|
|
3
|
+
`);for(const t of Q){const g=(await Promise.all(t.map(async i=>{const l=(await y.load(i,"yaml")).data;if(!Array.isArray(l)){await A.panicOnBuildContentErrorForRealFile('Invalid sidebar contents at %rp, items should be an array, got "%s"',i,s,i,typeof l);return}return{items:l,sidebarRelativePath:i,locale:St(i)}}))).filter(X),r=(await w(g))?.firstLink;E||(E=r)}const j=Object.entries(P?.catalogClassic??{});for(const t of M){for(const[a,m]of j)await W(a,m,t);const g={},r=new Set,i=o.getAllRoutesForLocale(t);for(const a of i)if(H(a)&&a.fsPath&&!r.has(a.fsPath)){r.add(a.fsPath);let n=u.posix.dirname(a.fsPath);const d=u.parse(n).root;do g[n]=(g[n]||0)+1,n=u.dirname(n);while(n&&n!="."&&d!=n)}const l=v.startTiming("Creating automatic sidebars...");for(const a of i){if(C.has(a.slug))continue;const m=H(a),n=u.dirname(a.fsPath),d=g[n]===1,p=Et(a.baseSlug||a.slug);m&&d?await w([{items:[{directory:n}],sidebarRelativePath:"sidebar.yaml_"+p,locale:t}]):a.getSidebar!==void 0&&await w([{items:[{page:a.fsPath}],sidebarRelativePath:"sidebar.yaml_"+p,locale:t}])}v.infoTime(l,"Creating automatic sidebars...");for(const[a,m]of j)await W(a,m,t,!0)}if(T.length===0)for(const t of M){v.verbose("Creating default sidebar");const g=t===_,r=`sidebars.yaml${g?"":"_"+t}`,i=g?"":`${s.localizationFolder}/${t}`,l=(await w([{items:[{directory:`./${i}`}],sidebarRelativePath:r,locale:t,ignoredRoutes:D}]))?.firstLink;E||(E=l)}if(!o.getRouteBySlug("/")&&!o.getConfig().redirects?.["/"]){const g=o.getAllRoutes().find(i=>!ht(i.slug)),r=E?E.link:g?.baseSlug??null;if(r){const i=at(r);o.addRedirect("/",{to:i,type:302}),v.info("Creating default redirect for index page => %s",i)}}const z=nt.REDOCLY_METADATA_OUTPUT_FOLDER;z&&(v.info("Writing catalog data..."),ot(u.join(z,it),JSON.stringify(U)));function H(t){return D.has(t.slug)||G[t.fsPath]}async function w(t){if(t.length===0)return;const r=(await Promise.all(t.map(async({items:d,locale:p,sidebarRelativePath:S,ignoredRoutes:L})=>{const e=await Z(d,u.dirname(u.join(c,S)),o,f,{locale:p,ignoredRoutes:L,navFile:S,excludedFromLinkCheckerPatterns:O});if(!e){await A.panicOnBuild("Failed to resolve sidebar configuration. Make sure %rp is valid",S);return}return e}))).flat().filter(X),i=x(r,"routeSlug"),l=t[0].sidebarRelativePath,a=q(l),m=new Set;for(const d of i){const p=o.getRouteBySlug(d)?.fsPath??"",S=G[p];S&&(Array.from(m).find(e=>e.key===S.key&&e.version===S.version)||m.add(S)),o.addRouteSharedData(d,"sidebar",a),C.set(Y(d),r)}const n=m.size===1?Array.from(m)[0]:void 0;return await o.createSharedData(a,{relatedNavbarItem:tt?.get(l),items:r,catalogEntity:n?{key:n.key,version:n.version}:void 0}),{firstLink:B(r,d=>!!d.link),resolved:r}}async function W(t,g,r,i=!1){const l=structuredClone(g);r&&r!==_&&l.items.forEach(e=>{e.directory=u.posix.join(s.localizationFolder||"",r,e.directory||"")});let a=await Z(l.items,c,o,f,{groupCustomSidebars:!0,locale:r,navFile:K,excludedFromLinkCheckerPatterns:O});if(!a){await A.panicOnBuild(`Failed to resolve catalog configuration. Make sure catalog ${t} has valid config`);return}const m=r===_?"":"/"+r.toLowerCase(),n=r===_?"":`-${r}`,d=Y(u.posix.join(m,l.slug));if(i)for(const e of a){const h=e.items?B(e.items,I=>!!I.routeSlug):e.metadata?.type==="catalog-item"?e:void 0;if(!h?.routeSlug)continue;const b=C.get(h.routeSlug);if(!b)continue;const R=o.getRouteBySlug(h.routeSlug);R&&!R.serverPropsGetterIds?.includes(J)&&(R.serverPropsGetterIds=[...R.serverPropsGetterIds||[],J]);const k=x(b,"routeSlug"),F="current-catalog-info-"+e.routeSlug+n,et={catalog:{label:l.title,titleTranslationKey:l.titleTranslationKey,link:d,icon:l?.icon},item:{label:e.metadata?.title,link:e.link,icon:e.icon}};await o.createSharedData(F,et);for(const I of k)o.addRouteSharedData(I,"current-catalog-info",F),D.add(I);const V=B(b,I=>!!I.link&&!I.external&<(I.link)&&(!e.version||I.version===e.version));V&&(e.sidebar=[{...V,items:void 0}])}const p={},S=new Set;for(const e of a){if(!(e.routeSlug||e.sidebar?.[0]?.routeSlug)||!e.fsPath||S.has(e.fsPath))continue;S.add(e.fsPath);const b=u.dirname(e.fsPath);p[b]=(p[b]||0)+1}if(i){const e=await o.createSharedData("catalog-"+t+n,a.flatMap(h=>{const b=u.dirname(h.fsPath??""),R=p[b]===1,k=F=>({...F,fsPath:R?b:F.fsPath??""});return h.type==="group"&&h.items?.every(F=>F.type==="group")?(h.items||[]).map(k):k(h)}));o.addRouteSharedData(d,"catalog",e),Ct(r,a,U,p)}const L=x(a,"routeSlug");for(const e of L)D.add(e)}})}}}function Ct(c,o,f,y){if(c===_)for(const s of o){const P=s.routeSlug||s.sidebar?.[0]?.routeSlug;if(!P||!s.fsPath)continue;const C=u.dirname(s.fsPath),D=y[C]===1;f[P]={link:s.link,rootFileFsPath:s.fsPath,fsPath:D?C:s.fsPath,metadata:s.metadata||{},title:s.metadata?.title||s.label||"Untitled",version:s.version||"latest"}}}function q(c){return rt+ct(c)}async function Zt(c,o,f){const y=u.posix.join(u.dirname(c),o);return await f.exists(y)?q(y):(await A.panicOnBuildContentErrorForRealFile("File %rp: Failed to create relative path for sidebars.yaml using %s",c,f,c,o),null)}function Dt(c,o){const f=/\/?([a-zA-Z0-9-_]+\/)*sidebars?(-[a-zA-Z0-9-_]+)?\.yaml/;return c.filter(s=>f.test(s)).includes(o)}function Et(c){const o=c.replaceAll("/","_");if(o.length>It){const f=o.slice(0,Pt),y=dt(c).slice(0,Ft).replaceAll("/","_");return f+y}else return o}export{Dt as isSidebarIgnored,Zt as resolveSidebarId,Yt as sidebarsPlugin};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@redocly/realm",
|
|
3
|
-
"version": "0.130.0-custom.
|
|
3
|
+
"version": "0.130.0-custom.24",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -91,14 +91,14 @@
|
|
|
91
91
|
"xpath": "0.0.34",
|
|
92
92
|
"yaml-ast-parser": "0.0.43",
|
|
93
93
|
"zod": "^3.25.76",
|
|
94
|
-
"@redocly/
|
|
94
|
+
"@redocly/config": "0.43.0-custom.1",
|
|
95
|
+
"@redocly/openapi-docs": "3.18.0-custom.1",
|
|
96
|
+
"@redocly/portal-plugin-mock-server": "0.16.0-next.4",
|
|
95
97
|
"@redocly/asyncapi-docs": "1.7.0-custom.2",
|
|
96
98
|
"@redocly/portal-legacy-ui": "0.14.0-next.0",
|
|
97
|
-
"@redocly/
|
|
99
|
+
"@redocly/graphql-docs": "1.7.0-custom.2",
|
|
98
100
|
"@redocly/realm-asyncapi-sdk": "0.9.0-next.1",
|
|
99
|
-
"@redocly/theme": "0.62.0-custom.2"
|
|
100
|
-
"@redocly/config": "0.43.0-custom.1",
|
|
101
|
-
"@redocly/portal-plugin-mock-server": "0.16.0-next.4"
|
|
101
|
+
"@redocly/theme": "0.62.0-custom.2"
|
|
102
102
|
},
|
|
103
103
|
"peerDependencies": {
|
|
104
104
|
"react": "^19.2.4",
|