@redocly/realm 0.130.0-custom.22 → 0.130.0-custom.23

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 s}from"@redocly/openapi-core";import{logger as i}from"../../../tools/notifiers/logger.js";const l=async(t,n)=>{try{const r=await n.fs.read(t);if(!r)return null;const e=s(r),o=Array.isArray(e)?e:[e];return{path:t,entities:o}}catch(r){return i.error(`Error reading file ${t}:`,r),null}};export{l as extractFileContent};
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 d}from"@redocly/theme/core/constants";import{CATALOG_ENTITIES_FILES_REGEX as w,ENTITY_SCHEMA_EXCLUDED_FOLDERS as C}from"../../constants/plugins/catalog-entities.js";import{REGISTRY_APIS_API_URL as I}from"../../constants/common.js";import{logger as y}from"../../tools/notifiers/logger.js";import{readEnvVariable as h}from"../../utils/envs/read-env-variable.js";import{resolveEntityVersion as E}from"../catalog-entities/utils/resolve-entity-version.js";import{parsePathVersions as S}from"../../../utils/path/parse-path-versions.js";const O=/\$\{([^}|]+)(?:\|([^}]*))?\}/g,D=/^\$\{([^}|]+)(?:\|([^}]*))?\}$/,P="${";async function H(){const e=new Map;if(!I)return e;const t=h("REGISTRY_API_KEY")||"",n=h("REDOCLY_LOCAL_DEV_TOKEN")||"";if(!t&&!n)return y.warnProd("Cannot fetch API registry entries for OpenAPI instances: authentication token is missing"),e;try{const r=`${I}?limit=6000&fields=id,contentPath`,i=t?{Authorization:`Bearer ${t}`}:{Cookie:`accessToken=${n}`},o=await fetch(r,{headers:i});if(o.status!==200)return y.warnProd(`Failed to fetch API registry entries for OpenAPI instances. API response status: ${o.status}. Request URL: ${r}`),e;const 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=u(c);f&&e.set(f,a.id)}}catch(r){const i=r instanceof Error?r.message:String(r);y.warnProd(`Failed to fetch API registry entries for OpenAPI instances: ${i}`)}return e}function W(e,t){const n=e.definition.info?.["x-metadata"]?.apiId;if(typeof n=="string"&&n.trim())return n.trim();const r=new Set;for(const i of[e.relativePath,e.realRelativePath])for(const o of F(i))r.add(o);for(const i of r){const o=t.get(i);if(o)return o}}async function Q(e){const t=new Map,n=e.fs.scan(w).filter(({relativePath:r})=>N(r));for(const{relativePath:r}of n){let i;try{i=(await e.cache.load(r,"yaml")).data}catch(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];for(const s of o){const a=s;if(!a||typeof a!="object")continue;const c=M(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 T=p.version??d,g=z(a.relations);if(!g.length)continue;const $={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(l=>typeof l=="string"):void 0,version:T,variables:c};for(const l of g){const k=t.get(l)||[],L=K([...k,$]);t.set(l,L)}}}return t}function ee(e){const t=e.definition.info?.version,n=E(t,e.realRelativePath);return n.success?n.version??d:d}function te(e,t){return e.filter(n=>B(n.version,t)).sort((n,r)=>{const i=n.title||n.key,o=r.title||r.key;return i.localeCompare(o)})}function j(e,t){return m(e,t)}function V(e){if(typeof e=="string")return e.includes(P);if(Array.isArray(e))return e.some(t=>V(t));if(e&&typeof e=="object"){for(const t of Object.keys(e))if(t.includes(P)||V(e[t]))return!0}return!1}function m(e,t){return typeof e=="string"?b(e,t):Array.isArray(e)?e.map(n=>m(n,t)):e&&typeof e=="object"?Object.entries(e).reduce((n,[r,i])=>{const o=b(r,t),s=typeof o=="string"?o:R(o);return n[s]=m(i,t),n},{}):e}function b(e,t){const n=e.match(D);if(n){const r=_(n[1]||"",t,n[2]);return r.found?r.value:e}return e.replace(O,(r,i,o)=>{const s=_(i,t,o);return s.found?R(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 R(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean"||typeof e=="bigint")return String(e);try{return JSON.stringify(e)}catch{return String(e)}}function F(e){const t=u(e),n=new Set;if(t){n.add(t);const i=u(A.posix.dirname(t));i&&n.add(i)}const r=S(e);if(r?.filePathInVersion){const i=u(r.filePathInVersion);if(i){n.add(i);const o=u(A.posix.dirname(i));o&&n.add(o)}}return Array.from(n)}function u(e){return e?e.replace(/^\/+/,"").replace(/\/+$/,"").trim():""}function M(e){if(!e.metadata||typeof e.metadata!="object")return;const t=e.metadata;if(!(!t.variables||typeof t.variables!="object"||Array.isArray(t.variables)))return t.variables}function z(e){return Array.isArray(e)?e.map(t=>t).filter(t=>t?.type==="implements"&&typeof t.key=="string").map(t=>t.key):[]}function B(e,t){return e===d||t===d?!0:e===t}function K(e){const t=new Map;for(const n of e)t.set(`${n.key}:${n.version}`,n);return Array.from(t.values())}function N(e){return!C.some(t=>e.includes(t))}function ne(e,t){return{isInstance:!0,parentApiId:t,entityKey:e.key,entityTitle:e.title,entitySummary:e.summary,entityTags:e.tags,instanceVariables:e.variables}}function re(e,t){const n=j(e,t.variables);return t.title&&n&&typeof n=="object"?{...n,info:{...n.info,title:t.title}}:n}export{re as applyInstanceToDefinition,ne as buildInstanceMetadata,H as fetchRegistryApiIdByPath,te as filterInstancesForApiVersion,ee as getResolvedApiVersion,V as hasTemplateVariables,Q as loadLinkedInstancesByApiId,j as patchOpenApiDefinitionWithVariables,W as resolveApiIdForDefinition};
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};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redocly/realm",
3
- "version": "0.130.0-custom.22",
3
+ "version": "0.130.0-custom.23",
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/config": "0.43.0-custom.1",
94
95
  "@redocly/graphql-docs": "1.7.0-custom.2",
95
96
  "@redocly/asyncapi-docs": "1.7.0-custom.2",
96
- "@redocly/portal-legacy-ui": "0.14.0-next.0",
97
- "@redocly/openapi-docs": "3.18.0-custom.1",
97
+ "@redocly/portal-plugin-mock-server": "0.16.0-next.4",
98
98
  "@redocly/realm-asyncapi-sdk": "0.9.0-next.1",
99
+ "@redocly/portal-legacy-ui": "0.14.0-next.0",
99
100
  "@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/openapi-docs": "3.18.0-custom.1"
102
102
  },
103
103
  "peerDependencies": {
104
104
  "react": "^19.2.4",