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

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 (65) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +56 -0
  3. package/dist/server/esbuild/esbuild.js +2 -2
  4. package/dist/server/node-bundle-entry.js +1 -1
  5. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +4 -0
  6. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
  7. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.js +1 -1
  8. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +1 -0
  9. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +6 -6
  10. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +4 -0
  11. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +1 -1
  12. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.d.ts +3 -0
  13. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.js +1 -1
  14. package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.js +1 -1
  15. package/dist/server/plugins/catalog-entities/database/repositories/utils.d.ts +2 -0
  16. package/dist/server/plugins/catalog-entities/database/repositories/utils.js +1 -1
  17. package/dist/server/plugins/catalog-entities/entities/types.d.ts +1 -0
  18. package/dist/server/plugins/default-theme/index.js +1 -1
  19. package/dist/server/plugins/markdown/index.js +1 -1
  20. package/dist/server/plugins/openapi-docs/format-bundle-error.d.ts +6 -0
  21. package/dist/server/plugins/openapi-docs/format-bundle-error.js +5 -0
  22. package/dist/server/plugins/openapi-docs/index.js +1 -1
  23. package/dist/server/plugins/openapi-docs/load-definition.js +3 -3
  24. package/dist/server/plugins/pages/index.js +1 -1
  25. package/dist/server/plugins/scorecard-classic/index.js +1 -1
  26. package/dist/server/plugins/scorecards/workers/run-scorecards-worker.d.ts +2 -0
  27. package/dist/server/plugins/scorecards/workers/run-scorecards-worker.js +1 -0
  28. package/dist/server/plugins/scorecards/workers/scorecards.d.ts +14 -0
  29. package/dist/server/plugins/scorecards/workers/scorecards.js +1 -0
  30. package/dist/server/plugins/search/ai-indexer/prepare-ai-search-documents.js +1 -1
  31. package/dist/server/plugins/search/documents/search-documents.js +1 -1
  32. package/dist/server/plugins/sitemap/index.js +1 -1
  33. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-table.d.ts +19 -0
  34. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-table.js +1 -1
  35. package/dist/server/providers/database/databases/main-sqlite/schemas/scorecards-config-table.d.ts +162 -0
  36. package/dist/server/providers/database/databases/main-sqlite/schemas/scorecards-config-table.js +1 -0
  37. package/dist/server/providers/database/databases/sqld-sqlite/drizzle.config.js +1 -1
  38. package/dist/server/providers/database/databases/sqld-sqlite/schemas/scorecard-evaluations-table.d.ts +124 -0
  39. package/dist/server/providers/database/databases/sqld-sqlite/schemas/scorecard-evaluations-table.js +1 -0
  40. package/dist/server/providers/database/databases/sqld-sqlite/schemas/scorecard-result-level-states-table.d.ts +48 -0
  41. package/dist/server/providers/database/databases/sqld-sqlite/schemas/scorecard-result-level-states-table.js +1 -0
  42. package/dist/server/providers/database/databases/sqld-sqlite/schemas/scorecard-result-levels-table.d.ts +186 -0
  43. package/dist/server/providers/database/databases/sqld-sqlite/schemas/scorecard-result-levels-table.js +1 -0
  44. package/dist/server/providers/database/databases/sqld-sqlite/schemas/scorecard-result-states-table.d.ts +177 -0
  45. package/dist/server/providers/database/databases/sqld-sqlite/schemas/scorecard-result-states-table.js +1 -0
  46. package/dist/server/providers/database/databases/sqld-sqlite/schemas/scorecard-results-table.d.ts +179 -0
  47. package/dist/server/providers/database/databases/sqld-sqlite/schemas/scorecard-results-table.js +1 -0
  48. package/dist/server/store.d.ts +1 -1
  49. package/dist/server/types/plugins/common.d.ts +1 -0
  50. package/dist/server/utils/catalog-classic/get-route-slug-to-catalog-slug-map.d.ts +19 -0
  51. package/dist/server/utils/catalog-classic/get-route-slug-to-catalog-slug-map.js +1 -0
  52. package/dist/server/utils/catalog-classic/get-route-slug-to-catalog-slug-map.test.d.ts +2 -0
  53. package/dist/server/utils/catalog-classic/get-route-slug-to-catalog-slug-map.test.js +1 -0
  54. package/dist/server/utils/is-catalog-entities-enabled.d.ts +2 -0
  55. package/dist/server/utils/is-catalog-entities-enabled.js +1 -0
  56. package/dist/server/utils/is-scorecards-enabled.d.ts +3 -0
  57. package/dist/server/utils/is-scorecards-enabled.js +1 -0
  58. package/dist/server/web-server/dev-server.js +1 -1
  59. package/dist/server/web-server/routes/replay-oauth2-redirect.js +78 -33
  60. package/dist/server/workers/scorecards-worker-pool.d.ts +4 -0
  61. package/dist/server/workers/scorecards-worker-pool.js +1 -0
  62. package/dist/server/workers/scorecards-worker.d.ts +2 -0
  63. package/dist/server/workers/scorecards-worker.js +1 -0
  64. package/dist/server/workers/types.d.ts +6 -0
  65. package/package.json +8 -8
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # @redocly/revel
2
2
 
3
+ ## 0.128.0-next.8
4
+
5
+ ### Minor Changes
6
+
7
+ - 5cd6434fa4: Pages with the `excludeFromSearch` front matter option are also excluded from the sitemap.
8
+
9
+ ### Patch Changes
10
+
11
+ - 81dc45dc56: Updated `@redocly/openapi-core` to version `2.12.1`.
12
+ - Updated dependencies [81dc45dc56]
13
+ - @redocly/openapi-docs@3.16.0-next.8
14
+ - @redocly/asyncapi-docs@1.5.0-next.8
15
+ - @redocly/portal-plugin-mock-server@0.13.0-next.8
16
+
17
+ ## 0.128.0-next.7
18
+
19
+ ### Patch Changes
20
+
21
+ - Updated dependencies [ca48d4ee2d]
22
+ - @redocly/openapi-docs@3.16.0-next.7
23
+ - @redocly/asyncapi-docs@1.5.0-next.7
24
+ - @redocly/portal-plugin-mock-server@0.13.0-next.7
25
+
3
26
  ## 0.128.0-next.6
4
27
 
5
28
  ### Patch Changes
