@redocly/realm 0.129.0 → 0.129.1
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 +18 -0
- package/dist/client/app/Sidebar/Sidebar.js +1 -1
- package/dist/client/app/Sidebar/helpers/filter-out-versioned-items.d.ts +23 -0
- package/dist/client/app/Sidebar/helpers/filter-out-versioned-items.js +1 -0
- package/dist/client/app/Sidebar/useSidebarItems.d.ts +2 -2
- package/dist/client/app/Sidebar/useSidebarItems.js +1 -1
- package/dist/client/app/hooks/codeHighlight/useCodeHighlight.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.js +8 -8
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +6 -11
- package/dist/server/providers/database/database-initialization-strategy.js +1 -1
- package/dist/server/providers/database/sqld-not-running-error.d.ts +5 -0
- package/dist/server/providers/database/sqld-not-running-error.js +1 -0
- package/package.json +9 -9
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @redocly/realm
|
|
2
2
|
|
|
3
|
+
## 0.129.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- a5fdb8c206: Fixed missing `initActiveColorMode` method.
|
|
8
|
+
- 52c4bc4f8a: Fixed C# syntax highlighting for code samples.
|
|
9
|
+
- 244fb306ba: Fixed an issue that caused incorrect display of versioned group items in the sidebar.
|
|
10
|
+
- 3ab773089f: Improved styles of the `Admonition` component.
|
|
11
|
+
- 9dde601e04: Fixed an issue where the `Version history` button appeared in the sidebar.
|
|
12
|
+
- Updated dependencies [a5fdb8c206]
|
|
13
|
+
- Updated dependencies [3ab773089f]
|
|
14
|
+
- Updated dependencies [9dde601e04]
|
|
15
|
+
- @redocly/theme@0.61.1
|
|
16
|
+
- @redocly/asyncapi-docs@1.6.1
|
|
17
|
+
- @redocly/graphql-docs@1.6.0
|
|
18
|
+
- @redocly/openapi-docs@3.17.1
|
|
19
|
+
- @redocly/portal-plugin-mock-server@0.14.1
|
|
20
|
+
|
|
3
21
|
## 0.129.0
|
|
4
22
|
|
|
5
23
|
### Minor Changes
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import e,{useEffect as y,useState as p}from"react";import b from"styled-components";import{Menu as I}from"@redocly/theme/components/Menu/Menu";import{SidebarActions as L}from"@redocly/theme/components/SidebarActions/SidebarActions";import{Sidebar as w}from"@redocly/theme/components/Sidebar/Sidebar";import{VersionPicker as A}from"@redocly/theme/components/VersionPicker/VersionPicker";import{Button as B}from"@redocly/theme/components/Button/Button";import{CatalogEntityHistoryButton as P}from"@redocly/theme/components/Catalog/CatalogEntity/CatalogEntityHistory/CatalogEntityHistoryButton";import{ArrowLeftIcon as x}from"@redocly/theme/icons/ArrowLeftIcon/ArrowLeftIcon";import{withPathPrefix as D}from"@redocly/theme/core/utils";import{telemetry as h}from"../telemetry/index.js";import{usePreloadHistory as T}from"../usePreloadHistory";import{useTranslate as C}from"../hooks";import{usePageSharedData as M,usePageVersions as V}from"../../providers/page-data/hooks";import{useSidebarItems as H}from"./useSidebarItems";import{renderAdmonition as R,RequestAccessButton as q}from"./RequestAccessButton";function ie({layoutControls:s}){const{versions:l=[]}=V()||{},g=l.find(t=>t?.active),{translate:a}=C(),{currentItems:m,backLink:n,versionLabel:o,pushDrilldownState:k,popDrilldownState:v}=H(g),[c,S]=p(),{collapsedSidebar:i}=s,d=M("openAPIDocsStore")?.definition.info?.["x-metadata"]?.apiId,E=T(),[u,r]=p(void 0);return y(()=>{const t=setTimeout(()=>r(void 0),350);return()=>clearTimeout(t)},[u]),m.length?e.createElement(e.Fragment,null,e.createElement(w,{collapsed:i,menuItemsAnimation:u,versions:e.createElement(A,{versions:l,onChange:t=>{h.sendVersionPickerSelectionChangeMessage({action:"change"});const f=location.hash?t?.link+location.hash:t?.link;f&&E.push(D(f))}}),menu:e.createElement(I,{items:m,onDrilldownOpen:t=>{r("slideInRight"),k(t)}}),footer:e.createElement("div",{style:{width:"100%"}},!i&&R(c),e.createElement(L,{...s,requestAccessButton:d?e.createElement(q,{apiId:d,status:c,setStatus:S}):null})),header:(n||o!==void 0)&&e.createElement(J,null,n&&e.createElement(j,{icon:e.createElement(x,null),iconPosition:"left",variant:"ghost",size:"medium","data-component-name":"Sidebar/BackButton",to:n.slug,onClick:()=>{r("slideInLeft"),v(),h.sendSidebarDrilldownBackButtonClickedMessage({action:"click"})}},i?"":n.label?e.createElement("div",{"data-translation-key":"sidebar.menu.backToLabel"},a("sidebar.menu.backToLabel",{value:a(n.labelTranslationKey,n.label)})):e.createElement("div",{"data-translation-key":"sidebar.menu.backLabel"},a("sidebar.menu.backLabel"))),o
|
|
1
|
+
import e,{useEffect as y,useState as p}from"react";import b from"styled-components";import{Menu as I}from"@redocly/theme/components/Menu/Menu";import{SidebarActions as L}from"@redocly/theme/components/SidebarActions/SidebarActions";import{Sidebar as w}from"@redocly/theme/components/Sidebar/Sidebar";import{VersionPicker as A}from"@redocly/theme/components/VersionPicker/VersionPicker";import{Button as B}from"@redocly/theme/components/Button/Button";import{CatalogEntityHistoryButton as P}from"@redocly/theme/components/Catalog/CatalogEntity/CatalogEntityHistory/CatalogEntityHistoryButton";import{ArrowLeftIcon as x}from"@redocly/theme/icons/ArrowLeftIcon/ArrowLeftIcon";import{withPathPrefix as D}from"@redocly/theme/core/utils";import{telemetry as h}from"../telemetry/index.js";import{usePreloadHistory as T}from"../usePreloadHistory";import{useTranslate as C}from"../hooks";import{usePageSharedData as M,usePageVersions as V}from"../../providers/page-data/hooks";import{useSidebarItems as H}from"./useSidebarItems";import{renderAdmonition as R,RequestAccessButton as q}from"./RequestAccessButton";function ie({layoutControls:s}){const{versions:l=[]}=V()||{},g=l.find(t=>t?.active),{translate:a}=C(),{currentItems:m,backLink:n,versionLabel:o,pushDrilldownState:k,popDrilldownState:v}=H(g),[c,S]=p(),{collapsedSidebar:i}=s,d=M("openAPIDocsStore")?.definition.info?.["x-metadata"]?.apiId,E=T(),[u,r]=p(void 0);return y(()=>{const t=setTimeout(()=>r(void 0),350);return()=>clearTimeout(t)},[u]),m.length?e.createElement(e.Fragment,null,e.createElement(w,{collapsed:i,menuItemsAnimation:u,versions:e.createElement(A,{versions:l,onChange:t=>{h.sendVersionPickerSelectionChangeMessage({action:"change"});const f=location.hash?t?.link+location.hash:t?.link;f&&E.push(D(f))}}),menu:e.createElement(I,{items:m,onDrilldownOpen:t=>{r("slideInRight"),k(t)}}),footer:e.createElement("div",{style:{width:"100%"}},!i&&R(c),e.createElement(L,{...s,requestAccessButton:d?e.createElement(q,{apiId:d,status:c,setStatus:S}):null})),header:(n||o!==void 0)&&e.createElement(J,null,n&&e.createElement(j,{icon:e.createElement(x,null),iconPosition:"left",variant:"ghost",size:"medium","data-component-name":"Sidebar/BackButton",to:n.slug,onClick:()=>{r("slideInLeft"),v(),h.sendSidebarDrilldownBackButtonClickedMessage({action:"click"})}},i?"":n.label?e.createElement("div",{"data-translation-key":"sidebar.menu.backToLabel"},a("sidebar.menu.backToLabel",{value:a(n.labelTranslationKey,n.label)})):e.createElement("div",{"data-translation-key":"sidebar.menu.backLabel"},a("sidebar.menu.backLabel"))),o&&!i&&e.createElement(P,{version:o}))})):null}const J=b.div`
|
|
2
2
|
display: flex;
|
|
3
3
|
flex-direction: column;
|
|
4
4
|
gap: var(--menu-header-container-gap);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ResolvedNavItem, Version } from '@redocly/config';
|
|
2
|
+
/**
|
|
3
|
+
* Filters the sidebar items based on the active version.
|
|
4
|
+
*
|
|
5
|
+
* The input is a list of all items with versioned items mixed in.
|
|
6
|
+
*
|
|
7
|
+
* We can't just filter out all items that don't match the active version because there might be items from folders that have different versions.
|
|
8
|
+
*
|
|
9
|
+
* For example:
|
|
10
|
+
*
|
|
11
|
+
* /foo
|
|
12
|
+
* /@v1
|
|
13
|
+
* /@v2
|
|
14
|
+
* /bar
|
|
15
|
+
* /@v1
|
|
16
|
+
* /@latest
|
|
17
|
+
*
|
|
18
|
+
* So we foolow these rules:
|
|
19
|
+
* - we prefer the items with the same version name as the active version
|
|
20
|
+
* - if there are no items with the same version name, we pick the default version for folder
|
|
21
|
+
*/
|
|
22
|
+
export declare function filterOutVersionedItems(items: ResolvedNavItem[], activeVersion?: Version | null, versionNamesByFolderId?: Record<string, Set<string>>): ResolvedNavItem[];
|
|
23
|
+
//# sourceMappingURL=filter-out-versioned-items.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function o(s,e,n={}){for(const r of s)r.versionFolderId&&r.version&&(n[r.versionFolderId]=n[r.versionFolderId]??new Set).add(r.version);return s.filter(r=>r.version==null?r:e?r.version===e.version?!0:r.versionFolderId&&n[r.versionFolderId]?.has(e.version)?!1:r.isDefault:r.isDefault).map(r=>Array.isArray(r.items)&&r.items.length?{...r,items:o(r.items,e,n)}:r)}export{o as filterOutVersionedItems};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Version } from '@redocly/config';
|
|
2
2
|
import type { ItemState, DrilldownMenuItemDetails } from '@redocly/theme/core/types';
|
|
3
|
-
export declare function useRawSidebarItems(activeVersion?: Version | null): ResolvedNavItem[];
|
|
3
|
+
export declare function useRawSidebarItems(activeVersion?: Version | null): import("@redocly/config").ResolvedNavItem[];
|
|
4
4
|
export declare function useSidebarItems(activeVersion?: Version | null): {
|
|
5
5
|
currentItems: ItemState[];
|
|
6
6
|
allSidebarItems: ItemState[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useLocation as
|
|
1
|
+
import{useLocation as _}from"react-router-dom";import{useEffect as k,useMemo as S,useState as b}from"react";import{useActiveSectionId as D}from"@redocly/theme/core/hooks";import{getMenuItemType as v}from"@redocly/theme/core/utils";import{MenuItemType as C}from"@redocly/theme/core/constants";import{usePageSharedData as T,useSidebarItemsData as h,useSidebarConnectedCatalogConfig as y,useSidebarConnectedCatalogEntity as G}from"../../providers/page-data/hooks";import{mapItemsPropsToState as g}from"./utils";import{injectCatalogItems as E}from"../../utils/catalog/inject-catalog-items";import{CATALOG_BASE_SLUG as O,CATALOG_SLUGS as K}from"../../../server/constants/plugins/catalog-entities";import{filterOutVersionedItems as B}from"./helpers/filter-out-versioned-items";const M="catalog.backToAllLabel",P=`${O}/${K.ALL}`;function U(n){const e=h();return S(()=>B(e,n),[e,n])}function J(n){const e=_(),t=D(e,!0),a=G(),p=y(),s=U(n),c=a?E(s,a.key,p?.slug,e.search):s,[u,I]=b(null),r=S(()=>g(c,e,t),[t,e,c]),l=T("current-catalog-info"),L=S(()=>f(r),[c]),[o,m]=b(L),i=o.length>0?o[o.length-1]:void 0,A=i&&g([...i.item.link?[{...i.item,items:[],menuStyle:void 0,separatorLine:!1}]:[],...i.item.items],e,t);k(()=>{if(!u||u!==t){const d=f(r);m(d),I(t)}},[s,e,t,u]);const w=i?{slug:i.previousLink,event:"sidebar_drilldown_back_button.clicked"}:a?{label:"Back to Catalog",labelTranslationKey:M,slug:P,event:"back_to_catalog_button.clicked"}:l?{label:l.catalog.label,labelTranslationKey:l.catalog.labelTranslationKey,slug:l.catalog.link,event:"back_to_catalog_button.clicked"}:void 0;return{currentItems:A||r,allSidebarItems:r,popDrilldownState:()=>{o.length>0&&m(o.slice(0,o.length-1))},pushDrilldownState:d=>{m([...o,d])},backLink:w,versionLabel:a?.version??null}}function f(n,e=[]){for(const t of n){if(!t.active&&!t.hasActiveSubItem)continue;if(v(t)===C.DrillDown&&e.push({item:t}),t.active)return e;if(t.hasActiveSubItem)return f(t.items,e)}return e}export{U as useRawSidebarItems,J as useSidebarItems};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import h from"shiki/langs/bash.mjs";import l from"shiki/langs/c.mjs";import g from"shiki/langs/coffee.mjs";import d from"shiki/langs/csharp.mjs";import k from"shiki/langs/css.mjs";import u from"shiki/langs/go.mjs";import w from"shiki/langs/graphql.mjs";import N from"shiki/langs/html.mjs";import b from"shiki/langs/http.mjs";import y from"shiki/langs/java.mjs";import v from"shiki/langs/javascript.mjs";import x from"shiki/langs/kotlin.mjs";import H from"shiki/langs/lua.mjs";import r from"shiki/langs/markdown.mjs";import L from"shiki/langs/objective-c.mjs";import _ from"shiki/langs/perl.mjs";import j from"shiki/langs/php.mjs";import T from"shiki/langs/python.mjs";import E from"shiki/langs/scala.mjs";import M from"shiki/langs/sql.mjs";import q from"shiki/langs/swift.mjs";import S from"shiki/langs/tsx.mjs";import A from"shiki/langs/typescript.mjs";import C from"shiki/langs/vim.mjs";import D from"shiki/langs/xml.mjs";import F from"shiki/langs/yaml.mjs";import R from"shiki/langs/jsx.mjs";import W from"shiki/langs/jsonl.mjs";import{transformerNotationDiff as G,transformerNotationHighlight as J,transformerNotationWordHighlight as U,transformerNotationFocus as V,transformerNotationErrorLevel as $,transformerMetaHighlight as z,transformerMetaWordHighlight as B,transformerRemoveNotationEscape as I}from"@shikijs/transformers";import{createHighlighterCoreSync as K}from"shiki/core";import{createJavaScriptRegexEngine as O}from"shiki/engine/javascript";import P from"./ruby";import Q from"./multipart-mixed";import X from"./json-seq";import Y from"./theme";import Z from"./treeview-transformer";import rr from"./node-transformer";import or from"./line-numbers-transformer";import{mapLang as tr}from"./map-lang";const mr=[{...r[0],displayName:"Markdoc",name:"markdoc",scopeName:"source.markdoc",aliases:[],repository:{...r[0].repository,fenced_code_block:{patterns:[...r[0].repository.fenced_code_block.patterns||[],{name:"markdoc",begin:".*{%",end:"%}",patterns:[{match:"(?<={%)\\s*(/\\w+(-\\w+)?|\\w+(-\\w+)?)",name:"markdoc.tag"},{match:"\\$\\w+",name:"markdoc.variable"},{match:'".*?"',name:"markdoc.string"},{match:"\\b\\w+(?=\\()",name:"markdoc.function"},{match:"\\s+\\w+(?==|\\s)",name:"markdoc.keyword"},{match:"(?<==)false|true(?=\\s)",name:"markdoc.boolean"}]}]}}}],i="text",a=K({themes:[Y],langs:[h,l,g,d,k,u,w,N,b,y,v,x,H,r,L,_,j,T,P,E,M,q,S,A,D,C,F,mr,R,W,Q,X],engine:O()}),er=[G(),J(),U(),V(),$(),z(),B(),I(),rr()],ir=(o,n,s)=>{const{withLineNumbers:p,startLineNumber:f,highlight:c,customTransformer:t}=s||{},m=tr(n?.toLowerCase()||i),e={lang:m,theme:"theme",meta:{__raw:c},transformers:[...m==="treeview"?[Z()]:[],...er,...p?[or(f)]:[],...t?[t]:[]]};try{return a.codeToHtml(o,e)}catch{return a.codeToHtml(o,{...e,lang:i})}};function Ir(){return{highlight:ir}}export{ir as highlight,Ir as useCodeHighlight};
|
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
import{and as c,desc as
|
|
1
|
+
import{and as c,desc as M,eq as s,notExists as $,sql as e}from"drizzle-orm";import{unionAll as C}from"drizzle-orm/sqlite-core";import{logger as Q}from"../../../../../tools/notifiers/logger.js";import{entitiesTable as i}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as T}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{applyPagination as D}from"../../../../../providers/database/pagination/index.js";import{applyFilter as j,excludeFieldsFromFilter as H,getAllFilterFieldValues as S}from"../../../../../providers/database/pagination/filter.js";import{createBffEntity as O}from"../../mappers/create-bff-entity.js";import{FIELDS_TO_SELECT_FOR_ENTITY as n,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as R,createEntityFieldsForSelect as A}from"../utils.js";class U{#e;#t;constructor(t,o){this.#e=t,this.#t=o}async getEntitiesWithRelations(t={}){const o=S(t.filter,"owners");if(o.length>0)return this.#c(t,o);const d=S(t.filter,"domains");return d.length>0?this.#l(t,d):this.#a(t)}async#c(t,o){const d=this.#s(),l=this.#n(),m=this.#o(),y=l.as("combined_relations"),u=m.as("combined_target_entities"),h=o.map(r=>e`
|
|
2
2
|
EXISTS (
|
|
3
3
|
SELECT 1 FROM (${l}) cr
|
|
4
4
|
WHERE cr.source_key = ${r}
|
|
5
5
|
AND cr.source_to_target_relation = 'owns'
|
|
6
6
|
AND cr.target_key = base_entities.key
|
|
7
7
|
)
|
|
8
|
-
`),_=h.length===1?h[0]:e`(${e.join(h,e` OR `)})`,b=
|
|
8
|
+
`),_=h.length===1?h[0]:e`(${e.join(h,e` OR `)})`,b=S(t.filter,"domains");let w=_;if(b.length>0){const r=b.map(a=>e`
|
|
9
9
|
EXISTS (
|
|
10
10
|
SELECT 1 FROM (${l}) cr
|
|
11
|
-
JOIN (${
|
|
11
|
+
JOIN (${m}) d ON d.key = ${a}
|
|
12
12
|
WHERE d.type = 'domain'
|
|
13
13
|
AND d.is_current = 1
|
|
14
14
|
AND cr.source_key = ${a}
|
|
15
15
|
AND cr.target_key = base_entities.key
|
|
16
16
|
AND cr.source_to_target_relation = 'hasParts'
|
|
17
17
|
)
|
|
18
|
-
`),f=r.length===1?r[0]:e`(${e.join(r,e` OR `)})`;w=e`(${_} AND ${f})`}const
|
|
18
|
+
`),f=r.length===1?r[0]:e`(${e.join(r,e` OR `)})`;w=e`(${_} AND ${f})`}const p=H(t.filter,["owners","domains"]),g={...t,filter:p,baseWhereCondition:w},E=this.#e.client.select(n).from(d.as("base_entities")).$dynamic();try{const r=this.#e.client.select(n).from(d.as("base_entities")).$dynamic();D(r,{...g,limit:void 0,skip:void 0,after:void 0,before:void 0});const f=this.#e.client.$count(r),a=t.limit||10;D(E,{...g,limit:a+1});const v=E.as("paged_entities"),W=this.#e.client.with(y,u,v).select({...A("paged_entities"),domains:this.#i("paged_entities").as("domains"),owners:this.#r("paged_entities").as("owners")}).from(v),[F,I]=await Promise.all([W.run(),f]),k=F.rows,L=k.length>a;return{items:k.slice(0,a).map(N=>O(N)).filter(N=>N!==null),hasMore:L,total:I}}catch(r){return Q.error("Error getting entities with relations (owner optimized path):",r),{items:[],hasMore:!1,total:0}}}async#l(t,o){const d=this.#s(),l=this.#n(),m=this.#o(),y=l.as("combined_relations"),u=m.as("combined_target_entities"),h=o.map(r=>e`
|
|
19
19
|
EXISTS (
|
|
20
20
|
SELECT 1 FROM (${l}) cr
|
|
21
|
-
JOIN (${
|
|
21
|
+
JOIN (${m}) d ON d.key = ${r}
|
|
22
22
|
WHERE d.type = 'domain'
|
|
23
23
|
AND d.is_current = 1
|
|
24
24
|
AND cr.source_key = ${r}
|
|
25
25
|
AND cr.target_key = base_entities.key
|
|
26
26
|
AND cr.source_to_target_relation = 'hasParts'
|
|
27
27
|
)
|
|
28
|
-
`),_=h.length===1?h[0]:e`(${e.join(h,e` OR `)})`,b=
|
|
28
|
+
`),_=h.length===1?h[0]:e`(${e.join(h,e` OR `)})`,b=S(t.filter,"owners");let w=_;if(b.length>0){const r=b.map(a=>e`
|
|
29
29
|
EXISTS (
|
|
30
30
|
SELECT 1 FROM (${l}) cr
|
|
31
31
|
WHERE cr.source_key = ${a}
|
|
32
32
|
AND cr.source_to_target_relation = 'owns'
|
|
33
33
|
AND cr.target_key = base_entities.key
|
|
34
34
|
)
|
|
35
|
-
`),f=r.length===1?r[0]:e`(${e.join(r,e` OR `)})`;w=e`(${_} AND ${f})`}const
|
|
35
|
+
`),f=r.length===1?r[0]:e`(${e.join(r,e` OR `)})`;w=e`(${_} AND ${f})`}const p=H(t.filter,["domains","owners"]),g={...t,filter:p,baseWhereCondition:w},E=this.#e.client.select(n).from(d.as("base_entities")).$dynamic();try{const r=this.#e.client.select(n).from(d.as("base_entities")).$dynamic();D(r,{...g,limit:void 0,skip:void 0,after:void 0,before:void 0});const f=this.#e.client.$count(r),a=t.limit||10;D(E,{...g,limit:a+1});const v=E.as("paged_entities"),W=this.#e.client.with(y,u,v).select({...A("paged_entities"),domains:this.#i("paged_entities").as("domains"),owners:this.#r("paged_entities").as("owners")}).from(v),[F,I]=await Promise.all([W.run(),f]),k=F.rows,L=k.length>a;return{items:k.slice(0,a).map(N=>O(N)).filter(N=>N!==null),hasMore:L,total:I}}catch(r){return Q.error("Error getting entities with relations (domain optimized path):",r),{items:[],hasMore:!1,total:0}}}async#a(t){const o=this.#s(),d=this.#n(),l=this.#o(),m=d.as("combined_relations"),y=l.as("combined_target_entities"),u=this.#e.client.select(n).from(o.as("base_entities")).$dynamic(),{whereCondition:h}=j(u,t.filter);h&&u.where(h);try{const _=this.#e.client.select(n).from(o.as("base_entities")).$dynamic();h&&_.where(h);const b=this.#e.client.$count(_),w=t.limit||10;D(u,{...t,limit:w+1});const p=u.as("paged_entities"),g=this.#e.client.with(m,y,p).select({...A("paged_entities"),domains:this.#i("paged_entities").as("domains"),owners:this.#r("paged_entities").as("owners")}).from(p),[E,r]=await Promise.all([g.run(),b]),f=E.rows,a=f.length>w;return{items:f.slice(0,w).map(v=>O(v)).filter(v=>v!==null),hasMore:a,total:r}}catch(_){return Q.error("Error getting entities with relations (optimized path):",_),{items:[],hasMore:!1,total:0}}}#s(){return this.#t?C(this.#e.client.select(n).from(e`remote.entities`).where(c(s(e.raw("is_current"),1),s(e.raw("is_deleted"),!1))),this.#e.client.select(n).from(i).where(c(s(i.isCurrent,!0),s(i.isDeleted,!1),$(this.#e.client.select({id:n.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(n).from(i).where(c(s(i.isCurrent,!0),s(i.isDeleted,!1)))}#n(){return this.#t?C(this.#e.client.select(R).from(e`remote.entities_relations`),this.#e.client.select(R).from(T).where($(this.#e.client.select({id:R.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${T.sourceKey}`)))):this.#e.client.select(R).from(T)}#o(){return this.#t?C(this.#e.client.select(n).from(e`remote.entities`).where(c(s(e.raw("is_current"),1),s(e.raw("is_deleted"),!1))),this.#e.client.select(n).from(i).where(c(s(i.isCurrent,!0),s(i.isDeleted,!1),$(this.#e.client.select({id:n.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(n).from(i).where(c(s(i.isCurrent,!0),s(i.isDeleted,!1)))}async getEntityWithRelationsByKey(t,o){if(!t||t.trim()==="")return null;const d=o?.revision,l=o?.version,m=d?null:await this.#d(t,l||null),y=l??m?.version,u=d||m?.revision||null,_=(this.#t?C(this.#e.client.select(n).from(e`remote.entities`).where(s(i.key,t)),this.#e.client.select(n).from(i).where(c(s(i.key,t),$(this.#e.client.select({id:n.id}).from(e`remote.entities as remote`).where(e`remote.key = ${i.key}`))))):this.#e.client.select(n).from(i).where(s(i.key,t))).as("e"),w=(this.#t?C(this.#e.client.select(R).from(e`remote.entities_relations`),this.#e.client.select(R).from(T).where($(this.#e.client.select({id:R.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${T.sourceKey}`)))):this.#e.client.select(R).from(T)).as("combined_relations"),g=(this.#t?C(this.#e.client.select(n).from(e`remote.entities`),this.#e.client.select(n).from(i).where($(this.#e.client.select({id:n.id}).from(e`remote.entities as remote`).where(e`remote.key = ${i.key}`)))):this.#e.client.select(n).from(i)).as("combined_target_entities"),E=this.#e.client.with(_,w,g).select({...A("e"),domains:this.#i("e").as("domains"),owners:this.#r("e").as("owners")}).from(_).$dynamic();u?E.where(c(s(e.raw("revision"),u),y?s(e.raw("version"),y):void 0)):E.where(s(e.raw("is_current"),1)),E.limit(1);const r=await E.run();if(r.rows.length===0)return null;const f=r.rows[0];return O(f)}async#d(t,o){if(o){const y=await(this.#t?C(this.#e.client.select({version:e.raw("version"),revision:e.raw("revision")}).from(e`remote.entities`).where(c(e`key = ${t}`,e`version = ${o}`)).orderBy(e.raw("revision DESC")),this.#e.client.select({version:i.version,revision:i.revision}).from(i).where(c(s(i.key,t),s(i.version,o),$(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.version = ${o}`))))).orderBy(M(i.revision))):this.#e.client.select({version:i.version,revision:i.revision}).from(i).where(c(s(i.key,t),s(i.version,o))).orderBy(M(i.revision))).limit(1).run();if(y.rows.length>0){const u=y.rows[0];return{version:u.version||null,revision:u.revision||null}}return null}const l=await(this.#t?C(this.#e.client.select({version:e.raw("version"),revision:e.raw("revision")}).from(e`remote.entities`).where(c(e`key = ${t}`,e`is_current = 1`)),this.#e.client.select({version:i.version,revision:i.revision}).from(i).where(c(s(i.key,t),s(i.isCurrent,!0),$(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select({version:i.version,revision:i.revision}).from(i).where(c(s(i.key,t),s(i.isCurrent,!0)))).limit(1).run();if(l.rows.length>0){const m=l.rows[0];return{version:m.version||null,revision:m.revision||null}}return null}#i(t){return e`
|
|
36
36
|
COALESCE(
|
|
37
37
|
(
|
|
38
38
|
SELECT json_group_array(
|
|
@@ -109,4 +109,4 @@ import{and as c,desc as H,eq as s,notExists as v,sql as e}from"drizzle-orm";impo
|
|
|
109
109
|
),
|
|
110
110
|
json_array()
|
|
111
111
|
)
|
|
112
|
-
`}}export{
|
|
112
|
+
`}}export{U as CatalogEntitiesBffRepository};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{and as l,count as L,eq as n,isNotNull as v,notExists as E,or as D,sql as e}from"drizzle-orm";import{unionAll as f}from"drizzle-orm/sqlite-core";import{logger as b}from"../../../../../tools/notifiers/logger.js";import{VERSION_NOT_SPECIFIED as
|
|
1
|
+
import{and as l,count as L,eq as n,isNotNull as v,notExists as E,or as D,sql as e}from"drizzle-orm";import{unionAll as f}from"drizzle-orm/sqlite-core";import{logger as b}from"../../../../../tools/notifiers/logger.js";import{VERSION_NOT_SPECIFIED as k}from"@redocly/theme/core/constants";import{applyPagination as S}from"../../../../../providers/database/pagination/index.js";import{FIELDS_TO_SELECT_FOR_ENTITY as c,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as m}from"../utils.js";import{createEntityReadModel as O}from"../../mappers/create-entity-read-model.js";import{createEntityRelation as C}from"../../mappers/create-entity-relation.js";import{entitiesTable as t}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as y}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{CatalogEntitiesRelationsRepository as I}from"./catalog-entities-relations-repository.js";import{CatalogEntitiesBffRepository as g}from"./catalog-entities-bff-repository.js";class j{#e;#t=void 0;#i;#s;constructor(i){this.#e=i,this.#i=new I(this.#e,this.#t||""),this.#s=new g(this.#e,this.#t||"")}async attachDatabase(i){this.#t!==i&&(this.#t=i,await this.#e.client.run(e`ATTACH DATABASE ${i} AS remote`),this.#i=new I(this.#e,i),this.#s=new g(this.#e,i))}async getEntities(i={}){const s=this.#t?f(this.#e.client.select(c).from(e`remote.entities`),this.#e.client.select(c).from(t).where(E(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(e`remote.key = ${t.key}`)))):this.#e.client.select(c).from(t),r=this.#e.client.select(c).from(s.as("combined_entities")),o=this.#e.client.select(c).from(s.as("combined_entities")).$dynamic(),_=S(o,{...i,limit:void 0,skip:void 0,after:void 0,before:void 0}),a=this.#e.client.$count(_),u=r.$dynamic(),d=i.limit||10,h=S(u,{...i,limit:d+1}),[T,N]=await Promise.all([h.run(),a]),p=T.rows,w=p.length>d;return{items:p.slice(0,d).map(R=>O(R)).filter(R=>R!==null),hasMore:w,total:N}}async getEntityKeysAndVersionsBySourceFile(i){const s=this.#t?f(this.#e.client.select({keyVersion:e`key || ':' || COALESCE(version, ${k})`.as("keyVersion")}).from(e`remote.entities`).where(l(e`source_file = ${i}`,e`source = 'file'`,e`key IS NOT NULL`)),this.#e.client.select({keyVersion:e`${t.key} || ':' || COALESCE(${t.version}, ${k})`.as("keyVersion")}).from(t).where(l(n(t.sourceFile,i),n(t.source,"file"),e`${t.key} IS NOT NULL`,E(this.#e.client.select({key:e.raw("key")}).from(e`remote.entities as remote`).where(e`remote.key = ${t.key}`))))):this.#e.client.select({keyVersion:e`${t.key} || ':' || COALESCE(${t.version}, ${k})`.as("keyVersion")}).from(t).where(l(n(t.sourceFile,i),n(t.source,"file"),v(t.key))),r=await this.#e.client.selectDistinct({keyVersion:e`combined_keys_versions.keyVersion`}).from(s.as("combined_keys_versions")).run();return new Set(r.rows.map(o=>o.keyVersion))}async listEntityRevisions(i,s){const r=[n(t.key,i),n(t.isDeleted,!1),...s?[n(t.version,s)]:[]],o=this.#t?f(this.#e.client.select({version:e.raw("version"),revision:e.raw("revision"),isCurrent:e.raw("is_current"),createdAt:e.raw("created_at"),updatedAt:e.raw("updated_at"),isDefaultVersion:e.raw("is_default_version")}).from(e`remote.entities`).where(l(e`key = ${i}`,s?e`version = ${s}`:void 0)),this.#e.client.select({version:t.version,revision:t.revision,isCurrent:t.isCurrent,createdAt:t.createdAt,updatedAt:t.updatedAt,isDefaultVersion:t.isDefaultVersion}).from(t).where(l(...r,E(this.#e.client.select({version:e.raw("version")}).from(e`remote.entities as remote`).where(l(e`remote.key = ${t.key}`,e`remote.version = ${t.version}`,e`remote.revision = ${t.revision}`)))))):this.#e.client.select({version:t.version,revision:t.revision,isCurrent:t.isCurrent,createdAt:t.createdAt,updatedAt:t.updatedAt,isDefaultVersion:t.isDefaultVersion}).from(t).where(l(...r));return(await this.#e.client.select({version:e.raw("version"),revision:e.raw("revision"),isCurrent:e.raw("is_current"),createdAt:e.raw("created_at"),updatedAt:e.raw("updated_at"),isDefaultVersion:e.raw("is_default_version")}).from(o.as("combined_revisions")).orderBy(e.raw("is_current DESC"),e.raw("updated_at DESC"),e.raw("created_at DESC")).run()).rows.map(a=>({version:a.version||null,revision:a.revision??"",isCurrent:a.is_current!==null?!!a.is_current:!1,createdAt:a.created_at||null,updatedAt:a.updated_at||null,isDefaultVersion:a.is_default_version!==null?!!a.is_default_version:!1}))}async getEntitiesCountByTypes(){const i=this.#t?f(this.#e.client.select({type:e`type`}).from(e`remote.entities`).where(l(n(e.raw("is_current"),1),n(e.raw("is_deleted"),!1))),this.#e.client.select({type:t.type}).from(t).where(l(n(t.isCurrent,!0),n(t.isDeleted,!1),E(this.#e.client.select({id:e.raw("id")}).from(e`remote.entities as remote`).where(l(e`remote.key = ${t.key}`,e`remote.is_current = 1`)))))):this.#e.client.select({type:t.type}).from(t).where(l(n(t.isCurrent,!0),n(t.isDeleted,!1)));return this.#e.client.select({type:t.type,count:L()}).from(i.as("combined_entities")).groupBy(t.type).where(n(t.isDeleted,!1))}async getEntityByKey(i){const o=(await(this.#t?f(this.#e.client.select(c).from(e`remote.entities`).where(l(n(t.key,i),n(e.raw("is_current"),1),n(e.raw("is_deleted"),!1))),this.#e.client.select(c).from(t).where(l(n(t.key,i),n(t.isCurrent,!0),n(t.isDeleted,!1),E(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(l(e`remote.key = ${t.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(c).from(t).where(l(n(t.key,i),n(t.isCurrent,!0),n(t.isDeleted,!1)))).run()).rows[0];return o?O(o):null}async getOneOutdatedEntity(){const i=this.#t?f(this.#e.client.select(c).from(e`remote.entities`),this.#e.client.select(c).from(t).where(E(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(e`remote.key = ${t.key}`)))):this.#e.client.select(c).from(t),r=(await this.#e.client.select(c).from(i.as("combined_entities")).where(D(e`combined_entities.scorecards_status = 'OUTDATED'`,e`combined_entities.scorecards_status IS NULL`)).orderBy(e`combined_entities.updated_at ASC`).limit(1).run()).rows[0];return r?O(r):null}async getEntitiesRelations(i={}){const s=this.#t?f(this.#e.client.select(m).from(e`remote.entities_relations`),this.#e.client.select(m).from(y).where(E(this.#e.client.select({id:m.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${y.sourceKey}`)))):this.#e.client.select(m).from(y),r=this.#e.client.select(m).from(s.as("combined_entities_relations")).$dynamic(),o=this.#e.client.select(m).from(s.as("combined_entities_relations")).$dynamic(),_=S(o,{...i,limit:void 0,skip:void 0,after:void 0,before:void 0}),a=this.#e.client.$count(_),u=i.limit||10,d=S(r,{...i,limit:u+1}),[h,T]=await Promise.all([d.run(),a]),N=h.rows,p=N.length>u;return{items:N.slice(0,u).map(w=>C(w)).filter(w=>w!==null),hasMore:p,total:T}}async getEntityRelationById(i){const o=(await(this.#t?f(this.#e.client.select(m).from(e`remote.entities_relations`).where(n(y.id,i)),this.#e.client.select(m).from(y).where(l(n(y.id,i),E(this.#e.client.select({id:m.id}).from(e`remote.entities_relations as remote`).where(e`remote.id = ${y.id}`))))):this.#e.client.select(m).from(y).where(n(y.id,i))).run()).rows[0];return o?C(o):null}async getEntitiesWithRelations(i={}){return this.#s.getEntitiesWithRelations(i)}async getEntityWithRelationsByKey(i,s){return this.#s.getEntityWithRelationsByKey(i,s)}async getRelationsForEntity(i,s,r){return this.#i.getRelationsForEntity(i,s,r)}async getRelatedEntities(i,s={}){return this.#i.getRelatedEntities(i,s)}async getCatalogFilters({entitiesTypes:i=[],emptyFilters:s=[]}){if(!s.length)return{};try{return await this.#r(i),(s.includes("domains")||s.includes("owners"))&&await this.#n(),await this.#o(s)}catch(r){return console.error("Error fetching catalog filters:",r),{}}finally{await this.#l()}}async#r(i){if(this.#t?await this.#e.client.run(e`
|
|
2
2
|
CREATE TEMP TABLE IF NOT EXISTS temp_combined_entities AS
|
|
3
3
|
SELECT
|
|
4
4
|
e.key,
|
|
@@ -77,18 +77,13 @@ import{and as l,count as L,eq as n,isNotNull as v,notExists as E,or as D,sql as
|
|
|
77
77
|
AND tag.value != ''
|
|
78
78
|
GROUP BY tag.value
|
|
79
79
|
`),i.includes("domains")&&r.push(`
|
|
80
|
-
SELECT 'domains' as filter_name,
|
|
80
|
+
SELECT 'domains' as filter_name, tcr.source_key as value, COUNT(DISTINCT tfe.key) as count
|
|
81
81
|
FROM temp_combined_relations tcr
|
|
82
|
-
INNER JOIN temp_filtered_entities tfe ON
|
|
83
|
-
|
|
84
|
-
)
|
|
85
|
-
INNER JOIN temp_combined_entities tce ON (
|
|
86
|
-
(tfe.key = tcr.source_key AND tce.key = tcr.target_key)
|
|
87
|
-
OR
|
|
88
|
-
(tfe.key = tcr.target_key AND tce.key = tcr.source_key)
|
|
89
|
-
)
|
|
82
|
+
INNER JOIN temp_filtered_entities tfe ON tfe.key = tcr.target_key
|
|
83
|
+
INNER JOIN temp_combined_entities tce ON tce.key = tcr.source_key
|
|
90
84
|
WHERE tce.type = 'domain'
|
|
91
|
-
|
|
85
|
+
AND tcr.source_to_target_relation = 'hasParts'
|
|
86
|
+
GROUP BY tcr.source_key
|
|
92
87
|
`),i.includes("owners")&&r.push(`
|
|
93
88
|
SELECT 'owners' as filter_name, owner_key as value, COUNT(DISTINCT entity_key) as count
|
|
94
89
|
FROM (
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{logger as
|
|
1
|
+
import{logger as n}from"../../tools/notifiers/logger.js";import{DatabaseClient as g}from"./client.js";import{DatabasePathGenerator as p}from"./database-path-generator.js";import{retryAsyncOperation as f}from"./utils/retry-async-operation.js";import{SqldNotRunningError as d}from"./sqld-not-running-error.js";class R{async initialize({removeExisting:i,baseDbDir:a,runWithPragmaWalWriteOptimization:o,databaseName:s,additionalFolder:l,migrationsFolder:c}){n.info("Initializing local database client...");const m=n.startTiming(),{databasePath:r}=await p.prepareDatabasePath({baseDir:a,databaseName:s,additionalFolder:l,removeExisting:i}),t={url:`file:${r}`},e=await g.init(t,{runWithPragmaWalWriteOptimization:o});return await e.migrate(a,c),n.infoTime(m,"Local database client initialized"),{client:e,path:r}}}class x{#i;#t;constructor(i){this.#i=i?.skipLogs??!1,this.#t=this.#i?void 0:n}async initialize({removeExisting:i,baseDbDir:a,syncUrl:o,authToken:s,databaseName:l,additionalFolder:c,migrationsFolder:m}){this.#t?.info("Initializing remote database client...");const r=this.#t?.startTiming();return await f(async()=>{try{const{databasePath:t}=await p.prepareDatabasePath({baseDir:a,databaseName:l,additionalFolder:c,removeExisting:i}),e=await g.init({url:`file:${t}`,syncUrl:o,authToken:s});return await e.migrate(a,m),this.#t?.infoTime(r??"","Remote database client initialized"),{client:e,path:t}}catch(t){throw d.isSqldNotRunningError(t)?new d("SQLD server is not running yet, wait for production deployment",{cause:t}):t}},{maxRetries:3,retryStrategy:"exponential",delay:1e3,logger:this.#t,messages:{retry:"Retrying remote database client initialization",maxRetriesReached:"Max retries reached, remote database client initialization failed"}})}}export{R as LocalDatabaseInitializationStrategy,x as RemoteDatabaseInitializationStrategy};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class e extends Error{constructor(r,n){super(r,n),this.name="SqldNotRunningError"}static isSqldNotRunningError(r){return r instanceof Error?r.message.includes('CREATE TABLE IF NOT EXISTS "__drizzle_migrations"')||r.message.includes("sync error: connection error:"):!1}}export{e as SqldNotRunningError};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@redocly/realm",
|
|
3
|
-
"version": "0.129.
|
|
3
|
+
"version": "0.129.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"@opentelemetry/semantic-conventions": "1.34.0",
|
|
34
34
|
"@redocly/ajv": "8.17.1",
|
|
35
35
|
"@redocly/openapi-core": "2.14.3",
|
|
36
|
-
"@shikijs/transformers": "
|
|
36
|
+
"@shikijs/transformers": "3.21.0",
|
|
37
37
|
"@tanstack/react-query": "5.62.3",
|
|
38
38
|
"@tanstack/react-table": "8.21.3",
|
|
39
39
|
"@tanstack/react-virtual": "3.13.0",
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
"react-select": "5.10.1",
|
|
80
80
|
"reactjs-popup": "2.0.6",
|
|
81
81
|
"semver": "7.7.3",
|
|
82
|
-
"shiki": "
|
|
82
|
+
"shiki": "3.21.0",
|
|
83
83
|
"simple-git": "3.20.0",
|
|
84
84
|
"sitemap": "7.1.1",
|
|
85
85
|
"stream-http": "3.2.0",
|
|
@@ -93,14 +93,14 @@
|
|
|
93
93
|
"xml-crypto": "6.0.1",
|
|
94
94
|
"xpath": "0.0.34",
|
|
95
95
|
"yaml-ast-parser": "0.0.43",
|
|
96
|
+
"@redocly/asyncapi-docs": "1.6.1",
|
|
96
97
|
"@redocly/config": "0.41.2",
|
|
97
|
-
"@redocly/asyncapi-docs": "1.6.0",
|
|
98
|
-
"@redocly/openapi-docs": "3.17.0",
|
|
99
|
-
"@redocly/realm-asyncapi-sdk": "0.7.0",
|
|
100
|
-
"@redocly/theme": "0.61.0",
|
|
101
98
|
"@redocly/graphql-docs": "1.6.0",
|
|
102
|
-
"@redocly/
|
|
103
|
-
"@redocly/portal-legacy-ui": "0.12.0"
|
|
99
|
+
"@redocly/openapi-docs": "3.17.1",
|
|
100
|
+
"@redocly/portal-legacy-ui": "0.12.0",
|
|
101
|
+
"@redocly/portal-plugin-mock-server": "0.14.1",
|
|
102
|
+
"@redocly/realm-asyncapi-sdk": "0.7.0",
|
|
103
|
+
"@redocly/theme": "0.61.1"
|
|
104
104
|
},
|
|
105
105
|
"peerDependencies": {
|
|
106
106
|
"react": "19.2.3",
|