@redocly/reef 0.131.0-next.10 → 0.131.0-next.11

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # @redocly/reef
2
2
 
3
+ ## 0.131.0-next.11
4
+
5
+ ### Patch Changes
6
+
7
+ - dc4442ab07: Fixed canonical URLs on versioned pages to use the default version.
8
+ - b2504fea98: Fixed an issue where `sidebars.yaml` files in folders added to `ignore` configuration weren't excluded from link checking.
9
+ - Updated dependencies [8a5957c080]
10
+ - @redocly/realm-asyncapi-sdk@0.9.0-next.4
11
+ - @redocly/theme@0.63.0-next.4
12
+
3
13
  ## 0.131.0-next.10
4
14
 
5
15
  ### Patch Changes
@@ -1 +1 @@
1
- import e from"react";import{Helmet as s}from"@dr.pogodin/react-helmet";import{combineUrls as a}from"@redocly/theme/core/utils";import{isTruthy as c}from"../../../utils/guards/is-truthy";import{getMetaTagsAttributes as p}from"../utils/get-meta-tags-attributes";function T(r){const{seo:t,slug:l}=r;if(!t)return null;const n=p(t),i=[t.title,t.projectTitle].filter(c).join(" | ");return e.createElement(s,null,e.createElement("title",null,i),t.siteUrl?e.createElement("link",{rel:"canonical",href:a(t.siteUrl,l)}):null,t.jsonLd?e.createElement("script",{type:"application/ld+json"},JSON.stringify(t.jsonLd)):null,n.map((o,m)=>e.createElement("meta",{key:m,...o})))}export{T as SeoTags};
1
+ import e from"react";import{Helmet as c}from"@dr.pogodin/react-helmet";import{combineUrls as u}from"@redocly/theme/core/utils";import{isTruthy as f}from"../../../utils/guards/is-truthy";import{usePageVersions as p}from"../../providers/page-data/hooks";import{getMetaTagsAttributes as g}from"../utils/get-meta-tags-attributes";function b(r){const{seo:t,slug:i}=r,{versions:l}=p();if(!t)return null;const o=g(t),s=[t.title,t.projectTitle].filter(f).join(" | "),a=l.find(n=>n.default)?.link||i;return e.createElement(c,null,e.createElement("title",null,s),t.siteUrl?e.createElement("link",{rel:"canonical",href:u(t.siteUrl,a)}):null,t.jsonLd?e.createElement("script",{type:"application/ld+json"},JSON.stringify(t.jsonLd)):null,o.map((n,m)=>e.createElement("meta",{key:m,...n})))}export{b as SeoTags};
@@ -4,5 +4,4 @@ import type { ContentFs } from '../../fs/content-fs.js';
4
4
  export declare function sidebarsPlugin({ contentDir, }: PluginOptions): Promise<LifecyclePluginInstance>;
5
5
  export declare function removeMarkdownTags(items: ResolvedNavItem[]): ResolvedNavItem[];
6
6
  export declare function resolveSidebarId(relativePath: string, sidebarPath: string, fs: ContentFs): Promise<string | null>;
7
- export declare function isSidebarIgnored(ignore: string[], sidebarPath: string): boolean;
8
7
  //# sourceMappingURL=index.d.ts.map
