@redocly/realm 0.129.1 → 0.130.0-custom.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (457) hide show
  1. package/CHANGELOG.md +398 -83
  2. package/dist/bin.d.ts +1 -0
  3. package/dist/bin.js +1 -1
  4. package/dist/cli/develop.js +1 -1
  5. package/dist/cli/eject/resolveEjectParams.js +1 -1
  6. package/dist/cli/prepare/copy-env-files.js +1 -1
  7. package/dist/cli/prepare/index.js +1 -1
  8. package/dist/cli/stats/collectors/openapi.d.ts +3 -0
  9. package/dist/cli/stats/collectors/openapi.js +1 -0
  10. package/dist/cli/stats/index.d.ts +7 -0
  11. package/dist/cli/stats/index.js +1 -0
  12. package/dist/cli/stats/options.d.ts +3 -0
  13. package/dist/cli/stats/options.js +1 -0
  14. package/dist/cli/telemetry/index.d.ts +2 -2
  15. package/dist/cli/telemetry/index.js +1 -1
  16. package/dist/client/App.js +1 -1
  17. package/dist/client/ErrorBoundary.js +1 -1
  18. package/dist/client/app/Sidebar/RequestAccessButton.js +2 -2
  19. package/dist/client/app/Sidebar/Sidebar.js +2 -2
  20. package/dist/client/app/Sidebar/helpers/filter-out-versioned-items.js +1 -1
  21. package/dist/client/app/hooks/catalog/useCatalogClassic.d.ts +1 -1
  22. package/dist/client/app/hooks/catalog/useCatalogClassic.js +1 -1
  23. package/dist/client/app/hooks/catalog/useCatalogFilter.js +1 -1
  24. package/dist/client/app/hooks/catalog/useCatalogViewMode.js +1 -1
  25. package/dist/client/app/hooks/catalog/useSearchTracker.js +1 -1
  26. package/dist/client/app/hooks/usePageTimeTracker.js +1 -1
  27. package/dist/client/app/hooks/useRouteChangeTracker.js +1 -1
  28. package/dist/client/app/hooks/useTelemetry.d.ts +2 -2
  29. package/dist/client/app/pages/DevLogin/DevLogin.js +1 -1
  30. package/dist/client/app/search/message-handlers.d.ts +29 -0
  31. package/dist/client/app/search/message-handlers.js +1 -0
  32. package/dist/client/app/search/sse-parser.d.ts +10 -0
  33. package/dist/client/app/search/sse-parser.js +2 -0
  34. package/dist/client/app/search/useAiSearch.d.ts +9 -11
  35. package/dist/client/app/search/useAiSearch.js +1 -1
  36. package/dist/client/app/search/useSearch.js +1 -1
  37. package/dist/client/app/telemetry/index.d.ts +11 -1
  38. package/dist/client/app/telemetry/index.js +1 -1
  39. package/dist/client/browser-entry.js +5 -5
  40. package/dist/client/constants/ai-search.d.ts +30 -0
  41. package/dist/client/constants/ai-search.js +1 -0
  42. package/dist/client/constants/index.d.ts +2 -0
  43. package/dist/client/constants/index.js +1 -0
  44. package/dist/client/providers/hooks.js +1 -1
  45. package/dist/client/runtime/loader.js +1 -1
  46. package/dist/client/types/ai-search.d.ts +73 -0
  47. package/dist/client/types/ai-search.js +0 -0
  48. package/dist/client/types/index.d.ts +1 -0
  49. package/dist/config/env-config.d.ts +17 -0
  50. package/dist/config/env-config.js +1 -0
  51. package/dist/config/env-schema.d.ts +242 -0
  52. package/dist/config/env-schema.js +3 -0
  53. package/dist/config/env-schemas/api-urls.d.ts +24 -0
  54. package/dist/config/env-schemas/api-urls.js +1 -0
  55. package/dist/config/env-schemas/auth.d.ts +42 -0
  56. package/dist/config/env-schemas/auth.js +1 -0
  57. package/dist/config/env-schemas/catalog.d.ts +12 -0
  58. package/dist/config/env-schemas/catalog.js +1 -0
  59. package/dist/config/env-schemas/database.d.ts +15 -0
  60. package/dist/config/env-schemas/database.js +1 -0
  61. package/dist/config/env-schemas/environment-detection.d.ts +24 -0
  62. package/dist/config/env-schemas/environment-detection.js +1 -0
  63. package/dist/config/env-schemas/feature-flags.d.ts +24 -0
  64. package/dist/config/env-schemas/feature-flags.js +1 -0
  65. package/dist/config/env-schemas/organization-project.d.ts +27 -0
  66. package/dist/config/env-schemas/organization-project.js +1 -0
  67. package/dist/config/env-schemas/scorecards.d.ts +12 -0
  68. package/dist/config/env-schemas/scorecards.js +1 -0
  69. package/dist/config/env-schemas/search.d.ts +21 -0
  70. package/dist/config/env-schemas/search.js +1 -0
  71. package/dist/config/env-schemas/server-config.d.ts +51 -0
  72. package/dist/config/env-schemas/server-config.js +1 -0
  73. package/dist/config/env-schemas/site.d.ts +12 -0
  74. package/dist/config/env-schemas/site.js +1 -0
  75. package/dist/config/env-schemas/ssr.d.ts +18 -0
  76. package/dist/config/env-schemas/ssr.js +1 -0
  77. package/dist/config/env-schemas/telemetry.d.ts +15 -0
  78. package/dist/config/env-schemas/telemetry.js +1 -0
  79. package/dist/config/env-schemas/test.d.ts +22 -0
  80. package/dist/config/env-schemas/test.js +1 -0
  81. package/dist/constants/common.d.ts +4 -2
  82. package/dist/constants/common.js +1 -1
  83. package/dist/constants/l10n/langs/ar.js +1 -1
  84. package/dist/constants/l10n/langs/de.js +1 -1
  85. package/dist/constants/l10n/langs/en.js +1 -1
  86. package/dist/constants/l10n/langs/es.js +1 -1
  87. package/dist/constants/l10n/langs/fr.js +1 -1
  88. package/dist/constants/l10n/langs/hi.js +1 -1
  89. package/dist/constants/l10n/langs/it.js +1 -1
  90. package/dist/constants/l10n/langs/ja.js +1 -1
  91. package/dist/constants/l10n/langs/ko.js +1 -1
  92. package/dist/constants/l10n/langs/pl.js +1 -1
  93. package/dist/constants/l10n/langs/pt-BR.js +1 -1
  94. package/dist/constants/l10n/langs/pt.js +1 -1
  95. package/dist/constants/l10n/langs/ru.js +1 -1
  96. package/dist/constants/l10n/langs/uk.js +1 -1
  97. package/dist/constants/l10n/langs/zh.js +1 -1
  98. package/dist/server/api-routes/execute-api-route.js +1 -1
  99. package/dist/server/api-routes/import-api-routes-handlers.js +1 -1
  100. package/dist/server/api-routes/run-api-routes-worker.js +1 -1
  101. package/dist/server/constants/common.js +1 -1
  102. package/dist/server/constants/plugins/catalog-entities.d.ts +1 -0
  103. package/dist/server/constants/plugins/catalog-entities.js +1 -1
  104. package/dist/server/entitlements/entitlements-provider.js +1 -1
  105. package/dist/server/esbuild/esbuild-logger.js +2 -2
  106. package/dist/server/esbuild/esbuild.js +3 -3
  107. package/dist/server/esbuild/plugins/assets-resolver.js +1 -1
  108. package/dist/server/esbuild/plugins/esbuild-compile-resolver.js +1 -1
  109. package/dist/server/esbuild/plugins/styled-components-ssr.js +1 -1
  110. package/dist/server/fs/cache.js +1 -1
  111. package/dist/server/fs/content-fs.d.ts +1 -0
  112. package/dist/server/fs/content-fs.js +1 -1
  113. package/dist/server/fs/last-modified-tracker.js +1 -1
  114. package/dist/server/fs/utils/is-loader-cache-enabled.js +1 -1
  115. package/dist/server/node-bundle-entry.js +1 -1
  116. package/dist/server/persistence/kv/repositories/kv-remote-repository.d.ts +1 -0
  117. package/dist/server/persistence/kv/repositories/kv-remote-repository.js +2 -1
  118. package/dist/server/persistence/kv/services/kv-service.js +1 -1
  119. package/dist/server/plugins/analytics/adobe/index.js +1 -1
  120. package/dist/server/plugins/analytics/amplitude/index.js +1 -1
  121. package/dist/server/plugins/analytics/fullstory/index.js +1 -1
  122. package/dist/server/plugins/analytics/ga/index.js +1 -1
  123. package/dist/server/plugins/analytics/gtm/browser-hooks.js +1 -1
  124. package/dist/server/plugins/analytics/gtm/index.js +1 -1
  125. package/dist/server/plugins/analytics/heap/index.js +1 -1
  126. package/dist/server/plugins/analytics/rudderstack/index.js +1 -1
  127. package/dist/server/plugins/analytics/segment/index.js +1 -1
  128. package/dist/server/plugins/asyncapi-docs/asyncapi-doc-loader.js +3 -3
  129. package/dist/server/plugins/asyncapi-docs/get-server-props.js +1 -1
  130. package/dist/server/plugins/asyncapi-docs/index.js +1 -1
  131. package/dist/server/plugins/asyncapi-docs/search/schema-processor.js +1 -1
  132. package/dist/server/plugins/asyncapi-docs/search/search-resolver.js +1 -1
  133. package/dist/server/plugins/asyncapi-docs/store-definition-bundles.js +1 -1
  134. package/dist/server/plugins/asyncapi-docs/template/AsyncApiDocs.d.ts +2 -1
  135. package/dist/server/plugins/asyncapi-docs/template/AsyncApiDocs.js +9 -3
  136. package/dist/server/plugins/catalog-classic/get-server-props.d.ts +8 -3
  137. package/dist/server/plugins/catalog-classic/get-server-props.js +1 -1
  138. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +38 -64
  139. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
  140. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-attributes-db-record.d.ts +8 -0
  141. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-attributes-db-record.js +1 -0
  142. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.d.ts +2 -1
  143. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-read-model.js +1 -1
  144. package/dist/server/plugins/catalog-entities/database/mappers/{create-entity-relation.d.ts → create-entity-relation-read-model.d.ts} +2 -2
  145. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-read-model.js +1 -0
  146. package/dist/server/plugins/catalog-entities/database/mappers/map-entity-relation-row.js +1 -1
  147. package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.d.ts +27 -0
  148. package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.js +1 -0
  149. package/dist/server/plugins/catalog-entities/database/repositories/common/version-repository.d.ts +36 -0
  150. package/dist/server/plugins/catalog-entities/database/repositories/common/version-repository.js +1 -0
  151. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.d.ts +15 -4
  152. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.js +38 -27
  153. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +36 -9
  154. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +37 -21
  155. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +41 -42
  156. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +1 -1
  157. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.d.ts +3 -1
  158. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.js +1 -1
  159. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.d.ts +7 -1
  160. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.js +1 -1
  161. package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.d.ts +5 -9
  162. package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.js +1 -1
  163. package/dist/server/plugins/catalog-entities/database/repositories/utils/build-entities-exclusion-filter.d.ts +13 -0
  164. package/dist/server/plugins/catalog-entities/database/repositories/utils/build-entities-exclusion-filter.js +1 -0
  165. package/dist/server/plugins/catalog-entities/database/repositories/utils/build-rbac-filter.d.ts +31 -0
  166. package/dist/server/plugins/catalog-entities/database/repositories/utils/build-rbac-filter.js +9 -0
  167. package/dist/server/plugins/catalog-entities/database/repositories/utils/create-merged-entity-fields-for-select.d.ts +34 -0
  168. package/dist/server/plugins/catalog-entities/database/repositories/utils/create-merged-entity-fields-for-select.js +13 -0
  169. package/dist/server/plugins/catalog-entities/database/repositories/utils/normalize-revision-flags.d.ts +23 -0
  170. package/dist/server/plugins/catalog-entities/database/repositories/utils/normalize-revision-flags.js +1 -0
  171. package/dist/server/plugins/catalog-entities/database/repositories/utils/semantic-version-sort.d.ts +78 -0
  172. package/dist/server/plugins/catalog-entities/database/repositories/utils/semantic-version-sort.js +34 -0
  173. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.js +1 -1
  174. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.js +1 -1
  175. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.d.ts +6 -4
  176. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.js +1 -1
  177. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.js +2 -2
  178. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.d.ts +1 -1
  179. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.js +1 -1
  180. package/dist/server/plugins/catalog-entities/extensions/extractors/fs-entities-extractor.js +1 -1
  181. package/dist/server/plugins/catalog-entities/get-server-props.js +1 -1
  182. package/dist/server/plugins/catalog-entities/plugin.js +1 -1
  183. package/dist/server/plugins/catalog-entities/schemas/database-schemas.d.ts +3 -0
  184. package/dist/server/plugins/catalog-entities/schemas/database-schemas.js +1 -1
  185. package/dist/server/plugins/catalog-entities/schemas/dto-schemas.d.ts +15 -1
  186. package/dist/server/plugins/catalog-entities/schemas/dto-schemas.js +1 -1
  187. package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.d.ts +26 -164
  188. package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.js +0 -1
  189. package/dist/server/plugins/catalog-entities/types/extractors.d.ts +4 -4
  190. package/dist/server/plugins/catalog-entities/types/openapi.d.ts +11 -0
  191. package/dist/server/plugins/catalog-entities/types/openapi.js +0 -0
  192. package/dist/server/plugins/catalog-entities/types/params.d.ts +6 -0
  193. package/dist/server/plugins/catalog-entities/types/params.js +0 -0
  194. package/dist/server/plugins/catalog-entities/utils/ajv-validator.js +1 -1
  195. package/dist/server/plugins/catalog-entities/utils/catalog-data-collector.js +1 -1
  196. package/dist/server/plugins/catalog-entities/utils/get-not-accessible-catalog-resources.d.ts +11 -0
  197. package/dist/server/plugins/catalog-entities/utils/get-not-accessible-catalog-resources.js +1 -0
  198. package/dist/server/plugins/config-parser/index.js +1 -1
  199. package/dist/server/plugins/config-parser/loaders/content-slugs-loader.js +1 -1
  200. package/dist/server/plugins/config-parser/loaders/nearest-redocly-config-loader.js +1 -1
  201. package/dist/server/plugins/config-parser/loaders/utils/read-and-validate-config.js +1 -1
  202. package/dist/server/plugins/default-theme/index.js +1 -1
  203. package/dist/server/plugins/entitlements/index.js +1 -1
  204. package/dist/server/plugins/graphql-docs/graphql-doc-loader.js +1 -1
  205. package/dist/server/plugins/graphql-docs/index.js +1 -1
  206. package/dist/server/plugins/graphql-docs/search/search-resolver.js +1 -1
  207. package/dist/server/plugins/graphql-docs/template/GraphQLDocs.js +6 -2
  208. package/dist/server/plugins/lifecycle.js +2 -2
  209. package/dist/server/plugins/markdown/attribute-resolvers/resolve-link.js +1 -1
  210. package/dist/server/plugins/markdown/compiler.d.ts +1 -0
  211. package/dist/server/plugins/markdown/compiler.js +1 -1
  212. package/dist/server/plugins/markdown/index.js +1 -1
  213. package/dist/server/plugins/markdown/is-partial.d.ts +1 -1
  214. package/dist/server/plugins/markdown/is-partial.js +1 -1
  215. package/dist/server/plugins/markdown/markdoc/import-user-tags.js +1 -1
  216. package/dist/server/plugins/markdown/markdoc/plugins/render-mermaid.js +1 -1
  217. package/dist/server/plugins/markdown/markdoc/resolve-raw-partials.d.ts +1 -1
  218. package/dist/server/plugins/markdown/markdoc/resolve-raw-partials.js +2 -2
  219. package/dist/server/plugins/markdown/markdown-static-data-loader.js +1 -1
  220. package/dist/server/plugins/mcp/auth/auth-handlers.js +1 -1
  221. package/dist/server/plugins/mcp/docs-mcp/tools/docs-mcp-tool.d.ts +54 -0
  222. package/dist/server/plugins/mcp/docs-mcp/tools/docs-mcp-tool.js +1 -0
  223. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.d.ts +9 -8
  224. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.js +1 -1
  225. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.d.ts +9 -8
  226. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.js +1 -1
  227. package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.d.ts +9 -8
  228. package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.js +1 -1
  229. package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.d.ts +9 -8
  230. package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.js +1 -1
  231. package/dist/server/plugins/mcp/docs-mcp/tools/index.d.ts +7 -13
  232. package/dist/server/plugins/mcp/docs-mcp/tools/index.js +1 -1
  233. package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.d.ts +9 -6
  234. package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.js +1 -1
  235. package/dist/server/plugins/mcp/docs-mcp/tools/search.d.ts +9 -2
  236. package/dist/server/plugins/mcp/docs-mcp/tools/search.js +1 -1
  237. package/dist/server/plugins/mcp/docs-mcp/tools/utils.d.ts +2 -1
  238. package/dist/server/plugins/mcp/docs-mcp/tools/utils.js +6 -6
  239. package/dist/server/plugins/mcp/docs-mcp/tools/whoami.d.ts +9 -2
  240. package/dist/server/plugins/mcp/docs-mcp/tools/whoami.js +1 -1
  241. package/dist/server/plugins/mcp/handlers/docs-mcp-handler.js +1 -1
  242. package/dist/server/plugins/mcp/handlers/errors.js +1 -1
  243. package/dist/server/plugins/mcp/handlers/handle-mcp-request.d.ts +5 -0
  244. package/dist/server/plugins/mcp/handlers/handle-mcp-request.js +1 -0
  245. package/dist/server/plugins/mcp/handlers/mcp-request-handler.d.ts +0 -1
  246. package/dist/server/plugins/mcp/handlers/mcp-request-handler.js +1 -1
  247. package/dist/server/plugins/mcp/servers/base-server.js +1 -1
  248. package/dist/server/plugins/mcp/types.d.ts +40 -0
  249. package/dist/server/plugins/mcp/workers/execute-mcp-tool.d.ts +3 -0
  250. package/dist/server/plugins/mcp/workers/execute-mcp-tool.js +1 -0
  251. package/dist/server/plugins/nav-utils.d.ts +1 -1
  252. package/dist/server/plugins/nav-utils.js +1 -1
  253. package/dist/server/plugins/openapi-docs/decorators.d.ts +3 -0
  254. package/dist/server/plugins/openapi-docs/decorators.js +1 -1
  255. package/dist/server/plugins/openapi-docs/get-server-props-custom-fields.d.ts +2 -4
  256. package/dist/server/plugins/openapi-docs/get-server-props-custom-fields.js +1 -1
  257. package/dist/server/plugins/openapi-docs/get-server-props.js +1 -1
  258. package/dist/server/plugins/openapi-docs/index.js +1 -1
  259. package/dist/server/plugins/openapi-docs/load-definition.d.ts +1 -0
  260. package/dist/server/plugins/openapi-docs/load-definition.js +3 -3
  261. package/dist/server/plugins/openapi-docs/openrpc-converter.d.ts +2 -0
  262. package/dist/server/plugins/openapi-docs/openrpc-converter.js +1 -0
  263. package/dist/server/plugins/openapi-docs/search/search-resolver.js +1 -1
  264. package/dist/server/plugins/openapi-docs/search-indexer.js +1 -1
  265. package/dist/server/plugins/openapi-docs/store-definition-bundles.js +1 -1
  266. package/dist/server/plugins/openapi-docs/template/OpenAPIDocs.js +8 -4
  267. package/dist/server/plugins/openapi-docs/template/helpers.d.ts +2 -2
  268. package/dist/server/plugins/openapi-docs/template/helpers.js +3 -3
  269. package/dist/server/plugins/openapi-docs/utils.d.ts +1 -0
  270. package/dist/server/plugins/scorecard-classic/compute-scorecard.d.ts +2 -1
  271. package/dist/server/plugins/scorecard-classic/compute-scorecard.js +4 -4
  272. package/dist/server/plugins/scorecard-classic/get-scorecard-config.d.ts +2 -1
  273. package/dist/server/plugins/scorecard-classic/index.js +1 -1
  274. package/dist/server/plugins/scorecard-classic/lint.d.ts +1 -1
  275. package/dist/server/plugins/scorecard-classic/lint.js +1 -1
  276. package/dist/server/plugins/scorecard-classic/loaders/scorecard-config.js +1 -1
  277. package/dist/server/plugins/scorecard-classic/loaders/scorecard.d.ts +6 -4
  278. package/dist/server/plugins/scorecard-classic/loaders/scorecard.js +1 -1
  279. package/dist/server/plugins/scorecard-classic/shared-utils.d.ts +1 -1
  280. package/dist/server/plugins/scorecard-classic/shared-utils.js +1 -1
  281. package/dist/server/plugins/scorecard-classic/template/Grid/Grid.d.ts +2 -1
  282. package/dist/server/plugins/scorecard-classic/template/Grid/Grid.js +3 -3
  283. package/dist/server/plugins/scorecard-classic/template/LevelIndicator.d.ts +1 -0
  284. package/dist/server/plugins/scorecard-classic/template/LevelIndicator.js +3 -3
  285. package/dist/server/plugins/scorecard-classic/template/components.js +1 -1
  286. package/dist/server/plugins/scorecard-classic/template/index.styles.d.ts +1 -0
  287. package/dist/server/plugins/scorecard-classic/template/index.styles.js +93 -19
  288. package/dist/server/plugins/scorecard-classic/template/index.types.d.ts +5 -1
  289. package/dist/server/plugins/scorecard-classic/template/useData.js +1 -1
  290. package/dist/server/plugins/scorecard-classic/template/views.js +1 -1
  291. package/dist/server/plugins/scorecard-classic/types.d.ts +5 -3
  292. package/dist/server/plugins/scorecard-classic/types.js +1 -1
  293. package/dist/server/plugins/scorecards/database/repositories/local/scorecards-config-local-repository.d.ts +12 -0
  294. package/dist/server/plugins/scorecards/database/repositories/local/scorecards-config-local-repository.js +1 -0
  295. package/dist/server/plugins/scorecards/database/scorecards-config-service.d.ts +11 -0
  296. package/dist/server/plugins/scorecards/database/scorecards-config-service.js +1 -0
  297. package/dist/server/plugins/scorecards/plugin.js +1 -1
  298. package/dist/server/plugins/scorecards/workers/run-scorecards-worker.d.ts +2 -1
  299. package/dist/server/plugins/scorecards/workers/run-scorecards-worker.js +1 -1
  300. package/dist/server/plugins/scorecards/workers/scorecards.d.ts +1 -12
  301. package/dist/server/plugins/scorecards/workers/scorecards.js +1 -1
  302. package/dist/server/plugins/search/ai-indexer/prepare-ai-search-documents.js +1 -1
  303. package/dist/server/plugins/search/documents/search-documents.js +1 -1
  304. package/dist/server/plugins/search/engines/flexsearch/index.js +1 -1
  305. package/dist/server/plugins/search/engines/typesense/index.js +1 -1
  306. package/dist/server/plugins/search/index.js +1 -1
  307. package/dist/server/plugins/search/llmstxt/index.js +5 -5
  308. package/dist/server/plugins/search/utils.js +2 -2
  309. package/dist/server/plugins/sidebars/index.d.ts +0 -2
  310. package/dist/server/plugins/sidebars/index.js +3 -3
  311. package/dist/server/plugins/sso/index.js +1 -1
  312. package/dist/server/providers/database/base-repository.d.ts +1 -0
  313. package/dist/server/providers/database/base-repository.js +1 -1
  314. package/dist/server/providers/database/database-connection-factory.js +1 -1
  315. package/dist/server/providers/database/database-preconnect-service.js +1 -1
  316. package/dist/server/providers/database/databases/catalog-sqlite/migrations/0005_catalog-relations-constraint-fix.sql +2 -0
  317. package/dist/server/providers/database/databases/catalog-sqlite/migrations/0006_add-catalog-entitities-attributes-table.sql +11 -0
  318. package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0005_snapshot.json +393 -0
  319. package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0006_snapshot.json +458 -0
  320. package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/_journal.json +14 -0
  321. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.d.ts +143 -0
  322. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.js +1 -0
  323. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js +1 -1
  324. package/dist/server/providers/database/databases/main-sqlite/migrations/0006_change-scorecards-config-timestamps-field-types.sql +19 -0
  325. package/dist/server/providers/database/databases/main-sqlite/migrations/meta/0006_snapshot.json +261 -0
  326. package/dist/server/providers/database/databases/main-sqlite/migrations/meta/_journal.json +7 -0
  327. package/dist/server/providers/database/databases/main-sqlite/schemas/scorecards-config-table.d.ts +24 -18
  328. package/dist/server/providers/database/databases/main-sqlite/schemas/scorecards-config-table.js +1 -1
  329. package/dist/server/providers/database/databases/sqld-sqlite/drizzle.config.js +1 -1
  330. package/dist/server/providers/database/databases/sqld-sqlite/migrations/0007_catalog-relations-constraint-fix.sql +2 -0
  331. package/dist/server/providers/database/databases/sqld-sqlite/migrations/0008_add-catalog-entitities-attributes-table.sql +11 -0
  332. package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/0007_snapshot.json +833 -0
  333. package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/0008_snapshot.json +898 -0
  334. package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/_journal.json +14 -0
  335. package/dist/server/providers/database/pagination/entities-to-filter.d.ts +15 -0
  336. package/dist/server/providers/database/pagination/entities-to-filter.js +1 -0
  337. package/dist/server/providers/database/pagination/utils/index.d.ts +4 -0
  338. package/dist/server/providers/database/pagination/utils/index.js +1 -1
  339. package/dist/server/providers/database/pagination/utils/is-nested-condition.d.ts +16 -0
  340. package/dist/server/providers/database/pagination/utils/is-nested-condition.js +1 -0
  341. package/dist/server/providers/database/pagination/utils/is-simple-condition.d.ts +18 -0
  342. package/dist/server/providers/database/pagination/utils/is-simple-condition.js +1 -0
  343. package/dist/server/providers/database/pagination/utils/map-operator.d.ts +10 -0
  344. package/dist/server/providers/database/pagination/utils/map-operator.js +1 -0
  345. package/dist/server/providers/database/pagination/utils/transform-condition.d.ts +12 -0
  346. package/dist/server/providers/database/pagination/utils/transform-condition.js +1 -0
  347. package/dist/server/ssr/render.js +1 -1
  348. package/dist/server/ssr/server-side-props/get-server-props-from-user-handler.js +1 -1
  349. package/dist/server/ssr/utils.js +8 -8
  350. package/dist/server/store.d.ts +14 -6
  351. package/dist/server/store.js +1 -1
  352. package/dist/server/telemetry/index.js +1 -1
  353. package/dist/server/tools/notifiers/formatter.js +3 -3
  354. package/dist/server/tools/notifiers/helpers/colors.js +1 -1
  355. package/dist/server/tools/notifiers/logger.js +2 -2
  356. package/dist/server/tools/notifiers/reporter.js +9 -9
  357. package/dist/server/tools/notifiers/terminal-manager.js +4 -4
  358. package/dist/server/types/plugins/common.d.ts +7 -1
  359. package/dist/server/types/plugins/markdown.d.ts +2 -0
  360. package/dist/server/types/plugins/scorecards.d.ts +30 -0
  361. package/dist/server/types/plugins/scorecards.js +0 -0
  362. package/dist/server/utils/envs/get-api-route-allowed-env-variables.js +1 -1
  363. package/dist/server/utils/envs/load-env-variables.d.ts +1 -1
  364. package/dist/server/utils/envs/load-env-variables.js +1 -1
  365. package/dist/server/utils/envs/sanitize-branch-name.d.ts +6 -0
  366. package/dist/server/utils/envs/sanitize-branch-name.js +1 -0
  367. package/dist/server/utils/globs.js +1 -1
  368. package/dist/server/utils/is-catalog-entities-enabled.js +1 -1
  369. package/dist/server/utils/is-scorecards-enabled.js +1 -1
  370. package/dist/server/utils/lifecycle-hooks.js +1 -1
  371. package/dist/server/utils/rbac.d.ts +76 -7
  372. package/dist/server/utils/rbac.js +1 -1
  373. package/dist/server/utils/report-all-errors.js +1 -1
  374. package/dist/server/utils/set-execution-mode.d.ts +5 -0
  375. package/dist/server/utils/set-execution-mode.js +1 -0
  376. package/dist/server/utils/time/with-timestamp.d.ts +42 -10
  377. package/dist/server/utils/time/with-timestamp.js +1 -1
  378. package/dist/server/version.js +1 -1
  379. package/dist/server/web-server/auth.js +3 -3
  380. package/dist/server/web-server/dev-server.js +1 -1
  381. package/dist/server/web-server/handle-api-route-request.js +1 -1
  382. package/dist/server/web-server/http.js +2 -2
  383. package/dist/server/web-server/middleware/apiKeyMiddleware.js +1 -1
  384. package/dist/server/web-server/middleware/catalogAuthMiddleware.d.ts +4 -6
  385. package/dist/server/web-server/middleware/catalogAuthMiddleware.js +1 -1
  386. package/dist/server/web-server/middleware/corsMiddleware.js +1 -1
  387. package/dist/server/web-server/middleware/dynamic-middleware/dynamic-middleware.js +1 -1
  388. package/dist/server/web-server/middleware/idleTimeoutMiddleware.js +1 -1
  389. package/dist/server/web-server/routes/ask-ai.js +1 -1
  390. package/dist/server/web-server/routes/auth.js +1 -1
  391. package/dist/server/web-server/routes/catalog/bff-catalog-related-entities.js +1 -1
  392. package/dist/server/web-server/routes/catalog/bff-catalog.js +1 -1
  393. package/dist/server/web-server/routes/catalog/catalog-relations.js +1 -1
  394. package/dist/server/web-server/routes/catalog/catalog.js +1 -1
  395. package/dist/server/web-server/routes/catalog/dto/read-entity-dto.d.ts +3 -0
  396. package/dist/server/web-server/routes/catalog/dto/read-entity-dto.js +0 -0
  397. package/dist/server/web-server/routes/catalog/helpers/create-entity-relation-update-schema.d.ts +43 -0
  398. package/dist/server/web-server/routes/catalog/helpers/create-entity-relation-update-schema.js +1 -0
  399. package/dist/server/web-server/routes/catalog/helpers/create-entity-schema.d.ts +6823 -0
  400. package/dist/server/web-server/routes/catalog/helpers/create-entity-schema.js +1 -0
  401. package/dist/server/web-server/routes/catalog/helpers/create-entity-update-schema.d.ts +1102 -0
  402. package/dist/server/web-server/routes/catalog/helpers/create-entity-update-schema.js +1 -0
  403. package/dist/server/web-server/routes/catalog/helpers/has-access-to-entity.d.ts +10 -0
  404. package/dist/server/web-server/routes/catalog/helpers/has-access-to-entity.js +1 -0
  405. package/dist/server/web-server/routes/catalog/mappers/map-entity-read-model-schema-to-entity-read-dto.d.ts +4 -0
  406. package/dist/server/web-server/routes/catalog/mappers/map-entity-read-model-schema-to-entity-read-dto.js +1 -0
  407. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entities.d.ts +4 -0
  408. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entities.js +1 -0
  409. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity-update-data.d.ts +4 -0
  410. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity-update-data.js +1 -0
  411. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity.d.ts +4 -0
  412. package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity.js +1 -0
  413. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entities-relations.d.ts +13 -0
  414. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entities-relations.js +1 -0
  415. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation-update-data.d.ts +13 -0
  416. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation-update-data.js +1 -0
  417. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation.d.ts +13 -0
  418. package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation.js +1 -0
  419. package/dist/server/web-server/routes/dynamic-route.js +1 -1
  420. package/dist/server/web-server/routes/error.js +1 -1
  421. package/dist/server/web-server/routes/helpers/get-current-rbac-teams.d.ts +3 -0
  422. package/dist/server/web-server/routes/helpers/get-current-rbac-teams.js +1 -0
  423. package/dist/server/web-server/routes/helpers/get-rbac-restrictions-data-for-catalog.d.ts +11 -0
  424. package/dist/server/web-server/routes/helpers/get-rbac-restrictions-data-for-catalog.js +1 -0
  425. package/dist/server/web-server/routes/index.js +1 -1
  426. package/dist/server/web-server/routes/info.js +1 -1
  427. package/dist/server/web-server/routes/mcp-oauth.js +1 -1
  428. package/dist/server/web-server/routes/otel/otel.js +1 -1
  429. package/dist/server/web-server/routes/page-data.js +1 -1
  430. package/dist/server/web-server/routes/path-prefix-redirect.js +1 -1
  431. package/dist/server/web-server/utils.d.ts +2 -2
  432. package/dist/server/workers/mcp-tool-worker-pool.d.ts +4 -0
  433. package/dist/server/workers/mcp-tool-worker-pool.js +1 -0
  434. package/dist/server/workers/mcp-tool-worker.d.ts +2 -0
  435. package/dist/server/workers/mcp-tool-worker.js +1 -0
  436. package/dist/server/workers/types.d.ts +7 -1
  437. package/dist/server/workers/worker-pool.js +1 -1
  438. package/package.json +19 -21
  439. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation.js +0 -1
  440. package/dist/server/plugins/catalog-entities/entities/validate-entity.d.ts +0 -6
  441. package/dist/server/plugins/catalog-entities/entities/validate-entity.js +0 -1
  442. package/dist/server/plugins/mcp/workers/run-api-routes-worker.d.ts +0 -5
  443. package/dist/server/plugins/mcp/workers/run-api-routes-worker.js +0 -1
  444. package/dist/server/utils/envs/is-build-mode.d.ts +0 -2
  445. package/dist/server/utils/envs/is-build-mode.js +0 -1
  446. package/dist/server/utils/envs/is-develop-mode.d.ts +0 -7
  447. package/dist/server/utils/envs/is-develop-mode.js +0 -1
  448. package/dist/server/utils/envs/is-production-mode.d.ts +0 -10
  449. package/dist/server/utils/envs/is-production-mode.js +0 -1
  450. package/dist/server/workers/mcp-worker-pool.d.ts +0 -4
  451. package/dist/server/workers/mcp-worker-pool.js +0 -1
  452. package/dist/utils/env/is-local-development.d.ts +0 -13
  453. package/dist/utils/env/is-local-development.js +0 -1
  454. package/dist/utils/env/is-production.d.ts +0 -13
  455. package/dist/utils/env/is-production.js +0 -1
  456. package/dist/utils/env/is-web-view.d.ts +0 -14
  457. package/dist/utils/env/is-web-view.js +0 -1