package/README.md ADDED
@@ -0,0 +1,56 @@
1
+ # About Revel
2
+
3
+ Revel is Redocly's external developer showcase platform that transforms your API into a branded experience.
4
+
5
+ ## Features
6
+
7
+ - **Markdown Docs** - write content in Markdown and enhance it using built-in or custom Markdoc tags
8
+ - **React Pages** - build custom pages with React to create a modern experience
9
+ - **Component ejection** - eject and customize any component to bring your theming and branding
10
+ - **Multi-product support** - manage and showcase multiple API products with separate configuration for each product
11
+ - **Localization** - present your API in multiple languages for a global audience
12
+ - **Redocly Integration** - works seamlessly with Redoc for API docs and Reef for internal catalogs
13
+
14
+ Refer to [Redocly documentation](https://redocly.com/docs) for detailed configuration options.
15
+
16
+ You can explore a live deployment of Revel at [https://redocly.com](https://redocly.com) - our main website is built with it.
17
+
18
+ You can explore a live deployment of Revel at [https://redocly.com](https://redocly.com) - this website runs entirely on Realm (which includes Revel).
19
+
20
+ ## Installation
21
+
22
+ Install Revel using npm:
23
+
24
+ ```bash
25
+ npm install @redocly/revel
26
+ ```
27
+
28
+ Or using pnpm:
29
+
30
+ ```bash
31
+ pnpm add @redocly/revel
32
+ ```
33
+
34
+ Or using yarn:
35
+
36
+ ```bash
37
+ yarn add @redocly/revel
38
+ ```
39
+
40
+ ## Usage
41
+
42
+ Revel is designed to work seamlessly as part of the Redocly ecosystem. It integrates with:
43
+
44
+ - **Redoc** - for API reference documentation and mock servers
45
+ - **Reef** - for internal service catalogs
46
+ - **Realm** - the complete combination of Redoc, Revel, and Reef
47
+ - **Reunite** - for docs-as-code workflows and collaboration
48
+
49
+ ## Support
50
+
51
+ - [Documentation](https://redocly.com/docs)
52
+ - [Contact the Redocly team](https://redocly.com/contact-us)
53
+
54
+ ---
55
+
56
+ Built with 💙 by Redocly
@@ -1,3 +1,3 @@
1
- import{context as a}from"esbuild";import{mkdirSync as j,writeFileSync as b,existsSync as M}from"node:fs";import*as m from"node:path";import{RUNTIME_RESOURCES_DIR as Y,TELEMETRY_ENABLED as V}from"../constants/common.js";import{fromCurrentDir as t}from"../utils/paths.js";import{NodeBrowserPlugin as S}from"./plugins/node-browser.js";import{PortalImport as l}from"./plugins/portal-import.js";import{ThemesResolver as u}from"./plugins/themes-resolver.js";import{AssetsResolver as E}from"./plugins/assets-resolver.js";import{EsbuildErrorCollector as _}from"./plugins/esbuild-compile-resolver.js";import{OpenapiDocsModuleReplacer as f}from"./plugins/openapi-docs-module-replacer/index.js";import{ServerPropsResolver as R}from"./plugins/server-props-resolver.js";import{StyledComponentsSSR as v}from"./plugins/styled-components-ssr.js";import{DependencyResolver as d}from"./plugins/dependency-resolver.js";import{YamlLoader as L}from"./plugins/yaml-loader.js";import{ApiRequestHandlersResolver as A}from"./plugins/api-request-handlers-resolver.js";import{MiddlewareResolver as N}from"./plugins/middleware-resolver.js";import{OnRebuild as D}from"./plugins/on-rebuild.js";import{getPublicEnvVariables as $}from"../utils/envs/get-public-env-variables.js";import{PORTAL_VERSION as T}from"../version.js";import{AsyncApiPatch as O}from"./plugins/async-api-patch.js";import{telemetryTraceStep as g}from"../../cli/telemetry/helpers/trace-step.js";const C={bundle:!0,format:"esm",chunkNames:"chunks/[name]-[hash]"};function y(e){const o=m.join(e,"tsconfig.json");return M(o)?o:void 0}const p=new Set;async function ie(){await Promise.all([...p].map(e=>e.dispose())),p.clear()}async function ce(e,o,r="production",n){return await g("build.create_client_compiler",async()=>{const c=$(),i={};Object.entries(c).map(([h,w])=>i[`process.env.${h}`]=JSON.stringify(w));const s=[...n?[D(n)]:[],S({path:"path-browserify",fs:"{}",tty:"tty-browserify",os:"os-browserify",http:"stream-http",https:"stream-http",readline:"{}",crypto:"{}",stream:"{}",zlib:"{}","https-proxy-agent":"{}"}),u(e,e.contentDir),E(e,e.contentDir),_(e,e.contentDir),R(e),d(),l(),L(),O(),v(),f()],I=[t(import.meta.url,"../../client/browser-entry.js"),t(import.meta.url,"../../client/user-tags-entry.js")],P=await a({...C,entryPoints:I,outdir:m.join(o,Y),sourcemap:r!=="production"&&process.env.ENABLE_SOURCE_MAPS==="true",plugins:s,tsconfig:y(e.contentDir),mainFields:["browser","module","main"],metafile:r!=="production",minify:r==="production",splitting:!0,external:["constants","zlib","stream","https","vm","module","worker_threads","child_process","@swc/core"],inject:[process.env.INSPECT_MODE==="true"?t(import.meta.url,"../../client/inspect-mode-hooks.js"):"",t(import.meta.url,"./web-shim.js")].filter(Boolean),define:{...i,"process.env.NODE_ENV":`"${r}"`,"process.env.REDOCLY_LOCAL_DEV":`"${process.env.REDOCLY_LOCAL_DEV}"`,"process.env.SERVER_EDITOR_APP_URL":`"${process.env.SERVER_EDITOR_APP_URL}"`,"process.env.ENABLE_COMMENTS":`"${process.env.ENABLE_COMMENTS}"`,"process.env.REDOCLY_TELEMETRY":V?'""':'"off"',"process.env.REDOCLY_PORTAL_VERSION":`"${T}"`,"process.env":`{"NODE_ENV": "${r}"}`,"process.platform":'"browser"',"process.browser":"true","module.hot":"false",global:"{}",...process.env.REDOCLY_PREFIX_PATHS&&{"process.env.REDOCLY_PREFIX_PATHS":`"${process.env.REDOCLY_PREFIX_PATHS}"`},...process.env.INSPECT_MODE==="true"&&{"process.env.INSPECT_MODE":`${process.env.INSPECT_MODE}`},...process.env.MAIN_API_URL&&{"process.env.MAIN_API_URL":`"${process.env.MAIN_API_URL}"`}},logLevel:"silent"});return p.add(P),P})}async function pe(e,o,r="development",n){j(o,{recursive:!0}),b(m.join(o,"package.json"),JSON.stringify({name:"@redocly/portal/server-cache",type:"module"}));const c=[...n?[D(n)]:[],u(e,e.contentDir),E(e,e.contentDir),_(e,e.contentDir),R(e),A(e),N(e),d(),l(),L(),O(),v(),f()],i=[t(import.meta.url,"../../client/server-entry.js"),t(import.meta.url,"../../client/user-tags-entry.js"),t(import.meta.url,"../../client/server-props-entry.js"),t(import.meta.url,"../../client/api-request-handlers-entry.js"),t(import.meta.url,"../../client/middleware-entry.js")],s=await a({...C,entryPoints:i,outdir:o,plugins:c,sourcemap:r!=="production"&&process.env.ENABLE_SOURCE_MAPS==="true",minify:r==="production",tsconfig:y(e.contentDir),mainFields:["module","main"],splitting:!0,external:["react","react-router-dom","@dr.pogodin/react-helmet","@swc/core","pnpapi","canvas"],banner:{js:`import { createRequire as topLevelCreateRequire } from 'module';
2
- const require = topLevelCreateRequire(import.meta.url);`},platform:"node",define:{"process.env.NODE_ENV":`"${r}"`,"process.env.REDOCLY_LOCAL_DEV":`"${process.env.REDOCLY_LOCAL_DEV}"`,"module.hot":"false"},logLevel:"silent"});return p.add(s),s}async function ae(e,o,r="production",n){return await g("build.create_server_compiler",async()=>{const c=[...n?[D(n)]:[],S({"node-fetch":"{}",webpack:"{}",swagger2openapi:"{}"}),u(e,e.contentDir),E(e,e.contentDir),_(e,e.contentDir),R(e),A(e),N(e),d(),l(),L(),O(),v(),f()],i=[{in:t(import.meta.url,"../node-bundle-entry.js"),out:"index"},{in:t(import.meta.url,"../../client/user-tags-entry.js"),out:"user-tags-entry"},{in:t(import.meta.url,"../workers/api-routes-worker.js"),out:"api-routes-worker"}],s=await a({...C,entryPoints:i,outExtension:{".js":".mjs"},outdir:o,platform:"node",plugins:c,tsconfig:y(e.contentDir),mainFields:["module","main"],metafile:r!=="production",minify:r==="production",splitting:!1,define:{"process.env.NODE_ENV":`"${r}"`,"process.env.REDOCLY_LOCAL_DEV":`"${process.env.REDOCLY_LOCAL_DEV}"`,"process.env.REDOCLY_STATIC_BUNDLE":"true","process.env.REDOCLY_PORTAL_VERSION":`"${T}"`,"module.hot":"false",...process.env.REDOCLY_PREFIX_PATHS&&{"process.env.REDOCLY_PREFIX_PATHS":`"${process.env.REDOCLY_PREFIX_PATHS}"`}},banner:{js:`import { createRequire as topLevelCreateRequire } from 'module';
1
+ import{context as a}from"esbuild";import{mkdirSync as j,writeFileSync as b,existsSync as M}from"node:fs";import*as m from"node:path";import{RUNTIME_RESOURCES_DIR as Y,TELEMETRY_ENABLED as V}from"../constants/common.js";import{fromCurrentDir as t}from"../utils/paths.js";import{NodeBrowserPlugin as S}from"./plugins/node-browser.js";import{PortalImport as l}from"./plugins/portal-import.js";import{ThemesResolver as u}from"./plugins/themes-resolver.js";import{AssetsResolver as E}from"./plugins/assets-resolver.js";import{EsbuildErrorCollector as _}from"./plugins/esbuild-compile-resolver.js";import{OpenapiDocsModuleReplacer as f}from"./plugins/openapi-docs-module-replacer/index.js";import{ServerPropsResolver as R}from"./plugins/server-props-resolver.js";import{StyledComponentsSSR as v}from"./plugins/styled-components-ssr.js";import{DependencyResolver as d}from"./plugins/dependency-resolver.js";import{YamlLoader as L}from"./plugins/yaml-loader.js";import{ApiRequestHandlersResolver as A}from"./plugins/api-request-handlers-resolver.js";import{MiddlewareResolver as N}from"./plugins/middleware-resolver.js";import{OnRebuild as D}from"./plugins/on-rebuild.js";import{getPublicEnvVariables as $}from"../utils/envs/get-public-env-variables.js";import{PORTAL_VERSION as w}from"../version.js";import{AsyncApiPatch as O}from"./plugins/async-api-patch.js";import{telemetryTraceStep as T}from"../../cli/telemetry/helpers/trace-step.js";const C={bundle:!0,format:"esm",chunkNames:"chunks/[name]-[hash]"};function y(e){const o=m.join(e,"tsconfig.json");return M(o)?o:void 0}const p=new Set;async function ie(){await Promise.all([...p].map(e=>e.dispose())),p.clear()}async function ce(e,o,r="production",n){return await T("build.create_client_compiler",async()=>{const c=$(),i={};Object.entries(c).map(([I,h])=>i[`process.env.${I}`]=JSON.stringify(h));const s=[...n?[D(n)]:[],S({path:"path-browserify",fs:"{}",tty:"tty-browserify",os:"os-browserify",http:"stream-http",https:"stream-http",readline:"{}",crypto:"{}",stream:"{}",zlib:"{}","https-proxy-agent":"{}"}),u(e,e.contentDir),E(e,e.contentDir),_(e,e.contentDir),R(e),d(),l(),L(),O(),v(),f()],g=[t(import.meta.url,"../../client/browser-entry.js"),t(import.meta.url,"../../client/user-tags-entry.js")],P=await a({...C,entryPoints:g,outdir:m.join(o,Y),sourcemap:r!=="production"&&process.env.ENABLE_SOURCE_MAPS==="true",plugins:s,tsconfig:y(e.contentDir),mainFields:["browser","module","main"],metafile:r!=="production",minify:r==="production",splitting:!0,external:["constants","zlib","stream","https","vm","module","worker_threads","child_process","@swc/core"],inject:[process.env.INSPECT_MODE==="true"?t(import.meta.url,"../../client/inspect-mode-hooks.js"):"",t(import.meta.url,"./web-shim.js")].filter(Boolean),define:{...i,"process.env.NODE_ENV":`"${r}"`,"process.env.REDOCLY_LOCAL_DEV":`"${process.env.REDOCLY_LOCAL_DEV}"`,"process.env.SERVER_EDITOR_APP_URL":`"${process.env.SERVER_EDITOR_APP_URL}"`,"process.env.ENABLE_COMMENTS":`"${process.env.ENABLE_COMMENTS}"`,"process.env.REDOCLY_TELEMETRY":V?'""':'"off"',"process.env.REDOCLY_PORTAL_VERSION":`"${w}"`,"process.env":`{"NODE_ENV": "${r}"}`,"process.platform":'"browser"',"process.browser":"true","module.hot":"false",global:"{}",...process.env.REDOCLY_PREFIX_PATHS&&{"process.env.REDOCLY_PREFIX_PATHS":`"${process.env.REDOCLY_PREFIX_PATHS}"`},...process.env.INSPECT_MODE==="true"&&{"process.env.INSPECT_MODE":`${process.env.INSPECT_MODE}`},...process.env.MAIN_API_URL&&{"process.env.MAIN_API_URL":`"${process.env.MAIN_API_URL}"`}},logLevel:"silent"});return p.add(P),P})}async function pe(e,o,r="development",n){j(o,{recursive:!0}),b(m.join(o,"package.json"),JSON.stringify({name:"@redocly/portal/server-cache",type:"module"}));const c=[...n?[D(n)]:[],u(e,e.contentDir),E(e,e.contentDir),_(e,e.contentDir),R(e),A(e),N(e),d(),l(),L(),O(),v(),f()],i=[t(import.meta.url,"../../client/server-entry.js"),t(import.meta.url,"../../client/user-tags-entry.js"),t(import.meta.url,"../../client/server-props-entry.js"),t(import.meta.url,"../../client/api-request-handlers-entry.js"),t(import.meta.url,"../../client/middleware-entry.js")],s=await a({...C,entryPoints:i,outdir:o,plugins:c,sourcemap:r!=="production"&&process.env.ENABLE_SOURCE_MAPS==="true",minify:r==="production",tsconfig:y(e.contentDir),mainFields:["module","main"],splitting:!0,external:["react","react-router-dom","@dr.pogodin/react-helmet","@swc/core","pnpapi","canvas"],banner:{js:`import { createRequire as topLevelCreateRequire } from 'module';
2
+ const require = topLevelCreateRequire(import.meta.url);`},platform:"node",define:{"process.env.NODE_ENV":`"${r}"`,"process.env.REDOCLY_LOCAL_DEV":`"${process.env.REDOCLY_LOCAL_DEV}"`,"module.hot":"false"},logLevel:"silent"});return p.add(s),s}async function ae(e,o,r="production",n){return await T("build.create_server_compiler",async()=>{const c=[...n?[D(n)]:[],S({"node-fetch":"{}",webpack:"{}",swagger2openapi:"{}"}),u(e,e.contentDir),E(e,e.contentDir),_(e,e.contentDir),R(e),A(e),N(e),d(),l(),L(),O(),v(),f()],i=[{in:t(import.meta.url,"../node-bundle-entry.js"),out:"index"},{in:t(import.meta.url,"../../client/user-tags-entry.js"),out:"user-tags-entry"},{in:t(import.meta.url,"../workers/api-routes-worker.js"),out:"api-routes-worker"},{in:t(import.meta.url,"../workers/scorecards-worker.js"),out:"scorecards-worker"}],s=await a({...C,entryPoints:i,outExtension:{".js":".mjs"},outdir:o,platform:"node",plugins:c,tsconfig:y(e.contentDir),mainFields:["module","main"],metafile:r!=="production",minify:r==="production",splitting:!1,define:{"process.env.NODE_ENV":`"${r}"`,"process.env.REDOCLY_LOCAL_DEV":`"${process.env.REDOCLY_LOCAL_DEV}"`,"process.env.REDOCLY_STATIC_BUNDLE":"true","process.env.REDOCLY_PORTAL_VERSION":`"${w}"`,"module.hot":"false",...process.env.REDOCLY_PREFIX_PATHS&&{"process.env.REDOCLY_PREFIX_PATHS":`"${process.env.REDOCLY_PREFIX_PATHS}"`}},banner:{js:`import { createRequire as topLevelCreateRequire } from 'module';
3
3
  const require = topLevelCreateRequire(import.meta.url);`},logLevel:"silent"});return p.add(s),s})}export{ce as createClientCompiler,ae as createNodeBundleCompiler,pe as createServerCompiler,ie as stopAllCompilers};
@@ -1 +1 @@
1
- import{resolve as a,dirname as c}from"node:path";import{fileURLToPath as f}from"node:url";import{readFile as l}from"fs/promises";import{createReadStream as u}from"fs";import{telemetry as d}from"./telemetry/index.js";import{createRouter as v}from"./web-server/router.js";import{installProdRoutes as S}from"./web-server/routes/index.js";import{Store as D}from"./store.js";import{loadEnvVariables as E}from"./utils/envs/load-env-variables.js";import{startHttpServer as g}from"./web-server/http.js";import{readStaticData as P}from"./utils/static-data.js";import{startIdleTimeout as w}from"./web-server/middleware/idleTimeoutMiddleware.js";import{reporter as A}from"./tools/notifiers/reporter.js";import{EntitlementsProvider as N}from"./entitlements/entitlements-provider.js";import{DatabasePreconnectService as R}from"./providers/database/database-preconnect-service.js";import{isBuildMode as x}from"./utils/envs/is-build-mode.js";import{KvService as I}from"./persistence/kv/services/kv-service.js";import{renderPage as U}from"./ssr/index.js";if(!x()){let p=function(){const r=process.argv.findIndex(o=>o==="--port"||o==="-p");if(r===-1)return null;const e=process.argv[r+1];if(e.startsWith("-"))return null;const i=parseInt(e,10);return isNaN(i)?null:i};const t=c(f(import.meta.url));E(t);const n=JSON.parse(await l(a(t,"./store.json"),"utf-8")),s=D.fromJson(n,{outdir:a(t,"../client"),serverOutDir:t,serverMode:!0,contentDir:""});if(await N.instance().init({ignoreTokenExpiration:!0}),process.env.NEW_CATALOG_ENABLED==="true"){await R.init(t);const r=await I.getInstance({baseDbDir:t});setInterval(()=>r.clearExpired(),300*1e3)}m(s).catch(r=>{console.error(r)});async function m(r){d.initialize();const e=await v();S(e,r,{readStaticAsset:async o=>u(o),resolveRouteData:async o=>P(o.slug,r.outdir)}),A.printErrors();const i=p();return await g(e,i??process.env.PORT??4e3),w(),e}}export{U as renderPage};
1
+ import{resolve as a,dirname as p}from"node:path";import{fileURLToPath as f}from"node:url";import{readFile as l}from"fs/promises";import{createReadStream as u}from"fs";import{telemetry as d}from"./telemetry/index.js";import{createRouter as v}from"./web-server/router.js";import{installProdRoutes as S}from"./web-server/routes/index.js";import{Store as g}from"./store.js";import{loadEnvVariables as D}from"./utils/envs/load-env-variables.js";import{startHttpServer as E}from"./web-server/http.js";import{readStaticData as P}from"./utils/static-data.js";import{startIdleTimeout as b}from"./web-server/middleware/idleTimeoutMiddleware.js";import{reporter as w}from"./tools/notifiers/reporter.js";import{EntitlementsProvider as R}from"./entitlements/entitlements-provider.js";import{DatabasePreconnectService as x}from"./providers/database/database-preconnect-service.js";import{isBuildMode as I}from"./utils/envs/is-build-mode.js";import{KvService as y}from"./persistence/kv/services/kv-service.js";import{runScorecardsWorker as N}from"./plugins/scorecards/workers/run-scorecards-worker.js";import{isCatalogEntitiesEnabled as O}from"./utils/is-catalog-entities-enabled.js";import{isScorecardsEnabled as T}from"./utils/is-scorecards-enabled.js";import{renderPage as _}from"./ssr/index.js";if(!I()){let c=function(){const r=process.argv.findIndex(o=>o==="--port"||o==="-p");if(r===-1)return null;const e=process.argv[r+1];if(e.startsWith("-"))return null;const i=parseInt(e,10);return isNaN(i)?null:i};const t=p(f(import.meta.url));D(t);const n=JSON.parse(await l(a(t,"./store.json"),"utf-8")),s=g.fromJson(n,{outdir:a(t,"../client"),serverOutDir:t,serverMode:!0,contentDir:""});if(await R.instance().init({ignoreTokenExpiration:!0}),O()){await x.init(t);const r=await y.getInstance({baseDbDir:t});setInterval(()=>r.clearExpired(),300*1e3)}m(s).catch(r=>{console.error(r)});async function m(r){d.initialize();const e=await v();S(e,r,{readStaticAsset:async o=>u(o),resolveRouteData:async o=>P(o.slug,r.outdir)}),w.printErrors();const i=c();return await E(e,i??process.env.PORT??4e3),b(),T(r.config)&&N(r.serverOutDir),e}}export{_ as renderPage};
@@ -7,6 +7,7 @@ import type { ServiceInstanceOptions } from '../../../providers/database/types.j
7
7
  import type { TransactionsManager } from '../../../providers/database/transactions-manager.js';
8
8
  import type { CreateEntityParams } from './repositories/local/catalog-entities-local-write-repository.js';
9
9
  import type { Filter } from '../../../providers/database/pagination/types.js';
10
+ import type { ScorecardsStatus } from '../entities/types.js';
10
11
  import { type EntityDtoSchema, type EntityRelationDtoSchema } from '../schemas/dto-schemas.js';
11
12
  import { CatalogEntitiesLocalRepository } from './repositories/local/catalog-entities-local-repository.js';
12
13
  import { CatalogEntitiesRemoteRepository } from './repositories/remote/catalog-entities-remote-repository.js';
@@ -129,6 +130,9 @@ export declare class CatalogEntitiesService {
129
130
  getEntityWithRelationsByKey(entityKey: string, paginationParams?: PaginationParams): Promise<BffCatalogEntity | null>;
130
131
  getRelatedEntities(entityKey: string, paginationParams?: PaginationParams): Promise<BffCatalogRelatedEntityList>;
131
132
  listEntityRevisions(entityKey: string, version?: string | null): Promise<Pick<EntityReadModelSchema, "version" | "isDefaultVersion" | "createdAt" | "updatedAt" | "revision" | "isCurrent">[]>;
133
+ updateEntityScorecardsStatus(entityId: string, status: ScorecardsStatus): Promise<boolean>;
134
+ updateEntityScorecardsStatusIfCalculating(entityId: string, status: Extract<ScorecardsStatus, 'UP_TO_DATE' | 'OUTDATED'>): Promise<boolean>;
135
+ getOutdatedEntity(): Promise<EntityReadModelSchema | null>;
132
136
  }
133
137
  export {};
134
138
  //# sourceMappingURL=catalog-entities-service.d.ts.map
@@ -1 +1 @@
1
- import{entityFileSchema as h}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 d}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 E}from"../utils/ajv-validator.js";import{hasOptionsChanged as w}from"../utils/has-options-changed.js";const u=15,f=E(d,{errorPrefix:"Entity relation validation failed:",dataVar:"entity relation"}),p=E(h,{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,u,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,u,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)}}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?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 +1 @@
1
- import{ulid as e}from"ulid";function c({entity:l,organizationId:r,projectId:a,source:u,sourceFile:i,fileHash:o}){const s=new Date().toISOString();return{id:l.id||`ce_${e()}`,organizationId:r,projectId:a,key:l.key,type:l.type,title:l.title,summary:l.summary||null,tags:l.tags?JSON.stringify(l.tags):null,metadata:l.metadata?JSON.stringify(l.metadata):null,git:l.git?JSON.stringify(l.git):null,contact:l.contact?JSON.stringify(l.contact):null,links:l.links?JSON.stringify(l.links):null,createdAt:l.createdAt||s,updatedAt:s,source:u||"file",sourceFile:i||null,fileHash:o||null,version:l.version||null,revision:l.revision,hash:l.hash,isCurrent:l.isCurrent,isDefaultVersion:l.isDefaultVersion??!1}}export{c as createEntityDbRecord};
1
+ import{ulid as e}from"ulid";function n({entity:s,organizationId:a,projectId:l,source:u,sourceFile:i,fileHash:o}){const r=new Date().toISOString();return{id:s.id||`ce_${e()}`,organizationId:a,projectId:l,key:s.key,type:s.type,title:s.title,summary:s.summary||null,tags:s.tags?JSON.stringify(s.tags):null,metadata:s.metadata?JSON.stringify(s.metadata):null,git:s.git?JSON.stringify(s.git):null,contact:s.contact?JSON.stringify(s.contact):null,links:s.links?JSON.stringify(s.links):null,createdAt:s.createdAt||r,updatedAt:r,source:u||"file",sourceFile:i||null,fileHash:o||null,version:s.version||null,revision:s.revision,hash:s.hash,isCurrent:s.isCurrent,isDefaultVersion:s.isDefaultVersion??!1,scorecardsStatus:"OUTDATED"}}export{n as createEntityDbRecord};
@@ -27,6 +27,7 @@ export declare class CatalogEntitiesLocalReadRepository {
27
27
  count: number;
28
28
  }[]>;
29
29
  getEntityByKey(key: string): Promise<EntityReadModelSchema | null>;
30
+ getOneOutdatedEntity(): Promise<EntityReadModelSchema | null>;
30
31
  getEntitiesRelations(paginationParams?: PaginationParams): Promise<ListResult<EntityRelationReadModelSchema>>;
31
32
  getEntityRelationById(id: string): Promise<EntityRelationReadModelSchema | null>;
32
33
  getEntitiesWithRelations(paginationParams?: PaginationParams): Promise<ListResult<BffCatalogEntity>>;
@@ -1,4 +1,4 @@
1
- import{and as o,count as Y,eq as r,ne as M,notExists as N,or as B,sql as e}from"drizzle-orm";import{unionAll as k}from"drizzle-orm/sqlite-core";import{asc as G}from"drizzle-orm";import{logger as X}from"../../../../../tools/notifiers/logger.js";import{isObject as z}from"../../../../../../utils/guards/is-object.js";import{applyPagination as S}from"../../../../../providers/database/pagination/index.js";import{applyFilter as Q,getFirstFilterFieldValue as x}from"../../../../../providers/database/pagination/filter.js";import{createBffRelatedEntity as Z}from"../../mappers/create-bff-related-entity.js";import{createBffEntity as V}from"../../mappers/create-bff-entity.js";import{FIELDS_TO_SELECT_FOR_ENTITY as c,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as _,createEntityFieldsForSelect as j,createEntityRelationFieldsForSelect as K,createQualifiedEntityFieldsForSelect as ee,createQualifiedEntityFieldsForSelectWithAliases as te}from"../utils.js";import{createEntityReadModel as P}from"../../mappers/create-entity-read-model.js";import{createEntityRelation as J}from"../../mappers/create-entity-relation.js";import{entitiesTable as i}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";class we{#e;#t=void 0;constructor(t){this.#e=t}async attachDatabase(t){this.#t!==t&&(this.#t=t,await this.#e.client.run(e`ATTACH DATABASE ${t} AS remote`))}async getEntities(t={}){const s=this.#t?k(this.#e.client.select(c).from(e`remote.entities`).where(r(e.raw("is_current"),1)),this.#e.client.select(c).from(i).where(o(r(i.isCurrent,!0),N(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(o(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(c).from(i).where(r(i.isCurrent,!0)),n=this.#e.client.select(c).from(s.as("combined_entities")),l=this.#e.client.select(c).from(s.as("combined_entities")).$dynamic(),E=S(l,{...t,limit:void 0,skip:void 0,after:void 0,before:void 0}),u=this.#e.client.$count(E),d=n.$dynamic(),m=t.limit||10,y=S(d,{...t,limit:m+1}),[f,h]=await Promise.all([y.run(),u]),T=f.rows,g=T.length>m;return{items:T.slice(0,m).map(w=>P(w)).filter(w=>w!==null),hasMore:g,total:h}}async listEntityRevisions(t,s){const n=[r(i.key,t),...s?[r(i.version,s)]:[]],l=this.#t?k(this.#e.client.select({version:e.raw("version"),revision:e.raw("revision"),isCurrent:e.raw("is_current"),createdAt:e.raw("created_at"),updatedAt:e.raw("updated_at"),isDefaultVersion:e.raw("is_default_version")}).from(e`remote.entities`).where(o(e`key = ${t}`,s?e`version = ${s}`:void 0)),this.#e.client.select({version:i.version,revision:i.revision,isCurrent:i.isCurrent,createdAt:i.createdAt,updatedAt:i.updatedAt,isDefaultVersion:i.isDefaultVersion}).from(i).where(o(...n,N(this.#e.client.select({version:e.raw("version")}).from(e`remote.entities as remote`).where(o(e`remote.key = ${i.key}`,e`remote.version = ${i.version}`,e`remote.revision = ${i.revision}`)))))):this.#e.client.select({version:i.version,revision:i.revision,isCurrent:i.isCurrent,createdAt:i.createdAt,updatedAt:i.updatedAt,isDefaultVersion:i.isDefaultVersion}).from(i).where(o(...n));return(await this.#e.client.select({version:e.raw("version"),revision:e.raw("revision"),isCurrent:e.raw("is_current"),createdAt:e.raw("created_at"),updatedAt:e.raw("updated_at"),isDefaultVersion:e.raw("is_default_version")}).from(l.as("combined_revisions")).orderBy(e.raw("is_current DESC"),e.raw("updated_at DESC"),e.raw("created_at DESC")).run()).rows.map(u=>({version:u.version||null,revision:u.revision||null,isCurrent:u.is_current!==null?!!u.is_current:!1,createdAt:u.created_at||null,updatedAt:u.updated_at||null,isDefaultVersion:u.is_default_version!==null?!!u.is_default_version:!1}))}async getEntitiesCountByTypes(){return this.#e.client.select({type:i.type,count:Y()}).from(i).groupBy(i.type)}async getEntityByKey(t){const l=(await(this.#t?k(this.#e.client.select(c).from(e`remote.entities`).where(o(r(i.key,t),r(e.raw("is_current"),1))),this.#e.client.select(c).from(i).where(o(r(i.key,t),r(i.isCurrent,!0),N(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(o(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(c).from(i).where(o(r(i.key,t),r(i.isCurrent,!0)))).run()).rows[0];return l?P(l):null}async getEntitiesRelations(t={}){const s=this.#t?k(this.#e.client.select(_).from(e`remote.entities_relations`),this.#e.client.select(_).from(a).where(N(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${a.sourceKey}`)))):this.#e.client.select(_).from(a),n=this.#e.client.select(_).from(s.as("combined_entities_relations")).$dynamic(),l=this.#e.client.select(_).from(s.as("combined_entities_relations")).$dynamic(),E=S(l,{...t,limit:void 0,skip:void 0,after:void 0,before:void 0}),u=this.#e.client.$count(E),d=t.limit||10,m=S(n,{...t,limit:d+1}),[y,f]=await Promise.all([m.run(),u]),h=y.rows,T=h.length>d;return{items:h.slice(0,d).map(g=>J(g)).filter(g=>g!==null),hasMore:T,total:f}}async getEntityRelationById(t){const l=(await(this.#t?k(this.#e.client.select(_).from(e`remote.entities_relations`).where(r(a.id,t)),this.#e.client.select(_).from(a).where(o(r(a.id,t),N(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(e`remote.id = ${a.id}`))))):this.#e.client.select(_).from(a).where(r(a.id,t))).run()).rows[0];return l?J(l):null}async getEntitiesWithRelations(t={}){const n=(this.#t?k(this.#e.client.select(c).from(e`remote.entities`).where(r(e.raw("is_current"),1)),this.#e.client.select(c).from(i).where(o(r(i.isCurrent,!0),N(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(o(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(c).from(i).where(r(i.isCurrent,!0))).as("e"),E=(this.#t?k(this.#e.client.select(_).from(e`remote.entities_relations`),this.#e.client.select(_).from(a).where(N(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${a.sourceKey}`)))):this.#e.client.select(_).from(a)).as("combined_relations"),d=(this.#t?k(this.#e.client.select(c).from(e`remote.entities`).where(r(e.raw("is_current"),1)),this.#e.client.select(c).from(i).where(o(r(i.isCurrent,!0),N(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(o(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(c).from(i).where(r(i.isCurrent,!0))).as("combined_target_entities"),m=this.#e.client.with(n,E,d).select({...j("e"),domains:this.#r("e").as("domains"),owners:this.#s("e").as("owners")}).from(n).as("entities_with_relations"),y={...c,domains:m.domains,owners:m.owners},f=this.#e.client.with(m).select(y).from(m).$dynamic(),h=this.#e.client.with(m).select(y).from(m).$dynamic(),{whereCondition:T}=Q(f,t.filter);T&&f.where(T);const{whereCondition:g}=Q(h,t.filter);g&&h.where(g);try{const w=S(h,{...t,limit:void 0,skip:void 0,after:void 0,before:void 0}),I=this.#e.client.$count(w),R=t.limit||10,L=S(f,{...t,limit:R+1}),[$,p]=await Promise.all([L.run(),I]),v=$.rows,D=v.length>R;return{items:v.slice(0,R).map(C=>V(C)).filter(C=>C!==null),hasMore:D,total:p}}catch(w){return X.error("Error getting entities with relations:",w),{items:[],hasMore:!1,total:0}}}#i(t){return z(t)?t.field==="version"||t.field==="revision":Array.isArray(t)?t.some(s=>this.#i(s)):!1}async getEntityWithRelationsByKey(t,s={}){const n=this.#i(s.filter),l=n?[]:[r(i.isCurrent,!0)],E=n?[e`remote.version = ${i.version}`,e`remote.revision = ${i.revision}`]:[e`remote.is_current = 1`],u=this.#e.client.select(c).from(e`remote.entities`),d=n?u.where(r(e.raw("key"),t)):u.where(o(r(e.raw("key"),t),r(e.raw("is_current"),1))),m=this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(o(e`remote.key = ${i.key}`,...E)),y=this.#e.client.select(c).from(i).where(o(r(i.key,t),...l,N(m))),f=this.#e.client.select(c).from(i),h=n?f.where(r(i.key,t)):f.where(o(r(i.key,t),r(i.isCurrent,!0))),g=(this.#t?k(d,y):h).as("e"),I=(this.#t?k(this.#e.client.select(_).from(e`remote.entities_relations`),this.#e.client.select(_).from(a).where(N(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${a.sourceKey}`)))):this.#e.client.select(_).from(a)).as("combined_relations"),R=this.#e.client.select(c).from(e`remote.entities`),L=n?R:R.where(r(e.raw("is_current"),1)),$=this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(o(e`remote.key = ${i.key}`,...E)),p=this.#e.client.select(c).from(i),v=p.where(o(...l,N($))),D=n?p:p.where(r(i.isCurrent,!0)),H=(this.#t?k(L,v):D).as("combined_target_entities"),b=this.#e.client.with(g,I,H).select({...j("e"),domains:this.#r("e").as("domains"),owners:this.#s("e").as("owners")}).from(g).as("entities_with_relations_by_key"),U={...c,domains:b.domains,owners:b.owners},A=this.#e.client.with(b).select(U).from(b).$dynamic();A.where(r(e.raw("key"),t));const{whereCondition:F}=Q(A,s.filter);F&&A.where(F),A.limit(1);const W=await A.run();if(W.rows.length===0)return null;const O=W.rows[0];return V(O)}async getRelatedEntities(t,s={}){const n=K("","relation_id"),l=x(s.filter,"version"),E=x(s.filter,"revision"),u=[B(r(a.sourceKey,t),r(a.targetKey,t))],d=typeof l=="string"?B(o(r(a.sourceKey,t),r(a.sourceVersion,l)),o(r(a.targetKey,t),r(a.targetVersion,l))):void 0,m=typeof E=="string"?B(o(r(a.sourceKey,t),r(a.sourceRevision,E)),o(r(a.targetKey,t),r(a.targetRevision,E))):void 0,y=[...u,d,m].filter(O=>O!==void 0),h=(this.#t?k(this.#e.client.select(n).from(e`remote.entities_relations`).where(o(...y)),this.#e.client.select(n).from(a).where(o(...y,N(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(o(e`remote.source_key = ${a.sourceKey}`,e`remote.target_key = ${a.targetKey}`,e`remote.source_to_target_relation = ${a.sourceToTargetRelation}`)))))):this.#e.client.select(n).from(a).where(o(...y))).as("combined_relations"),T=j("","entity_id"),w=(this.#t?k(this.#e.client.select(T).from(e`remote.entities`).where(r(e.raw("is_current"),1)),this.#e.client.select(T).from(i).where(o(r(i.isCurrent,!0),N(this.#e.client.select({id:c.id}).from(e`remote.entities as remote`).where(o(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(T).from(i).where(r(i.isCurrent,!0))).as("combined_target_entities"),I=te("combined_target_entities"),R=Object.values(ee("combined_target_entities")),L={...I,relation_type:e`
1
+ import{and as c,count as Y,eq as r,ne as M,notExists as f,or as L,sql as e}from"drizzle-orm";import{unionAll as w}from"drizzle-orm/sqlite-core";import{asc as G}from"drizzle-orm";import{logger as x}from"../../../../../tools/notifiers/logger.js";import{isObject as z}from"../../../../../../utils/guards/is-object.js";import{applyPagination as R}from"../../../../../providers/database/pagination/index.js";import{applyFilter as Q,getFirstFilterFieldValue as V}from"../../../../../providers/database/pagination/filter.js";import{createBffRelatedEntity as Z}from"../../mappers/create-bff-related-entity.js";import{createBffEntity as P}from"../../mappers/create-bff-entity.js";import{FIELDS_TO_SELECT_FOR_ENTITY as o,FIELDS_TO_SELECT_FOR_ENTITY_RELATION as _,createEntityFieldsForSelect as q,createEntityRelationFieldsForSelect as K,createQualifiedEntityFieldsForSelect as ee,createQualifiedEntityFieldsForSelectWithAliases as te}from"../utils.js";import{createEntityReadModel as j}from"../../mappers/create-entity-read-model.js";import{createEntityRelation as J}from"../../mappers/create-entity-relation.js";import{entitiesTable as i}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";class we{#e;#t=void 0;constructor(t){this.#e=t}async attachDatabase(t){this.#t!==t&&(this.#t=t,await this.#e.client.run(e`ATTACH DATABASE ${t} AS remote`))}async getEntities(t={}){const s=this.#t?w(this.#e.client.select(o).from(e`remote.entities`).where(r(e.raw("is_current"),1)),this.#e.client.select(o).from(i).where(c(r(i.isCurrent,!0),f(this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(o).from(i).where(r(i.isCurrent,!0)),n=this.#e.client.select(o).from(s.as("combined_entities")),l=this.#e.client.select(o).from(s.as("combined_entities")).$dynamic(),y=R(l,{...t,limit:void 0,skip:void 0,after:void 0,before:void 0}),u=this.#e.client.$count(y),d=n.$dynamic(),m=t.limit||10,E=R(d,{...t,limit:m+1}),[N,h]=await Promise.all([E.run(),u]),T=N.rows,g=T.length>m;return{items:T.slice(0,m).map(k=>j(k)).filter(k=>k!==null),hasMore:g,total:h}}async listEntityRevisions(t,s){const n=[r(i.key,t),...s?[r(i.version,s)]:[]],l=this.#t?w(this.#e.client.select({version:e.raw("version"),revision:e.raw("revision"),isCurrent:e.raw("is_current"),createdAt:e.raw("created_at"),updatedAt:e.raw("updated_at"),isDefaultVersion:e.raw("is_default_version")}).from(e`remote.entities`).where(c(e`key = ${t}`,s?e`version = ${s}`:void 0)),this.#e.client.select({version:i.version,revision:i.revision,isCurrent:i.isCurrent,createdAt:i.createdAt,updatedAt:i.updatedAt,isDefaultVersion:i.isDefaultVersion}).from(i).where(c(...n,f(this.#e.client.select({version:e.raw("version")}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.version = ${i.version}`,e`remote.revision = ${i.revision}`)))))):this.#e.client.select({version:i.version,revision:i.revision,isCurrent:i.isCurrent,createdAt:i.createdAt,updatedAt:i.updatedAt,isDefaultVersion:i.isDefaultVersion}).from(i).where(c(...n));return(await this.#e.client.select({version:e.raw("version"),revision:e.raw("revision"),isCurrent:e.raw("is_current"),createdAt:e.raw("created_at"),updatedAt:e.raw("updated_at"),isDefaultVersion:e.raw("is_default_version")}).from(l.as("combined_revisions")).orderBy(e.raw("is_current DESC"),e.raw("updated_at DESC"),e.raw("created_at DESC")).run()).rows.map(u=>({version:u.version||null,revision:u.revision||null,isCurrent:u.is_current!==null?!!u.is_current:!1,createdAt:u.created_at||null,updatedAt:u.updated_at||null,isDefaultVersion:u.is_default_version!==null?!!u.is_default_version:!1}))}async getEntitiesCountByTypes(){return this.#e.client.select({type:i.type,count:Y()}).from(i).groupBy(i.type)}async getEntityByKey(t){const l=(await(this.#t?w(this.#e.client.select(o).from(e`remote.entities`).where(c(r(i.key,t),r(e.raw("is_current"),1))),this.#e.client.select(o).from(i).where(c(r(i.key,t),r(i.isCurrent,!0),f(this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(o).from(i).where(c(r(i.key,t),r(i.isCurrent,!0)))).run()).rows[0];return l?j(l):null}async getOneOutdatedEntity(){const t=this.#t?w(this.#e.client.select(o).from(e`remote.entities`),this.#e.client.select(o).from(i).where(f(this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(e`remote.key = ${i.key}`)))):this.#e.client.select(o).from(i),n=(await this.#e.client.select(o).from(t.as("combined_entities")).where(L(e`combined_entities.scorecards_status = 'OUTDATED'`,e`combined_entities.scorecards_status IS NULL`)).orderBy(e`combined_entities.updated_at ASC`).limit(1).run()).rows[0];return n?j(n):null}async getEntitiesRelations(t={}){const s=this.#t?w(this.#e.client.select(_).from(e`remote.entities_relations`),this.#e.client.select(_).from(a).where(f(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${a.sourceKey}`)))):this.#e.client.select(_).from(a),n=this.#e.client.select(_).from(s.as("combined_entities_relations")).$dynamic(),l=this.#e.client.select(_).from(s.as("combined_entities_relations")).$dynamic(),y=R(l,{...t,limit:void 0,skip:void 0,after:void 0,before:void 0}),u=this.#e.client.$count(y),d=t.limit||10,m=R(n,{...t,limit:d+1}),[E,N]=await Promise.all([m.run(),u]),h=E.rows,T=h.length>d;return{items:h.slice(0,d).map(g=>J(g)).filter(g=>g!==null),hasMore:T,total:N}}async getEntityRelationById(t){const l=(await(this.#t?w(this.#e.client.select(_).from(e`remote.entities_relations`).where(r(a.id,t)),this.#e.client.select(_).from(a).where(c(r(a.id,t),f(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(e`remote.id = ${a.id}`))))):this.#e.client.select(_).from(a).where(r(a.id,t))).run()).rows[0];return l?J(l):null}async getEntitiesWithRelations(t={}){const n=(this.#t?w(this.#e.client.select(o).from(e`remote.entities`).where(r(e.raw("is_current"),1)),this.#e.client.select(o).from(i).where(c(r(i.isCurrent,!0),f(this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(o).from(i).where(r(i.isCurrent,!0))).as("e"),y=(this.#t?w(this.#e.client.select(_).from(e`remote.entities_relations`),this.#e.client.select(_).from(a).where(f(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${a.sourceKey}`)))):this.#e.client.select(_).from(a)).as("combined_relations"),d=(this.#t?w(this.#e.client.select(o).from(e`remote.entities`).where(r(e.raw("is_current"),1)),this.#e.client.select(o).from(i).where(c(r(i.isCurrent,!0),f(this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(o).from(i).where(r(i.isCurrent,!0))).as("combined_target_entities"),m=this.#e.client.with(n,y,d).select({...q("e"),domains:this.#r("e").as("domains"),owners:this.#s("e").as("owners")}).from(n).as("entities_with_relations"),E={...o,domains:m.domains,owners:m.owners},N=this.#e.client.with(m).select(E).from(m).$dynamic(),h=this.#e.client.with(m).select(E).from(m).$dynamic(),{whereCondition:T}=Q(N,t.filter);T&&N.where(T);const{whereCondition:g}=Q(h,t.filter);g&&h.where(g);try{const k=R(h,{...t,limit:void 0,skip:void 0,after:void 0,before:void 0}),I=this.#e.client.$count(k),S=t.limit||10,$=R(N,{...t,limit:S+1}),[D,p]=await Promise.all([$.run(),I]),b=D.rows,F=b.length>S;return{items:b.slice(0,S).map(C=>P(C)).filter(C=>C!==null),hasMore:F,total:p}}catch(k){return x.error("Error getting entities with relations:",k),{items:[],hasMore:!1,total:0}}}#i(t){return z(t)?t.field==="version"||t.field==="revision":Array.isArray(t)?t.some(s=>this.#i(s)):!1}async getEntityWithRelationsByKey(t,s={}){const n=this.#i(s.filter),l=n?[]:[r(i.isCurrent,!0)],y=n?[e`remote.version = ${i.version}`,e`remote.revision = ${i.revision}`]:[e`remote.is_current = 1`],u=this.#e.client.select(o).from(e`remote.entities`),d=n?u.where(r(e.raw("key"),t)):u.where(c(r(e.raw("key"),t),r(e.raw("is_current"),1))),m=this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,...y)),E=this.#e.client.select(o).from(i).where(c(r(i.key,t),...l,f(m))),N=this.#e.client.select(o).from(i),h=n?N.where(r(i.key,t)):N.where(c(r(i.key,t),r(i.isCurrent,!0))),g=(this.#t?w(d,E):h).as("e"),I=(this.#t?w(this.#e.client.select(_).from(e`remote.entities_relations`),this.#e.client.select(_).from(a).where(f(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(e`remote.source_key = ${a.sourceKey}`)))):this.#e.client.select(_).from(a)).as("combined_relations"),S=this.#e.client.select(o).from(e`remote.entities`),$=n?S:S.where(r(e.raw("is_current"),1)),D=this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,...y)),p=this.#e.client.select(o).from(i),b=p.where(c(...l,f(D))),F=n?p:p.where(r(i.isCurrent,!0)),H=(this.#t?w($,b):F).as("combined_target_entities"),v=this.#e.client.with(g,I,H).select({...q("e"),domains:this.#r("e").as("domains"),owners:this.#s("e").as("owners")}).from(g).as("entities_with_relations_by_key"),U={...o,domains:v.domains,owners:v.owners},A=this.#e.client.with(v).select(U).from(v).$dynamic();A.where(r(e.raw("key"),t));const{whereCondition:B}=Q(A,s.filter);B&&A.where(B),A.limit(1);const W=await A.run();if(W.rows.length===0)return null;const O=W.rows[0];return P(O)}async getRelatedEntities(t,s={}){const n=K("","relation_id"),l=V(s.filter,"version"),y=V(s.filter,"revision"),u=[L(r(a.sourceKey,t),r(a.targetKey,t))],d=typeof l=="string"?L(c(r(a.sourceKey,t),r(a.sourceVersion,l)),c(r(a.targetKey,t),r(a.targetVersion,l))):void 0,m=typeof y=="string"?L(c(r(a.sourceKey,t),r(a.sourceRevision,y)),c(r(a.targetKey,t),r(a.targetRevision,y))):void 0,E=[...u,d,m].filter(O=>O!==void 0),h=(this.#t?w(this.#e.client.select(n).from(e`remote.entities_relations`).where(c(...E)),this.#e.client.select(n).from(a).where(c(...E,f(this.#e.client.select({id:_.id}).from(e`remote.entities_relations as remote`).where(c(e`remote.source_key = ${a.sourceKey}`,e`remote.target_key = ${a.targetKey}`,e`remote.source_to_target_relation = ${a.sourceToTargetRelation}`)))))):this.#e.client.select(n).from(a).where(c(...E))).as("combined_relations"),T=q("","entity_id"),k=(this.#t?w(this.#e.client.select(T).from(e`remote.entities`).where(r(e.raw("is_current"),1)),this.#e.client.select(T).from(i).where(c(r(i.isCurrent,!0),f(this.#e.client.select({id:o.id}).from(e`remote.entities as remote`).where(c(e`remote.key = ${i.key}`,e`remote.is_current = 1`)))))):this.#e.client.select(T).from(i).where(r(i.isCurrent,!0))).as("combined_target_entities"),I=te("combined_target_entities"),S=Object.values(ee("combined_target_entities")),$={...I,relation_type:e`
2
2
  CASE
3
3
  WHEN COUNT(CASE WHEN combined_target_entities.key = combined_relations.source_key THEN 1 END) > 0
4
4
  THEN MIN(CASE WHEN combined_target_entities.key = combined_relations.source_key THEN combined_relations.source_to_target_relation END)
@@ -10,7 +10,7 @@ import{and as o,count as Y,eq as r,ne as M,notExists as N,or as B,sql as e}from"
10
10
  THEN 'source'
11
11
  ELSE 'target'
12
12
  END
13
- `.as("relation_role")},$=this.#e.client.with(h,w).select(L).from(h).innerJoin(w,B(r(e.raw("combined_relations.source_key"),e.raw("combined_target_entities.key")),r(e.raw("combined_relations.target_key"),e.raw("combined_target_entities.key")))).where(M(e.raw("combined_target_entities.key"),t)).groupBy(...R).having(M(e.raw("MIN(combined_target_entities.key)"),t)).orderBy(G(e.raw("relation_role"))).$dynamic(),p=this.#e.client.with(h,w).select(I).from(h).innerJoin(w,B(r(e.raw("combined_relations.source_key"),e.raw("combined_target_entities.key")),r(e.raw("combined_relations.target_key"),e.raw("combined_target_entities.key")))).where(M(e.raw("combined_target_entities.key"),t)).groupBy(...R).having(M(e.raw("MIN(combined_target_entities.key)"),t)).$dynamic(),v=S(p,{...s,limit:void 0,skip:void 0,after:void 0,before:void 0}),D=this.#e.client.$count(v),C=s.limit||10,H={...s,limit:C+1},b=S($,H),[U,A]=await Promise.all([b.run(),D]),F=U.rows,W=F.length>C;return{items:F.slice(0,C).map(O=>Z(O)).filter(O=>O!==null),hasMore:W,total:A}}async getCatalogFilters({entitiesTypes:t=[],emptyFilters:s=[]}){if(!s.length)return{};try{return await this.#n(t),(s.includes("domains")||s.includes("owners"))&&await this.#o(),await this.#a(s)}catch(n){return console.error("Error fetching catalog filters:",n),{}}finally{await this.#l()}}async#n(t){if(this.#t?await this.#e.client.run(e`
13
+ `.as("relation_role")},D=this.#e.client.with(h,k).select($).from(h).innerJoin(k,L(r(e.raw("combined_relations.source_key"),e.raw("combined_target_entities.key")),r(e.raw("combined_relations.target_key"),e.raw("combined_target_entities.key")))).where(M(e.raw("combined_target_entities.key"),t)).groupBy(...S).having(M(e.raw("MIN(combined_target_entities.key)"),t)).orderBy(G(e.raw("relation_role"))).$dynamic(),p=this.#e.client.with(h,k).select(I).from(h).innerJoin(k,L(r(e.raw("combined_relations.source_key"),e.raw("combined_target_entities.key")),r(e.raw("combined_relations.target_key"),e.raw("combined_target_entities.key")))).where(M(e.raw("combined_target_entities.key"),t)).groupBy(...S).having(M(e.raw("MIN(combined_target_entities.key)"),t)).$dynamic(),b=R(p,{...s,limit:void 0,skip:void 0,after:void 0,before:void 0}),F=this.#e.client.$count(b),C=s.limit||10,H={...s,limit:C+1},v=R(D,H),[U,A]=await Promise.all([v.run(),F]),B=U.rows,W=B.length>C;return{items:B.slice(0,C).map(O=>Z(O)).filter(O=>O!==null),hasMore:W,total:A}}async getCatalogFilters({entitiesTypes:t=[],emptyFilters:s=[]}){if(!s.length)return{};try{return await this.#n(t),(s.includes("domains")||s.includes("owners"))&&await this.#o(),await this.#c(s)}catch(n){return console.error("Error fetching catalog filters:",n),{}}finally{await this.#l()}}async#n(t){if(this.#t?await this.#e.client.run(e`
14
14
  CREATE TEMP TABLE IF NOT EXISTS temp_combined_entities AS
15
15
  SELECT
16
16
  e.key,
@@ -74,7 +74,7 @@ import{and as o,count as Y,eq as r,ne as M,notExists as N,or as B,sql as e}from"
74
74
  CREATE INDEX IF NOT EXISTS idx_temp_rel_target ON temp_combined_relations(target_key)
75
75
  `),await this.#e.client.run(e`
76
76
  CREATE INDEX IF NOT EXISTS idx_temp_rel_relation ON temp_combined_relations(source_to_target_relation)
77
- `)}async#a(t){const s={},n=[],l=t.filter(d=>d.startsWith("metadata."));t.includes("type")&&n.push(`
77
+ `)}async#c(t){const s={},n=[],l=t.filter(d=>d.startsWith("metadata."));t.includes("type")&&n.push(`
78
78
  SELECT 'type' as filter_name, type as value, COUNT(*) as count
79
79
  FROM temp_filtered_entities
80
80
  WHERE type IS NOT NULL
@@ -121,7 +121,7 @@ import{and as o,count as Y,eq as r,ne as M,notExists as N,or as B,sql as e}from"
121
121
  INNER JOIN temp_combined_entities tce ON tce.key = owner_key
122
122
  WHERE owner_key IS NOT NULL
123
123
  GROUP BY owner_key
124
- `);for(const d of l)await this.#c(d,s);if(n.length===0)return s;const E=n.join(" UNION ALL "),u=await this.#e.client.run(e.raw(E));if(u?.rows)for(const d of u.rows){const m=d.filter_name,y=d.value,f=Number(d.count)||0;s[m]||(s[m]=[]),y&&s[m].push({value:y,count:f})}return s}async#c(t,s){const n=t.substring(9),l=`$.${ie(n)}`,E=await this.#e.client.run(e.raw(`
124
+ `);for(const d of l)await this.#a(d,s);if(n.length===0)return s;const y=n.join(" UNION ALL "),u=await this.#e.client.run(e.raw(y));if(u?.rows)for(const d of u.rows){const m=d.filter_name,E=d.value,N=Number(d.count)||0;s[m]||(s[m]=[]),E&&s[m].push({value:E,count:N})}return s}async#a(t,s){const n=t.substring(9),l=`$.${ie(n)}`,y=await this.#e.client.run(e.raw(`
125
125
  SELECT json_extract(metadata, '${l}') as value, COUNT(*) as count
126
126
  FROM temp_filtered_entities
127
127
  WHERE metadata IS NOT NULL
@@ -129,7 +129,7 @@ import{and as o,count as Y,eq as r,ne as M,notExists as N,or as B,sql as e}from"
129
129
  AND json_extract(metadata, '${l}') IS NOT NULL
130
130
  AND json_extract(metadata, '${l}') != ''
131
131
  GROUP BY value
132
- `));E?.rows&&(s[t]=E.rows.map(u=>({value:u.value,count:Number(u.count)||0})).filter(u=>u.value))}async#l(){try{await this.#e.client.run(e`DROP TABLE IF EXISTS temp_combined_entities`),await this.#e.client.run(e`DROP TABLE IF EXISTS temp_filtered_entities`),await this.#e.client.run(e`DROP TABLE IF EXISTS temp_combined_relations`)}catch(t){X.error("Error cleaning up temp tables:",t)}}#r(t){return e`
132
+ `));y?.rows&&(s[t]=y.rows.map(u=>({value:u.value,count:Number(u.count)||0})).filter(u=>u.value))}async#l(){try{await this.#e.client.run(e`DROP TABLE IF EXISTS temp_combined_entities`),await this.#e.client.run(e`DROP TABLE IF EXISTS temp_filtered_entities`),await this.#e.client.run(e`DROP TABLE IF EXISTS temp_combined_relations`)}catch(t){x.error("Error cleaning up temp tables:",t)}}#r(t){return e`
133
133
  COALESCE(
134
134
  (
135
135
  SELECT json_group_array(
@@ -223,4 +223,4 @@ import{and as o,count as Y,eq as r,ne as M,notExists as N,or as B,sql as e}from"
223
223
  ),
224
224
  json_array()
225
225
  )
226
- `}}function ie(q){return q.replace(/[^a-zA-Z0-9._-]/g,"")}export{we as CatalogEntitiesLocalReadRepository};
226
+ `}}function ie(X){return X.replace(/[^a-zA-Z0-9._-]/g,"")}export{we as CatalogEntitiesLocalReadRepository};
@@ -1,6 +1,7 @@
1
1
  import type { Filter } from '../../../../../providers/database/pagination/types.js';
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
+ import type { ScorecardsStatus } from '../../../../../plugins/catalog-entities/entities/types.js';
4
5
  import type { DatabaseInitializationResult, RepositoryInstanceOptions } from '../../../../../providers/database/types.js';
5
6
  import type { CatalogFiltersParams } from './catalog-entities-local-read-repository.js';
6
7
  import { type CreateEntityParams } from './catalog-entities-local-write-repository.js';
@@ -81,5 +82,8 @@ export declare class CatalogEntitiesLocalRepository extends BaseRepository {
81
82
  deleteEntityRelations(filter: Filter): Promise<boolean>;
82
83
  getCatalogFilters(params: CatalogFiltersParams): Promise<Record<string, import("./catalog-entities-local-read-repository.js").FilterOption[]>>;
83
84
  listEntityRevisions(entityKey: string, version?: string | null): Promise<Pick<import("../../../schemas/read-model-schemas.js").EntityReadModelSchema, "version" | "isDefaultVersion" | "createdAt" | "updatedAt" | "revision" | "isCurrent">[]>;
85
+ updateEntityScorecardsStatus(entityId: string, status: ScorecardsStatus): Promise<boolean>;
86
+ updateEntityScorecardsStatusIfCalculating(entityId: string, status: Extract<ScorecardsStatus, 'UP_TO_DATE' | 'OUTDATED'>): Promise<boolean>;
87
+ getOneOutdatedEntity(): Promise<import("../../../schemas/read-model-schemas.js").EntityReadModelSchema | null>;
84
88
  }
85
89
  //# sourceMappingURL=catalog-entities-local-repository.d.ts.map
@@ -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 h}from"../../../../../providers/database/database-initialization-strategy.js";import{CATALOG_DATABASE_MIGRATIONS_FOLDER as E,CATALOG_LOCAL_DATABASE_FOLDER as c,CATALOG_LOCAL_DATABASE_NAME as d}from"../../consts.js";import{hasOptionsChanged as R}from"../../../utils/has-options-changed.js";const s=50;class i extends l{static#i;static#n;#t;#e;#s={};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.#s}static async getInstance(t){const e=R(i.#n,t);if(!i.#i||e){const a=await new h().initialize({databaseName:d,additionalFolder:c,migrationsFolder:E,...t});i.#i=new i(a),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.#s[t.sourceFile]=t.entity.key),this.#e.createEntity(t)}async createEntities(t){await n(t,s,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,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)}}export{i as CatalogEntitiesLocalRepository};
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,6 +1,7 @@
1
1
  import type { EntityBaseFileSchema } from '@redocly/config';
2
2
  import type { DatabaseClient } from '../../../../../providers/database/client.js';
3
3
  import type { Filter } from '../../../../../providers/database/pagination/types.js';
4
+ import type { ScorecardsStatus } from '../../../../../plugins/catalog-entities/entities/types.js';
4
5
  import { type DatabaseEntityRelation, type DatabaseEntityRelationDto } from '../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js';
5
6
  export type CreateEntityParams = {
6
7
  entity: EntityBaseFileSchema;
@@ -21,5 +22,7 @@ export declare class CatalogEntitiesLocalWriteRepository {
21
22
  deleteEntityRelation(id: string): Promise<string | null>;
22
23
  deleteEntityRelations(filter: Filter): Promise<boolean>;
23
24
  createEntityRelation(entityRelation: DatabaseEntityRelationDto): Promise<DatabaseEntityRelation | null>;
25
+ updateEntityScorecardsStatus(entityId: string, status: ScorecardsStatus): Promise<boolean>;
26
+ updateEntityScorecardsStatusIfCalculating(entityId: string, status: Extract<ScorecardsStatus, 'UP_TO_DATE' | 'OUTDATED'>): Promise<boolean>;
24
27
  }
25
28
  //# sourceMappingURL=catalog-entities-local-write-repository.d.ts.map
@@ -1 +1 @@
1
- import{and as d,desc as K,eq as a,isNull as g,or as V,sql as D}from"drizzle-orm";import{logger as h}from"../../../../../tools/notifiers/logger.js";import{promiseMapLimit as p}from"../../../../../utils/async/promise-map-limit.js";import{sha1 as B}from"../../../../../utils/crypto/sha1.js";import{createEntityDbRecord as N}from"../../mappers/create-entity-db-record.js";import{createEntityRelationDbRecordFromFileSchema as T}from"../../mappers/create-entity-relation-db-record-from-file-schema.js";import{entitiesTable as e}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as s}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{convertFilterToWhereCondition as C}from"../../../../../providers/database/pagination/filter.js";import{compareVersionsDescending as F}from"../../../utils/version-compare.js";const E=15;class q{#e;#t;#r;constructor(t,r,n){this.#e=t,this.#t=r,this.#r=n}async createEntity({entity:t,fileHash:r,sourceFile:n}){try{const{relations:o=[],...i}=t,u=B(JSON.stringify(i));if(await this.#i(u))return;const l=t.version??null,{shouldBeCurrent:f,shouldBeDefaultVersion:v}=await this.#o(t.key,l),m=new Date().toISOString(),w=N({entity:{...t,revision:m,hash:u,isCurrent:f,isDefaultVersion:v},sourceFile:n,organizationId:this.#t,projectId:this.#r,source:"file",fileHash:r}),{key:R,source:S,...k}=w;await this.#a({key:R,isCurrent:f,isDefaultVersion:v});const A=this.#e.client.insert(e).values(w).onConflictDoUpdate({target:[e.key,e.source,e.revision,e.version],set:k}),I=o?.length&&o.length>0?this.#e.client.insert(s).values(o.map(y=>T({relation:y,sourceFile:n,fileHash:r,sourceKey:t.key,sourceVersion:l,sourceRevision:m,organizationId:this.#t,projectId:this.#r}))).onConflictDoNothing({target:[s.sourceKey,s.targetKey,s.sourceVersion,s.targetVersion,s.sourceRevision,s.targetRevision]}).run():Promise.resolve();await p([A,I],E,async y=>y)}catch(o){console.error(o),h.error("Error adding entity",o)}}async deleteEntity(t){try{return await this.#e.client.delete(e).where(a(e.key,t)),t}catch(r){return h.error("Error deleting entity",r),null}}async deleteEntities(t){try{const r=C(t);if(!r)return!1;const n=await this.#e.client.delete(e).where(r).returning({key:e.key,source:e.source,isCurrent:e.isCurrent,isDefaultVersion:e.isDefaultVersion,version:e.version});if(n.length===0)return!0;const o=n.reduce((i,u)=>((u.isCurrent||u.isDefaultVersion)&&i.add(u.key),i),new Set);if(o.size===0)return!0;await p(Array.from(o),E,async i=>this.#u(i));for(const i of n)await this.#e.client.delete(s).where(V(d(a(s.sourceKey,i.key),...i.version?[a(s.sourceVersion,i.version)]:[g(s.sourceVersion)]),d(a(s.targetKey,i.key),...i.version?[a(s.targetVersion,i.version)]:[g(s.targetVersion)])));return!0}catch(r){return h.error("Error deleting entities",r),!1}}async deleteEntityRelation(t){try{return await this.#e.client.delete(s).where(a(s.id,t)),t}catch{return null}}async deleteEntityRelations(t){try{const r=C(t);return r?(await this.#e.client.delete(s).where(r),!0):!1}catch(r){return h.error("Error deleting entity relations",r),!1}}async createEntityRelation(t){if(!t)return null;try{const{sourceKey:r,targetKey:n,sourceVersion:o,targetVersion:i,sourceRevision:u,targetRevision:c,...l}=t,f=await this.#e.client.insert(s).values(t).onConflictDoUpdate({target:[s.sourceKey,s.targetKey,s.sourceVersion,s.targetVersion,s.sourceRevision,s.targetRevision],set:l}).returning();return f?.length?f[0]:null}catch(r){return h.error("Error creating entity relation",r),null}}async#i(t){const r=await this.#e.client.select({id:e.id,revision:e.revision}).from(e).where(d(a(e.hash,t),a(e.isCurrent,!0))).limit(1).run();return r.rows.length===0?null:{id:r.rows[0].id,revision:r.rows[0].revision}}async#n(t){return(await this.#e.client.select({version:e.version,isDefaultVersion:e.isDefaultVersion,revision:e.revision,createdAt:e.createdAt}).from(e).where(d(a(e.key,t),a(e.source,"file"))).orderBy(K(e.createdAt)).run()).rows.map(n=>({version:n.version,isDefaultVersion:!!n.isDefaultVersion,revision:n.revision,createdAt:new Date(n.createdAt)}))}#s(t){const r=t.find(i=>i.isDefaultVersion);if(r)return r;const n=t.filter(i=>i.version!==null),o=t.filter(i=>i.version===null);if(n.length>0){n.sort((c,l)=>F(c.version,l.version));const i=n[0].version,u=n.filter(c=>c.version===i);return u.sort((c,l)=>l.createdAt.getTime()-c.createdAt.getTime()),u[0]}return o.length>0?(o.sort((i,u)=>u.createdAt.getTime()-i.createdAt.getTime()),o[0]):null}async#o(t,r){const n=await this.#e.client.select({currentDefaultVersion:D`max(case when ${e.isDefaultVersion} = 1 then ${e.version} else null end)`,versionMatchCount:D`count(case when ${e.version} = ${r} then 1 else null end)`}).from(e).where(d(a(e.key,t),a(e.source,"file"))).get(),o=n?.currentDefaultVersion,i=(n?.versionMatchCount??0)>0;return r&&r===o?{shouldBeCurrent:!0,shouldBeDefaultVersion:!1}:{shouldBeCurrent:!i,shouldBeDefaultVersion:!i}}async#a({key:t,isCurrent:r,isDefaultVersion:n}){if(!r&&!n)return;const o={},i=[];r&&(o.isCurrent=!1,i.push(a(e.isCurrent,!0))),n&&(o.isDefaultVersion=!1,i.push(a(e.isDefaultVersion,!0))),await this.#e.client.update(e).set(o).where(d(a(e.key,t),a(e.source,"file"),V(...i))).run()}#u=async t=>{const r=await this.#n(t),n=this.#s(r);if(!n){h.warn("No latest version found for key",t);return}await this.#e.client.update(e).set({isDefaultVersion:!0,isCurrent:!0}).where(d(a(e.key,t),a(e.revision,n.revision),n.version?a(e.version,n.version):g(e.version))).run()}}export{q as CatalogEntitiesLocalWriteRepository};
1
+ import{and as h,desc as I,eq as a,isNull as g,or as V,sql as v}from"drizzle-orm";import{logger as l}from"../../../../../tools/notifiers/logger.js";import{promiseMapLimit as D}from"../../../../../utils/async/promise-map-limit.js";import{sha1 as K}from"../../../../../utils/crypto/sha1.js";import{createEntityDbRecord as N}from"../../mappers/create-entity-db-record.js";import{createEntityRelationDbRecordFromFileSchema as B}from"../../mappers/create-entity-relation-db-record-from-file-schema.js";import{entitiesTable as e}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-table.js";import{entitiesRelationsTable as s}from"../../../../../providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js";import{convertFilterToWhereCondition as C}from"../../../../../providers/database/pagination/filter.js";import{compareVersionsDescending as T}from"../../../utils/version-compare.js";const E=15;class q{#e;#t;#r;constructor(t,r,i){this.#e=t,this.#t=r,this.#r=i}async createEntity({entity:t,fileHash:r,sourceFile:i}){try{const{relations:o=[],...n}=t,u=K(JSON.stringify(n));if(await this.#i(u))return;const c=t.version??null,{shouldBeCurrent:f,shouldBeDefaultVersion:m}=await this.#o(t.key,c),w=new Date().toISOString(),p=N({entity:{...t,revision:w,hash:u,isCurrent:f,isDefaultVersion:m},sourceFile:i,organizationId:this.#t,projectId:this.#r,source:"file",fileHash:r}),{key:A,source:O,...R}=p;await this.#a({key:A,isCurrent:f,isDefaultVersion:m});const S=this.#e.client.insert(e).values(p).onConflictDoUpdate({target:[e.key,e.source,e.revision,e.version],set:R}),k=o?.length&&o.length>0?this.#e.client.insert(s).values(o.map(y=>B({relation:y,sourceFile:i,fileHash:r,sourceKey:t.key,sourceVersion:c,sourceRevision:w,organizationId:this.#t,projectId:this.#r}))).onConflictDoNothing({target:[s.sourceKey,s.targetKey,s.sourceVersion,s.targetVersion,s.sourceRevision,s.targetRevision]}).run():Promise.resolve();await D([S,k],E,async y=>y)}catch(o){console.error(o),l.error("Error adding entity",o)}}async deleteEntity(t){try{return await this.#e.client.delete(e).where(a(e.key,t)),t}catch(r){return l.error("Error deleting entity",r),null}}async deleteEntities(t){try{const r=C(t);if(!r)return!1;const i=await this.#e.client.delete(e).where(r).returning({key:e.key,source:e.source,isCurrent:e.isCurrent,isDefaultVersion:e.isDefaultVersion,version:e.version});if(i.length===0)return!0;const o=i.reduce((n,u)=>((u.isCurrent||u.isDefaultVersion)&&n.add(u.key),n),new Set);if(o.size===0)return!0;await D(Array.from(o),E,async n=>this.#u(n));for(const n of i)await this.#e.client.delete(s).where(V(h(a(s.sourceKey,n.key),...n.version?[a(s.sourceVersion,n.version)]:[g(s.sourceVersion)]),h(a(s.targetKey,n.key),...n.version?[a(s.targetVersion,n.version)]:[g(s.targetVersion)])));return!0}catch(r){return l.error("Error deleting entities",r),!1}}async deleteEntityRelation(t){try{return await this.#e.client.delete(s).where(a(s.id,t)),t}catch{return null}}async deleteEntityRelations(t){try{const r=C(t);return r?(await this.#e.client.delete(s).where(r),!0):!1}catch(r){return l.error("Error deleting entity relations",r),!1}}async createEntityRelation(t){if(!t)return null;try{const{sourceKey:r,targetKey:i,sourceVersion:o,targetVersion:n,sourceRevision:u,targetRevision:d,...c}=t,f=await this.#e.client.insert(s).values(t).onConflictDoUpdate({target:[s.sourceKey,s.targetKey,s.sourceVersion,s.targetVersion,s.sourceRevision,s.targetRevision],set:c}).returning();return f?.length?f[0]:null}catch(r){return l.error("Error creating entity relation",r),null}}async#i(t){const r=await this.#e.client.select({id:e.id,revision:e.revision}).from(e).where(h(a(e.hash,t),a(e.isCurrent,!0))).limit(1).run();return r.rows.length===0?null:{id:r.rows[0].id,revision:r.rows[0].revision}}async#n(t){return(await this.#e.client.select({version:e.version,isDefaultVersion:e.isDefaultVersion,revision:e.revision,createdAt:e.createdAt}).from(e).where(h(a(e.key,t),a(e.source,"file"))).orderBy(I(e.createdAt)).run()).rows.map(i=>({version:i.version,isDefaultVersion:!!i.isDefaultVersion,revision:i.revision,createdAt:new Date(i.createdAt)}))}#s(t){const r=t.find(n=>n.isDefaultVersion);if(r)return r;const i=t.filter(n=>n.version!==null),o=t.filter(n=>n.version===null);if(i.length>0){i.sort((d,c)=>T(d.version,c.version));const n=i[0].version,u=i.filter(d=>d.version===n);return u.sort((d,c)=>c.createdAt.getTime()-d.createdAt.getTime()),u[0]}return o.length>0?(o.sort((n,u)=>u.createdAt.getTime()-n.createdAt.getTime()),o[0]):null}async#o(t,r){const i=await this.#e.client.select({currentDefaultVersion:v`max(case when ${e.isDefaultVersion} = 1 then ${e.version} else null end)`,versionMatchCount:v`count(case when ${e.version} = ${r} then 1 else null end)`}).from(e).where(h(a(e.key,t),a(e.source,"file"))).get(),o=i?.currentDefaultVersion,n=(i?.versionMatchCount??0)>0;return r&&r===o?{shouldBeCurrent:!0,shouldBeDefaultVersion:!1}:{shouldBeCurrent:!n,shouldBeDefaultVersion:!n}}async#a({key:t,isCurrent:r,isDefaultVersion:i}){if(!r&&!i)return;const o={},n=[];r&&(o.isCurrent=!1,n.push(a(e.isCurrent,!0))),i&&(o.isDefaultVersion=!1,n.push(a(e.isDefaultVersion,!0))),await this.#e.client.update(e).set(o).where(h(a(e.key,t),a(e.source,"file"),V(...n))).run()}#u=async t=>{const r=await this.#n(t),i=this.#s(r);if(!i){l.warn("No latest version found for key",t);return}await this.#e.client.update(e).set({isDefaultVersion:!0,isCurrent:!0}).where(h(a(e.key,t),a(e.revision,i.revision),i.version?a(e.version,i.version):g(e.version))).run()};async updateEntityScorecardsStatus(t,r){try{return(await this.#e.client.update(e).set({scorecardsStatus:r}).where(a(e.id,t)).returning()).length>0}catch(i){return l.error("Error updating entity scorecards status",i),!1}}async updateEntityScorecardsStatusIfCalculating(t,r){try{return(await this.#e.client.update(e).set({scorecardsStatus:r}).where(v`${e.id} = ${t} AND ${e.scorecardsStatus} = 'CALCULATING'`).returning()).length>0}catch(i){return l.error("Error updating entity scorecards status if calculating",i),!1}}}export{q as CatalogEntitiesLocalWriteRepository};
@@ -1 +1 @@
1
- import{eq as _}from"drizzle-orm";import{convertFilterToWhereCondition as p}from"../../../../../providers/database/pagination/filter.js";import{promiseMapLimit as g}from"../../../../../utils/async/promise-map-limit.js";import{logger as n}from"../../../../../tools/notifiers/logger.js";import{SQLD_REMOTE_DATABASE_FOLDER as f,SQLD_REMOTE_DATABASE_MIGRATIONS_FOLDER as A,SQLD_REMOTE_DATABASE_NAME as T}from"../../../../../constants/sqld-remote-database.js";import{telemetryTraceStep as i}from"../../../../../telemetry/helpers/trace-step.js";import{createEntityDbRecord as E}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 D}from"../../../../../providers/database/base-repository.js";import{DatabaseConnectionsManager as b}from"../../../../../providers/database/database-connections-manager.js";import{RemoteDatabaseInitializationStrategy as R}from"../../../../../providers/database/database-initialization-strategy.js";const S=15;class s extends D{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 b.getConnection({config:{...t,databaseName:T,additionalFolder:f,migrationsFolder:A,syncUrl:process.env.SQLD_REMOTE_DATABASE_URL,authToken:process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN},strategy:new R});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=E({entity:t,organizationId:this.organizationId,projectId:this.projectId,source:"remote",sourceFile:null,fileHash:null}),{key:o,source:u,...l}=e,c=await this.databaseClient.client.insert(r).values(e).onConflictDoUpdate({target:[r.key,r.source,r.revision,r.version],set:l}).returning();return c.length?(t.relations&&await this.createEntityRelations(t.relations.map(d=>({...d,sourceKey:t.key,targetKey:d.key}))),m(c[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=E({entity:t,organizationId:this.organizationId,projectId:this.projectId,source:"remote",sourceFile:null,fileHash:null}),{key:o,source:u,...l}=e,c=await this.databaseClient.client.insert(r).values(e).onConflictDoUpdate({target:[r.key,r.source,r.revision,r.version],set:l}).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(_(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 g(t,S,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:l,targetVersion:c,sourceRevision:d,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(_(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=p(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 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};
@@ -20,6 +20,7 @@ export declare const createEntityFieldsForSelect: (tableAlias?: string, idAlias?
20
20
  revision: import("drizzle-orm").SQL<unknown>;
21
21
  hash: import("drizzle-orm").SQL<unknown>;
22
22
  isCurrent: import("drizzle-orm").SQL<unknown>;
23
+ scorecardsStatus: import("drizzle-orm").SQL<unknown>;
23
24
  };
24
25
  export declare const createEntityRelationFieldsForSelect: (tableAlias?: string, idAlias?: string) => {
25
26
  id: import("drizzle-orm").SQL<unknown> | import("drizzle-orm").SQL.Aliased<unknown>;
@@ -107,6 +108,7 @@ export declare const FIELDS_TO_SELECT_FOR_ENTITY: {
107
108
  revision: import("drizzle-orm").SQL<unknown>;
108
109
  hash: import("drizzle-orm").SQL<unknown>;
109
110
  isCurrent: import("drizzle-orm").SQL<unknown>;
111
+ scorecardsStatus: import("drizzle-orm").SQL<unknown>;
110
112
  };
111
113
  export declare const FIELDS_TO_SELECT_FOR_ENTITY_RELATION: {
112
114
  id: import("drizzle-orm").SQL<unknown> | import("drizzle-orm").SQL.Aliased<unknown>;
@@ -1 +1 @@
1
- import{sql as a}from"drizzle-orm";const i=(e="",r)=>{const t=e?`${e}.`:"";return{id:r?a.raw(t+"id").as(r):a.raw(t+"id"),organizationId:a.raw(t+"organization_id"),projectId:a.raw(t+"project_id"),key:a.raw(t+"key"),type:a.raw(t+"type"),title:a.raw(t+"title"),summary:a.raw(t+"summary"),tags:a.raw(t+"tags"),metadata:a.raw(t+"metadata"),git:a.raw(t+"git"),contact:a.raw(t+"contact"),links:a.raw(t+"links"),createdAt:a.raw(t+"created_at"),updatedAt:a.raw(t+"updated_at"),source:a.raw(t+"source"),sourceFile:a.raw(t+"source_file"),fileHash:a.raw(t+"file_hash"),version:a.raw(t+"version"),revision:a.raw(t+"revision"),hash:a.raw(t+"hash"),isCurrent:a.raw(t+"is_current")}},s=(e="",r)=>{const t=e?`${e}.`:"";return{id:r?a.raw(t+"id").as(r):a.raw(t+"id"),organizationId:a.raw(t+"organization_id"),projectId:a.raw(t+"project_id"),sourceKey:a.raw(t+"source_key"),sourceId:a.raw(t+"source_id"),sourceVersion:a.raw(t+"source_version"),sourceRevision:a.raw(t+"source_revision"),sourceToTargetRelation:a.raw(t+"source_to_target_relation"),targetKey:a.raw(t+"target_key"),targetId:a.raw(t+"target_id"),targetVersion:a.raw(t+"target_version"),targetRevision:a.raw(t+"target_revision"),targetToSourceRelation:a.raw(t+"target_to_source_relation"),fileHash:a.raw(t+"file_hash"),createdAt:a.raw(t+"created_at"),updatedAt:a.raw(t+"updated_at")}},n=(e="")=>{const r=e?`${e}.`:"";return{id:a.raw(r+"entity_id"),organizationId:a.raw(r+"organization_id"),projectId:a.raw(r+"project_id"),key:a.raw(r+"key"),type:a.raw(r+"type"),title:a.raw(r+"title"),summary:a.raw(r+"summary"),tags:a.raw(r+"tags"),metadata:a.raw(r+"metadata"),git:a.raw(r+"git"),contact:a.raw(r+"contact"),links:a.raw(r+"links"),createdAt:a.raw(r+"created_at"),updatedAt:a.raw(r+"updated_at"),source:a.raw(r+"source"),sourceFile:a.raw(r+"source_file"),fileHash:a.raw(r+"file_hash"),version:a.raw(r+"version"),revision:a.raw(r+"revision"),hash:a.raw(r+"hash"),isCurrent:a.raw(r+"is_current")}},w=(e="")=>{const r=e?`${e}.`:"";return{id:a.raw(r+"entity_id").as("id"),organizationId:a.raw(r+"organization_id").as("organization_id"),projectId:a.raw(r+"project_id").as("project_id"),key:a.raw(r+"key").as("key"),type:a.raw(r+"type").as("type"),title:a.raw(r+"title").as("title"),summary:a.raw(r+"summary").as("summary"),tags:a.raw(r+"tags").as("tags"),metadata:a.raw(r+"metadata").as("metadata"),git:a.raw(r+"git").as("git"),contact:a.raw(r+"contact").as("contact"),links:a.raw(r+"links").as("links"),createdAt:a.raw(r+"created_at").as("created_at"),updatedAt:a.raw(r+"updated_at").as("updated_at"),source:a.raw(r+"source").as("source"),sourceFile:a.raw(r+"source_file").as("source_file"),fileHash:a.raw(r+"file_hash").as("file_hash"),version:a.raw(r+"version").as("version"),revision:a.raw(r+"revision").as("revision"),hash:a.raw(r+"hash").as("hash"),isCurrent:a.raw(r+"is_current").as("is_current")}},c=i(),d=s();export{c as FIELDS_TO_SELECT_FOR_ENTITY,d as FIELDS_TO_SELECT_FOR_ENTITY_RELATION,i as createEntityFieldsForSelect,s as createEntityRelationFieldsForSelect,n as createQualifiedEntityFieldsForSelect,w as createQualifiedEntityFieldsForSelectWithAliases};
1
+ import{sql as a}from"drizzle-orm";const i=(e="",r)=>{const t=e?`${e}.`:"";return{id:r?a.raw(t+"id").as(r):a.raw(t+"id"),organizationId:a.raw(t+"organization_id"),projectId:a.raw(t+"project_id"),key:a.raw(t+"key"),type:a.raw(t+"type"),title:a.raw(t+"title"),summary:a.raw(t+"summary"),tags:a.raw(t+"tags"),metadata:a.raw(t+"metadata"),git:a.raw(t+"git"),contact:a.raw(t+"contact"),links:a.raw(t+"links"),createdAt:a.raw(t+"created_at"),updatedAt:a.raw(t+"updated_at"),source:a.raw(t+"source"),sourceFile:a.raw(t+"source_file"),fileHash:a.raw(t+"file_hash"),version:a.raw(t+"version"),revision:a.raw(t+"revision"),hash:a.raw(t+"hash"),isCurrent:a.raw(t+"is_current"),scorecardsStatus:a.raw(t+"scorecards_status")}},s=(e="",r)=>{const t=e?`${e}.`:"";return{id:r?a.raw(t+"id").as(r):a.raw(t+"id"),organizationId:a.raw(t+"organization_id"),projectId:a.raw(t+"project_id"),sourceKey:a.raw(t+"source_key"),sourceId:a.raw(t+"source_id"),sourceVersion:a.raw(t+"source_version"),sourceRevision:a.raw(t+"source_revision"),sourceToTargetRelation:a.raw(t+"source_to_target_relation"),targetKey:a.raw(t+"target_key"),targetId:a.raw(t+"target_id"),targetVersion:a.raw(t+"target_version"),targetRevision:a.raw(t+"target_revision"),targetToSourceRelation:a.raw(t+"target_to_source_relation"),fileHash:a.raw(t+"file_hash"),createdAt:a.raw(t+"created_at"),updatedAt:a.raw(t+"updated_at")}},n=(e="")=>{const r=e?`${e}.`:"";return{id:a.raw(r+"entity_id"),organizationId:a.raw(r+"organization_id"),projectId:a.raw(r+"project_id"),key:a.raw(r+"key"),type:a.raw(r+"type"),title:a.raw(r+"title"),summary:a.raw(r+"summary"),tags:a.raw(r+"tags"),metadata:a.raw(r+"metadata"),git:a.raw(r+"git"),contact:a.raw(r+"contact"),links:a.raw(r+"links"),createdAt:a.raw(r+"created_at"),updatedAt:a.raw(r+"updated_at"),source:a.raw(r+"source"),sourceFile:a.raw(r+"source_file"),fileHash:a.raw(r+"file_hash"),version:a.raw(r+"version"),revision:a.raw(r+"revision"),hash:a.raw(r+"hash"),isCurrent:a.raw(r+"is_current")}},c=(e="")=>{const r=e?`${e}.`:"";return{id:a.raw(r+"entity_id").as("id"),organizationId:a.raw(r+"organization_id").as("organization_id"),projectId:a.raw(r+"project_id").as("project_id"),key:a.raw(r+"key").as("key"),type:a.raw(r+"type").as("type"),title:a.raw(r+"title").as("title"),summary:a.raw(r+"summary").as("summary"),tags:a.raw(r+"tags").as("tags"),metadata:a.raw(r+"metadata").as("metadata"),git:a.raw(r+"git").as("git"),contact:a.raw(r+"contact").as("contact"),links:a.raw(r+"links").as("links"),createdAt:a.raw(r+"created_at").as("created_at"),updatedAt:a.raw(r+"updated_at").as("updated_at"),source:a.raw(r+"source").as("source"),sourceFile:a.raw(r+"source_file").as("source_file"),fileHash:a.raw(r+"file_hash").as("file_hash"),version:a.raw(r+"version").as("version"),revision:a.raw(r+"revision").as("revision"),hash:a.raw(r+"hash").as("hash"),isCurrent:a.raw(r+"is_current").as("is_current")}},w=i(),d=s();export{w as FIELDS_TO_SELECT_FOR_ENTITY,d as FIELDS_TO_SELECT_FOR_ENTITY_RELATION,i as createEntityFieldsForSelect,s as createEntityRelationFieldsForSelect,n as createQualifiedEntityFieldsForSelect,c as createQualifiedEntityFieldsForSelectWithAliases};
@@ -2,4 +2,5 @@ export type EntitiesFileSchema = {
2
2
  path: string;
3
3
  entities: unknown[];
4
4
  };
5
+ export type ScorecardsStatus = 'UP_TO_DATE' | 'CANCELLED' | 'OUTDATED' | 'CALCULATING';
5
6
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- import{REDOCLY_TEAMS_RBAC as c}from"@redocly/config";import{DEFAULT_SSO_IDP_TITLE as b,DEV_LOGIN_SLUG as g,INVITE_SLUG as h,PUBLIC_RBAC_SCOPE_ITEM as f,UI_ACCESSIBLE_CONFIG_PROPS as D,CONFIG_FILE_NAME as p}from"../../../constants/common.js";import{isDevelopMode as P}from"../../utils/envs/is-develop-mode.js";import{getTemplatePath as s}from"./get-template-path.js";import{resolveLinksFromConfig as n}from"../nav-utils.js";import{resolveLogoConfig as _}from"./resolve-logo.js";import{extractTeamNames as E}from"./extract-team-names.js";import{resolveProductsConfig as F}from"./resolve-products-config.js";import{getExcludedFromLinkCheckerPatterns as y}from"../sidebars/utils.js";import{resolveEntitiesCatalogConfig as O}from"./resolve-catalog-entities.js";import{telemetryTraceStep as A}from"../../../cli/telemetry/helpers/trace-step.js";async function q(i){return{id:"Default Theme",async processContent(e){await A("build.plugin.default_theme",async()=>{const t=v(e),a=Object.keys(e.getConfig()?.ssoDirect||{}).length>0,o=e.createTemplate("invite",s("../../../../dist/client/app/pages/Invite/Invite.js"));if(e.addRoute({duplicateInAllLocales:!0,excludeFromSidebar:!0,slug:h,[c]:f,fsPath:h,templateId:o}),i.devLogin&&a){let r={frontmatter:{},seo:{title:"Login page"},authIdps:t.filter(m=>m.title!=b),rbac:{teams:E(e.getConfig().rbac)}};const l=e.createTemplate("dev-login",s("../../../../dist/client/app/pages/DevLogin/DevLogin.js"));e.addRoute({duplicateInAllLocales:!0,excludeFromSidebar:!0,slug:g,[c]:f,fsPath:g,templateId:l,getStaticData:async()=>({props:r})})}else if(t.length>1){let r={frontmatter:{},seo:{title:"Login page"},authIdps:t};const l=e.createTemplate("login",s("../../../../dist/client/app/pages/Login/Login.js"));e.addRoute({duplicateInAllLocales:!0,excludeFromSidebar:!0,slug:g,[c]:f,fsPath:g,templateId:l,getStaticData:async()=>({props:r})})}e.createTemplate("404",s("../../../../dist/client/app/pages/404/404.js")),e.createTemplate("403",s("../../../../dist/client/app/pages/403/403.js")),e.createTemplate("403OIDC",s("../../../../dist/client/app/pages/403/403OIDC.js")),P()&&e.createTemplate("compilation-error",s("../../../../dist/client/app/pages/CompilationError/CompilationError.js"))})},async afterRoutesCreated(e,t){const{contentDir:a,outdir:o}=e,r=e.getConfig(),{navbar:l,footer:m,userMenu:u,search:I,breadcrumbs:C,products:S}=r,L=Object.keys(r?.ssoDirect||{}).length>0,d=y(r),T={navFile:p,excludedFromLinkCheckerPatterns:d};e.setGlobalData({...j(r),navbar:await n(l,a,e,t,T),footer:await n(m,a,e,t,T),breadcrumbs:{...C,prefixItems:await n(C?.prefixItems||[],a,e,t,{navFile:p,excludedFromLinkCheckerPatterns:d})},userMenu:{...u,hide:u?.hide??!L,menu:await n(u?.items,a,e,t,{navFile:p,excludedFromLinkCheckerPatterns:d})},logo:await _(r.logo,p,o,t.fs),auth:{idpsInfo:v(e),devLogin:i.devLogin&&L},products:await F(S,e,t),search:{...I,suggestedPages:await n(I?.suggestedPages,a,e,t,{navFile:p,excludedFromLinkCheckerPatterns:d})},entitiesCatalog:await O(r.entitiesCatalog,p,o,t.fs),headScriptTags:void 0,linkTags:void 0,postBodyScriptTags:void 0,preBodyScriptTags:void 0})}}}function v(i){const e=i.getConfig().ssoDirect;return Object.entries(e||{}).map(([a,o])=>({idpId:a,type:o.type,title:o.title}))}function j(i){const e={};for(const t of D)i[t]&&(e[t]=i[t]);return e}export{q as defaultThemePlugin,j as pickUiAccessibleConfig};
1
+ import{REDOCLY_TEAMS_RBAC as c}from"@redocly/config";import{DEFAULT_SSO_IDP_TITLE as b,DEV_LOGIN_SLUG as g,INVITE_SLUG as T,PUBLIC_RBAC_SCOPE_ITEM as f,UI_ACCESSIBLE_CONFIG_PROPS as D,CONFIG_FILE_NAME as l}from"../../../constants/common.js";import{isDevelopMode as P}from"../../utils/envs/is-develop-mode.js";import{getTemplatePath as s}from"./get-template-path.js";import{resolveLinksFromConfig as n}from"../nav-utils.js";import{resolveLogoConfig as F}from"./resolve-logo.js";import{extractTeamNames as _}from"./extract-team-names.js";import{resolveProductsConfig as E}from"./resolve-products-config.js";import{getExcludedFromLinkCheckerPatterns as y}from"../sidebars/utils.js";import{resolveEntitiesCatalogConfig as O}from"./resolve-catalog-entities.js";import{telemetryTraceStep as A}from"../../../cli/telemetry/helpers/trace-step.js";async function q(i){return{id:"Default Theme",async processContent(e){await A("build.plugin.default_theme",async()=>{const t=v(e),a=Object.keys(e.getConfig()?.ssoDirect||{}).length>0,o=e.createTemplate("invite",s("../../../../dist/client/app/pages/Invite/Invite.js"));if(e.addRoute({duplicateInAllLocales:!0,excludeFromSidebar:!0,excludeFromSearch:!0,slug:T,[c]:f,fsPath:T,templateId:o}),i.devLogin&&a){let r={frontmatter:{},seo:{title:"Login page"},authIdps:t.filter(u=>u.title!=b),rbac:{teams:_(e.getConfig().rbac)}};const p=e.createTemplate("dev-login",s("../../../../dist/client/app/pages/DevLogin/DevLogin.js"));e.addRoute({duplicateInAllLocales:!0,excludeFromSidebar:!0,excludeFromSearch:!0,slug:g,[c]:f,fsPath:g,templateId:p,getStaticData:async()=>({props:r})})}else if(t.length>1){let r={frontmatter:{},seo:{title:"Login page"},authIdps:t};const p=e.createTemplate("login",s("../../../../dist/client/app/pages/Login/Login.js"));e.addRoute({duplicateInAllLocales:!0,excludeFromSidebar:!0,slug:g,[c]:f,fsPath:g,templateId:p,getStaticData:async()=>({props:r})})}e.createTemplate("404",s("../../../../dist/client/app/pages/404/404.js")),e.createTemplate("403",s("../../../../dist/client/app/pages/403/403.js")),e.createTemplate("403OIDC",s("../../../../dist/client/app/pages/403/403OIDC.js")),P()&&e.createTemplate("compilation-error",s("../../../../dist/client/app/pages/CompilationError/CompilationError.js"))})},async afterRoutesCreated(e,t){const{contentDir:a,outdir:o}=e,r=e.getConfig(),{navbar:p,footer:u,userMenu:m,search:I,breadcrumbs:C,products:S}=r,L=Object.keys(r?.ssoDirect||{}).length>0,d=y(r),h={navFile:l,excludedFromLinkCheckerPatterns:d};e.setGlobalData({...j(r),navbar:await n(p,a,e,t,h),footer:await n(u,a,e,t,h),breadcrumbs:{...C,prefixItems:await n(C?.prefixItems||[],a,e,t,{navFile:l,excludedFromLinkCheckerPatterns:d})},userMenu:{...m,hide:m?.hide??!L,menu:await n(m?.items,a,e,t,{navFile:l,excludedFromLinkCheckerPatterns:d})},logo:await F(r.logo,l,o,t.fs),auth:{idpsInfo:v(e),devLogin:i.devLogin&&L},products:await E(S,e,t),search:{...I,suggestedPages:await n(I?.suggestedPages,a,e,t,{navFile:l,excludedFromLinkCheckerPatterns:d})},entitiesCatalog:await O(r.entitiesCatalog,l,o,t.fs),headScriptTags:void 0,linkTags:void 0,postBodyScriptTags:void 0,preBodyScriptTags:void 0})}}}function v(i){const e=i.getConfig().ssoDirect;return Object.entries(e||{}).map(([a,o])=>({idpId:a,type:o.type,title:o.title}))}function j(i){const e={};for(const t of D)i[t]&&(e[t]=i[t]);return e}export{q as defaultThemePlugin,j as pickUiAccessibleConfig};
@@ -1 +1 @@
1
- import u from"path";import{REDOCLY_TEAMS_RBAC as D}from"@redocly/config";import{MARKDOC_PARTIALS_DATA_KEY as R}from"../../store.js";import{reporter as b}from"../../tools/notifiers/reporter.js";import{extractMdFirstHeading as F,getAst as A}from"./compiler.js";import{getTemplatePath as w}from"./get-template-path.js";import{prepareMarkdocPartials as C}from"./markdoc/partials.js";import{searchResolver as M}from"./search/search-resolver.js";import{markdownStaticDataLoader as T}from"./markdown-static-data-loader.js";import{makeErrorRoute as E}from"../error-route.js";import{validateRbacConfig as I}from"../validate-rbac-config.js";import{findFrontmatterSlugs as O,getSidebarSharedDataId as _,resolveFrontmatterSlugs as G}from"../utils.js";import{isPartial as L}from"./is-partial.js";import{markdownFrontmatterLoader as j}from"./markdown-frontmatter-loader.js";import{resolveRawPartials as z}from"./markdoc/resolve-raw-partials.js";import{getAiDocumentsStore as B}from"./search/get-ai-search-documents.js";import{registerPageProps as K}from"../register-page-props.js";import{sanitizeMalformedMdContent as N}from"./utils/sanitize-malformed-md-content.js";import{telemetryTraceStep as W}from"../../../cli/telemetry/helpers/trace-step.js";async function nt(h){return{id:"markdoc",requiredEntitlements:["markdown"],loaders:{"markdown-frontmatter":j,"markdown-ast":async(e,r)=>{const i=await r.fs.read(e),n=await r.getConfig(),d=await z(i,e,n?.markdown?.partialsFolders,r),l=N(d);return A(e,l)}},processContent:async(e,r)=>{await W("build.plugin.markdown",async i=>{const{markdown:n}=await r.getConfig();i?.setAttribute("config",JSON.stringify(n||{}));const d=n?.partialsFolders??[],l=e.createTemplate("markdown","@redocly/theme/core/templates/Markdown"),k=e.registerServerPropsGetter("markdown",w("./get-server-props.js"));e.createTemplate("error",w("../../../client/app/Error/ErrorDetails.js"));for(const o of await r.fs.scan(/\.md$/))if(!await r.isPathIgnored(o.relativePath)&&!L(o.relativePath,d))try{await S(o)}catch(a){e.addRoute(E(o.relativePath,a)),i?.error(a),await b.panicOnBuild("Failed to create route for markdown file: %s",a.message)}async function S(o){const{relativePath:a,realRelativePath:P}=o,{data:{frontmatter:t}}=await r.cache.load(a,"markdown-frontmatter"),v=t?.metadata||{},y=await O(a,"markdown-frontmatter",t,r),c=G(y,a);let p=null;t?.sidebar&&(p=await _(t.sidebar,a,r.fs));let g=l;if(t?.template){const f=t.template.startsWith("./")||t.template.startsWith("../");let m=t.template;if(f){const s=u.posix.dirname(P);m=u.resolve(h.contentDir,s,t.template)}g=e.createTemplate(t.template,m)}t?.rbac&&I({content:{[a]:t.rbac}}),await K(o,r.fs,e),(c.length?c.reverse():[void 0]).forEach(f=>{e.addRoute({slug:f,fsPath:a,templateId:g,sharedData:p?[{id:p,key:"sidebar"}]:void 0,redirectFrom:Object.entries(t.redirects||{}).map(([m,{type:s}])=>({type:s||301,from:m})),[D]:t?.rbac,getNavText:async()=>(t?.seo?.title||await F(a,r)||"").toString(),metadata:{type:"markdown",...v},async getStaticData(m,s){return T(o,m,r,t,s)},getSearchDocuments:M(t,a,e.getSearchFacets,e.setSearchFacets),getAiDocumentsStore:B(e.getSearchFacets,t),serverPropsGetterIds:[k]})})}})},afterRoutesCreated:async(e,r)=>{const i=await C(r,e);e.setGlobalConfig({[R]:i})}}}export{nt as markdownPlugin};
1
+ import u from"path";import{REDOCLY_TEAMS_RBAC as F}from"@redocly/config";import{MARKDOC_PARTIALS_DATA_KEY as D}from"../../store.js";import{reporter as R}from"../../tools/notifiers/reporter.js";import{extractMdFirstHeading as b,getAst as A}from"./compiler.js";import{getTemplatePath as w}from"./get-template-path.js";import{prepareMarkdocPartials as C}from"./markdoc/partials.js";import{searchResolver as M}from"./search/search-resolver.js";import{markdownStaticDataLoader as T}from"./markdown-static-data-loader.js";import{makeErrorRoute as E}from"../error-route.js";import{validateRbacConfig as I}from"../validate-rbac-config.js";import{findFrontmatterSlugs as O,getSidebarSharedDataId as _,resolveFrontmatterSlugs as G}from"../utils.js";import{isPartial as L}from"./is-partial.js";import{markdownFrontmatterLoader as j}from"./markdown-frontmatter-loader.js";import{resolveRawPartials as z}from"./markdoc/resolve-raw-partials.js";import{getAiDocumentsStore as B}from"./search/get-ai-search-documents.js";import{registerPageProps as K}from"../register-page-props.js";import{sanitizeMalformedMdContent as N}from"./utils/sanitize-malformed-md-content.js";import{telemetryTraceStep as W}from"../../../cli/telemetry/helpers/trace-step.js";async function nt(h){return{id:"markdoc",requiredEntitlements:["markdown"],loaders:{"markdown-frontmatter":j,"markdown-ast":async(e,r)=>{const i=await r.fs.read(e),n=await r.getConfig(),d=await z(i,e,n?.markdown?.partialsFolders,r),l=N(d);return A(e,l)}},processContent:async(e,r)=>{await W("build.plugin.markdown",async i=>{const{markdown:n}=await r.getConfig();i?.setAttribute("config",JSON.stringify(n||{}));const d=n?.partialsFolders??[],l=e.createTemplate("markdown","@redocly/theme/core/templates/Markdown"),S=e.registerServerPropsGetter("markdown",w("./get-server-props.js"));e.createTemplate("error",w("../../../client/app/Error/ErrorDetails.js"));for(const o of await r.fs.scan(/\.md$/))if(!await r.isPathIgnored(o.relativePath)&&!L(o.relativePath,d))try{await k(o)}catch(a){e.addRoute(E(o.relativePath,a)),i?.error(a),await R.panicOnBuild("Failed to create route for markdown file: %s",a.message)}async function k(o){const{relativePath:a,realRelativePath:P}=o,{data:{frontmatter:t}}=await r.cache.load(a,"markdown-frontmatter"),v=t?.metadata||{},y=await O(a,"markdown-frontmatter",t,r),c=G(y,a);let f=null;t?.sidebar&&(f=await _(t.sidebar,a,r.fs));let g=l;if(t?.template){const p=t.template.startsWith("./")||t.template.startsWith("../");let m=t.template;if(p){const s=u.posix.dirname(P);m=u.resolve(h.contentDir,s,t.template)}g=e.createTemplate(t.template,m)}t?.rbac&&I({content:{[a]:t.rbac}}),await K(o,r.fs,e),(c.length?c.reverse():[void 0]).forEach(p=>{e.addRoute({excludeFromSearch:t?.excludeFromSearch||!1,slug:p,fsPath:a,templateId:g,sharedData:f?[{id:f,key:"sidebar"}]:void 0,redirectFrom:Object.entries(t.redirects||{}).map(([m,{type:s}])=>({type:s||301,from:m})),[F]:t?.rbac,getNavText:async()=>(t?.seo?.title||await b(a,r)||"").toString(),metadata:{type:"markdown",...v},async getStaticData(m,s){return T(o,m,r,t,s)},getSearchDocuments:M(t,a,e.getSearchFacets,e.setSearchFacets),getAiDocumentsStore:B(e.getSearchFacets,t),serverPropsGetterIds:[S]})})}})},afterRoutesCreated:async(e,r)=>{const i=await C(r,e);e.setGlobalConfig({[D]:i})}}}export{nt as markdownPlugin};
@@ -0,0 +1,6 @@
1
+ import { type NormalizedProblem } from '@redocly/openapi-core';
2
+ /**
3
+ * Formats a bundle error with file path, line/column, and codeframe for better debugging.
4
+ */
5
+ export declare function formatBundleError(problem: NormalizedProblem, cwd: string): Promise<string>;
6
+ //# sourceMappingURL=format-bundle-error.d.ts.map
@@ -0,0 +1,5 @@
1
+ import{getLineColLocation as f,isAbsoluteUrl as m}from"@redocly/openapi-core";import g from"node:path";import{gray as s}from"../../tools/notifiers/helpers/colors.js";import{getCodeframe as h}from"../../utils/codeframes/codeframes.js";async function P(o,c){const e=o.location?.[0];if(!e)return`${o.message} at `;if(!e.source){const t=e.pointer??"";return`${o.message} at ${t}`}const n=m(e.source.absoluteRef)?e.source.absoluteRef:g.relative(c,e.source.absoluteRef);try{const t=f(e),i=e.pointer?s(`at ${e.pointer}`):"",l=`${n}:${t.start.line}:${t.start.col}`;let r="";try{const a=e.source?.getLines()??[],u={start:{line:t.start.line,character:t.start.col},end:{line:t.end?.line??t.start.line,character:t.end?.col??Math.max(t.start.col+1,a[t.start.line-1]?.length??t.start.col)},lines:a},{frame:$}=h(u,!0);r=$}catch{r=""}return`${l} ${i}
2
+ ${o.message}
3
+ ${r?`${r}
4
+ `:""}`}catch{const t=e.pointer?s(`at ${e.pointer}`):"";return`${n} ${t}
5
+ ${o.message}`}}export{P as formatBundleError};
@@ -1 +1 @@
1
- import Z from"node:path";import{simplifyAstStructure as ee}from"@redocly/openapi-docs";import{REDOCLY_TEAMS_RBAC as _}from"@redocly/config";import{OPENAPI_DOCS_TEMPLATE_ID as G,PUBLIC_RBAC_SCOPE_ITEM as $}from"../../../constants/common.js";import{DEPRECATED_PUBLIC_API_DEFINITIONS_FOLDER as te,PUBLIC_API_DEFINITIONS_FOLDER as oe}from"../../constants/common.js";import{OPENAPI_CUSTOM_FIELDS_SERVER_PROPS_GETTER_ID as ae,OPENAPI_SHARED_DATA_PREFIX as H}from"../../constants/plugins/openapi-docs.js";import{slash as re}from"../../../utils/path/slash.js";import{isDevelopMode as U}from"../../utils/envs/is-develop-mode.js";import{searchResolver as se}from"./search/search-resolver.js";import{convertOpenAPIDocs2Sidebar as ie,shouldAddRoute as ne}from"./utils.js";import{getTemplatePath as b}from"./get-template-path.js";import{storeDefinitionBundles as pe}from"./store-definition-bundles.js";import{definitionLoader as ce,definitionsLoader as de}from"./load-definition.js";import{getAiDocumentsStore as le}from"./search/get-ai-search-documents.js";import{fromCurrentDir as ue}from"../../utils/paths.js";import{telemetryTraceStep as me}from"../../../cli/telemetry/helpers/trace-step.js";const L="openapi-spec-download";async function Te(V){let M=[],E={};return{id:"openapi",requiredEntitlements:["openapi"],loaders:{"load-oas-docs":de,"load-oas":ce},processContent:async(e,i)=>{await me("build.plugin.openapi_docs",async d=>{e.createRequestHandler(L,ue(import.meta.url,"./spec-download.api.js")),e.addApiRoute({slug:oe+"/*",requestHandlerId:L,httpMethod:"all",[_]:$,getStaticData:async()=>({props:{}})}),e.addApiRoute({slug:te+"/*",requestHandlerId:L,httpMethod:"all",[_]:$,getStaticData:async()=>({props:{}})});const s=e.createTemplate(G,b("./template/OpenAPIDocs.js")),n=e.registerServerPropsGetter(G,b("./get-server-props.js")),g=e.registerServerPropsGetter(ae,b("./get-server-props-custom-fields.js")),l=await i.getConfig();d?.setAttribute("config",JSON.stringify(l.openapi||{}));const I=l.rules?.["custom-fields-schema"];E={};const u=await e.loadOpenApiDefinitions(i);M=u.map(({markdocChunks:m,relativePath:f,customOutputRelativeFile:r,isVirtual:a,realRelativePath:p})=>({chunks:m,relativePath:f,realRelativePath:p,isVirtual:r!=null||a})),pe(u,e.outdir);const P={};for(const m of u||[]){const{definition:f,config:r,relativePath:a,customOutputRelativeFile:p,contentItems:S,flatItems:D,parser:v,options:w,rawOptions:q,hash:J}=m,k=p||a,o=[],x={},{definition:Q}=v||{},{info:c}=Q||{},O=c?.["x-metadata"],B=!!r.openapi?.excludeFromSearch||!!r.theme?.openapi?.excludeFromSearch||!!l.openapi?.excludeFromSearch||!!l.theme?.openapi?.excludeFromSearch,N={title:c?.title,description:c?.description,summary:c?.summary,...r.metadata,...O},h={untagged:[],tagged:new Map};for(const t of D){const{id:C,href:A,operationDefinition:y}=t;if(y){const{tags:R}=y;if(R)for(const T of R)h.tagged.has(T)||h.tagged.set(T,[]),h.tagged.get(T)?.push(t);else h.untagged.push(t);U()&&(x[`#${y.pointer}`]=t.href)}if(!ne({item:t}))continue;const F=t,Y=F.type==="section"&&!!F.infoDefinition,z=A.split("#")[0]+"/",K=t?.operationDefinition?.[_];o.push({slugSuffix:z,fsPath:k,httpVerb:t?.httpVerb||"",path:a,templateId:s,[_]:K||r.rbac,getAiDocumentsStore:le({parser:v,options:w,info:c,tagOperations:h,openapiContentItem:F,metadata:N,relativePath:a,getSearchFacets:e.getSearchFacets,includeInLLMsTxt:Y,excludeFromSearch:B}),getStaticData:async R=>({props:{dynamicMarkdocComponents:["openapi"],baseSlug:R.baseSlug,seo:t["x-metadata"]?.seo||{title:t.name,description:t.description},itemId:C,disableAutoScroll:!0}})})}o[0]={...o[0],metadata:{type:"openapi",...N},hasClientRoutes:!0,getSidebar:(t,C)=>{const A=[];return ie({contentItems:S,sidebarItems:A,routeSlug:t.slug,navItem:C}),A},getNavText:()=>c?.title,getSearchDocuments:se(v,w,D,e.getSearchFacets,e.setSearchFacets,B)},O?.apiId&&(P[O.apiId]={slug:o[0]?.slug||""});const W=o[0];o[0]=o[o.length-1],o[o.length-1]=W;for(const t of o)e.addRoute({...t,serverPropsGetterIds:I?[n,g]:[n]});const X=U()?a:void 0,j=`${H}${a}`;E[j]={fsPath:k,definition:f,options:q,sourcePath:X,routesMapping:x,hash:J};for(const t of o)e.addRoute({...t,sharedData:[{id:j,key:"openAPIDocsStore"}],serverPropsGetterIds:I?[n,g]:[n]})}e.setGlobalData({apiProducts:P})})},afterRoutesCreated:async(e,i)=>{for(const{chunks:d,relativePath:s,isVirtual:n,realRelativePath:g}of M)await i.cache.load(s,{loader:async function(){await i.cache.load(g,"load-oas");for(const{node:I,markdown:u,pointer:P,key:m,relativePath:f}of d){const[r,...a]=P.split("#"),p=a.join("#"),S=re(Z.relative(V.contentDir,r)),{ast:D}=await e.parseMarkdoc({content:u,relativePath:S,isVirtual:n,cacheId:S+(p?"#"+p:"")},i,{sharedDataIds:[`${H}${f}`]});I[`x-parsed-md-${m}`]={result:ee(D)}}},name:"openapi-markdoc-inline-parser"});for(const[d,s]of Object.entries(E))await e.createSharedData(d,{...s,baseSlug:e.getRouteByFsPath(s.fsPath)?.baseSlug},s.hash)}}}export{Te as openAPIDocsPlugin};
1
+ import Z from"node:path";import{simplifyAstStructure as ee}from"@redocly/openapi-docs";import{REDOCLY_TEAMS_RBAC as _}from"@redocly/config";import{OPENAPI_DOCS_TEMPLATE_ID as G,PUBLIC_RBAC_SCOPE_ITEM as $}from"../../../constants/common.js";import{DEPRECATED_PUBLIC_API_DEFINITIONS_FOLDER as te,PUBLIC_API_DEFINITIONS_FOLDER as oe}from"../../constants/common.js";import{OPENAPI_CUSTOM_FIELDS_SERVER_PROPS_GETTER_ID as ae,OPENAPI_SHARED_DATA_PREFIX as H}from"../../constants/plugins/openapi-docs.js";import{slash as re}from"../../../utils/path/slash.js";import{isDevelopMode as U}from"../../utils/envs/is-develop-mode.js";import{searchResolver as se}from"./search/search-resolver.js";import{convertOpenAPIDocs2Sidebar as ie,shouldAddRoute as ne}from"./utils.js";import{getTemplatePath as L}from"./get-template-path.js";import{storeDefinitionBundles as pe}from"./store-definition-bundles.js";import{definitionLoader as ce,definitionsLoader as de}from"./load-definition.js";import{getAiDocumentsStore as le}from"./search/get-ai-search-documents.js";import{fromCurrentDir as ue}from"../../utils/paths.js";import{telemetryTraceStep as me}from"../../../cli/telemetry/helpers/trace-step.js";const M="openapi-spec-download";async function Te(V){let w=[],E={};return{id:"openapi",requiredEntitlements:["openapi"],loaders:{"load-oas-docs":de,"load-oas":ce},processContent:async(e,i)=>{await me("build.plugin.openapi_docs",async d=>{e.createRequestHandler(M,ue(import.meta.url,"./spec-download.api.js")),e.addApiRoute({slug:oe+"/*",requestHandlerId:M,httpMethod:"all",[_]:$,getStaticData:async()=>({props:{}})}),e.addApiRoute({slug:te+"/*",requestHandlerId:M,httpMethod:"all",[_]:$,getStaticData:async()=>({props:{}})});const s=e.createTemplate(G,L("./template/OpenAPIDocs.js")),n=e.registerServerPropsGetter(G,L("./get-server-props.js")),g=e.registerServerPropsGetter(ae,L("./get-server-props-custom-fields.js")),l=await i.getConfig();d?.setAttribute("config",JSON.stringify(l.openapi||{}));const I=l.rules?.["custom-fields-schema"];E={};const u=await e.loadOpenApiDefinitions(i);w=u.map(({markdocChunks:m,relativePath:f,customOutputRelativeFile:r,isVirtual:a,realRelativePath:p})=>({chunks:m,relativePath:f,realRelativePath:p,isVirtual:r!=null||a})),pe(u,e.outdir);const P={};for(const m of u||[]){const{definition:f,config:r,relativePath:a,customOutputRelativeFile:p,contentItems:S,flatItems:D,parser:v,options:k,rawOptions:q,hash:J}=m,x=p||a,o=[],B={},{definition:Q}=v||{},{info:c}=Q||{},O=c?.["x-metadata"],C=!!r.openapi?.excludeFromSearch||!!r.theme?.openapi?.excludeFromSearch||!!l.openapi?.excludeFromSearch||!!l.theme?.openapi?.excludeFromSearch,N={title:c?.title,description:c?.description,summary:c?.summary,...r.metadata,...O},h={untagged:[],tagged:new Map};for(const t of D){const{id:y,href:A,operationDefinition:F}=t;if(F){const{tags:R}=F;if(R)for(const b of R)h.tagged.has(b)||h.tagged.set(b,[]),h.tagged.get(b)?.push(t);else h.untagged.push(t);U()&&(B[`#${F.pointer}`]=t.href)}if(!ne({item:t}))continue;const T=t,Y=T.type==="section"&&!!T.infoDefinition,z=A.split("#")[0]+"/",K=t?.operationDefinition?.[_];o.push({excludeFromSearch:C,slugSuffix:z,fsPath:x,httpVerb:t?.httpVerb||"",path:a,templateId:s,[_]:K||r.rbac,getAiDocumentsStore:le({parser:v,options:k,info:c,tagOperations:h,openapiContentItem:T,metadata:N,relativePath:a,getSearchFacets:e.getSearchFacets,includeInLLMsTxt:Y,excludeFromSearch:C}),getStaticData:async R=>({props:{dynamicMarkdocComponents:["openapi"],baseSlug:R.baseSlug,seo:t["x-metadata"]?.seo||{title:t.name,description:t.description},itemId:y,disableAutoScroll:!0}})})}o[0]={...o[0],metadata:{type:"openapi",...N},hasClientRoutes:!0,getSidebar:(t,y)=>{const A=[];return ie({contentItems:S,sidebarItems:A,routeSlug:t.slug,navItem:y}),A},getNavText:()=>c?.title,getSearchDocuments:se(v,k,D,e.getSearchFacets,e.setSearchFacets,C)},O?.apiId&&(P[O.apiId]={slug:o[0]?.slug||""});const W=o[0];o[0]=o[o.length-1],o[o.length-1]=W;for(const t of o)e.addRoute({...t,serverPropsGetterIds:I?[n,g]:[n]});const X=U()?a:void 0,j=`${H}${a}`;E[j]={fsPath:x,definition:f,options:q,sourcePath:X,routesMapping:B,hash:J};for(const t of o)e.addRoute({...t,sharedData:[{id:j,key:"openAPIDocsStore"}],serverPropsGetterIds:I?[n,g]:[n]})}e.setGlobalData({apiProducts:P})})},afterRoutesCreated:async(e,i)=>{for(const{chunks:d,relativePath:s,isVirtual:n,realRelativePath:g}of w)await i.cache.load(s,{loader:async function(){await i.cache.load(g,"load-oas");for(const{node:I,markdown:u,pointer:P,key:m,relativePath:f}of d){const[r,...a]=P.split("#"),p=a.join("#"),S=re(Z.relative(V.contentDir,r)),{ast:D}=await e.parseMarkdoc({content:u,relativePath:S,isVirtual:n,cacheId:S+(p?"#"+p:"")},i,{sharedDataIds:[`${H}${f}`]});I[`x-parsed-md-${m}`]={result:ee(D)}}},name:"openapi-markdoc-inline-parser"});for(const[d,s]of Object.entries(E))await e.createSharedData(d,{...s,baseSlug:e.getRouteByFsPath(s.fsPath)?.baseSlug},s.hash)}}}export{Te as openAPIDocsPlugin};