@@ -1,3 +1,3 @@
1
- import{writeFileSync as tt}from"node:fs";import*as u from"path";import et from"@markdoc/markdoc";import{withoutHash as ot}from"@redocly/theme/core/utils";import{DEFAULT_LOCALE_PLACEHOLDER as v,SIDEBAR_PREFIX as at,CONFIG_FILE_NAME as V}from"../../../constants/common.js";import{CATALOG_OUTPUT_FILE_NAME as rt}from"../../constants/common.js";import{findDeepFirst as M}from"../../../utils/tree/find-deep-first.js";import{isDefined as X}from"../../../utils/guards/is-defined.js";import{partition as it}from"../../../utils/array/partition.js";import{collectPropValueDeep as N}from"../../../utils/tree/collect-prop-value-deep.js";import{envConfig as nt}from"../../config/env-config.js";import{isLocalLink as st}from"../../../utils/path/is-local-link.js";import{normalizeRouteSlug as Y}from"../../../utils/path/normalize-route-slug.js";import{slash as lt}from"../../../utils/path/slash.js";import{parsePathVersions as ct}from"../../../utils/path/parse-path-versions.js";import{reporter as A}from"../../tools/notifiers/reporter.js";import{logger as x}from"../../tools/notifiers/logger.js";import{sha1 as ft}from"../../utils/crypto/sha1.js";import{getInnerText as dt}from"../../../markdoc/helpers/get-inner-text.js";import{collectItemsLinkedToSidebars as ut,resolveItems as Z}from"../nav-utils.js";import{getExcludedFromLinkCheckerPatterns as mt,getSidebarReferences as gt,hasCircularDependency as pt}from"./utils.js";import{getLocaleFromRelativePath as ht}from"../../fs/utils/get-locale-from-relative-path.js";import{isSystemRouteSlug as St}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";const Ft=180,It=170,Ct=10;async function Jt({contentDir:l}){return{id:"sidebars",async afterRoutesCreated(o,i){await bt("build.plugin.sidebars",async()=>{const{cache:d,fs:c}=i,I=o.getConfig(),C=new Map,D=new Set,B=[v,...c.localeFolders],j=o.getGlobalData()[yt]||{},G=new Map;let L=c.scan(/sidebars.yaml$/).map(({relativePath:t})=>t).filter(t=>!wt(I.ignore??[],t)&&t);const $=await gt(i,l,L),q=it(L.filter(t=>!$.has(t)),t=>ct(t)?.versionFolderPath||t),_=mt(I),Q=await ut(I?.navbar,o,i,{navFile:V,excludedFromLinkCheckerPatterns:_});let P;const T=pt($);T&&Array.isArray(T)&&await A.panicOnBuildContentError(`Sidebar references have circular dependency. Please check your sidebar files.
1
+ import{writeFileSync as tt}from"node:fs";import*as u from"path";import et from"@markdoc/markdoc";import{withoutHash as ot}from"@redocly/theme/core/utils";import{DEFAULT_LOCALE_PLACEHOLDER as v,SIDEBAR_PREFIX as at,CONFIG_FILE_NAME as V}from"../../../constants/common.js";import{CATALOG_OUTPUT_FILE_NAME as rt}from"../../constants/common.js";import{findDeepFirst as M}from"../../../utils/tree/find-deep-first.js";import{isDefined as X}from"../../../utils/guards/is-defined.js";import{partition as it}from"../../../utils/array/partition.js";import{collectPropValueDeep as N}from"../../../utils/tree/collect-prop-value-deep.js";import{envConfig as nt}from"../../config/env-config.js";import{isLocalLink as st}from"../../../utils/path/is-local-link.js";import{normalizeRouteSlug as Y}from"../../../utils/path/normalize-route-slug.js";import{slash as lt}from"../../../utils/path/slash.js";import{parsePathVersions as ct}from"../../../utils/path/parse-path-versions.js";import{reporter as k}from"../../tools/notifiers/reporter.js";import{logger as B}from"../../tools/notifiers/logger.js";import{sha1 as ft}from"../../utils/crypto/sha1.js";import{getInnerText as dt}from"../../../markdoc/helpers/get-inner-text.js";import{collectItemsLinkedToSidebars as ut,resolveItems as J}from"../nav-utils.js";import{getExcludedFromLinkCheckerPatterns as mt,getSidebarReferences as gt,hasCircularDependency as pt}from"./utils.js";import{getLocaleFromRelativePath as ht}from"../../fs/utils/get-locale-from-relative-path.js";import{isSystemRouteSlug as St}from"../../utils/system-routes.js";import{ENTITIES_MAP_GLOBAL_DATA_KEY as yt}from"../../constants/plugins/catalog-entities.js";import{telemetryTraceStep as Ft}from"../../../cli/telemetry/helpers/trace-step.js";import{isPathIgnored as It}from"../../utils/paths.js";const bt=180,Ct=170,Dt=10;async function Qt({contentDir:c}){return{id:"sidebars",async afterRoutesCreated(o,s){await Ft("build.plugin.sidebars",async()=>{const{cache:f,fs:d}=s,b=o.getConfig(),C=new Map,D=new Set,x=[v,...d.localeFolders],j=o.getGlobalData()[yt]||{},G=new Map;let R=d.scan(/sidebars.yaml$/).map(({relativePath:t})=>t).filter(t=>!It(t,b.ignore??[])&&t);const $=await gt(s,c,R),Q=it(R.filter(t=>!$.has(t)),t=>ct(t)?.versionFolderPath||t),_=mt(b),Z=await ut(b?.navbar,o,s,{navFile:V,excludedFromLinkCheckerPatterns:_});let P;const T=pt($);T&&Array.isArray(T)&&await k.panicOnBuildContentError(`Sidebar references have circular dependency. Please check your sidebar files.
2
2
  Circular dependency chain: ${T.reverse().join(" -> ")}
3
- `);for(const t of q){const m=(await Promise.all(t.map(async n=>{const e=(await d.load(n,"yaml")).data;if(!Array.isArray(e)){await A.panicOnBuildContentErrorForRealFile('Invalid sidebar contents at %rp, items should be an array, got "%s"',n,c,n,typeof e);return}return{items:e,sidebarRelativePath:n,locale:ht(n)}}))).filter(X),r=(await k(m))?.firstLink;P||(P=r)}const z=Object.entries(I?.catalogClassic??{});for(const t of B){for(const[e,s]of z)await W(e,s,t);const m={},r=new Set,n=o.getAllRoutesForLocale(t);for(const e of n)if(U(e)&&e.fsPath&&!r.has(e.fsPath)){r.add(e.fsPath);let f=u.posix.dirname(e.fsPath);const h=u.parse(f).root;do m[f]=(m[f]||0)+1,f=u.dirname(f);while(f&&f!="."&&h!=f)}for(const e of n){if(C.has(e.slug))continue;const s=U(e),f=u.dirname(e.fsPath),h=m[f]===1,g=vt(e.baseSlug||e.slug);s&&h?await k([{items:[{directory:f}],sidebarRelativePath:"sidebar.yaml_"+g,locale:t}]):e.getSidebar!==void 0&&await k([{items:[{page:e.fsPath}],sidebarRelativePath:"sidebar.yaml_"+g,locale:t}])}for(const[e,s]of z)await W(e,s,t,!0)}if(L.length===0)for(const t of B){x.verbose("Creating default sidebar");const m=t===v,r=`sidebars.yaml${m?"":"_"+t}`,n=m?"":`${c.localizationFolder}/${t}`,e=(await k([{items:[{directory:`./${n}`}],sidebarRelativePath:r,locale:t,ignoredRoutes:D}]))?.firstLink;P||(P=e)}if(!o.getRouteBySlug("/")&&!o.getConfig().redirects?.["/"]){const m=o.getAllRoutes().find(n=>!St(n.slug)),r=P?P.link:m?.baseSlug??null;if(r){const n=ot(r);o.addRedirect("/",{to:n,type:302}),x.info("Creating default redirect for index page => %s",n)}}const H=nt.REDOCLY_METADATA_OUTPUT_FOLDER;H&&(x.info("Writing catalog data..."),tt(u.join(H,rt),JSON.stringify(Object.fromEntries(G.entries()))));function U(t){return D.has(t.slug)||j[t.fsPath]}async function k(t){if(t.length===0)return;const r=(await Promise.all(t.map(async({items:g,locale:F,sidebarRelativePath:p,ignoredRoutes:R})=>{const a=await Z(g,u.dirname(u.join(l,p)),o,i,{locale:F,ignoredRoutes:R,navFile:p,excludedFromLinkCheckerPatterns:_});if(!a){await A.panicOnBuild("Failed to resolve sidebar configuration. Make sure %rp is valid",p);return}return a}))).flat().filter(X),n=N(r,"routeSlug"),e=t[0].sidebarRelativePath,s=J(e),f=new Set;for(const g of n){const F=o.getRouteBySlug(g)?.fsPath??"",p=j[F];p&&(Array.from(f).find(a=>a.key===p.key&&a.version===p.version)||f.add(p)),o.addRouteSharedData(g,"sidebar",s),C.set(Y(g),r)}const h=f.size===1?Array.from(f)[0]:void 0;return await o.createSharedData(s,{relatedNavbarItem:Q?.get(e),items:r,catalogEntity:h?{key:h.key,version:h.version}:void 0}),{firstLink:M(r,g=>!!g.link),resolved:r}}async function W(t,m,r,n=!1){const e=structuredClone(m);r&&r!==v&&e.items.forEach(a=>{a.directory=u.posix.join(c.localizationFolder||"",r,a.directory||"")});let s=await Z(e.items,l,o,i,{groupCustomSidebars:!0,locale:r,navFile:V,excludedFromLinkCheckerPatterns:_});if(s&&(s=Pt(s)),!s){await A.panicOnBuild(`Failed to resolve catalog configuration. Make sure catalog ${t} has valid config`);return}const f=r===v?"":"/"+r.toLowerCase(),h=r===v?"":`-${r}`,g=Y(u.posix.join(f,e.slug));if(n)for(const a of s){const S=M(a.items||[],b=>!!b.routeSlug);if(!S?.routeSlug)continue;const y=C.get(S.routeSlug);if(!y)continue;const O=N(y,"routeSlug"),E="current-catalog-info-"+a.routeSlug+h,w={catalog:{label:e.title,titleTranslationKey:e.titleTranslationKey,link:g,icon:e?.icon},item:{label:a.metadata?.title,link:a.link,icon:a.icon}};await o.createSharedData(E,w);for(const b of O)o.addRouteSharedData(b,"current-catalog-info",E),D.add(b);const K=M(y,b=>!!b.link&&!b.external&&st(b.link)&&(!a.version||b.version===a.version));K&&(a.sidebar=[{...K,items:void 0}])}const F={},p=new Set;for(const a of s){if(!(a.routeSlug||a.sidebar?.[0]?.routeSlug)||!a.fsPath||p.has(a.fsPath))continue;p.add(a.fsPath);const y=u.dirname(a.fsPath);F[y]=(F[y]||0)+1}if(n){const a=await o.createSharedData("catalog-"+t+h,s.flatMap(S=>{const y=u.dirname(S.fsPath??""),O=F[y]===1,E=w=>({...w,fsPath:O?y:w.fsPath??""});return S.type==="group"&&S.items?.every(w=>w.type==="group")?(S.items||[]).map(E):E(S)}));o.addRouteSharedData(g,"catalog",a),Dt(r,s,G,F)}const R=N(s,"routeSlug");for(const a of R)D.add(a)}})}}}function Dt(l,o,i,d){if(l===v)for(const c of o){const I=c.routeSlug||c.sidebar?.[0]?.routeSlug;if(!I||!c.fsPath)continue;const C=u.dirname(c.fsPath),D=d[C]===1;i.set(I,{rootFileFsPath:c.fsPath,fsPath:D?C:c.fsPath,metadata:c.metadata||{},title:c.metadata?.title||c.label||"Untitled",version:c.version||"latest"})}}function Pt(l){const o=i=>{if(!i)return i;const d=et.parse(i);return dt([d])};return l.map(i=>{const d={...i};return d.metadata?.description&&(d.metadata={...d.metadata,description:o(d.metadata.description)}),d})}function J(l){return at+lt(l)}async function qt(l,o,i){const d=u.posix.join(u.dirname(l),o);return await i.exists(d)?J(d):(await A.panicOnBuildContentErrorForRealFile("File %rp: Failed to create relative path for sidebars.yaml using %s",l,i,l,o),null)}function wt(l,o){const i=/\/?([a-zA-Z0-9-_]+\/)*sidebars?(-[a-zA-Z0-9-_]+)?\.yaml/;return l.filter(c=>i.test(c)).includes(o)}function vt(l){const o=l.replaceAll("/","_");if(o.length>Ft){const i=o.slice(0,It),d=ft(l).slice(0,Ct).replaceAll("/","_");return i+d}else return o}export{wt as isSidebarIgnored,Pt as removeMarkdownTags,qt as resolveSidebarId,Jt as sidebarsPlugin};
3
+ `);for(const t of Q){const m=(await Promise.all(t.map(async i=>{const e=(await f.load(i,"yaml")).data;if(!Array.isArray(e)){await k.panicOnBuildContentErrorForRealFile('Invalid sidebar contents at %rp, items should be an array, got "%s"',i,d,i,typeof e);return}return{items:e,sidebarRelativePath:i,locale:ht(i)}}))).filter(X),r=(await A(m))?.firstLink;P||(P=r)}const H=Object.entries(b?.catalogClassic??{});for(const t of x){for(const[e,n]of H)await z(e,n,t);const m={},r=new Set,i=o.getAllRoutesForLocale(t);for(const e of i)if(W(e)&&e.fsPath&&!r.has(e.fsPath)){r.add(e.fsPath);let l=u.posix.dirname(e.fsPath);const h=u.parse(l).root;do m[l]=(m[l]||0)+1,l=u.dirname(l);while(l&&l!="."&&h!=l)}for(const e of i){if(C.has(e.slug))continue;const n=W(e),l=u.dirname(e.fsPath),h=m[l]===1,g=vt(e.baseSlug||e.slug);n&&h?await A([{items:[{directory:l}],sidebarRelativePath:"sidebar.yaml_"+g,locale:t}]):e.getSidebar!==void 0&&await A([{items:[{page:e.fsPath}],sidebarRelativePath:"sidebar.yaml_"+g,locale:t}])}for(const[e,n]of H)await z(e,n,t,!0)}if(R.length===0)for(const t of x){B.verbose("Creating default sidebar");const m=t===v,r=`sidebars.yaml${m?"":"_"+t}`,i=m?"":`${d.localizationFolder}/${t}`,e=(await A([{items:[{directory:`./${i}`}],sidebarRelativePath:r,locale:t,ignoredRoutes:D}]))?.firstLink;P||(P=e)}if(!o.getRouteBySlug("/")&&!o.getConfig().redirects?.["/"]){const m=o.getAllRoutes().find(i=>!St(i.slug)),r=P?P.link:m?.baseSlug??null;if(r){const i=ot(r);o.addRedirect("/",{to:i,type:302}),B.info("Creating default redirect for index page => %s",i)}}const U=nt.REDOCLY_METADATA_OUTPUT_FOLDER;U&&(B.info("Writing catalog data..."),tt(u.join(U,rt),JSON.stringify(Object.fromEntries(G.entries()))));function W(t){return D.has(t.slug)||j[t.fsPath]}async function A(t){if(t.length===0)return;const r=(await Promise.all(t.map(async({items:g,locale:I,sidebarRelativePath:p,ignoredRoutes:L})=>{const a=await J(g,u.dirname(u.join(c,p)),o,s,{locale:I,ignoredRoutes:L,navFile:p,excludedFromLinkCheckerPatterns:_});if(!a){await k.panicOnBuild("Failed to resolve sidebar configuration. Make sure %rp is valid",p);return}return a}))).flat().filter(X),i=N(r,"routeSlug"),e=t[0].sidebarRelativePath,n=q(e),l=new Set;for(const g of i){const I=o.getRouteBySlug(g)?.fsPath??"",p=j[I];p&&(Array.from(l).find(a=>a.key===p.key&&a.version===p.version)||l.add(p)),o.addRouteSharedData(g,"sidebar",n),C.set(Y(g),r)}const h=l.size===1?Array.from(l)[0]:void 0;return await o.createSharedData(n,{relatedNavbarItem:Z?.get(e),items:r,catalogEntity:h?{key:h.key,version:h.version}:void 0}),{firstLink:M(r,g=>!!g.link),resolved:r}}async function z(t,m,r,i=!1){const e=structuredClone(m);r&&r!==v&&e.items.forEach(a=>{a.directory=u.posix.join(d.localizationFolder||"",r,a.directory||"")});let n=await J(e.items,c,o,s,{groupCustomSidebars:!0,locale:r,navFile:V,excludedFromLinkCheckerPatterns:_});if(n&&(n=wt(n)),!n){await k.panicOnBuild(`Failed to resolve catalog configuration. Make sure catalog ${t} has valid config`);return}const l=r===v?"":"/"+r.toLowerCase(),h=r===v?"":`-${r}`,g=Y(u.posix.join(l,e.slug));if(i)for(const a of n){const S=M(a.items||[],F=>!!F.routeSlug);if(!S?.routeSlug)continue;const y=C.get(S.routeSlug);if(!y)continue;const O=N(y,"routeSlug"),E="current-catalog-info-"+a.routeSlug+h,w={catalog:{label:e.title,titleTranslationKey:e.titleTranslationKey,link:g,icon:e?.icon},item:{label:a.metadata?.title,link:a.link,icon:a.icon}};await o.createSharedData(E,w);for(const F of O)o.addRouteSharedData(F,"current-catalog-info",E),D.add(F);const K=M(y,F=>!!F.link&&!F.external&&st(F.link)&&(!a.version||F.version===a.version));K&&(a.sidebar=[{...K,items:void 0}])}const I={},p=new Set;for(const a of n){if(!(a.routeSlug||a.sidebar?.[0]?.routeSlug)||!a.fsPath||p.has(a.fsPath))continue;p.add(a.fsPath);const y=u.dirname(a.fsPath);I[y]=(I[y]||0)+1}if(i){const a=await o.createSharedData("catalog-"+t+h,n.flatMap(S=>{const y=u.dirname(S.fsPath??""),O=I[y]===1,E=w=>({...w,fsPath:O?y:w.fsPath??""});return S.type==="group"&&S.items?.every(w=>w.type==="group")?(S.items||[]).map(E):E(S)}));o.addRouteSharedData(g,"catalog",a),Pt(r,n,G,I)}const L=N(n,"routeSlug");for(const a of L)D.add(a)}})}}}function Pt(c,o,s,f){if(c===v)for(const d of o){const b=d.routeSlug||d.sidebar?.[0]?.routeSlug;if(!b||!d.fsPath)continue;const C=u.dirname(d.fsPath),D=f[C]===1;s.set(b,{rootFileFsPath:d.fsPath,fsPath:D?C:d.fsPath,metadata:d.metadata||{},title:d.metadata?.title||d.label||"Untitled",version:d.version||"latest"})}}function wt(c){const o=s=>{if(!s)return s;const f=et.parse(s);return dt([f])};return c.map(s=>{const f={...s};return f.metadata?.description&&(f.metadata={...f.metadata,description:o(f.metadata.description)}),f})}function q(c){return at+lt(c)}async function Zt(c,o,s){const f=u.posix.join(u.dirname(c),o);return await s.exists(f)?q(f):(await k.panicOnBuildContentErrorForRealFile("File %rp: Failed to create relative path for sidebars.yaml using %s",c,s,c,o),null)}function vt(c){const o=c.replaceAll("/","_");if(o.length>bt){const s=o.slice(0,Ct),f=ft(c).slice(0,Dt).replaceAll("/","_");return s+f}else return o}export{wt as removeMarkdownTags,Zt as resolveSidebarId,Qt as sidebarsPlugin};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redocly/reef",
3
- "version": "0.131.0-next.10",
3
+ "version": "0.131.0-next.11",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "bin": {
@@ -51,7 +51,7 @@
51
51
  "fetch-to-node": "^2.1.0",
52
52
  "fflate": "0.7.4",
53
53
  "flexsearch": "0.7.43",
54
- "graphql": "16.9.0",
54
+ "graphql": "16.12.0",
55
55
  "gray-matter": "4.0.3",
56
56
  "hono": "4.11.10",
57
57
  "htmlparser2": "8.0.2",
@@ -97,7 +97,7 @@
97
97
  "@redocly/openapi-docs": "3.19.0-next.7",
98
98
  "@redocly/portal-legacy-ui": "0.14.0-next.0",
99
99
  "@redocly/portal-plugin-mock-server": "0.16.0-next.7",
100
- "@redocly/realm-asyncapi-sdk": "0.9.0-next.3",
100
+ "@redocly/realm-asyncapi-sdk": "0.9.0-next.4",
101
101
  "@redocly/theme": "0.63.0-next.4"
102
102
  },
103
103
  "peerDependencies": {