@redocly/redoc 0.130.0-next.9 → 0.131.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/CHANGELOG.md +151 -0
  2. package/dist/bin.js +1 -1
  3. package/dist/cli/develop.js +1 -1
  4. package/dist/cli/prepare/copy-env-files.js +1 -1
  5. package/dist/cli/prepare/index.js +1 -1
  6. package/dist/cli/stats/collectors/openapi.js +1 -1
  7. package/dist/cli/telemetry/index.js +1 -1
  8. package/dist/client/App.js +1 -1
  9. package/dist/client/ErrorBoundary.js +1 -1
  10. package/dist/client/app/Sidebar/RequestAccessButton.js +2 -2
  11. package/dist/client/app/Sidebar/Sidebar.js +2 -2
  12. package/dist/client/app/Sidebar/helpers/filter-out-versioned-items.js +1 -1
  13. package/dist/client/app/hooks/catalog/useCatalogClassic.js +1 -1
  14. package/dist/client/app/hooks/catalog/useCatalogFilter.js +1 -1
  15. package/dist/client/app/hooks/catalog/useCatalogViewMode.js +1 -1
  16. package/dist/client/app/hooks/catalog/useSearchTracker.js +1 -1
  17. package/dist/client/app/hooks/usePageTimeTracker.js +1 -1
  18. package/dist/client/app/hooks/useRouteChangeTracker.js +1 -1
  19. package/dist/client/app/pages/DevLogin/DevLogin.js +1 -1
  20. package/dist/client/app/search/message-handlers.d.ts +29 -0
  21. package/dist/client/app/search/message-handlers.js +1 -0
  22. package/dist/client/app/search/sse-parser.d.ts +10 -0
  23. package/dist/client/app/search/sse-parser.js +2 -0
  24. package/dist/client/app/search/useAiSearch.d.ts +9 -11
  25. package/dist/client/app/search/useAiSearch.js +1 -1
  26. package/dist/client/app/search/useSearch.js +1 -1
  27. package/dist/client/browser-entry.js +5 -5
  28. package/dist/client/constants/ai-search.d.ts +30 -0
  29. package/dist/client/constants/ai-search.js +1 -0
  30. package/dist/client/constants/index.d.ts +2 -0
  31. package/dist/client/constants/index.js +1 -0
  32. package/dist/client/providers/hooks.js +1 -1
  33. package/dist/client/runtime/loader.js +1 -1
  34. package/dist/client/types/ai-search.d.ts +73 -0
  35. package/dist/client/types/ai-search.js +0 -0
  36. package/dist/client/types/index.d.ts +1 -0
  37. package/dist/config/env-config.d.ts +17 -0
  38. package/dist/config/env-config.js +1 -0
  39. package/dist/config/env-schema.d.ts +242 -0
  40. package/dist/config/env-schema.js +3 -0
  41. package/dist/config/env-schemas/api-urls.d.ts +24 -0
  42. package/dist/config/env-schemas/api-urls.js +1 -0
  43. package/dist/config/env-schemas/auth.d.ts +42 -0
  44. package/dist/config/env-schemas/auth.js +1 -0
  45. package/dist/config/env-schemas/catalog.d.ts +12 -0
  46. package/dist/config/env-schemas/catalog.js +1 -0
  47. package/dist/config/env-schemas/database.d.ts +15 -0
  48. package/dist/config/env-schemas/database.js +1 -0
  49. package/dist/config/env-schemas/environment-detection.d.ts +24 -0
  50. package/dist/config/env-schemas/environment-detection.js +1 -0
  51. package/dist/config/env-schemas/feature-flags.d.ts +24 -0
  52. package/dist/config/env-schemas/feature-flags.js +1 -0
  53. package/dist/config/env-schemas/organization-project.d.ts +27 -0
  54. package/dist/config/env-schemas/organization-project.js +1 -0
  55. package/dist/config/env-schemas/scorecards.d.ts +12 -0
  56. package/dist/config/env-schemas/scorecards.js +1 -0
  57. package/dist/config/env-schemas/search.d.ts +21 -0
  58. package/dist/config/env-schemas/search.js +1 -0
  59. package/dist/config/env-schemas/server-config.d.ts +51 -0
  60. package/dist/config/env-schemas/server-config.js +1 -0
  61. package/dist/config/env-schemas/site.d.ts +12 -0
  62. package/dist/config/env-schemas/site.js +1 -0
  63. package/dist/config/env-schemas/ssr.d.ts +18 -0
  64. package/dist/config/env-schemas/ssr.js +1 -0
  65. package/dist/config/env-schemas/telemetry.d.ts +15 -0
  66. package/dist/config/env-schemas/telemetry.js +1 -0
  67. package/dist/config/env-schemas/test.d.ts +22 -0
  68. package/dist/config/env-schemas/test.js +1 -0
  69. package/dist/constants/common.d.ts +1 -1
  70. package/dist/constants/common.js +1 -1
  71. package/dist/constants/l10n/langs/ar.js +1 -1
  72. package/dist/constants/l10n/langs/de.js +1 -1
  73. package/dist/constants/l10n/langs/en.js +1 -1
  74. package/dist/constants/l10n/langs/es.js +1 -1
  75. package/dist/constants/l10n/langs/fr.js +1 -1
  76. package/dist/constants/l10n/langs/hi.js +1 -1
  77. package/dist/constants/l10n/langs/it.js +1 -1
  78. package/dist/constants/l10n/langs/ja.js +1 -1
  79. package/dist/constants/l10n/langs/ko.js +1 -1
  80. package/dist/constants/l10n/langs/pl.js +1 -1
  81. package/dist/constants/l10n/langs/pt-BR.js +1 -1
  82. package/dist/constants/l10n/langs/pt.js +1 -1
  83. package/dist/constants/l10n/langs/ru.js +1 -1
  84. package/dist/constants/l10n/langs/uk.js +1 -1
  85. package/dist/constants/l10n/langs/zh.js +1 -1
  86. package/dist/server/api-routes/import-api-routes-handlers.js +1 -1
  87. package/dist/server/api-routes/run-api-routes-worker.js +1 -1
  88. package/dist/server/constants/common.js +1 -1
  89. package/dist/server/entitlements/entitlements-provider.js +1 -1
  90. package/dist/server/esbuild/esbuild-logger.js +2 -2
  91. package/dist/server/esbuild/esbuild.js +2 -2
  92. package/dist/server/esbuild/plugins/assets-resolver.js +1 -1
  93. package/dist/server/esbuild/plugins/esbuild-compile-resolver.js +1 -1
  94. package/dist/server/esbuild/plugins/styled-components-ssr.js +1 -1
  95. package/dist/server/fs/last-modified-tracker.js +1 -1
  96. package/dist/server/fs/utils/is-loader-cache-enabled.js +1 -1
  97. package/dist/server/node-bundle-entry.js +1 -1
  98. package/dist/server/plugins/analytics/adobe/index.js +1 -1
  99. package/dist/server/plugins/analytics/amplitude/index.js +1 -1
  100. package/dist/server/plugins/analytics/fullstory/index.js +1 -1
  101. package/dist/server/plugins/analytics/ga/index.js +1 -1
  102. package/dist/server/plugins/analytics/gtm/browser-hooks.js +1 -1
  103. package/dist/server/plugins/analytics/gtm/index.js +1 -1
  104. package/dist/server/plugins/analytics/heap/index.js +1 -1
  105. package/dist/server/plugins/analytics/rudderstack/index.js +1 -1
  106. package/dist/server/plugins/analytics/segment/index.js +1 -1
  107. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +36 -61
  108. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
  109. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.d.ts +1 -0
  110. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-read-model.js +1 -1
  111. package/dist/server/plugins/catalog-entities/database/mappers/{create-entity-relation.d.ts → create-entity-relation-read-model.d.ts} +2 -2
  112. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-read-model.js +1 -0
  113. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.d.ts +16 -5
  114. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.js +21 -17
  115. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +35 -9
  116. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +24 -21
  117. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +36 -39
  118. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +1 -1
  119. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.js +1 -1
  120. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.d.ts +7 -1
  121. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.js +1 -1
  122. package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.d.ts +4 -5
  123. package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.js +1 -1
  124. package/dist/server/plugins/catalog-entities/database/repositories/utils/build-entities-exclusion-filter.d.ts +13 -0
  125. package/dist/server/plugins/catalog-entities/database/repositories/utils/build-entities-exclusion-filter.js +1 -0
  126. package/dist/server/plugins/catalog-entities/database/repositories/utils/build-rbac-filter.d.ts +31 -0
  127. package/dist/server/plugins/catalog-entities/database/repositories/utils/build-rbac-filter.js +9 -0
  128. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.js +1 -1
  129. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.d.ts +2 -1
  130. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.js +1 -1
  131. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.js +1 -1
  132. package/dist/server/plugins/catalog-entities/extensions/extractors/fs-entities-extractor.js +1 -1
  133. package/dist/server/plugins/catalog-entities/get-server-props.js +1 -1
  134. package/dist/server/plugins/catalog-entities/plugin.js +1 -1
  135. package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.d.ts +25 -164
  136. package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.js +0 -1
  137. package/dist/server/plugins/catalog-entities/types/openapi.d.ts +11 -0
  138. package/dist/server/plugins/catalog-entities/types/openapi.js +0 -0
  139. package/dist/server/plugins/catalog-entities/types/params.d.ts +6 -0
  140. package/dist/server/plugins/catalog-entities/types/params.js +0 -0
  141. package/dist/server/plugins/catalog-entities/utils/catalog-data-collector.js +1 -1
  142. package/dist/server/plugins/catalog-entities/utils/get-not-accessible-catalog-resources.d.ts +11 -0
  143. package/dist/server/plugins/catalog-entities/utils/get-not-accessible-catalog-resources.js +1 -0
  144. package/dist/server/plugins/config-parser/index.js +1 -1
  145. package/dist/server/plugins/config-parser/loaders/utils/read-and-validate-config.js +1 -1
  146. package/dist/server/plugins/default-theme/index.js +1 -1
  147. package/dist/server/plugins/entitlements/index.js +1 -1
  148. package/dist/server/plugins/lifecycle.js +2 -2
  149. package/dist/server/plugins/markdown/markdoc/import-user-tags.js +1 -1
  150. package/dist/server/plugins/markdown/markdoc/plugins/render-mermaid.js +1 -1
  151. package/dist/server/plugins/markdown/markdown-static-data-loader.js +1 -1
  152. package/dist/server/plugins/mcp/auth/auth-handlers.js +1 -1
  153. package/dist/server/plugins/mcp/docs-mcp/tools/docs-mcp-tool.js +1 -1
  154. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.js +1 -1
  155. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.js +1 -1
  156. package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.js +1 -1
  157. package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.js +1 -1
  158. package/dist/server/plugins/mcp/handlers/docs-mcp-handler.js +1 -1
  159. package/dist/server/plugins/mcp/handlers/errors.js +1 -1
  160. package/dist/server/plugins/mcp/handlers/handle-mcp-request.js +1 -1
  161. package/dist/server/plugins/mcp/servers/base-server.js +1 -1
  162. package/dist/server/plugins/nav-utils.js +1 -1
  163. package/dist/server/plugins/openapi-docs/index.js +1 -1
  164. package/dist/server/plugins/openapi-docs/template/helpers.d.ts +1 -1
  165. package/dist/server/plugins/openapi-docs/template/helpers.js +3 -3
  166. package/dist/server/plugins/scorecard-classic/index.js +1 -1
  167. package/dist/server/plugins/scorecards/plugin.js +1 -1
  168. package/dist/server/plugins/scorecards/workers/run-scorecards-worker.js +1 -1
  169. package/dist/server/plugins/search/ai-indexer/prepare-ai-search-documents.js +1 -1
  170. package/dist/server/plugins/search/documents/search-documents.js +1 -1
  171. package/dist/server/plugins/search/engines/flexsearch/index.js +1 -1
  172. package/dist/server/plugins/search/engines/typesense/index.js +1 -1
  173. package/dist/server/plugins/search/index.js +1 -1
  174. package/dist/server/plugins/search/llmstxt/index.js +5 -5
  175. package/dist/server/plugins/search/utils.js +1 -1
  176. package/dist/server/plugins/sidebars/index.js +2 -2
  177. package/dist/server/plugins/sso/index.js +1 -1
  178. package/dist/server/providers/database/base-repository.js +1 -1
  179. package/dist/server/providers/database/database-connection-factory.js +1 -1
  180. package/dist/server/providers/database/database-preconnect-service.js +1 -1
  181. package/dist/server/providers/database/databases/sqld-sqlite/drizzle.config.js +1 -1
  182. package/dist/server/ssr/render.js +1 -1
  183. package/dist/server/ssr/server-side-props/get-server-props-from-user-handler.js +1 -1
  184. package/dist/server/ssr/utils.js +8 -8
  185. package/dist/server/store.d.ts +4 -4
  186. package/dist/server/store.js +1 -1
  187. package/dist/server/telemetry/index.js +1 -1
  188. package/dist/server/tools/notifiers/formatter.js +3 -3
  189. package/dist/server/tools/notifiers/helpers/colors.js +1 -1
  190. package/dist/server/tools/notifiers/logger.js +2 -2
  191. package/dist/server/tools/notifiers/reporter.js +9 -9
  192. package/dist/server/tools/notifiers/terminal-manager.js +4 -4
  193. package/dist/server/utils/envs/load-env-variables.js +1 -1
  194. package/dist/server/utils/is-catalog-entities-enabled.js +1 -1
  195. package/dist/server/utils/is-scorecards-enabled.js +1 -1
  196. package/dist/server/utils/lifecycle-hooks.js +1 -1
  197. package/dist/server/utils/rbac.d.ts +65 -0
  198. package/dist/server/utils/report-all-errors.js +1 -1
  199. package/dist/server/version.js +1 -1
  200. package/dist/server/web-server/auth.js +3 -3
  201. package/dist/server/web-server/handle-api-route-request.js +1 -1
  202. package/dist/server/web-server/http.js +2 -2
  203. package/dist/server/web-server/middleware/apiKeyMiddleware.js +1 -1
  204. package/dist/server/web-server/middleware/catalogAuthMiddleware.d.ts +4 -6
  205. package/dist/server/web-server/middleware/catalogAuthMiddleware.js +1 -1
  206. package/dist/server/web-server/middleware/corsMiddleware.js +1 -1
  207. package/dist/server/web-server/middleware/dynamic-middleware/dynamic-middleware.js +1 -1
  208. package/dist/server/web-server/middleware/idleTimeoutMiddleware.js +1 -1
  209. package/dist/server/web-server/routes/ask-ai.js +1 -1
  210. package/dist/server/web-server/routes/auth.js +1 -1
  211. package/dist/server/web-server/routes/catalog/bff-catalog-related-entities.js +1 -1
  212. package/dist/server/web-server/routes/catalog/bff-catalog.js +1 -1
  213. package/dist/server/web-server/routes/catalog/catalog-relations.js +1 -1
  214. package/dist/server/web-server/routes/catalog/catalog.js +1 -1
  215. package/dist/server/web-server/routes/catalog/dto/read-entity-dto.d.ts +3 -0
  216. package/dist/server/web-server/routes/catalog/dto/read-entity-dto.js +0 -0
  217. package/dist/server/web-server/routes/catalog/helpers/create-entity-relation-update-schema.d.ts +43 -0
  218. package/dist/server/web-server/routes/catalog/helpers/create-entity-relation-update-schema.js +1 -0
  219. package/dist/server/web-server/routes/catalog/helpers/create-entity-schema.d.ts +6823 -0
  220. package/dist/server/web-server/routes/catalog/helpers/create-entity-schema.js +1 -0
  221. package/dist/server/web-server/routes/catalog/helpers/create-entity-update-schema.d.ts +1102 -0
  222. package/dist/server/web-server/routes/catalog/helpers/create-entity-update-schema.js +1 -0
  223. package/dist/server/web-server/routes/catalog/helpers/has-access-to-entity.d.ts +10 -0
  224. package/dist/server/web-server/routes/catalog/helpers/has-access-to-entity.js +1 -0
  225. package/dist/server/web-server/routes/catalog/mappers/map-entity-read-model-schema-to-entity-read-dto.d.ts +4 -0
  226. package/dist/server/web-server/routes/catalog/mappers/map-entity-read-model-schema-to-entity-read-dto.js +1 -0
  227. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entities.d.ts +4 -0
  228. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entities.js +1 -0
  229. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity-update-data.d.ts +4 -0
  230. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity-update-data.js +1 -0
  231. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity.d.ts +4 -0
  232. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity.js +1 -0
  233. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entities-relations.d.ts +13 -0
  234. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entities-relations.js +1 -0
  235. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation-update-data.d.ts +13 -0
  236. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation-update-data.js +1 -0
  237. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation.d.ts +13 -0
  238. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation.js +1 -0
  239. package/dist/server/web-server/routes/dynamic-route.js +1 -1
  240. package/dist/server/web-server/routes/error.js +1 -1
  241. package/dist/server/web-server/routes/helpers/get-current-rbac-teams.d.ts +3 -0
  242. package/dist/server/web-server/routes/helpers/get-current-rbac-teams.js +1 -0
  243. package/dist/server/web-server/routes/helpers/get-rbac-restrictions-data-for-catalog.d.ts +11 -0
  244. package/dist/server/web-server/routes/helpers/get-rbac-restrictions-data-for-catalog.js +1 -0
  245. package/dist/server/web-server/routes/index.js +1 -1
  246. package/dist/server/web-server/routes/info.js +1 -1
  247. package/dist/server/web-server/routes/mcp-oauth.js +1 -1
  248. package/dist/server/web-server/routes/otel/otel.js +1 -1
  249. package/dist/server/web-server/routes/page-data.js +1 -1
  250. package/dist/server/web-server/routes/path-prefix-redirect.js +1 -1
  251. package/dist/server/web-server/utils.d.ts +2 -2
  252. package/dist/server/workers/worker-pool.js +1 -1
  253. package/package.json +17 -16
  254. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation.js +0 -1
  255. package/dist/server/plugins/catalog-entities/entities/validate-entity.d.ts +0 -8
  256. package/dist/server/plugins/catalog-entities/entities/validate-entity.js +0 -1
  257. package/dist/server/utils/envs/is-build-mode.d.ts +0 -2
  258. package/dist/server/utils/envs/is-build-mode.js +0 -1
  259. package/dist/server/utils/envs/is-develop-mode.d.ts +0 -7
  260. package/dist/server/utils/envs/is-develop-mode.js +0 -1
  261. package/dist/server/utils/envs/is-production-mode.d.ts +0 -10
  262. package/dist/server/utils/envs/is-production-mode.js +0 -1
  263. package/dist/utils/env/is-local-development.d.ts +0 -13
  264. package/dist/utils/env/is-local-development.js +0 -1
  265. package/dist/utils/env/is-production.d.ts +0 -13
  266. package/dist/utils/env/is-production.js +0 -1
  267. package/dist/utils/env/is-web-view.d.ts +0 -14
  268. package/dist/utils/env/is-web-view.js +0 -1