@@ -1 +1 @@
1
- import{findApiDescriptionByName as a}from"../utils.js";import{telemetry as r}from"../../../../telemetry/index.js";import{getApiDescriptionFromFs as l}from"./utils.js";const i="get-full-api-description",f={type:"object",required:["name"],additionalProperties:!1,properties:{name:{type:"string",description:"API name (or part of it)",minLength:1}}};function g({server:n,apiDescriptionsMap:s,outdir:p,accessInfo:c}){n.tool(i,"Get the complete OpenAPI description",f,async({name:o})=>{try{const t=a(s,o);if(!t)return{content:[{type:"text",text:`No API found matching "${o}".`}]};const e=await l({relativePath:t?.relativePath||"",outdir:p,accessInfo:c});return e?(r.sendMcpToolCalledMessage({server_type:"docs",tool:i}),{content:[{type:"text",text:JSON.stringify({api:e.info?.title||"",version:e.info?.version||"",definition:e},null,2)}]}):{content:[{type:"text",text:`Spec not found from the file system with "${o}".`}]}}catch(t){throw r.sendMcpErrorMessage({server_type:"docs",tool:i,message:t?.message||"",stack:t?.stack||""}),t}})}export{g as registerGetFullApiDescriptionTools};
1
+ import{DocsMcpTool as s}from"./docs-mcp-tool.js";const r={type:"object",required:["name"],additionalProperties:!1,properties:{name:{type:"string",description:"API name",minLength:1}}};class a extends s{name="get-full-api-description";description="Get the complete OpenAPI description";requiredContext=["outdir","accessInfo"];constructor(){super(r)}async executeAction(i,n){const{name:o}=i,e=await this.getApiDefinition(o,n);if(!e.success)return e.response;const{definition:t}=e;return{content:[{type:"text",text:JSON.stringify({api:t.info?.title||"",version:t.info?.version||"",definition:t},null,2)}]}}}export{a as GetFullApiDescriptionTool};
@@ -1,9 +1,10 @@
1
- import type { McpServer } from '@redocly/mcp-typescript-sdk/server/mcp.js';
2
- import type { AccessInfo, ApiDescriptionInfo } from '../../types.js';
3
- export declare function registerGetSecuritySchemesTools({ server, apiDescriptionsMap, outdir, accessInfo, }: {
4
- server: McpServer;
5
- apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
6
- outdir: string;
7
- accessInfo: AccessInfo;
8
- }): void;
1
+ import type { McpToolWorkerParams, McpToolWorkerResponse, ToolArgsMap } from '../../types.js';
2
+ import { DocsMcpTool, type ContextKey } from './docs-mcp-tool.js';
3
+ export declare class GetSecuritySchemesTool extends DocsMcpTool<'get-security-schemes'> {
4
+ readonly name = "get-security-schemes";
5
+ readonly description = "Get the security schemes for a specific API";
6
+ readonly requiredContext: readonly ContextKey[];
7
+ constructor();
8
+ protected executeAction(args: ToolArgsMap['get-security-schemes'], context: McpToolWorkerParams['context']): Promise<McpToolWorkerResponse>;
9
+ }
9
10
  //# sourceMappingURL=get-security-schemes.d.ts.map
