@redocly/revel-reef 0.128.0-next.8 → 0.128.0

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 (59) hide show
  1. package/CHANGELOG.md +98 -0
  2. package/dist/cli/prepare/analytics/collectors/get-config-stats-usage.js +1 -1
  3. package/dist/client/TestProvider.js +1 -1
  4. package/dist/client/app/hooks/index.d.ts +1 -0
  5. package/dist/client/app/hooks/index.js +1 -1
  6. package/dist/client/app/hooks/markdown/useMarkdownText.js +1 -1
  7. package/dist/client/app/hooks/useBanner.d.ts +8 -0
  8. package/dist/client/app/hooks/useBanner.js +1 -0
  9. package/dist/client/app/hooks/utils/match-banner-target.d.ts +10 -0
  10. package/dist/client/app/hooks/utils/match-banner-target.js +1 -0
  11. package/dist/client/app/search/useAiSearch.d.ts +1 -1
  12. package/dist/client/app/search/useAiSearch.js +1 -1
  13. package/dist/client/app/search/useSearch.d.ts +1 -1
  14. package/dist/client/app/search/useSearch.js +1 -1
  15. package/dist/client/providers/theme/ThemeDataProvider.js +1 -1
  16. package/dist/config/product-gates.d.ts +1 -0
  17. package/dist/config/product-gates.js +1 -1
  18. package/dist/constants/common.d.ts +1 -0
  19. package/dist/constants/common.js +1 -1
  20. package/dist/server/api-routes/execute-api-route.js +1 -1
  21. package/dist/server/api-routes/helpers/enhance-context.d.ts +2 -2
  22. package/dist/server/api-routes/helpers/enhance-context.js +1 -1
  23. package/dist/server/persistence/cache/repositories/cache-local-repository.d.ts +2 -2
  24. package/dist/server/persistence/cache/repositories/cache-local-repository.js +1 -1
  25. package/dist/server/persistence/file-hashes/repositories/file-hashes-local-repository.d.ts +2 -2
  26. package/dist/server/persistence/file-hashes/repositories/file-hashes-local-repository.js +1 -1
  27. package/dist/server/persistence/kv/repositories/kv-remote-repository.d.ts +3 -3
  28. package/dist/server/persistence/kv/repositories/kv-remote-repository.js +1 -1
  29. package/dist/server/persistence/kv/services/kv-service.d.ts +1 -1
  30. package/dist/server/persistence/kv/services/kv-service.js +1 -1
  31. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +1 -1
  32. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
  33. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +3 -3
  34. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +1 -1
  35. package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.d.ts +4 -4
  36. package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.js +1 -1
  37. package/dist/server/plugins/config-parser/loaders/redocly-config-loader.js +1 -1
  38. package/dist/server/providers/database/base-repository.d.ts +2 -2
  39. package/dist/server/providers/database/base-repository.js +1 -1
  40. package/dist/server/providers/database/constants.d.ts +7 -4
  41. package/dist/server/providers/database/constants.js +1 -1
  42. package/dist/server/providers/database/database-connection-factory.d.ts +6 -0
  43. package/dist/server/providers/database/database-connection-factory.js +1 -0
  44. package/dist/server/providers/database/database-connections-manager.d.ts +3 -3
  45. package/dist/server/providers/database/database-connections-manager.js +1 -1
  46. package/dist/server/providers/database/database-initialization-strategy.d.ts +4 -10
  47. package/dist/server/providers/database/database-initialization-strategy.js +1 -1
  48. package/dist/server/providers/database/database-preconnect-service.js +1 -1
  49. package/dist/server/providers/database/databases/catalog-sqlite/drizzle.config.js +1 -1
  50. package/dist/server/providers/database/databases/sqld-sqlite/drizzle.config.js +1 -1
  51. package/dist/server/providers/database/types.d.ts +11 -6
  52. package/dist/server/ssr/server-side-props/get-server-props-from-user-handler.js +1 -1
  53. package/dist/server/types/plugins/api-functions.d.ts +1 -1
  54. package/dist/types/entitlements.d.ts +1 -0
  55. package/package.json +14 -14
  56. package/dist/server/constants/sqld-remote-database.d.ts +0 -4
  57. package/dist/server/constants/sqld-remote-database.js +0 -1
  58. package/dist/server/plugins/catalog-entities/database/consts.d.ts +0 -4
  59. package/dist/server/plugins/catalog-entities/database/consts.js +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,103 @@
1
1
  # @redocly/revel-reef
2
2
 
3
+ ## 0.128.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 5cd6434fa4: Excluded pages from sitemaps if they are excluded from search.
8
+ - 56a8a6aac2: Added a `banner` component to display announcements on project pages.
9
+ - 237fb38fca: Added search and curation support for `React` pages.
10
+ - c79fd3ad50: Added support for downloading API description files up to 15MB.
11
+
12
+ ### Patch Changes
13
+
14
+ - 08277191f1: The **Connect to MCP** page action option does not display when the MCP server is not available.
15
+ - 6e7c28d09b: Fixed an issue where items from different versions appeared simultaneously in the sidebar when using `$ref` in `sidebars.yaml`.
16
+ - 39df6e65ff: Fixed an issue where the AI Search form unintentionally submitted during text entry in Japanese.
17
+ - 66df36d54c: Fixed incorrect application of `rel="noreferrer"` on internal links.
18
+ - 11e1e54493: Fixed an issue where the `Ask AI` button overlapped code examples.
19
+ - 64473dfcb8: Fixed scorecard badge linking to a non-existent page when multiple catalogs were defined.
20
+ - a363284ccb: Fixed an issue where versioned API descriptions appeared multiple times in the classic catalog.
21
+ - f4ee4e345b: Fixed security vulnerability in CORS middleware by upgrading `hono` to v4.10.6.
22
+ - 06be686455: Fixed an issue where scorecard didn't work for projects with path prefix.
23
+ - 6e7c28d09b: Fixed an issue where switching versions at the project root redirected to the first sidebar page instead of the current one.
24
+ - Updated dependencies [08277191f1]
25
+ - Updated dependencies [39df6e65ff]
26
+ - Updated dependencies [e1eaa83a71]
27
+ - Updated dependencies [898c2db9d1]
28
+ - Updated dependencies [98f5cce261]
29
+ - Updated dependencies [56a8a6aac2]
30
+ - Updated dependencies [4849bbfbae]
31
+ - Updated dependencies [4c03b9e504]
32
+ - Updated dependencies [66df36d54c]
33
+ - Updated dependencies [38790e9d0d]
34
+ - Updated dependencies [18cb20de60]
35
+ - Updated dependencies [11e1e54493]
36
+ - Updated dependencies [eaea96e6c9]
37
+ - Updated dependencies [ca48d4ee2d]
38
+ - Updated dependencies [b25647c63a]
39
+ - Updated dependencies [5a5c4ecb7b]
40
+ - Updated dependencies [bc191c239c]
41
+ - @redocly/theme@0.60.0
42
+ - @redocly/portal-plugin-mock-server@0.13.0
43
+ - @redocly/openapi-docs@3.16.0
44
+ - @redocly/asyncapi-docs@1.5.0
45
+ - @redocly/graphql-docs@1.5.0
46
+ - @redocly/portal-legacy-ui@0.11.0
47
+ - @redocly/realm-asyncapi-sdk@0.6.0
48
+
49
+ ## 0.128.0-next.12
50
+
51
+ ### Patch Changes
52
+
53
+ - Updated dependencies [46b6ce6c79]
54
+ - @redocly/theme@0.60.0-next.8
55
+ - @redocly/asyncapi-docs@1.5.0-next.12
56
+ - @redocly/graphql-docs@1.5.0-next.1
57
+ - @redocly/openapi-docs@3.16.0-next.12
58
+ - @redocly/portal-plugin-mock-server@0.13.0-next.12
59
+
60
+ ## 0.128.0-next.11
61
+
62
+ ### Patch Changes
63
+
64
+ - 6c86ae4655: Updated `@redocly/openapi-core` to version `2.12.3`.
65
+ - Updated dependencies [190f5656a7]
66
+ - Updated dependencies [6c86ae4655]
67
+ - @redocly/realm-asyncapi-sdk@0.6.0-next.2
68
+ - @redocly/openapi-docs@3.16.0-next.11
69
+ - @redocly/theme@0.60.0-next.7
70
+ - @redocly/asyncapi-docs@1.5.0-next.11
71
+ - @redocly/portal-plugin-mock-server@0.13.0-next.11
72
+
73
+ ## 0.128.0-next.10
74
+
75
+ ### Minor Changes
76
+
77
+ - 56a8a6aac2: Added a `banner` component to display announcements on project pages.
78
+
79
+ ### Patch Changes
80
+
81
+ - Updated dependencies [56a8a6aac2]
82
+ - @redocly/theme@0.60.0-next.7
83
+ - @redocly/asyncapi-docs@1.5.0-next.10
84
+ - @redocly/graphql-docs@1.5.0-next.1
85
+ - @redocly/openapi-docs@3.16.0-next.10
86
+ - @redocly/portal-plugin-mock-server@0.13.0-next.10
87
+
88
+ ## 0.128.0-next.9
89
+
90
+ ### Patch Changes
91
+
92
+ - 39df6e65ff: Fixed an issue where the AI Search form submitted during mid-Japanese input.
93
+ - Updated dependencies [39df6e65ff]
94
+ - Updated dependencies [bc191c239c]
95
+ - @redocly/theme@0.60.0-next.6
96
+ - @redocly/openapi-docs@3.16.0-next.9
97
+ - @redocly/asyncapi-docs@1.5.0-next.9
98
+ - @redocly/graphql-docs@1.5.0-next.1
99
+ - @redocly/portal-plugin-mock-server@0.13.0-next.9
100
+
3
101
  ## 0.128.0-next.8
4
102
 
5
103
  ### Minor Changes
@@ -1 +1 @@
1
- import{loadConfig as r}from"@redocly/openapi-core";import a from"node:path";import{access as e}from"node:fs/promises";import{CONFIG_FILE_NAME as i}from"../../../../constants/common.js";import{getPortalConfigStats as s}from"../../../telemetry/get-portal-config-stats.js";const p=async({context:o})=>{const t=a.join(o.fs.cwd,i),n=await f(t);return{version:"2",name:"buildContext",value:s(n)}};async function f(o){try{await e(o)}catch{return{}}const{resolvedConfig:t}=await r({configPath:o});return t}export{p as getConfigStatsUsage};
1
+ import{loadConfig as r}from"@redocly/openapi-core";import a from"node:path";import{access as i}from"node:fs/promises";import{CONFIG_FILE_NAME as e}from"../../../../constants/common.js";import{getPortalConfigStats as c}from"../../../telemetry/get-portal-config-stats.js";const C=async({context:t})=>{const o=a.join(t.fs.cwd,e),n=await f(o);return{version:"2",name:"buildContext",value:c(n)}};async function f(t){try{await i(t)}catch{return{}}const o=await r({configPath:t});return o.document?.parsed||o.resolvedConfig}export{C as getConfigStatsUsage};
@@ -1 +1 @@
1
- import t from"react";import{BrowserRouter as o}from"react-router-dom";import{ThemeDataContext as n}from"@redocly/theme/core/contexts";import i from"@redocly/theme/core/templates/Markdown";import{useBreadcrumbs as u,useCatalogClassic as m,useCurrentProduct as d,useGlobalData as l,useI18n as p,useI18nConfig as c,useL10n as g,useL10nConfig as h,usePageData as f,usePageSharedData as b,usePageVersions as T,usePreloadHistory as C,useProducts as k,useUserMenu as w,useSubmitFeedback as v,useTranslate as D,useSidebarSiblingsData as P,usePageProps as y,useUserTeams as S,useMarkdownText as $,useCodeHighlight as E,useLoadAndNavigate as I,useCatalog as L,useCatalogSort as x,useCatalogSearch as H,useFetchCatalogEntities as M,useFetchCatalogEntitiesRelations as F,useTelemetry as r,useMcpData as A}from"./app/hooks";import{Link as R}from"./app/Link";import{useFacetQuery as B,useSearch as G,useAiSearch as O}from"./app/search";import{useSidebarItems as U}from"./app/Sidebar/useSidebarItems";import{PageDataContext as N}from"./providers/page-data/PageDataContext";const s={Template:({pageProps:e,children:a})=>t.createElement(i,{pageProps:{...e,metadata:{...e.metadata,markdoc:{tagList:[]}}}},a),templateId:"markdown",isPublic:!0,props:{seo:{title:"Test"},ast:{$$mdtype:"Tag",name:"div",children:[{$$mdtype:"Tag",name:"Heading",attributes:{id:"github-flavored-markdown",level:1},children:["GitHub-flavored markdown"]},{$$mdtype:"Tag",name:"p",attributes:{},children:["These exercises assume you have",{$$mdtype:"Tag",name:"a",attributes:{href:"https://docs.redoc.ly/"},children:["basic markdown knowledge"]},"."]},{$$mdtype:"Tag",name:"Heading",attributes:{id:"create-a-new-plain-markdown-page",level:2},children:["Create a new plain markdown page"]}]},lastModified:new Date("2022-01-01").toISOString()},slug:"",userData:{isAuthenticated:!1,name:"test name",picture:""},sidebar:null,sharedData:{},sharedDataIds:{}},Q={useBreadcrumbs:u,useCatalog:L,useCatalogSort:x,useCatalogSearch:H,useFetchCatalogEntities:M,useFetchCatalogEntitiesRelations:F,useCatalogClassic:m,useCurrentProduct:d,useGlobalData:l,useSearch:G,useAiSearch:O,useFacetQuery:B,useI18n:p,useI18nConfig:c,useL10n:g,useL10nConfig:h,usePageData:f,usePageSharedData:b,usePageVersions:T,usePreloadHistory:C,useProducts:k,useUserMenu:w,useSidebarItems:U,useSidebarSiblingsData:P,useSubmitFeedback:v,useTranslate:D,useUserTeams:S,usePageProps:y,useMarkdownText:$,useCodeHighlight:E,useLoadAndNavigate:I,useTelemetry:r,useOtelTelemetry:r,useMcpData:A},V={LinkComponent:R},j={hooks:Q,components:V,config:{}};function ee({children:e,customPageData:a}){return t.createElement(o,null,t.createElement(N.Provider,{value:{...s,...a,props:{...s.props,...a?.props}}},t.createElement(n.Provider,{value:j},e)))}export{ee as TestProvider};
1
+ import e from"react";import{BrowserRouter as o}from"react-router-dom";import{ThemeDataContext as n,SearchSessionProvider as i}from"@redocly/theme/core/contexts";import u from"@redocly/theme/core/templates/Markdown";import{useBreadcrumbs as m,useBanner as d,useCatalogClassic as l,useCurrentProduct as c,useGlobalData as p,useI18n as g,useI18nConfig as h,useL10n as f,useL10nConfig as b,usePageData as T,usePageSharedData as C,usePageVersions as k,usePreloadHistory as v,useProducts as w,useUserMenu as P,useSubmitFeedback as S,useTranslate as D,useSidebarSiblingsData as y,usePageProps as $,useUserTeams as E,useMarkdownText as I,useCodeHighlight as L,useLoadAndNavigate as x,useCatalog as H,useCatalogSort as M,useCatalogSearch as F,useFetchCatalogEntities as A,useFetchCatalogEntitiesRelations as B,useTelemetry as r,useMcpData as R}from"./app/hooks";import{Link as G}from"./app/Link";import{useFacetQuery as O,useSearch as U,useAiSearch as N}from"./app/search";import{useSidebarItems as Q}from"./app/Sidebar/useSidebarItems";import{PageDataContext as V}from"./providers/page-data/PageDataContext";const s={Template:({pageProps:a,children:t})=>e.createElement(u,{pageProps:{...a,metadata:{...a.metadata,markdoc:{tagList:[]}}}},t),templateId:"markdown",isPublic:!0,props:{seo:{title:"Test"},ast:{$$mdtype:"Tag",name:"div",children:[{$$mdtype:"Tag",name:"Heading",attributes:{id:"github-flavored-markdown",level:1},children:["GitHub-flavored markdown"]},{$$mdtype:"Tag",name:"p",attributes:{},children:["These exercises assume you have",{$$mdtype:"Tag",name:"a",attributes:{href:"https://docs.redoc.ly/"},children:["basic markdown knowledge"]},"."]},{$$mdtype:"Tag",name:"Heading",attributes:{id:"create-a-new-plain-markdown-page",level:2},children:["Create a new plain markdown page"]}]},lastModified:new Date("2022-01-01").toISOString()},slug:"",userData:{isAuthenticated:!1,name:"test name",picture:""},sidebar:null,sharedData:{},sharedDataIds:{}},j={useBreadcrumbs:m,useBanner:d,useCatalog:H,useCatalogSort:M,useCatalogSearch:F,useFetchCatalogEntities:A,useFetchCatalogEntitiesRelations:B,useCatalogClassic:l,useCurrentProduct:c,useGlobalData:p,useSearch:U,useAiSearch:N,useFacetQuery:O,useI18n:g,useI18nConfig:h,useL10n:f,useL10nConfig:b,usePageData:T,usePageSharedData:C,usePageVersions:k,usePreloadHistory:v,useProducts:w,useUserMenu:P,useSidebarItems:Q,useSidebarSiblingsData:y,useSubmitFeedback:S,useTranslate:D,useUserTeams:E,usePageProps:$,useMarkdownText:I,useCodeHighlight:L,useLoadAndNavigate:x,useTelemetry:r,useOtelTelemetry:r,useMcpData:R},q={LinkComponent:G},z={hooks:j,components:q,config:{}};function te({children:a,customPageData:t}){return e.createElement(o,null,e.createElement(i,null,e.createElement(V.Provider,{value:{...s,...t,props:{...s.props,...t?.props}}},e.createElement(n.Provider,{value:z},a))))}export{te as TestProvider};
@@ -14,6 +14,7 @@ export { useUserMenu } from '../UserMenu/useUserMenu';
14
14
  export { useSubmitFeedback } from '../Feedback/useSubmitFeedback';
15
15
  export { usePreloadHistory } from '../usePreloadHistory';
16
16
  export { useBreadcrumbs } from '../Sidebar/useBreadcrumbs';
17
+ export { useBanner } from './useBanner';
17
18
  export { useCatalog } from './catalog/useCatalog';
18
19
  export { useCatalogSort } from './catalog/useCatalogSort';
19
20
  export { useCatalogSearch } from './catalog/useCatalogSearch';