@@ -1 +1 @@
1
- import*as v from"path";import{REDOCLY_ROUTE_RBAC as P,REDOCLY_TEAMS_RBAC as p}from"@redocly/config";import{VERSION_SEPARATOR as M}from"../constants/common.js";import{DEFAULT_LOCALE_PLACEHOLDER as _}from"../../constants/common.js";import{removeTrailingSlash as j}from"../../utils/url/remove-trailing-slash.js";import{isPrimitive as W}from"../../utils/guards/is-primitive.js";import{slash as w}from"../../utils/path/slash.js";import{isAbsoluteUrl as z}from"../../utils/url/is-absolute-url.js";import{normalizeRouteSlug as U}from"../../utils/path/normalize-route-slug.js";import{parsePathVersions as R}from"../../utils/path/parse-path-versions.js";import{logger as A}from"../tools/notifiers/logger.js";import{reporter as S}from"../tools/notifiers/reporter.js";import{shaDirPathShort as C}from"../utils/crypto/sha-dir-path-short.js";import{copyStaticFile as H,FileNotFoundError as E}from"../utils/fs.js";import{isIconPath as J,resolveAssetPath as Y}from"../utils/index.js";import{resolveSrcSet as G}from"../utils/resolve-src-set.js";import{isL10nPath as B}from"../fs/utils/is-l10n-path.js";import{getLocaleFromRelativePath as q}from"../fs/utils/get-locale-from-relative-path.js";async function D(e,s,n,t,a){if(!e)return;const f={...a,ignoreCustomSidebar:!0};if(W(e)){if(typeof e=="string"){const r=F(n.contentDir,s,a,e,t.fs);if(t.fs.exists(r)){if(n.getRouteByFsPath(r))return K({page:e},s,n,t,f);{const g=t.fs.getFileInfo(r);return g?H(n.contentDir,g.realRelativePath,n.outdir):void 0}}}return e}return Array.isArray(e)?I(N(e),s,n,t,f):Object.fromEntries(await Promise.all(Object.entries(e).map(async([r,l])=>[r,await D(l,s,n,t,a)])))}function N(e){return e.map(s=>({...s,items:s.items?N(s.items):void 0}))}async function I(e,s,n,t,a){if(Array.isArray(e))return(await Promise.all(e.map(f=>K(f,s,n,t,a)))).flatMap(f=>f)}async function y(e,s,n,t){let a,f;if(typeof e.icon=="object"){if("srcSet"in e.icon)try{a=await G(e.icon.srcSet,n.fs,{fromFileRelativePath:t.navFile,contentDir:s.contentDir,outdir:s.outdir})}catch(d){d instanceof E?await S.panicOnBuildContentError(`Cannot resolve "item.icon.srcSet" from ${t.navFile}: ${d.message}`):await S.panicOnBuild(`Cannot resolve "item.icon.srcSet" from ${t.navFile}: ${d.message}`)}}else if(typeof e.icon=="string")if(z(e.icon)||J(e.icon))try{f=await Y(e.icon,n.fs,{fromFileRelativePath:t.navFile,contentDir:s.contentDir,outdir:s.outdir})}catch(d){d instanceof E?await S.panicOnBuildContentError(`Cannot resolve "item.icon" from ${t.navFile}: file ${f} does not exist`):await S.panicOnBuild(`Cannot resolve "item.icon" from ${t.navFile}: ${d.message}`)}else f=e.icon;return{icon:f,srcSet:a}}function Q(e){return s=>{if(s.type==="link"||s.type==="group"){const n=s.metadata;return n?Object.entries(e).every(([t,a])=>Array.isArray(a)?a.some(f=>n[t]===f):n[t]===a):!1}return!0}}async function K(e,s,n,t,a){if(e?.directory&&e.items?.length)return{type:"error",label:`Can't have both "directory" and "items" in the nav item: ${JSON.stringify(e)}`};e?.directory&&e?.group&&(e={...e,directory:void 0,items:[{directory:e.directory}]});const f=e?.directory?F(n.contentDir,s,a,e.directory,t.fs):void 0;if(f!==void 0){const i=f===""?"":f+"/",{locale:u,ignoredRoutes:o}=a;let h=n.getAllRoutesForLocale(u).filter(c=>!o?.has(c.baseSlug||"")&&c.fsPath.startsWith(i)&&!c.excludeFromSidebar).sort((c,b)=>c.fsPath===b.fsPath?0:c.baseSlug.localeCompare(b.baseSlug,void 0,{numeric:!0}));const k=e.includeByMetadata?Q(e.includeByMetadata):Boolean;if(!h.length)return[];const $=(await Promise.all(h.map(async c=>{const b=c.versions?.find(x=>x.active),L=b&&{version:b.version,isDefault:b.default,versionFolderId:b.folderId},V=ee(v.posix.relative(f,c.fsPath)),O=c.getSidebar?.(c);return!a.ignoreCustomSidebar&&O?.length?{type:"group",fsPath:c.fsPath,metadata:c.metadata,link:c.slug,routeSlug:c.slug,label:await c.getNavText?.()||c.slug,[p]:c[p],[P]:c[P],sidebarItems:m(O,L,c[p],c[P]),...L,relativePathFromDirectory:v.relative(f,c.fsPath).replace(/@[^\/]+\//,"")}:{type:"link",fsPath:c.fsPath,metadata:c.metadata,[p]:c[p],[P]:c[P],label:await c.getNavText?.()||c.slug,link:c.slug,routeSlug:c.slug,...L,relativePathFromDirectory:V}}))).filter(k);return e.flatten?T($,a):Z($,a)}let d=typeof e=="string"?e:e?.page,r,l;if(d){if(d.includes("#")){const[i,u]=d.split("#");u?l=u:A.warn(`Invalid heading anchor format in sidebar: "${u}". Heading anchors should contain only alphanumeric characters, hyphens, and underscores.`),d=i}if(d=j(d),a.locale&&a.locale!==_){const i=U(v.join(a.locale.toLowerCase(),d));r=n.getRouteBySlug(i)}r||(r=n.getRouteBySlug(d)),r||(r=n.getRouteByFsPath(F(n.contentDir,s,a,d,t.fs)))}const g=r?.metadata;if(e?.$ref){let i=F(n.contentDir,s,a,e.$ref,t.fs);if(a.ref!==void 0&&(i=v.posix.join(a.ref,e.$ref)),!t.fs.exists(i))return await S.panicOnBuildContentError(`Failed to load ${i} file. Make sure sidebar $ref path is correct.`),[];const u=await t.cache.load(i,"yaml"),o=v.dirname(i);return await I(u.data,s,n,t,{...a,navFile:i,ref:o})||[]}if(!r){const i=a.excludedFromLinkCheckerPatterns?.catalog.some(o=>o.test(d||"")),u=a.excludedFromLinkCheckerPatterns?.apiFunctions.some(o=>o.test(d||e.href||""));(u||i)&&(e={...e,href:d||e.href,page:void 0,target:e.target??(u?"_blank":void 0)}),await X(e,a,t,s)}if(r&&!e.disconnect&&!a.ignoreCustomSidebar&&(l||r?.getSidebar)){const i=r.versions?.find(o=>o.active),u=i&&{version:i.version,isDefault:i.default,versionFolderId:i.folderId};if(l){let o=[];if(r.getSidebar&&(o=r.getSidebar(r,{...e,...await y(e,n,t,a)}),o&&o.length>0)){const h=o[0];h&&h.link&&(h.link=`${h.link}#${l}`)}if(!o||o.length===0){let h=e.group||e.label||l;o=[{type:"link",fsPath:r.fsPath,metadata:r.metadata,link:`${r.slug}#${l}`,routeSlug:r.slug,label:h,labelTranslationKey:e.labelTranslationKey,...await y(e,n,t,a),[p]:r[p],[P]:{slug:r.slug,fsPath:r.fsPath},...u}]}return m(o,u,r[p],r[P])}if(r?.getSidebar){const o=r.getSidebar(r,{...e,...await y(e,n,t,a)}),h=e.group&&o?.[0]?.routeSlug===r.slug?o.slice(1):o;return m(a.groupCustomSidebars||e.group?[{type:"group",fsPath:r.fsPath,link:r.slug,routeSlug:r.slug,label:e.group||e.label||await r.getNavText?.()||r.slug,items:h,labelTranslationKey:e.labelTranslationKey,metadata:g,...await y(e,n,t,a)}]:o,u,r[p],r[P])}}if(r&&!e.group){const i=l?`${r.slug}#${l}`:r.slug;let u=e.label||l||"";u||(u=await r.getNavText?.()||r.slug);const o=r.versions?.find(k=>k.active),h=o&&{version:o.version,isDefault:o.default,versionFolderId:o.folderId};return{type:"link",fsPath:r.fsPath,linkedSidebars:e.linkedSidebars,metadata:g,[p]:e?.rbac||r[p],[P]:{slug:r.slug,fsPath:r.fsPath},label:u,labelTranslationKey:e.labelTranslationKey,link:i,items:await I(e.items,s,n,t,a),separatorLine:e.separatorLine,linePosition:e.linePosition,routeSlug:e.disconnect?void 0:i,external:e.external,target:e.target,...await y(e,n,t,a),...h,additionalProps:e.additionalProps}}else if(e?.group){const i=r?.versions?.find(o=>o.active),u=R(a?.navFile);return{type:"group",fsPath:r?.fsPath,linkedSidebars:e.linkedSidebars,metadata:g,version:i?.version||u?.versionName,versionFolderId:i?.folderId||(u?.versionFolderPath?C(u.versionFolderPath):void 0),label:e.group,link:r?.slug,routeSlug:r?.slug,labelTranslationKey:e.groupTranslationKey,items:await I(e.items,s,n,t,a),expanded:e.expanded?e.expanded.toString():void 0,selectFirstItemOnExpand:e.selectFirstItemOnExpand,menuStyle:e.menuStyle,separatorLine:e.separatorLine,linePosition:e.linePosition,...await y(e,n,t,a),[p]:e?.rbac,[P]:{slug:r?.slug||"",fsPath:r?.fsPath||""},additionalProps:e.additionalProps}}else{if(e?.href||e?.label)return{type:"link",metadata:g,link:e.href||"",label:e?.label||e?.href||"",labelTranslationKey:e.labelTranslationKey,external:e.external,target:e.target,separatorLine:e.separatorLine,linePosition:e.linePosition,...await y(e,n,t,a),[p]:e?.rbac,additionalProps:e.additionalProps};if(e?.separator!=null||e?.separatorLine!=null){const i=R(a?.navFile);return{type:"separator",metadata:g,version:i?.versionName,versionFolderId:i?.versionFolderPath?C(i.versionFolderPath):void 0,label:e.separator,labelTranslationKey:e.separatorTranslationKey,separatorLine:e.separatorLine,linePosition:e.linePosition,...await y(e,n,t,a),[p]:e?.rbac,additionalProps:e.additionalProps}}else{const i=R(a?.navFile);return{type:"error",label:`Can't resolve page: ${JSON.stringify(e)}`,version:i?.versionName,versionFolderId:i?.versionFolderPath?C(i.versionFolderPath):void 0}}}}async function X(e,s,n,t){const{href:a,page:f}=e;if(a||!f)return;const d=F(n.fs.cwd,t,s,f,n.fs),r=n.fs.exists(d),l=await n.isPathIgnored(d),g=(r?"The page is ignored: ":"Can't resolve page: ")+f;(!r||l)&&S.reportBrokenLink({type:"BROKEN_LINK",brokenLinkType:"LINK",title:e.label||e.group||"",link:d,rawLink:f,message:g,sourceFileRelativePath:s.navFile,sourceFileLocation:{line:0}})}function F(e,s,n,t="",a){if(n.ref!==void 0)return w(v.relative(e,v.resolve(e,v.join(n.ref,t))));if(t.startsWith("/")){const f=B(s)?q(s):void 0,d=f?`${a.localizationFolder}/${f}/`:"",r=t.slice(1);return B(r)?r:d+w(r)}return w(v.relative(e,v.resolve(e,s,t)))}function Z(e,s){const n={};for(const r of e){const l=v.dirname(r.relativePathFromDirectory),g=r.version?M+r.version:"",i=v.basename(r.relativePathFromDirectory)+g;d(l,r,i)}const t=f(a(n));return T(t,s);function a(r){const l=[];for(const g of Object.keys(r)){const i=r[g];l.push({...i,items:i.items?a(i.items):void 0})}return l}function f(r){return r.sort((l,g)=>{const i=typeof l=="string"?l.toLowerCase():l.relativePathFromDirectory||l.label||"",u=typeof g=="string"?g.toLowerCase():g.relativePathFromDirectory||g.label||"";return i.startsWith("index.")?-1:u.startsWith("index.")?1:i.localeCompare(u,void 0,{numeric:!0})})}function d(r,l,g){r==="."&&(r="");const i=r.split("/").filter(Boolean);let u=n;for(const o of i){const h=o+(l?.version||"");u[h]||(u[h]={type:"group",version:l?.version,label:o,isDefault:l?.isDefault,versionFolderId:l.versionFolderId,items:{}}),u=u[h].items}u[g]=l}}function T(e,s){return e.flatMap(n=>n?.sidebarItems?s.groupCustomSidebars?{...n,items:n.sidebarItems,sidebarItems:void 0,relativePathFromDirectory:void 0}:n.sidebarItems:{...n,items:n.items?T(n.items,s):void 0})}function m(e,s,n,t){return e.map(a=>({...a,...s,[p]:a[p]||n,[P]:a[P]||t,items:a.type==="group"&&a.items?m(a.items,s,n):a.items}))}function ee(e){return e.replace(/@[^\/]+\//,"")}async function ye(e,s,n,t){const a=(e?.items||[]).filter(r=>r.linkedSidebars?.length).map(r=>({...r,items:void 0})),f=await D(a,s.contentDir,s,n,t),d=new Map;for(const r of f)if(r.linkedSidebars?.length)for(const l of r.linkedSidebars){if(d.has(l)){A.warn(`Only one navbar item can belong to sidebar. "${l}" on 'linkedSidebars' property on "${r.label}" will be ignored.`);continue}d.set(l,{label:r.label,link:r.link})}return d}export{ye as collectItemsLinkedToSidebars,N as normalizeItems,K as resolveItem,I as resolveItems,D as resolveLinksFromConfig};
1
+ import*as v from"path";import{REDOCLY_ROUTE_RBAC as b,REDOCLY_TEAMS_RBAC as p}from"@redocly/config";import{VERSION_SEPARATOR as M}from"../constants/common.js";import{DEFAULT_LOCALE_PLACEHOLDER as _}from"../../constants/common.js";import{removeTrailingSlash as j}from"../../utils/url/remove-trailing-slash.js";import{isPrimitive as W}from"../../utils/guards/is-primitive.js";import{slash as w}from"../../utils/path/slash.js";import{isAbsoluteUrl as z}from"../../utils/url/is-absolute-url.js";import{normalizeRouteSlug as U}from"../../utils/path/normalize-route-slug.js";import{parsePathVersions as R}from"../../utils/path/parse-path-versions.js";import{logger as A}from"../tools/notifiers/logger.js";import{reporter as S}from"../tools/notifiers/reporter.js";import{shaDirPathShort as C}from"../utils/crypto/sha-dir-path-short.js";import{copyStaticFile as H,FileNotFoundError as E}from"../utils/fs.js";import{isIconPath as J,resolveAssetPath as Y}from"../utils/index.js";import{resolveSrcSet as G}from"../utils/resolve-src-set.js";import{isL10nPath as B}from"../fs/utils/is-l10n-path.js";import{getLocaleFromRelativePath as q}from"../fs/utils/get-locale-from-relative-path.js";async function D(e,s,n,t,a){if(!e)return;const f={...a,ignoreCustomSidebar:!0};if(W(e)){if(typeof e=="string"){const r=F(n.contentDir,s,a,e,t.fs);if(t.fs.exists(r)){if(n.getRouteByFsPath(r))return K({page:e},s,n,t,f);{const g=t.fs.getFileInfo(r);return g?H(n.contentDir,g.realRelativePath,n.outdir):void 0}}}return e}return Array.isArray(e)?I(N(e),s,n,t,f):Object.fromEntries(await Promise.all(Object.entries(e).map(async([r,l])=>[r,await D(l,s,n,t,a)])))}function N(e){return e.map(s=>({...s,items:s.items?N(s.items):void 0}))}async function I(e,s,n,t,a){if(Array.isArray(e))return(await Promise.all(e.map(f=>K(f,s,n,t,a)))).flatMap(f=>f)}async function P(e,s,n,t){let a,f;if(typeof e.icon=="object"){if("srcSet"in e.icon)try{a=await G(e.icon.srcSet,n.fs,{fromFileRelativePath:t.navFile,contentDir:s.contentDir,outdir:s.outdir})}catch(d){d instanceof E?await S.panicOnBuildContentError(`Cannot resolve "item.icon.srcSet" from ${t.navFile}: ${d.message}`):await S.panicOnBuild(`Cannot resolve "item.icon.srcSet" from ${t.navFile}: ${d.message}`)}}else if(typeof e.icon=="string")if(z(e.icon)||J(e.icon))try{f=await Y(e.icon,n.fs,{fromFileRelativePath:t.navFile,contentDir:s.contentDir,outdir:s.outdir})}catch(d){d instanceof E?await S.panicOnBuildContentError(`Cannot resolve "item.icon" from ${t.navFile}: file ${f} does not exist`):await S.panicOnBuild(`Cannot resolve "item.icon" from ${t.navFile}: ${d.message}`)}else f=e.icon;return{icon:f,srcSet:a}}function Q(e){return s=>{if(s.type==="link"||s.type==="group"){const n=s.metadata;return n?Object.entries(e).every(([t,a])=>Array.isArray(a)?a.some(f=>n[t]===f):n[t]===a):!1}return!0}}async function K(e,s,n,t,a){if(e?.directory&&e.items?.length)return{type:"error",label:`Can't have both "directory" and "items" in the nav item: ${JSON.stringify(e)}`};e?.directory&&e?.group&&(e={...e,directory:void 0,items:[{directory:e.directory}]});const f=e?.directory?F(n.contentDir,s,a,e.directory,t.fs):void 0;if(f!==void 0){const i=f===""?"":f+"/",{locale:u,ignoredRoutes:o}=a;let h=n.getAllRoutesForLocale(u).filter(c=>!o?.has(c.baseSlug||"")&&c.fsPath.startsWith(i)&&!c.excludeFromSidebar).sort((c,y)=>c.fsPath===y.fsPath?0:c.baseSlug.localeCompare(y.baseSlug,void 0,{numeric:!0}));const m=e.includeByMetadata?Q(e.includeByMetadata):Boolean;if(!h.length)return[];const $=(await Promise.all(h.map(async c=>{const y=c.versions?.find(x=>x.active),L=y&&{version:y.version,isDefault:y.default,versionFolderId:y.folderId},V=ee(v.posix.relative(f,c.fsPath)),O=c.getSidebar?.(c);return!a.ignoreCustomSidebar&&O?.length?{type:"group",fsPath:c.fsPath,metadata:c.metadata,link:c.slug,routeSlug:c.slug,label:await c.getNavText?.()||c.slug,[p]:c[p],[b]:c[b],sidebarItems:k(O,L,c[p],c[b]),...L,relativePathFromDirectory:v.relative(f,c.fsPath).replace(/@[^\/]+\//,"")}:{type:"link",fsPath:c.fsPath,metadata:c.metadata,[p]:c[p],[b]:c[b],label:await c.getNavText?.()||c.slug,link:c.slug,routeSlug:c.slug,...L,relativePathFromDirectory:V}}))).filter(m);return e.flatten?T($,a):Z($,a)}let d=typeof e=="string"?e:e?.page,r,l;if(d){if(d.includes("#")){const[i,u]=d.split("#");u?l=u:A.warn(`Invalid heading anchor format in sidebar: "${u}". Heading anchors should contain only alphanumeric characters, hyphens, and underscores.`),d=i}if(d=j(d),a.locale&&a.locale!==_){const i=U(v.join(a.locale.toLowerCase(),d));r=n.getRouteBySlug(i)}r||(r=n.getRouteBySlug(d)),r||(r=n.getRouteByFsPath(F(n.contentDir,s,a,d,t.fs)))}const g=r?.metadata;if(e?.$ref){let i=F(n.contentDir,s,a,e.$ref,t.fs);if(a.ref!==void 0&&(i=v.posix.join(a.ref,e.$ref)),!t.fs.exists(i))return await S.panicOnBuildContentError(`Failed to load ${i} file. Make sure sidebar $ref path is correct.`),[];const u=await t.cache.load(i,"yaml"),o=v.dirname(i);return await I(u.data,s,n,t,{...a,navFile:i,ref:o})||[]}if(!r){const i=a.excludedFromLinkCheckerPatterns?.catalog.some(o=>o.test(d||"")),u=a.excludedFromLinkCheckerPatterns?.apiFunctions.some(o=>o.test(d||e.href||""));(u||i)&&(e={...e,href:d||e.href,page:void 0,target:e.target??(u?"_blank":void 0)}),await X(e,a,t,s)}if(r&&!e.disconnect&&!a.ignoreCustomSidebar&&(l||r?.getSidebar)){const i=r.versions?.find(o=>o.active),u=i&&{version:i.version,isDefault:i.default,versionFolderId:i.folderId};if(l){let o=[];if(r.getSidebar&&(o=r.getSidebar(r,{...e,...await P(e,n,t,a)}),o&&o.length>0)){const h=o[0];h&&h.link&&(h.link=`${h.link}#${l}`)}if(!o||o.length===0){let h=e.group||e.label||l;o=[{type:"link",fsPath:r.fsPath,metadata:r.metadata,link:`${r.slug}#${l}`,routeSlug:r.slug,label:h,labelTranslationKey:e.labelTranslationKey,...await P(e,n,t,a),[p]:r[p],[b]:{slug:r.slug,fsPath:r.fsPath},...u}]}return k(o,u,r[p],r[b])}if(r?.getSidebar){const o=r.getSidebar(r,{...e,...await P(e,n,t,a)}),h=e.group&&o?.[0]?.routeSlug===r.slug?o.slice(1):o;return k(a.groupCustomSidebars||e.group?[{type:"group",fsPath:r.fsPath,link:r.slug,routeSlug:r.slug,label:e.group||e.label||await r.getNavText?.()||r.slug,items:h,labelTranslationKey:e.labelTranslationKey,metadata:g,...await P(e,n,t,a)}]:o,u,r[p],r[b])}}if(r&&!e.group){const i=l?`${r.slug}#${l}`:r.slug;let u=e.label||l||"";u||(u=await r.getNavText?.()||r.slug);const o=r.versions?.find(m=>m.active),h=o&&{version:o.version,isDefault:o.default,versionFolderId:o.folderId};return{type:"link",fsPath:r.fsPath,linkedSidebars:e.linkedSidebars,metadata:g,[p]:e?.rbac||r[p],[b]:{slug:r.slug,fsPath:r.fsPath},label:u,labelTranslationKey:e.labelTranslationKey,link:i,items:await I(e.items,s,n,t,a),separatorLine:e.separatorLine,linePosition:e.linePosition,routeSlug:e.disconnect?void 0:i,external:e.external,target:e.target,badges:e.badges,...await P(e,n,t,a),...h,additionalProps:e.additionalProps}}else if(e?.group){const i=r?.versions?.find(o=>o.active),u=R(a?.navFile);return{type:"group",fsPath:r?.fsPath,linkedSidebars:e.linkedSidebars,metadata:g,version:i?.version||u?.versionName,versionFolderId:i?.folderId||(u?.versionFolderPath?C(u.versionFolderPath):void 0),label:e.group,link:r?.slug,routeSlug:r?.slug,badges:e.badges,labelTranslationKey:e.groupTranslationKey,items:await I(e.items,s,n,t,a),expanded:e.expanded?e.expanded.toString():void 0,selectFirstItemOnExpand:e.selectFirstItemOnExpand,menuStyle:e.menuStyle,separatorLine:e.separatorLine,linePosition:e.linePosition,...await P(e,n,t,a),[p]:e?.rbac,[b]:{slug:r?.slug||"",fsPath:r?.fsPath||""},additionalProps:e.additionalProps}}else{if(e?.href||e?.label)return{type:"link",metadata:g,link:e.href||"",label:e?.label||e?.href||"",labelTranslationKey:e.labelTranslationKey,external:e.external,target:e.target,separatorLine:e.separatorLine,linePosition:e.linePosition,badges:e.badges,...await P(e,n,t,a),[p]:e?.rbac,additionalProps:e.additionalProps};if(e?.separator!=null||e?.separatorLine!=null){const i=R(a?.navFile);return{type:"separator",metadata:g,version:i?.versionName,versionFolderId:i?.versionFolderPath?C(i.versionFolderPath):void 0,label:e.separator,labelTranslationKey:e.separatorTranslationKey,separatorLine:e.separatorLine,linePosition:e.linePosition,...await P(e,n,t,a),[p]:e?.rbac,additionalProps:e.additionalProps}}else{const i=R(a?.navFile);return{type:"error",label:`Can't resolve page: ${JSON.stringify(e)}`,version:i?.versionName,versionFolderId:i?.versionFolderPath?C(i.versionFolderPath):void 0}}}}async function X(e,s,n,t){const{href:a,page:f}=e;if(a||!f)return;const d=F(n.fs.cwd,t,s,f,n.fs),r=n.fs.exists(d),l=await n.isPathIgnored(d),g=(r?"The page is ignored: ":"Can't resolve page: ")+f;(!r||l)&&S.reportBrokenLink({type:"BROKEN_LINK",brokenLinkType:"LINK",title:e.label||e.group||"",link:d,rawLink:f,message:g,sourceFileRelativePath:s.navFile,sourceFileLocation:{line:0}})}function F(e,s,n,t="",a){if(n.ref!==void 0)return w(v.relative(e,v.resolve(e,v.join(n.ref,t))));if(t.startsWith("/")){const f=B(s)?q(s):void 0,d=f?`${a.localizationFolder}/${f}/`:"",r=t.slice(1);return B(r)?r:d+w(r)}return w(v.relative(e,v.resolve(e,s,t)))}function Z(e,s){const n={};for(const r of e){const l=v.dirname(r.relativePathFromDirectory),g=r.version?M+r.version:"",i=v.basename(r.relativePathFromDirectory)+g;d(l,r,i)}const t=f(a(n));return T(t,s);function a(r){const l=[];for(const g of Object.keys(r)){const i=r[g];l.push({...i,items:i.items?a(i.items):void 0})}return l}function f(r){return r.sort((l,g)=>{const i=typeof l=="string"?l.toLowerCase():l.relativePathFromDirectory||l.label||"",u=typeof g=="string"?g.toLowerCase():g.relativePathFromDirectory||g.label||"";return i.startsWith("index.")?-1:u.startsWith("index.")?1:i.localeCompare(u,void 0,{numeric:!0})})}function d(r,l,g){r==="."&&(r="");const i=r.split("/").filter(Boolean);let u=n;for(const o of i){const h=o+(l?.version||"");u[h]||(u[h]={type:"group",version:l?.version,label:o,isDefault:l?.isDefault,versionFolderId:l.versionFolderId,items:{}}),u=u[h].items}u[g]=l}}function T(e,s){return e.flatMap(n=>n?.sidebarItems?s.groupCustomSidebars?{...n,items:n.sidebarItems,sidebarItems:void 0,relativePathFromDirectory:void 0}:n.sidebarItems:{...n,items:n.items?T(n.items,s):void 0})}function k(e,s,n,t){return e.map(a=>({...a,...s,[p]:a[p]||n,[b]:a[b]||t,items:a.type==="group"&&a.items?k(a.items,s,n):a.items}))}function ee(e){return e.replace(/@[^\/]+\//,"")}async function Pe(e,s,n,t){const a=(e?.items||[]).filter(r=>r.linkedSidebars?.length).map(r=>({...r,items:void 0})),f=await D(a,s.contentDir,s,n,t),d=new Map;for(const r of f)if(r.linkedSidebars?.length)for(const l of r.linkedSidebars){if(d.has(l)){A.warn(`Only one navbar item can belong to sidebar. "${l}" on 'linkedSidebars' property on "${r.label}" will be ignored.`);continue}d.set(l,{label:r.label,link:r.link})}return d}export{Pe as collectItemsLinkedToSidebars,N as normalizeItems,K as resolveItem,I as resolveItems,D as resolveLinksFromConfig};
@@ -1 +1 @@
1
- import{simplifyAstStructure as Z}from"@redocly/openapi-docs";import{REDOCLY_TEAMS_RBAC as D}from"@redocly/config";import{OPENAPI_DOCS_TEMPLATE_ID as $,PUBLIC_RBAC_SCOPE_ITEM as j}from"../../../constants/common.js";import{DEPRECATED_PUBLIC_API_DEFINITIONS_FOLDER as ee,PUBLIC_API_DEFINITIONS_FOLDER as te}from"../../constants/common.js";import{OPENAPI_CUSTOM_FIELDS_SERVER_PROPS_GETTER_ID as oe,OPENAPI_SHARED_DATA_PREFIX as U}from"../../constants/plugins/openapi-docs.js";import{isDevelopMode as V}from"../../utils/envs/is-develop-mode.js";import{searchResolver as ae}from"./search/search-resolver.js";import{convertOpenAPIDocs2Sidebar as re,shouldAddRoute as se}from"./utils.js";import{getTemplatePath as b}from"./get-template-path.js";import{storeDefinitionBundles as ne}from"./store-definition-bundles.js";import{definitionLoader as ie,definitionsLoader as pe}from"./load-definition.js";import{getAiDocumentsStore as de}from"./search/get-ai-search-documents.js";import{fromCurrentDir as ce}from"../../utils/paths.js";import{telemetryTraceStep as le}from"../../../cli/telemetry/helpers/trace-step.js";const w="openapi-spec-download";async function ve(){let L=[],A={},M=new Set;return{id:"openapi",requiredEntitlements:["openapi"],loaders:{"load-oas-docs":pe,"load-oas":ie},processContent:async(e,p)=>{await le("build.plugin.openapi_docs",async u=>{e.createRequestHandler(w,ce(import.meta.url,"./spec-download.api.js")),e.addApiRoute({slug:te+"/*",requestHandlerId:w,httpMethod:"all",[D]:j,getStaticData:async()=>({props:{}})}),e.addApiRoute({slug:ee+"/*",requestHandlerId:w,httpMethod:"all",[D]:j,getStaticData:async()=>({props:{}})});const R=e.createTemplate($,b("./template/OpenAPIDocs.js")),a=e.registerServerPropsGetter($,b("./get-server-props.js")),s=e.registerServerPropsGetter(oe,b("./get-server-props-custom-fields.js")),d=await p.getConfig();u?.setAttribute("config",JSON.stringify(d.openapi||{}));const g=d.rules?.["custom-fields-schema"];A={};const m=await e.loadOpenApiDefinitions(p);L=m.map(({markdocChunks:r,relativePath:f,customOutputRelativeFile:i,isVirtual:n,realRelativePath:c})=>({chunks:r,relativePath:f,realRelativePath:c,isVirtual:i!=null||n})),ne(m,e.outdir);const S={};for(const r of m||[]){const{definition:f,config:i,relativePath:n,customOutputRelativeFile:c,contentItems:_,flatItems:k,parser:E,options:B,rawOptions:q,hash:J}=r,N=c||n,o=[],x={},{definition:Q}=E||{},{info:l}=Q||{},O=l?.["x-metadata"],v=!!i.openapi?.excludeFromSearch||!!i.theme?.openapi?.excludeFromSearch||!!d.openapi?.excludeFromSearch||!!d.theme?.openapi?.excludeFromSearch,G={title:l?.title,description:l?.description,summary:l?.summary,...i.metadata,...O},h={untagged:[],tagged:new Map};for(const t of k){const{id:C,href:I,operationDefinition:y}=t;if(y){const{tags:P}=y;if(P)for(const T of P)h.tagged.has(T)||h.tagged.set(T,[]),h.tagged.get(T)?.push(t);else h.untagged.push(t);V()&&(x[`#${y.pointer}`]=t.href)}if(!se({item:t}))continue;const F=t,Y=F.type==="section"&&!!F.infoDefinition,z=I.split("#")[0]+"/",K=t?.operationDefinition?.[D];o.push({excludeFromSearch:v,slugSuffix:z,fsPath:N,metadata:{subType:"openapi-operation"},httpVerb:t?.httpVerb||"",path:n,templateId:R,[D]:K||i.rbac,getAiDocumentsStore:de({parser:E,options:B,info:l,tagOperations:h,openapiContentItem:F,metadata:G,relativePath:n,getSearchFacets:e.getSearchFacets,includeInLLMsTxt:Y,excludeFromSearch:v}),getStaticData:async P=>({props:{dynamicMarkdocComponents:["openapi"],baseSlug:P.baseSlug,seo:t["x-metadata"]?.seo||{title:t.name,description:t.description},itemId:C,disableAutoScroll:!0}})})}o[0]={...o[0],metadata:{type:"openapi",...G},hasClientRoutes:!0,getSidebar:(t,C)=>{const I=[];return re({contentItems:_,sidebarItems:I,routeSlug:t.slug,navItem:C}),I},getNavText:()=>l?.title,getSearchDocuments:ae(E,B,k,e.getSearchFacets,e.setSearchFacets,v)},O?.apiId&&(S[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:g?[a,s]:[a]});const X=V()?n:void 0,H=`${U}${n}`;A[H]={fsPath:N,definition:f,options:q,sourcePath:X,routesMapping:x,hash:J};for(const t of o)e.addRoute({...t,sharedData:[{id:H,key:"openAPIDocsStore"}],serverPropsGetterIds:g?[a,s]:[a]})}e.setGlobalData({apiProducts:S})})},afterRoutesCreated:async(e,p)=>{const u=new Set;for(const{chunks:a,relativePath:s,isVirtual:d,realRelativePath:g}of L){const m=e.getAllRoutes().filter(r=>r.fsPath===s).map(r=>r.slug),S=(await p.cache.load(g,"load-oas")).compoundHash;await p.cache.load(s,{loader:async function(){for(const{node:f,markdown:i,key:n,relativePath:c}of a){const{ast:_}=await e.parseMarkdoc({content:i,relativePath:c,isVirtual:d},p,{sharedDataIds:[`${U}${c}`],routeSlugs:m});f[`x-parsed-md-${n}`]={result:Z(_)}}},name:"openapi-markdoc-inline-parser"},[S]);for(const{pointer:r}of a)u.add(r)}const R=M.difference(u);for(const a of R)p.cache.delete(a);M=u;for(const[a,s]of Object.entries(A))await e.createSharedData(a,{...s,baseSlug:e.getRouteByFsPath(s.fsPath)?.baseSlug},s.hash)}}}export{ve as openAPIDocsPlugin};
1
+ import{simplifyAstStructure as Z}from"@redocly/openapi-docs";import{REDOCLY_TEAMS_RBAC as D}from"@redocly/config";import{OPENAPI_DOCS_TEMPLATE_ID as $,PUBLIC_RBAC_SCOPE_ITEM as j}from"../../../constants/common.js";import{DEPRECATED_PUBLIC_API_DEFINITIONS_FOLDER as ee,PUBLIC_API_DEFINITIONS_FOLDER as te}from"../../constants/common.js";import{OPENAPI_CUSTOM_FIELDS_SERVER_PROPS_GETTER_ID as oe,OPENAPI_SHARED_DATA_PREFIX as U}from"../../constants/plugins/openapi-docs.js";import{envConfig as V}from"../../../config/env-config.js";import{searchResolver as ae}from"./search/search-resolver.js";import{convertOpenAPIDocs2Sidebar as re,shouldAddRoute as se}from"./utils.js";import{getTemplatePath as b}from"./get-template-path.js";import{storeDefinitionBundles as ne}from"./store-definition-bundles.js";import{definitionLoader as ie,definitionsLoader as pe}from"./load-definition.js";import{getAiDocumentsStore as de}from"./search/get-ai-search-documents.js";import{fromCurrentDir as ce}from"../../utils/paths.js";import{telemetryTraceStep as le}from"../../../cli/telemetry/helpers/trace-step.js";const w="openapi-spec-download";async function Ce(){let M=[],A={},L=new Set;return{id:"openapi",requiredEntitlements:["openapi"],loaders:{"load-oas-docs":pe,"load-oas":ie},processContent:async(e,p)=>{await le("build.plugin.openapi_docs",async u=>{e.createRequestHandler(w,ce(import.meta.url,"./spec-download.api.js")),e.addApiRoute({slug:te+"/*",requestHandlerId:w,httpMethod:"all",[D]:j,getStaticData:async()=>({props:{}})}),e.addApiRoute({slug:ee+"/*",requestHandlerId:w,httpMethod:"all",[D]:j,getStaticData:async()=>({props:{}})});const R=e.createTemplate($,b("./template/OpenAPIDocs.js")),a=e.registerServerPropsGetter($,b("./get-server-props.js")),s=e.registerServerPropsGetter(oe,b("./get-server-props-custom-fields.js")),d=await p.getConfig();u?.setAttribute("config",JSON.stringify(d.openapi||{}));const g=d.rules?.["custom-fields-schema"];A={};const m=await e.loadOpenApiDefinitions(p);M=m.map(({markdocChunks:r,relativePath:f,customOutputRelativeFile:i,isVirtual:n,realRelativePath:c})=>({chunks:r,relativePath:f,realRelativePath:c,isVirtual:i!=null||n})),ne(m,e.outdir);const S={};for(const r of m||[]){const{definition:f,config:i,relativePath:n,customOutputRelativeFile:c,contentItems:_,flatItems:k,parser:E,options:B,rawOptions:q,hash:J}=r,N=c||n,o=[],x={},{definition:Q}=E||{},{info:l}=Q||{},v=l?.["x-metadata"],C=!!i.openapi?.excludeFromSearch||!!i.theme?.openapi?.excludeFromSearch||!!d.openapi?.excludeFromSearch||!!d.theme?.openapi?.excludeFromSearch,G={title:l?.title,description:l?.description,summary:l?.summary,...i.metadata,...v},h={untagged:[],tagged:new Map};for(const t of k){const{id:O,href:I,operationDefinition:y}=t;if(y){const{tags:P}=y;if(P)for(const T of P)h.tagged.has(T)||h.tagged.set(T,[]),h.tagged.get(T)?.push(t);else h.untagged.push(t);V.isDevelopMode&&(x[`#${y.pointer}`]=t.href)}if(!se({item:t}))continue;const F=t,Y=F.type==="section"&&!!F.infoDefinition,z=I.split("#")[0]+"/",K=t?.operationDefinition?.[D];o.push({excludeFromSearch:C,slugSuffix:z,fsPath:N,metadata:{subType:"openapi-operation"},httpVerb:t?.httpVerb||"",path:n,templateId:R,[D]:K||i.rbac,getAiDocumentsStore:de({parser:E,options:B,info:l,tagOperations:h,openapiContentItem:F,metadata:G,relativePath:n,getSearchFacets:e.getSearchFacets,includeInLLMsTxt:Y,excludeFromSearch:C}),getStaticData:async P=>({props:{dynamicMarkdocComponents:["openapi"],baseSlug:P.baseSlug,seo:t["x-metadata"]?.seo||{title:t.name,description:t.description},itemId:O,disableAutoScroll:!0}})})}o[0]={...o[0],metadata:{type:"openapi",...G},hasClientRoutes:!0,getSidebar:(t,O)=>{const I=[];return re({contentItems:_,sidebarItems:I,routeSlug:t.slug,navItem:O}),I},getNavText:()=>l?.title,getSearchDocuments:ae(E,B,k,e.getSearchFacets,e.setSearchFacets,C)},v?.apiId&&(S[v.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:g?[a,s]:[a]});const X=V.isDevelopMode?n:void 0,H=`${U}${n}`;A[H]={fsPath:N,definition:f,options:q,sourcePath:X,routesMapping:x,hash:J};for(const t of o)e.addRoute({...t,sharedData:[{id:H,key:"openAPIDocsStore"}],serverPropsGetterIds:g?[a,s]:[a]})}e.setGlobalData({apiProducts:S})})},afterRoutesCreated:async(e,p)=>{const u=new Set;for(const{chunks:a,relativePath:s,isVirtual:d,realRelativePath:g}of M){const m=e.getAllRoutes().filter(r=>r.fsPath===s).map(r=>r.slug),S=(await p.cache.load(g,"load-oas")).compoundHash;await p.cache.load(s,{loader:async function(){for(const{node:f,markdown:i,key:n,relativePath:c}of a){const{ast:_}=await e.parseMarkdoc({content:i,relativePath:c,isVirtual:d},p,{sharedDataIds:[`${U}${c}`],routeSlugs:m});f[`x-parsed-md-${n}`]={result:Z(_)}}},name:"openapi-markdoc-inline-parser"},[S]);for(const{pointer:r}of a)u.add(r)}const R=L.difference(u);for(const a of R)p.cache.delete(a);L=u;for(const[a,s]of Object.entries(A))await e.createSharedData(a,{...s,baseSlug:e.getRouteByFsPath(s.fsPath)?.baseSlug},s.hash)}}}export{Ce as openAPIDocsPlugin};
@@ -13,6 +13,6 @@ export declare function joinWithSeparator(base?: string, path?: string, sep?: st
13
13
  export declare function parsePartials(partials?: Record<string, any>): Record<string, Node | Node[]> | undefined;
14
14
  export declare function usePatchedStore(storeJs: OpenAPIDocsStore, { markdown, baseSlug }: PageProps): OpenAPIDocsStore;
15
15
  export declare function safeParseFunction(fnInput: EventFunctionInput): ((event: EventType) => void) | null;
16
- export declare function mergeEvents(userFunction: ((event: EventType) => void) | null, telemetryEvent?: AsyncApiRealmUI.GetEventData<'openapi_docs'>['eventType']): (event: EventType) => void;
16
+ export declare function mergeEvents(userFunction: ((event: EventType) => void) | null, telemetryEvent?: AsyncApiRealmUI.GetEventData<'openapi_docs'>[number]['eventType']): (event: EventType) => void;
17
17
  export {};
18
18
  //# sourceMappingURL=helpers.d.ts.map
@@ -1,5 +1,5 @@
1
- import{useMemo as u}from"react";import{components as l}from"@redocly-markdoc/components";import{Ast as f}from"@markdoc/markdoc";import{PageNavigation as g}from"@redocly/theme/components/PageNavigation/PageNavigation";import{tags as d,components as h}from"@redocly/theme/markdoc/default";import{Breadcrumbs as _}from"@redocly/theme/components/Breadcrumbs/Breadcrumbs";import{withPathPrefix as m}from"@redocly/theme/core/utils";import{OPENAPI_DOCS_TEMPLATE_ID as y,ServerRoutes as w}from"../../../../constants/common.js";import{isBrowser as P}from"../../../../utils/env/is-browser.js";import*as S from"../../markdown/markdoc/custom-components/index.js";import*as v from"../../markdown/markdoc/nodes/index.js";import O from"../../markdown/markdoc/tags/index.js";import{usePageData as C,useSidebarSiblingsData as A}from"../../../../client/providers/page-data/hooks";import{telemetry as E}from"../../../../client/app/telemetry/index.js";import{getMockServerDocsConfig as T}from"./mock-server-config";function V(t="",r="",o="/"){return t.endsWith(o)&&(t=t.slice(0,-o.length)),r.startsWith(o)&&(r=r.slice(o.length)),!t||!r?t+r:t+o+r}function b(t){if(t)return Object.entries(t).reduce((r,[o,e])=>(r[o]=f.fromJSON(JSON.stringify(e)),r),{})}function Y(t,{markdown:r,baseSlug:o}){return u(()=>{const n=P();t.options.oAuth2RedirectURI=n?`${window.location.origin}${m(w.REPLAY_OAUTH2_CALLBACK)}`:null,t.options.routingBasePath=m(o),t.options.mockServer=T(t.options.mockServer,o),t.options.scrollYOffset=n?parseInt(getComputedStyle(document.documentElement).getPropertyValue("--navbar-height"),10):0,t.options.markdocOptions={tags:{...O,...d},nodes:{...v},components:{...S,...h,...l,...globalThis.__LOADER.markdocComponents},...r,partials:b(r?.partials)},t.options.unstable_hooks={...t.options.unstable_hooks,MiddlePanelFooter:()=>{const{templateId:i}=C()||{},{nextPage:s,prevPage:a}=A()||{};return i===y?null:g({nextPage:s,prevPage:a})},MiddlePanelHeader:()=>_({})};const p={codeSamplesLanguageSwitch:"samples_language_switch",codeSamplesCopy:"code_samples_copy",panelToggle:"panel_toggle",targetServerSwitch:"target_server_switch",tryItOpen:"try_it_toggle",tryItSent:"try_it_sent"},c={};for(const[i,s]of Object.entries(p)){const a=F(t.options.events?.[i]);c[i]=I(a,s)}return t.options.events=c,t},[t,r,o])}function F(t){if(typeof window>"u")return null;if(typeof t=="function")return t;if(typeof t!="string")return null;try{const r=t.trim();if(!r.match(/^(\([^)]*\)\s*=>\s*.+|[a-zA-Z_$][\w$]*\s*=>\s*.+)$/))throw new Error("Invalid function format. Only arrow functions allowed.");if(["eval","Function","constructor","prototype","__proto__","import","require","process","global","window","document"].some(n=>r.includes(n)))throw new Error("Function contains prohibited keywords");return new Function("event",`
1
+ import{useMemo as u}from"react";import{components as l}from"@redocly-markdoc/components";import{Ast as f}from"@markdoc/markdoc";import{PageNavigation as d}from"@redocly/theme/components/PageNavigation/PageNavigation";import{tags as g,components as _}from"@redocly/theme/markdoc/default";import{Breadcrumbs as h}from"@redocly/theme/components/Breadcrumbs/Breadcrumbs";import{withPathPrefix as m}from"@redocly/theme/core/utils";import{OPENAPI_DOCS_TEMPLATE_ID as y,ServerRoutes as w}from"../../../../constants/common.js";import{isBrowser as P}from"../../../../utils/env/is-browser.js";import*as S from"../../markdown/markdoc/custom-components/index.js";import*as v from"../../markdown/markdoc/nodes/index.js";import O from"../../markdown/markdoc/tags/index.js";import{usePageData as C,useSidebarSiblingsData as A}from"../../../../client/providers/page-data/hooks";import{telemetry as E}from"../../../../client/app/telemetry/index.js";import{getMockServerDocsConfig as T}from"./mock-server-config";function V(t="",e="",o="/"){return t.endsWith(o)&&(t=t.slice(0,-o.length)),e.startsWith(o)&&(e=e.slice(o.length)),!t||!e?t+e:t+o+e}function b(t){if(t)return Object.entries(t).reduce((e,[o,r])=>(e[o]=f.fromJSON(JSON.stringify(r)),e),{})}function Y(t,{markdown:e,baseSlug:o}){return u(()=>{const n=P();t.options.oAuth2RedirectURI=n?`${window.location.origin}${m(w.REPLAY_OAUTH2_CALLBACK)}`:null,t.options.routingBasePath=m(o),t.options.mockServer=T(t.options.mockServer,o),t.options.scrollYOffset=n?parseInt(getComputedStyle(document.documentElement).getPropertyValue("--navbar-height"),10):0,t.options.markdocOptions={tags:{...O,...g},nodes:{...v},components:{...S,..._,...l,...globalThis.__LOADER.markdocComponents},...e,partials:b(e?.partials)},t.options.unstable_hooks={...t.options.unstable_hooks,MiddlePanelFooter:()=>{const{templateId:i}=C()||{},{nextPage:s,prevPage:a}=A()||{};return i===y?null:d({nextPage:s,prevPage:a})},MiddlePanelHeader:()=>h({})};const p={codeSamplesLanguageSwitch:"samples_language_switch",codeSamplesCopy:"code_samples_copy",panelToggle:"panel_toggle",targetServerSwitch:"target_server_switch",tryItOpen:"try_it_toggle",tryItSent:"try_it_sent"},c={};for(const[i,s]of Object.entries(p)){const a=F(t.options.events?.[i]);c[i]=I(a,s)}return t.options.events=c,t},[t,e,o])}function F(t){if(typeof window>"u")return null;if(typeof t=="function")return t;if(typeof t!="string")return null;try{const e=t.trim();if(!e.match(/^(\([^)]*\)\s*=>\s*.+|[a-zA-Z_$][\w$]*\s*=>\s*.+)$/))throw new Error("Invalid function format. Only arrow functions allowed.");if(["eval","Function","constructor","prototype","__proto__","import","require","process","global","window","document"].some(n=>e.includes(n)))throw new Error("Function contains prohibited keywords");return new Function("event",`
2
2
  'use strict';
3
- const userFn = ${r};
3
+ const userFn = ${e};
4
4
  return userFn(event);
5
- `)}catch(r){return console.error("Function parsing error:",r),null}}function I(t,r){return o=>{if(t)try{t(o)}catch(e){console.error("User event handler error:",e)}if(r)try{E.sendOpenapiDocsMessage({eventType:r,operationHttpVerb:o.operationHttpVerb,operationPath:o.operationPath,lang:"lang"in o?o.lang:void 0,action:o.action,state:"state"in o?o.state:void 0,serverUrl:"serverUrl"in o?o.serverUrl:void 0})}catch{}}}export{V as joinWithSeparator,I as mergeEvents,b as parsePartials,F as safeParseFunction,Y as usePatchedStore};
5
+ `)}catch(e){return console.error("Function parsing error:",e),null}}function I(t,e){return o=>{if(t)try{t(o)}catch(r){console.error("User event handler error:",r)}if(e)try{E.sendOpenapiDocsMessage([{object:"openapi_docs",eventType:e,operationHttpVerb:o.operationHttpVerb,operationPath:o.operationPath,lang:"lang"in o?o.lang:void 0,action:o.action,state:"state"in o?o.state:void 0,serverUrl:"serverUrl"in o?o.serverUrl:void 0}])}catch{}}}export{V as joinWithSeparator,I as mergeEvents,b as parsePartials,F as safeParseFunction,Y as usePatchedStore};
@@ -1 +1 @@
1
- import{writeFileSync as h}from"node:fs";import D from"path";import{SCORECARD_OUTPUT_FILE_NAME as b}from"../../constants/common.js";import{mapObject as T}from"../../../utils/object/map-object.js";import{readEnvVariable as w}from"../../utils/envs/read-env-variable.js";import{removeLeadingSlash as A}from"../../../utils/url/remove-leading-slash.js";import{combineUrls as O}from"@redocly/theme/core/utils";import{logger as j}from"../../tools/notifiers/logger.js";import{getRouteSlugToCatalogSlugMap as F}from"../../utils/catalog-classic/get-route-slug-to-catalog-slug-map.js";import{deepEqual as I}from"../../../utils/object/deep-equal.js";import{ensureDir as N}from"../../utils/index.js";import{getTemplatePath as U}from"./get-template-path.js";import{getAllRuleNames as q}from"./lint.js";import{getScorecardConfig as L}from"./get-scorecard-config.js";import{CUSTOM_FIELDS_SERVER_PROPS_GETTER_ID as M}from"../catalog-classic/index.js";import{getScorecardSlug as k}from"./shared-utils.js";import{scorecardConfigLoader as W}from"./loaders/scorecard-config.js";import{scorecardLoader as B}from"./loaders/scorecard.js";import{computeScorecard as J}from"./compute-scorecard.js";import{telemetryTraceStep as $}from"../../../cli/telemetry/helpers/trace-step.js";const G="scorecardClassic";let u={},R={};async function ue({id:P,requiredEntitlements:_,loadersPrefix:v=""}){let p=null,y=null,E=!1;return{id:P??"scorecardClassic",requiredEntitlements:_??["scorecard"],loaders:{[`${v}scorecard-config`]:W,[`${v}scorecard`]:B},async processContent(r,l){await $("build.plugin.scorecard_classic",async S=>{const a=r.createTemplate(G,U("./template/index.js")),g=await l.getConfig(),m=L(g),f=g?.reunite??{},i=[()=>p===null,()=>!I(u,m),()=>!I(R,f)].some(e=>e());u=m,S?.setAttribute("config",JSON.stringify(u||{})),R=f;const n=g.catalogClassic??{},c=u.levels||[];if(c.length<1)throw Error("Invalid configuration of levels config");i&&(p=await J({actions:r,context:l,scorecardConfig:u,reuniteConfig:R}));const{data:{configs:t}}=await l.cache.load("",`${v}scorecard-config`),{perLevel:d,all:s}=q(t);y={levelNames:c.map(e=>e.name),rules:s,rulesPerLevel:d};for(const[e,o]of Object.entries(n)){const C=O(o.slug,"scorecard/");r.addRoute({duplicateInAllLocales:!0,slug:C,fsPath:O(o.slug,"scorecard/"),templateId:a,hasClientRoutes:!0,excludeFromSidebar:!0,serverPropsGetterIds:[M],sharedData:[{id:"scorecard",key:"scorecard"},{key:"catalog",id:"catalog-"+e}],getNavText:()=>Promise.resolve(o.title||"API design scorecard"),getStaticData:async()=>({props:{catalogId:e,catalogConfig:{...o,items:void 0},scorecardConfig:u,scorecardInfo:y}})})}})},afterRoutesCreated:async(r,l)=>{const S=await l.getConfig(),a=S.catalogClassic??{},g=L(S);if(Object.keys(a).length){const i=Object.keys(a).length>1?await F(r,l,a):null,n={};for(const[c,t]of Object.entries(p||{})){const d=r.getRouteByFsPath(c),s=d?.slug;if(s){if(d&&!g.ignoreMetadata){const e=i?i.get(s)??Object.values(a)[0].slug:Object.values(a)[0].slug,o=O(e,"scorecard/");d.metadata={...d.metadata,scorecardStatus:t.status,scorecardLevel:t.scorecardLevel,scorecardLevelIdx:t.scorecardLevelIdx,scorecardLevels:T(t.levels,C=>({uniqueErrors:C.uniqueErrors,uniqueWarnings:C.uniqueWarnings})),scoreCardSlug:o+"apis/"+encodeURIComponent(A(s))}}if(n[s]={...t,levels:T(t.levels,e=>({...e,problems:e.problems.map(o=>({ruleId:o.ruleId,severity:o.severity}))}))},!E){const e=D.resolve(r.outdir,"_scorecard",k(s));h(N(e),JSON.stringify(t))}}}await r.createSharedData("scorecard",n)}const m={};for(const[i,n]of Object.entries(p||{})){const c=r.getRouteByFsPath(i)?.slug;c&&(m[c]=n)}const f=w("REDOCLY_METADATA_OUTPUT_FOLDER");!E&&f&&(j.info("Writing scorecard data..."),h(D.join(f,b),JSON.stringify({scorecardData:m,...y}))),E=!0}}}export{ue as scorecardClassicPlugin};
1
+ import{writeFileSync as E}from"node:fs";import D from"path";import{SCORECARD_OUTPUT_FILE_NAME as b}from"../../constants/common.js";import{mapObject as T}from"../../../utils/object/map-object.js";import{envConfig as w}from"../../../config/env-config.js";import{removeLeadingSlash as A}from"../../../utils/url/remove-leading-slash.js";import{combineUrls as R}from"@redocly/theme/core/utils";import{logger as j}from"../../tools/notifiers/logger.js";import{getRouteSlugToCatalogSlugMap as F}from"../../utils/catalog-classic/get-route-slug-to-catalog-slug-map.js";import{deepEqual as I}from"../../../utils/object/deep-equal.js";import{ensureDir as N}from"../../utils/index.js";import{getTemplatePath as U}from"./get-template-path.js";import{getAllRuleNames as q}from"./lint.js";import{getScorecardConfig as L}from"./get-scorecard-config.js";import{CUSTOM_FIELDS_SERVER_PROPS_GETTER_ID as M}from"../catalog-classic/index.js";import{getScorecardSlug as k}from"./shared-utils.js";import{scorecardConfigLoader as W}from"./loaders/scorecard-config.js";import{scorecardLoader as B}from"./loaders/scorecard.js";import{computeScorecard as J}from"./compute-scorecard.js";import{telemetryTraceStep as $}from"../../../cli/telemetry/helpers/trace-step.js";const G="scorecardClassic";let u={},h={};async function ue({id:P,requiredEntitlements:_,loadersPrefix:v=""}){let p=null,y=null,O=!1;return{id:P??"scorecardClassic",requiredEntitlements:_??["scorecard"],loaders:{[`${v}scorecard-config`]:W,[`${v}scorecard`]:B},async processContent(r,l){await $("build.plugin.scorecard_classic",async S=>{const a=r.createTemplate(G,U("./template/index.js")),g=await l.getConfig(),m=L(g),f=g?.reunite??{},i=[()=>p===null,()=>!I(u,m),()=>!I(h,f)].some(e=>e());u=m,S?.setAttribute("config",JSON.stringify(u||{})),h=f;const n=g.catalogClassic??{},c=u.levels||[];if(c.length<1)throw Error("Invalid configuration of levels config");i&&(p=await J({actions:r,context:l,scorecardConfig:u,reuniteConfig:h}));const{data:{configs:t}}=await l.cache.load("",`${v}scorecard-config`),{perLevel:d,all:s}=q(t);y={levelNames:c.map(e=>e.name),rules:s,rulesPerLevel:d};for(const[e,o]of Object.entries(n)){const C=R(o.slug,"scorecard/");r.addRoute({duplicateInAllLocales:!0,slug:C,fsPath:R(o.slug,"scorecard/"),templateId:a,hasClientRoutes:!0,excludeFromSidebar:!0,serverPropsGetterIds:[M],sharedData:[{id:"scorecard",key:"scorecard"},{key:"catalog",id:"catalog-"+e}],getNavText:()=>Promise.resolve(o.title||"API design scorecard"),getStaticData:async()=>({props:{catalogId:e,catalogConfig:{...o,items:void 0},scorecardConfig:u,scorecardInfo:y}})})}})},afterRoutesCreated:async(r,l)=>{const S=await l.getConfig(),a=S.catalogClassic??{},g=L(S);if(Object.keys(a).length){const i=Object.keys(a).length>1?await F(r,l,a):null,n={};for(const[c,t]of Object.entries(p||{})){const d=r.getRouteByFsPath(c),s=d?.slug;if(s){if(d&&!g.ignoreMetadata){const e=i?i.get(s)??Object.values(a)[0].slug:Object.values(a)[0].slug,o=R(e,"scorecard/");d.metadata={...d.metadata,scorecardStatus:t.status,scorecardLevel:t.scorecardLevel,scorecardLevelIdx:t.scorecardLevelIdx,scorecardLevels:T(t.levels,C=>({uniqueErrors:C.uniqueErrors,uniqueWarnings:C.uniqueWarnings})),scoreCardSlug:o+"apis/"+encodeURIComponent(A(s))}}if(n[s]={...t,levels:T(t.levels,e=>({...e,problems:e.problems.map(o=>({ruleId:o.ruleId,severity:o.severity}))}))},!O){const e=D.resolve(r.outdir,"_scorecard",k(s));E(N(e),JSON.stringify(t))}}}await r.createSharedData("scorecard",n)}const m={};for(const[i,n]of Object.entries(p||{})){const c=r.getRouteByFsPath(i)?.slug;c&&(m[c]=n)}const f=w.REDOCLY_METADATA_OUTPUT_FOLDER;!O&&f&&(j.info("Writing scorecard data..."),E(D.join(f,b),JSON.stringify({scorecardData:m,...y}))),O=!0}}}export{ue as scorecardClassicPlugin};
@@ -1 +1 @@
1
- import{SCORECARDS_BASE_SLUG as a,SCORECARDS_TEMPLATE_ID as i}from"../../constants/plugins/scorecards.js";import{getTemplatePath as n}from"./utils/get-template-path.js";import{telemetryTraceStep as d}from"../../../cli/telemetry/helpers/trace-step.js";async function l(){return{id:"Scorecards",requiredEntitlements:["scorecards"],async processContent(e,r){await d("build.plugin.scorecards",async o=>{if(process.env.NEW_SCORECARDS_ENABLED!=="true")return;const t=(await r.getConfig()).scorecards;o?.setAttribute("config",JSON.stringify(t));const{logger:s}=r;s.info("Scorecards plugin started");const c=e.createTemplate(i,n("../template/index.js"));e.addRoute({duplicateInAllLocales:!0,slug:a,fsPath:"",templateId:c,excludeFromSidebar:!0,hasClientRoutes:!0,getNavText:()=>Promise.resolve("Scorecards"),getStaticData:async()=>({props:{scorecardsConfig:t}})}),s.info("Scorecards plugin finished")})}}}var S=l;export{S as default,l as scorecardsPlugin};
1
+ import{envConfig as c}from"../../../config/env-config.js";import{SCORECARDS_BASE_SLUG as i,SCORECARDS_TEMPLATE_ID as n}from"../../constants/plugins/scorecards.js";import{getTemplatePath as d}from"./utils/get-template-path.js";import{telemetryTraceStep as l}from"../../../cli/telemetry/helpers/trace-step.js";async function u(){return{id:"Scorecards",requiredEntitlements:["scorecards"],async processContent(e,r){await l("build.plugin.scorecards",async s=>{if(c.NEW_SCORECARDS_ENABLED!=="true")return;const t=(await r.getConfig()).scorecards;s?.setAttribute("config",JSON.stringify(t));const{logger:o}=r;o.info("Scorecards plugin started");const a=e.createTemplate(n,d("../template/index.js"));e.addRoute({duplicateInAllLocales:!0,slug:i,fsPath:"",templateId:a,excludeFromSidebar:!0,hasClientRoutes:!0,getNavText:()=>Promise.resolve("Scorecards"),getStaticData:async()=>({props:{scorecardsConfig:t}})}),o.info("Scorecards plugin finished")})}}}var C=u;export{C as default,u as scorecardsPlugin};
@@ -1 +1 @@
1
- import{SCORECARDS_WORKER_KEY as u,scorecardsWorker as f}from"../../../workers/scorecards-worker-pool.js";import{logger as e}from"../../../tools/notifiers/logger.js";const o=5;async function n(c){const{baseDbDir:s,scorecardsConfig:a,attempt:t}=c;try{const r=await f.exec(u,[{baseDbDir:s,scorecardsConfig:a,pollingIntervalMs:parseInt(process.env.SCORECARDS_POLLING_INTERVAL_MS||"3000",10)}]);if(r.success)return e.info(`${r.message}`),Promise.resolve();e.error(`Execute Scorecards Worker: failed (attempt ${t}/${o}): ${r.error}`)}catch(r){const i=r instanceof Error?r.message:String(r);e.error(`Execute Scorecards Worker: failed (attempt ${t}/${o}): ${i}`)}return t<o?(e.info(`Execute Scorecards Worker: retrying... (attempt ${t+1}/${o})`),n({baseDbDir:s,scorecardsConfig:a,attempt:t+1})):(e.error(`Execute Scorecards Worker: failed. Scorecards Worker could not be started after all ${o} attempts`),Promise.resolve())}async function S(c,s){return e.info("Start Scorecards Worker: executing..."),n({baseDbDir:c,scorecardsConfig:s,attempt:1})}export{S as runScorecardsWorker};
1
+ import{SCORECARDS_WORKER_KEY as f,scorecardsWorker as m}from"../../../workers/scorecards-worker-pool.js";import{logger as e}from"../../../tools/notifiers/logger.js";import{envConfig as u}from"../../../../config/env-config.js";const o=5;async function n(s){const{baseDbDir:c,scorecardsConfig:a,attempt:t}=s;try{const r=await m.exec(f,[{baseDbDir:c,scorecardsConfig:a,pollingIntervalMs:parseInt(u.SCORECARDS_POLLING_INTERVAL_MS||"3000",10)}]);if(r.success)return e.info(`${r.message}`),Promise.resolve();e.error(`Execute Scorecards Worker: failed (attempt ${t}/${o}): ${r.error}`)}catch(r){const i=r instanceof Error?r.message:String(r);e.error(`Execute Scorecards Worker: failed (attempt ${t}/${o}): ${i}`)}return t<o?(e.info(`Execute Scorecards Worker: retrying... (attempt ${t+1}/${o})`),n({baseDbDir:c,scorecardsConfig:a,attempt:t+1})):(e.error(`Execute Scorecards Worker: failed. Scorecards Worker could not be started after all ${o} attempts`),Promise.resolve())}async function p(s,c){return e.info("Start Scorecards Worker: executing..."),n({baseDbDir:s,scorecardsConfig:c,attempt:1})}export{p as runScorecardsWorker};
@@ -1 +1 @@
1
- import p from"node:path";import{existsSync as b}from"node:fs";import{writeFile as D,access as v,rm as N,constants as X}from"fs/promises";import{REDOCLY_ROUTE_RBAC as S,REDOCLY_TEAMS_RBAC as R}from"@redocly/config";import $ from"picomatch";import{DEFAULT_LOCALE_PLACEHOLDER as _}from"../../../../constants/common.js";import{AI_INDEX_EXPORT_FOLDER as j}from"../../../constants/plugins/search.js";import{LLMS_TXT_FILE_NAME as k}from"../../../constants/common.js";import{isBuildMode as B}from"../../../utils/envs/is-build-mode.js";import{logger as a}from"../../../tools/notifiers/logger.js";import{shaHexShort as G}from"../../../utils/crypto/sha-hex-short.js";import{promiseMapLimit as M}from"../../../utils/async/promise-map-limit.js";import{ensureDir as A}from"../../../utils/fs.js";import{isResourcePubliclyAccessible as H,extractTeamsFromScopeItems as U,getRbacTeamsListForResource as Y}from"../../../utils/rbac.js";import{validateLLMsTxtConfig as J,generateLLMsTxt as K,getLLMsTxtMdSlug as V}from"../llmstxt/index.js";const P=20,h="llms.txt:";async function pt(t,i,{aiSearchEnabled:e,llmstxtEnabled:r}){const s=p.join(t.outdir,k);if(!r){try{await v(s,X.W_OK),await N(s)}catch{}if(!e)return}e&&a.info("Preparing AI search documents..."),r&&a.info(`${h} Generating llms.txt files...`);const L=a.startTiming(),c=a.startTiming(),f=t.getGlobalConfig("seo"),l=f?.llmstxt,T=p.resolve(t.outdir,j),u=t.getConfig(),w=u.rbac??{},C=t.getAllRoutes(),F=u?.l10n?.defaultLocale||u?.i18n?.defaultLocale||_,I=(l?.excludeFiles||[]).map(o=>$(o)),d=[];if(await M(C,P,async o=>{if(o.excludeFromSearch)return;const O=await W(o,t),x=await q(o,O,i,t);if(x){if(r)for(const n of await x.getLLMsTxts()){if(I.some(m=>m(n.fsPath)))continue;const g=p.join(t.outdir,V(n.slug));A(g),await D(g,n.content),n.includeInLLMsTxt&&H(o,u)&&d.push(n)}if(e&&B()){const n=await x.getSearchDocuments();if(!n.length)return;const g=z(o,w),m=o.versions?.find(({active:E})=>E),y=m&&{folder:m.folderId,label:m.label,default:m.default};await Q(n,o.fsPath,g,T,F,y)}}}),e&&a.infoTime(c,"AI search documents prepared"),d.length)try{J(l);const o=await K(d,l,{title:f?.title,description:f?.description},i);A(s),await D(s,o),a.infoTime(L,`${h} files generated`)}catch(o){a.error(`${h} Failed to generate llms.txt file. ${o.message}`)}}async function W(t,i){return t.getStaticData?t.getStaticData(t,{...i,contentDir:i.contentDir,parseMarkdoc:(e,r,s)=>i.parseMarkdoc(e,r,s)}):{}}async function q(t,i,e,r){if(t.getAiDocumentsStore)return t.getAiDocumentsStore(t,{...i,[R]:t[R],[S]:t[S]},e,r)}function z(t,i){const e=U(t?.[R]);return e?.length?e:Y(t,i)}async function Q(t,i,e,r,s,L){await M(t,P,async c=>{const f=`${G(i+c.content)}.json`,l=A(p.join(r,f)),T=c.locale===_?s:c.locale;b(l)||await D(l,JSON.stringify({...c,rbacTeams:e||[],version:L,locale:T}),"utf-8")})}export{pt as prepareAiSearchDocuments};
1
+ import p from"node:path";import{existsSync as b}from"node:fs";import{writeFile as D,access as v,rm as N,constants as X}from"fs/promises";import{REDOCLY_ROUTE_RBAC as S,REDOCLY_TEAMS_RBAC as R}from"@redocly/config";import $ from"picomatch";import{DEFAULT_LOCALE_PLACEHOLDER as _}from"../../../../constants/common.js";import{AI_INDEX_EXPORT_FOLDER as j}from"../../../constants/plugins/search.js";import{LLMS_TXT_FILE_NAME as k}from"../../../constants/common.js";import{envConfig as B}from"../../../../config/env-config.js";import{logger as a}from"../../../tools/notifiers/logger.js";import{shaHexShort as G}from"../../../utils/crypto/sha-hex-short.js";import{promiseMapLimit as C}from"../../../utils/async/promise-map-limit.js";import{ensureDir as A}from"../../../utils/fs.js";import{isResourcePubliclyAccessible as H,extractTeamsFromScopeItems as U,getRbacTeamsListForResource as Y}from"../../../utils/rbac.js";import{validateLLMsTxtConfig as J,generateLLMsTxt as K,getLLMsTxtMdSlug as V}from"../llmstxt/index.js";const M=20,h="llms.txt:";async function pt(t,i,{aiSearchEnabled:e,llmstxtEnabled:r}){const s=p.join(t.outdir,k);if(!r){try{await v(s,X.W_OK),await N(s)}catch{}if(!e)return}e&&a.info("Preparing AI search documents..."),r&&a.info(`${h} Generating llms.txt files...`);const L=a.startTiming(),c=a.startTiming(),f=t.getGlobalConfig("seo"),l=f?.llmstxt,T=p.resolve(t.outdir,j),u=t.getConfig(),P=u.rbac??{},w=t.getAllRoutes(),F=u?.l10n?.defaultLocale||u?.i18n?.defaultLocale||_,I=(l?.excludeFiles||[]).map(o=>$(o)),d=[];if(await C(w,M,async o=>{if(o.excludeFromSearch)return;const O=await W(o,t),x=await q(o,O,i,t);if(x){if(r)for(const n of await x.getLLMsTxts()){if(I.some(m=>m(n.fsPath)))continue;const g=p.join(t.outdir,V(n.slug));A(g),await D(g,n.content),n.includeInLLMsTxt&&H(o,u)&&d.push(n)}if(e&&B.isBuildMode){const n=await x.getSearchDocuments();if(!n.length)return;const g=z(o,P),m=o.versions?.find(({active:E})=>E),y=m&&{folder:m.folderId,label:m.label,default:m.default};await Q(n,o.fsPath,g,T,F,y)}}}),e&&a.infoTime(c,"AI search documents prepared"),d.length)try{J(l);const o=await K(d,l,{title:f?.title,description:f?.description},i);A(s),await D(s,o),a.infoTime(L,`${h} files generated`)}catch(o){a.error(`${h} Failed to generate llms.txt file. ${o.message}`)}}async function W(t,i){return t.getStaticData?t.getStaticData(t,{...i,contentDir:i.contentDir,parseMarkdoc:(e,r,s)=>i.parseMarkdoc(e,r,s)}):{}}async function q(t,i,e,r){if(t.getAiDocumentsStore)return t.getAiDocumentsStore(t,{...i,[R]:t[R],[S]:t[S]},e,r)}function z(t,i){const e=U(t?.[R]);return e?.length?e:Y(t,i)}async function Q(t,i,e,r,s,L){await C(t,M,async c=>{const f=`${G(i+c.content)}.json`,l=A(p.join(r,f)),T=c.locale===_?s:c.locale;b(l)||await D(l,JSON.stringify({...c,rbacTeams:e||[],version:L,locale:T}),"utf-8")})}export{pt as prepareAiSearchDocuments};
@@ -1 +1 @@
1
- import{REDOCLY_ROUTE_RBAC as T,REDOCLY_TEAMS_RBAC as p}from"@redocly/config";import{existsSync as O}from"fs";import{rm as $}from"node:fs/promises";import{DEFAULT_LOCALE_PLACEHOLDER as y}from"../../../../constants/common.js";import{SEARCH_DATA_EXPORT_FOLDER as S}from"../../../constants/plugins/search.js";import{isBuildMode as A}from"../../../utils/envs/is-build-mode.js";import{logger as n}from"../../../tools/notifiers/logger.js";import{extractTeamsFromScopeItems as M,getRbacTeamsListForResource as P}from"../../../utils/index.js";import{getSearchDocumentGroup as I}from"../utils.js";import{telemetry as B}from"../../../../cli/telemetry/index.js";import{telemetryTraceStep as R}from"../../../../cli/telemetry/helpers/trace-step.js";async function J(_,t,l){await R("build.plugin.search.prepare_search_documents",async()=>{n.info("Preparing search documents and create indexes..."),A()&&O(`${t.outdir}/${S}`)&&await $(`${t.outdir}/${S}`,{recursive:!0});const b=n.startTiming(),F=t.getConfig().rbac,v=[y,..._.localeFolders.map(a=>a.toLowerCase())];for(const a of v)await R("build.plugin.search.prepare_search_documents.locale",async c=>{const L=t.getAllRoutesForLocale(a);let g=0,D=0;for(const r of L){if(g++,r.excludeFromSearch)continue;const f=new Map,{product:m}=r,w=await r.getStaticData?.(r,{...t,contentDir:t.contentDir,parseMarkdoc:(s,e,u)=>t.parseMarkdoc(s,e,u)})||{},i=await r.getSearchDocuments?.(r,{...w,[p]:r[p],[T]:r[T]},t),o=r.versions?.find(s=>s.active),C=P(r,F??{});if(i){if(i&&i.length){D+=i.length;for(const s in i){let e=i[s];const u=M(e?.[p]),h=u?.length?u:C,x=e.tags||[];e={...e,...o&&{version:o.version,isDefaultVersion:o.default,versionFolderId:o.folderId},...m&&{product:m},rbacTeams:h,tags:[...x,...h,...o?o.default?["v:default"]:[`v:${o.folderId}:${o.version}`]:["v:default"],...m?[`p:${m.name}`]:[]],url:e.url&&(e.path&&e.path.length>1?e.url:e.url.split("#")[0])};const d=I(e.facets);if(d){const E=f.get(d)??[];f.set(d,[...E,e])}}}for(const[s,e]of f)await l.addDocuments(e,{locale:a,group:s,outDir:t.outdir})}}c?.setAttribute("locale",a),c?.setAttribute("totalDocuments",g),c?.setAttribute("totalSearchDocuments",D)});if(l.cleanupFacetValues(t),n.infoTime(b,"Search indexes created"),A()){n.info("Writing out search data...");const a=n.startTiming();await l.export(t.outdir);const c=n.infoTime(a,"Search data written");c&&B.sendTimingPerformedMessage(c)}})}export{J as prepareSearchDocuments};
1
+ import{REDOCLY_ROUTE_RBAC as T,REDOCLY_TEAMS_RBAC as p}from"@redocly/config";import{existsSync as M}from"fs";import{rm as O}from"node:fs/promises";import{DEFAULT_LOCALE_PLACEHOLDER as $}from"../../../../constants/common.js";import{SEARCH_DATA_EXPORT_FOLDER as S}from"../../../constants/plugins/search.js";import{envConfig as A}from"../../../../config/env-config.js";import{logger as n}from"../../../tools/notifiers/logger.js";import{extractTeamsFromScopeItems as y,getRbacTeamsListForResource as P}from"../../../utils/index.js";import{getSearchDocumentGroup as B}from"../utils.js";import{telemetry as I}from"../../../../cli/telemetry/index.js";import{telemetryTraceStep as R}from"../../../../cli/telemetry/helpers/trace-step.js";async function J(_,t,l){await R("build.plugin.search.prepare_search_documents",async()=>{n.info("Preparing search documents and create indexes..."),A.isBuildMode&&M(`${t.outdir}/${S}`)&&await O(`${t.outdir}/${S}`,{recursive:!0});const b=n.startTiming(),v=t.getConfig().rbac,F=[$,..._.localeFolders.map(a=>a.toLowerCase())];for(const a of F)await R("build.plugin.search.prepare_search_documents.locale",async c=>{const C=t.getAllRoutesForLocale(a);let g=0,D=0;for(const r of C){if(g++,r.excludeFromSearch)continue;const d=new Map,{product:m}=r,L=await r.getStaticData?.(r,{...t,contentDir:t.contentDir,parseMarkdoc:(s,e,u)=>t.parseMarkdoc(s,e,u)})||{},i=await r.getSearchDocuments?.(r,{...L,[p]:r[p],[T]:r[T]},t),o=r.versions?.find(s=>s.active),w=P(r,v??{});if(i){if(i&&i.length){D+=i.length;for(const s in i){let e=i[s];const u=y(e?.[p]),h=u?.length?u:w,x=e.tags||[];e={...e,...o&&{version:o.version,isDefaultVersion:o.default,versionFolderId:o.folderId},...m&&{product:m},rbacTeams:h,tags:[...x,...h,...o?o.default?["v:default"]:[`v:${o.folderId}:${o.version}`]:["v:default"],...m?[`p:${m.name}`]:[]],url:e.url&&(e.path&&e.path.length>1?e.url:e.url.split("#")[0])};const f=B(e.facets);if(f){const E=d.get(f)??[];d.set(f,[...E,e])}}}for(const[s,e]of d)await l.addDocuments(e,{locale:a,group:s,outDir:t.outdir})}}c?.setAttribute("locale",a),c?.setAttribute("totalDocuments",g),c?.setAttribute("totalSearchDocuments",D)});if(l.cleanupFacetValues(t),n.infoTime(b,"Search indexes created"),A.isBuildMode){n.info("Writing out search data...");const a=n.startTiming();await l.export(t.outdir);const c=n.infoTime(a,"Search data written");c&&I.sendTimingPerformedMessage(c)}})}export{J as prepareSearchDocuments};
@@ -1 +1 @@
1
- import{readFile as R,readdir as y,appendFile as E}from"node:fs/promises";import m from"node:path";import{existsSync as w}from"node:fs";import{SEARCH_GROUP_FACET_FIELD as F,SEARCH_PRODUCT_FIELD as C,SEARCH_VERSION_FIELD as $}from"../../../../../constants/common.js";import{SEARCH_INDEX_FIELDS as A,SEARCH_DATA_EXPORT_FOLDER as _,SEARCH_MAX_INMEMORY_DOCUMENTS_COUNT as O}from"../../../../constants/plugins/search.js";import{telemetryTraceStep as v}from"../../../../telemetry/helpers/trace-step.js";import{isBuildMode as N}from"../../../../utils/envs/is-build-mode.js";import{ensureDir as h}from"../../../../utils/index.js";import{FlexSearchIndex as j}from"./search-index.js";class J{#e=new Map;#s;#t=0;async initIndexSchema(t){this.#s={document:{id:"id",tag:"tags",index:A},worker:!1,tokenize:"forward",context:{depth:2,resolution:9}}}#o(t,o){const e=this.#e.get(t);if(e)return e.find(n=>n.id===o)}#n(t,o){let e=this.#o(t,o);return e||(e=new j(o,this.#s),this.#e.set(t,[...this.#e.get(t)??[],e])),e}async addDocuments(t,o){if(t.length){const{group:e,locale:n,outDir:c}=o,i=this.#n(n,e);for(const a of t)i.add(a),N()&&(this.#t++,this.#t>=O&&await this.exportDocuments(c))}}getIndexesSize(){return this.#e.size}async search(t,o){return await v("search",async e=>{const{query:n,locale:c,filter:i,loadMore:a,auth:f}=t,l=this.#e.get(c)??[];let r=[],d="",x=["v:default"];if(e?.setAttribute("locale",c),i)for(const s of i)s.field===F?r=[...r,...s.values]:s.field===C?d=`p:${s.values[0]}`:s.field===$&&s.values.length&&s.values.length===2&&(x=[...x,`v:${s.values[0]}:${s.values[1]}`]);const g={auth:f,query:n,offset:0,SEARCH_GROUP_FACET_FIELD:F,product:d,versions:x},p=[];let u={facets:{},documents:{}};if(a){const s=this.#o(c,a.groupKey);s&&p.push(s.search({...g,offset:a.offset}))}else for(const s of l)r&&r.length?r.includes(s.id)&&p.push(s.search(g)):p.push(s.search(g));const I=await Promise.all(p);for(const s of I){u.documents={...u.documents,...s.documents};for(const[D,S]of Object.entries(s.facets))u.facets[D]?u.facets[D]=[...u.facets[D],...S]:u.facets[D]=S}return u})}async exportDocuments(t){const o='{"documents":[',e=h(m.join(t,_));for(const[n,c]of this.#e){const i=h(m.join(e,n));for(const a of c){const f=Array.from(a.documents);if(f.length===0)continue;const l=h(m.join(i,`${a.id}.json`)),r=!w(l),d=JSON.stringify(f).substring(1).slice(0,-1),x=r?o+d:","+d;await E(l,x,{encoding:"utf8"}),a.clearDocuments()}}this.#t=0}async exportIndexes(t){const o=h(m.join(t,_));for(const[e,n]of this.#e){const c=h(m.join(o,e));for(const i of n){const a=h(m.join(c,`${i.id}.json`)),f={};await i.export((r,d)=>{f[r]=d});const l=`],"index":${JSON.stringify(f)}}`;await E(a,l,{encoding:"utf8"})}}this.#e.clear()}async import(t){const o=`${t}/${_}`,e=await y(o);for(const n of e){const c=await y(`${o}/${n}`);for(const i of c){const a=`${o}/${n}/${i}`,f=JSON.parse(await R(a,"utf-8")),l=m.parse(i).name;await this.#n(n,l).import(f)}}}countFacets(t,o){const e={};for(const[n,c]of o)e[n]=c.values.map(i=>({value:i,count:0,isCounterVisible:!1}));return e}cleanupFacetValues(t){}}export{J as FlexSearch};
1
+ import{readFile as R,readdir as y,appendFile as E}from"node:fs/promises";import m from"node:path";import{existsSync as w}from"node:fs";import{SEARCH_GROUP_FACET_FIELD as F,SEARCH_PRODUCT_FIELD as C,SEARCH_VERSION_FIELD as $}from"../../../../../constants/common.js";import{SEARCH_INDEX_FIELDS as A,SEARCH_DATA_EXPORT_FOLDER as _,SEARCH_MAX_INMEMORY_DOCUMENTS_COUNT as O}from"../../../../constants/plugins/search.js";import{telemetryTraceStep as v}from"../../../../telemetry/helpers/trace-step.js";import{envConfig as N}from"../../../../../config/env-config.js";import{ensureDir as h}from"../../../../utils/index.js";import{FlexSearchIndex as j}from"./search-index.js";class J{#e=new Map;#s;#t=0;async initIndexSchema(t){this.#s={document:{id:"id",tag:"tags",index:A},worker:!1,tokenize:"forward",context:{depth:2,resolution:9}}}#o(t,o){const e=this.#e.get(t);if(e)return e.find(n=>n.id===o)}#n(t,o){let e=this.#o(t,o);return e||(e=new j(o,this.#s),this.#e.set(t,[...this.#e.get(t)??[],e])),e}async addDocuments(t,o){if(t.length){const{group:e,locale:n,outDir:c}=o,i=this.#n(n,e);for(const a of t)i.add(a),N.isBuildMode&&(this.#t++,this.#t>=O&&await this.exportDocuments(c))}}getIndexesSize(){return this.#e.size}async search(t,o){return await v("search",async e=>{const{query:n,locale:c,filter:i,loadMore:a,auth:f}=t,l=this.#e.get(c)??[];let r=[],d="",x=["v:default"];if(e?.setAttribute("locale",c),i)for(const s of i)s.field===F?r=[...r,...s.values]:s.field===C?d=`p:${s.values[0]}`:s.field===$&&s.values.length&&s.values.length===2&&(x=[...x,`v:${s.values[0]}:${s.values[1]}`]);const g={auth:f,query:n,offset:0,SEARCH_GROUP_FACET_FIELD:F,product:d,versions:x},p=[];let u={facets:{},documents:{}};if(a){const s=this.#o(c,a.groupKey);s&&p.push(s.search({...g,offset:a.offset}))}else for(const s of l)r&&r.length?r.includes(s.id)&&p.push(s.search(g)):p.push(s.search(g));const I=await Promise.all(p);for(const s of I){u.documents={...u.documents,...s.documents};for(const[D,S]of Object.entries(s.facets))u.facets[D]?u.facets[D]=[...u.facets[D],...S]:u.facets[D]=S}return u})}async exportDocuments(t){const o='{"documents":[',e=h(m.join(t,_));for(const[n,c]of this.#e){const i=h(m.join(e,n));for(const a of c){const f=Array.from(a.documents);if(f.length===0)continue;const l=h(m.join(i,`${a.id}.json`)),r=!w(l),d=JSON.stringify(f).substring(1).slice(0,-1),x=r?o+d:","+d;await E(l,x,{encoding:"utf8"}),a.clearDocuments()}}this.#t=0}async exportIndexes(t){const o=h(m.join(t,_));for(const[e,n]of this.#e){const c=h(m.join(o,e));for(const i of n){const a=h(m.join(c,`${i.id}.json`)),f={};await i.export((r,d)=>{f[r]=d});const l=`],"index":${JSON.stringify(f)}}`;await E(a,l,{encoding:"utf8"})}}this.#e.clear()}async import(t){const o=`${t}/${_}`,e=await y(o);for(const n of e){const c=await y(`${o}/${n}`);for(const i of c){const a=`${o}/${n}/${i}`,f=JSON.parse(await R(a,"utf-8")),l=m.parse(i).name;await this.#n(n,l).import(f)}}}countFacets(t,o){const e={};for(const[n,c]of o)e[n]=c.values.map(i=>({value:i,count:0,isCounterVisible:!1}));return e}cleanupFacetValues(t){}}export{J as FlexSearch};
@@ -1 +1 @@
1
- import{appendFile as A}from"node:fs/promises";import{existsSync as R}from"node:fs";import m from"node:path";import{Client as $}from"typesense";import{SEARCH_GROUP_FACET_FIELD as D,SEARCH_PRODUCT_FIELD as b,SEARCH_RBAC_FIELD as g,SEARCH_VERSION_FIELD as f}from"../../../../../constants/common.js";import{BASE_SEARCH_DOCUMENT as O,DEFAULT_ORGANIZATION_ID as v,DEFAULT_PROJECT_ID as P,DEFAULT_TYPESENSE_API_KEY as N,DEFAULT_TYPESENSE_API_URL as L,DISABLE_DEEP_LINK_IF_FIELDS_EXIST as C,HIGHLIGHTED_TEXT_MAX_LENGTH as I,SEARCH_DATA_EXPORT_FOLDER as F,SEARCH_DOCUMENT_METADATA_KEY as w,SEARCH_GROUP_LIMIT as k,SEARCH_MAX_FACET_VALUES as S,SEARCH_MAX_INMEMORY_DOCUMENTS_COUNT as M}from"../../../../constants/plugins/search.js";import{telemetryTraceStep as T}from"../../../../telemetry/helpers/trace-step.js";import{isBuildMode as j}from"../../../../utils/envs/is-build-mode.js";import{isDevelopMode as h}from"../../../../utils/envs/is-develop-mode.js";import{logger as x}from"../../../../tools/notifiers/logger.js";import{ensureDir as d}from"../../../../utils/index.js";class z{#e=null;#r="";#t=[{name:"title",type:"string",facet:!1,optional:!0},{name:"text",type:"string",facet:!1,optional:!0},{name:"path",type:"string[]",facet:!1,optional:!0},{name:"isAdditionalOperation",type:"bool",facet:!1,optional:!0},{name:"parameters",type:"object[]",facet:!1,optional:!0},{name:b,type:"string",facet:!0,optional:!0},{name:f,type:"object",facet:!0,optional:!0},{name:g,type:"string[]",facet:!0},{name:"metadata_curated",type:"auto",facet:!1,optional:!0},{name:"metadata_keywords_excludes",type:"auto",facet:!1,optional:!0},{name:"metadata_keywords_includes",type:"auto",facet:!1,optional:!0}];#s=new Map;#o={ORGANIZATION_ID:process.env.ORGANIZATION_ID||(h()?v:""),PROJECT_ID:process.env.PROJECT_ID||(h()?P:""),TYPESENSE_API_URL:process.env.TYPESENSE_API_URL||(h()?L:""),TYPESENSE_API_KEY:process.env.TYPESENSE_API_KEY||(h()?N:"")};constructor(){if(!j()){for(const[e,t]of Object.entries(this.#o))if(!t)throw new Error(`Cannot initialize search index. ${e} is not set`);this.#r=`${this.#o.ORGANIZATION_ID}_${this.#o.PROJECT_ID}_`,this.#e=new $({nodes:[{url:this.#o.TYPESENSE_API_URL}],apiKey:this.#o.TYPESENSE_API_KEY,connectionTimeoutSeconds:5})}}async initIndexSchema(e){this.#d(e),h()&&await this.#m()}async addDocuments(e,t){e.push(O);const{locale:i,outDir:r}=t,o=e.map(a=>{const s={...a},n=a[w];return n&&(n.curated&&(s.metadata_curated=n.curated),n.excludes&&(s.metadata_keywords_excludes=n.excludes),n.includes&&(s.metadata_keywords_includes=n.includes)),s});if(h()){if(o.length){await this.#p(i);try{const a=o.map(s=>({url:s.url,title:s.title,text:s.text,path:s.path,httpMethod:s.httpMethod,isAdditionalOperation:s.isAdditionalOperation,httpPath:s.httpPath,parameters:s.parameters,[b]:s.product?s.product.name:"",[g]:s.rbacTeams??[],[f]:s.version?{isDefault:s.isDefaultVersion,version:s.version,folderId:s.versionFolderId}:{isDefault:!0},...s.facets}));await this.#e?.collections(i).documents().import(a)}catch(a){if(a.importResults)for(const s of a.importResults)s.success===!1&&x.error(`Error adding document to collection: ${i}: ${s.error}`)}}}else{const a=this.#s.get(i)??[];this.#s.set(i,a.concat(o)),a.length+e.length>=M&&await this.exportDocuments(r)}}async search(e){return await T("search",async t=>{const{query:i,locale:r,filter:o,loadMore:a,auth:s}=e,n=h()?r:this.#c(r),l={collection:n,q:i||"*",query_by:this.#l(),max_facet_values:S};if(t?.setAttribute("collectionName",n),t?.setAttribute("locale",r),this.#e)if(a){const{groupKey:c,offset:u}=a,p={offset:u,filter_by:this.#i(s,o),facet_by:"*"};return t?.setAttribute("isLoadMore",!0),t?.setAttribute("filter",p.filter_by),this.#u(await this.#e.collections(n).documents().search({...l,...p}),c)}else{const c={group_by:this.#_(),group_limit:k,filter_by:this.#i(s,o)};t?.setAttribute("groups",c.group_by),t?.setAttribute("filter",c.filter_by);const u=[c,...this.#E(s,o)];return this.#f(await this.#e?.multiSearch.perform({searches:u},l),o)}else return{facets:{},documents:{}}})}#u(e,t){const i={facets:{},documents:{[t]:[]}};if(e.hits&&e.hits.length)for(const r of e.hits)i.documents[t].push({document:this.#n(r),highlight:this.#a(r)});return i}#f(e,t){const i={facets:{},documents:{}};for(const r of this.#y(t))i.documents[r]=[];if("results"in e)for(const r of e.results){if(r.facet_counts&&r.facet_counts.length)for(const o of r.facet_counts)i.facets[o.field_name]=o.counts.map(a=>({value:a.value,count:a.count}));if(r.grouped_hits&&r.grouped_hits.length)for(const o of r.grouped_hits){const a=o.group_key[0],s=[];for(const n of o.hits)s.push({document:this.#n(n),highlight:this.#a(n)});i.documents[a]=s}}return i}#n(e){return this.#h(e)}#a(e){const t={},i=[];for(const[r,o]of Object.entries(e.highlight??{}))if(Array.isArray(o)){if(r==="path"){const a=o,s=[];for(const n of a)s.push(n.snippet);t.path=s}else if(r==="parameters"){const a=o;for(const s of a){let n=!1;for(const[l,c]of Object.entries(s))if(l!=="deepLink")if(Array.isArray(c))for(const u of c)u.matched_tokens?.length&&(n=!0);else c.matched_tokens?.length&&(n=!0);if(n){const l={name:s.name?.snippet||"",description:s.description?.snippet||"",place:s.place?.snippet||"",path:s.path?.map(c=>c?.snippet)||[]};t.parameters=[l];break}}}}else t[r]=o.snippet,i.push(r);for(const[r,o]of Object.entries(e.document))!i.includes(r)&&typeof o=="string"&&(t[r]=o.length>I?`${o.substring(0,I)}...`:o);return t.parameters||(t.parameters=[]),t}#h(e){let t;const i=Object.keys(e.highlight);for(const o of C)if(i.some(a=>a===o))return e.document;const r=e.highlight.parameters;if(r){for(const o of r)for(const[a,s]of Object.entries(o))if(a!=="deepLink"){if(Array.isArray(s)){for(const n of s)if(n.matched_tokens?.length){t=o.deepLink.snippet;break}}else if(s.matched_tokens?.length){t=o.deepLink.snippet;break}}}if(t){const o=t.split("#")[1];return{...e.document,url:`${e.document.url}#${o}`}}return e.document}async exportDocuments(e){const t='{"documents":[',i=d(m.join(e,F));for(const[r,o]of this.#s){if(o.length===0)continue;const a=d(m.join(i,`${r}.json`)),s=!R(a),n=JSON.stringify(o).substring(1).slice(0,-1),l=s?t+n:","+n;await A(a,l,{encoding:"utf8"}),this.#s.set(r,[])}}async exportIndexes(e){const t=d(m.join(e,F));for(const i of this.#s.keys()){const r=d(m.join(t,`${i}.json`)),o=`],"schemaFields":${JSON.stringify(this.#t)}}`;await A(r,o,{encoding:"utf8"})}}async import(e){}async countFacets(e,t){return await T("search.facets",async i=>{const{locale:r,query:o,facetQuery:a,filter:s,field:n,auth:l}=e,c=h()?r:this.#c(r),u={q:o||"*",query_by:this.#l(),facet_by:"*",facet_query:this.#g(a,n),filter_by:this.#i(l,s,n),max_facet_values:S};if(i?.setAttribute("collectionName",c),i?.setAttribute("query",u.q),i?.setAttribute("facetQuery",u.facet_query),i?.setAttribute("filter",u.filter_by),this.#e){const p={},_=await this.#e.collections(c).documents().search(u);if(_.facet_counts&&_.facet_counts.length)for(const y of _.facet_counts)p[y.field_name]=y.counts.map(E=>({value:E.value,count:E.count,isCounterVisible:!!o||(s?.length||0)>0}));return p}else return{}})}#c(e){return`${this.#r}${e}`}async#p(e){const t=await this.#e?.collections().retrieve();t&&t.length&&t.find(i=>i.name===e)||await this.#e?.collections().create({name:e,fields:this.#t,enable_nested_fields:!0})}async#m(){const e=await this.#e?.collections().retrieve();for(const t of e??[])await this.#e?.collections(t.name).delete()}#d(e){for(const[t]of e)this.#t.find(i=>i.name===t)||this.#t.push({name:t,type:"string",facet:!0,optional:!0})}#l(){return this.#t.filter(e=>!e.facet&&!e.name.startsWith("metadata_")&&e.name!=="isAdditionalOperation").map(e=>e.name).join(",")}#_(){return this.#t.filter(e=>e.facet&&e.name===D).map(e=>e.name).join(",")}#i(e,t,i){const r=`${g}:[${e.teams.map(a=>`'${a}'`).join(", ")}]`;let o=`${f}.isDefault:true`;if(t&&t.length){const a=t.filter(n=>n.field!==i&&n.field!==f).map(n=>{const l=n.values.map(c=>`'${c}'`);return l.length?`${n.field}:[${l.join(", ")}]`:""}).join(" && "),s=t.find(n=>n.field===f);if(s&&s.values.length&&s.values.length===2){const n=s.values[0],l=s.values[1],c=`(${f}.folderId:! ${n} && ${f}.isDefault:true)`,u=`(${f}.folderId:${n} && ${f}.version:${l})`;o=`(${c} || ${u})`}return a?`${r} && ${a} && ${o}`:`${r} && ${o}`}else return`${r} && ${o}`}#g(e,t){return e&&t?`${t}:${e}`:""}#y(e){const t=[];if(e&&e.length)for(const i of e)i.field===D&&t.push(...i.values);return t}#E(e,t){const i=[],r=this.#t.filter(o=>o.facet);for(const o of r){const a={facet_by:o.name,filter_by:this.#i(e,t,o.name)};i.push(a)}return i}cleanupFacetValues(e){const t=e.getSearchFacets();t.forEach(i=>{i.values=[]}),e.setSearchFacets(t)}}export{z as Typesense};
1
+ import{appendFile as A}from"node:fs/promises";import{existsSync as v}from"node:fs";import m from"node:path";import{Client as R}from"typesense";import{SEARCH_GROUP_FACET_FIELD as D,SEARCH_PRODUCT_FIELD as b,SEARCH_RBAC_FIELD as g,SEARCH_VERSION_FIELD as h}from"../../../../../constants/common.js";import{BASE_SEARCH_DOCUMENT as $,DEFAULT_ORGANIZATION_ID as O,DEFAULT_PROJECT_ID as P,DEFAULT_TYPESENSE_API_KEY as N,DEFAULT_TYPESENSE_API_URL as L,DISABLE_DEEP_LINK_IF_FIELDS_EXIST as C,HIGHLIGHTED_TEXT_MAX_LENGTH as I,SEARCH_DATA_EXPORT_FOLDER as F,SEARCH_DOCUMENT_METADATA_KEY as M,SEARCH_GROUP_LIMIT as w,SEARCH_MAX_FACET_VALUES as S,SEARCH_MAX_INMEMORY_DOCUMENTS_COUNT as k}from"../../../../constants/plugins/search.js";import{telemetryTraceStep as T}from"../../../../telemetry/helpers/trace-step.js";import{envConfig as u}from"../../../../../config/env-config.js";import{logger as j}from"../../../../tools/notifiers/logger.js";import{ensureDir as d}from"../../../../utils/index.js";class Q{#e=null;#r="";#t=[{name:"title",type:"string",facet:!1,optional:!0},{name:"text",type:"string",facet:!1,optional:!0},{name:"path",type:"string[]",facet:!1,optional:!0},{name:"isAdditionalOperation",type:"bool",facet:!1,optional:!0},{name:"parameters",type:"object[]",facet:!1,optional:!0},{name:b,type:"string",facet:!0,optional:!0},{name:h,type:"object",facet:!0,optional:!0},{name:g,type:"string[]",facet:!0},{name:"metadata_curated",type:"auto",facet:!1,optional:!0},{name:"metadata_keywords_excludes",type:"auto",facet:!1,optional:!0},{name:"metadata_keywords_includes",type:"auto",facet:!1,optional:!0}];#s=new Map;#o={ORGANIZATION_ID:u.ORGANIZATION_ID||(u.isDevelopMode?O:""),PROJECT_ID:u.PROJECT_ID||(u.isDevelopMode?P:""),TYPESENSE_API_URL:u.TYPESENSE_API_URL||(u.isDevelopMode?L:""),TYPESENSE_API_KEY:u.TYPESENSE_API_KEY||(u.isDevelopMode?N:"")};constructor(){if(!u.isBuildMode){for(const[e,t]of Object.entries(this.#o))if(!t)throw new Error(`Cannot initialize search index. ${e} is not set`);this.#r=`${this.#o.ORGANIZATION_ID}_${this.#o.PROJECT_ID}_`,this.#e=new R({nodes:[{url:this.#o.TYPESENSE_API_URL}],apiKey:this.#o.TYPESENSE_API_KEY,connectionTimeoutSeconds:5})}}async initIndexSchema(e){this.#d(e),u.isDevelopMode&&await this.#m()}async addDocuments(e,t){e.push($);const{locale:i,outDir:r}=t,o=e.map(n=>{const s={...n},a=n[M];return a&&(a.curated&&(s.metadata_curated=a.curated),a.excludes&&(s.metadata_keywords_excludes=a.excludes),a.includes&&(s.metadata_keywords_includes=a.includes)),s});if(u.isDevelopMode){if(o.length){await this.#p(i);try{const n=o.map(s=>({url:s.url,title:s.title,text:s.text,path:s.path,httpMethod:s.httpMethod,isAdditionalOperation:s.isAdditionalOperation,httpPath:s.httpPath,parameters:s.parameters,[b]:s.product?s.product.name:"",[g]:s.rbacTeams??[],[h]:s.version?{isDefault:s.isDefaultVersion,version:s.version,folderId:s.versionFolderId}:{isDefault:!0},...s.facets}));await this.#e?.collections(i).documents().import(n)}catch(n){if(n.importResults)for(const s of n.importResults)s.success===!1&&j.error(`Error adding document to collection: ${i}: ${s.error}`)}}}else{const n=this.#s.get(i)??[];this.#s.set(i,n.concat(o)),n.length+e.length>=k&&await this.exportDocuments(r)}}async search(e){return await T("search",async t=>{const{query:i,locale:r,filter:o,loadMore:n,auth:s}=e,a=u.isDevelopMode?r:this.#c(r),l={collection:a,q:i||"*",query_by:this.#l(),max_facet_values:S};if(t?.setAttribute("collectionName",a),t?.setAttribute("locale",r),this.#e)if(n){const{groupKey:c,offset:f}=n,p={offset:f,filter_by:this.#i(s,o),facet_by:"*"};return t?.setAttribute("isLoadMore",!0),t?.setAttribute("filter",p.filter_by),this.#u(await this.#e.collections(a).documents().search({...l,...p}),c)}else{const c={group_by:this.#_(),group_limit:w,filter_by:this.#i(s,o)};t?.setAttribute("groups",c.group_by),t?.setAttribute("filter",c.filter_by);const f=[c,...this.#E(s,o)];return this.#f(await this.#e?.multiSearch.perform({searches:f},l),o)}else return{facets:{},documents:{}}})}#u(e,t){const i={facets:{},documents:{[t]:[]}};if(e.hits&&e.hits.length)for(const r of e.hits)i.documents[t].push({document:this.#a(r),highlight:this.#n(r)});return i}#f(e,t){const i={facets:{},documents:{}};for(const r of this.#y(t))i.documents[r]=[];if("results"in e)for(const r of e.results){if(r.facet_counts&&r.facet_counts.length)for(const o of r.facet_counts)i.facets[o.field_name]=o.counts.map(n=>({value:n.value,count:n.count}));if(r.grouped_hits&&r.grouped_hits.length)for(const o of r.grouped_hits){const n=o.group_key[0],s=[];for(const a of o.hits)s.push({document:this.#a(a),highlight:this.#n(a)});i.documents[n]=s}}return i}#a(e){return this.#h(e)}#n(e){const t={},i=[];for(const[r,o]of Object.entries(e.highlight??{}))if(Array.isArray(o)){if(r==="path"){const n=o,s=[];for(const a of n)s.push(a.snippet);t.path=s}else if(r==="parameters"){const n=o;for(const s of n){let a=!1;for(const[l,c]of Object.entries(s))if(l!=="deepLink")if(Array.isArray(c))for(const f of c)f.matched_tokens?.length&&(a=!0);else c.matched_tokens?.length&&(a=!0);if(a){const l={name:s.name?.snippet||"",description:s.description?.snippet||"",place:s.place?.snippet||"",path:s.path?.map(c=>c?.snippet)||[]};t.parameters=[l];break}}}}else t[r]=o.snippet,i.push(r);for(const[r,o]of Object.entries(e.document))!i.includes(r)&&typeof o=="string"&&(t[r]=o.length>I?`${o.substring(0,I)}...`:o);return t.parameters||(t.parameters=[]),t}#h(e){let t;const i=Object.keys(e.highlight);for(const o of C)if(i.some(n=>n===o))return e.document;const r=e.highlight.parameters;if(r){for(const o of r)for(const[n,s]of Object.entries(o))if(n!=="deepLink"){if(Array.isArray(s)){for(const a of s)if(a.matched_tokens?.length){t=o.deepLink.snippet;break}}else if(s.matched_tokens?.length){t=o.deepLink.snippet;break}}}if(t){const o=t.split("#")[1];return{...e.document,url:`${e.document.url}#${o}`}}return e.document}async exportDocuments(e){const t='{"documents":[',i=d(m.join(e,F));for(const[r,o]of this.#s){if(o.length===0)continue;const n=d(m.join(i,`${r}.json`)),s=!v(n),a=JSON.stringify(o).substring(1).slice(0,-1),l=s?t+a:","+a;await A(n,l,{encoding:"utf8"}),this.#s.set(r,[])}}async exportIndexes(e){const t=d(m.join(e,F));for(const i of this.#s.keys()){const r=d(m.join(t,`${i}.json`)),o=`],"schemaFields":${JSON.stringify(this.#t)}}`;await A(r,o,{encoding:"utf8"})}}async import(e){}async countFacets(e,t){return await T("search.facets",async i=>{const{locale:r,query:o,facetQuery:n,filter:s,field:a,auth:l}=e,c=u.isDevelopMode?r:this.#c(r),f={q:o||"*",query_by:this.#l(),facet_by:"*",facet_query:this.#g(n,a),filter_by:this.#i(l,s,a),max_facet_values:S};if(i?.setAttribute("collectionName",c),i?.setAttribute("query",f.q),i?.setAttribute("facetQuery",f.facet_query),i?.setAttribute("filter",f.filter_by),this.#e){const p={},_=await this.#e.collections(c).documents().search(f);if(_.facet_counts&&_.facet_counts.length)for(const y of _.facet_counts)p[y.field_name]=y.counts.map(E=>({value:E.value,count:E.count,isCounterVisible:!!o||(s?.length||0)>0}));return p}else return{}})}#c(e){return`${this.#r}${e}`}async#p(e){const t=await this.#e?.collections().retrieve();t&&t.length&&t.find(i=>i.name===e)||await this.#e?.collections().create({name:e,fields:this.#t,enable_nested_fields:!0})}async#m(){const e=await this.#e?.collections().retrieve();for(const t of e??[])await this.#e?.collections(t.name).delete()}#d(e){for(const[t]of e)this.#t.find(i=>i.name===t)||this.#t.push({name:t,type:"string",facet:!0,optional:!0})}#l(){return this.#t.filter(e=>!e.facet&&!e.name.startsWith("metadata_")&&e.name!=="isAdditionalOperation").map(e=>e.name).join(",")}#_(){return this.#t.filter(e=>e.facet&&e.name===D).map(e=>e.name).join(",")}#i(e,t,i){const r=`${g}:[${e.teams.map(n=>`'${n}'`).join(", ")}]`;let o=`${h}.isDefault:true`;if(t&&t.length){const n=t.filter(a=>a.field!==i&&a.field!==h).map(a=>{const l=a.values.map(c=>`'${c}'`);return l.length?`${a.field}:[${l.join(", ")}]`:""}).join(" && "),s=t.find(a=>a.field===h);if(s&&s.values.length&&s.values.length===2){const a=s.values[0],l=s.values[1],c=`(${h}.folderId:! ${a} && ${h}.isDefault:true)`,f=`(${h}.folderId:${a} && ${h}.version:${l})`;o=`(${c} || ${f})`}return n?`${r} && ${n} && ${o}`:`${r} && ${o}`}else return`${r} && ${o}`}#g(e,t){return e&&t?`${t}:${e}`:""}#y(e){const t=[];if(e&&e.length)for(const i of e)i.field===D&&t.push(...i.values);return t}#E(e,t){const i=[],r=this.#t.filter(o=>o.facet);for(const o of r){const n={facet_by:o.name,filter_by:this.#i(e,t,o.name)};i.push(n)}return i}cleanupFacetValues(e){const t=e.getSearchFacets();t.forEach(i=>{i.values=[]}),e.setSearchFacets(t)}}export{Q as Typesense};
@@ -1 +1 @@
1
- import{REDOCLY_TEAMS_RBAC as l}from"@redocly/config";import{DEFAULT_SEARCH_ENGINE as c}from"../../constants/plugins/search.js";import{isDevelopMode as p}from"../../utils/envs/is-develop-mode.js";import{logger as g}from"../../tools/notifiers/logger.js";import{reporter as E}from"../../tools/notifiers/reporter.js";import{prepareSearchDocuments as d}from"./documents/search-documents.js";import{SearchEngine as S}from"./engines/search-engine.js";import{prepareAiSearchDocuments as u}from"./ai-indexer/prepare-ai-search-documents.js";import{isAiSearchEnabled as b}from"./utils.js";import{telemetryTraceStep as D}from"../../../cli/telemetry/helpers/trace-step.js";async function N(){let e=!0;return{async afterRoutesCreated(a,i){(process.env.SEARCH_DEV_REINIT||e)&&await y(a,i),e=!1},id:"search"}}async function y(e,a){await D("build.plugin.search",async i=>{const r=e.getConfig();if(i?.setAttribute("config",JSON.stringify(r.search||{})),r.search?.hide){g.info("Search is disabled in the config, skipping");return}const o=r.search?.engine||c,s=p()?process.env.SEARCH_DEV_DEBUG?o:c:o,{l10n:f}=e.getGlobalData(),h=b(r),n=r.rbac?.features?.aiSearch;let t;try{t=new S(s,f)}catch(m){await E.panic(m);return}await t.initIndexSchema(e.getSearchFacets()),e.setSearchEngine(t),e.setGlobalData({searchFeatures:{advanced:{enabled:s!==c&&!r.search?.filters?.hide},ai:{enabled:h,[l]:n&&Object.keys(n).length?n:void 0}}}),await d(a.fs,e,t),await u(e,a,{aiSearchEnabled:h,llmstxtEnabled:r.seo?.llmstxt?.hide!==!0})})}export{N as searchPlugin};
1
+ import{REDOCLY_TEAMS_RBAC as p}from"@redocly/config";import{DEFAULT_SEARCH_ENGINE as c}from"../../constants/plugins/search.js";import{envConfig as o}from"../../../config/env-config.js";import{logger as g}from"../../tools/notifiers/logger.js";import{reporter as E}from"../../tools/notifiers/reporter.js";import{prepareSearchDocuments as d}from"./documents/search-documents.js";import{SearchEngine as S}from"./engines/search-engine.js";import{prepareAiSearchDocuments as u}from"./ai-indexer/prepare-ai-search-documents.js";import{isAiSearchEnabled as b}from"./utils.js";import{telemetryTraceStep as D}from"../../../cli/telemetry/helpers/trace-step.js";async function v(){let e=!0;return{async afterRoutesCreated(a,i){(o.SEARCH_DEV_REINIT||e)&&await y(a,i),e=!1},id:"search"}}async function y(e,a){await D("build.plugin.search",async i=>{const r=e.getConfig();if(i?.setAttribute("config",JSON.stringify(r.search||{})),r.search?.hide){g.info("Search is disabled in the config, skipping");return}const s=r.search?.engine||c,f=o.isDevelopMode?o.SEARCH_DEV_DEBUG?s:c:s,{l10n:m}=e.getGlobalData(),h=b(r),n=r.rbac?.features?.aiSearch;let t;try{t=new S(f,m)}catch(l){await E.panic(l);return}await t.initIndexSchema(e.getSearchFacets()),e.setSearchEngine(t),e.setGlobalData({searchFeatures:{advanced:{enabled:f!==c&&!r.search?.filters?.hide},ai:{enabled:h,[p]:n&&Object.keys(n).length?n:void 0}}}),await d(a.fs,e,t),await u(e,a,{aiSearchEnabled:h,llmstxtEnabled:r.seo?.llmstxt?.hide!==!0})})}export{v as searchPlugin};
@@ -1,13 +1,13 @@
1
- import a from"picomatch";import{dirname as $,resolve as x}from"node:path";import{access as E,readFile as F,constants as P}from"fs/promises";import{removeTrailingSlash as w}from"../../../../utils/url/remove-trailing-slash.js";import{logger as I}from"../../../tools/notifiers/logger.js";const l="llms.txt",u="Table of contents";async function g(e,t,n={title:l,description:void 0},o){if(!t)return{title:n.title||l,description:n.description,details:void 0,sections:[{title:u,description:void 0,llmstxts:e}]};const s=t.title||n.title||l,r=t.description||n.description,i=await y(t,o),c=t.sections?.map(d=>{const{title:f,description:h,excludeFiles:L,includeFiles:m}=d,T=p(e,{excludeFiles:L,includeFiles:m});return{title:f,description:h,llmstxts:T}});return{title:s,description:r,details:i,sections:c||[{title:u,description:void 0,llmstxts:p(e,{includeFiles:["**/*"],excludeFiles:[]})}]}}async function y(e,t){const n=await t.getConfig();if(e?.details?.path&&n.configPath)try{const o=t.fs.getFileInfo(n.configPath);if(!o)throw new Error(`Config file ${n.configPath} not found`);const s=x(t.fs.cwd,$(o.relativePath),e.details.path);return await E(s,P.R_OK),F(s,"utf-8")}catch{throw new Error(`${e.details.path} is not accessible`)}if(e?.details?.content)return e.details.content}function p(e,t){const{excludeFiles:n,includeFiles:o}=t,s=n?.map(i=>a(i)),r=o?.map(i=>a(i));return e.filter(i=>s?.some(d=>d(i.fsPath))?!1:r?.some(d=>d(i.fsPath)))}async function S(e,t,n={title:l,description:void 0},o){const s=await g(e,t,n,o),r=[`# ${s.title}
1
+ import a from"picomatch";import{dirname as $,resolve as x}from"node:path";import{access as P,readFile as E,constants as F}from"fs/promises";import{removeTrailingSlash as w}from"../../../../utils/url/remove-trailing-slash.js";import{logger as g}from"../../../tools/notifiers/logger.js";import{withPathPrefix as I}from"@redocly/theme/core/utils";import{envConfig as y}from"../../../../config/env-config.js";const l="llms.txt",u="Table of contents";async function M(t,e,n={title:l,description:void 0},o){if(!e)return{title:n.title||l,description:n.description,details:void 0,sections:[{title:u,description:void 0,llmstxts:t}]};const s=e.title||n.title||l,r=e.description||n.description,i=await v(e,o),c=e.sections?.map(d=>{const{title:f,description:h,excludeFiles:m,includeFiles:L}=d,T=p(t,{excludeFiles:m,includeFiles:L});return{title:f,description:h,llmstxts:T}});return{title:s,description:r,details:i,sections:c||[{title:u,description:void 0,llmstxts:p(t,{includeFiles:["**/*"],excludeFiles:[]})}]}}async function v(t,e){const n=await e.getConfig();if(t?.details?.path&&n.configPath)try{const o=e.fs.getFileInfo(n.configPath);if(!o)throw new Error(`Config file ${n.configPath} not found`);const s=x(e.fs.cwd,$(o.relativePath),t.details.path);return await P(s,F.R_OK),E(s,"utf-8")}catch{throw new Error(`${t.details.path} is not accessible`)}if(t?.details?.content)return t.details.content}function p(t,e){const{excludeFiles:n,includeFiles:o}=e,s=n?.map(i=>a(i)),r=o?.map(i=>a(i));return t.filter(i=>s?.some(d=>d(i.fsPath))?!1:r?.some(d=>d(i.fsPath)))}async function j(t,e,n={title:l,description:void 0},o){const s=await M(t,e,n,o),r=[`# ${s.title}
2
2
 
3
3
  `];return s.description&&r.push(`> ${s.description}
4
4
 
5
5
  `),s.details&&r.push(`${s.details}
6
6
 
7
- `),s.sections.forEach(i=>{if(!i.llmstxts.length){I.warn(`llms.txt: No links found for section "${i.title}". Please check the includeFiles/excludeFiles patterns.`);return}r.push(`## ${i.title}
7
+ `),s.sections.forEach(i=>{if(!i.llmstxts.length){g.warn(`llms.txt: No links found for section "${i.title}". Please check the includeFiles/excludeFiles patterns.`);return}r.push(`## ${i.title}
8
8
  `),i.description?r.push(`${i.description.replace(/\n+$/,"")}
9
9
 
10
10
  `):r.push(`
11
- `),i.llmstxts.forEach(c=>{r.push(` - ${M({title:c.title,description:c.description,slug:v(c.slug)})}`)}),r.push(`
12
- `)}),r.join("")}function M({title:e,description:t,slug:n}){return`[${e}](${w(process.env.REDOCLY_PUBLIC_URL||"")}${encodeURI(n)})${t?`: ${t}`:""}
13
- `}function A(e){if(e?.details?.path&&e?.details?.content)throw new Error('"details.path" and "details.content" are mutually exclusive. Please use only one of them.')}function v(e){return`${e}${e==="/"?"index.html.md":".md"}`}export{S as generateLLMsTxt,v as getLLMsTxtMdSlug,M as llmsTxtLink,A as validateLLMsTxtConfig};
11
+ `),i.llmstxts.forEach(c=>{r.push(` - ${_({title:c.title,description:c.description,slug:D(c.slug)})}`)}),r.push(`
12
+ `)}),r.join("")}function _({title:t,description:e,slug:n}){return`[${t}](${w(y.REDOCLY_PUBLIC_URL||"")}${encodeURI(I(n))})${e?`: ${e}`:""}
13
+ `}function B(t){if(t?.details?.path&&t?.details?.content)throw new Error('"details.path" and "details.content" are mutually exclusive. Please use only one of them.')}function D(t){return`${t}${t==="/"?"index.html.md":".md"}`}export{j as generateLLMsTxt,D as getLLMsTxtMdSlug,_ as llmsTxtLink,B as validateLLMsTxtConfig};
@@ -1,2 +1,2 @@
1
- import{SEARCH_GROUP_FACET_FIELD as t}from"../../../constants/common.js";import{DEFAULT_AI_SEARCH_ENABLED as o}from"../../constants/plugins/search.js";import{isPrimitive as n}from"../../../utils/guards/is-primitive.js";import{isDevelopMode as s}from"../../utils/envs/is-develop-mode.js";import{EntitlementsProvider as f}from"../../entitlements/entitlements-provider.js";function A(e){if(s())return process.env.SEARCH_DEV_DEBUG==="true";if(!f.instance().canAccessFeature("aiSearchLimit"))return!1;const r=e.aiAssistant;return typeof r?.hide=="boolean"?!r?.hide:o}function S(e){let i;return e&&Object.keys(e).forEach(r=>{r===t&&(i=e[r])}),i}function h(e){return Object.entries(e||{}).map(([i,r])=>` - ${i}: ${n(r)?r:JSON.stringify(r)}`).join(`
1
+ import{SEARCH_GROUP_FACET_FIELD as o}from"../../../constants/common.js";import{DEFAULT_AI_SEARCH_ENABLED as n}from"../../constants/plugins/search.js";import{isPrimitive as f}from"../../../utils/guards/is-primitive.js";import{envConfig as t}from"../../../config/env-config.js";import{EntitlementsProvider as s}from"../../entitlements/entitlements-provider.js";function A(r){if(t.isDevelopMode)return t.SEARCH_DEV_DEBUG==="true";if(!s.instance().canAccessFeature("aiSearchLimit"))return!1;const i=r.aiAssistant;return typeof i?.hide=="boolean"?!i?.hide:n}function S(r){let e;return r&&Object.keys(r).forEach(i=>{i===o&&(e=r[i])}),e}function h(r){return Object.entries(r||{}).map(([e,i])=>` - ${e}: ${f(i)?i:JSON.stringify(i)}`).join(`
2
2
  `)}export{h as formatDocumentMetadata,S as getSearchDocumentGroup,A as isAiSearchEnabled};
@@ -1,3 +1,3 @@
1
- import{writeFileSync as tt}from"node:fs";import*as u from"path";import et from"@markdoc/markdoc";import{withoutHash as ot}from"@redocly/theme/core/utils";import{DEFAULT_LOCALE_PLACEHOLDER as E,SIDEBAR_PREFIX as at,CONFIG_FILE_NAME as K}from"../../../constants/common.js";import{CATALOG_OUTPUT_FILE_NAME as rt}from"../../constants/common.js";import{findDeepFirst as M}from"../../../utils/tree/find-deep-first.js";import{isDefined as X}from"../../../utils/guards/is-defined.js";import{partition as it}from"../../../utils/array/partition.js";import{collectPropValueDeep as N}from"../../../utils/tree/collect-prop-value-deep.js";import{readEnvVariable as nt}from"../../utils/envs/read-env-variable.js";import{isLocalLink as st}from"../../../utils/path/is-local-link.js";import{normalizeRouteSlug as Y}from"../../../utils/path/normalize-route-slug.js";import{slash as lt}from"../../../utils/path/slash.js";import{parsePathVersions as ct}from"../../../utils/path/parse-path-versions.js";import{reporter as A}from"../../tools/notifiers/reporter.js";import{logger as x}from"../../tools/notifiers/logger.js";import{sha1 as ft}from"../../utils/crypto/sha1.js";import{collectItemsLinkedToSidebars as dt,resolveItems as Z}from"../nav-utils.js";import{getInnerText as ut}from"../markdown/markdoc/helpers/get-inner-text.js";import{getExcludedFromLinkCheckerPatterns as mt,getSidebarReferences as gt,hasCircularDependency as pt}from"./utils.js";import{getLocaleFromRelativePath as ht}from"../../fs/utils/get-locale-from-relative-path.js";import{isSystemRouteSlug as St}from"../../utils/system-routes.js";import{ENTITIES_MAP_GLOBAL_DATA_KEY as yt}from"../../constants/plugins/catalog-entities.js";import{telemetryTraceStep as bt}from"../../../cli/telemetry/helpers/trace-step.js";const Ft=180,It=170,Dt=10;async function Jt({contentDir:l}){return{id:"sidebars",async afterRoutesCreated(o,i){await bt("build.plugin.sidebars",async()=>{const{cache:d,fs:c}=i,I=o.getConfig(),D=new Map,P=new Set,B=[E,...c.localeFolders],j=o.getGlobalData()[yt]||{},G=new Map;let L=c.scan(/sidebars.yaml$/).map(({relativePath:t})=>t).filter(t=>!Ct(I.ignore??[],t)&&t);const $=await gt(i,l,L),q=it(L.filter(t=>!$.has(t)),t=>ct(t)?.versionFolderPath||t),_=mt(I),Q=await dt(I?.navbar,o,i,{navFile:K,excludedFromLinkCheckerPatterns:_});let w;const T=pt($);T&&Array.isArray(T)&&await A.panicOnBuildContentError(`Sidebar references have circular dependency. Please check your sidebar files.
1
+ import{writeFileSync as tt}from"node:fs";import*as u from"path";import et from"@markdoc/markdoc";import{withoutHash as ot}from"@redocly/theme/core/utils";import{DEFAULT_LOCALE_PLACEHOLDER as v,SIDEBAR_PREFIX as at,CONFIG_FILE_NAME as V}from"../../../constants/common.js";import{CATALOG_OUTPUT_FILE_NAME as rt}from"../../constants/common.js";import{findDeepFirst as M}from"../../../utils/tree/find-deep-first.js";import{isDefined as X}from"../../../utils/guards/is-defined.js";import{partition as it}from"../../../utils/array/partition.js";import{collectPropValueDeep as N}from"../../../utils/tree/collect-prop-value-deep.js";import{envConfig as nt}from"../../../config/env-config.js";import{isLocalLink as st}from"../../../utils/path/is-local-link.js";import{normalizeRouteSlug as Y}from"../../../utils/path/normalize-route-slug.js";import{slash as lt}from"../../../utils/path/slash.js";import{parsePathVersions as ct}from"../../../utils/path/parse-path-versions.js";import{reporter as A}from"../../tools/notifiers/reporter.js";import{logger as x}from"../../tools/notifiers/logger.js";import{sha1 as ft}from"../../utils/crypto/sha1.js";import{collectItemsLinkedToSidebars as dt,resolveItems as Z}from"../nav-utils.js";import{getInnerText as ut}from"../markdown/markdoc/helpers/get-inner-text.js";import{getExcludedFromLinkCheckerPatterns as mt,getSidebarReferences as gt,hasCircularDependency as pt}from"./utils.js";import{getLocaleFromRelativePath as ht}from"../../fs/utils/get-locale-from-relative-path.js";import{isSystemRouteSlug as St}from"../../utils/system-routes.js";import{ENTITIES_MAP_GLOBAL_DATA_KEY as yt}from"../../constants/plugins/catalog-entities.js";import{telemetryTraceStep as bt}from"../../../cli/telemetry/helpers/trace-step.js";const Ft=180,It=170,Ct=10;async function Jt({contentDir:l}){return{id:"sidebars",async afterRoutesCreated(o,i){await bt("build.plugin.sidebars",async()=>{const{cache:d,fs:c}=i,I=o.getConfig(),C=new Map,D=new Set,B=[v,...c.localeFolders],j=o.getGlobalData()[yt]||{},G=new Map;let L=c.scan(/sidebars.yaml$/).map(({relativePath:t})=>t).filter(t=>!wt(I.ignore??[],t)&&t);const $=await gt(i,l,L),q=it(L.filter(t=>!$.has(t)),t=>ct(t)?.versionFolderPath||t),_=mt(I),Q=await dt(I?.navbar,o,i,{navFile:V,excludedFromLinkCheckerPatterns:_});let P;const T=pt($);T&&Array.isArray(T)&&await A.panicOnBuildContentError(`Sidebar references have circular dependency. Please check your sidebar files.
2
2
  Circular dependency chain: ${T.reverse().join(" -> ")}
3
- `);for(const t of q){const m=(await Promise.all(t.map(async n=>{const e=(await d.load(n,"yaml")).data;if(!Array.isArray(e)){await A.panicOnBuildContentErrorForRealFile('Invalid sidebar contents at %rp, items should be an array, got "%s"',n,c,n,typeof e);return}return{items:e,sidebarRelativePath:n,locale:ht(n)}}))).filter(X),r=(await k(m))?.firstLink;w||(w=r)}const z=Object.entries(I?.catalogClassic??{});for(const t of B){for(const[e,s]of z)await W(e,s,t);const m={},r=new Set,n=o.getAllRoutesForLocale(t);for(const e of n)if(U(e)&&e.fsPath&&!r.has(e.fsPath)){r.add(e.fsPath);let f=u.posix.dirname(e.fsPath);const h=u.parse(f).root;do m[f]=(m[f]||0)+1,f=u.dirname(f);while(f&&f!="."&&h!=f)}for(const e of n){if(D.has(e.slug))continue;const s=U(e),f=u.dirname(e.fsPath),h=m[f]===1,g=Et(e.baseSlug||e.slug);s&&h?await k([{items:[{directory:f}],sidebarRelativePath:"sidebar.yaml_"+g,locale:t}]):e.getSidebar!==void 0&&await k([{items:[{page:e.fsPath}],sidebarRelativePath:"sidebar.yaml_"+g,locale:t}])}for(const[e,s]of z)await W(e,s,t,!0)}if(L.length===0)for(const t of B){x.verbose("Creating default sidebar");const m=t===E,r=`sidebars.yaml${m?"":"_"+t}`,n=m?"":`${c.localizationFolder}/${t}`,e=(await k([{items:[{directory:`./${n}`}],sidebarRelativePath:r,locale:t,ignoredRoutes:P}]))?.firstLink;w||(w=e)}if(!o.getRouteBySlug("/")&&!o.getConfig().redirects?.["/"]){const m=o.getAllRoutes().find(n=>!St(n.slug)),r=w?w.link:m?.baseSlug??null;if(r){const n=ot(r);o.addRedirect("/",{to:n,type:302}),x.info("Creating default redirect for index page => %s",n)}}const H=nt("REDOCLY_METADATA_OUTPUT_FOLDER");H&&(x.info("Writing catalog data..."),tt(u.join(H,rt),JSON.stringify(Object.fromEntries(G.entries()))));function U(t){return P.has(t.slug)||j[t.fsPath]}async function k(t){if(t.length===0)return;const r=(await Promise.all(t.map(async({items:g,locale:F,sidebarRelativePath:p,ignoredRoutes:R})=>{const a=await Z(g,u.dirname(u.join(l,p)),o,i,{locale:F,ignoredRoutes:R,navFile:p,excludedFromLinkCheckerPatterns:_});if(!a){await A.panicOnBuild("Failed to resolve sidebar configuration. Make sure %rp is valid",p);return}return a}))).flat().filter(X),n=N(r,"routeSlug"),e=t[0].sidebarRelativePath,s=J(e),f=new Set;for(const g of n){const F=o.getRouteBySlug(g)?.fsPath??"",p=j[F];p&&(Array.from(f).find(a=>a.key===p.key&&a.version===p.version)||f.add(p)),o.addRouteSharedData(g,"sidebar",s),D.set(Y(g),r)}const h=f.size===1?Array.from(f)[0]:void 0;return await o.createSharedData(s,{relatedNavbarItem:Q?.get(e),items:r,catalogEntity:h?{key:h.key,version:h.version}:void 0}),{firstLink:M(r,g=>!!g.link),resolved:r}}async function W(t,m,r,n=!1){const e=structuredClone(m);r&&r!==E&&e.items.forEach(a=>{a.directory=u.posix.join(c.localizationFolder||"",r,a.directory||"")});let s=await Z(e.items,l,o,i,{groupCustomSidebars:!0,locale:r,navFile:K,excludedFromLinkCheckerPatterns:_});if(s&&(s=wt(s)),!s){await A.panicOnBuild(`Failed to resolve catalog configuration. Make sure catalog ${t} has valid config`);return}const f=r===E?"":"/"+r.toLowerCase(),h=r===E?"":`-${r}`,g=Y(u.posix.join(f,e.slug));if(n)for(const a of s){const S=M(a.items||[],b=>!!b.routeSlug);if(!S?.routeSlug)continue;const y=D.get(S.routeSlug);if(!y)continue;const O=N(y,"routeSlug"),v="current-catalog-info-"+a.routeSlug+h,C={catalog:{label:e.title,titleTranslationKey:e.titleTranslationKey,link:g,icon:e?.icon},item:{label:a.metadata?.title,link:a.link,icon:a.icon}};await o.createSharedData(v,C);for(const b of O)o.addRouteSharedData(b,"current-catalog-info",v),P.add(b);const V=M(y,b=>!!b.link&&!b.external&&st(b.link)&&(!a.version||b.version===a.version));V&&(a.sidebar=[{...V,items:void 0}])}const F={},p=new Set;for(const a of s){if(!(a.routeSlug||a.sidebar?.[0]?.routeSlug)||!a.fsPath||p.has(a.fsPath))continue;p.add(a.fsPath);const y=u.dirname(a.fsPath);F[y]=(F[y]||0)+1}if(n){const a=await o.createSharedData("catalog-"+t+h,s.flatMap(S=>{const y=u.dirname(S.fsPath??""),O=F[y]===1,v=C=>({...C,fsPath:O?y:C.fsPath??""});return S.type==="group"&&S.items?.every(C=>C.type==="group")?(S.items||[]).map(v):v(S)}));o.addRouteSharedData(g,"catalog",a),Pt(r,s,G,F)}const R=N(s,"routeSlug");for(const a of R)P.add(a)}})}}}function Pt(l,o,i,d){if(l===E)for(const c of o){const I=c.routeSlug||c.sidebar?.[0]?.routeSlug;if(!I||!c.fsPath)continue;const D=u.dirname(c.fsPath),P=d[D]===1;i.set(I,{rootFileFsPath:c.fsPath,fsPath:P?D:c.fsPath,metadata:c.metadata||{},title:c.metadata?.title||c.label||"Untitled",version:c.version||"latest"})}}function wt(l){const o=i=>{if(!i)return i;const d=et.parse(i);return ut([d])};return l.map(i=>{const d={...i};return d.metadata?.description&&(d.metadata={...d.metadata,description:o(d.metadata.description)}),d})}function J(l){return at+lt(l)}async function qt(l,o,i){const d=u.posix.join(u.dirname(l),o);return await i.exists(d)?J(d):(await A.panicOnBuildContentErrorForRealFile("File %rp: Failed to create relative path for sidebars.yaml using %s",l,i,l,o),null)}function Ct(l,o){const i=/\/?([a-zA-Z0-9-_]+\/)*sidebars?(-[a-zA-Z0-9-_]+)?\.yaml/;return l.filter(c=>i.test(c)).includes(o)}function Et(l){const o=l.replaceAll("/","_");if(o.length>Ft){const i=o.slice(0,It),d=ft(l).slice(0,Dt).replaceAll("/","_");return i+d}else return o}export{Ct as isSidebarIgnored,wt as removeMarkdownTags,qt as resolveSidebarId,Jt as sidebarsPlugin};
3
+ `);for(const t of q){const m=(await Promise.all(t.map(async n=>{const e=(await d.load(n,"yaml")).data;if(!Array.isArray(e)){await A.panicOnBuildContentErrorForRealFile('Invalid sidebar contents at %rp, items should be an array, got "%s"',n,c,n,typeof e);return}return{items:e,sidebarRelativePath:n,locale:ht(n)}}))).filter(X),r=(await k(m))?.firstLink;P||(P=r)}const z=Object.entries(I?.catalogClassic??{});for(const t of B){for(const[e,s]of z)await W(e,s,t);const m={},r=new Set,n=o.getAllRoutesForLocale(t);for(const e of n)if(U(e)&&e.fsPath&&!r.has(e.fsPath)){r.add(e.fsPath);let f=u.posix.dirname(e.fsPath);const h=u.parse(f).root;do m[f]=(m[f]||0)+1,f=u.dirname(f);while(f&&f!="."&&h!=f)}for(const e of n){if(C.has(e.slug))continue;const s=U(e),f=u.dirname(e.fsPath),h=m[f]===1,g=vt(e.baseSlug||e.slug);s&&h?await k([{items:[{directory:f}],sidebarRelativePath:"sidebar.yaml_"+g,locale:t}]):e.getSidebar!==void 0&&await k([{items:[{page:e.fsPath}],sidebarRelativePath:"sidebar.yaml_"+g,locale:t}])}for(const[e,s]of z)await W(e,s,t,!0)}if(L.length===0)for(const t of B){x.verbose("Creating default sidebar");const m=t===v,r=`sidebars.yaml${m?"":"_"+t}`,n=m?"":`${c.localizationFolder}/${t}`,e=(await k([{items:[{directory:`./${n}`}],sidebarRelativePath:r,locale:t,ignoredRoutes:D}]))?.firstLink;P||(P=e)}if(!o.getRouteBySlug("/")&&!o.getConfig().redirects?.["/"]){const m=o.getAllRoutes().find(n=>!St(n.slug)),r=P?P.link:m?.baseSlug??null;if(r){const n=ot(r);o.addRedirect("/",{to:n,type:302}),x.info("Creating default redirect for index page => %s",n)}}const H=nt.REDOCLY_METADATA_OUTPUT_FOLDER;H&&(x.info("Writing catalog data..."),tt(u.join(H,rt),JSON.stringify(Object.fromEntries(G.entries()))));function U(t){return D.has(t.slug)||j[t.fsPath]}async function k(t){if(t.length===0)return;const r=(await Promise.all(t.map(async({items:g,locale:F,sidebarRelativePath:p,ignoredRoutes:R})=>{const a=await Z(g,u.dirname(u.join(l,p)),o,i,{locale:F,ignoredRoutes:R,navFile:p,excludedFromLinkCheckerPatterns:_});if(!a){await A.panicOnBuild("Failed to resolve sidebar configuration. Make sure %rp is valid",p);return}return a}))).flat().filter(X),n=N(r,"routeSlug"),e=t[0].sidebarRelativePath,s=J(e),f=new Set;for(const g of n){const F=o.getRouteBySlug(g)?.fsPath??"",p=j[F];p&&(Array.from(f).find(a=>a.key===p.key&&a.version===p.version)||f.add(p)),o.addRouteSharedData(g,"sidebar",s),C.set(Y(g),r)}const h=f.size===1?Array.from(f)[0]:void 0;return await o.createSharedData(s,{relatedNavbarItem:Q?.get(e),items:r,catalogEntity:h?{key:h.key,version:h.version}:void 0}),{firstLink:M(r,g=>!!g.link),resolved:r}}async function W(t,m,r,n=!1){const e=structuredClone(m);r&&r!==v&&e.items.forEach(a=>{a.directory=u.posix.join(c.localizationFolder||"",r,a.directory||"")});let s=await Z(e.items,l,o,i,{groupCustomSidebars:!0,locale:r,navFile:V,excludedFromLinkCheckerPatterns:_});if(s&&(s=Pt(s)),!s){await A.panicOnBuild(`Failed to resolve catalog configuration. Make sure catalog ${t} has valid config`);return}const f=r===v?"":"/"+r.toLowerCase(),h=r===v?"":`-${r}`,g=Y(u.posix.join(f,e.slug));if(n)for(const a of s){const S=M(a.items||[],b=>!!b.routeSlug);if(!S?.routeSlug)continue;const y=C.get(S.routeSlug);if(!y)continue;const O=N(y,"routeSlug"),E="current-catalog-info-"+a.routeSlug+h,w={catalog:{label:e.title,titleTranslationKey:e.titleTranslationKey,link:g,icon:e?.icon},item:{label:a.metadata?.title,link:a.link,icon:a.icon}};await o.createSharedData(E,w);for(const b of O)o.addRouteSharedData(b,"current-catalog-info",E),D.add(b);const K=M(y,b=>!!b.link&&!b.external&&st(b.link)&&(!a.version||b.version===a.version));K&&(a.sidebar=[{...K,items:void 0}])}const F={},p=new Set;for(const a of s){if(!(a.routeSlug||a.sidebar?.[0]?.routeSlug)||!a.fsPath||p.has(a.fsPath))continue;p.add(a.fsPath);const y=u.dirname(a.fsPath);F[y]=(F[y]||0)+1}if(n){const a=await o.createSharedData("catalog-"+t+h,s.flatMap(S=>{const y=u.dirname(S.fsPath??""),O=F[y]===1,E=w=>({...w,fsPath:O?y:w.fsPath??""});return S.type==="group"&&S.items?.every(w=>w.type==="group")?(S.items||[]).map(E):E(S)}));o.addRouteSharedData(g,"catalog",a),Dt(r,s,G,F)}const R=N(s,"routeSlug");for(const a of R)D.add(a)}})}}}function Dt(l,o,i,d){if(l===v)for(const c of o){const I=c.routeSlug||c.sidebar?.[0]?.routeSlug;if(!I||!c.fsPath)continue;const C=u.dirname(c.fsPath),D=d[C]===1;i.set(I,{rootFileFsPath:c.fsPath,fsPath:D?C:c.fsPath,metadata:c.metadata||{},title:c.metadata?.title||c.label||"Untitled",version:c.version||"latest"})}}function Pt(l){const o=i=>{if(!i)return i;const d=et.parse(i);return ut([d])};return l.map(i=>{const d={...i};return d.metadata?.description&&(d.metadata={...d.metadata,description:o(d.metadata.description)}),d})}function J(l){return at+lt(l)}async function qt(l,o,i){const d=u.posix.join(u.dirname(l),o);return await i.exists(d)?J(d):(await A.panicOnBuildContentErrorForRealFile("File %rp: Failed to create relative path for sidebars.yaml using %s",l,i,l,o),null)}function wt(l,o){const i=/\/?([a-zA-Z0-9-_]+\/)*sidebars?(-[a-zA-Z0-9-_]+)?\.yaml/;return l.filter(c=>i.test(c)).includes(o)}function vt(l){const o=l.replaceAll("/","_");if(o.length>Ft){const i=o.slice(0,It),d=ft(l).slice(0,Ct).replaceAll("/","_");return i+d}else return o}export{wt as isSidebarIgnored,Pt as removeMarkdownTags,qt as resolveSidebarId,Jt as sidebarsPlugin};
@@ -1 +1 @@
1
- import{DEFAULT_SSO_IDP_TITLE as d}from"../../../constants/common.js";import{telemetryTraceStep as u}from"../../../cli/telemetry/helpers/trace-step.js";const f="https://auth.cloud.redocly.com/oidc/.well-known/openid-configuration",y="https://auth.cloud.redocly.com/api/sso/oidc/introspect";async function _(g){return{id:"sso",async processContent(e){await u("build.plugin.sso",async c=>{const o=e.getConfig();if(c?.setAttribute("config",`{"ssoDirect": ${JSON.stringify(o.ssoDirect||{})}}, {"sso": ${JSON.stringify(o.sso||{})}}`),o.ssoDirect&&typeof o.ssoDirect=="object"&&Object.keys(o.ssoDirect).length!==0||o.sso&&Array.isArray(o.sso)&&!o.sso.length)return;const a=!!(o.rbac&&typeof o.rbac=="object"&&Object.keys(o.rbac).length!==0),p=o.requiresLogin;if(!a&&!p)return;let n=f,i=process.env.REDOCLY_OAUTH_USE_INTROSPECT?y:"";const s=o.residency;if(s){const r=s.endsWith("/")?s.slice(0,-1):s;n=`${r.replace("app.","auth.")}/oidc/.well-known/openid-configuration`,i=process.env.REDOCLY_OAUTH_USE_INTROSPECT?`${r}/api/sso/oidc/introspect`:""}let t="AUTO";o.sso&&(Array.isArray(o.sso)?t=o.sso.join(","):t=o.sso);const l={oidc:{title:d,type:"OIDC",configurationUrl:n,clientId:"{{ process.env.OAUTH_CLIENT_ID }}",clientSecret:"{{ process.env.OAUTH_CLIENT_SECRET }}",teamsClaimName:"https://redocly.com/sso/teams",scopes:["openid"],authorizationRequestCustomParams:{login_hint:"{{ process.env.ORGANIZATION_ID }}",login_type:t,prompt:"login"},audience:"{{ process.env.ORGANIZATION_ID }}",introspectEndpoint:i}};e.setGlobalConfig({ssoDirect:l})})},async afterRoutesCreated(e){}}}export{_ as ssoPlugin};
1
+ import{DEFAULT_SSO_IDP_TITLE as f}from"../../../constants/common.js";import{envConfig as c}from"../../../config/env-config.js";import{telemetryTraceStep as u}from"../../../cli/telemetry/helpers/trace-step.js";const g="https://auth.cloud.redocly.com/oidc/.well-known/openid-configuration",y="https://auth.cloud.redocly.com/api/sso/oidc/introspect";async function m(C){return{id:"sso",async processContent(e){await u("build.plugin.sso",async a=>{const o=e.getConfig();if(a?.setAttribute("config",`{"ssoDirect": ${JSON.stringify(o.ssoDirect||{})}}, {"sso": ${JSON.stringify(o.sso||{})}}`),o.ssoDirect&&typeof o.ssoDirect=="object"&&Object.keys(o.ssoDirect).length!==0||o.sso&&Array.isArray(o.sso)&&!o.sso.length)return;const l=!!(o.rbac&&typeof o.rbac=="object"&&Object.keys(o.rbac).length!==0),p=o.requiresLogin;if(!l&&!p)return;let i=g,n=c.REDOCLY_OAUTH_USE_INTROSPECT?y:"";const s=o.residency;if(s){const r=s.endsWith("/")?s.slice(0,-1):s;i=`${r.replace("app.","auth.")}/oidc/.well-known/openid-configuration`,n=c.REDOCLY_OAUTH_USE_INTROSPECT?`${r}/api/sso/oidc/introspect`:""}let t="AUTO";o.sso&&(Array.isArray(o.sso)?t=o.sso.join(","):t=o.sso);const d={oidc:{title:f,type:"OIDC",configurationUrl:i,clientId:"{{ process.env.OAUTH_CLIENT_ID }}",clientSecret:"{{ process.env.OAUTH_CLIENT_SECRET }}",teamsClaimName:"https://redocly.com/sso/teams",scopes:["openid"],authorizationRequestCustomParams:{login_hint:"{{ process.env.ORGANIZATION_ID }}",login_type:t,prompt:"login"},audience:"{{ process.env.ORGANIZATION_ID }}",introspectEndpoint:n}};e.setGlobalConfig({ssoDirect:d})})},async afterRoutesCreated(e){}}}export{m as ssoPlugin};
@@ -1 +1 @@
1
- import{SQLD_REMOTE_DATABASE_URL_NO_DEPLOYMENT_YET_VAR as i}from"../../constants/plugins/catalog-entities.js";class n{static#e="ORGANIZATION_ID";static#t="PROJECT_ID";organizationId;projectId;databaseClient;path;constructor(t){const e=this.isNonRemoteDatabaseMode();this.organizationId=this.#n(e),this.projectId=this.#i(e),this.databaseClient=t.client,this.path=t.path}async close(){await this.databaseClient.close()}async sync(){await this.databaseClient.sync()}#n=t=>{const e=process.env.ORGANIZATION_ID;if(e)return e;if(t)return n.#e;throw new Error("ORGANIZATION_ID environment variable is required. Ensure it is set in your environment configuration.")};#i=t=>{const e=process.env.PROJECT_ID;if(e)return e;if(t)return n.#t;throw new Error("PROJECT_ID environment variable is required. Ensure it is set in your environment configuration.")};isNonRemoteDatabaseMode=()=>process.env.SQLD_REMOTE_DATABASE_URL===i||!process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN}export{n as BaseRepository};
1
+ import{envConfig as i}from"../../../config/env-config.js";import{SQLD_REMOTE_DATABASE_URL_NO_DEPLOYMENT_YET_VAR as r}from"../../constants/plugins/catalog-entities.js";class n{static#t="ORGANIZATION_ID";static#e="PROJECT_ID";organizationId;projectId;databaseClient;path;constructor(e){const t=this.isNonRemoteDatabaseMode();this.organizationId=this.#i(t),this.projectId=this.#n(t),this.databaseClient=e.client,this.path=e.path}async close(){await this.databaseClient.close()}async sync(){await this.databaseClient.sync()}#i=e=>{const t=i.ORGANIZATION_ID;if(t)return t;if(e)return n.#t;throw new Error("ORGANIZATION_ID environment variable is required. Ensure it is set in your environment configuration.")};#n=e=>{const t=i.PROJECT_ID;if(t)return t;if(e)return n.#e;throw new Error("PROJECT_ID environment variable is required. Ensure it is set in your environment configuration.")};isNonRemoteDatabaseMode=()=>i.SQLD_REMOTE_DATABASE_URL===r||!i.SQLD_REMOTE_DATABASE_AUTH_TOKEN}export{n as BaseRepository};
@@ -1 +1 @@
1
- import{logger as n}from"../../tools/notifiers/logger.js";import{isLocalDevelopment as i}from"../../../utils/env/is-local-development.js";import{CATALOG_LOCAL_DATABASE_FOLDER as A,CATALOG_LOCAL_DATABASE_MIGRATIONS_FOLDER as s,CATALOG_LOCAL_DATABASE_NAME as l,MAIN_LOCAL_DATABASE_FOLDER as _,MAIN_LOCAL_DATABASE_MIGRATIONS_FOLDER as c,MAIN_LOCAL_DATABASE_NAME as E,SQLD_REMOTE_DATABASE_FOLDER as D,SQLD_REMOTE_DATABASE_MIGRATIONS_FOLDER as T,SQLD_REMOTE_DATABASE_NAME as L}from"./constants.js";import{LocalDatabaseInitializationStrategy as o,RemoteDatabaseInitializationStrategy as d}from"./database-initialization-strategy.js";import{DatabaseConnectionsManager as m}from"./database-connections-manager.js";import{SQLD_REMOTE_DATABASE_URL_NO_DEPLOYMENT_YET_VAR as O}from"../../constants/plugins/catalog-entities.js";class N{static async create(a,t){switch(a){case"main-local":return await this.#a(t);case"catalog-local":return await this.#t(t);case"sqld-remote":return await this.#e(t);default:return null}}static async#a(a){return await new o().initialize({...a,databaseName:E,additionalFolder:_,migrationsFolder:c})}static async#t(a){return await new o().initialize({...a,databaseName:l,additionalFolder:A,migrationsFolder:s})}static async#e(a){try{const t=process.env.SQLD_REMOTE_DATABASE_URL||a.sqldRemoteDatabaseUrl,e=t===O?void 0:t,r=process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN||a.sqldRemoteDatabaseAuthToken;return(!e||!r)&&!i()?(n.warn("Your remote database is not initialized yet, please wait for production deployment."),null):await m.getConnection({config:{...a,databaseName:L,additionalFolder:D,migrationsFolder:T,syncUrl:e,authToken:process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN||a.sqldRemoteDatabaseAuthToken},strategy:new d})}catch(t){return n.error("Remote database connection initialization failed",t),null}}}export{N as DatabaseConnectionFactory};
1
+ import{logger as i}from"../../tools/notifiers/logger.js";import{envConfig as e}from"../../../config/env-config.js";import{CATALOG_LOCAL_DATABASE_FOLDER as A,CATALOG_LOCAL_DATABASE_MIGRATIONS_FOLDER as s,CATALOG_LOCAL_DATABASE_NAME as _,MAIN_LOCAL_DATABASE_FOLDER as l,MAIN_LOCAL_DATABASE_MIGRATIONS_FOLDER as c,MAIN_LOCAL_DATABASE_NAME as E,SQLD_REMOTE_DATABASE_FOLDER as D,SQLD_REMOTE_DATABASE_MIGRATIONS_FOLDER as T,SQLD_REMOTE_DATABASE_NAME as L}from"./constants.js";import{LocalDatabaseInitializationStrategy as o,RemoteDatabaseInitializationStrategy as d}from"./database-initialization-strategy.js";import{DatabaseConnectionsManager as m}from"./database-connections-manager.js";import{SQLD_REMOTE_DATABASE_URL_NO_DEPLOYMENT_YET_VAR as O}from"../../constants/plugins/catalog-entities.js";class N{static async create(a,t){switch(a){case"main-local":return await this.#a(t);case"catalog-local":return await this.#t(t);case"sqld-remote":return await this.#e(t);default:return null}}static async#a(a){return await new o().initialize({...a,databaseName:E,additionalFolder:l,migrationsFolder:c})}static async#t(a){return await new o().initialize({...a,databaseName:_,additionalFolder:A,migrationsFolder:s})}static async#e(a){try{const t=e.SQLD_REMOTE_DATABASE_URL||a.sqldRemoteDatabaseUrl,n=t===O?void 0:t,r=e.SQLD_REMOTE_DATABASE_AUTH_TOKEN||a.sqldRemoteDatabaseAuthToken;return(!n||!r)&&!e.isDevelopMode?(i.warn("Your remote database is not initialized yet, please wait for production deployment."),null):await m.getConnection({config:{...a,databaseName:L,additionalFolder:D,migrationsFolder:T,syncUrl:n,authToken:e.SQLD_REMOTE_DATABASE_AUTH_TOKEN||a.sqldRemoteDatabaseAuthToken},strategy:new d})}catch(t){return i.error("Remote database connection initialization failed",t),null}}}export{N as DatabaseConnectionFactory};
@@ -1 +1 @@
1
- import{logger as r}from"../../tools/notifiers/logger.js";import{DatabaseConnectionFactory as a}from"./database-connection-factory.js";class e{static#e=!1;static async init(t){if(!(process.env.REDOCLY_LOCAL_DEV==="true"||process.env.CI==="true")&&!e.#e)try{await e.#t(t)==="PRECONNECTED"&&(e.#e=!0)}catch(o){r.error("Failed to preconnect to sqld remote database",o)}}static#t=async t=>await a.create("sqld-remote",{baseDbDir:t})?(r.info("Sqld remote database preconnected"),"PRECONNECTED"):(r.warn("Sqld remote database preconnect failed"),"NOT_PRECONNECTED")}export{e as DatabasePreconnectService};
1
+ import{logger as o}from"../../tools/notifiers/logger.js";import{envConfig as n}from"../../../config/env-config.js";import{DatabaseConnectionFactory as i}from"./database-connection-factory.js";class t{static#t=!1;static async init(e){if(!(n.REDOCLY_INTERNAL_DEV==="true"||n.CI==="true")&&!t.#t)try{await t.#e(e)==="PRECONNECTED"&&(t.#t=!0)}catch(r){o.error("Failed to preconnect to sqld remote database",r)}}static#e=async e=>await i.create("sqld-remote",{baseDbDir:e})?(o.info("Sqld remote database preconnected"),"PRECONNECTED"):(o.warn("Sqld remote database preconnect failed"),"NOT_PRECONNECTED")}export{t as DatabasePreconnectService};
@@ -1 +1 @@
1
- import{DatabasePathGenerator as a}from"../../database-path-generator.js";import{SQLD_REMOTE_DATABASE_FOLDER as r,SQLD_REMOTE_DATABASE_NAME as t}from"../../constants.js";import{SCHEMAS_PATH as A}from"../catalog-sqlite/drizzle.config.js";const o="./dist/server/esbuild/cache/server",E="./src/server/providers/database/databases/sqld-sqlite/schemas/*",_="./src/server/providers/database/databases/sqld-sqlite/migrations",d=()=>{const e=process.env.SQLD_REMOTE_DATABASE_URL,s=process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN;return e&&s?{url:e,authToken:s}:{url:a.generateDatabasePath({baseDir:o,databaseName:t,additionalFolder:r})}};var n={schema:[E,A],out:_,dialect:"turso",dbCredentials:d()};export{n as default};
1
+ import{DatabasePathGenerator as s}from"../../database-path-generator.js";import{SQLD_REMOTE_DATABASE_FOLDER as t,SQLD_REMOTE_DATABASE_NAME as A}from"../../constants.js";import{SCHEMAS_PATH as o}from"../catalog-sqlite/drizzle.config.js";import{envConfig as r}from"../../../../../config/env-config.js";const E="./dist/server/esbuild/cache/server",_="./src/server/providers/database/databases/sqld-sqlite/schemas/*",i="./src/server/providers/database/databases/sqld-sqlite/migrations",d=()=>{const e=r.SQLD_REMOTE_DATABASE_URL,a=r.SQLD_REMOTE_DATABASE_AUTH_TOKEN;return e&&a?{url:e,authToken:a}:{url:s.generateDatabasePath({baseDir:E,databaseName:A,additionalFolder:t})}};var c={schema:[_,o],out:i,dialect:"turso",dbCredentials:d()};export{c as default};
@@ -1 +1 @@
1
- import{pathToFileURL as F}from"url";import{HelmetProvider as q}from"@dr.pogodin/react-helmet";import{renderToString as l}from"react-dom/server";import{StaticRouterProvider as Y,createStaticHandler as z,createStaticRouter as G}from"react-router-dom/server.js";import r from"react";import{readFile as J}from"fs/promises";import{join as K}from"path";import{withPathPrefix as m,getLocaleFromPathname as Q,withoutPathPrefix as V,removeTrailingSlash as W}from"@redocly/theme/core/utils";import{RUNTIME_RESOURCES_DIR as T}from"../constants/common.js";import{slash as X}from"../../utils/path/slash.js";import{reporter as Z}from"../tools/notifiers/reporter.js";import{isDevelopMode as tt}from"../utils/envs/is-develop-mode.js";import{slug as et}from"../utils/slugger.js";import{htmlTemplate as rt}from"./template.js";import{detectColorSchemaScript as ot,generatePreloadPageData as st}from"./utils.js";import"./hijack-console.js";import{getSitemapLinkTag as nt}from"./get-sitemap-link-tag.js";let p="";async function at(t){return process.env.REDOCLY_STATIC_BUNDLE?await import("../../client/server-entry.js"):await import(F(`${X(t)}/server-entry.js`)+"?"+new Date)}async function vt(t){if(!process.env.REDOCLY_STATIC_BUNDLE){const e=Z.getCompilationProblems();if(e.length>0){const{renderCompilationError:n}=await import("./render-compilation-error.js");return n(e)}}const{Loader:g,App:d,routes:E,ServerStyleSheet:R,StyleSheetManager:C,ErrorDetails:w,initL10n:D}=await at(t.serverOutDir),{page:u,store:{globalData:S,hasSitemap:y},sharedData:P,ssrHref:v}=t,h=S?.l10n,i=Q(V(u.slug),h?.defaultLocale,h?.locales),f=t.page.request?.url||"http://localhost/";await g.prepare({...u,slug:W(new URL(f).pathname)},P,S,i),await D(i);const c=new R,{query:L,dataRoutes:_}=z([{Component:d,path:m("*"),children:E}]),s=await L(new Request(f));if(s instanceof Response)throw s;const B=G(_,s);try{globalThis.SSR_HOSTNAME=v,globalThis.SSR_USER_AGENT=t.userAgent,globalThis.SSR_OMIT_SUSPENSE=t.omitSuspense;const e={},n=l(r.createElement(q,{context:e},r.createElement(C,{sheet:c.instance},r.createElement(Y,{router:B,context:s})))),b=y?nt():"",a=e.helmet,x=a?.title.toString()||"",U=t.store.globalData?.logo?.favicon,o=t.store.config,k=`<link rel="preload" as="fetch" crossorigin="anonymous" href="${m("/app-data.json")}" />`,A=st(t.page.slug),M=ot(o),j=t.page.product?.name?`product-${et(t.page.product.name)}`:"",H=t.store.ssr.headTags.join(""),N=t.store.ssr.postBodyTags.join(""),O=t.store.ssr.preBodyTags.join(""),I=`<link rel="stylesheet" href="${m(T)}/browser-entry.css" />`;!tt()&&!p&&(p=`<style>${await J(K(t.outdir,T,"browser-entry.css"),"utf-8")}</style>`);const $={bodyHtml:n,linkTags:o.linkTags+c.getStyleTags()+(a?.link.toString()||""),title:x,favicon:U,headScriptTags:b+M+o.headScriptTags+H+(a?.script.toString()||"")+(a?.meta.toString()||""),preload:[k,A],postBodyScriptTags:o.postBodyScriptTags+N,preBodyScriptTags:o.preBodyScriptTags||""+O,lang:i,productClass:j,runtimeCss:p||I};return{html:rt($),statusCode:200}}catch(e){return t.telemetry.sendSsrErrorCaughtMessage({message:e.message}),{html:l(r.createElement(w,{error:e})),statusCode:500,error:e}}finally{c.seal(),g.clear()}}function Lt(t){return l(r.createElement(r.Fragment,null,...t))}export{vt as render,Lt as renderComponents};
1
+ import{pathToFileURL as I}from"url";import{HelmetProvider as z}from"@dr.pogodin/react-helmet";import{renderToString as m}from"react-dom/server";import{StaticRouterProvider as G,createStaticHandler as J,createStaticRouter as K}from"react-router-dom/server.js";import r from"react";import{readFile as Q}from"fs/promises";import{join as V}from"path";import{withPathPrefix as l,getLocaleFromPathname as W,withoutPathPrefix as X,removeTrailingSlash as Y}from"@redocly/theme/core/utils";import{RUNTIME_RESOURCES_DIR as T}from"../constants/common.js";import{slash as Z}from"../../utils/path/slash.js";import{reporter as tt}from"../tools/notifiers/reporter.js";import{envConfig as p}from"../../config/env-config.js";import{slug as et}from"../utils/slugger.js";import{htmlTemplate as rt}from"./template.js";import{detectColorSchemaScript as ot,generatePreloadPageData as st}from"./utils.js";import"./hijack-console.js";import{getSitemapLinkTag as nt}from"./get-sitemap-link-tag.js";let g="";async function at(t){return p.isRuntimeMode?await import("../../client/server-entry.js"):await import(I(`${Z(t)}/server-entry.js`)+"?"+new Date)}async function vt(t){if(!p.isRuntimeMode){const e=tt.getCompilationProblems();if(e.length>0){const{renderCompilationError:n}=await import("./render-compilation-error.js");return n(e)}}const{Loader:u,App:R,routes:E,ServerStyleSheet:w,StyleSheetManager:C,ErrorDetails:y,initL10n:P}=await at(t.serverOutDir),{page:h,store:{globalData:S,hasSitemap:D},sharedData:v,ssrHref:b}=t,f=S?.l10n,i=W(X(h.slug),f?.defaultLocale,f?.locales),d=t.page.request?.url||"http://localhost/";await u.prepare({...h,slug:Y(new URL(d).pathname)},v,S,i),await P(i);const c=new w,{query:M,dataRoutes:x}=J([{Component:R,path:l("*"),children:E}]),s=await M(new Request(d));if(s instanceof Response)throw s;const B=K(x,s);try{globalThis.SSR_HOSTNAME=b,globalThis.SSR_USER_AGENT=t.userAgent,globalThis.SSR_OMIT_SUSPENSE=t.omitSuspense;const e={},n=m(r.createElement(z,{context:e},r.createElement(C,{sheet:c.instance},r.createElement(G,{router:B,context:s})))),L=D?nt():"",a=e.helmet,k=a?.title.toString()||"",_=t.store.globalData?.logo?.favicon,o=t.store.config,j=`<link rel="preload" as="fetch" crossorigin="anonymous" href="${l("/app-data.json")}" />`,H=st(t.page.slug),U=ot(o),A=t.page.product?.name?`product-${et(t.page.product.name)}`:"",$=t.store.ssr.headTags.join(""),F=t.store.ssr.postBodyTags.join(""),N=t.store.ssr.preBodyTags.join(""),O=`<link rel="stylesheet" href="${l(T)}/browser-entry.css" />`;!p.isDevelopMode&&!g&&(g=`<style>${await Q(V(t.outdir,T,"browser-entry.css"),"utf-8")}</style>`);const q={bodyHtml:n,linkTags:o.linkTags+c.getStyleTags()+(a?.link.toString()||""),title:k,favicon:_,headScriptTags:L+U+o.headScriptTags+$+(a?.script.toString()||"")+(a?.meta.toString()||""),preload:[j,H],postBodyScriptTags:o.postBodyScriptTags+F,preBodyScriptTags:o.preBodyScriptTags||""+N,lang:i,productClass:A,runtimeCss:g||O};return{html:rt(q),statusCode:200}}catch(e){return t.telemetry.sendSsrErrorCaughtMessage({message:e.message}),{html:m(r.createElement(y,{error:e})),statusCode:500,error:e}}finally{c.seal(),u.clear()}}function bt(t){return m(r.createElement(r.Fragment,null,...t))}export{vt as render,bt as renderComponents};
@@ -1 +1 @@
1
- import{logger as i}from"../../tools/notifiers/logger.js";import{reporter as m}from"../../tools/notifiers/reporter.js";import{enhanceContext as f}from"../../api-routes/helpers/enhance-context.js";import{KvService as l}from"../../persistence/kv/services/kv-service.js";import{enhanceRequest as u}from"../../api-routes/helpers/enhance-request.js";async function S({route:r,ctx:t,staticData:n,serverPropsGetters:a,serverPropsUser:p,actions:s}){try{if(!a[r.fsPath]||!t)return;const e=a[r.fsPath];e||await m.panicOnBuild(`Invalid page props getter id: "${r.fsPath}" for route "${r.slug}"`);const o=async()=>l.getInstance({baseDbDir:s.serverOutDir,sqldRemoteDatabaseUrl:process.env.SQLD_REMOTE_DATABASE_URL,sqldRemoteDatabaseAuthToken:process.env.SQLD_REMOTE_DATABASE_AUTH_TOKEN}),c=f({honoCtx:t,ctx:{user:p,config:s.getConfig()},getKv:o}),g=await u(t);return await(await e()).default(n,g,c)}catch(e){const o=r.fsPath.replace(/\.(page\.tsx?|md)$/,".props.ts");return i.error(`Page prop getter error: ${e.message}`),{pagePropGetterError:{message:`${e.message||"An unknown error occurred"} in ${o}`,name:"ServerPropsGetterError",stack:e.stack}}}}export{S as getServerPropsFromUserHandler};
1
+ import{logger as m}from"../../tools/notifiers/logger.js";import{reporter as f}from"../../tools/notifiers/reporter.js";import{enhanceContext as l}from"../../api-routes/helpers/enhance-context.js";import{KvService as u}from"../../persistence/kv/services/kv-service.js";import{envConfig as n}from"../../../config/env-config.js";import{enhanceRequest as P}from"../../api-routes/helpers/enhance-request.js";async function _({route:r,ctx:t,staticData:p,serverPropsGetters:a,serverPropsUser:i,actions:s}){try{if(!a[r.fsPath]||!t)return;const e=a[r.fsPath];e||await f.panicOnBuild(`Invalid page props getter id: "${r.fsPath}" for route "${r.slug}"`);const o=async()=>u.getInstance({baseDbDir:s.serverOutDir,sqldRemoteDatabaseUrl:n.SQLD_REMOTE_DATABASE_URL,sqldRemoteDatabaseAuthToken:n.SQLD_REMOTE_DATABASE_AUTH_TOKEN}),g=l({honoCtx:t,ctx:{user:i,config:s.getConfig()},getKv:o}),c=await P(t);return await(await e()).default(p,c,g)}catch(e){const o=r.fsPath.replace(/\.(page\.tsx?|md)$/,".props.ts");return m.error(`Page prop getter error: ${e.message}`),{pagePropGetterError:{message:`${e.message||"An unknown error occurred"} in ${o}`,name:"ServerPropsGetterError",stack:e.stack}}}}export{_ as getServerPropsFromUserHandler};
@@ -1,21 +1,21 @@
1
- import{pathToFileURL as d}from"url";import{removeTrailingSlash as u}from"../../utils/url/remove-trailing-slash.js";import{slash as p}from"../../utils/path/slash.js";import{getClientPageDataUrl as f}from"../../utils/url/get-client-page-data-url.js";import{DEFAULT_COLOR_MODES as l}from"@redocly/theme/core/constants";function E(t){const o=t?.colorMode,{modes:e=[l.LIGHT,l.DARK],hide:r,ignoreDetection:n}=o||{},s=e&&`'${e[0]}'`,a=e?.[0],m=e?.some(i=>i===a)?`'${a}'`:void 0;return r||!s?"":`
1
+ import{pathToFileURL as d}from"url";import{removeTrailingSlash as u}from"../../utils/url/remove-trailing-slash.js";import{slash as p}from"../../utils/path/slash.js";import{getClientPageDataUrl as f}from"../../utils/url/get-client-page-data-url.js";import{DEFAULT_COLOR_MODES as m}from"@redocly/theme/core/constants";import{envConfig as h}from"../../config/env-config.js";function C(t){const o=t?.colorMode,{modes:e=[m.LIGHT,m.DARK],hide:r,ignoreDetection:n}=o||{},a=e&&`'${e[0]}'`,s=e?.[0],l=e?.some(c=>c===s)?`'${s}'`:void 0;return r||!a?"":`
2
2
  <script>
3
3
  if(window&&document.documentElement)
4
4
  {
5
5
  const q=new URLSearchParams(window.location.search).get("colorSchema");
6
6
  const e=q || window.localStorage.getItem("colorSchema");
7
7
  if(e) {
8
- const modeToSet = [${e.map(i=>`'${i}'`)}].some((mode) => mode === e) ? e : 'light';
9
- ${c("modeToSet",e)}
8
+ const modeToSet = [${e.map(c=>`'${c}'`)}].some((mode) => mode === e) ? e : 'light';
9
+ ${i("modeToSet",e)}
10
10
  } else {
11
11
  if (window.matchMedia) {
12
- ${h(n,m,s,e)}
12
+ ${g(n,l,a,e)}
13
13
  } else {
14
- ${c(s,e)}
14
+ ${i(a,e)}
15
15
  }
16
16
  }
17
17
  }
18
- </script>`}function h(t,o,e,r=["light","dark"]){return t?o?c(o,r):e?c(e,r):"return":g(o,r)}function c(t=`'${l.LIGHT}'`,o=["light","dark"]){return`(function() {
18
+ </script>`}function g(t,o,e,r=["light","dark"]){return t?o?i(o,r):e?i(e,r):"return":$(o,r)}function i(t=`'${m.LIGHT}'`,o=["light","dark"]){return`(function() {
19
19
  var root = document.documentElement;
20
20
  var modes = [${o.map(r=>`'${r}'`).join(", ")}];
21
21
  var value = ${t};
@@ -23,7 +23,7 @@ import{pathToFileURL as d}from"url";import{removeTrailingSlash as u}from"../../u
23
23
  root.classList.remove(className);
24
24
  });
25
25
  root.classList.add(value);
26
- })();`}function g(t,o=["light","dark"]){const e=o.map(n=>`'${n}'`).join(", "),r=t?`root.classList.add(${t});`:"";return`(function() {
26
+ })();`}function $(t,o=["light","dark"]){const e=o.map(n=>`'${n}'`).join(", "),r=t?`root.classList.add(${t});`:"";return`(function() {
27
27
  var root = document.documentElement;
28
28
  var modes = [${e}];
29
29
  modes.forEach(function(className) {
@@ -36,4 +36,4 @@ import{pathToFileURL as d}from"url";import{removeTrailingSlash as u}from"../../u
36
36
  }${r?` else {
37
37
  ${r}
38
38
  }`:""}
39
- })();`}async function P(t){try{return process.env.REDOCLY_STATIC_BUNDLE?await import("@portal/server-props"):await import(d(`${p(t)}/server-props-entry.js`)+"?"+new Date)}catch{return{}}}function C(t){const o=t.split("/").map(encodeURIComponent).join("/"),e=o==="/"?o:u(o);return`<link rel="preload" as="fetch" crossorigin="anonymous" href="${f(e)}" />`}const M=(t,o)=>{if(!o)return{params:[],queries:{}};const e=t.slug||"",n=o.req.path.split(e.endsWith("/")?e:`${e}/`)[1]||"",s=o.req.query(),a=n.replace("data.json","");return!a||a==="/"?{params:[],queries:s}:{params:a.split("/").filter(Boolean),queries:s}};export{E as detectColorSchemaScript,C as generatePreloadPageData,M as getPathParams,P as importServerProps};
39
+ })();`}async function E(t){try{return h.isRuntimeMode?await import("@portal/server-props"):await import(d(`${p(t)}/server-props-entry.js`)+"?"+new Date)}catch{return{}}}function T(t){const o=t.split("/").map(encodeURIComponent).join("/"),e=o==="/"?o:u(o);return`<link rel="preload" as="fetch" crossorigin="anonymous" href="${f(e)}" />`}const k=(t,o)=>{if(!o)return{params:[],queries:{}};const e=t.slug||"",n=o.req.path.split(e.endsWith("/")?e:`${e}/`)[1]||"",a=o.req.query(),s=n.replace("data.json","");return!s||s==="/"?{params:[],queries:a}:{params:s.split("/").filter(Boolean),queries:a}};export{C as detectColorSchemaScript,T as generatePreloadPageData,k as getPathParams,E as importServerProps};
@@ -106,15 +106,15 @@ export declare class Store {
106
106
  baseUrl?: string | undefined;
107
107
  } | undefined;
108
108
  } | undefined;
109
- tags?: any;
110
- nodes?: any;
111
- variables?: Record<string, any> | undefined;
112
- functions?: Record<string, import("@markdoc/markdoc").ConfigFunction> | undefined;
113
109
  validation?: {
114
110
  parents?: Node[];
115
111
  validateFunctions?: boolean;
116
112
  environment?: string;
117
113
  };
114
+ tags?: any;
115
+ nodes?: any;
116
+ variables?: Record<string, any> | undefined;
117
+ functions?: Record<string, import("@markdoc/markdoc").ConfigFunction> | undefined;
118
118
  };
119
119
  setGlobalData: (data: GlobalData) => void;
120
120
  getGlobalData: () => GlobalData;