@@ -1 +1 @@
1
- import{findApiDescriptionByName as a}from"../utils";import{telemetry as i}from"../../../../telemetry/index.js";import{getApiDescriptionFromFs as m}from"./utils.js";const o="get-security-schemes",y={type:"object",required:["name"],additionalProperties:!1,properties:{name:{type:"string",description:"API name (or part of it)",minLength:1}}};function h({server:s,apiDescriptionsMap:n,outdir:c,accessInfo:p}){s.tool(o,"Get the security schemes for a specific API",y,async({name:r})=>{try{const e=a(n,r);if(!e)return{content:[{type:"text",text:`No API found matching "${r}".`}]};const t=await m({relativePath:e?.relativePath||"",outdir:c,accessInfo:p});return t?(i.sendMcpToolCalledMessage({server_type:"docs",tool:o}),{content:[{type:"text",text:JSON.stringify({name:t.info?.title,version:t.info?.version,securitySchemes:t.components?.securitySchemes||[],security:t.security||[]},null,2)}]}):{content:[{type:"text",text:`Spec not found from the file system with "${r}".`}]}}catch(e){throw i.sendMcpErrorMessage({server_type:"docs",tool:o,message:e?.message||"",stack:e?.stack||""}),e}})}export{h as registerGetSecuritySchemesTools};
1
+ import{DocsMcpTool as c}from"./docs-mcp-tool.js";const o={type:"object",required:["name"],additionalProperties:!1,properties:{name:{type:"string",description:"API name",minLength:1}}};class p extends c{name="get-security-schemes";description="Get the security schemes for a specific API";requiredContext=["outdir","accessInfo"];constructor(){super(o)}async executeAction(s,i){const{name:n}=s,t=await this.getApiDefinition(n,i);if(!t.success)return t.response;const{definition:e}=t;return{content:[{type:"text",text:JSON.stringify({name:e.info?.title,version:e.info?.version,securitySchemes:e.components?.securitySchemes||[],security:e.security||[]},null,2)}]}}}export{p as GetSecuritySchemesTool};
@@ -1,14 +1,8 @@
1
- import type { McpServer } from '@redocly/mcp-typescript-sdk/server/mcp.js';
2
- import type { AccessInfo, ApiDescriptionInfo } from '../../types.js';
3
- /**
4
- * Registers all tools with the MCP server
5
- */
6
- export declare function registerDocsTools({ server, baseUrl, outdir, apiDescriptionsMap, headers, accessInfo, }: {
7
- server: McpServer;
8
- baseUrl: string;
9
- outdir: string;
10
- apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
11
- accessInfo: AccessInfo;
12
- headers?: Record<string, string | string[] | undefined>;
13
- }): void;
1
+ import type { ToolArgsMap } from '../../types.js';
2
+ import type { DocsMcpTool, DocsMcpToolRegistrationOptions } from './docs-mcp-tool.js';
3
+ export declare const docsTools: DocsMcpTool<keyof ToolArgsMap>[];
4
+ export declare function registerDocsTools(options: DocsMcpToolRegistrationOptions): void;
5
+ export declare function getDocsTool<T extends keyof ToolArgsMap>(name: T): DocsMcpTool<T> | undefined;
6
+ export { DocsMcpTool } from './docs-mcp-tool.js';
7
+ export type { DocsMcpToolRegistrationOptions } from './docs-mcp-tool.js';
14
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- import{registerListApisTools as g}from"./list-apis.js";import{registerGetEndpointsTools as T}from"./get-endpoints.js";import{registerGetEndpointTools as e}from"./get-endpoint-info.js";import{registerGetSecuritySchemesTools as f}from"./get-security-schemes.js";import{registerGetFullApiDescriptionTools as h}from"./get-full-api-description.js";import{registerSearchTool as A}from"./search.js";import{registerWhoAmITool as G}from"./whoami.js";import{shouldHandleMcpAuth as p}from"../../auth/auth-handlers.js";function F({server:o,baseUrl:l,outdir:m,apiDescriptionsMap:r,headers:i,accessInfo:t}){p(t.requiresLogin,t.rbac)&&G(o,i),g({server:o,apiDescriptionsMap:r}),T({server:o,apiDescriptionsMap:r,outdir:m,accessInfo:t}),e({server:o,apiDescriptionsMap:r,outdir:m,accessInfo:t}),f({server:o,apiDescriptionsMap:r,outdir:m,accessInfo:t}),h({server:o,apiDescriptionsMap:r,outdir:m,accessInfo:t}),A(o,l,m,i)}export{F as registerDocsTools};
1
+ import{GetEndpointInfoTool as t}from"./get-endpoint-info.js";import{GetEndpointsTool as n}from"./get-endpoints.js";import{GetFullApiDescriptionTool as i}from"./get-full-api-description.js";import{GetSecuritySchemesTool as m}from"./get-security-schemes.js";import{ListApisTool as s}from"./list-apis.js";import{SearchTool as c}from"./search.js";import{WhoAmITool as p}from"./whoami.js";import{shouldHandleMcpAuth as f}from"../../auth/auth-handlers.js";const e=[new s,new n,new t,new m,new i,new c,new p],l=e.reduce((o,r)=>(o[r.name]=r,o),{});function A(o){e.forEach(r=>{r.name==="whoami"&&!f(o.accessInfo.requiresLogin,o.accessInfo.rbac)||r.register(o)})}function D(o){return l[o]}import{DocsMcpTool as E}from"./docs-mcp-tool.js";export{E as DocsMcpTool,e as docsTools,D as getDocsTool,A as registerDocsTools};
@@ -1,7 +1,10 @@
1
- import type { McpServer } from '@redocly/mcp-typescript-sdk/server/mcp.js';
2
- import type { ApiDescriptionInfo } from '../../types.js';
3
- export declare function registerListApisTools({ server, apiDescriptionsMap, }: {
4
- server: McpServer;
5
- apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
6
- }): void;
1
+ import type { McpToolWorkerParams, McpToolWorkerResponse, ToolArgsMap } from '../../types.js';
2
+ import { DocsMcpTool, type ContextKey } from './docs-mcp-tool.js';
3
+ export declare class ListApisTool extends DocsMcpTool<'list-apis'> {
4
+ readonly name = "list-apis";
5
+ readonly description = "Lists available APIs with their context and purpose";
6
+ readonly requiredContext: readonly ContextKey[];
7
+ constructor();
8
+ protected executeAction(args: ToolArgsMap['list-apis'], context: McpToolWorkerParams['context']): Promise<McpToolWorkerResponse>;
9
+ }
7
10
  //# sourceMappingURL=list-apis.d.ts.map
@@ -1 +1 @@
1
- import{telemetry as a}from"../../../../telemetry/index.js";import{filterApiDescriptionsByName as g}from"../utils.js";const r="list-apis",f={type:"object",additionalProperties:!1,required:[],properties:{filter:{type:"string",description:"API name (or part of it)",minLength:1},page:{type:"number",description:"Page number",minimum:1,default:1},limit:{type:"number",description:"Number of APIs per page. Default is 300",minimum:1,default:300}}};function b({server:p,apiDescriptionsMap:c}){p.tool(r,"Lists available APIs with their context and purpose",f,async({filter:o,page:i=1,limit:t=300})=>{let e=Object.values(c);o&&(e=g(e,o));const n=(i-1)*t,l=n+t,m=Math.ceil(e.length/t),d=e.length;e=e.slice(n,l);try{return e.length===0?{content:[{type:"text",text:"No APIs available"}]}:(a.sendMcpToolCalledMessage({server_type:"docs",tool:r}),{content:[{type:"text",text:JSON.stringify({items:e.map(({relativePath:s,...u})=>u),limit:t,total:d,page:i,totalPages:m})}]})}catch(s){throw a.sendMcpErrorMessage({server_type:"docs",tool:r,message:s?.message||"",stack:s?.stack||""}),s}})}export{b as registerListApisTools};
1
+ import{filterApiDescriptionsByName as u}from"../utils.js";import{DocsMcpTool as m}from"./docs-mcp-tool.js";const d={type:"object",additionalProperties:!1,required:[],properties:{filter:{type:"string",description:"API name (or part of it)",minLength:1,nullable:!0},page:{type:"number",description:"Page number",minimum:1,default:1,nullable:!0},limit:{type:"number",description:"Number of APIs per page. Default is 300",minimum:1,default:300,nullable:!0}}};class y extends m{name="list-apis";description="Lists available APIs with their context and purpose";requiredContext=[];constructor(){super(d)}async executeAction(s,o){const{filter:i,page:n=1,limit:e=300}=s;let t=Object.values(o.apiDescriptionsMap);i&&(t=u(t,i));const r=(n-1)*e,a=r+e,l=Math.ceil(t.length/e),p=t.length;return t=t.slice(r,a),t.length===0?{content:[{type:"text",text:"No APIs available"}]}:{content:[{type:"text",text:JSON.stringify({items:t.map(({relativePath:b,...c})=>c),limit:e,total:p,page:n,totalPages:l})}]}}}export{y as ListApisTool};
@@ -1,3 +1,10 @@
1
- import type { McpServer } from '@redocly/mcp-typescript-sdk/server/mcp.js';
2
- export declare function registerSearchTool(server: McpServer, baseUrl: string, outdir: string, headers?: Record<string, string | string[] | undefined>): void;
1
+ import type { McpToolWorkerParams, McpToolWorkerResponse, ToolArgsMap } from '../../types.js';
2
+ import { DocsMcpTool, type ContextKey } from './docs-mcp-tool.js';
3
+ export declare class SearchTool extends DocsMcpTool<'search'> {
4
+ readonly name = "search";
5
+ readonly description = "Search across the documentation to fetch relevant content for a given query";
6
+ readonly requiredContext: readonly ContextKey[];
7
+ constructor();
8
+ protected executeAction(args: ToolArgsMap['search'], context: McpToolWorkerParams['context']): Promise<McpToolWorkerResponse>;
9
+ }
3
10
  //# sourceMappingURL=search.d.ts.map