@@ -1 +1 @@
1
- export*from"../../providers/page-data/hooks";import{usePageSharedData as t}from"../../providers/hooks";import{useLoginUrl as a}from"./useLoginUrl";import{useGlobalData as f}from"../useGlobalData";import{useL10n as p}from"../l10n/hooks";import{useL10nConfig as n}from"./useL10nConfig";import{useL10n as l}from"../l10n/hooks";import{useTranslate as C}from"../l10n/hooks";import{useL10nConfig as c}from"./useL10nConfig";export*from"./useCurrentUserTeams";export*from"./products";import{usePageVersions as S}from"../../providers/page-data/hooks";import{useUserMenu as U}from"../UserMenu/useUserMenu";import{useSubmitFeedback as F}from"../Feedback/useSubmitFeedback";import{usePreloadHistory as P}from"../usePreloadHistory";import{useBreadcrumbs as y}from"../Sidebar/useBreadcrumbs";import{useCatalog as H}from"./catalog/useCatalog";import{useCatalogSort as v}from"./catalog/useCatalogSort";import{useCatalogSearch as A}from"./catalog/useCatalogSearch";import{useFetchCatalogEntities as G}from"./catalog/useFetchCatalogEntities";import{useFetchCatalogEntitiesRelations as R}from"./catalog/useFetchCatalogEntitiesRelations";import{useCatalogClassic as j}from"./catalog/useCatalogClassic";import{useTelemetry as z}from"./useTelemetry";import{useUserTeams as K}from"./useUserTeams";import{useMarkdownText as Q}from"./markdown/useMarkdownText";import{useCodeHighlight as X}from"./codeHighlight/useCodeHighlight";import{useLoadAndNavigate as Z}from"./useLoadAndNavigate";import{useUserClaims as $}from"./useUserClaims";import{useMcpData as oe}from"./useMcpData";export{y as useBreadcrumbs,H as useCatalog,j as useCatalogClassic,A as useCatalogSearch,v as useCatalogSort,X as useCodeHighlight,G as useFetchCatalogEntities,R as useFetchCatalogEntitiesRelations,f as useGlobalData,p as useI18n,n as useI18nConfig,l as useL10n,c as useL10nConfig,Z as useLoadAndNavigate,a as useLoginUrl,Q as useMarkdownText,oe as useMcpData,t as usePageSharedData,S as usePageVersions,P as usePreloadHistory,F as useSubmitFeedback,z as useTelemetry,C as useTranslate,$ as useUserClaims,U as useUserMenu,K as useUserTeams};
1
+ export*from"../../providers/page-data/hooks";import{usePageSharedData as t}from"../../providers/hooks";import{useLoginUrl as a}from"./useLoginUrl";import{useGlobalData as f}from"../useGlobalData";import{useL10n as p}from"../l10n/hooks";import{useL10nConfig as n}from"./useL10nConfig";import{useL10n as l}from"../l10n/hooks";import{useTranslate as C}from"../l10n/hooks";import{useL10nConfig as c}from"./useL10nConfig";export*from"./useCurrentUserTeams";export*from"./products";import{usePageVersions as S}from"../../providers/page-data/hooks";import{useUserMenu as U}from"../UserMenu/useUserMenu";import{useSubmitFeedback as F}from"../Feedback/useSubmitFeedback";import{usePreloadHistory as P}from"../usePreloadHistory";import{useBreadcrumbs as y}from"../Sidebar/useBreadcrumbs";import{useBanner as E}from"./useBanner";import{useCatalog as I}from"./catalog/useCatalog";import{useCatalogSort as w}from"./catalog/useCatalogSort";import{useCatalogSearch as G}from"./catalog/useCatalogSearch";import{useFetchCatalogEntities as R}from"./catalog/useFetchCatalogEntities";import{useFetchCatalogEntitiesRelations as j}from"./catalog/useFetchCatalogEntitiesRelations";import{useCatalogClassic as z}from"./catalog/useCatalogClassic";import{useTelemetry as K}from"./useTelemetry";import{useUserTeams as Q}from"./useUserTeams";import{useMarkdownText as X}from"./markdown/useMarkdownText";import{useCodeHighlight as Z}from"./codeHighlight/useCodeHighlight";import{useLoadAndNavigate as $}from"./useLoadAndNavigate";import{useUserClaims as oe}from"./useUserClaims";import{useMcpData as te}from"./useMcpData";export{E as useBanner,y as useBreadcrumbs,I as useCatalog,z as useCatalogClassic,G as useCatalogSearch,w as useCatalogSort,Z as useCodeHighlight,R as useFetchCatalogEntities,j as useFetchCatalogEntitiesRelations,f as useGlobalData,p as useI18n,n as useI18nConfig,l as useL10n,c as useL10nConfig,$ as useLoadAndNavigate,a as useLoginUrl,X as useMarkdownText,te as useMcpData,t as usePageSharedData,S as usePageVersions,P as usePreloadHistory,F as useSubmitFeedback,K as useTelemetry,C as useTranslate,oe as useUserClaims,U as useUserMenu,Q as useUserTeams};
@@ -1 +1 @@
1
- import u,{useMemo as h}from"react";import{parse as p,transform as m,renderers as b,Tag as g,nodes as d}from"@markdoc/markdoc";import{CodeBlock as k}from"@redocly/theme/components/CodeBlock/CodeBlock";const y=t=>/\{%\s*(?:\/?\w+(?:-\w+)*|\/)(?:\s+[^%]+)?\s*(?:\/%|%\})/.test(t),C=(t,e)=>{try{const r=m(t,e);return Array.isArray(r)?r:[r]}catch(r){console.error("Error transforming node:",r)}return[]},l=(t,e,r,n)=>new g("CodeBlock",{...t,header:{title:n,controls:{copy:{}}},source:e,lang:r},[]),N=(t,e)=>{const r=t.transformAttributes(e),n=r["data-language"]||"markdoc",c=r["data-title"],o=t.attributes.content||"",a=l(r,o,n,c),s=[];if(!t.children||t.children.length<=1)return{codeNode:a,contentNodes:s};for(const i of t.children){if(!i)continue;const f=C(i,e);s.push(...f)}return{codeNode:a,contentNodes:s}},w=(t,e)=>{const r=t.transformAttributes(e),n=r["data-language"],c=r["data-title"],o=t.attributes.content||"";if(!y(o)||!t.children||t.children.length===0)return l(r,o,n,c);const a=t.children[0];if(!a||a.type!=="tag")return l(r,o,n,c);const{codeNode:s,contentNodes:i}=N(t,e);return new g("Fragment",{},[s,...i])},B=t=>h(()=>{if(!t)return null;const r=p(t),n=m(r,{nodes:{document:{...d.document,render:"div"},fence:{...d.fence,attributes:{...d.fence.attributes,label:{type:String,render:"data-label"},title:{type:String,render:"data-title"},highlight:{type:String,render:"data-highlight"}},transform:w}}});return b.react(n,u,{components:{CodeBlock:k,Fragment:u.Fragment}})},[t]);export{y as containsMarkdocTags,B as useMarkdownText};
1
+ import m,{useMemo as h}from"react";import{parse as p,transform as u,renderers as b,Tag as g,nodes as d}from"@markdoc/markdoc";import{CodeBlock as k}from"@redocly/theme/components/CodeBlock/CodeBlock";import{tags as C,components as y}from"@redocly/theme/markdoc/default";const N=Object.fromEntries(Object.entries(y).filter(([,t])=>typeof t=="function")),T=t=>/\{%\s*(?:\/?\w+(?:-\w+)*|\/)(?:\s+[^%]+)?\s*(?:\/%|%\})/.test(t),w=(t,e)=>{try{const r=u(t,e);return Array.isArray(r)?r:[r]}catch(r){console.error("Error transforming node:",r)}return[]},l=(t,e,r,n)=>new g("CodeBlock",{...t,header:{title:n,controls:{copy:{}}},source:e,lang:r},[]),A=(t,e)=>{const r=t.transformAttributes(e),n=r["data-language"]||"markdoc",c=r["data-title"],o=t.attributes.content||"",a=l(r,o,n,c),s=[];if(!t.children||t.children.length<=1)return{codeNode:a,contentNodes:s};for(const i of t.children){if(!i)continue;const f=w(i,e);s.push(...f)}return{codeNode:a,contentNodes:s}},F=(t,e)=>{const r=t.transformAttributes(e),n=r["data-language"],c=r["data-title"],o=t.attributes.content||"";if(!T(o)||!t.children||t.children.length===0)return l(r,o,n,c);const a=t.children[0];if(!a||a.type!=="tag")return l(r,o,n,c);const{codeNode:s,contentNodes:i}=A(t,e);return new g("Fragment",{},[s,...i])},x=t=>h(()=>{if(!t)return null;const r=p(t),n=u(r,{tags:C,nodes:{document:{...d.document,render:"div"},fence:{...d.fence,attributes:{...d.fence.attributes,label:{type:String,render:"data-label"},title:{type:String,render:"data-title"},highlight:{type:String,render:"data-highlight"}},transform:F}}});return b.react(n,m,{components:{...N,CodeBlock:k,Fragment:m.Fragment}})},[t]);export{T as containsMarkdocTags,x as useMarkdownText};
@@ -0,0 +1,8 @@
1
+ import type { BannerConfig } from '@redocly/config';
2
+ type BannerResult = {
3
+ banner: BannerConfig | undefined;
4
+ dismissBanner: (content: string) => void;
5
+ };
6
+ export declare function useBanner(): BannerResult;
7
+ export {};
8
+ //# sourceMappingURL=useBanner.d.ts.map
@@ -0,0 +1 @@
1
+ import{useMemo as g,useState as f,useEffect as l}from"react";import{useLocation as p}from"react-router-dom";import{useThemeConfig as y}from"@redocly/theme/core/hooks";import{usePageData as A}from"../../providers/page-data/hooks";import{getBannerForSlug as w}from"./utils/match-banner-target.js";const c="redocly-dismissed-banners",u="redocly-dismissed-banners-per-slug";function N(){const{banner:s}=y()||{},t=A()?.props?.frontmatter?.banner,S=p(),[o,d]=f(new Set),[i,m]=f(new Set);l(()=>{const r=localStorage.getItem(c),n=localStorage.getItem(u);if(r){const e=JSON.parse(r);Array.isArray(e)&&d(new Set(e))}if(n){const e=JSON.parse(n);Array.isArray(e)&&m(new Set(e))}},[]);const a=S.pathname;return{banner:g(()=>{if(t&&Array.isArray(t)&&t.length){if(i.has(a))return;for(const r of t)if(!o.has(r.content))return r;return}if(!(!s||!Array.isArray(s)||s.length===0)&&!i.has(a))return w(s,a,o)},[s,t,a,o,i]),dismissBanner:r=>{const n=new Set(o);n.add(r),d(n);const e=new Set(i);e.add(a),m(e),localStorage.setItem(c,JSON.stringify(Array.from(n))),localStorage.setItem(u,JSON.stringify(Array.from(e)))}}}export{N as useBanner};
@@ -0,0 +1,10 @@
1
+ import type { BannerConfig } from '@redocly/config';
2
+ /**
3
+ * Checks if a slug matches a target pattern
4
+ */
5
+ export declare function matchesBannerTarget(slug: string, target: string | undefined): boolean;
6
+ /**
7
+ * Returns the first matching banner for a slug, or undefined if none match
8
+ */
9
+ export declare function getBannerForSlug(banners: BannerConfig[], slug: string, dismissedBanners?: Set<string>): BannerConfig | undefined;
10
+ //# sourceMappingURL=match-banner-target.d.ts.map
@@ -0,0 +1 @@
1
+ import a from"picomatch";import{removeTrailingSlash as s}from"../../../../utils/url/remove-trailing-slash";import{normalizeRouteSlug as f}from"../../../../utils/path/normalize-route-slug";const u={};function c(t){if(!t)return!0;const r=t.trim();return r===""||r==="**"||r==="/**"}function l(t){const r=t.trim();if(c(r))return"**";let e=r.toLowerCase();return e.startsWith("/")&&(e=e.slice(1)),e.endsWith("/")&&!e.endsWith("*/")&&(e=e.slice(0,-1)),e}function m(t){return u[t]||(u[t]=a(t,{nocase:!0})),u[t]}function h(t,r){if(c(r)||!r)return!0;const e=s(f(t)).toLowerCase(),n=e.startsWith("/")?e.slice(1):e,i=l(r);if(!i.includes("*")){const o=i.startsWith("/")?i.slice(1):i;return n===s(o)}if(i.endsWith("**")){const o=s(i.slice(0,-2));if(n===o)return!0}return m(i)(n)}function S(t,r,e=new Set){if(!(!t||t.length===0)){for(const n of t)if(!e.has(n.content)&&h(r,n.target))return n}}export{S as getBannerForSlug,h as matchesBannerTarget};
@@ -3,7 +3,7 @@ import { AiSearchError } from '@redocly/theme/core/constants';
3
3
  type AiSearchOptions = {
4
4
  filter?: SearchFilterItem[];
5
5
  };