@@ -1 +1 @@
1
- import{withPathPrefix as u}from"@redocly/theme/core/utils";import{ServerRoutes as m}from"../../../../../constants/common.js";import{telemetry as s}from"../../../../telemetry/index.js";import{processDocuments as y}from"./utils.js";const o="search",f={type:"object",required:["query"],additionalProperties:!1,properties:{query:{type:"string",description:"Search query. Should be a single word or that phrase that is presented in a documentation.",minLength:1}}};function k(n,a,c,i){n.tool(o,"Search across the documentation to fetch relevant content for a given query",f,async({query:p})=>{try{const e=JSON.stringify({query:p}),h=`${a}${u(m.SEARCH)}`.replace("http","https"),d=`authorization=${String(i?.authorization).replace(/^Bearer /,"")}`,t=await fetch(h,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",Cookie:d},body:e});if(!t.ok)throw new Error(`Search request failed with status ${t.status}`);const l=await t.json(),r=y(l.documents||{},c);return s.sendMcpToolCalledMessage({server_type:"docs",tool:o}),{content:[{type:"text",text:r.trim().length?r:"No results found."}]}}catch(e){throw s.sendMcpErrorMessage({server_type:"docs",tool:o,message:e?.message||"",stack:e?.stack||""}),e}})}export{k as registerSearchTool};
1
+ import{withPathPrefix as d}from"@redocly/theme/core/utils";import{ServerRoutes as p}from"../../../../../constants/common.js";import{DocsMcpTool as l}from"./docs-mcp-tool.js";import{processDocuments as m}from"./utils.js";const f={type:"object",required:["query"],additionalProperties:!1,properties:{query:{type:"string",description:"Search query. Should be a single word or that phrase that is presented in a documentation.",minLength:1}}};class g extends l{name="search";description="Search across the documentation to fetch relevant content for a given query";requiredContext=["baseUrl","outdir","headers"];constructor(){super(f)}async executeAction(a,e){const{query:i}=a;if(!e.baseUrl||!e.outdir)throw new Error("Missing required context: baseUrl and outdir");const c=JSON.stringify({query:i});let t=`${e.baseUrl}${d(p.SEARCH)}`;t.startsWith("http://")&&(t=t.replace(/^http:\/\//,"https://"));const o=e.headers?.authorization,s=o?`authorization=${String(o).replace(/^Bearer /,"")}`:"",r=await fetch(t,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",...s?{Cookie:s}:{}},body:c});if(!r.ok){const u=await r.text().catch(()=>"Unable to read error response");throw new Error(`Search request failed with status ${r.status}: ${u}`)}const h=await r.json(),n=m(h.documents||{},e.outdir);return{content:[{type:"text",text:n.trim().length?n:"No results found."}]}}}export{g as SearchTool};
@@ -1,6 +1,7 @@
1
1
  import type { OpenAPIDefinition, OpenAPIOperation } from '@redocly/openapi-docs';
2
2
  import type { SearchItemData } from '@redocly/theme/core/types';
3
- import type { AccessInfo } from '../../types';
3
+ import type { AccessInfo, McpEndpoint } from '../../types';
4
+ export declare function isMcpEndpoint(value: unknown): value is McpEndpoint;
4
5
  type EndpointInfo = Pick<OpenAPIOperation, 'summary' | 'description' | 'security'> & {
5
6
  method: string;
6
7
  path: string;
@@ -1,11 +1,11 @@
1
- import y from"node:fs";import u from"node:path";import{existsSync as A}from"node:fs";import{readFile as O}from"node:fs/promises";import{replaceFileExtension as g}from"../../../../plugins/openapi-docs/store-definition-bundles";import{PUBLIC_API_DEFINITIONS_FOLDER as j}from"../../../../constants/common";import{filterDataByAccessDeep as F}from"../../../../utils/rbac";import{checkEndpointAndDeleteXMcp as D}from"../../utils/xmcp-utils.js";import{MAX_DOCUMENTS_PER_CATEGORY as C}from"../../constants.js";function T(i){const{paths:o={}}=i,s=[];for(const[c,n]of Object.entries(o)){const a=!D(n,"docs");for(const[f,t]of Object.entries(n))a||!D(t,"docs")||s.push({path:c,method:f.toUpperCase(),summary:t.summary,description:t.description,security:t.security})}return s}function M(i,o){return Object.entries(i).map(([c,n])=>{if(!n||n.length===0)return"";const a=n.slice(0,C).map(f=>{const{document:t,highlight:m}=f,d=m?.title||(Array.isArray(t.title)?t.title[0]:t.title);let r=`Document: ${t.title}`;r+=`### [${d}](${t.url})
1
+ import y from"node:fs";import u from"node:path";import{existsSync as j}from"node:fs";import{readFile as A}from"node:fs/promises";import{replaceFileExtension as O}from"../../../../plugins/openapi-docs/store-definition-bundles";import{PUBLIC_API_DEFINITIONS_FOLDER as b}from"../../../../constants/common";import{filterDataByAccessDeep as g}from"../../../../utils/rbac";import{checkEndpointAndDeleteXMcp as E}from"../../utils/xmcp-utils.js";import{MAX_DOCUMENTS_PER_CATEGORY as F}from"../../constants.js";function N(e){return typeof e=="object"&&e!==null&&"responses"in e&&typeof e.responses=="object"}function T(e){const{paths:i={}}=e,s=[];for(const[c,r]of Object.entries(i)){const p=!E(r,"docs");for(const[a,t]of Object.entries(r))p||!E(t,"docs")||s.push({path:c,method:a.toUpperCase(),summary:t.summary,description:t.description,security:t.security})}return s}function R(e,i){return Object.entries(e).map(([c,r])=>{if(!r||r.length===0)return"";const p=r.slice(0,F).map(a=>{const{document:t,highlight:m}=a,d=m?.title||(Array.isArray(t.title)?t.title[0]:t.title);let o=`Document: ${t.title}`;o+=`### [${d}](${t.url})
2
2
 
3
- `;let p;if(t.url)try{let e=t.url.startsWith("/")?t.url.slice(1):t.url;const l=e.indexOf("#");l!==-1&&(e=e.substring(0,l));const h=u.extname(e);h&&(e=e.slice(0,-h.length));let E=e+".md";const x=u.join(o,E);y.existsSync(x)&&(p=y.readFileSync(x,"utf8"))}catch{}return p||(p=m?.text||(Array.isArray(t.text)?t.text[0]:t.text)),r+=p,t.facets&&(r+=`
3
+ `;let f;if(t.url)try{let n=t.url.startsWith("/")?t.url.slice(1):t.url;const l=n.indexOf("#");l!==-1&&(n=n.substring(0,l));const h=u.extname(n);h&&(n=n.slice(0,-h.length));let D=n+".md";const x=u.join(i,D);y.existsSync(x)&&(f=y.readFileSync(x,"utf8"))}catch{}return f||(f=m?.text||(Array.isArray(t.text)?t.text[0]:t.text)),o+=f,t.facets&&(o+=`
4
4
 
5
5
  **Categories:**
6
- `,Object.entries(t.facets).forEach(([e,l])=>{r+=`- ${e}: ${l}
7
- `})),r});return`## ${c}
6
+ `,Object.entries(t.facets).forEach(([n,l])=>{o+=`- ${n}: ${l}
7
+ `})),o});return`## ${c}
8
8
 
9
- ${a}`}).join(`
9
+ ${p}`}).join(`
10
10
 
11
- `).trim()}async function R({relativePath:i,outdir:o,accessInfo:{isAuthenticated:s,email:c,teams:n,rbac:a={},requiresLogin:f=!1}}){const t=u.join(o||"",j,g(i,".json"));if(!A(t))return;const d=await O(t,"utf-8"),r=JSON.parse(d);return F(r,{isAuthenticated:s,email:c,teams:n},a,f)}export{R as getApiDescriptionFromFs,T as getEndpointsFromPaths,M as processDocuments};
11
+ `).trim()}async function U({relativePath:e,outdir:i,accessInfo:{isAuthenticated:s,email:c,teams:r,rbac:p={},requiresLogin:a=!1}}){const t=u.join(i||"",b,O(e,".json"));if(!j(t))return;const d=await A(t,"utf-8"),o=JSON.parse(d);return g(o,{isAuthenticated:s,email:c,teams:r},p,a)}export{U as getApiDescriptionFromFs,T as getEndpointsFromPaths,N as isMcpEndpoint,R as processDocuments};
@@ -1,3 +1,10 @@
1
- import type { McpServer } from '@redocly/mcp-typescript-sdk/server/mcp.js';
2
- export declare function registerWhoAmITool(server: McpServer, headers?: Record<string, string | string[] | undefined>): void;
1
+ import type { McpToolWorkerParams, McpToolWorkerResponse, ToolArgsMap } from '../../types.js';
2
+ import { DocsMcpTool, type ContextKey } from './docs-mcp-tool.js';
3
+ export declare class WhoAmITool extends DocsMcpTool<'whoami'> {
4
+ readonly name = "whoami";
5
+ readonly description = "Get information about the currently authenticated user";
6
+ readonly requiredContext: readonly ContextKey[];
7
+ constructor();
8
+ protected executeAction(_args: ToolArgsMap['whoami'], context: McpToolWorkerParams['context']): Promise<McpToolWorkerResponse>;
9
+ }
3
10
  //# sourceMappingURL=whoami.d.ts.map
@@ -1 +1 @@
1
- import{telemetry as r}from"../../../../telemetry/index";import{getUserInfoFromHeaders as s}from"../../utils/jwt";const t="whoami";function c(o,n){o.tool(t,"Get information about the currently authenticated user",()=>{try{const e=s(n||{});return r.sendMcpToolCalledMessage({server_type:"docs",tool:t}),e?{content:[{type:"text",text:JSON.stringify({email:e.email,name:e.name,subject:e.sub,clientId:e.client_id,scope:e.scope,issuedAt:e.iat?new Date(e.iat*1e3).toISOString():void 0,expiresAt:e.exp?new Date(e.exp*1e3).toISOString():void 0})}],isError:!1}:{content:[{type:"text",text:JSON.stringify({error:"Not authenticated",message:"No valid authentication token found. Please authenticate first."})}],isError:!0}}catch(e){return r.sendMcpErrorMessage({server_type:"docs",tool:t,message:e?.message||"Failed to get user info",stack:e?.stack||""}),{content:[{type:"text",text:JSON.stringify({error:"Failed to get user info",details:e instanceof Error?e.message:String(e)})}],isError:!0}}})}export{c as registerWhoAmITool};
1
+ import{getUserInfoFromHeaders as r}from"../../utils/jwt.js";import{DocsMcpTool as o}from"./docs-mcp-tool.js";const n={type:"object",required:[],additionalProperties:!1,properties:{}};class u extends o{name="whoami";description="Get information about the currently authenticated user";requiredContext=["headers"];constructor(){super(n)}async executeAction(s,t){const e=r(t.headers||{});return e?{content:[{type:"text",text:JSON.stringify({email:e.email,name:e.name,subject:e.sub,clientId:e.client_id,scope:e.scope,issuedAt:e.iat?new Date(e.iat*1e3).toISOString():void 0,expiresAt:e.exp?new Date(e.exp*1e3).toISOString():void 0})}],isError:!1}:{content:[{type:"text",text:JSON.stringify({error:"Not authenticated",message:"No valid authentication token found. Please authenticate first."})}],isError:!0}}}export{u as WhoAmITool};
@@ -1 +1 @@
1
- import{createMcpRequestHandler as D}from"./mcp-request-handler.js";import{createDocsMcpServer as v}from"../servers/docs-server.js";import{filterApiDescriptionsByRbac as h}from"../utils.js";import{createInternalServerError as y}from"./errors.js";import{McpServerType as m}from"../constants.js";import{telemetry as f}from"../../../telemetry/index.js";import{constructInvalidTokenResponse as A,constructUnauthorizedResponse as L,handleMcpAuth as S,shouldHandleMcpAuth as b}from"../auth/auth-handlers.js";async function I(r,s,i,n){try{f.initialize();const e=s,t=e?.props?.config?.apiDescriptionsMap||{},a=e?.props?.outdir||"",o=e?.props?.config?.mcpDocsServerName||"Docs MCP server",u=new URL(n.url).origin,{user:c,config:{rbac:p={},mcp:l={}}}=r,d=h(t,c,p,r.config.requiresLogin||!1),g=l.docs?.name||o,M={rbac:p,email:c?.email,teams:c?.teams,isAuthenticated:!!c?.isAuthenticated,requiresLogin:r.config.requiresLogin||!1};return await v({name:g,baseUrl:u,headers:i,apiDescriptionsMap:d,outdir:a,accessInfo:M})}catch(e){throw f.sendMcpErrorMessage({server_type:m.Docs,message:e?.message||"",stack:e?.stack||""}),y(e?.message||"Internal server error mcp docs")}}const R=D({createServerInstance:I,serverType:m.Docs}),w=async(r,s,i)=>{const n=!!s?.config?.requiresLogin,e=s?.config?.rbac;if(b(n,e)){const{isAuthenticated:t,isTokenValid:a,currentUser:o}=await S(r,s);if(!t)return L(new URL(r.url).origin);if(!a)return A();o&&(s.user=o)}return R(r,s,i)};var E=w;export{E as default};
1
+ import{createMcpRequestHandler as v}from"./mcp-request-handler.js";import{createDocsMcpServer as D}from"../servers/docs-server.js";import{filterApiDescriptionsByRbac as h}from"../utils.js";import{createInternalServerError as y}from"./errors.js";import{McpServerType as m}from"../constants.js";import{telemetry as f}from"../../../telemetry/index.js";import{constructInvalidTokenResponse as b,constructUnauthorizedResponse as A,handleMcpAuth as L,shouldHandleMcpAuth as S}from"../auth/auth-handlers.js";async function I(r,s,i,n){try{f.initialize();const e=s,t=e?.props?.config?.apiDescriptionsMap||{},a=e?.props?.outdir||"",o=e?.props?.config?.mcpDocsServerName||"Docs MCP server",u=new URL(n.url).origin,{user:c,config:{rbac:p={},mcp:l={}}}=r,d=h(t,c,p,r.config.requiresLogin||!1),g=l.docs?.name||o,M={rbac:p,email:c?.email,teams:c?.teams,isAuthenticated:!!c?.isAuthenticated,requiresLogin:r.config.requiresLogin||!1};return await D({name:g,baseUrl:u,headers:i,apiDescriptionsMap:d,outdir:a,accessInfo:M})}catch(e){throw f.sendMcpErrorMessage([{object:"mcp_server",server_type:m.Docs,message:e?.message||"",stack:e?.stack||""}]),y(e?.message||"Internal server error mcp docs")}}const R=v({createServerInstance:I,serverType:m.Docs}),w=async(r,s,i)=>{const n=!!s?.config?.requiresLogin,e=s?.config?.rbac;if(S(n,e)){const{isAuthenticated:t,isTokenValid:a,currentUser:o}=await L(r,s);if(!t)return A(new URL(r.url).origin);if(!a)return b();o&&(s.user=o)}return R(r,s,i)};var E=w;export{E as default};
@@ -1 +1 @@
1
- import{telemetry as c}from"../../../telemetry/index.js";import{McpErrorCodes as s,McpServerType as d}from"../constants.js";class n extends Error{code;data;requestId;constructor(e,t,o,a){super(t),this.name="McpError",this.code=e,this.data=o,this.requestId=a}createErrorResponse(){const e={jsonrpc:"2.0",error:{code:this.code,message:this.message,...this.data?{data:this.data}:{}},id:this.requestId??null},t=i(this.code);return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":"application/json"}})}}function i(r){switch(r){case s.InvalidRequest:case s.InvalidParams:return 400;case s.MethodNotFound:return 404;case s.ServerError:return 405;case s.InternalError:default:return 500}}function m(r){return new n(s.ServerError,"Method not allowed",void 0,r).createErrorResponse()}function u(r,e=d.Docs,t){const o=r instanceof Error?r.message:String(r),a=r instanceof Error?r.stack:void 0;return c.sendMcpErrorMessage({server_type:e,message:o,stack:a||""}),new n(s.InternalError,"Internal server error mcp",o,t).createErrorResponse()}function f(r="Invalid request",e){return new n(s.InvalidRequest,r,void 0,e).createErrorResponse()}function h(r="Invalid parameters",e){return new n(s.InvalidParams,r,void 0,e).createErrorResponse()}async function v(r,e,t){try{return await r()}catch(o){return c.sendMcpErrorMessage({server_type:e,message:o?.message||"",stack:o?.stack||""}),t&&t(),u(o,e)}}export{n as McpError,u as createInternalServerError,h as createInvalidParamsError,f as createInvalidRequestError,m as createMethodNotAllowedError,v as withErrorHandling};
1
+ import{telemetry as c}from"../../../telemetry/index.js";import{McpErrorCodes as s,McpServerType as d}from"../constants.js";class n extends Error{code;data;requestId;constructor(e,t,o,a){super(t),this.name="McpError",this.code=e,this.data=o,this.requestId=a}createErrorResponse(){const e={jsonrpc:"2.0",error:{code:this.code,message:this.message,...this.data?{data:this.data}:{}},id:this.requestId??null},t=i(this.code);return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":"application/json"}})}}function i(r){switch(r){case s.InvalidRequest:case s.InvalidParams:return 400;case s.MethodNotFound:return 404;case s.ServerError:return 405;case s.InternalError:default:return 500}}function m(r){return new n(s.ServerError,"Method not allowed",void 0,r).createErrorResponse()}function p(r,e=d.Docs,t){const o=r instanceof Error?r.message:String(r),a=r instanceof Error?r.stack:void 0;return c.sendMcpErrorMessage([{object:"mcp_server",server_type:e,message:o,stack:a||""}]),new n(s.InternalError,"Internal server error mcp",o,t).createErrorResponse()}function f(r="Invalid request",e){return new n(s.InvalidRequest,r,void 0,e).createErrorResponse()}function h(r="Invalid parameters",e){return new n(s.InvalidParams,r,void 0,e).createErrorResponse()}async function v(r,e,t){try{return await r()}catch(o){return c.sendMcpErrorMessage([{object:"mcp_server",server_type:e,message:o?.message||"",stack:o?.stack||""}]),t&&t(),p(o,e)}}export{n as McpError,p as createInternalServerError,h as createInvalidParamsError,f as createInvalidRequestError,m as createMethodNotAllowedError,v as withErrorHandling};
@@ -0,0 +1,5 @@
1
+ import type { Context } from 'hono';
2
+ import type { ApiRoute } from '../../../types';
3
+ import type { Store } from '../../../store.js';
4
+ export declare function handleMcpRequest(route: ApiRoute, ctx: Context, store: Store): Promise<Response>;
5
+ //# sourceMappingURL=handle-mcp-request.d.ts.map
@@ -0,0 +1 @@
1
+ import{withPathPrefix as d}from"@redocly/theme/core/utils";import{importApiRoutesHandler as f}from"../../../api-routes/import-api-routes-handlers.js";import{enhanceContext as h}from"../../../api-routes/helpers/enhance-context.js";import{telemetry as A}from"../../../telemetry/index.js";import{KvService as D}from"../../../persistence/kv/services/kv-service.js";import{envConfig as o}from"../../../../config/env-config.js";async function y(a,s,t){const e=s.get("auth"),i=await t.resolveRouteStaticData(a)||{},r=d(a.slug),{requestHandlers:c}=await f(t.serverOutDir),p=c[a.requestHandlerId],m=(await p()).default,u=async()=>await D.getInstance({baseDbDir:t.serverOutDir,sqldRemoteDatabaseUrl:o.SQLD_REMOTE_DATABASE_URL,sqldRemoteDatabaseAuthToken:o.SQLD_REMOTE_DATABASE_AUTH_TOKEN}),l=h({honoCtx:s,ctx:{user:{teams:e.teams,email:e.claims.email,claims:e.claims,idpAccessToken:e.idpAccessToken,idpId:e.claims.idpId,isAuthenticated:e.isAuthenticated},config:t.config},telemetry:A,getKv:u}),n=await m(s.req.raw,l,{...i,props:{...i.props,routeSlug:r,outdir:t.outdir}});return n instanceof Response?n:typeof n=="string"?new Response(n,{headers:{"Content-Type":"text/plain"}}):new Response(JSON.stringify(n),{headers:{"Content-Type":"application/json"}})}export{y as handleMcpRequest};
@@ -3,7 +3,6 @@ import type { McpServerInstance, McpServerType } from '../types.js';
3
3
  export type McpRequestHandlerDependencies = {
4
4
  createServerInstance: (context: ApiFunctionsContext, staticData: PageStaticData, headers: Record<string, string | string[] | undefined>, request: Request) => Promise<McpServerInstance>;
5
5
  serverType: McpServerType;
6
- connectionTimeoutMs?: number;
7
6
  };
8
7
  /**
9
8
  * Creates a standardized MCP request handler
@@ -1 +1 @@
1
- import{toFetchResponse as i,toReqRes as E}from"fetch-to-node";import{logger as d}from"../../../tools/notifiers/logger.js";import{DEFAULT_CONNECTION_TIMEOUT_MS as w}from"../constants.js";import{createMethodNotAllowedError as R,withErrorHandling as y}from"./errors.js";function N(u){const{createServerInstance:l,serverType:p,connectionTimeoutMs:m=w}=u;return async(r,h,f)=>{let e,n;const c=async()=>{try{n&&(clearTimeout(n),n=void 0),e&&(await e.cleanup(),e=void 0)}catch(a){d.error("Error during mcp server cleanup:",a)}};return y(async()=>{const a={};r.headers.forEach((o,T)=>{a[T]=o}),e=await l(h,f,a,r);const{req:s,res:t}=E(r);switch(n=setTimeout(()=>{c()},m),t.on("close",()=>{c().catch(o=>{d.error("Error during response close cleanup:",o)})}),r.method){case"GET":return await e.transport.handleRequest(s,t),i(t);case"POST":const o=await r.json();return await e.transport.handleRequest(s,t,o),i(t);default:return R()}},p,c)}}export{N as createMcpRequestHandler};
1
+ import{toFetchResponse as p,toReqRes as h}from"fetch-to-node";import{createMethodNotAllowedError as w,withErrorHandling as y}from"./errors.js";function m(s){const{createServerInstance:a,serverType:c}=s;return async(e,d,i)=>{let r;return y(async()=>{const n={};e.headers.forEach((t,l)=>{n[l]=t});const{req:u,res:o}=h(e);switch(e.method){case"GET":return new Response(JSON.stringify({error:"Method Not Allowed",message:`In order to use this MCP server, you need register it in your MCP Client (VS Code, Cursor, Claude Code, etc.) using that URL: ${e.url}`}),{status:405,headers:{"Content-Type":"application/json"}});case"POST":{r=await a(d,i,n,e);const t=await e.json();return await r.transport.handleRequest(u,o,t),p(o)}default:return w()}},c,async()=>{r&&(await r.cleanup(),r=void 0)})}}export{m as createMcpRequestHandler};
@@ -1 +1 @@
1
- import{McpServer as t}from"@redocly/mcp-typescript-sdk/server/mcp.js";import{StreamableHTTPServerTransport as s}from"@redocly/mcp-typescript-sdk/server/streamableHttp.js";import{telemetry as i}from"../../../telemetry/index.js";class p{server;transport;#r;#t=!1;constructor(e){this.server=new t(e,{capabilities:{logging:{}}}),this.transport=new s({sessionIdGenerator:void 0})}async initialize(){return this.registerTools(),await this.server.connect(this.transport),{server:this.server,transport:this.transport,cleanup:this.cleanup.bind(this)}}clearCleanupTimeout(){this.#r&&(clearTimeout(this.#r),this.#r=void 0)}#e;async cleanup(){return this.#e?this.#e:(this.#e=this.#s(),this.#e)}async#s(){if(!this.#t){this.#t=!0,this.clearCleanupTimeout();try{this.transport.close()}catch(e){throw i.sendMcpErrorMessage({server_type:this.getServerType(),message:e?.message||"Unknown cleanup error",stack:e?.stack||""}),e}}}}async function h(r,...e){return await new r(...e).initialize()}export{p as BaseMcpServer,h as createMcpServerInstance};
1
+ import{McpServer as t}from"@redocly/mcp-typescript-sdk/server/mcp.js";import{StreamableHTTPServerTransport as s}from"@redocly/mcp-typescript-sdk/server/streamableHttp.js";import{telemetry as i}from"../../../telemetry/index.js";class p{server;transport;#r;#t=!1;constructor(e){this.server=new t(e,{capabilities:{logging:{}}}),this.transport=new s({sessionIdGenerator:void 0})}async initialize(){return this.registerTools(),await this.server.connect(this.transport),{server:this.server,transport:this.transport,cleanup:this.cleanup.bind(this)}}clearCleanupTimeout(){this.#r&&(clearTimeout(this.#r),this.#r=void 0)}#e;async cleanup(){return this.#e?this.#e:(this.#e=this.#s(),this.#e)}async#s(){if(!this.#t){this.#t=!0,this.clearCleanupTimeout();try{this.transport.close()}catch(e){throw i.sendMcpErrorMessage([{object:"mcp_server",server_type:this.getServerType(),message:e?.message||"Unknown cleanup error",stack:e?.stack||""}]),e}}}}async function h(r,...e){return await new r(...e).initialize()}export{p as BaseMcpServer,h as createMcpServerInstance};
@@ -1,6 +1,7 @@
1
1
  import type { OpenAPIPath } from '@redocly/openapi-docs/src/types';
2
2
  import type { McpServer } from '@redocly/mcp-typescript-sdk/server/mcp.js';
3
3
  import type { StreamableHTTPServerTransport } from '@redocly/mcp-typescript-sdk/server/streamableHttp.js';
4
+ import type { CallToolResult } from '@redocly/mcp-typescript-sdk/types.js';
4
5
  import type { OpenAPIServer } from '@redocly/openapi-docs/lib/types/open-api.js';
5
6
  import type { McpErrorCodes, McpServerType } from './constants';
6
7
  import type { RbacConfig, PageStaticData } from '@redocly/config';
@@ -70,5 +71,44 @@ export type McpUserInfo = {
70
71
  exp?: number;
71
72
  [key: string]: any;
72
73
  };
74
+ export type ToolArgsMap = {
75
+ 'list-apis': {
76
+ filter?: string;
77
+ page?: number;
78
+ limit?: number;
79
+ };
80
+ 'get-endpoints': {
81
+ name: string;
82
+ };
83
+ 'get-endpoint-info': {
84
+ name: string;
85
+ path: string;
86
+ method: string;
87
+ };
88
+ 'get-security-schemes': {
89
+ name: string;
90
+ };
91
+ 'get-full-api-description': {
92
+ name: string;
93
+ };
94
+ search: {
95
+ query: string;
96
+ };
97
+ whoami: Record<string, never>;
98
+ };
99
+ export type McpToolWorkerParams = {
100
+ [K in keyof ToolArgsMap]: {
101
+ toolName: K;
102
+ args: ToolArgsMap[K];
103
+ context: {
104
+ apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
105
+ outdir?: string;
106
+ accessInfo?: AccessInfo;
107
+ baseUrl?: string;
108
+ headers?: Record<string, string | string[] | undefined>;
109
+ };
110
+ };
111
+ }[keyof ToolArgsMap];
112
+ export type McpToolWorkerResponse = CallToolResult;
73
113
  export {};
74
114
  //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,3 @@
1
+ import type { McpToolWorkerParams, McpToolWorkerResponse } from '../types.js';
2
+ export declare function executeMcpTool(params: McpToolWorkerParams): Promise<McpToolWorkerResponse>;
3
+ //# sourceMappingURL=execute-mcp-tool.d.ts.map
@@ -0,0 +1 @@
1
+ import{getDocsTool as c}from"../docs-mcp/tools/index.js";async function l(e){const{toolName:o,args:n,context:r}=e,t=c(o);if(!t)throw new Error(`Unknown tool: ${o}`);return await t.execute(n,r)}export{l as executeMcpTool};
@@ -1,6 +1,6 @@
1
1
  import type { RedoclyConfig, ResolvedConfigLinks, ResolvedNavItem, RawNavConfig, NavItem } from '@redocly/config';
2
2
  import type { AfterRoutesCreatedActions, LifecycleContext, ResolveItemsOptions } from '../types';
3
- export type ResolveLinkContext = Pick<AfterRoutesCreatedActions, 'outdir' | 'getRouteByFsPath' | 'contentDir' | 'getAllRoutesForLocale' | 'getRouteBySlug'>;
3
+ export type ResolveLinkContext = Pick<AfterRoutesCreatedActions, 'outdir' | 'getRouteByFsPath' | 'contentDir' | 'getAllRoutesForLocale' | 'getAllRoutes' | 'getRouteBySlug' | 'getRoutesByDir'>;
4
4
  export declare function resolveLinksFromConfig(rawConfig: RawNavConfig, contentDir: string, actions: ResolveLinkContext, context: LifecycleContext, options: ResolveItemsOptions): Promise<ResolvedConfigLinks>;
5
5
  export declare function normalizeItems(items: NavItem[]): NavItem[];
6
6
  export declare function resolveItems(items: NavItem[] | undefined, fromDir: string, actions: ResolveLinkContext, context: LifecycleContext, options: ResolveItemsOptions): Promise<ResolvedNavItem[] | undefined>;
@@ -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 y,REDOCLY_TEAMS_RBAC as h}from"@redocly/config";import{VERSION_SEPARATOR as x}from"../constants/common.js";import{DEFAULT_LOCALE_PLACEHOLDER as M}from"../../constants/common.js";import{removeTrailingSlash as _}from"../../utils/url/remove-trailing-slash.js";import{isPrimitive as j}from"../../utils/guards/is-primitive.js";import{slash as w}from"../../utils/path/slash.js";import{isAbsoluteUrl as W}from"../../utils/url/is-absolute-url.js";import{normalizeRouteSlug as z}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 U,FileNotFoundError as O}from"../utils/fs.js";import{isIconPath as H,resolveAssetPath as J}from"../utils/index.js";import{resolveSrcSet as Y}from"../utils/resolve-src-set.js";import{isL10nPath as B}from"../fs/utils/is-l10n-path.js";import{getLocaleFromRelativePath as G}from"../fs/utils/get-locale-from-relative-path.js";async function E(e,s,a,t,n){if(!e)return;const f={...n,ignoreCustomSidebar:!0};if(j(e)){if(typeof e=="string"){const r=F(a.contentDir,s,n,e,t.fs);if(t.fs.exists(r)){if(a.getRouteByFsPath(r))return N({page:e},s,a,t,f);{const g=t.fs.getFileInfo(r);return g?U(a.contentDir,g.realRelativePath,a.outdir):void 0}}}return e}return Array.isArray(e)?k(D(e),s,a,t,f):Object.fromEntries(await Promise.all(Object.entries(e).map(async([r,o])=>[r,await E(o,s,a,t,n)])))}function D(e){return e.map(s=>({...s,items:s.items?D(s.items):void 0}))}async function k(e,s,a,t,n){if(Array.isArray(e))return(await Promise.all(e.map(f=>N(f,s,a,t,n)))).flatMap(f=>f)}async function b(e,s,a,t){let n,f;if(typeof e.icon=="object"){if("srcSet"in e.icon)try{n=await Y(e.icon.srcSet,a.fs,{fromFileRelativePath:t.navFile,contentDir:s.contentDir,outdir:s.outdir})}catch(l){l instanceof O?await S.panicOnBuildContentError(`Cannot resolve "item.icon.srcSet" from ${t.navFile}: ${l.message}`):await S.panicOnBuild(`Cannot resolve "item.icon.srcSet" from ${t.navFile}: ${l.message}`)}}else if(typeof e.icon=="string")if(W(e.icon)||H(e.icon))try{f=await J(e.icon,a.fs,{fromFileRelativePath:t.navFile,contentDir:s.contentDir,outdir:s.outdir})}catch(l){l instanceof O?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}: ${l.message}`)}else f=e.icon;return{icon:f,srcSet:n}}function q(e){return s=>{if(s.type==="link"||s.type==="group"){const a=s.metadata;return a?(Array.isArray(e)?e:[e]).some(n=>Object.entries(n).every(([f,l])=>Array.isArray(l)?l.some(r=>a[f]===r):a[f]===l)):!1}return!0}}async function N(e,s,a,t,n){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(a.contentDir,s,n,e.directory,t.fs):void 0;if(f!==void 0){const i=f===""?"":f,{ignoredRoutes:u}=n;let d=a.getRoutesByDir(i).filter(c=>!u?.has(c.baseSlug||"")&&!c.excludeFromSidebar).sort((c,P)=>c.fsPath===P.fsPath?0:c.baseSlug.localeCompare(P.baseSlug,void 0,{numeric:!0}));const p=e.includeByMetadata?q(e.includeByMetadata):Boolean;if(!d.length)return[];const I=(await Promise.all(d.map(async c=>{const P=c.versions?.find(V=>V.active),L=P&&{version:P.version,isDefault:P.default,versionFolderId:P.folderId},K=Z(v.posix.relative(f,c.fsPath)),$=c.getSidebar?.(c);return!n.ignoreCustomSidebar&&$?.length?{type:"group",fsPath:c.fsPath,metadata:c.metadata,link:c.slug,routeSlug:c.slug,label:await c.getNavText?.()||c.slug,[h]:c[h],[y]:c[y],sidebarItems:m($,L,c[h],c[y]),...L,relativePathFromDirectory:v.relative(f,c.fsPath).replace(/@[^\/]+\//,"")}:{type:"link",fsPath:c.fsPath,metadata:c.metadata,[h]:c[h],[y]:c[y],label:await c.getNavText?.()||c.slug,link:c.slug,routeSlug:c.slug,...L,relativePathFromDirectory:K}}))).filter(p);return e.flatten?T(I,n):X(I,n)}let l=typeof e=="string"?e:e?.page,r,o;if(l){if(l.includes("#")){const[i,u]=l.split("#");u?o=u:A.warn(`Invalid heading anchor format in sidebar: "${u}". Heading anchors should contain only alphanumeric characters, hyphens, and underscores.`),l=i}if(l=_(l),n.locale&&n.locale!==M){const i=z(v.join(n.locale.toLowerCase(),l));r=a.getRouteBySlug(i)}r||(r=a.getRouteBySlug(l)),r||(r=a.getRouteByFsPath(F(a.contentDir,s,n,l,t.fs)))}const g=r?.metadata;if(e?.$ref){let i=F(a.contentDir,s,n,e.$ref,t.fs);if(n.ref!==void 0&&(i=v.posix.join(n.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"),d=v.dirname(i);return await k(u.data,s,a,t,{...n,navFile:i,ref:d})||[]}if(!r){const i=n.excludedFromLinkCheckerPatterns?.catalog.some(d=>d.test(l||"")),u=n.excludedFromLinkCheckerPatterns?.apiFunctions.some(d=>d.test(l||e.href||""));(u||i)&&(e={...e,href:l||e.href,page:void 0,target:e.target??(u?"_blank":void 0)}),await Q(e,n,t,s)}if(r&&!e.disconnect&&!n.ignoreCustomSidebar&&(o||r?.getSidebar)){const i=r.versions?.find(d=>d.active),u=i&&{version:i.version,isDefault:i.default,versionFolderId:i.folderId};if(o){let d=[];if(r.getSidebar&&(d=r.getSidebar(r,{...e,...await b(e,a,t,n)}),d&&d.length>0)){const p=d[0];p&&p.link&&(p.link=`${p.link}#${o}`)}if(!d||d.length===0){let p=e.group||e.label||o;d=[{type:"link",fsPath:r.fsPath,metadata:r.metadata,link:`${r.slug}#${o}`,routeSlug:r.slug,label:p,labelTranslationKey:e.labelTranslationKey,...await b(e,a,t,n),[h]:r[h],[y]:{slug:r.slug,fsPath:r.fsPath},...u}]}return m(d,u,r[h],r[y])}if(r?.getSidebar){const d=r.getSidebar(r,{...e,...await b(e,a,t,n)}),p=e.group&&d?.[0]?.routeSlug===r.slug?d.slice(1):d;return m(n.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:p,labelTranslationKey:e.labelTranslationKey,metadata:g,...await b(e,a,t,n)}]:d,u,r[h],r[y])}}if(r&&!e.group){const i=o?`${r.slug}#${o}`:r.slug;let u=e.label||o||"";u||(u=await r.getNavText?.()||r.slug);const d=r.versions?.find(I=>I.active),p=d&&{version:d.version,isDefault:d.default,versionFolderId:d.folderId};return{type:"link",fsPath:r.fsPath,linkedSidebars:e.linkedSidebars,metadata:g,[h]:e?.rbac||r[h],[y]:{slug:r.slug,fsPath:r.fsPath},label:u,labelTranslationKey:e.labelTranslationKey,link:i,items:await k(e.items,s,a,t,n),separatorLine:e.separatorLine,linePosition:e.linePosition,routeSlug:e.disconnect?void 0:i,external:e.external,target:e.target,badges:e.badges,...await b(e,a,t,n),...p,additionalProps:e.additionalProps}}else if(e?.group){const i=r?.versions?.find(d=>d.active),u=R(n?.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 k(e.items,s,a,t,n),expanded:e.expanded?e.expanded.toString():void 0,selectFirstItemOnExpand:e.selectFirstItemOnExpand,menuStyle:e.menuStyle,separatorLine:e.separatorLine,linePosition:e.linePosition,...await b(e,a,t,n),[h]:e?.rbac,[y]:{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 b(e,a,t,n),[h]:e?.rbac,additionalProps:e.additionalProps};if(e?.separator!=null||e?.separatorLine!=null){const i=R(n?.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 b(e,a,t,n),[h]:e?.rbac,additionalProps:e.additionalProps}}else{const i=R(n?.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 Q(e,s,a,t){const{href:n,page:f}=e;if(n||!f)return;const l=F(a.fs.cwd,t,s,f,a.fs),r=a.fs.exists(l),o=await a.isPathIgnored(l),g=(r?"The page is ignored: ":"Can't resolve page: ")+f;(!r||o)&&S.reportBrokenLink({type:"BROKEN_LINK",brokenLinkType:"LINK",title:e.label||e.group||"",link:l,rawLink:f,message:g,sourceFileRelativePath:s.navFile,sourceFileLocation:{line:0}})}function F(e,s,a,t="",n){if(a.ref!==void 0)return w(v.relative(e,v.resolve(e,v.join(a.ref,t))));if(t.startsWith("/")){const f=B(s)?G(s):void 0,l=f?`${n.localizationFolder}/${f}/`:"",r=t.slice(1);return B(r)?r:l+w(r)}return w(v.relative(e,v.resolve(e,s,t)))}function X(e,s){const a={};for(const r of e){const o=v.dirname(r.relativePathFromDirectory),g=r.version?x+r.version:"",i=v.basename(r.relativePathFromDirectory)+g;l(o,r,i)}const t=f(n(a));return T(t,s);function n(r){const o=[];for(const g of Object.keys(r)){const i=r[g];o.push({...i,items:i.items?n(i.items):void 0})}return o}function f(r){return r.sort((o,g)=>{const i=typeof o=="string"?o.toLowerCase():o.relativePathFromDirectory||o.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 l(r,o,g){r==="."&&(r="");const i=r.split("/").filter(Boolean);let u=a;for(const d of i){const p=d+(o?.version||"");u[p]||(u[p]={type:"group",version:o?.version,label:d,isDefault:o?.isDefault,versionFolderId:o.versionFolderId,items:{}}),u=u[p].items}u[g]=o}}function T(e,s){return e.flatMap(a=>a?.sidebarItems?s.groupCustomSidebars?{...a,items:a.sidebarItems,sidebarItems:void 0,relativePathFromDirectory:void 0}:a.sidebarItems:{...a,items:a.items?T(a.items,s):void 0})}function m(e,s,a,t){return e.map(n=>({...n,...s,[h]:n[h]||a,[y]:n[y]||t,items:n.type==="group"&&n.items?m(n.items,s,a):n.items}))}function Z(e){return e.replace(/@[^\/]+\//,"")}async function ye(e,s,a,t){const n=(e?.items||[]).filter(r=>r.linkedSidebars?.length).map(r=>({...r,items:void 0})),f=await E(n,s.contentDir,s,a,t),l=new Map;for(const r of f)if(r.linkedSidebars?.length)for(const o of r.linkedSidebars){if(l.has(o)){A.warn(`Only one navbar item can belong to sidebar. "${o}" on 'linkedSidebars' property on "${r.label}" will be ignored.`);continue}l.set(o,{label:r.label,link:r.link})}return l}export{ye as collectItemsLinkedToSidebars,D as normalizeItems,N as resolveItem,k as resolveItems,E as resolveLinksFromConfig};
@@ -17,6 +17,9 @@ export declare const RbacDecorator: () => {
17
17
  any: {
18
18
  leave(node: Record<string, unknown>, ctx: any): void;
19
19
  };
20
+ ref: {
21
+ leave(node: Record<string, unknown>): void;
22
+ };
20
23
  };
21
24
  export declare function injectDecoratorIntoConfig(config: RawUniversalConfig, outputRelativePath: string, cwd: string): RawUniversalConfig;
22
25
  //# sourceMappingURL=decorators.d.ts.map
@@ -1 +1 @@
1
- import l from"node:path";import{REDOCLY_TEAMS_RBAC as b}from"@redocly/config";import{slash as k}from"../../../utils/path/slash.js";function u(a,r,o){if(!r)throw new Error("Visitor required");if(a){a.description&&r(a,"description",o.location.absolutePointer+"/description",o);for(const t in a["x-enumDescriptions"])r(a["x-enumDescriptions"],t,o.location.absolutePointer+"/x-enumDescriptions/"+t,o)}}const d=/^[a-zA-Z0-9\s\-,.!\?:;'"()/]+$/,s=({outputRelativePath:a,cwd:r})=>{const o=function(n,m,f,p){const{node:e}=p.resolve(n[m]);if(!e||typeof e!="string"||e.match(d))return;const i=p.getVisitorData();i.markdocChunks=i.markdocChunks||[],i.markdocChunks.push({node:n,pointer:k(l.relative(r,f)),markdown:e,relativePath:a,key:m})};return{any:{leave(t,n){u(t,o,n)}},ref:{leave(t,n){u(t,o,n)}}}},c=()=>{const a={};return{Tag:{enter(r){r?.["x-rbac"]&&(a[String(r.name)]=r["x-rbac"])}},any:{leave(r,o){if((o.type.name==="Operation"||o.type.name==="Webhook")&&"tags"in r&&Array.isArray(r.tags))for(const t of r.tags)a[t]&&(r["x-rbac"]=r["x-rbac"]||a[t]);r?.["x-rbac"]&&(r[b]=r["x-rbac"],delete r["x-rbac"])}}}};function x(a,r,o){const t={id:"markdown",decorators:{oas2:{markdown:s,rbac:c},oas3:{markdown:s,rbac:c},async3:{markdown:s,rbac:c}}};return{...a,decorators:{"markdown/rbac":"on","markdown/markdown":{outputRelativePath:r,cwd:o},...a.decorators||{}},plugins:[...a.plugins||[],t]}}export{s as MarkdownParserDecorator,c as RbacDecorator,x as injectDecoratorIntoConfig};
1
+ import b from"node:path";import{REDOCLY_TEAMS_RBAC as m}from"@redocly/config";import{slash as k}from"../../../utils/path/slash.js";function p(a,r,t){if(!r)throw new Error("Visitor required");if(a){a.description&&r(a,"description",t.location.absolutePointer+"/description",t);for(const o in a["x-enumDescriptions"])r(a["x-enumDescriptions"],o,t.location.absolutePointer+"/x-enumDescriptions/"+o,t)}}const g=/^[a-zA-Z0-9\s\-,.!\?:;'"()/]+$/,u=({outputRelativePath:a,cwd:r})=>{const t=function(e,s,l,c){const{node:n}=c.resolve(e[s]);if(!n||typeof n!="string"||n.match(g))return;const i=c.getVisitorData();i.markdocChunks=i.markdocChunks||[],i.markdocChunks.push({node:e,pointer:k(b.relative(r,l)),markdown:n,relativePath:a,key:s})};return{any:{leave(o,e){p(o,t,e)}},ref:{leave(o,e){p(o,t,e)}}}},f=()=>{const a={};return{Tag:{enter(r){r?.["x-rbac"]&&(a[String(r.name)]=r["x-rbac"])}},any:{leave(r,t){if((t.type.name==="Operation"||t.type.name==="Webhook")&&"tags"in r&&Array.isArray(r.tags))for(const o of r.tags)a[o]&&(r["x-rbac"]=r["x-rbac"]||a[o]);r?.["x-rbac"]&&(r[m]=r["x-rbac"],delete r["x-rbac"])}},ref:{leave(r){r?.["x-rbac"]&&(r[m]=r["x-rbac"],delete r["x-rbac"])}}}};function h(a,r,t){const o={id:"markdown",decorators:{oas3:{markdown:u,rbac:f},async3:{markdown:u,rbac:f}}};return{...a,decorators:{"markdown/rbac":"on","markdown/markdown":{outputRelativePath:r,cwd:t},...a.decorators||{}},plugins:[...a.plugins||[],o]}}export{u as MarkdownParserDecorator,f as RbacDecorator,h as injectDecoratorIntoConfig};
@@ -1,11 +1,9 @@
1
1
  import type { PageRouteDetails } from '../../types';
2
2
  import type { MdOptions } from '@redocly/config';
3
3
  /** Load API catalog entry custom fields from the API registry */
4
- export default function getServerProps(props: PageRouteDetails, _data: any, { variables }: MdOptions & {
4
+ export default function getServerProps(props: PageRouteDetails, data: any, { variables }: MdOptions & {
5
5
  variables: {
6
6
  idpAccessToken?: string;
7
7
  };
8
- }): Promise<{
9
- customFields: Record<string, unknown>;
10
- }>;
8
+ }): Promise<any>;
11
9
  //# sourceMappingURL=get-server-props-custom-fields.d.ts.map
@@ -1 +1 @@
1
- import i from"path";import{REGISTRY_APIS_PATHS_API_URL as a}from"../../constants/common.js";import{logger as n}from"../../tools/notifiers/logger.js";async function p(r,d,{variables:o}){const c=i.posix.dirname(r.fsPath);let t={};if(o.idpAccessToken&&a)try{const s=a+"/"+encodeURIComponent(c),e=await fetch(s,{headers:{Cookie:`accessToken=${o.idpAccessToken}`}});e.status!==200?n.warnProd(`Failed to fetch custom fields. API response status: ${e.status}. Request URL: ${s}`):t=(await e.json()).customFields||{}}catch(s){n.warnProd("Failed to fetch custom fields: "+s.message)}return{customFields:t}}export{p as default};
1
+ import f from"path";import{REGISTRY_APIS_PATHS_API_URL as n}from"../../constants/common.js";import{logger as c}from"../../tools/notifiers/logger.js";async function l(i,p,{variables:d}){const m=f.posix.dirname(i.fsPath);let t={},o={};const a=process.env.REDOCLY_LOCAL_DEV_TOKEN||d.idpAccessToken;if(a&&n)try{const e=n+"/"+encodeURIComponent(m),s=await fetch(e,{headers:{Cookie:`accessToken=${a}`}});if(s.status!==200)c.warnProd(`Failed to fetch custom fields. API response status: ${s.status}. Request URL: ${e}`);else{const r=await s.json();t=r.customFields||{},o=r.metadata||{}}}catch(e){c.warnProd("Failed to fetch custom fields: "+e.message)}return{customFields:t,metadata:o,...p.props}}export{l as default};
@@ -1 +1 @@
1
- import{getPublicEnvVariables as t}from"../../utils/envs/get-public-env-variables.js";const a=async({fsPath:r},e,{partials:n,variables:o})=>({definitionId:r,...e.props,markdown:{partials:n,variables:{...o,env:t()}}});var s=a;export{s as default};
1
+ import{getPublicEnvVariables as n}from"../../utils/envs/get-public-env-variables.js";const l=async({fsPath:r,slug:e},t,{variables:a,partials:i},o)=>{const s=o.getPartialsForRoute?.(e)||i;return{definitionId:r,...t.props,markdown:{partials:s,variables:{...a,env:n()}}}};var d=l;export{d as default};
@@ -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 Oe(){let L=[],A={},M=new Set;return{id:"openapi",requiredEntitlements:["openapi"],loaders:{"load-oas-docs":pe,"load-oas":ie},processContent:async(e,i)=>{await le("build.plugin.openapi_docs",async c=>{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")),p=await i.getConfig();c?.setAttribute("config",JSON.stringify(p.openapi||{}));const S=p.rules?.["custom-fields-schema"];A={};const l=await e.loadOpenApiDefinitions(i);L=l.map(({markdocChunks:m,relativePath:f,customOutputRelativeFile:n,isVirtual:r,realRelativePath:h})=>({chunks:m,relativePath:f,realRelativePath:h,isVirtual:n!=null||r})),ne(l,e.outdir);const u={};for(const m of l||[]){const{definition:f,config:n,relativePath:r,customOutputRelativeFile:h,contentItems:_,flatItems:k,parser:E,options:B,rawOptions:q,hash:J}=m,N=h||r,o=[],x={},{definition:Q}=E||{},{info:d}=Q||{},v=d?.["x-metadata"],O=!!n.openapi?.excludeFromSearch||!!n.theme?.openapi?.excludeFromSearch||!!p.openapi?.excludeFromSearch||!!p.theme?.openapi?.excludeFromSearch,G={title:d?.title,description:d?.description,summary:d?.summary,...n.metadata,...v},g={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)g.tagged.has(T)||g.tagged.set(T,[]),g.tagged.get(T)?.push(t);else g.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:O,slugSuffix:z,fsPath:N,httpVerb:t?.httpVerb||"",path:r,templateId:R,[D]:K||n.rbac,getAiDocumentsStore:de({parser:E,options:B,info:d,tagOperations:g,openapiContentItem:F,metadata:G,relativePath:r,getSearchFacets:e.getSearchFacets,includeInLLMsTxt:Y,excludeFromSearch:O}),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:()=>d?.title,getSearchDocuments:ae(E,B,k,e.getSearchFacets,e.setSearchFacets,O)},v?.apiId&&(u[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:S?[a,s]:[a]});const X=V()?r:void 0,H=`${U}${r}`;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:S?[a,s]:[a]})}e.setGlobalData({apiProducts:u})})},afterRoutesCreated:async(e,i)=>{const c=new Set;for(const{chunks:a,relativePath:s,isVirtual:p,realRelativePath:S}of L){const l=(await i.cache.load(S,"load-oas")).compoundHash;await i.cache.load(s,{loader:async function(){for(const{node:m,markdown:f,pointer:n,key:r,relativePath:h}of a){const{ast:_}=await e.parseMarkdoc({content:f,relativePath:n,isVirtual:p},i,{sharedDataIds:[`${U}${h}`]});m[`x-parsed-md-${r}`]={result:Z(_)}}},name:"openapi-markdoc-inline-parser"},[l]);for(const{pointer:u}of a)c.add(u)}const R=M.difference(c);for(const a of R)i.cache.delete(a);M=c;for(const[a,s]of Object.entries(A))await e.createSharedData(a,{...s,baseSlug:e.getRouteByFsPath(s.fsPath)?.baseSlug},s.hash)}}}export{Oe as openAPIDocsPlugin};
1
+ import{REDOCLY_TEAMS_RBAC as D}from"@redocly/config";import{OPENAPI_DOCS_TEMPLATE_ID as U,PUBLIC_RBAC_SCOPE_ITEM as V}from"../../../constants/common.js";import{DEPRECATED_PUBLIC_API_DEFINITIONS_FOLDER as te,PUBLIC_API_DEFINITIONS_FOLDER as oe}from"../../constants/common.js";import{OPENAPI_CUSTOM_FIELDS_SERVER_PROPS_GETTER_ID as ae,OPENAPI_SHARED_DATA_PREFIX as q}from"../../constants/plugins/openapi-docs.js";import{envConfig as J}from"../../../config/env-config.js";import{logger as A}from"../../tools/notifiers/logger.js";import{searchResolver as re}from"./search/search-resolver.js";import{convertOpenAPIDocs2Sidebar as se,shouldAddRoute as ne}from"./utils.js";import{getTemplatePath as k}from"./get-template-path.js";import{storeDefinitionBundles as ie}from"./store-definition-bundles.js";import{definitionLoader as pe,definitionsLoader as de}from"./load-definition.js";import{getAiDocumentsStore as ce}from"./search/get-ai-search-documents.js";import{fromCurrentDir as le}from"../../utils/paths.js";import{telemetryTraceStep as ue}from"../../../cli/telemetry/helpers/trace-step.js";const w="openapi-spec-download";async function Ce(){let M=[],R={},B=new Set;return{id:"openapi",requiredEntitlements:["openapi"],loaders:{"load-oas-docs":de,"load-oas":pe},processContent:async(e,p)=>{await ue("build.plugin.openapi_docs",async _=>{e.createRequestHandler(w,le(import.meta.url,"./spec-download.api.js")),e.addApiRoute({slug:oe+"/*",requestHandlerId:w,httpMethod:"all",[D]:V,getStaticData:async()=>({props:{}})}),e.addApiRoute({slug:te+"/*",requestHandlerId:w,httpMethod:"all",[D]:V,getStaticData:async()=>({props:{}})});const l=e.createTemplate(U,k("./template/OpenAPIDocs.js")),g=e.registerServerPropsGetter(U,k("./get-server-props.js")),n=e.registerServerPropsGetter(ae,k("./get-server-props-custom-fields.js")),o=await p.getConfig();_?.setAttribute("config",JSON.stringify(o.openapi||{}));const E=o.rules?.["custom-fields-schema"];R={};const T=A.startTiming("Loading openapi definitions..."),u=await e.loadOpenApiDefinitions(p);A.infoTime(T,"Loading openapi definitions..."),M=u.map(({markdocChunks:r,relativePath:m,customOutputRelativeFile:i,isVirtual:s,realRelativePath:d})=>({chunks:r,relativePath:m,realRelativePath:d,isVirtual:i!=null||s})),ie(u,e.outdir);const h={};for(const r of u||[]){const{definition:m,config:i,relativePath:s,customOutputRelativeFile:d,contentItems:v,flatItems:N,parser:C,options:x,rawOptions:Q,hash:W}=r,G=d||s,a=[],H={},{definition:X}=C||{},{info:c}=X||{},O=c?.["x-metadata"],y=!!i.openapi?.excludeFromSearch||!!i.theme?.openapi?.excludeFromSearch||!!o.openapi?.excludeFromSearch||!!o.theme?.openapi?.excludeFromSearch,$={title:c?.title,description:c?.description,summary:c?.summary,...i.metadata,...O},f={untagged:[],tagged:new Map};for(const t of N){const{id:F,href:S,operationDefinition:P}=t;if(P){const{tags:I}=P;if(I)for(const L of I)f.tagged.has(L)||f.tagged.set(L,[]),f.tagged.get(L)?.push(t);else f.untagged.push(t);J.isDevelopMode&&(H[`#${P.pointer}`]=t.href)}if(!ne({item:t}))continue;const b=t,K=b.type==="section"&&!!b.infoDefinition,Z=S.split("#")[0]+"/",ee=P?.[D];a.push({excludeFromSearch:y,slugSuffix:Z,fsPath:G,metadata:{subType:"openapi-operation"},httpVerb:t?.httpVerb||"",path:s,templateId:l,[D]:ee||i.rbac,getAiDocumentsStore:ce({parser:C,options:x,info:c,tagOperations:f,openapiContentItem:b,metadata:$,relativePath:s,getSearchFacets:e.getSearchFacets,includeInLLMsTxt:K,excludeFromSearch:y}),getStaticData:async I=>({props:{dynamicMarkdocComponents:["openapi"],baseSlug:I.baseSlug,seo:t["x-metadata"]?.seo||{title:t.name,description:t.description},itemId:F,disableAutoScroll:!0}})})}a[0]={...a[0],metadata:{type:"openapi",...$},hasClientRoutes:!0,getSidebar:(t,F)=>{const S=[];return se({contentItems:v,sidebarItems:S,routeSlug:t.slug,navItem:F}),S},getNavText:()=>c?.title,getSearchDocuments:re(C,x,N,e.getSearchFacets,e.setSearchFacets,y)},O?.apiId&&(h[O.apiId]={slug:a[0]?.slug||""});const Y=a[0];a[0]=a[a.length-1],a[a.length-1]=Y;const z=J.isDevelopMode?s:void 0,j=`${q}${s}`;R[j]={fsPath:G,definition:m,options:Q,sourcePath:z,routesMapping:H,hash:W};for(const t of a)e.addRoute({...t,sharedData:[{id:j,key:"openAPIDocsStore"}],serverPropsGetterIds:E?[g,n]:[g]})}e.setGlobalData({apiProducts:h})})},afterRoutesCreated:async(e,p)=>{const _=A.startTiming("Parsing openapi markdoc chunks..."),l=new Set;for(const{chunks:n,relativePath:o,isVirtual:E,realRelativePath:T}of M){const u=e.getAllRoutes().filter(r=>r.fsPath===o).map(r=>r.slug),h=(await p.cache.load(T,"load-oas")).compoundHash;await p.cache.load(o,{loader:async function(){for(const{node:m,markdown:i,key:s,relativePath:d}of n){const{ast:v}=await e.parseMarkdoc({content:i,relativePath:d,isVirtual:E},p,{sharedDataIds:[`${q}${d}`],routeSlugs:u});m[`x-parsed-md-${s}`]={result:v}}},name:"openapi-markdoc-inline-parser"},[h]);for(const{pointer:r}of n)l.add(r)}A.infoTime(_,"Parsing openapi markdoc chunks...");const g=B.difference(l);for(const n of g)p.cache.delete(n);B=l;for(const[n,o]of Object.entries(R))await e.createSharedData(n,{...o,baseSlug:e.getRouteByFsPath(o.fsPath)?.baseSlug},o.hash)}}}export{Ce as openAPIDocsPlugin};
@@ -4,6 +4,7 @@ import type { ContentItemModel, IMenuItem, OpenAPIDefinition, Options } from '@r
4
4
  import type { LifecycleContext } from '../../types';
5
5
  export type BundledDefinition = {
6
6
  definition: OpenAPIDefinition;
7
+ originalDefinition?: Record<string, unknown>;
7
8
  config: Partial<RedoclyConfig & NonNullable<RedoclyConfig['apis']>[string]>;
8
9
  relativePath: string;
9
10
  realRelativePath: string;
@@ -1,3 +1,3 @@
1
- import*as l from"path";import{convertSwagger2OpenAPI as oo}from"@redocly/openapi-docs/lib/utils/convertSwagger2OpenAPI.js";import{Source as no,bundle as ro,createConfig as to,getTotals as io,resolvePlugins as eo}from"@redocly/openapi-core";import{normalizeOptions as ao,OpenAPIParser as so,buildContentItems as co}from"@redocly/openapi-docs";import{combineUrls as E}from"@redocly/theme/core/utils";import{CONFIG_FILE_NAME as A}from"../../../constants/common.js";import{PUBLIC_API_DEFINITIONS_FOLDER as P}from"../../constants/common.js";import{MAX_BUNDLING_ERRORS_TO_PRINT as fo}from"../../constants/plugins/openapi-docs.js";import{unique as lo}from"../../../utils/array/unique.js";import{deepMerge as F}from"../../../utils/object/deep-merge.js";import{pluralize as R}from"../../../utils/string/pluralize.js";import{replaceEnvVariablesDeep as po}from"../../utils/envs/replace-env-variables-deep.js";import{logger as N}from"../../tools/notifiers/logger.js";import{reporter as b}from"../../tools/notifiers/reporter.js";import{injectDecoratorIntoConfig as uo}from"./decorators.js";import{getAllApiConfigsByPath as mo}from"../get-api-config.js";import{normalizeFeedbackOptions as go}from"./utils.js";import{replaceFileExtension as L}from"./store-definition-bundles.js";import{ExternalResolver as wo}from"../../fs/utils/external-ref-resolver.js";import{formatBundleError as ho}from"./format-bundle-error.js";async function Mo(o,u){const{fs:r,cache:O,getConfig:g,isPathIgnored:m}=u;if(l.posix.basename(o)===A)return[];let s;try{s=(await O.load(o,"yaml")).data}catch{return[]}if(!s?.openapi&&!s?.swagger)return N.verbose(`${o} file is not definition. Skipping`),[];const p=await g("."),e=r.getFileInfo(o),n=await g(l.posix.dirname(o)),M=mo(n?.apis,o,n.configPath),S=[],V=await m(o);for(const c of M){if(!c.output&&V)continue;const T=F({decorators:p.decorators},n,{rbac:void 0},c),{resolvedObj:a}=po(T);if(a.decorators&&typeof a.decorators!="object"){await b.panicOnBuildContentError(`'decorators' must be an object at redocly.yaml, got '${typeof a.decorators}'`);continue}if(a.plugins&&!Array.isArray(a.plugins)){await b.panicOnBuildContentError(`'plugins' must be an array at redocly.yaml, got '${typeof a.plugins}'`);continue}const U=n.configPath?l.posix.dirname(n.configPath):".",t=c.output?l.posix.join(U,c.output):o;if(await m(t))continue;e&&c.output&&!r.exists(t)&&r.addVirtualFile(t,e);const z=l.resolve(r.cwd,n.realConfigPath||A),v=new wo(r),C=await to(uo(a,t,r.cwd),{configPath:z,externalRefResolver:v});p.plugins&&p.configPath!==n.configPath&&(C.plugins=lo([...C.plugins||[],...await eo(p.plugins,r.cwd)],f=>f.id));const D=l.resolve(r.cwd,o),G=await r.read(o),J={config:C,base:l.dirname(D),doc:{source:new no(D,G),parsed:JSON.parse(JSON.stringify(s))},externalRefResolver:v},{bundle:{parsed:y},problems:B,visitorsData:q}=await ro(J),H=q["markdown/markdown"]?.markdocChunks??[],i=io(B);let _=[i.errors&&`${i.errors} ${R(i.errors,"error","errors")}`,i.warnings&&`${i.warnings} ${R(i.warnings,"warning","warnings")}`,i.ignored&&`${i.ignored} ignored`].filter(Boolean).join(", ");if(i.errors){const f=B.filter(d=>d.severity==="error");let $=`${_} while bundling ${t} definition:
2
- `;const x=Math.min(f.length,fo);for(let d=0;d<x;d++){const Y=f[d],Z=await ho(Y,r.cwd);$+=`${Z}
3
- `}if(f.length>x){const d=f.length-x;$+=`... and ${d} more ${R(d,"error","errors")}`}await b.panicOnBuild($)}i.warnings&&N.warn(`${_} while bundling %rp definition`,t);const w=bo(y.swagger!==void 0?await oo(y):y,n.metadata),h=F(p.openapi||{},n.openapi||{},c.openapi||c?.theme?.openapi||{});h.showSchemaCatalogLinks&&(w["x-schema-catalog-link"]=E(P,t));const X=w["x-feedback"]||h.feedback||n.feedback,j={...h,feedback:go(X),hideSidebar:!0,disableRouter:!0,mockServer:a?.mockServer||p?.mockServer,downloadUrls:h.downloadUrls||[{url:E(P,`${L(t,".json")}?download`)},{url:E(P,`${L(t,".yaml")}?download`)}]},I=ao(j);let k;try{k=new so(w,void 0,I)}catch(f){await b.panicOnBuild(f);continue}const{contentItems:K,flatItems:Q}=co(k,I),W={definition:w,config:a,relativePath:t,realRelativePath:e?.realRelativePath||t,customOutputRelativeFile:c.output&&t,markdocChunks:H,contentItems:K,flatItems:Q,options:I,rawOptions:j,parser:k,isVirtual:e?.isVirtual??!1};S.push(W)}return S}async function Vo(o,u){const{fs:r,cache:O,getConfig:g}=u,m=[];for(const s of r.scan(/(\.ya?ml|\.json)$/)){if(!await g(l.posix.dirname(s.relativePath)))continue;const e=await O.load(s.relativePath,"load-oas");e.data&&e.data.length&&m.push(...e.data.map(n=>({...n,isVirtual:s.isVirtual||n.isVirtual,hash:e.compoundHash})))}return m}function bo(o,u){return u?{...o,info:{...o.info,"x-metadata":{...o.info["x-metadata"],...u}}}:o}export{Mo as definitionLoader,Vo as definitionsLoader};
1
+ import*as l from"path";import{convertSwagger2OpenAPI as ao}from"@redocly/openapi-docs/lib/utils/convertSwagger2OpenAPI.js";import{Source as so,bundle as co,createConfig as fo,getTotals as lo,resolvePlugins as po}from"@redocly/openapi-core";import{normalizeOptions as uo,OpenAPIParser as go,buildContentItems as mo}from"@redocly/openapi-docs";import{combineUrls as P}from"@redocly/theme/core/utils";import{CONFIG_FILE_NAME as U}from"../../../constants/common.js";import{PUBLIC_API_DEFINITIONS_FOLDER as k}from"../../constants/common.js";import{MAX_BUNDLING_ERRORS_TO_PRINT as wo}from"../../constants/plugins/openapi-docs.js";import{deepMerge as z}from"../../../utils/object/deep-merge.js";import{pluralize as j}from"../../../utils/string/pluralize.js";import{replaceEnvVariablesDeep as ho}from"../../utils/envs/replace-env-variables-deep.js";import{logger as J}from"../../tools/notifiers/logger.js";import{reporter as $}from"../../tools/notifiers/reporter.js";import{convertOpenRPC2OpenAPI as bo}from"./openrpc-converter.js";import{injectDecoratorIntoConfig as Oo}from"./decorators.js";import{getAllApiConfigsByPath as Co}from"../get-api-config.js";import{normalizeFeedbackOptions as yo}from"./utils.js";import{replaceFileExtension as A}from"./store-definition-bundles.js";import{ExternalResolver as Io}from"../../fs/utils/external-ref-resolver.js";import{formatBundleError as Ro}from"./format-bundle-error.js";const N=new Map;async function Jo(o,p){const{fs:n,cache:w,getConfig:h,isPathIgnored:m}=p;if(l.posix.basename(o)===U)return[];let t,x;try{t=(await w.load(o,"yaml")).data,x=(await w.load(o,"yaml")).data}catch{return[]}if(!t?.openapi&&!t?.swagger&&!t?.openrpc)return J.verbose(`${o} file is not definition. Skipping`),[];const s=!!t?.openrpc;s&&(t=bo(t));const d=await h("."),b=n.getFileInfo(o),c=await h(l.posix.dirname(o)),G=Co(c?.apis,o,c.configPath),F=[],H=await m(o);for(const r of G){if(!r.output&&H)continue;const O=z({decorators:d.decorators},c,{rbac:void 0},r),{resolvedObj:i}=ho(O);if(i.decorators&&typeof i.decorators!="object"){await $.panicOnBuildContentError(`'decorators' must be an object at redocly.yaml, got '${typeof i.decorators}'`);continue}if(i.plugins&&!Array.isArray(i.plugins)){await $.panicOnBuildContentError(`'plugins' must be an array at redocly.yaml, got '${typeof i.plugins}'`);continue}const E=c.configPath?l.posix.dirname(c.configPath):".",e=r.output?l.posix.join(E,r.output):o;if(await m(e))continue;b&&r.output&&!n.exists(e)&&n.addVirtualFile(e,b);const u=l.resolve(n.cwd,c.realConfigPath||U),y=new Io(n),X=await K({config:i,outputRelativePath:e,configPath:u,externalRefResolver:y,plugins:d.plugins}),M=l.resolve(n.cwd,o),q=await n.read(o),Q={config:X,base:l.dirname(M),doc:{source:new so(M,q),parsed:JSON.parse(JSON.stringify(t))},externalRefResolver:y},{bundle:{parsed:v},problems:L,visitorsData:W}=await co(Q),Y=W["markdown/markdown"]?.markdocChunks??[],a=lo(L);let V=[a.errors&&`${a.errors} ${j(a.errors,"error","errors")}`,a.warnings&&`${a.warnings} ${j(a.warnings,"warning","warnings")}`,a.ignored&&`${a.ignored} ignored`].filter(Boolean).join(", ");if(a.errors){const g=L.filter(f=>f.severity==="error");let B=`${V} while bundling ${e} definition:
2
+ `;const _=Math.min(g.length,wo);for(let f=0;f<_;f++){const ro=g[f],io=await Ro(ro,n.cwd);B+=`${io}
3
+ `}if(g.length>_){const f=g.length-_;B+=`... and ${f} more ${j(f,"error","errors")}`}await $.panicOnBuild(B)}a.warnings&&J.warn(`${V} while bundling %rp definition`,e);const I=Po(v.swagger!==void 0?await ao(v):v,c.metadata),R=z(d.openapi||{},c.openapi||{},r.openapi||r?.theme?.openapi||{});R.showSchemaCatalogLinks&&(I["x-schema-catalog-link"]=P(k,e));const Z=I["x-feedback"]||R.feedback||c.feedback,oo=s?[{url:P(k,`${A(e,".json")}?download`),label:"Download OpenRPC"}]:[{url:P(k,`${A(e,".json")}?download`)},{url:P(k,`${A(e,".yaml")}?download`)}],T={...R,feedback:yo(Z),hideSidebar:!0,disableRouter:!0,mockServer:s?{off:!0}:i?.mockServer||d?.mockServer,downloadUrls:R.downloadUrls||oo},S=uo(T);let D;try{D=new go(I,void 0,S)}catch(g){await $.panicOnBuild(g);continue}const{contentItems:no,flatItems:eo}=mo(D,S),to={definition:I,originalDefinition:s?x:void 0,config:i,relativePath:e,realRelativePath:b?.realRelativePath||e,customOutputRelativeFile:r.output&&e,markdocChunks:Y,contentItems:no,flatItems:eo,options:S,rawOptions:T,parser:D,isVirtual:b?.isVirtual??!1};F.push(to)}return F;async function K(r){const{config:O,outputRelativePath:i,configPath:E,externalRefResolver:e}=r,C=JSON.stringify(O.decorators);if(N.has(C))return N.get(C);const u=await fo(Oo(O,i,n.cwd),{configPath:E,externalRefResolver:e}),y=u.plugins[0];return r.plugins&&(u.plugins=[y,...await po(r.plugins,n.cwd)]),N.set(C,u),u}}async function Go(o,p){const{fs:n,cache:w,getConfig:h}=p,m=[];for(const t of n.scan(/(\.ya?ml|\.json)$/)){if(!await h(l.posix.dirname(t.relativePath)))continue;const s=await w.load(t.relativePath,"load-oas");s.data&&s.data.length&&m.push(...s.data.map(d=>({...d,isVirtual:t.isVirtual||d.isVirtual,hash:s.compoundHash})))}return m}function Po(o,p){if(!p)return o;const n={...o,info:{...o.info,"x-metadata":{...o.info?.["x-metadata"],...p}}};return delete n.info["x-metadata"]._customMessages,n}export{Jo as definitionLoader,Go as definitionsLoader};
@@ -0,0 +1,2 @@
1
+ export declare function convertOpenRPC2OpenAPI(fullSpec: any): any;
2
+ //# sourceMappingURL=openrpc-converter.d.ts.map
@@ -0,0 +1 @@
1
+ import*as f from"openapi-sampler";function v(e){const a={openapi:"3.1.0",info:e.info,servers:e.servers,paths:{},components:{schemas:e.components?.schemas||{},securitySchemes:e.components?.["x-securitySchemes"]||{}},"x-redocly-openrpc":!0};if(e.externalDocs&&(a.externalDocs=e.externalDocs),e.methods)for(const n of e.methods){let t=n.params;t&&t.$ref&&(t=p(t,e));const r=Array.isArray(t)?t.map(i=>p(i,e)):[],d=p(n.result,e),c=n.errors?n.errors.map(i=>p(i,e)):[],s={security:n["x-security"],operationId:n.name,summary:n.summary,description:n.description,tags:n.tags?.map(i=>{const m=p(i,e);return m?.name||m}),deprecated:n.deprecated,externalDocs:n.externalDocs,servers:n.servers,requestBody:x(r,n.paramStructure,n.name,e),responses:j(d,c,e)};if(n.examples){const i={},m={};for(const o of n.examples){if(o.params&&o.params.length>0){const h=n.paramStructure==="by-position"?o.params.map(u=>u.value):Object.fromEntries(o.params?.map((u,l)=>[(r.find(y=>y?.name===u.name)||r[l])?.name||u.name,u.value]));i[o.name]={summary:o.name,description:o.description,value:{jsonrpc:"2.0",method:n.name,params:h,id:1}}}o.result&&(m[o.name]={summary:o.name,description:o.description,value:{jsonrpc:"2.0",method:n.name,result:o.result?.value||o.result,id:1}})}Object.keys(i).length>0&&s.requestBody?.content?.["application/json"]&&(s.requestBody.content["application/json"].examples=i),Object.keys(m).length>0&&s.responses?.["200"]?.content?.["application/json"]&&(s.responses[200].content["application/json"].examples=m)}a.paths[`${n.name}`]={post:s}}return a}function x(e,a="either",n,t){if(!e||e.length===0)return{content:{"application/json":{example:{jsonrpc:"2.0",method:n,id:1}}}};const r={},d=[];for(const s of e)s&&(r[s.name]=s.schema||{},s.description&&(r[s.name].description=s.description),s.required&&d.push(s.name));let c;return a==="by-position"?c={type:"array",items:e.map(s=>s?.schema||{}),minItems:e.filter(s=>s?.required).length}:c={type:"object",properties:r,required:d.length>0?d:void 0},{content:{"application/json":{schema:c,example:{jsonrpc:"2.0",method:n,params:e&&e.length>0?f.sample(c,{quiet:!0,format:"json"},t):void 0,id:1}}}}}function j(e,a=[],n){const t={};if(e&&e.schema&&(t[200]={description:e.description||"",content:{"application/json":{schema:e.schema||{},example:{jsonrpc:"2.0",result:f.sample(e.schema,{quiet:!0,format:"json"},n),id:1}}}}),a&&a.length>0)for(const r of a)r&&(t[r.code]={description:r.message,content:{"application/json":{example:{jsonrpc:"2.0",error:{code:r.code,message:r.message,data:r.data?{...r.data}:void 0},id:1}}}});return t}function p(e,a){if(e&&e.$ref&&typeof e.$ref=="string"&&e.$ref.startsWith("#/")){const n=e.$ref.substring(2).split("/");let t=a;for(const r of n){if(t===void 0)break;t=t[r]}return p(t,a)}return e}export{v as convertOpenRPC2OpenAPI};
@@ -1 +1 @@
1
- import{REDOCLY_ROUTE_RBAC as f,REDOCLY_TEAMS_RBAC as s}from"@redocly/config";import{SearchIndexer as R}from"../search-indexer.js";import{extractDocumentSearchFacets as g,setDocumentSearchFacets as S}from"./search-facets.js";function E(n,i,m,c,d,l){return async t=>{if(l)return[];const o=t.metadata||{},a=new R(n,i,t.baseSlug||t.slug);a.addInfo(n.definition.info,o);for(const e of m)a.addItem(e);const h={},r=g(o,n.definition.info,c),u=a.getResult().map(e=>({...e,[s]:e[s]||t[s],[f]:t[f]||{slug:t.slug,fsPath:t.fsPath},facets:r}));return S({...r,...h},c,d),u}}export{E as searchResolver};
1
+ import{REDOCLY_ROUTE_RBAC as f,REDOCLY_TEAMS_RBAC as a}from"@redocly/config";import{logger as R}from"../../../tools/notifiers/logger.js";import{SearchIndexer as x}from"../search-indexer.js";import{extractDocumentSearchFacets as S,setDocumentSearchFacets as p}from"./search-facets.js";function _(r,m,d,o,l,h){return async t=>{if(h)return[];const c=t.metadata||{},n=new x(r,m,t.baseSlug||t.slug);n.addInfo(r.definition.info,c);for(const e of d)try{n.addItem(e)}catch(i){console.error(i),R.warn(`Failed to add item to search indexer: ${i}`)}const g={},s=S(c,r.definition.info,o),u=n.getResult().map(e=>({...e,[a]:e[a]||t[a],[f]:t[f]||{slug:t.slug,fsPath:t.fsPath},facets:s}));return p({...s,...g},o,l),u}}export{_ as searchResolver};