6
- export declare function useAiSearch(options?: AiSearchOptions, searchSessionId?: string): {
6
+ export declare function useAiSearch(options?: AiSearchOptions): {
7
7
  askQuestion: (question: string, history?: AiSearchConversationItem[]) => Promise<void>;
8
8
  isGeneratingResponse: boolean;
9
9
  response: string | undefined;
@@ -1 +1 @@
1
- import{useCallback as w,useState as o}from"react";import{AiSearchError as c}from"@redocly/theme/core/constants";import{withPathPrefix as K}from"@redocly/theme/core/utils";import{ServerRoutes as L}from"../../../constants/common";import{useI18nConfig as U,useCurrentProduct as _,usePageVersions as j}from"../hooks";import{telemetry as B}from"../telemetry/index.js";function se(k,x){const[E,m]=o(),[p,g]=o([]),[M,P]=o(""),[O,l]=o([]),[Q,n]=o(!1),[v,e]=o(null),[I,i]=o(null),{currentLocale:F}=U(),J=_(),{versions:N=[]}=j()||{},h=N.find(t=>t?.active),R=w(()=>{m(""),g([]),n(!1),e(null)},[m,g,e]),G=w(()=>{R(),l([])},[R,l]);return{askQuestion:async(t,H)=>{if(!t)return;I&&I.abort();const A=new AbortController;i(A),R(),n(!0),P(t);let u="";fetch(K(L.ASK_AI),{method:"POST",body:JSON.stringify({text:t,history:H||[],locale:F,product:J?.name,filter:k?.filter,version:h&&{folder:h.folderId,label:h.label}}),signal:A.signal}).then(r=>{if(!r.ok){n(!1),r.status===401?e(c.Unauthorized):r.status===403?e(c.Forbidden):e(c.HttpRequestFailed);return}let f="";const y=r.body;if(!y)return;const T=y.getReader(),C=()=>{T.read().then(({value:d,done:V})=>{if(V){n(!1),i(null),f||e(c.EmptyResponse),t.trim().length>0&&u&&B.sendSearchAIQueryMessage({question:t,answer:f,resources:JSON.stringify(p),searchSessionId:x,messageId:u});return}const z=new TextDecoder().decode(d),D=/data: (.*)/g;let S;for(;(S=D.exec(z))!==null;){if(!S[1])continue;const a=JSON.parse(S[1]);if(a.messageId)u=a.messageId,l(s=>{if(s.length===0)return s;const b=s[s.length-1];return b.role==="assistant"&&!b.messageId?[...s.slice(0,-1),{...b,messageId:u}]:s});else if(a.answer)f+=a.answer,m(f);else if(a.sources){const s=Math.floor(Math.random()*3)+4;g(a.sources.slice(0,s))}}C()}).catch(d=>{d.name!=="AbortError"&&(console.error(d),n(!1),i(null),e(c.ErrorProcessingResponse))})};C()}).catch(r=>{r.name!=="AbortError"&&(console.error(r),n(!1),i(null),e(c.HttpRequestFailed))})},isGeneratingResponse:Q,response:E,resources:p,question:M,error:v,clearConversation:G,conversation:O,setConversation:l}}export{se as useAiSearch};
1
+ import{useCallback as w,useState as o}from"react";import{AiSearchError as c}from"@redocly/theme/core/constants";import{withPathPrefix as K}from"@redocly/theme/core/utils";import{ServerRoutes as L}from"../../../constants/common";import{useSearchSession as U}from"@redocly/theme/core/contexts";import{useI18nConfig as _,useCurrentProduct as j,usePageVersions as B}from"../hooks";import{telemetry as W}from"../telemetry/index.js";function re(k){const{searchSessionId:x}=U(),[E,m]=o(),[b,g]=o([]),[M,P]=o(""),[O,i]=o([]),[Q,n]=o(!1),[v,e]=o(null),[I,l]=o(null),{currentLocale:F}=_(),J=j(),{versions:N=[]}=B()||{},h=N.find(t=>t?.active),S=w(()=>{m(""),g([]),n(!1),e(null)},[m,g,e]),G=w(()=>{S(),i([])},[S,i]);return{askQuestion:async(t,H)=>{if(!t)return;I&&I.abort();const A=new AbortController;l(A),S(),n(!0),P(t);let u="";fetch(K(L.ASK_AI),{method:"POST",body:JSON.stringify({text:t,history:H||[],locale:F,product:J?.name,filter:k?.filter,version:h&&{folder:h.folderId,label:h.label}}),signal:A.signal}).then(r=>{if(!r.ok){n(!1),r.status===401?e(c.Unauthorized):r.status===403?e(c.Forbidden):e(c.HttpRequestFailed);return}let f="";const y=r.body;if(!y)return;const T=y.getReader(),C=()=>{T.read().then(({value:d,done:V})=>{if(V){n(!1),l(null),f||e(c.EmptyResponse),t.trim().length>0&&u&&W.sendSearchAIQueryMessage({question:t,answer:f,resources:JSON.stringify(b),searchSessionId:x,messageId:u});return}const z=new TextDecoder().decode(d),D=/data: (.*)/g;let p;for(;(p=D.exec(z))!==null;){if(!p[1])continue;const a=JSON.parse(p[1]);if(a.messageId)u=a.messageId,i(s=>{if(s.length===0)return s;const R=s[s.length-1];return R.role==="assistant"&&!R.messageId?[...s.slice(0,-1),{...R,messageId:u}]:s});else if(a.answer)f+=a.answer,m(f);else if(a.sources){const s=Math.floor(Math.random()*3)+4;g(a.sources.slice(0,s))}}C()}).catch(d=>{d.name!=="AbortError"&&(console.error(d),n(!1),l(null),e(c.ErrorProcessingResponse))})};C()}).catch(r=>{r.name!=="AbortError"&&(console.error(r),n(!1),l(null),e(c.HttpRequestFailed))})},isGeneratingResponse:Q,response:E,resources:b,question:M,error:v,clearConversation:G,conversation:O,setConversation:i}}export{re as useAiSearch};
@@ -1,5 +1,5 @@
1
1
  import type { SearchItemData, SearchFilterItem, SearchFacet } from '@redocly/theme/core/types';
2
- export declare function useSearch(product?: string, disableAutoSearch?: boolean, searchSessionId?: string): {
2
+ export declare function useSearch(product?: string, disableAutoSearch?: boolean): {
3
3
  query: string;
4
4
  setQuery: import("react").Dispatch<import("react").SetStateAction<string>>;
5
5
  filter: SearchFilterItem[];
@@ -1 +1 @@
1
- import{useCallback as y,useEffect as _,useState as R,useRef as T}from"react";import{SEARCH_DEBOUNCE_TIME_MS as G}from"@redocly/theme/core/constants";import{withPathPrefix as b}from"@redocly/theme/core/utils";import{SEARCH_GROUP_FACET_FIELD as O,SEARCH_PRODUCT_FIELD as N,SEARCH_VERSION_FIELD as k,ServerRoutes as P}from"../../../constants/common";import{debounce as M}from"../../../utils/time/debounce.js";import{useGlobalData as Q,useI18nConfig as A}from"../hooks";import{usePageVersions as U}from"../../providers/page-data/hooks";import{useFacets as x}from"./useFacets";import{telemetry as J}from"../telemetry/index.js";const B=(s,c,e,a,n,i,o,f,m)=>{const{currentLocale:l}=A(),u=T(""),p=y(M(async(t,h,d,S)=>{if(!t.trim().length&&!h.length){e({}),a({}),n(!1);return}const E={method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({query:t,filter:v(h,S,i),locale:d})};try{const r=await fetch(b(P.SEARCH),E);if(u.current===t){const F=await r.json();a(F.facets),e(F.documents),t.trim().length>1&&J.sendSearchQueryMessage({query:t,resultCount:Object.keys(F.documents).length.toString(),searchSessionId:m})}n(!1)}catch(r){e({}),console.log(r)}},G),[i?.version,i?.folderId,o]);return _(()=>{f||(n(!0),p(s,c,l,o),u.current=s)},[f,c,l,o,s,p,n]),{}},K=(s,c,e,a,n,i,o,f)=>{const{currentLocale:m}=A();_(()=>{l(e,s,c,m,a,n,f)},[a,f]);const l=y(async(u,p,t,h,d,S,E)=>{if(d){const{groupKey:r}=d;o(!0);const g={method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({query:p,filter:(()=>{const C=S.find(I=>I.field===O);return C&&!t.find(L=>L.field===C?.field)?[...t,{field:C.field,values:[r]}]:v(t,E)})(),loadMore:d,locale:h})},D=await(await fetch(b(P.SEARCH),g)).json(),H=u[r]||[],j=D.documents[r],w={...u,[r]:[...H,...j]};i(w),o(!1)}},[]);return{}};function se(s,c,e){const{searchFeatures:a}=Q(),[n,i]=R(""),[o,f]=R([]),[m,l]=R({}),[u,p]=R({}),[t,h]=R(),[d,S]=R(!1),{facets:E}=x(u),{versions:r=[]}=U()||{},F=r.find(g=>g?.active);return B(n,o,l,p,S,F,s,c,e),K(n,o,m,t,E,l,S,s),{query:n,setQuery:i,filter:o,setFilter:f,items:m,isSearchLoading:d,facets:E,groupField:O,setLoadMore:h,advancedSearch:a?.advanced?.enabled,askAi:a?.ai?.enabled}}function v(s,c,e){return[...s,...c?[{field:N,values:[c]}]:[],...e?[{field:k,values:[...e.default?["default"]:[e.folderId,e.version]]}]:[]]}export{se as useSearch};
1
+ import{useCallback as I,useEffect as y,useState as F,useRef as T}from"react";import{SEARCH_DEBOUNCE_TIME_MS as G}from"@redocly/theme/core/constants";import{withPathPrefix as _}from"@redocly/theme/core/utils";import{SEARCH_GROUP_FACET_FIELD as b,SEARCH_PRODUCT_FIELD as N,SEARCH_VERSION_FIELD as k,ServerRoutes as O}from"../../../constants/common";import{debounce as M}from"../../../utils/time/debounce.js";import{useSearchSession as Q}from"@redocly/theme/core/contexts";import{useGlobalData as U,useI18nConfig as P}from"../hooks";import{usePageVersions as x}from"../../providers/page-data/hooks";import{useFacets as J}from"./useFacets";import{telemetry as B}from"../telemetry/index.js";const K=(s,n,e,r,a,c,i,f)=>{const{searchSessionId:d}=Q(),{currentLocale:m}=P(),l=T(""),p=I(M(async(t,h,u,S)=>{if(!t.trim().length&&!h.length){e({}),r({}),a(!1);return}const R={method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({query:t,filter:A(h,S,c),locale:u})};try{const o=await fetch(_(O.SEARCH),R);if(l.current===t){const E=await o.json();r(E.facets),e(E.documents),t.trim().length>1&&B.sendSearchQueryMessage({query:t,resultCount:Object.keys(E.documents).length.toString(),searchSessionId:d})}a(!1)}catch(o){e({}),console.log(o)}},G),[c?.version,c?.folderId,i]);return y(()=>{f||(a(!0),p(s,n,m,i),l.current=s)},[f,n,m,i,s,p,a]),{}},z=(s,n,e,r,a,c,i,f)=>{const{currentLocale:d}=P();y(()=>{m(e,s,n,d,r,a,f)},[r,f]);const m=I(async(l,p,t,h,u,S,R)=>{if(u){const{groupKey:o}=u;i(!0);const v={method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({query:p,filter:(()=>{const g=S.find(C=>C.field===b);return g&&!t.find(L=>L.field===g?.field)?[...t,{field:g.field,values:[o]}]:A(t,R)})(),loadMore:u,locale:h})},D=await(await fetch(_(O.SEARCH),v)).json(),H=l[o]||[],j=D.documents[o],w={...l,[o]:[...H,...j]};c(w),i(!1)}},[]);return{}};function ne(s,n){const{searchFeatures:e}=U(),[r,a]=F(""),[c,i]=F([]),[f,d]=F({}),[m,l]=F({}),[p,t]=F(),[h,u]=F(!1),{facets:S}=J(m),{versions:R=[]}=x()||{},o=R.find(E=>E?.active);return K(r,c,d,l,u,o,s,n),z(r,c,f,p,S,d,u,s),{query:r,setQuery:a,filter:c,setFilter:i,items:f,isSearchLoading:h,facets:S,groupField:b,setLoadMore:t,advancedSearch:e?.advanced?.enabled,askAi:e?.ai?.enabled}}function A(s,n,e){return[...s,...n?[{field:N,values:[n]}]:[],...e?[{field:k,values:[...e.default?["default"]:[e.folderId,e.version]]}]:[]]}export{ne as useSearch};
@@ -1 +1 @@
1
- import a from"react";import{ThemeDataContext as m}from"@redocly/theme/core/contexts";import{useBreadcrumbs as l,useCatalogClassic as d,useCurrentProduct as g,useGlobalData as o,useI18n as p,useI18nConfig as f,useL10n as b,useL10nConfig as C,usePageData as r,usePageSharedData as h,usePageVersions as P,usePreloadHistory as S,useProducts as T,useUserMenu as D,useSubmitFeedback as k,useTranslate as F,useSidebarSiblingsData as L,usePageProps as M,useUserTeams as v,useMarkdownText as O,useCodeHighlight as E,useLoadAndNavigate as R,useCatalog as w,useCatalogSort as x,useCatalogSearch as y,useFetchCatalogEntities as A,useFetchCatalogEntitiesRelations as I,useTelemetry as s,useMcpData as j}from"../../app/hooks";import{Link as H}from"../../app/Link";import{useFacetQuery as N,useSearch as U,useAiSearch as _}from"../../app/search";import{useSidebarItems as B}from"../../app/Sidebar/useSidebarItems";import{deepMerge as G}from"../../../utils/object/deep-merge";import{allowlistObject as Q}from"../../../utils/object/allowlist-object";const V=["title","description","seo","sidebar","excludeFromSearch","template","redirects","rbac","metadata","slug","codeSnippet","breadcrumbs","markdown","seo","navbar","footer","colorMode","feedback","navigation"],W={useBreadcrumbs:l,useCatalog:w,useCatalogSort:x,useCatalogSearch:y,useFetchCatalogEntities:A,useFetchCatalogEntitiesRelations:I,useCatalogClassic:d,useCurrentProduct:g,useGlobalData:o,useSearch:U,useAiSearch:_,useFacetQuery:N,useI18n:p,useI18nConfig:f,useL10n:b,useL10nConfig:C,usePageData:r,usePageSharedData:h,usePageVersions:P,usePreloadHistory:S,useProducts:T,useUserMenu:D,useSidebarItems:B,useSidebarSiblingsData:L,useSubmitFeedback:k,useTranslate:F,useUserTeams:v,usePageProps:M,useMarkdownText:O,useCodeHighlight:E,useLoadAndNavigate:R,useTelemetry:s,useOtelTelemetry:s,useMcpData:j},q={LinkComponent:H};function te({children:u}){const{props:e}=r()||{},t=o()||{},n=a.useMemo(()=>{const c=Q(e?.frontmatter||{},V);return G(t,c)},[t,e?.frontmatter]),i={hooks:W,components:q,config:n};return a.createElement(m.Provider,{value:i},u)}export{te as ThemeDataProvider};
1
+ import e from"react";import{ThemeDataContext as m,SearchSessionProvider as l}from"@redocly/theme/core/contexts";import{useBreadcrumbs as d,useBanner as g,useCatalogClassic as p,useCurrentProduct as f,useGlobalData as o,useI18n as b,useI18nConfig as C,useL10n as S,useL10nConfig as h,usePageData as r,usePageSharedData as P,usePageVersions as T,usePreloadHistory as D,useProducts as k,useUserMenu as v,useSubmitFeedback as F,useTranslate as L,useSidebarSiblingsData as M,usePageProps as E,useUserTeams as O,useMarkdownText as R,useCodeHighlight as w,useLoadAndNavigate as x,useCatalog as y,useCatalogSort as A,useCatalogSearch as I,useFetchCatalogEntities as j,useFetchCatalogEntitiesRelations as B,useTelemetry as s,useMcpData as H}from"../../app/hooks";import{Link as N}from"../../app/Link";import{useFacetQuery as U,useSearch as _,useAiSearch as G}from"../../app/search";import{useSidebarItems as Q}from"../../app/Sidebar/useSidebarItems";import{deepMerge as V}from"../../../utils/object/deep-merge";import{allowlistObject as W}from"../../../utils/object/allowlist-object";const q=["title","description","seo","sidebar","excludeFromSearch","template","redirects","rbac","metadata","slug","codeSnippet","breadcrumbs","markdown","seo","navbar","footer","colorMode","feedback","navigation","banner"],z={useBreadcrumbs:d,useBanner:g,useCatalog:y,useCatalogSort:A,useCatalogSearch:I,useFetchCatalogEntities:j,useFetchCatalogEntitiesRelations:B,useCatalogClassic:p,useCurrentProduct:f,useGlobalData:o,useSearch:_,useAiSearch:G,useFacetQuery:U,useI18n:b,useI18nConfig:C,useL10n:S,useL10nConfig:h,usePageData:r,usePageSharedData:P,usePageVersions:T,usePreloadHistory:D,useProducts:k,useUserMenu:v,useSidebarItems:Q,useSidebarSiblingsData:M,useSubmitFeedback:F,useTranslate:L,useUserTeams:O,usePageProps:E,useMarkdownText:R,useCodeHighlight:w,useLoadAndNavigate:x,useTelemetry:s,useOtelTelemetry:s,useMcpData:H},J={LinkComponent:N};function oe({children:n}){const{props:t}=r()||{},a=o()||{},u=e.useMemo(()=>{const c=W(t?.frontmatter||{},q);return V(a,c)},[a,t?.frontmatter]),i={hooks:z,components:J,config:u};return e.createElement(l,null,e.createElement(m.Provider,{value:i},n))}export{oe as ThemeDataProvider};
@@ -23,5 +23,6 @@ export declare const PRODUCT_GATES: {
23
23
  breadcrumbs: boolean;
24
24
  mockServer: boolean;
25
25
  codeWalkthrough: boolean;
26
+ banner: boolean;
26
27
  };
27
28
  //# sourceMappingURL=product-gates.d.ts.map
@@ -1 +1 @@
1
- const e="@redocly/revel-reef",r="Revel + Reef",t={apiFunctions:!0,asyncapi:!1,soap:!1,reactPages:!0,catalog:!0,catalogClassic:!0,lint:!1,scorecard:!0,l10n:!0,openapi:!1,graphql:!1,markdown:!0,devOnboarding:!0,seo:!0,redirects:!0,customPlugins:!0,themeEjecting:!0,products:!0,breadcrumbs:!0,mockServer:!1,codeWalkthrough:!0,scorecards:!0};export{e as PACKAGE_NAME,t as PRODUCT_GATES,r as PRODUCT_NAME};
1
+ const e="@redocly/revel-reef",r="Revel + Reef",t={apiFunctions:!0,asyncapi:!1,soap:!1,reactPages:!0,catalog:!0,catalogClassic:!0,lint:!1,scorecard:!0,l10n:!0,openapi:!1,graphql:!1,markdown:!0,devOnboarding:!0,seo:!0,redirects:!0,customPlugins:!0,themeEjecting:!0,products:!0,breadcrumbs:!0,mockServer:!1,codeWalkthrough:!0,scorecards:!0,banner:!0};export{e as PACKAGE_NAME,t as PRODUCT_GATES,r as PRODUCT_NAME};
@@ -135,5 +135,6 @@ export declare const FEATURE: {
135
135
  readonly codeWalkthrough: "codeWalkthrough";
136
136
  readonly aiSearchLimit: "aiSearchLimit";
137
137
  readonly mcp: "mcp";
138
+ readonly banner: "banner";
138
139
  };
139
140
  //# sourceMappingURL=common.d.ts.map
@@ -1 +1 @@
1
- import{AuthProviderType as e}from"@redocly/config";import{withPathPrefix as r}from"@redocly/theme/core/utils";const i="openapi_docs",L="asyncapi_docs",R="graphql_docs",I="/_spec-gql",C="markdoc",S="tags",n="*",l={[n]:"read"},d=["openid","email"],P=1440*60,N="anonymous",u="authenticated",D="**",h="Reunite",x="translations.yaml",m="redocly.yaml",U="@redocly/theme",g="@theme",M="/app-data.json",G="/eject-component",_=process.env.SERVER_EDITOR_APP_URL||"http://127.0.0.1:3000",v=process.env.REDOCLY_CORS_ORIGINS?process.env.REDOCLY_CORS_ORIGINS.split(",").map(o=>o.trim()).filter(Boolean).concat(_):[_];var a;(function(o){o.BUILD="build",o.DEVELOP="develop",o.PREPARE="prepare"})(a||(a={}));var c;(function(o){o.RATING="rating",o.SENTIMENT="sentiment",o.COMMENT="comment",o.MOOD="mood",o.PROBLEM="problem",o.SCALE="scale"})(c||(c={}));const t="entityKey",A="entityRelationId",s={INFO:"/_info",EJECT_COMPONENT:"/eject-component/:componentName",SHARED_PAGE_DATA:"/page-data/shared/*",PAGE_DATA:"/page-data/*",APP_DATA:"/app-data.json",AUTHORIZATION:"/authorize",OIDC_CALLBACK:"/_auth/oidc",SAML_CALLBACK:"/_auth/saml2",REDOCLY_CALLBACK:"/_auth/redocly",REPLAY_OAUTH2_CALLBACK:"/_auth/replay-oauth2",REDOCLY_LOGIN_CALLBACK:"/_auth/redocly/redocly-login",REDOCLY_TOKEN_LOGIN:"/_auth/redocly-token-login",SEARCH:"/_search",SEARCH_FACETS:"/_search-facets",LOGOUT:"/logout",LOGIN:"/login",IDP_LOGIN:"/_auth/idp-login",INVITE:"/invite/:code",RESOLVE_ROUTE_BY_PATH:"/resolve-route-by-path",RESOLVE_ROUTES_BY_PATHS:"/resolve-routes-by-paths",RESOLVE_ROUTE_BY_SLUG:"/resolve-route-by-slug",GET_ROUTES_BY_LINE:"/get-routes-by-line",FEEDBACK:"/feedback",TELEMETRY:"/_events",OTEL_TRACES:"/_otel/v1/traces",HEALTH:"/_health",ASK_AI:"/_ask-ai",CATALOG_ENTITIES:`/catalog-entities/:${t}?`,CATALOG_ENTITIES_RELATIONS:`/catalog-entities-relations/:${A}?`,BFF_CATALOG_ENTITIES:`/bff/catalog-entities/:${t}?`,BFF_CATALOG_RELATED_ENTITIES:`/bff/catalog-related-entities/:${t}`,BFF_CATALOG_REVISIONS:`/bff/catalog-revisions/:${t}`,MCP_OAUTH_AUTHORIZATION_SERVER:"/.well-known/oauth-authorization-server",MCP_OAUTH_PROTECTED_RESOURCE:"/.well-known/oauth-protected-resource/mcp",MCP_DYNAMIC_CLIENT_REGISTRATION:"/_mcp/register",MCP_AUTHORIZATION:"/_mcp/oauth2/auth",MCP_TOKEN_PORTAL:"/_mcp/oauth2/token-portal",MCP_CALLBACK:"/_mcp/oauth/callback",SCORECARDS:"/scorecards"},F={[e.SAML2]:r(s.IDP_LOGIN),[e.OIDC]:r(s.IDP_LOGIN)};var E;(function(o){o.AI_SEARCH="aiSearch"})(E||(E={}));const y="/login",H="/invite",b={AUTH0_PASS:"/auth/auth0-pass"},B={NotExist:"ENOENT"},f="default_locale",k="sidebar-",V="PUBLIC_",K=["BROKEN_LINK","MARKDOC","RESOLVE"],Y=["logo","navbar","products","footer","sidebar","scripts","links","feedback","search","aiAssistant","colorMode","navigation","codeSnippet","markdown","openapi","graphql","analytics","userMenu","versionPicker","breadcrumbs","catalog","entitiesCatalog","scorecard","scorecards","scorecardClassic","mcp"],O="redocly_category",w="redocly_product",j="redocly_version",q="redocly_teams",$=O,Q={asyncapi:"asyncapi",apiFunctions:"apiFunctions",reactPages:"reactPages",catalog:"catalog",catalogClassic:"catalogClassic",lint:"lint",scorecard:"scorecard",scorecards:"scorecards",l10n:"l10n",openapi:"openapi",graphql:"graphql",markdown:"markdown",devOnboarding:"devOnboarding",seo:"seo",redirects:"redirects",customPlugins:"customPlugins",themeEjecting:"themeEjecting",products:"products",breadcrumbs:"breadcrumbs",mockServer:"mockServer",sso:"sso",rbac:"rbac",analytics:"analytics",removeAttribution:"removeAttribution",advancedSearch:"advancedSearch",soap:"soap",ssoDirect:"ssoDirect",codeWalkthrough:"codeWalkthrough",aiSearchLimit:"aiSearchLimit",mcp:"mcp"};export{v as ALLOWED_CORS_ORIGINS,L as ASYNC_API_DOCS_TEMPLATE_ID,t as CATALOG_ENTITY_KEY,A as CATALOG_ENTITY_RELATION_ID,m as CONFIG_FILE_NAME,C as CUSTOM_MARKDOC_OPTIONS_PATH,S as CUSTOM_MARKDOC_TAGS_PATH,N as DEFAULT_ANONYMOUS_VISITOR_TEAM,u as DEFAULT_AUTHENTICATED_TEAM,P as DEFAULT_COOKIE_EXPIRATION,f as DEFAULT_LOCALE_PLACEHOLDER,F as DEFAULT_PROVIDERS_LOGIN_URLS,D as DEFAULT_RBAC_SCOPE,h as DEFAULT_SSO_IDP_TITLE,U as DEFAULT_THEME_NAME,y as DEV_LOGIN_SLUG,G as EJECT_COMPONENT_URL,b as ExternalRoutes,Q as FEATURE,c as FEEDBACK_TYPES,B as FsErrors,M as GLOBAL_DATA_URL,I as GRAPHQL_SPEC_SLUG,R as GRAPHQL_TEMPLATE_ID,H as INVITE_SLUG,K as MARKDOC_ERROR_TYPES,i as OPENAPI_DOCS_TEMPLATE_ID,V as PUBLIC_ENV_PREFIX,l as PUBLIC_RBAC_SCOPE_ITEM,n as RBAC_ALL_OTHER_TEAMS,d as REQUIRED_OIDC_SCOPES,E as RbacFeatures,O as SEARCH_CATEGORY_FIELD,$ as SEARCH_GROUP_FACET_FIELD,w as SEARCH_PRODUCT_FIELD,q as SEARCH_RBAC_FIELD,j as SEARCH_VERSION_FIELD,_ as SERVER_EDITOR_APP_URL,k as SIDEBAR_PREFIX,s as ServerRoutes,x as TRANSLATIONS_FILE_NAME,Y as UI_ACCESSIBLE_CONFIG_PROPS,g as USER_THEME_ALIAS,a as cliCommandNames};
1
+ import{AuthProviderType as e}from"@redocly/config";import{withPathPrefix as r}from"@redocly/theme/core/utils";const i="openapi_docs",L="asyncapi_docs",R="graphql_docs",I="/_spec-gql",C="markdoc",S="tags",n="*",l={[n]:"read"},d=["openid","email"],P=1440*60,N="anonymous",u="authenticated",D="**",h="Reunite",x="translations.yaml",m="redocly.yaml",U="@redocly/theme",g="@theme",M="/app-data.json",G="/eject-component",a=process.env.SERVER_EDITOR_APP_URL||"http://127.0.0.1:3000",b=process.env.REDOCLY_CORS_ORIGINS?process.env.REDOCLY_CORS_ORIGINS.split(",").map(o=>o.trim()).filter(Boolean).concat(a):[a];var _;(function(o){o.BUILD="build",o.DEVELOP="develop",o.PREPARE="prepare"})(_||(_={}));var c;(function(o){o.RATING="rating",o.SENTIMENT="sentiment",o.COMMENT="comment",o.MOOD="mood",o.PROBLEM="problem",o.SCALE="scale"})(c||(c={}));const t="entityKey",A="entityRelationId",s={INFO:"/_info",EJECT_COMPONENT:"/eject-component/:componentName",SHARED_PAGE_DATA:"/page-data/shared/*",PAGE_DATA:"/page-data/*",APP_DATA:"/app-data.json",AUTHORIZATION:"/authorize",OIDC_CALLBACK:"/_auth/oidc",SAML_CALLBACK:"/_auth/saml2",REDOCLY_CALLBACK:"/_auth/redocly",REPLAY_OAUTH2_CALLBACK:"/_auth/replay-oauth2",REDOCLY_LOGIN_CALLBACK:"/_auth/redocly/redocly-login",REDOCLY_TOKEN_LOGIN:"/_auth/redocly-token-login",SEARCH:"/_search",SEARCH_FACETS:"/_search-facets",LOGOUT:"/logout",LOGIN:"/login",IDP_LOGIN:"/_auth/idp-login",INVITE:"/invite/:code",RESOLVE_ROUTE_BY_PATH:"/resolve-route-by-path",RESOLVE_ROUTES_BY_PATHS:"/resolve-routes-by-paths",RESOLVE_ROUTE_BY_SLUG:"/resolve-route-by-slug",GET_ROUTES_BY_LINE:"/get-routes-by-line",FEEDBACK:"/feedback",TELEMETRY:"/_events",OTEL_TRACES:"/_otel/v1/traces",HEALTH:"/_health",ASK_AI:"/_ask-ai",CATALOG_ENTITIES:`/catalog-entities/:${t}?`,CATALOG_ENTITIES_RELATIONS:`/catalog-entities-relations/:${A}?`,BFF_CATALOG_ENTITIES:`/bff/catalog-entities/:${t}?`,BFF_CATALOG_RELATED_ENTITIES:`/bff/catalog-related-entities/:${t}`,BFF_CATALOG_REVISIONS:`/bff/catalog-revisions/:${t}`,MCP_OAUTH_AUTHORIZATION_SERVER:"/.well-known/oauth-authorization-server",MCP_OAUTH_PROTECTED_RESOURCE:"/.well-known/oauth-protected-resource/mcp",MCP_DYNAMIC_CLIENT_REGISTRATION:"/_mcp/register",MCP_AUTHORIZATION:"/_mcp/oauth2/auth",MCP_TOKEN_PORTAL:"/_mcp/oauth2/token-portal",MCP_CALLBACK:"/_mcp/oauth/callback",SCORECARDS:"/scorecards"},v={[e.SAML2]:r(s.IDP_LOGIN),[e.OIDC]:r(s.IDP_LOGIN)};var E;(function(o){o.AI_SEARCH="aiSearch"})(E||(E={}));const F="/login",y="/invite",H={AUTH0_PASS:"/auth/auth0-pass"},B={NotExist:"ENOENT"},f="default_locale",k="sidebar-",V="PUBLIC_",K=["BROKEN_LINK","MARKDOC","RESOLVE"],Y=["logo","navbar","products","footer","sidebar","scripts","links","feedback","search","aiAssistant","colorMode","navigation","codeSnippet","markdown","openapi","graphql","analytics","userMenu","versionPicker","breadcrumbs","catalog","entitiesCatalog","scorecard","scorecards","scorecardClassic","mcp","banner"],O="redocly_category",w="redocly_product",j="redocly_version",q="redocly_teams",$=O,Q={asyncapi:"asyncapi",apiFunctions:"apiFunctions",reactPages:"reactPages",catalog:"catalog",catalogClassic:"catalogClassic",lint:"lint",scorecard:"scorecard",scorecards:"scorecards",l10n:"l10n",openapi:"openapi",graphql:"graphql",markdown:"markdown",devOnboarding:"devOnboarding",seo:"seo",redirects:"redirects",customPlugins:"customPlugins",themeEjecting:"themeEjecting",products:"products",breadcrumbs:"breadcrumbs",mockServer:"mockServer",sso:"sso",rbac:"rbac",analytics:"analytics",removeAttribution:"removeAttribution",advancedSearch:"advancedSearch",soap:"soap",ssoDirect:"ssoDirect",codeWalkthrough:"codeWalkthrough",aiSearchLimit:"aiSearchLimit",mcp:"mcp",banner:"banner"};export{b as ALLOWED_CORS_ORIGINS,L as ASYNC_API_DOCS_TEMPLATE_ID,t as CATALOG_ENTITY_KEY,A as CATALOG_ENTITY_RELATION_ID,m as CONFIG_FILE_NAME,C as CUSTOM_MARKDOC_OPTIONS_PATH,S as CUSTOM_MARKDOC_TAGS_PATH,N as DEFAULT_ANONYMOUS_VISITOR_TEAM,u as DEFAULT_AUTHENTICATED_TEAM,P as DEFAULT_COOKIE_EXPIRATION,f as DEFAULT_LOCALE_PLACEHOLDER,v as DEFAULT_PROVIDERS_LOGIN_URLS,D as DEFAULT_RBAC_SCOPE,h as DEFAULT_SSO_IDP_TITLE,U as DEFAULT_THEME_NAME,F as DEV_LOGIN_SLUG,G as EJECT_COMPONENT_URL,H as ExternalRoutes,Q as FEATURE,c as FEEDBACK_TYPES,B as FsErrors,M as GLOBAL_DATA_URL,I as GRAPHQL_SPEC_SLUG,R as GRAPHQL_TEMPLATE_ID,y as INVITE_SLUG,K as MARKDOC_ERROR_TYPES,i as OPENAPI_DOCS_TEMPLATE_ID,V as PUBLIC_ENV_PREFIX,l as PUBLIC_RBAC_SCOPE_ITEM,n as RBAC_ALL_OTHER_TEAMS,d as REQUIRED_OIDC_SCOPES,E as RbacFeatures,O as SEARCH_CATEGORY_FIELD,$ as SEARCH_GROUP_FACET_FIELD,w as SEARCH_PRODUCT_FIELD,q as SEARCH_RBAC_FIELD,j as SEARCH_VERSION_FIELD,a as SERVER_EDITOR_APP_URL,k as SIDEBAR_PREFIX,s as ServerRoutes,x as TRANSLATIONS_FILE_NAME,Y as UI_ACCESSIBLE_CONFIG_PROPS,g as USER_THEME_ALIAS,_ as cliCommandNames};
@@ -1 +1 @@
1
- import{Hono as g}from"hono";import{TrieRouter as f}from"hono/router/trie-router";import{Logger as m}from"../tools/notifiers/logger.js";import{importApiRoutesHandler as q}from"./import-api-routes-handlers.js";import{getBodyWithSizeCheck as h}from"./helpers/get-body-with-size-check.js";import{setupLogger as w}from"./helpers/setup-logger.js";import{telemetry as i}from"../telemetry/index.js";import{KvService as y}from"../persistence/kv/services/kv-service.js";import{enhanceContext as S}from"./helpers/enhance-context.js";const r=new m;r.patchConsole();async function C(e){i.initialize(),w(r,e.loggerStickyState,e.requestHandlerId);const n=new g({router:new f}),{requestHandlers:a}=await q(e.serverOutDir),u=a[e.requestHandlerId],c=(await u()).default,l=async()=>await y.getInstance({baseDbDir:e.serverOutDir,sqldRemoteDatabaseUrl:e.sqldRemoteDatabaseUrl,sqldRemoteDatabaseAuthToken:e.sqldRemoteDatabaseAuthToken});n.all(e.slug,async t=>{const o=await c(t.req.raw,S({honoCtx:t,ctx:e.ctxData,telemetry:i,getStorage:l}),e.staticData);return o instanceof Response?o:typeof o=="string"?t.text(o):t.json(o)}),n.onError((t,o)=>{if(r.error(`[${e.requestHandlerId}] ${t.message} ${t.stack}`),t instanceof SyntaxError)return o.text(t.message,500);throw t});const s=await n.request(e.req.url,e.req),d=await h(s,e.maxResponseSizeMB);return{status:s.status,headers:Object.fromEntries(s.headers.entries()),body:d,loggerStickyState:r.getStickyState()}}export{C as executeApiRoute};
1
+ import{Hono as f}from"hono";import{TrieRouter as g}from"hono/router/trie-router";import{Logger as m}from"../tools/notifiers/logger.js";import{importApiRoutesHandler as q}from"./import-api-routes-handlers.js";import{getBodyWithSizeCheck as h}from"./helpers/get-body-with-size-check.js";import{setupLogger as w}from"./helpers/setup-logger.js";import{telemetry as i}from"../telemetry/index.js";import{KvService as y}from"../persistence/kv/services/kv-service.js";import{enhanceContext as D}from"./helpers/enhance-context.js";const r=new m;r.patchConsole();async function C(e){i.initialize(),w(r,e.loggerStickyState,e.requestHandlerId);const n=new f({router:new g}),{requestHandlers:a}=await q(e.serverOutDir),u=a[e.requestHandlerId],c=(await u()).default,l=async()=>await y.getInstance({baseDbDir:e.serverOutDir,sqldRemoteDatabaseUrl:e.sqldRemoteDatabaseUrl,sqldRemoteDatabaseAuthToken:e.sqldRemoteDatabaseAuthToken});n.all(e.slug,async t=>{const o=await c(t.req.raw,D({honoCtx:t,ctx:e.ctxData,telemetry:i,getKv:l}),e.staticData);return o instanceof Response?o:typeof o=="string"?t.text(o):t.json(o)}),n.onError((t,o)=>{if(r.error(`[${e.requestHandlerId}] ${t.message} ${t.stack}`),t instanceof SyntaxError)return o.text(t.message,500);throw t});const s=await n.request(e.req.url,e.req),d=await h(s,e.maxResponseSizeMB);return{status:s.status,headers:Object.fromEntries(s.headers.entries()),body:d,loggerStickyState:r.getStickyState()}}export{C as executeApiRoute};
@@ -6,7 +6,7 @@ export type EnhanceContextParams = {
6
6
  honoCtx: Context;
7
7
  ctx: ApiFunctionsBasicContext;
8
8
  telemetry?: AsyncApiRealmAPI.Telemetry;
9
- getStorage: () => Promise<KvService>;
9
+ getKv: () => Promise<KvService>;
10
10
  };
11
- export declare const enhanceContext: ({ honoCtx, ctx, telemetry, getStorage, }: EnhanceContextParams) => ApiFunctionsContext;
11
+ export declare const enhanceContext: ({ honoCtx, ctx, telemetry, getKv, }: EnhanceContextParams) => ApiFunctionsContext;
12
12
  //# sourceMappingURL=enhance-context.d.ts.map
@@ -1 +1 @@
1
- import{deleteCookie as o,getCookie as p,setCookie as f}from"hono/cookie";const j=({honoCtx:r,ctx:u,telemetry:a,getStorage:l})=>{const i=r.req.routePath,m=r.req.param(),d=Object.fromEntries(Object.entries(m).map(([e,t])=>{if(t&&(i.includes(`/:${e}{.*}`)||i.includes(`/:${e}{.+}`))){const c=t.split("/").filter(Boolean);return[e,c.length?c:void 0]}return[e,t]})),s={...r.res,status:e=>(r.status(e),s),json:e=>r.json(e),text:(e,t)=>(t&&r.status(t),r.text(e)),redirect:(e,t=302)=>r.redirect(e,t),setCookie:(e,t,n)=>(f(r,e,t,n),s),deleteCookie:e=>(o(r,e),s)};return{...u,...s,params:d,query:r.req.query()||{},cookies:p(r),telemetry:a,getStorage:l}};export{j as enhanceContext};
1
+ import{deleteCookie as o,getCookie as p,setCookie as f}from"hono/cookie";const j=({honoCtx:r,ctx:u,telemetry:a,getKv:l})=>{const i=r.req.routePath,m=r.req.param(),d=Object.fromEntries(Object.entries(m).map(([e,t])=>{if(t&&(i.includes(`/:${e}{.*}`)||i.includes(`/:${e}{.+}`))){const c=t.split("/").filter(Boolean);return[e,c.length?c:void 0]}return[e,t]})),s={...r.res,status:e=>(r.status(e),s),json:e=>r.json(e),text:(e,t)=>(t&&r.status(t),r.text(e)),redirect:(e,t=302)=>r.redirect(e,t),setCookie:(e,t,n)=>(f(r,e,t,n),s),deleteCookie:e=>(o(r,e),s)};return{...u,...s,params:d,query:r.req.query()||{},cookies:p(r),telemetry:a,getKv:l}};export{j as enhanceContext};
@@ -1,8 +1,8 @@
1
1
  import type { CacheReadModelSchema, SetCacheParams } from '../types.js';
2
- import type { DatabaseInitializationResult, RepositoryInstanceOptions } from '../../../providers/database/types.js';
2
+ import type { DatabaseConnection, RepositoryInstanceOptions } from '../../../providers/database/types.js';
3
3
  export declare class CacheLocalRepository {
4
4
  #private;
5
- constructor(initializationResult: DatabaseInitializationResult);
5
+ constructor(dbConnection: DatabaseConnection);
6
6
  static getInstance(options: RepositoryInstanceOptions): Promise<CacheLocalRepository>;
7
7
  get(key: string, namespace: string): Promise<CacheReadModelSchema | null>;
8
8
  set(params: SetCacheParams): Promise<string | null>;
@@ -1 +1 @@
1
- import{and as o,eq as n}from"drizzle-orm";import{isTtlExpired as d}from"../../../utils/is-ttl-expired.js";import{logger as c}from"../../../tools/notifiers/logger.js";import{LocalDatabaseInitializationStrategy as m}from"../../../providers/database/database-initialization-strategy.js";import{MAIN_LOCAL_DATABASE_FOLDER as u,MAIN_DATABASE_MIGRATIONS_FOLDER as h,MAIN_LOCAL_DATABASE_NAME as A}from"../../../providers/database/constants.js";import{cacheTable as r}from"../../../providers/database/databases/main-sqlite/schemas/cache-table.js";import{createCacheDbRecord as g}from"../mappers/create-cache-db-record.js";import{createCacheReadModel as p}from"../mappers/create-cache-read-model.js";class i{static#t;#e;constructor(t){this.#e=t.client}static async getInstance(t){if(!i.#t){const a=await new m().initialize({...t,databaseName:A,additionalFolder:u,migrationsFolder:h});i.#t=new i(a)}return i.#t}async get(t,e){const a=[n(r.key,t)];e&&a.push(n(r.namespace,e));const l=await this.#e.client.select().from(r).where(o(...a)).get();if(!l)return null;const s=p(l);return d(s.ttlInSeconds,s.createdAt)?(await this.delete(t,e),null):s}async set(t){try{const e=g(t);return await this.#e.client.insert(r).values(e).onConflictDoUpdate({target:[r.key],set:{value:e.value,namespace:e.namespace,ttl:e.ttl,updatedAt:e.updatedAt}}),e.key}catch(e){return c.error("Error setting cache: "+e.message),null}}async delete(t,e){try{return await this.#e.client.delete(r).where(o(n(r.key,t),n(r.namespace,e))),!0}catch(a){return c.error("Error deleting cache: "+a.message),!1}}async deleteByNamespace(t){try{return await this.#e.client.delete(r).where(n(r.namespace,t)),!0}catch(e){return c.error("Error deleting cache by namespace: "+e.message),!1}}async clearAll(){try{return await this.#e.client.delete(r),!0}catch(t){return c.error("Error clearing all cache: "+t.message),!1}}}export{i as CacheLocalRepository};
1
+ import{and as l,eq as a}from"drizzle-orm";import{isTtlExpired as d}from"../../../utils/is-ttl-expired.js";import{logger as o}from"../../../tools/notifiers/logger.js";import{DatabaseConnectionFactory as m}from"../../../providers/database/database-connection-factory.js";import{cacheTable as r}from"../../../providers/database/databases/main-sqlite/schemas/cache-table.js";import{createCacheDbRecord as u}from"../mappers/create-cache-db-record.js";import{createCacheReadModel as h}from"../mappers/create-cache-read-model.js";class n{static#t;#e;constructor(t){this.#e=t.client}static async getInstance(t){if(!n.#t){const e=await m.create("main-local",t);if(!e)throw new Error("Failed to create db connection for cache local repository");n.#t=new n(e)}return n.#t}async get(t,e){const c=[a(r.key,t)];e&&c.push(a(r.namespace,e));const i=await this.#e.client.select().from(r).where(l(...c)).get();if(!i)return null;const s=h(i);return d(s.ttlInSeconds,s.createdAt)?(await this.delete(t,e),null):s}async set(t){try{const e=u(t);return await this.#e.client.insert(r).values(e).onConflictDoUpdate({target:[r.key],set:{value:e.value,namespace:e.namespace,ttl:e.ttl,updatedAt:e.updatedAt}}),e.key}catch(e){return o.error("Error setting cache: "+e.message),null}}async delete(t,e){try{return await this.#e.client.delete(r).where(l(a(r.key,t),a(r.namespace,e))),!0}catch(c){return o.error("Error deleting cache: "+c.message),!1}}async deleteByNamespace(t){try{return await this.#e.client.delete(r).where(a(r.namespace,t)),!0}catch(e){return o.error("Error deleting cache by namespace: "+e.message),!1}}async clearAll(){try{return await this.#e.client.delete(r),!0}catch(t){return o.error("Error clearing all cache: "+t.message),!1}}}export{n as CacheLocalRepository};
@@ -1,11 +1,11 @@
1
1
  import type { FileHashReadModelSchema } from '../types.js';
2
2
  import type { Filter } from '../../../providers/database/pagination/types.js';
3
3
  import type { FileHashStatus, UpsertFileHashParams } from '../types.js';
4
- import type { DatabaseInitializationResult, RepositoryInstanceOptions } from '../../../providers/database/types.js';
4
+ import type { DatabaseConnection, RepositoryInstanceOptions } from '../../../providers/database/types.js';
5
5
  import { BaseRepository } from '../../../providers/database/base-repository.js';
6
6
  export declare class FileHashesLocalRepository extends BaseRepository {
7
7
  #private;
8
- constructor(initializationResult: DatabaseInitializationResult);
8
+ constructor(dbConnection: DatabaseConnection);
9
9
  static getInstance(options: RepositoryInstanceOptions): Promise<FileHashesLocalRepository>;
10
10
  getByPath(filePath: string): Promise<FileHashReadModelSchema | null>;
11
11
  getAllOutdated(fileType: string): Promise<FileHashReadModelSchema[]>;
@@ -1 +1 @@
1
- import{FileHashesLocalWriteRepository as s}from"./file-hashes-local-write-repository.js";import{FileHashesLocalReadRepository as r}from"./file-hashes-local-read-repository.js";import{BaseRepository as n}from"../../../providers/database/base-repository.js";import{LocalDatabaseInitializationStrategy as o}from"../../../providers/database/database-initialization-strategy.js";import{MAIN_LOCAL_DATABASE_FOLDER as l,MAIN_DATABASE_MIGRATIONS_FOLDER as d,MAIN_LOCAL_DATABASE_NAME as A}from"../../../providers/database/constants.js";class e extends n{static#e;#a;#t;constructor(t){super(t),this.#a=new r(this.databaseClient),this.#t=new s(this.databaseClient)}static async getInstance(t){if(!e.#e){const i=await new o().initialize({...t,databaseName:A,additionalFolder:l,migrationsFolder:d});e.#e=new e(i)}return e.#e}async getByPath(t){return this.#a.getByPath(t)}async getAllOutdated(t){return this.#a.getAllOutdated(t)}async upsertFileHash(t){return await this.#t.upsertFileHash(t)}async updateFileHashesStatus(t,a){return this.#t.updateFileHashes(t,a)}async deleteFileHashes(t){return this.#t.deleteFileHashes(t)}}export{e as FileHashesLocalRepository};
1
+ import{DatabaseConnectionFactory as s}from"../../../providers/database/database-connection-factory.js";import{BaseRepository as r}from"../../../providers/database/base-repository.js";import{FileHashesLocalWriteRepository as i}from"./file-hashes-local-write-repository.js";import{FileHashesLocalReadRepository as n}from"./file-hashes-local-read-repository.js";class e extends r{static#e;#a;#t;constructor(t){super(t),this.#a=new n(this.databaseClient),this.#t=new i(this.databaseClient)}static async getInstance(t){if(!e.#e){const a=await s.create("main-local",t);if(!a)throw new Error("Failed to create db connection for file hashes local repository");e.#e=new e(a)}return e.#e}async getByPath(t){return this.#a.getByPath(t)}async getAllOutdated(t){return this.#a.getAllOutdated(t)}async upsertFileHash(t){return await this.#t.upsertFileHash(t)}async updateFileHashesStatus(t,a){return this.#t.updateFileHashes(t,a)}async deleteFileHashes(t){return this.#t.deleteFileHashes(t)}}export{e as FileHashesLocalRepository};
@@ -1,11 +1,11 @@
1
1
  import type { KvKey, KvReadSchema, KvSetOptions, KvValue, KvListSelector, KvListOptions, KvListResponse, KvTransaction } from '@redocly/config';
2
- import type { DatabaseInitializationResult, RepositoryInstanceOptions } from '../../../providers/database/types.js';
2
+ import type { DatabaseConnection, RepositoryInstanceOptions } from '../../../providers/database/types.js';
3
3
  import { BaseRepository } from '../../../providers/database/base-repository.js';
4
4
  export declare const KV_KEY_END_BOUNDARY = "\u0002";
5
5
  export declare class KvRemoteRepository extends BaseRepository {
6
6
  #private;
7
- constructor(initializationResult: DatabaseInitializationResult);
8
- static getInstance(options: RepositoryInstanceOptions): Promise<KvRemoteRepository | undefined>;
7
+ constructor(dbConnection: DatabaseConnection);
8
+ static getInstance(options: RepositoryInstanceOptions): Promise<KvRemoteRepository | null>;
9
9
  get<T extends KvValue = KvValue>(key: KvKey): Promise<KvReadSchema<T> | null>;
10
10
  getMany<T extends KvValue = KvValue>(keys: KvKey[]): Promise<(KvReadSchema<T> | null)[]>;
11
11
  list<T extends KvValue = KvValue>(selector: KvListSelector, options?: KvListOptions): Promise<KvListResponse<T>>;
@@ -1 +1 @@
1
- import{eq as T,and as f,gte as y,gt as S,lt as p,asc as R,desc as v,or as b,isNull as w,sql as g,inArray as x,count as C}from"drizzle-orm";import{logger as d}from"../../../tools/notifiers/logger.js";import{SQLD_REMOTE_DATABASE_FOLDER as M,SQLD_REMOTE_DATABASE_MIGRATIONS_FOLDER as O,SQLD_REMOTE_DATABASE_NAME as L}from"../../../constants/sqld-remote-database.js";import{DatabaseConnectionsManager as B}from"../../../providers/database/database-connections-manager.js";import{kvTable as t}from"../../../providers/database/databases/sqld-sqlite/schemas/kv-table.js";import{BaseRepository as k}from"../../../providers/database/base-repository.js";import{RemoteDatabaseInitializationStrategy as U}from"../../../providers/database/database-initialization-strategy.js";import{createKvReadRecord as D}from"../mappers/create-kv-read-record.js";import{createKvDbRecord as N,encodeKvKey as i}from"../mappers/create-kv-db-record.js";const Q="";class u extends k{static#e;constructor(e){super(e)}static async getInstance(e){if(!u.#e){const n=process.env.SQLD_REMOTE_DATABASE_URL&&process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN,r=e.sqldRemoteDatabaseUrl&&e.sqldRemoteDatabaseAuthToken;if(!n&&!r){process.env.NEW_CATALOG_ENABLED==="true"&&d.warn("SQLD_REMOTE_DATABASE_URL and SQLD_REMOTE_DATABASE_AUTH_TOKEN env variables or sqldRemoteDatabaseUrl and sqldRemoteDatabaseAuthToken options not set - remote database will not be initialized");return}try{const a=await B.getConnection({config:{...e,databaseName:L,additionalFolder:M,migrationsFolder:O,syncUrl:process.env.SQLD_REMOTE_DATABASE_URL||e.sqldRemoteDatabaseUrl,authToken:process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN||e.sqldRemoteDatabaseAuthToken},strategy:new U});if(!a)throw new Error("Remote database connection initialization failed");u.#e=new u(a)}catch{u.#e=void 0;return}}return u.#e}async get(e){try{const n=i(e),r=await this.databaseClient.client.select().from(t).where(f(T(t.encodedKey,n),b(w(t.expiresAt),y(t.expiresAt,g`datetime('now')`)))).get();return r?D(r):null}catch(n){return d.error("Error getting kv entry by key",n),null}}async getMany(e){try{if(e.length===0)return[];const n=e.map(c=>i(c)),r=await this.databaseClient.client.select().from(t).where(x(t.encodedKey,n)).all(),a=new Map(r.map(c=>[c.encodedKey,c]));return e.map((c,E)=>{const m=n[E],l=a.get(m);return!l||this.#t(l.expiresAt)?null:D(l)})}catch(n){return d.error("Error getting multiple kv entries",n),[]}}async list(e,n){try{const r=n?.limit??100,a=n?.reverse??!1,s=[],c=b(w(t.expiresAt),y(t.expiresAt,g`datetime('now')`));if(s.push(c),"prefix"in e){const o=i(e.prefix),h="start"in e?i(e.start):o,K="end"in e?i(e.end):o+Q;s.push(y(t.encodedKey,h)),s.push(p(t.encodedKey,K))}else if("start"in e&&"end"in e){const o=i(e.start),h=i(e.end);s.push(y(t.encodedKey,o)),s.push(p(t.encodedKey,h))}if(n?.cursor){const o=a?p(t.encodedKey,n.cursor):S(t.encodedKey,n.cursor);s.push(o)}const E=this.databaseClient.client.select().from(t),m=s.length>0?E.where(f(...s)):E,l=this.databaseClient.client.select({count:C()}).from(t),_=(await(s.length>0?l.where(f(...s)):l).get())?.count??0,A=await m.orderBy(a?v(t.encodedKey):R(t.encodedKey)).limit(r).all();return{items:A.map(o=>D(o)),total:_,cursor:_>A.length?A[A.length-1]?.encodedKey??null:null}}catch(r){return d.error("Error listing kv entries",r),{items:[],total:0,cursor:null}}}async set(e,n,r){try{const a=N({key:e,value:n,ttlInSeconds:r?.ttlInSeconds});return await this.databaseClient.client.insert(t).values(a).onConflictDoUpdate({target:[t.encodedKey],set:{value:a.value,expiresAt:a.expiresAt,updatedAt:a.updatedAt}}),a.encodedKey}catch(a){return d.error("Error saving kv entry",a),null}}async delete(e){try{const n=i(e);return await this.databaseClient.client.delete(t).where(T(t.encodedKey,n)),!0}catch(n){return d.error("Error deleting kv entry by key",n),!1}}async clearExpired(){try{await this.databaseClient.client.delete(t).where(y(t.expiresAt,g`datetime('now')`))}catch(e){d.error("Error clearing expired kv entries",e)}}async transaction(e){return this.databaseClient.transactionsManager.transaction(async()=>e({get:async r=>this.get(r),getMany:async r=>this.getMany(r),set:async(r,a,s)=>this.set(r,a,s),delete:async r=>this.delete(r)}))}#t(e){return e?new Date(e)<new Date:!1}}export{Q as KV_KEY_END_BOUNDARY,u as KvRemoteRepository};
1
+ import{eq as C,and as f,gte as y,gt as k,lt as w,asc as D,desc as M,or as v,isNull as E,sql as K,inArray as B,count as q}from"drizzle-orm";import{logger as d}from"../../../tools/notifiers/logger.js";import{kvTable as r}from"../../../providers/database/databases/sqld-sqlite/schemas/kv-table.js";import{BaseRepository as I}from"../../../providers/database/base-repository.js";import{DatabaseConnectionFactory as N}from"../../../providers/database/database-connection-factory.js";import{createKvReadRecord as x}from"../mappers/create-kv-read-record.js";import{createKvDbRecord as S,encodeKvKey as o}from"../mappers/create-kv-db-record.js";const Q="";class l extends I{static#e;constructor(e){super(e)}static async getInstance(e){if(!l.#e)try{const t=await N.create("sqld-remote",e);if(!t)return l.#e=null,null;l.#e=new l(t)}catch(t){return d.error("Error creating kv remote repository",t),l.#e=null,null}return l.#e}async get(e){try{const t=o(e),n=await this.databaseClient.client.select().from(r).where(f(C(r.encodedKey,t),v(E(r.expiresAt),y(r.expiresAt,K`datetime('now')`)))).get();return n?x(n):null}catch(t){return d.error("Error getting kv entry by key",t),null}}async getMany(e){try{if(e.length===0)return[];const t=e.map(i=>o(i)),n=await this.databaseClient.client.select().from(r).where(B(r.encodedKey,t)).all(),s=new Map(n.map(i=>[i.encodedKey,i]));return e.map((i,h)=>{const p=t[h],u=s.get(p);return!u||this.#t(u.expiresAt)?null:x(u)})}catch(t){return d.error("Error getting multiple kv entries",t),[]}}async list(e,t){try{const n=t?.limit??100,s=t?.reverse??!1,a=[],i=v(E(r.expiresAt),y(r.expiresAt,K`datetime('now')`));if(a.push(i),"prefix"in e){const c=o(e.prefix),g="start"in e?o(e.start):c,A="end"in e?o(e.end):c+Q;a.push(y(r.encodedKey,g)),a.push(w(r.encodedKey,A))}else if("start"in e&&"end"in e){const c=o(e.start),g=o(e.end);a.push(y(r.encodedKey,c)),a.push(w(r.encodedKey,g))}if(t?.cursor){const c=s?w(r.encodedKey,t.cursor):k(r.encodedKey,t.cursor);a.push(c)}const h=this.databaseClient.client.select().from(r),p=a.length>0?h.where(f(...a)):h,u=this.databaseClient.client.select({count:q()}).from(r),b=(await(a.length>0?u.where(f(...a)):u).get())?.count??0,m=await p.orderBy(s?M(r.encodedKey):D(r.encodedKey)).limit(n).all();return{items:m.map(c=>x(c)),total:b,cursor:b>m.length?m[m.length-1]?.encodedKey??null:null}}catch(n){return d.error("Error listing kv entries",n),{items:[],total:0,cursor:null}}}async set(e,t,n){try{const s=S({key:e,value:t,ttlInSeconds:n?.ttlInSeconds});return await this.databaseClient.client.insert(r).values(s).onConflictDoUpdate({target:[r.encodedKey],set:{value:s.value,expiresAt:s.expiresAt,updatedAt:s.updatedAt}}),s.encodedKey}catch(s){return d.error("Error saving kv entry",s),null}}async delete(e){try{const t=o(e);return await this.databaseClient.client.delete(r).where(C(r.encodedKey,t)),!0}catch(t){return d.error("Error deleting kv entry by key",t),!1}}async clearExpired(){try{await this.databaseClient.client.delete(r).where(y(r.expiresAt,K`datetime('now')`))}catch(e){d.error("Error clearing expired kv entries",e)}}async transaction(e){return this.databaseClient.transactionsManager.transaction(async()=>e({get:async n=>this.get(n),getMany:async n=>this.getMany(n),set:async(n,s,a)=>this.set(n,s,a),delete:async n=>this.delete(n)}))}#t(e){return e?new Date(e)<new Date:!1}}export{Q as KV_KEY_END_BOUNDARY,l as KvRemoteRepository};
@@ -3,7 +3,7 @@ import type { KvValue, KvKey, KvReadSchema, KvSetOptions, KvListOptions, KvListR
3
3
  import { KvRemoteRepository } from '../repositories/kv-remote-repository.js';
4
4
  export declare class KvService {
5
5
  #private;
6
- constructor(remoteRepository: KvRemoteRepository | undefined);
6
+ constructor(remoteRepository: KvRemoteRepository | null);
7
7
  static getInstance(options: ServiceInstanceOptions): Promise<KvService>;
8
8
  /**
9
9
  * Get a kv entry by key
@@ -1 +1 @@
1
- import{isTtlCorrect as o}from"../../../utils/is-ttl-correct.js";import{KvRemoteRepository as c}from"../repositories/kv-remote-repository.js";class n{static#e;#t;constructor(t){this.#t=t}static async#n(t){const e=await c.getInstance(t),s=new n(e);n.#e=s}static async getInstance(t){return t.removeExisting===void 0&&(t.removeExisting=!1),n.#e||await n.#n(t),n.#e}async get(t){return await this.#t?.sync(),await this.#t?.get(t)??null}async getMany(t){return await this.#t?.sync(),await this.#t?.getMany(t)??[]}async list(t,e){return await this.#t?.sync(),await this.#t?.list(t,e)??{items:[],total:0,cursor:null}}async set(t,e,s){if(this.#r(e),this.#s(e),!o(s?.ttlInSeconds))throw new Error("TTL must be null or a positive number");return await this.#t?.set(t,e,s)??null}async delete(t){return!!await this.#t?.delete(t)}async clearExpired(){return await this.#t?.clearExpired()}async transaction(t){if(!this.#t)throw new Error("Remote repository not available for transactions");return await this.#t.sync(),this.#t.transaction(async e=>t({get:async r=>e.get(r),getMany:async r=>e.getMany(r),set:async(r,i,a)=>{if(this.#r(i),this.#s(i),!o(a?.ttlInSeconds))throw new Error("TTL must be null or a positive number");return e.set(r,i,a)},delete:async r=>e.delete(r)}))}#r(t){try{JSON.stringify(t)}catch(e){const s=e instanceof Error?e.message:"Unknown error";throw new Error(`Value is not JSON serializable: ${s}`)}}#s(t){const s=JSON.stringify(t),r=Buffer.byteLength(s,"utf8");if(r>1048576){const i=(r/1024).toFixed(2);throw new Error(`Value size (${i} KB) exceeds the maximum allowed size of 1 MB (1024 KB)`)}}}export{n as KvService};
1
+ import{isTtlCorrect as o}from"../../../utils/is-ttl-correct.js";import{KvRemoteRepository as c}from"../repositories/kv-remote-repository.js";class n{static#e;#t;constructor(t){this.#t=t}static async#n(t){const e=await c.getInstance(t),s=new n(e);n.#e=s}static async getInstance(t){return n.#e||await n.#n(t),n.#e}async get(t){return await this.#t?.sync(),await this.#t?.get(t)??null}async getMany(t){return await this.#t?.sync(),await this.#t?.getMany(t)??[]}async list(t,e){return await this.#t?.sync(),await this.#t?.list(t,e)??{items:[],total:0,cursor:null}}async set(t,e,s){if(this.#r(e),this.#s(e),!o(s?.ttlInSeconds))throw new Error("TTL must be null or a positive number");return await this.#t?.set(t,e,s)??null}async delete(t){return!!await this.#t?.delete(t)}async clearExpired(){return await this.#t?.clearExpired()}async transaction(t){if(!this.#t)throw new Error("Remote repository not available for transactions");return await this.#t.sync(),this.#t.transaction(async e=>t({get:async r=>e.get(r),getMany:async r=>e.getMany(r),set:async(r,a,i)=>{if(this.#r(a),this.#s(a),!o(i?.ttlInSeconds))throw new Error("TTL must be null or a positive number");return e.set(r,a,i)},delete:async r=>e.delete(r)}))}#r(t){try{JSON.stringify(t)}catch(e){const s=e instanceof Error?e.message:"Unknown error";throw new Error(`Value is not JSON serializable: ${s}`)}}#s(t){const s=JSON.stringify(t),r=Buffer.byteLength(s,"utf8");if(r>1048576){const a=(r/1024).toFixed(2);throw new Error(`Value size (${a} KB) exceeds the maximum allowed size of 1 MB (1024 KB)`)}}}export{n as KvService};
@@ -22,7 +22,7 @@ type BulkSyncResult<T> = Array<{
22
22
  }>;
23
23
  export declare class CatalogEntitiesService {
24
24
  #private;
25
- constructor(localRepository: CatalogEntitiesLocalRepository, remoteRepository?: CatalogEntitiesRemoteRepository);
25
+ constructor(localRepository: CatalogEntitiesLocalRepository, remoteRepository: CatalogEntitiesRemoteRepository | null);
26
26
  static getInstance(options: ServiceInstanceOptions): Promise<CatalogEntitiesService>;
27
27
  transaction<T>(...args: Parameters<TransactionsManager['transaction']>): Promise<T>;
28
28
  getEntities(paginationParams: PaginationParams): Promise<ListResponseResult<EntityReadModelSchema>>;
@@ -1 +1 @@
1
- import{entityFileSchema as d}from"@redocly/config";import{deepMerge as y}from"../../../../utils/object/deep-merge.js";import{promiseMapLimit as c}from"../../../utils/async/promise-map-limit.js";import{logger as r}from"../../../tools/notifiers/logger.js";import{entityRelationDtoSchema as h}from"../schemas/dto-schemas.js";import{CatalogEntitiesLocalRepository as m}from"./repositories/local/catalog-entities-local-repository.js";import{CatalogEntitiesRemoteRepository as R}from"./repositories/remote/catalog-entities-remote-repository.js";import{prepareListResponse as o}from"../../../web-server/utils/prepare-list-response.js";import{ENTITY_RELATION_FROM_DATABASE as l}from"./mappers/field-transformations.js";import{createValidator as u}from"../utils/ajv-validator.js";import{hasOptionsChanged as w}from"../utils/has-options-changed.js";const E=15,f=u(h,{errorPrefix:"Entity relation validation failed:",dataVar:"entity relation"}),p=u(d,{errorPrefix:"Entity file validation failed:",dataVar:"entity"});class n{static#a;static#i;#t;#e;constructor(t,e){this.#t=t,this.#e=e}static async#n(t){const[e,a]=await Promise.all([m.getInstance(t),t.runOnlyLocalDatabase?void 0:R.getInstance(t)]),i=new n(e,a);a&&(process.env.NODE_ENV==="development"&&r.info("Attaching remote database to local database"),await i.#t.attachDatabase(a.path)),n.#a=i,n.#i=t}static async getInstance(t){return t.runOnlyLocalDatabase===void 0&&(t.runOnlyLocalDatabase=process.env.REDOCLY_LOCAL_DEV==="true"||process.env.CI==="true"),t.removeExisting===void 0&&(t.removeExisting=!1),(!n.#a||w(n.#i,t))&&await n.#n(t),n.#a}async transaction(...t){return this.#t.transactionsManager.transaction(...t)}async getEntities(t){await this.#e?.sync();const{items:e,total:a,hasMore:i}=await this.#t.getEntities(t);return o({data:e,params:t,totalCount:a,hasMore:i})}async getEntityByKey(t){return await this.#e?.sync(),await this.#t.getEntityByKey(t)}async getEntitiesCountByTypes(){return await this.#e?.sync(),this.#t.getEntitiesCountByTypes()}async getCatalogFilters(t){return await this.#e?.sync(),this.#t.getCatalogFilters(t)}async createEntity(t){return this.#e?this.#e.createEntity(t):(r.warn("No remote database found"),null)}async createEntities(t){const e=this.#e;return e?await c(t,E,async a=>e.createEntity(a).then(i=>({status:"ok",resource:i})).catch(i=>({key:a.key,status:"error",error:i}))):(r.warn("No remote database found"),[])}getEntitySources(){return this.#t.getEntitySources()}async createEntityInLocalDatabase(t){await this.#t.createEntity(t)}async createEntitiesInLocalDatabase(t){await this.#t.createEntities(t)}async createEntityRelationInLocalDatabase(t){await this.#t.createEntityRelation(t)}async createEntityRelationsInLocalDatabase(t){await this.#t.createEntityRelations(t)}async updateEntityByKey(t,e){const a=await this.#t.getEntityByKey(t);if(!a)throw new Error(`Entity with key ${t} not found`);const i=y(a,e),s=p(i);return await this.#e?.updateEntity({...s,id:a.id,createdAt:a.createdAt||""})}async deleteEntityByKey(t){const e=await this.#e?.deleteEntity(t);return await this.#s(t),e}async deleteEntitiesInLocalDatabase(t){await this.#t.deleteEntities(t)}async getEntityRelationById(t){return await this.#e?.sync(),await this.#t.getEntityRelationById(t)}async getEntitiesRelations(t={}){await this.#e?.sync();const{items:e,total:a,hasMore:i}=await this.#t.getEntitiesRelations(t);return o({data:e,params:t,totalCount:a,nameTransformationsFromDatabase:l,hasMore:i})}async createEntityRelation(t){return this.#e?.createEntityRelation(t)}async createEntitiesRelations(t){const e=this.#e;return e?await c(t,E,async a=>e.createEntityRelation(a).then(i=>({status:"ok",resource:i})).catch(i=>({key:a.sourceKey,status:"error",error:i}))):(r.warn("No remote database found"),[])}async updateEntityRelation(t,e){const a=await this.#t.getEntityRelationById(t);if(!a)throw new Error(`Entity relation with id ${t} not found`);const i=y(a,e),s=f(i);return this.#e?.createEntityRelation(s)}async deleteEntityRelation(t){let e=await this.#e?.deleteEntityRelation(t);return e||(e=await this.#t.deleteEntityRelation(t)),e}async deleteEntityRelationsInLocalDatabase(t){await this.#t.deleteEntityRelations(t)}async getEntitiesWithRelations(t={}){await this.#e?.sync();const{items:e,total:a,hasMore:i}=await this.#t.getEntitiesWithRelations(t);return o({data:e,params:t,totalCount:a,hasMore:i})}async getEntityWithRelationsByKey(t,e={}){return this.#t.getEntityWithRelationsByKey(t,e)}async getRelatedEntities(t,e={}){await this.#e?.sync();const{items:a,total:i,hasMore:s}=await this.#t.getRelatedEntities(t,e);return o({data:a,params:e,totalCount:i,nameTransformationsFromDatabase:l,hasMore:s})}async#s(t){await this.#e?.deleteEntitiesRelations({op:"OR",conditions:[{field:"source_key",operator:"equal",value:t},{field:"target_key",operator:"equal",value:t}]})}async listEntityRevisions(t,e){return await this.#e?.sync(),this.#t.listEntityRevisions(t,e)}async updateEntityScorecardsStatus(t,e){return await this.#e?.sync(),this.#t.updateEntityScorecardsStatus(t,e)}async updateEntityScorecardsStatusIfCalculating(t,e){return await this.#e?.sync(),this.#t.updateEntityScorecardsStatusIfCalculating(t,e)}async getOutdatedEntity(){return await this.#e?.sync(),this.#t.getOneOutdatedEntity()}}export{n as CatalogEntitiesService};
1
+ import{entityFileSchema as d}from"@redocly/config";import{deepMerge as y}from"../../../../utils/object/deep-merge.js";import{promiseMapLimit as c}from"../../../utils/async/promise-map-limit.js";import{logger as r}from"../../../tools/notifiers/logger.js";import{entityRelationDtoSchema as h}from"../schemas/dto-schemas.js";import{CatalogEntitiesLocalRepository as m}from"./repositories/local/catalog-entities-local-repository.js";import{CatalogEntitiesRemoteRepository as R}from"./repositories/remote/catalog-entities-remote-repository.js";import{prepareListResponse as o}from"../../../web-server/utils/prepare-list-response.js";import{ENTITY_RELATION_FROM_DATABASE as l}from"./mappers/field-transformations.js";import{createValidator as u}from"../utils/ajv-validator.js";import{hasOptionsChanged as w}from"../utils/has-options-changed.js";const E=15,f=u(h,{errorPrefix:"Entity relation validation failed:",dataVar:"entity relation"}),p=u(d,{errorPrefix:"Entity file validation failed:",dataVar:"entity"});class n{static#a;static#i;#t;#e;constructor(t,e){this.#t=t,this.#e=e}static async#n(t){const[e,a]=await Promise.all([m.getInstance(t),t.runOnlyLocalDatabase?null:R.getInstance(t)]),i=new n(e,a);a&&(process.env.NODE_ENV==="development"&&r.info("Attaching remote database to local database"),await i.#t.attachDatabase(a.path)),n.#a=i,n.#i=t}static async getInstance(t){return t.runOnlyLocalDatabase===void 0&&(t.runOnlyLocalDatabase=process.env.REDOCLY_LOCAL_DEV==="true"||process.env.CI==="true"),t.removeExisting===void 0&&(t.removeExisting=!1),(!n.#a||w(n.#i,t))&&await n.#n(t),n.#a}async transaction(...t){return this.#t.transactionsManager.transaction(...t)}async getEntities(t){await this.#e?.sync();const{items:e,total:a,hasMore:i}=await this.#t.getEntities(t);return o({data:e,params:t,totalCount:a,hasMore:i})}async getEntityByKey(t){return await this.#e?.sync(),await this.#t.getEntityByKey(t)}async getEntitiesCountByTypes(){return await this.#e?.sync(),this.#t.getEntitiesCountByTypes()}async getCatalogFilters(t){return await this.#e?.sync(),this.#t.getCatalogFilters(t)}async createEntity(t){return this.#e?this.#e.createEntity(t):(r.warn("No remote database found"),null)}async createEntities(t){const e=this.#e;return e?await c(t,E,async a=>e.createEntity(a).then(i=>({status:"ok",resource:i})).catch(i=>({key:a.key,status:"error",error:i}))):(r.warn("No remote database found"),[])}getEntitySources(){return this.#t.getEntitySources()}async createEntityInLocalDatabase(t){await this.#t.createEntity(t)}async createEntitiesInLocalDatabase(t){await this.#t.createEntities(t)}async createEntityRelationInLocalDatabase(t){await this.#t.createEntityRelation(t)}async createEntityRelationsInLocalDatabase(t){await this.#t.createEntityRelations(t)}async updateEntityByKey(t,e){const a=await this.#t.getEntityByKey(t);if(!a)throw new Error(`Entity with key ${t} not found`);const i=y(a,e),s=p(i);return await this.#e?.updateEntity({...s,id:a.id,createdAt:a.createdAt||""})}async deleteEntityByKey(t){const e=await this.#e?.deleteEntity(t);return await this.#s(t),e}async deleteEntitiesInLocalDatabase(t){await this.#t.deleteEntities(t)}async getEntityRelationById(t){return await this.#e?.sync(),await this.#t.getEntityRelationById(t)}async getEntitiesRelations(t={}){await this.#e?.sync();const{items:e,total:a,hasMore:i}=await this.#t.getEntitiesRelations(t);return o({data:e,params:t,totalCount:a,nameTransformationsFromDatabase:l,hasMore:i})}async createEntityRelation(t){return this.#e?.createEntityRelation(t)}async createEntitiesRelations(t){const e=this.#e;return e?await c(t,E,async a=>e.createEntityRelation(a).then(i=>({status:"ok",resource:i})).catch(i=>({key:a.sourceKey,status:"error",error:i}))):(r.warn("No remote database found"),[])}async updateEntityRelation(t,e){const a=await this.#t.getEntityRelationById(t);if(!a)throw new Error(`Entity relation with id ${t} not found`);const i=y(a,e),s=f(i);return this.#e?.createEntityRelation(s)}async deleteEntityRelation(t){let e=await this.#e?.deleteEntityRelation(t);return e||(e=await this.#t.deleteEntityRelation(t)),e}async deleteEntityRelationsInLocalDatabase(t){await this.#t.deleteEntityRelations(t)}async getEntitiesWithRelations(t={}){await this.#e?.sync();const{items:e,total:a,hasMore:i}=await this.#t.getEntitiesWithRelations(t);return o({data:e,params:t,totalCount:a,hasMore:i})}async getEntityWithRelationsByKey(t,e={}){return this.#t.getEntityWithRelationsByKey(t,e)}async getRelatedEntities(t,e={}){await this.#e?.sync();const{items:a,total:i,hasMore:s}=await this.#t.getRelatedEntities(t,e);return o({data:a,params:e,totalCount:i,nameTransformationsFromDatabase:l,hasMore:s})}async#s(t){await this.#e?.deleteEntitiesRelations({op:"OR",conditions:[{field:"source_key",operator:"equal",value:t},{field:"target_key",operator:"equal",value:t}]})}async listEntityRevisions(t,e){return await this.#e?.sync(),this.#t.listEntityRevisions(t,e)}async updateEntityScorecardsStatus(t,e){return await this.#e?.sync(),this.#t.updateEntityScorecardsStatus(t,e)}async updateEntityScorecardsStatusIfCalculating(t,e){return await this.#e?.sync(),this.#t.updateEntityScorecardsStatusIfCalculating(t,e)}async getOutdatedEntity(){return await this.#e?.sync(),this.#t.getOneOutdatedEntity()}}export{n as CatalogEntitiesService};
@@ -2,13 +2,13 @@ import type { Filter } from '../../../../../providers/database/pagination/types.
2
2
  import type { PaginationParams } from '../../../../../providers/database/pagination/schemas.js';
3
3
  import type { EntityRelationDtoSchema } from '../../../../../plugins/catalog-entities/schemas/dto-schemas.js';
4
4
  import type { ScorecardsStatus } from '../../../../../plugins/catalog-entities/entities/types.js';
5
- import type { DatabaseInitializationResult, RepositoryInstanceOptions } from '../../../../../providers/database/types.js';
5
+ import type { DatabaseConnection, RepositoryInstanceOptions } from '../../../../../providers/database/types.js';
6
6
  import type { CatalogFiltersParams } from './catalog-entities-local-read-repository.js';
7
- import { type CreateEntityParams } from './catalog-entities-local-write-repository.js';
8
7
  import { BaseRepository } from '../../../../../providers/database/base-repository.js';
8
+ import { type CreateEntityParams } from './catalog-entities-local-write-repository.js';
9
9
  export declare class CatalogEntitiesLocalRepository extends BaseRepository {
10
10
  #private;
11
- constructor(initializationResult: DatabaseInitializationResult);
11
+ constructor(dbConnection: DatabaseConnection);
12
12
  get transactionsManager(): import("../../../../../providers/database/transactions-manager.js").TransactionsManager;
13
13
  getEntitySources(): Record<string, string>;
14
14
  static getInstance(options: RepositoryInstanceOptions): Promise<CatalogEntitiesLocalRepository>;
@@ -1 +1 @@
1
- import{promiseMapLimit as n}from"../../../../../utils/async/promise-map-limit.js";import{CatalogEntitiesLocalReadRepository as r}from"./catalog-entities-local-read-repository.js";import{CatalogEntitiesLocalWriteRepository as o}from"./catalog-entities-local-write-repository.js";import{createEntityRelationDbRecordFromDto as y}from"../../mappers/create-entity-relation-db-record-from-dto.js";import{BaseRepository as l}from"../../../../../providers/database/base-repository.js";import{LocalDatabaseInitializationStrategy as E}from"../../../../../providers/database/database-initialization-strategy.js";import{CATALOG_DATABASE_MIGRATIONS_FOLDER as c,CATALOG_LOCAL_DATABASE_FOLDER as d,CATALOG_LOCAL_DATABASE_NAME as h}from"../../consts.js";import{hasOptionsChanged as u}from"../../../utils/has-options-changed.js";const a=50;class i extends l{static#i;static#n;#t;#e;#a={};constructor(t){super(t),this.#t=new r(this.databaseClient),this.#e=new o(this.databaseClient,this.organizationId,this.projectId)}get transactionsManager(){return this.databaseClient.transactionsManager}getEntitySources(){return this.#a}static async getInstance(t){const e=u(i.#n,t);if(!i.#i||e){const s=await new E().initialize({databaseName:h,additionalFolder:d,migrationsFolder:c,...t});i.#i=new i(s),i.#n=t}return i.#i}async attachDatabase(t){await this.#t.attachDatabase(t)}getEntities(t={}){return this.#t.getEntities(t)}getEntityByKey(t){return this.#t.getEntityByKey(t)}getEntitiesCountByTypes(){return this.#t.getEntitiesCountByTypes()}getEntitiesRelations(t={}){return this.#t.getEntitiesRelations(t)}getEntityRelationById(t){return this.#t.getEntityRelationById(t)}getEntitiesWithRelations(t={}){return this.#t.getEntitiesWithRelations(t)}getEntityWithRelationsByKey(t,e={}){return this.#t.getEntityWithRelationsByKey(t,e)}getRelatedEntities(t,e={}){return this.#t.getRelatedEntities(t,e)}createEntity(t){return t.isRootEntity&&(this.#a[t.sourceFile]=t.entity.key),this.#e.createEntity(t)}async createEntities(t){await n(t,a,async e=>this.createEntity(e))}createEntityRelation(t){const e=y(t,this.organizationId,this.projectId);return this.#e.createEntityRelation(e)}async createEntityRelations(t){await n(t,a,async e=>this.createEntityRelation(e))}deleteEntity(t){return this.#e.deleteEntity(t)}deleteEntities(t){return this.#e.deleteEntities(t)}deleteEntityRelation(t){return this.#e.deleteEntityRelation(t)}deleteEntityRelations(t){return this.#e.deleteEntityRelations(t)}getCatalogFilters(t){return this.#t.getCatalogFilters(t)}listEntityRevisions(t,e){return this.#t.listEntityRevisions(t,e)}updateEntityScorecardsStatus(t,e){return this.#e.updateEntityScorecardsStatus(t,e)}updateEntityScorecardsStatusIfCalculating(t,e){return this.#e.updateEntityScorecardsStatusIfCalculating(t,e)}getOneOutdatedEntity(){return this.#t.getOneOutdatedEntity()}}export{i as CatalogEntitiesLocalRepository};
1
+ import{promiseMapLimit as a}from"../../../../../utils/async/promise-map-limit.js";import{DatabaseConnectionFactory as r}from"../../../../../providers/database/database-connection-factory.js";import{BaseRepository as o}from"../../../../../providers/database/base-repository.js";import{CatalogEntitiesLocalReadRepository as c}from"./catalog-entities-local-read-repository.js";import{CatalogEntitiesLocalWriteRepository as y}from"./catalog-entities-local-write-repository.js";import{createEntityRelationDbRecordFromDto as l}from"../../mappers/create-entity-relation-db-record-from-dto.js";import{hasOptionsChanged as h}from"../../../utils/has-options-changed.js";const s=50;class i extends o{static#i;static#n;#t;#e;#a={};constructor(t){super(t),this.#t=new c(this.databaseClient),this.#e=new y(this.databaseClient,this.organizationId,this.projectId)}get transactionsManager(){return this.databaseClient.transactionsManager}getEntitySources(){return this.#a}static async getInstance(t){const e=h(i.#n,t);if(!i.#i||e){const n=await r.create("catalog-local",t);if(!n)throw new Error("Failed to create db connection for catalog entities local repository");i.#i=new i(n),i.#n=t}return i.#i}async attachDatabase(t){await this.#t.attachDatabase(t)}getEntities(t={}){return this.#t.getEntities(t)}getEntityByKey(t){return this.#t.getEntityByKey(t)}getEntitiesCountByTypes(){return this.#t.getEntitiesCountByTypes()}getEntitiesRelations(t={}){return this.#t.getEntitiesRelations(t)}getEntityRelationById(t){return this.#t.getEntityRelationById(t)}getEntitiesWithRelations(t={}){return this.#t.getEntitiesWithRelations(t)}getEntityWithRelationsByKey(t,e={}){return this.#t.getEntityWithRelationsByKey(t,e)}getRelatedEntities(t,e={}){return this.#t.getRelatedEntities(t,e)}createEntity(t){return t.isRootEntity&&(this.#a[t.sourceFile]=t.entity.key),this.#e.createEntity(t)}async createEntities(t){await a(t,s,async e=>this.createEntity(e))}createEntityRelation(t){const e=l(t,this.organizationId,this.projectId);return this.#e.createEntityRelation(e)}async createEntityRelations(t){await a(t,s,async e=>this.createEntityRelation(e))}deleteEntity(t){return this.#e.deleteEntity(t)}deleteEntities(t){return this.#e.deleteEntities(t)}deleteEntityRelation(t){return this.#e.deleteEntityRelation(t)}deleteEntityRelations(t){return this.#e.deleteEntityRelations(t)}getCatalogFilters(t){return this.#t.getCatalogFilters(t)}listEntityRevisions(t,e){return this.#t.listEntityRevisions(t,e)}updateEntityScorecardsStatus(t,e){return this.#e.updateEntityScorecardsStatus(t,e)}updateEntityScorecardsStatusIfCalculating(t,e){return this.#e.updateEntityScorecardsStatusIfCalculating(t,e)}getOneOutdatedEntity(){return this.#t.getOneOutdatedEntity()}}export{i as CatalogEntitiesLocalRepository};
@@ -1,15 +1,15 @@
1
1
  import type { EntityReadModelSchema } from '../../../schemas/read-model-schemas.js';
2
2
  import type { EntityDtoSchema, EntityRelationDtoSchema } from '../../../schemas/dto-schemas.js';
3
3
  import type { Filter } from '../../../../../providers/database/pagination/types.js';
4
- import type { DatabaseInitializationResult, RepositoryInstanceOptions } from '../../../../../providers/database/types.js';
5
- import { type DatabaseEntityRelation } from '../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js';
4
+ import type { DatabaseConnection, RepositoryInstanceOptions } from '../../../../../providers/database/types.js';
5
+ import type { DatabaseEntityRelation } from '../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js';
6
6
  import { BaseRepository } from '../../../../../providers/database/base-repository.js';
7
7
  export declare class CatalogEntitiesRemoteRepository extends BaseRepository {
8
8
  #private;
9
9
  get transactionsManager(): import("../../../../../providers/database/transactions-manager.js").TransactionsManager;
10
- constructor(initializationResult: DatabaseInitializationResult);
10
+ constructor(dbConnection: DatabaseConnection);
11
11
  sync(): Promise<void>;
12
- static getInstance(options: RepositoryInstanceOptions): Promise<CatalogEntitiesRemoteRepository | undefined>;
12
+ static getInstance(options: RepositoryInstanceOptions): Promise<CatalogEntitiesRemoteRepository | null>;
13
13
  createEntity(entity: EntityDtoSchema): Promise<EntityReadModelSchema | null>;
14
14
  updateEntity(entity: EntityDtoSchema & {
15
15
  id?: string;
@@ -1 +1 @@
1
- import{eq as E,sql as p}from"drizzle-orm";import{convertFilterToWhereCondition as g}from"../../../../../providers/database/pagination/filter.js";import{promiseMapLimit as A}from"../../../../../utils/async/promise-map-limit.js";import{logger as n}from"../../../../../tools/notifiers/logger.js";import{SQLD_REMOTE_DATABASE_FOLDER as T,SQLD_REMOTE_DATABASE_MIGRATIONS_FOLDER as f,SQLD_REMOTE_DATABASE_NAME as D}from"../../../../../constants/sqld-remote-database.js";import{telemetryTraceStep as i}from"../../../../../telemetry/helpers/trace-step.js";import{createEntityDbRecord as _}from"../../mappers/create-entity-db-record.js";import{createEntityReadModel as m}from"../../mappers/create-entity-read-model.js";import{createEntityRelationDbRecordFromDto as w}from"../../mappers/create-entity-relation-db-record-from-dto.js";import{entitiesTable as r}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as a}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{BaseRepository as b}from"../../../../../providers/database/base-repository.js";import{DatabaseConnectionsManager as R}from"../../../../../providers/database/database-connections-manager.js";import{RemoteDatabaseInitializationStrategy as S}from"../../../../../providers/database/database-initialization-strategy.js";const L=15;class s extends b{static#t;get transactionsManager(){return this.databaseClient.transactionsManager}constructor(t){super(t)}async sync(){return i("catalog_entities.remote_repository.sync",async()=>{await this.#e(),await this.databaseClient.sync()})}static async getInstance(t){return await i("catalog_entities.remote_repository.get_instance",async e=>{if(!s.#t){if(!process.env.SQLD_REMOTE_DATABASE_URL||!process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN){n.warn("SQLD_REMOTE_DATABASE_URL and SQLD_REMOTE_DATABASE_AUTH_TOKEN env variables not set - remote database will not be initialized"),e?.error(new Error("SQLD_REMOTE_DATABASE_URL and SQLD_REMOTE_DATABASE_AUTH_TOKEN env variables not set - remote database will not be initialized"));return}try{const o=await R.getConnection({config:{...t,databaseName:D,additionalFolder:T,migrationsFolder:f,syncUrl:process.env.SQLD_REMOTE_DATABASE_URL,authToken:process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN},strategy:new S});if(!o){n.warn("Remote database connection failed!"),e?.error(new Error("Remote database connection failed!")),s.#t=void 0;return}s.#t=new s(o)}catch(o){s.#t=void 0,e?.error(o);return}}return s.#t})}async createEntity(t){return i("catalog_entities.remote_repository.create_entity",async()=>{await this.#e();try{n.info(`Adding entity ${t.key} to remote database`);const e=_({entity:t,organizationId:this.organizationId,projectId:this.projectId,source:"remote",sourceFile:null,fileHash:null}),{key:o,source:u,...d}=e,l=await this.databaseClient.client.insert(r).values(e).onConflictDoUpdate({target:[r.key,r.source,r.revision,r.version],set:d}).returning();return l.length?(t.relations&&await this.createEntityRelations(t.relations.map(c=>({...c,sourceKey:t.key,targetKey:c.key}))),m(l[0])):null}catch(e){throw n.error("Error adding entity",e),e}})}async updateEntity(t){return i("catalog_entities.remote_repository.update_entity",async()=>{await this.#e();try{n.info(`Updating entity ${t.key} in remote database`);const e=_({entity:t,organizationId:this.organizationId,projectId:this.projectId,source:"remote",sourceFile:null,fileHash:null}),{key:o,source:u,scorecardsStatus:d,...l}=e,c=await this.databaseClient.client.insert(r).values(e).onConflictDoUpdate({target:[r.key,r.source,r.revision,r.version],set:{...l,scorecardsStatus:p`CASE WHEN ${r.scorecardsStatus} = 'CALCULATING' THEN 'CANCELLED' ELSE 'OUTDATED' END`}}).returning();return c.length?m(c[0]):null}catch(e){return n.error("Error updating entity",e),null}})}async deleteEntity(t){return i("catalog_entities.remote_repository.delete_entity",async()=>{await this.#e();try{return await this.databaseClient.client.delete(r).where(E(r.key,t)),t}catch(e){return n.error("Error deleting entity",e),null}})}async createEntityRelations(t){return i("catalog_entities.remote_repository.create_entity_relations",async()=>(await this.#e(),await A(t,L,async e=>this.createEntityRelation(e))))}async createEntityRelation(t){return i("catalog_entities.remote_repository.create_entity_relation",async()=>{if(await this.#e(),!t)return null;try{const e=w(t,this.organizationId,this.projectId),{sourceKey:o,targetKey:u,sourceVersion:d,targetVersion:l,sourceRevision:c,targetRevision:v,...h}=e,y=await this.databaseClient.client.insert(a).values(e).onConflictDoUpdate({target:[a.sourceKey,a.targetKey,a.sourceVersion,a.targetVersion,a.sourceRevision,a.targetRevision],set:h}).returning();return y.length?y[0]:null}catch(e){throw n.error("Error creating entity relation",e),e}})}async deleteEntityRelation(t){return i("catalog_entities.remote_repository.delete_entity_relation",async()=>{await this.#e();try{return await this.databaseClient.client.delete(a).where(E(a.id,t)),t}catch(e){return n.error("Error deleting entity relation",e),null}})}async deleteEntitiesRelations(t){return i("catalog_entities.remote_repository.delete_entities_relations",async()=>{await this.#e();try{const e=g(t);return e?(await this.databaseClient.client.delete(a).where(e),!0):!1}catch(e){return n.error("Error deleting entities relations",e),!1}})}#e(){return i("catalog_entities.remote_repository.db_health",async t=>{if(this.databaseClient.dbClient.$client.closed){const e=new Error("The remote database connection is closed!");throw t?.error(e),e}})}}export{s as CatalogEntitiesRemoteRepository};
1
+ import{eq as h,sql as f}from"drizzle-orm";import{convertFilterToWhereCondition as w}from"../../../../../providers/database/pagination/filter.js";import{promiseMapLimit as E}from"../../../../../utils/async/promise-map-limit.js";import{logger as n}from"../../../../../tools/notifiers/logger.js";import{entitiesTable as r}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{telemetryTraceStep as i}from"../../../../../telemetry/helpers/trace-step.js";import{BaseRepository as _}from"../../../../../providers/database/base-repository.js";import{DatabaseConnectionFactory as b}from"../../../../../providers/database/database-connection-factory.js";import{entitiesRelationsTable as a}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{createEntityDbRecord as p}from"../../mappers/create-entity-db-record.js";import{createEntityReadModel as m}from"../../mappers/create-entity-read-model.js";import{createEntityRelationDbRecordFromDto as C}from"../../mappers/create-entity-relation-db-record-from-dto.js";const I=15;class s extends _{static#e;get transactionsManager(){return this.databaseClient.transactionsManager}constructor(e){super(e)}async sync(){return i("catalog_entities.remote_repository.sync",async()=>{await this.#t(),await this.databaseClient.sync()})}static async getInstance(e){return await i("catalog_entities.remote_repository.get_instance",async t=>{if(!s.#e)try{const o=await b.create("sqld-remote",e);if(!o)return n.error("Failed to create db connection for catalog entities remote repository"),t?.error(new Error("Failed to create db connection for catalog entities remote repository")),s.#e=null,null;s.#e=new s(o)}catch(o){return n.error("Error creating db connection for catalog entities remote repository",o),t?.error(o),s.#e=null,null}return s.#e})}async createEntity(e){return i("catalog_entities.remote_repository.create_entity",async()=>{await this.#t();try{n.info(`Adding entity ${e.key} to remote database`);const t=p({entity:e,organizationId:this.organizationId,projectId:this.projectId,source:"remote",sourceFile:null,fileHash:null}),{key:o,source:d,...u}=t,l=await this.databaseClient.client.insert(r).values(t).onConflictDoUpdate({target:[r.key,r.source,r.revision,r.version],set:u}).returning();return l.length?(e.relations&&await this.createEntityRelations(e.relations.map(c=>({...c,sourceKey:e.key,targetKey:c.key}))),m(l[0])):null}catch(t){throw n.error("Error adding entity",t),t}})}async updateEntity(e){return i("catalog_entities.remote_repository.update_entity",async()=>{await this.#t();try{n.info(`Updating entity ${e.key} in remote database`);const t=p({entity:e,organizationId:this.organizationId,projectId:this.projectId,source:"remote",sourceFile:null,fileHash:null}),{key:o,source:d,scorecardsStatus:u,...l}=t,c=await this.databaseClient.client.insert(r).values(t).onConflictDoUpdate({target:[r.key,r.source,r.revision,r.version],set:{...l,scorecardsStatus:f`CASE WHEN ${r.scorecardsStatus} = 'CALCULATING' THEN 'CANCELLED' ELSE 'OUTDATED' END`}}).returning();return c.length?m(c[0]):null}catch(t){return n.error("Error updating entity",t),null}})}async deleteEntity(e){return i("catalog_entities.remote_repository.delete_entity",async()=>{await this.#t();try{return await this.databaseClient.client.delete(r).where(h(r.key,e)),e}catch(t){return n.error("Error deleting entity",t),null}})}async createEntityRelations(e){return i("catalog_entities.remote_repository.create_entity_relations",async()=>(await this.#t(),await E(e,I,async t=>this.createEntityRelation(t))))}async createEntityRelation(e){return i("catalog_entities.remote_repository.create_entity_relation",async()=>{if(await this.#t(),!e)return null;try{const t=C(e,this.organizationId,this.projectId),{sourceKey:o,targetKey:d,sourceVersion:u,targetVersion:l,sourceRevision:c,targetRevision:D,...g}=t,y=await this.databaseClient.client.insert(a).values(t).onConflictDoUpdate({target:[a.sourceKey,a.targetKey,a.sourceVersion,a.targetVersion,a.sourceRevision,a.targetRevision],set:g}).returning();return y.length?y[0]:null}catch(t){throw n.error("Error creating entity relation",t),t}})}async deleteEntityRelation(e){return i("catalog_entities.remote_repository.delete_entity_relation",async()=>{await this.#t();try{return await this.databaseClient.client.delete(a).where(h(a.id,e)),e}catch(t){return n.error("Error deleting entity relation",t),null}})}async deleteEntitiesRelations(e){return i("catalog_entities.remote_repository.delete_entities_relations",async()=>{await this.#t();try{const t=w(e);return t?(await this.databaseClient.client.delete(a).where(t),!0):!1}catch(t){return n.error("Error deleting entities relations",t),!1}})}#t(){return i("catalog_entities.remote_repository.db_health",async e=>{if(this.databaseClient.dbClient.$client.closed){const t=new Error("The remote database connection is closed!");throw e?.error(t),t}})}}export{s as CatalogEntitiesRemoteRepository};
@@ -1 +1 @@
1
- import{redocConfigSchema as m,rootRedoclyConfigSchema as t}from"@redocly/config";import p from"is-glob";import{I18N_DIR_NAME as d,L10N_DIR_NAME as u}from"../../../constants/common.js";import{CONFIG_FILE_NAME as f}from"../../../../constants/common.js";import{DEFAULT_SEARCH_ENGINE as A}from"../../../constants/plugins/search.js";import{deepMerge as F}from"../../../../utils/object/deep-merge.js";import{logger as C}from"../../../tools/notifiers/logger.js";import{EntitlementsProvider as b}from"../../../entitlements/entitlements-provider.js";import{readAndValidateConfig as g}from"./utils/read-and-validate-config.js";import{resolvePlugins as h}from"../../../config/external-plugins.js";import{getPathForAllLocales as l}from"../../../fs/utils/get-path-for-all-locales.js";import{parseRbacConfig as v}from"../../../utils/rbac.js";import{RbacConfigLocation as y,validateRbacConfig as S}from"../../validate-rbac-config.js";const z=async(e,{fs:r},a)=>{const n=await g(e,r,a,async c=>e===f?E(r.cwd,c?.plugins||[]):void 0);n?.rbac&&(n.rbac=await v(n.rbac),S(n.rbac,e===f?y.RootRedoclyYaml:void 0)),(n?.l10n||n?.i18n)&&(n.l10n=L(n),n.i18n=void 0);const s=F(n||{},{markdown:{partialsFolders:(n?.markdown?.partialsFolders||[]).flatMap(c=>l(c,r))}});return R({...s,configPath:e,ignore:I(n?.ignore,r)})};async function E(e,r){const a=await h(e,r),n=a.map(i=>i.config.schema?i.lifecyclePlugin.id:""),s={};for(const i of a){const o=i.lifecyclePlugin?.id;i.config.schema&&o&&t.properties&&(s[o]=i.config.schema)}return{...t,properties:{...s,...t.properties,openapi:m},$id:t.$id+n.join("")}}function R(e){const r=b.instance();return r.canAccessFeature("apiFunctions")||(e.apiFunctions=void 0),r.canAccessFeature("products")||(e.products=void 0),r.canAccessFeature("breadcrumbs")||(e.breadcrumbs={hide:!0}),r.canAccessFeature("seo")||(e.seo=void 0),r.canAccessFeature("redirects")||(e.redirects={}),r.canAccessFeature("l10n")||(e.l10n=void 0),r.canAccessFeature("rbac")||(e.rbac=void 0),r.canAccessFeature("sso")||(e.sso=void 0),r.canAccessFeature("ssoDirect")||(e.ssoDirect=void 0),r.canAccessFeature("catalogClassic")||(e.catalog=void 0,e.catalogClassic=void 0),r.canAccessFeature("scorecard")||(e.scorecard=void 0,e.scorecardClassic=void 0),r.canAccessFeature("scorecards")||(e.scorecards=void 0),r.canAccessFeature("devOnboarding")||(e.developerOnboarding=void 0),r.canAccessFeature("analytics")||(e.analytics=void 0),r.canAccessFeature("removeAttribution")||(e.removeAttribution=void 0),r.canAccessFeature("mockServer")||(e.mockServer={off:!0}),r.canAccessFeature("advancedSearch")||e.search&&(e.search.engine=A),e}function I(e=[],r){return["static",...e].flatMap(a=>p(a)&&(a.startsWith("*")||a.startsWith(u)||a.startsWith("/"+u)||a.startsWith(d)||a.startsWith("/"+d))?a:l(a,r))}function L(e){return e.i18n&&C.warn("The `i18n` configuration is deprecated. Please use `l10n` instead."),e.l10n||e.i18n||{}}export{z as redoclyConfigLoader};
1
+ import{redocConfigSchema as m,rootRedoclyConfigSchema as t}from"@redocly/config";import p from"is-glob";import{I18N_DIR_NAME as d,L10N_DIR_NAME as u}from"../../../constants/common.js";import{CONFIG_FILE_NAME as f}from"../../../../constants/common.js";import{DEFAULT_SEARCH_ENGINE as A}from"../../../constants/plugins/search.js";import{deepMerge as F}from"../../../../utils/object/deep-merge.js";import{logger as b}from"../../../tools/notifiers/logger.js";import{EntitlementsProvider as C}from"../../../entitlements/entitlements-provider.js";import{readAndValidateConfig as h}from"./utils/read-and-validate-config.js";import{resolvePlugins as v}from"../../../config/external-plugins.js";import{getPathForAllLocales as l}from"../../../fs/utils/get-path-for-all-locales.js";import{parseRbacConfig as y}from"../../../utils/rbac.js";import{RbacConfigLocation as g,validateRbacConfig as S}from"../../validate-rbac-config.js";const z=async(e,{fs:r},a)=>{const n=await h(e,r,a,async c=>e===f?E(r.cwd,c?.plugins||[]):void 0);n?.rbac&&(n.rbac=await y(n.rbac),S(n.rbac,e===f?g.RootRedoclyYaml:void 0)),(n?.l10n||n?.i18n)&&(n.l10n=L(n),n.i18n=void 0);const s=F(n||{},{markdown:{partialsFolders:(n?.markdown?.partialsFolders||[]).flatMap(c=>l(c,r))}});return R({...s,configPath:e,ignore:I(n?.ignore,r)})};async function E(e,r){const a=await v(e,r),n=a.map(i=>i.config.schema?i.lifecyclePlugin.id:""),s={};for(const i of a){const o=i.lifecyclePlugin?.id;i.config.schema&&o&&t.properties&&(s[o]=i.config.schema)}return{...t,properties:{...s,...t.properties,openapi:m},$id:t.$id+n.join("")}}function R(e){const r=C.instance();return r.canAccessFeature("apiFunctions")||(e.apiFunctions=void 0),r.canAccessFeature("products")||(e.products=void 0),r.canAccessFeature("breadcrumbs")||(e.breadcrumbs={hide:!0}),r.canAccessFeature("seo")||(e.seo=void 0),r.canAccessFeature("redirects")||(e.redirects={}),r.canAccessFeature("l10n")||(e.l10n=void 0),r.canAccessFeature("rbac")||(e.rbac=void 0),r.canAccessFeature("sso")||(e.sso=void 0),r.canAccessFeature("ssoDirect")||(e.ssoDirect=void 0),r.canAccessFeature("catalogClassic")||(e.catalog=void 0,e.catalogClassic=void 0),r.canAccessFeature("scorecard")||(e.scorecard=void 0,e.scorecardClassic=void 0),r.canAccessFeature("scorecards")||(e.scorecards=void 0),r.canAccessFeature("devOnboarding")||(e.developerOnboarding=void 0),r.canAccessFeature("analytics")||(e.analytics=void 0),r.canAccessFeature("removeAttribution")||(e.removeAttribution=void 0),r.canAccessFeature("mockServer")||(e.mockServer={off:!0}),r.canAccessFeature("advancedSearch")||e.search&&(e.search.engine=A),r.canAccessFeature("banner")||(e.banner=void 0),e}function I(e=[],r){return["static",...e].flatMap(a=>p(a)&&(a.startsWith("*")||a.startsWith(u)||a.startsWith("/"+u)||a.startsWith(d)||a.startsWith("/"+d))?a:l(a,r))}function L(e){return e.i18n&&b.warn("The `i18n` configuration is deprecated. Please use `l10n` instead."),e.l10n||e.i18n||{}}export{z as redoclyConfigLoader};
@@ -1,12 +1,12 @@
1
1
  import type { DatabaseClient } from './client.js';
2
- import type { DatabaseInitializationResult } from './types.js';
2
+ import type { DatabaseConnection } from './types.js';
3
3
  export declare abstract class BaseRepository {
4
4
  #private;
5
5
  protected readonly organizationId: string;
6
6
  protected readonly projectId: string;
7
7
  protected readonly databaseClient: DatabaseClient;
8
8
  readonly path: string;
9
- protected constructor(initializationResult: DatabaseInitializationResult);
9
+ protected constructor(dbConnection: DatabaseConnection);
10
10
  close(): Promise<void>;
11
11
  sync(): Promise<void>;
12
12
  }
@@ -1 +1 @@
1
- class n{static#e="ORGANIZATION_ID";static#t="PROJECT_ID";organizationId;projectId;databaseClient;path;constructor(t){const e=this.#s();this.organizationId=this.#n(e),this.projectId=this.#r(e),this.databaseClient=t.client,this.path=t.path}async close(){await this.databaseClient.close()}async sync(){await this.databaseClient.sync()}#n=t=>{const e=process.env.ORGANIZATION_ID;if(e)return e;if(t)return n.#e;throw new Error("ORGANIZATION_ID environment variable is required. Ensure it is set in your environment configuration.")};#r=t=>{const e=process.env.PROJECT_ID;if(e)return e;if(t)return n.#t;throw new Error("PROJECT_ID environment variable is required. Ensure it is set in your environment configuration.")};#s=()=>!process.env.SQLD_REMOTE_DATABASE_URL&&!process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN}export{n as BaseRepository};
1
+ class n{static#e="ORGANIZATION_ID";static#t="PROJECT_ID";organizationId;projectId;databaseClient;path;constructor(t){const e=this.#r();this.organizationId=this.#n(e),this.projectId=this.#i(e),this.databaseClient=t.client,this.path=t.path}async close(){await this.databaseClient.close()}async sync(){await this.databaseClient.sync()}#n=t=>{const e=process.env.ORGANIZATION_ID;if(e)return e;if(t)return n.#e;throw new Error("ORGANIZATION_ID environment variable is required. Ensure it is set in your environment configuration.")};#i=t=>{const e=process.env.PROJECT_ID;if(e)return e;if(t)return n.#t;throw new Error("PROJECT_ID environment variable is required. Ensure it is set in your environment configuration.")};#r=()=>!process.env.SQLD_REMOTE_DATABASE_URL&&!process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN}export{n as BaseRepository};
@@ -1,7 +1,10 @@
1
+ export declare const CATALOG_LOCAL_DATABASE_NAME = "catalog-local.sqlite";
2
+ export declare const CATALOG_LOCAL_DATABASE_FOLDER = "catalog-local";
3
+ export declare const CATALOG_LOCAL_DATABASE_MIGRATIONS_FOLDER = "catalog-sqlite";
1
4
  export declare const MAIN_LOCAL_DATABASE_NAME = "main-local.sqlite";
2
5
  export declare const MAIN_LOCAL_DATABASE_FOLDER = "main-local";
3
- export declare const MAIN_DATABASE_MIGRATIONS_FOLDER = "main-sqlite";
4
- export declare const PLUGIN_STORAGE_LOCAL_DATABASE_NAME = "plugin-storage-local.sqlite";
5
- export declare const PLUGIN_STORAGE_LOCAL_DATABASE_FOLDER = "plugin-storage-local";
6
- export declare const PLUGIN_STORAGE_DATABASE_MIGRATIONS_FOLDER = "plugin-storage-sqlite";
6
+ export declare const MAIN_LOCAL_DATABASE_MIGRATIONS_FOLDER = "main-sqlite";
7
+ export declare const SQLD_REMOTE_DATABASE_NAME = "sqld-remote.sqlite";
8
+ export declare const SQLD_REMOTE_DATABASE_FOLDER = "sqld-remote";
9
+ export declare const SQLD_REMOTE_DATABASE_MIGRATIONS_FOLDER = "sqld-sqlite";
7
10
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- const A="main-local.sqlite",_="main-local",o="main-sqlite",t="plugin-storage-local.sqlite",l="plugin-storage-local",E="plugin-storage-sqlite";export{o as MAIN_DATABASE_MIGRATIONS_FOLDER,_ as MAIN_LOCAL_DATABASE_FOLDER,A as MAIN_LOCAL_DATABASE_NAME,E as PLUGIN_STORAGE_DATABASE_MIGRATIONS_FOLDER,l as PLUGIN_STORAGE_LOCAL_DATABASE_FOLDER,t as PLUGIN_STORAGE_LOCAL_DATABASE_NAME};
1
+ const A="catalog-local.sqlite",_="catalog-local",t="catalog-sqlite",o="main-local.sqlite",E="main-local",L="main-sqlite",O="sqld-remote.sqlite",l="sqld-remote",e="sqld-sqlite";export{_ as CATALOG_LOCAL_DATABASE_FOLDER,t as CATALOG_LOCAL_DATABASE_MIGRATIONS_FOLDER,A as CATALOG_LOCAL_DATABASE_NAME,E as MAIN_LOCAL_DATABASE_FOLDER,L as MAIN_LOCAL_DATABASE_MIGRATIONS_FOLDER,o as MAIN_LOCAL_DATABASE_NAME,l as SQLD_REMOTE_DATABASE_FOLDER,e as SQLD_REMOTE_DATABASE_MIGRATIONS_FOLDER,O as SQLD_REMOTE_DATABASE_NAME};
@@ -0,0 +1,6 @@
1
+ import type { DatabaseConnection, DatabaseConnectionOptions, DatabaseName } from './types.js';
2
+ export declare class DatabaseConnectionFactory {
3
+ #private;
4
+ static create(databaseName: DatabaseName, options: DatabaseConnectionOptions): Promise<DatabaseConnection | null>;
5
+ }
6
+ //# sourceMappingURL=database-connection-factory.d.ts.map
@@ -0,0 +1 @@
1
+ import{logger as e}from"../../tools/notifiers/logger.js";import{CATALOG_LOCAL_DATABASE_MIGRATIONS_FOLDER as r,CATALOG_LOCAL_DATABASE_FOLDER as i,CATALOG_LOCAL_DATABASE_NAME as s,MAIN_LOCAL_DATABASE_MIGRATIONS_FOLDER as _,MAIN_LOCAL_DATABASE_FOLDER as E,MAIN_LOCAL_DATABASE_NAME as l,SQLD_REMOTE_DATABASE_FOLDER as c,SQLD_REMOTE_DATABASE_MIGRATIONS_FOLDER as D,SQLD_REMOTE_DATABASE_NAME as T}from"./constants.js";import{LocalDatabaseInitializationStrategy as n,RemoteDatabaseInitializationStrategy as L}from"./database-initialization-strategy.js";import{DatabaseConnectionsManager as O}from"./database-connections-manager.js";class g{static async create(a,t){switch(a){case"main-local":return await this.#a(t);case"catalog-local":return await this.#t(t);case"sqld-remote":return await this.#e(t);default:return null}}static async#a(a){return await new n().initialize({...a,databaseName:l,additionalFolder:E,migrationsFolder:_})}static async#t(a){return await new n().initialize({...a,databaseName:s,additionalFolder:i,migrationsFolder:r})}static async#e(a){const t=process.env.SQLD_REMOTE_DATABASE_URL&&process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN,A=a.sqldRemoteDatabaseUrl&&a.sqldRemoteDatabaseAuthToken;if(!t&&!A)return process.env.NEW_CATALOG_ENABLED==="true"&&e.warn("SQLD_REMOTE_DATABASE_URL and SQLD_REMOTE_DATABASE_AUTH_TOKEN env variables or sqldRemoteDatabaseUrl and sqldRemoteDatabaseAuthToken options not set - remote database will not be initialized"),null;try{return await O.getConnection({config:{...a,databaseName:T,additionalFolder:c,migrationsFolder:D,syncUrl:process.env.SQLD_REMOTE_DATABASE_URL||a.sqldRemoteDatabaseUrl,authToken:process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN||a.sqldRemoteDatabaseAuthToken},strategy:new L})}catch(o){return e.error("Remote database connection initialization failed",o),null}}}export{g as DatabaseConnectionFactory};
@@ -1,12 +1,12 @@
1
- import type { DatabaseInitConnectionOptions, DatabaseInitializationResult } from './types.js';
1
+ import type { DatabaseConnectionInitOptions, DatabaseConnection } from './types.js';
2
2
  import { type DatabaseInitializationStrategy } from './database-initialization-strategy.js';
3
- type GetConnectionParams<TConfig extends DatabaseInitConnectionOptions> = {
3
+ type GetConnectionParams<TConfig extends DatabaseConnectionInitOptions> = {
4
4
  config: TConfig;
5
5
  strategy: DatabaseInitializationStrategy;
6
6
  };
7
7
  export declare class DatabaseConnectionsManager {
8
8
  #private;
9
- static getConnection<TConfig extends DatabaseInitConnectionOptions>({ config, strategy, }: GetConnectionParams<TConfig>): Promise<DatabaseInitializationResult | null>;
9
+ static getConnection<TConfig extends DatabaseConnectionInitOptions>({ config, strategy, }: GetConnectionParams<TConfig>): Promise<DatabaseConnection | null>;
10
10
  }
11
11
  export {};
12
12
  //# sourceMappingURL=database-connections-manager.d.ts.map
@@ -1 +1 @@
1
- import{logger as o}from"../../tools/notifiers/logger.js";const r="_redocly_db_preconnect_cache_";class t{static get#t(){const e=globalThis;if(!e[r]){const i={connections:new Map,pendingConnections:new Map,failedConnections:new Set};e[r]=i}return e[r]}static get#c(){return t.#t.connections}static get#e(){return t.#t.failedConnections}static get#i(){return t.#t.pendingConnections}static async getConnection({config:e,strategy:i}){const n=t.#l(e),c=t.#c.get(n);return c||t.#n({config:e,key:n,strategy:i})}static#n=async({config:e,key:i,strategy:n})=>{let c=t.#i.get(i);c||(t.#e.has(i)&&o.warn("There was an error connecting to the database, retrying..."),c=t.#r(e,i,n),t.#i.set(i,c));try{return await c}catch{return t.#e.add(i),null}finally{t.#i.delete(i)}};static#r=async(e,i,n)=>{const c=await n.initialize(e);return t.#c.set(i,c),t.#e.delete(i),c};static#l=e=>`${e.baseDbDir}/${e.additionalFolder}/${e.databaseName}`}export{t as DatabaseConnectionsManager};
1
+ import{logger as o}from"../../tools/notifiers/logger.js";const n="_redocly_db_preconnect_cache_";class t{static get#t(){const e=globalThis;if(!e[n]){const i={connections:new Map,pendingConnections:new Map,failedConnections:new Set};e[n]=i}return e[n]}static get#c(){return t.#t.connections}static get#e(){return t.#t.failedConnections}static get#i(){return t.#t.pendingConnections}static async getConnection({config:e,strategy:i}){const r=t.#l(e),c=t.#c.get(r);return c||t.#r({config:e,key:r,strategy:i})}static#r=async({config:e,key:i,strategy:r})=>{let c=t.#i.get(i);c||(t.#e.has(i)&&o.warn("Error connecting to the database, retrying..."),c=t.#n(e,i,r),t.#i.set(i,c));try{return await c}catch(l){return o.error("Error connecting to the database",l),t.#e.add(i),null}finally{t.#i.delete(i)}};static#n=async(e,i,r)=>{const c=await r.initialize(e);return t.#c.set(i,c),t.#e.delete(i),c};static#l=e=>`${e.baseDbDir}/${e.additionalFolder}/${e.databaseName}`}export{t as DatabaseConnectionsManager};
@@ -1,12 +1,9 @@
1
- import type { DatabaseInitConnectionOptions, DatabaseInitializationResult } from './types.js';
1
+ import type { DatabaseConnectionOptions, DatabaseConnection, DatabaseConnectionInitOptions, RemoteDatabaseConnectionInitOptions } from './types.js';
2
2
  export type DatabaseInitializationStrategy = {
3
- initialize(options: DatabaseInitConnectionOptions): Promise<DatabaseInitializationResult>;
3
+ initialize(options: DatabaseConnectionOptions): Promise<DatabaseConnection>;
4
4
  };
5
- export declare class DefaultDatabaseInitializationStrategy implements DatabaseInitializationStrategy {
6
- initialize({ baseDbDir, databaseName, additionalFolder, }: DatabaseInitConnectionOptions): Promise<DatabaseInitializationResult>;
7
- }
8
5
  export declare class LocalDatabaseInitializationStrategy implements DatabaseInitializationStrategy {
9
- initialize({ removeExisting, baseDbDir, runWithPragmaWalWriteOptimization, databaseName, additionalFolder, migrationsFolder, }: DatabaseInitConnectionOptions): Promise<DatabaseInitializationResult>;
6
+ initialize({ removeExisting, baseDbDir, runWithPragmaWalWriteOptimization, databaseName, additionalFolder, migrationsFolder, }: DatabaseConnectionInitOptions): Promise<DatabaseConnection>;
10
7
  }
11
8
  type RemoteDatabaseInitializationStrategyParams = {
12
9
  skipLogs?: boolean;
@@ -14,10 +11,7 @@ type RemoteDatabaseInitializationStrategyParams = {
14
11
  export declare class RemoteDatabaseInitializationStrategy implements DatabaseInitializationStrategy {
15
12
  #private;
16
13
  constructor(params?: RemoteDatabaseInitializationStrategyParams);
17
- initialize({ removeExisting, baseDbDir, syncUrl, authToken, databaseName, additionalFolder, migrationsFolder, }: DatabaseInitConnectionOptions & {
18
- syncUrl: string;
19
- authToken: string;
20
- }): Promise<DatabaseInitializationResult>;
14
+ initialize({ removeExisting, baseDbDir, syncUrl, authToken, databaseName, additionalFolder, migrationsFolder, }: RemoteDatabaseConnectionInitOptions): Promise<DatabaseConnection>;
21
15
  }
22
16
  export {};
23
17
  //# sourceMappingURL=database-initialization-strategy.d.ts.map
@@ -1 +1 @@
1
- import{logger as l}from"../../tools/notifiers/logger.js";import{DatabaseClient as p}from"./client.js";import{DatabasePathGenerator as d}from"./database-path-generator.js";import{retryAsyncOperation as h}from"./utils/retry-async-operation.js";class u{async initialize({baseDbDir:a,databaseName:t,additionalFolder:e}){const{databasePath:i}=await d.prepareDatabasePath({baseDir:a,databaseName:t,additionalFolder:e});return{client:await p.init({url:`file:${i}`}),path:i}}}class w{async initialize({removeExisting:a,baseDbDir:t,runWithPragmaWalWriteOptimization:e,databaseName:i,additionalFolder:r,migrationsFolder:c}){l.info("Initializing local database client...");const m=l.startTiming(),{databasePath:s}=await d.prepareDatabasePath({baseDir:t,databaseName:i,additionalFolder:r,removeExisting:a}),o={url:`file:${s}`},n=await p.init(o,{runWithPragmaWalWriteOptimization:e});return await n.migrate(t,c),l.infoTime(m,"Local database client initialized"),{client:n,path:s}}}class D{#t;#a;constructor(a){this.#t=a?.skipLogs??!1,this.#a=this.#t?void 0:l}async initialize({removeExisting:a,baseDbDir:t,syncUrl:e,authToken:i,databaseName:r,additionalFolder:c,migrationsFolder:m}){this.#a?.info("Initializing remote database client...");const s=this.#a?.startTiming();return await h(async()=>{const{databasePath:o}=await d.prepareDatabasePath({baseDir:t,databaseName:r,additionalFolder:c,removeExisting:a}),n=await p.init({url:`file:${o}`,syncUrl:e,authToken:i});return await n.migrate(t,m),this.#a?.infoTime(s??"","Remote database client initialized"),{client:n,path:o}},{maxRetries:3,retryStrategy:"exponential",delay:1e3,logger:this.#a,messages:{retry:"Retrying remote database client initialization",maxRetriesReached:"Max retries reached, remote database client initialization failed"}})}}export{u as DefaultDatabaseInitializationStrategy,w as LocalDatabaseInitializationStrategy,D as RemoteDatabaseInitializationStrategy};
1
+ import{logger as r}from"../../tools/notifiers/logger.js";import{DatabaseClient as g}from"./client.js";import{DatabasePathGenerator as p}from"./database-path-generator.js";import{retryAsyncOperation as h}from"./utils/retry-async-operation.js";class u{async initialize({removeExisting:a,baseDbDir:t,runWithPragmaWalWriteOptimization:s,databaseName:o,additionalFolder:l,migrationsFolder:c}){r.info("Initializing local database client...");const m=r.startTiming(),{databasePath:e}=await p.prepareDatabasePath({baseDir:t,databaseName:o,additionalFolder:l,removeExisting:a}),n={url:`file:${e}`},i=await g.init(n,{runWithPragmaWalWriteOptimization:s});return await i.migrate(t,c),r.infoTime(m,"Local database client initialized"),{client:i,path:e}}}class w{#t;#a;constructor(a){this.#t=a?.skipLogs??!1,this.#a=this.#t?void 0:r}async initialize({removeExisting:a,baseDbDir:t,syncUrl:s,authToken:o,databaseName:l,additionalFolder:c,migrationsFolder:m}){this.#a?.info("Initializing remote database client...");const e=this.#a?.startTiming();return await h(async()=>{const{databasePath:n}=await p.prepareDatabasePath({baseDir:t,databaseName:l,additionalFolder:c,removeExisting:a}),i=await g.init({url:`file:${n}`,syncUrl:s,authToken:o});return await i.migrate(t,m),this.#a?.infoTime(e??"","Remote database client initialized"),{client:i,path:n}},{maxRetries:3,retryStrategy:"exponential",delay:1e3,logger:this.#a,messages:{retry:"Retrying remote database client initialization",maxRetriesReached:"Max retries reached, remote database client initialization failed"}})}}export{u as LocalDatabaseInitializationStrategy,w as RemoteDatabaseInitializationStrategy};
@@ -1 +1 @@
1
- import{logger as e}from"../../tools/notifiers/logger.js";import{SQLD_REMOTE_DATABASE_FOLDER as s,SQLD_REMOTE_DATABASE_MIGRATIONS_FOLDER as n,SQLD_REMOTE_DATABASE_NAME as E}from"../../constants/sqld-remote-database.js";import{DatabaseConnectionsManager as i}from"./database-connections-manager.js";import{RemoteDatabaseInitializationStrategy as l}from"./database-initialization-strategy.js";class a{static#t=!1;static async init(r){if(!(process.env.REDOCLY_LOCAL_DEV==="true"||process.env.CI==="true")&&!a.#t)try{await a.#e(r)==="PRECONNECTED"&&(a.#t=!0)}catch(t){e.error("Failed to preconnect to sqld remote database",t)}}static#e=async r=>{const o=process.env.SQLD_REMOTE_DATABASE_URL,t=process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN;return!o||!t?(e.warn("SQLD_REMOTE_DATABASE_URL or SQLD_REMOTE_DATABASE_AUTH_TOKEN is not set yet"),"NOT_PRECONNECTED"):await i.getConnection({config:{baseDbDir:r,syncUrl:o,authToken:t,databaseName:E,additionalFolder:s,migrationsFolder:n},strategy:new l({skipLogs:!1})})?(e.info("Sqld remote database preconnected"),"PRECONNECTED"):(e.warn("Sqld remote database preconnect failed"),"NOT_PRECONNECTED")}}export{a as DatabasePreconnectService};
1
+ import{logger as r}from"../../tools/notifiers/logger.js";import{DatabaseConnectionFactory as a}from"./database-connection-factory.js";class e{static#e=!1;static async init(t){if(!(process.env.REDOCLY_LOCAL_DEV==="true"||process.env.CI==="true")&&!e.#e)try{await e.#t(t)==="PRECONNECTED"&&(e.#e=!0)}catch(o){r.error("Failed to preconnect to sqld remote database",o)}}static#t=async t=>await a.create("sqld-remote",{baseDbDir:t})?(r.info("Sqld remote database preconnected"),"PRECONNECTED"):(r.warn("Sqld remote database preconnect failed"),"NOT_PRECONNECTED")}export{e as DatabasePreconnectService};
@@ -1 +1 @@
1
- import{DatabasePathGenerator as a}from"../../database-path-generator";import{CATALOG_LOCAL_DATABASE_NAME as e,CATALOG_LOCAL_DATABASE_FOLDER as t}from"../../../../plugins/catalog-entities/database/consts";const s="./dist/server/esbuild/cache/server",r="./src/server/providers/database/databases/catalog-sqlite/schemas/*",A="./src/server/providers/database/databases/catalog-sqlite/migrations",o=()=>({url:a.generateDatabasePath({baseDir:s,databaseName:e,additionalFolder:t})});var c={schema:r,out:A,dialect:"turso",dbCredentials:o()};export{r as SCHEMAS_PATH,c as default};
1
+ import{DatabasePathGenerator as a}from"../../database-path-generator.js";import{CATALOG_LOCAL_DATABASE_NAME as e,CATALOG_LOCAL_DATABASE_FOLDER as t}from"../../constants.js";const s="./dist/server/esbuild/cache/server",r="./src/server/providers/database/databases/catalog-sqlite/schemas/*",A="./src/server/providers/database/databases/catalog-sqlite/migrations",o=()=>({url:a.generateDatabasePath({baseDir:s,databaseName:e,additionalFolder:t})});var c={schema:r,out:A,dialect:"turso",dbCredentials:o()};export{r as SCHEMAS_PATH,c as default};
@@ -1 +1 @@
1
- import{DatabasePathGenerator as a}from"../../database-path-generator";import{SCHEMAS_PATH as r}from"../catalog-sqlite/drizzle.config";import{SQLD_REMOTE_DATABASE_FOLDER as t,SQLD_REMOTE_DATABASE_NAME as A}from"../../../../constants/sqld-remote-database";const o="./dist/server/esbuild/cache/server",E="./src/server/providers/database/databases/sqld-sqlite/schemas/*",_="./src/server/providers/database/databases/sqld-sqlite/migrations",d=()=>{const e=process.env.SQLD_REMOTE_DATABASE_URL,s=process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN;return e&&s?{url:e,authToken:s}:{url:a.generateDatabasePath({baseDir:o,databaseName:A,additionalFolder:t})}};var n={schema:[E,r],out:_,dialect:"turso",dbCredentials:d()};export{n as default};
1
+ import{DatabasePathGenerator as a}from"../../database-path-generator.js";import{SQLD_REMOTE_DATABASE_FOLDER as r,SQLD_REMOTE_DATABASE_NAME as t}from"../../constants.js";import{SCHEMAS_PATH as A}from"../catalog-sqlite/drizzle.config.js";const o="./dist/server/esbuild/cache/server",E="./src/server/providers/database/databases/sqld-sqlite/schemas/*",_="./src/server/providers/database/databases/sqld-sqlite/migrations",d=()=>{const e=process.env.SQLD_REMOTE_DATABASE_URL,s=process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN;return e&&s?{url:e,authToken:s}:{url:a.generateDatabasePath({baseDir:o,databaseName:t,additionalFolder:r})}};var n={schema:[E,A],out:_,dialect:"turso",dbCredentials:d()};export{n as default};
@@ -1,27 +1,32 @@
1
1
  import type { DatabaseClient } from './client.js';
2
- export type DatabaseInitConnectionOptions = {
2
+ export type DatabaseConnectionInitOptions = {
3
3
  baseDbDir: string;
4
4
  databaseName: string;
5
5
  migrationsFolder: string;
6
6
  additionalFolder?: string;
7
7
  removeExisting?: boolean;
8
8
  runWithPragmaWalWriteOptimization?: boolean;
9
+ sqldRemoteDatabaseUrl?: string;
10
+ sqldRemoteDatabaseAuthToken?: string;
9
11
  };
10
- export type RepositoryInstanceOptions = {
12
+ export type RemoteDatabaseConnectionInitOptions = DatabaseConnectionInitOptions & {
13
+ syncUrl: string;
14
+ authToken: string;
15
+ };
16
+ export type DatabaseConnectionOptions = {
11
17
  baseDbDir: string;
12
- migrationsFolder?: string;
13
- databaseName?: string;
14
- additionalFolder?: string;
15
18
  removeExisting?: boolean;
16
19
  runWithPragmaWalWriteOptimization?: boolean;
17
20
  sqldRemoteDatabaseUrl?: string;
18
21
  sqldRemoteDatabaseAuthToken?: string;
19
22
  };
23
+ export type RepositoryInstanceOptions = DatabaseConnectionOptions;
20
24
  export type ServiceInstanceOptions = RepositoryInstanceOptions & {
21
25
  runOnlyLocalDatabase?: boolean;
22
26
  };
23
- export type DatabaseInitializationResult = {
27
+ export type DatabaseConnection = {
24
28
  client: DatabaseClient;
25
29
  path: string;
26
30
  };
31
+ export type DatabaseName = 'main-local' | 'catalog-local' | 'sqld-remote';
27
32
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- import{logger as i}from"../../tools/notifiers/logger.js";import{reporter as m}from"../../tools/notifiers/reporter.js";import{enhanceContext as f}from"../../api-routes/helpers/enhance-context.js";import{KvService as l}from"../../persistence/kv/services/kv-service.js";import{enhanceRequest as u}from"../../api-routes/helpers/enhance-request.js";async function v({route:r,ctx:t,staticData:n,serverPropsGetters:a,serverPropsUser:p,actions:s}){try{if(!a[r.fsPath]||!t)return;const e=a[r.fsPath];e||await m.panicOnBuild(`Invalid page props getter id: "${r.fsPath}" for route "${r.slug}"`);const o=async()=>await l.getInstance({baseDbDir:s.serverOutDir,sqldRemoteDatabaseUrl:process.env.SQLD_REMOTE_DATABASE_URL,sqldRemoteDatabaseAuthToken:process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN}),c=f({honoCtx:t,ctx:{user:p,config:s.getConfig()},getStorage:o}),g=await u(t);return await(await e()).default(n,g,c)}catch(e){const o=r.fsPath.replace(/\.(page\.tsx?|md)$/,".props.ts");return i.error(`Page prop getter error: ${e.message}`),{pagePropGetterError:{message:`${e.message||"An unknown error occurred"} in ${o}`,name:"ServerPropsGetterError",stack:e.stack}}}}export{v as getServerPropsFromUserHandler};
1
+ import{logger as g}from"../../tools/notifiers/logger.js";import{reporter as m}from"../../tools/notifiers/reporter.js";import{enhanceContext as f}from"../../api-routes/helpers/enhance-context.js";import{KvService as l}from"../../persistence/kv/services/kv-service.js";import{enhanceRequest as u}from"../../api-routes/helpers/enhance-request.js";async function S({route:r,ctx:t,staticData:n,serverPropsGetters:a,serverPropsUser:p,actions:s}){try{if(!a[r.fsPath]||!t)return;const e=a[r.fsPath];e||await m.panicOnBuild(`Invalid page props getter id: "${r.fsPath}" for route "${r.slug}"`);const o=async()=>await l.getInstance({baseDbDir:s.serverOutDir,sqldRemoteDatabaseUrl:process.env.SQLD_REMOTE_DATABASE_URL,sqldRemoteDatabaseAuthToken:process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN}),c=f({honoCtx:t,ctx:{user:p,config:s.getConfig()},getKv:o}),i=await u(t);return await(await e()).default(n,i,c)}catch(e){const o=r.fsPath.replace(/\.(page\.tsx?|md)$/,".props.ts");return g.error(`Page prop getter error: ${e.message}`),{pagePropGetterError:{message:`${e.message||"An unknown error occurred"} in ${o}`,name:"ServerPropsGetterError",stack:e.stack}}}}export{S as getServerPropsFromUserHandler};
@@ -18,5 +18,5 @@ export type ApiFunctionsErrorMessage = {
18
18
  stack: string;
19
19
  };
20
20
  };
21
- export type ApiFunctionsBasicContext = Omit<ApiFunctionsContext, 'params' | 'query' | 'cookies' | 'status' | 'json' | 'text' | 'redirect' | 'setCookie' | 'deleteCookie' | 'log' | 'getStorage'>;
21
+ export type ApiFunctionsBasicContext = Omit<ApiFunctionsContext, 'params' | 'query' | 'cookies' | 'status' | 'json' | 'text' | 'redirect' | 'setCookie' | 'deleteCookie' | 'log' | 'getKv'>;
22
22
  //# sourceMappingURL=api-functions.d.ts.map
@@ -23,6 +23,7 @@ export type ProductGates = {
23
23
  [FEATURE.soap]: boolean;
24
24
  [FEATURE.codeWalkthrough]: boolean;
25
25
  [FEATURE.scorecards]: boolean;
26
+ [FEATURE.banner]: boolean;
26
27
  };
27
28
  export type PlanGates = {
28
29
  [FEATURE.sso]: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redocly/revel-reef",
3
- "version": "0.128.0-next.8",
3
+ "version": "0.128.0",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "bin": {
@@ -32,7 +32,7 @@
32
32
  "@opentelemetry/sdk-trace-web": "2.0.1",
33
33
  "@opentelemetry/semantic-conventions": "1.34.0",
34
34
  "@redocly/ajv": "8.17.1",
35
- "@redocly/openapi-core": "2.12.1",
35
+ "@redocly/openapi-core": "2.12.3",
36
36
  "@shikijs/transformers": "^1.22.2",
37
37
  "@tanstack/react-query": "5.62.3",
38
38
  "@tanstack/react-table": "8.21.3",
@@ -70,10 +70,10 @@
70
70
  "os-browserify": "0.3.0",
71
71
  "path-browserify": "1.0.1",
72
72
  "picomatch": "2.3.1",
73
- "react": "^19.1.0",
73
+ "react": "^19.2.1",
74
74
  "react-calendar": "5.1.0",
75
75
  "react-date-picker": "11.0.0",
76
- "react-dom": "^19.1.0",
76
+ "react-dom": "^19.2.1",
77
77
  "react-router-dom": "^6.21.1",
78
78
  "react-select": "5.10.1",
79
79
  "reactjs-popup": "2.0.6",
@@ -92,18 +92,18 @@
92
92
  "xml-crypto": "6.0.1",
93
93
  "xpath": "0.0.34",
94
94
  "yaml-ast-parser": "0.0.43",
95
- "@redocly/asyncapi-docs": "1.5.0-next.8",
96
- "@redocly/config": "0.40.0",
97
- "@redocly/graphql-docs": "1.5.0-next.1",
98
- "@redocly/openapi-docs": "3.16.0-next.8",
99
- "@redocly/portal-legacy-ui": "0.11.0-next.0",
100
- "@redocly/portal-plugin-mock-server": "0.13.0-next.8",
101
- "@redocly/realm-asyncapi-sdk": "0.6.0-next.1",
102
- "@redocly/theme": "0.60.0-next.5"
95
+ "@redocly/config": "0.41.0",
96
+ "@redocly/graphql-docs": "1.5.0",
97
+ "@redocly/openapi-docs": "3.16.0",
98
+ "@redocly/asyncapi-docs": "1.5.0",
99
+ "@redocly/realm-asyncapi-sdk": "0.6.0",
100
+ "@redocly/portal-legacy-ui": "0.11.0",
101
+ "@redocly/portal-plugin-mock-server": "0.13.0",
102
+ "@redocly/theme": "0.60.0"
103
103
  },
104
104
  "peerDependencies": {
105
- "react": "^19.1.0",
106
- "react-dom": "^19.1.0"
105
+ "react": "^19.2.1",
106
+ "react-dom": "^19.2.1"
107
107
  },
108
108
  "nx": {
109
109
  "implicitDependencies": [
@@ -1,4 +0,0 @@
1
- export declare const SQLD_REMOTE_DATABASE_NAME = "sqld-remote.sqlite";
2
- export declare const SQLD_REMOTE_DATABASE_FOLDER = "sqld-remote";
3
- export declare const SQLD_REMOTE_DATABASE_MIGRATIONS_FOLDER = "sqld-sqlite";
4
- //# sourceMappingURL=sqld-remote-database.d.ts.map
@@ -1 +0,0 @@
1
- const E="sqld-remote.sqlite",A="sqld-remote",t="sqld-sqlite";export{A as SQLD_REMOTE_DATABASE_FOLDER,t as SQLD_REMOTE_DATABASE_MIGRATIONS_FOLDER,E as SQLD_REMOTE_DATABASE_NAME};
@@ -1,4 +0,0 @@
1
- export declare const CATALOG_LOCAL_DATABASE_NAME = "catalog-local.sqlite";
2
- export declare const CATALOG_LOCAL_DATABASE_FOLDER = "catalog-local";
3
- export declare const CATALOG_DATABASE_MIGRATIONS_FOLDER = "catalog-sqlite";
4
- //# sourceMappingURL=consts.d.ts.map
@@ -1 +0,0 @@
1
- const A="catalog-local.sqlite",o="catalog-local",t="catalog-sqlite";export{t as CATALOG_DATABASE_MIGRATIONS_FOLDER,o as CATALOG_LOCAL_DATABASE_FOLDER,A as CATALOG_LOCAL_DATABASE_NAME};