@redocly/realm 0.136.0-next.1 → 0.136.0-next.11

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 (540) hide show
  1. package/CHANGELOG.md +208 -0
  2. package/dist/bin.js +1 -1
  3. package/dist/cli/build/analytics/collect-analytics.js +1 -1
  4. package/dist/cli/build/index.js +1 -1
  5. package/dist/cli/eject/ejectComponent.d.ts +1 -1
  6. package/dist/cli/eject/ejectTheme.d.ts +1 -1
  7. package/dist/cli/eject/resolveEjectParams.js +1 -1
  8. package/dist/cli/eject/themeOperations.d.ts +2 -2
  9. package/dist/cli/stats/collectors/openapi/index.js +1 -1
  10. package/dist/cli/stats/index.js +1 -1
  11. package/dist/client/App.js +1 -1
  12. package/dist/client/ErrorBoundary.js +1 -1
  13. package/dist/client/ScriptLoader.js +1 -1
  14. package/dist/client/TestProvider.d.ts +1 -1
  15. package/dist/client/TestProvider.js +1 -1
  16. package/dist/client/api-docs-builder-entry.d.ts +3 -0
  17. package/dist/client/api-docs-builder-entry.js +1 -0
  18. package/dist/client/app/ConditionalLink.d.ts +1 -1
  19. package/dist/client/app/Feedback/useSubmitFeedback.js +1 -1
  20. package/dist/client/app/Link.js +1 -1
  21. package/dist/client/app/Sidebar/Sidebar.js +3 -3
  22. package/dist/client/app/Sidebar/helpers/hide-empty-separators.d.ts +13 -0
  23. package/dist/client/app/Sidebar/helpers/hide-empty-separators.js +1 -0
  24. package/dist/client/app/Sidebar/useActions.js +1 -1
  25. package/dist/client/app/Sidebar/useBreadcrumbs.js +1 -1
  26. package/dist/client/app/Sidebar/useSidebarItems.js +1 -1
  27. package/dist/client/app/Sidebar/utils.d.ts +1 -1
  28. package/dist/client/app/Sidebar/utils.js +1 -1
  29. package/dist/client/app/hooks/catalog/useCatalogClassic.js +1 -1
  30. package/dist/client/app/hooks/catalog/useCatalogFilter.d.ts +1 -1
  31. package/dist/client/app/hooks/catalog/useCatalogFilter.js +1 -1
  32. package/dist/client/app/hooks/catalog/useCatalogSearch.js +1 -1
  33. package/dist/client/app/hooks/catalog/useCatalogSort.js +1 -1
  34. package/dist/client/app/hooks/catalog/useCatalogViewMode.js +1 -1
  35. package/dist/client/app/hooks/catalog/useFetchCatalogEntities.d.ts +1 -1
  36. package/dist/client/app/hooks/catalog/useFetchCatalogEntities.js +1 -1
  37. package/dist/client/app/hooks/catalog/useFetchCatalogEntitiesRelations.d.ts +2 -2
  38. package/dist/client/app/hooks/catalog/useFetchCatalogEntitiesRelations.js +1 -1
  39. package/dist/client/app/hooks/catalog/useFetchCatalogEntityRevisions.d.ts +1 -1
  40. package/dist/client/app/hooks/catalog/useSearchTracker.d.ts +2 -5
  41. package/dist/client/app/hooks/catalog/useSearchTracker.js +1 -1
  42. package/dist/client/app/hooks/codeHighlight/useCodeHighlight.d.ts +1 -6
  43. package/dist/client/app/hooks/codeHighlight/useCodeHighlight.js +1 -1
  44. package/dist/client/app/hooks/index.d.ts +1 -0
  45. package/dist/client/app/hooks/index.js +1 -1
  46. package/dist/client/app/hooks/products/useCurrentProduct.js +1 -1
  47. package/dist/client/app/hooks/useAutoScroll.js +1 -1
  48. package/dist/client/app/hooks/useBanner.js +1 -1
  49. package/dist/client/app/hooks/useL10nConfig.js +1 -1
  50. package/dist/client/app/hooks/useLoginUrl.js +1 -1
  51. package/dist/client/app/hooks/usePageTimeTracker.js +1 -1
  52. package/dist/client/app/hooks/useRouteChangeTracker.js +1 -1
  53. package/dist/client/app/hooks/useUserClaims.js +1 -1
  54. package/dist/client/app/l10n/hooks/index.d.ts +1 -0
  55. package/dist/client/app/l10n/hooks/index.js +1 -1
  56. package/dist/client/app/l10n/hooks/useTranslate.js +1 -1
  57. package/dist/client/app/l10n/hooks/useTranslationKeys.d.ts +2 -0
  58. package/dist/client/app/l10n/hooks/useTranslationKeys.js +1 -0
  59. package/dist/client/app/l10n/initL10n.js +1 -1
  60. package/dist/client/app/markdoc/custom-components/openapi/json-schema.d.ts +1 -1
  61. package/dist/client/app/markdoc/custom-components/openapi/json-schema.js +1 -1
  62. package/dist/client/app/markdoc/custom-components/openapi/openapi-code-sample.d.ts +1 -5
  63. package/dist/client/app/markdoc/custom-components/openapi/openapi-code-sample.js +1 -1
  64. package/dist/client/app/markdoc/custom-components/openapi/openapi-example.js +1 -1
  65. package/dist/client/app/markdoc/custom-components/openapi/openapi-response-sample.js +1 -1
  66. package/dist/client/app/markdoc/custom-components/openapi/replay-openapi.d.ts +8 -24
  67. package/dist/client/app/markdoc/custom-components/openapi/replay-openapi.js +1 -1
  68. package/dist/client/app/markdoc/hooks/use-store.d.ts +8 -6
  69. package/dist/client/app/markdoc/utils/build-replay-operation-source-map.d.ts +20 -0
  70. package/dist/client/app/markdoc/utils/build-replay-operation-source-map.js +1 -0
  71. package/dist/client/app/markdoc/utils/find-api-item.d.ts +15 -0
  72. package/dist/client/app/markdoc/utils/find-api-item.js +1 -0
  73. package/dist/client/app/markdoc/utils/find-code-sample-panel.d.ts +11 -0
  74. package/dist/client/app/markdoc/utils/find-code-sample-panel.js +1 -0
  75. package/dist/client/app/markdoc/utils/find-openapi-response-samples.d.ts +15 -0
  76. package/dist/client/app/markdoc/utils/find-openapi-response-samples.js +1 -0
  77. package/dist/client/app/markdoc/utils/openapi-panel-entry.d.ts +18 -0
  78. package/dist/client/app/markdoc/utils/openapi-panel-entry.js +1 -0
  79. package/dist/client/app/pages/DevLogin/DevLogin.js +1 -1
  80. package/dist/client/app/pages/DevLogin/DevLoginForm.d.ts +1 -1
  81. package/dist/client/app/seo/hooks/useHreflangLinks.js +1 -1
  82. package/dist/client/app/useGlobalData.d.ts +1 -1
  83. package/dist/client/app/useMobileMenu.js +1 -1
  84. package/dist/client/app/usePreloadHistory.d.ts +2 -2
  85. package/dist/client/app/usePreloadHistory.js +1 -1
  86. package/dist/client/app/utils/loadAndNavigate.d.ts +2 -2
  87. package/dist/client/app/utils/loadAndNavigate.js +1 -1
  88. package/dist/client/app/utils/resolveRouteBySlug.js +1 -1
  89. package/dist/client/app/utils/same-resolved-route.d.ts +5 -0
  90. package/dist/client/app/utils/same-resolved-route.js +1 -0
  91. package/dist/client/browser-entry.js +2 -2
  92. package/dist/client/providers/hooks.d.ts +1 -1
  93. package/dist/client/providers/hooks.js +1 -1
  94. package/dist/client/providers/page-data/hooks.d.ts +2 -2
  95. package/dist/client/providers/page-data/hooks.js +1 -1
  96. package/dist/client/providers/post-message/PostMessageProvider.js +1 -1
  97. package/dist/client/providers/post-message/use-post-message.d.ts +1 -1
  98. package/dist/client/providers/theme/ThemeDataProvider.js +1 -1
  99. package/dist/client/runtime/loader.js +1 -1
  100. package/dist/client/templates/api-docs/helpers.d.ts +10 -0
  101. package/dist/client/templates/api-docs/helpers.js +1 -0
  102. package/dist/client/templates/api-docs/template.d.ts +17 -0
  103. package/dist/client/templates/api-docs/template.js +14 -0
  104. package/dist/client/templates/openapi-docs/helpers.d.ts +1 -1
  105. package/dist/client/templates/openapi-docs/helpers.js +2 -2
  106. package/dist/client/types/sidebar.d.ts +0 -1
  107. package/dist/client/utils/utils.d.ts +0 -2
  108. package/dist/client/utils/utils.js +1 -1
  109. package/dist/constants/common.d.ts +14 -1
  110. package/dist/constants/common.js +1 -1
  111. package/dist/constants/l10n/langs/ar.js +1 -1
  112. package/dist/constants/l10n/langs/de.js +1 -1
  113. package/dist/constants/l10n/langs/en.js +1 -1
  114. package/dist/constants/l10n/langs/es.js +1 -1
  115. package/dist/constants/l10n/langs/fr.js +1 -1
  116. package/dist/constants/l10n/langs/hi.js +1 -1
  117. package/dist/constants/l10n/langs/it.js +1 -1
  118. package/dist/constants/l10n/langs/ja.js +1 -1
  119. package/dist/constants/l10n/langs/ko.js +1 -1
  120. package/dist/constants/l10n/langs/pl.js +1 -1
  121. package/dist/constants/l10n/langs/pt-BR.js +1 -1
  122. package/dist/constants/l10n/langs/pt.js +1 -1
  123. package/dist/constants/l10n/langs/ru.js +1 -1
  124. package/dist/constants/l10n/langs/uk.js +1 -1
  125. package/dist/constants/l10n/langs/zh.js +1 -1
  126. package/dist/markdoc/tags/index.d.ts +48 -2
  127. package/dist/server/api-routes/helpers/enhance-context.js +1 -1
  128. package/dist/server/api-routes/helpers/read-stream-with-size-limit.d.ts +1 -1
  129. package/dist/server/api-routes/run-api-routes-worker.d.ts +1 -1
  130. package/dist/server/api-routes/run-api-routes-worker.js +1 -1
  131. package/dist/server/config/env-config.d.ts +2 -4
  132. package/dist/server/config/env-schema.d.ts +5 -10
  133. package/dist/server/config/env-schemas/feature-flags.d.ts +4 -8
  134. package/dist/server/config/env-schemas/feature-flags.js +1 -1
  135. package/dist/server/constants/common.d.ts +2 -0
  136. package/dist/server/constants/common.js +1 -1
  137. package/dist/server/constants/entitlements.js +1 -1
  138. package/dist/server/constants/plugins/api-docs.d.ts +3 -0
  139. package/dist/server/constants/plugins/api-docs.js +1 -0
  140. package/dist/server/esbuild/esbuild-logger.js +3 -3
  141. package/dist/server/esbuild/esbuild.js +3 -3
  142. package/dist/server/esbuild/plugins/api-docs-module-replacer/empty-check.d.ts +9 -0
  143. package/dist/server/esbuild/plugins/api-docs-module-replacer/empty-check.js +1 -0
  144. package/dist/server/esbuild/plugins/api-docs-module-replacer/empty-overlay.d.ts +2 -0
  145. package/dist/server/esbuild/plugins/api-docs-module-replacer/empty-overlay.js +1 -0
  146. package/dist/server/esbuild/plugins/api-docs-module-replacer/index.d.ts +6 -0
  147. package/dist/server/esbuild/plugins/api-docs-module-replacer/index.js +1 -0
  148. package/dist/server/esbuild/plugins/themes-resolver.js +4 -2
  149. package/dist/server/persistence/cache/mappers/create-cache-db-record.d.ts +1 -1
  150. package/dist/server/persistence/file-hashes/mappers/create-file-hash-db-record.d.ts +1 -1
  151. package/dist/server/persistence/kv/mappers/create-kv-db-record.d.ts +1 -1
  152. package/dist/server/plugins/api-docs/get-server-props.d.ts +4 -0
  153. package/dist/server/plugins/api-docs/get-server-props.js +1 -0
  154. package/dist/server/plugins/api-docs/get-template-path.d.ts +2 -0
  155. package/dist/server/plugins/api-docs/get-template-path.js +1 -0
  156. package/dist/server/plugins/api-docs/import-api-docs-builder.d.ts +8 -0
  157. package/dist/server/plugins/api-docs/import-api-docs-builder.js +1 -0
  158. package/dist/server/plugins/api-docs/index.d.ts +19 -0
  159. package/dist/server/plugins/api-docs/index.js +1 -0
  160. package/dist/server/plugins/api-docs/loader.d.ts +35 -0
  161. package/dist/server/plugins/api-docs/loader.js +3 -0
  162. package/dist/server/plugins/api-docs/options.d.ts +14 -0
  163. package/dist/server/plugins/api-docs/options.js +1 -0
  164. package/dist/server/plugins/api-docs/search/get-ai-search-documents.d.ts +20 -0
  165. package/dist/server/plugins/api-docs/search/get-ai-search-documents.js +105 -0
  166. package/dist/server/plugins/api-docs/search/search-facets.d.ts +10 -0
  167. package/dist/server/plugins/api-docs/search/search-facets.js +1 -0
  168. package/dist/server/plugins/api-docs/search/search-indexer.d.ts +9 -0
  169. package/dist/server/plugins/api-docs/search/search-indexer.js +1 -0
  170. package/dist/server/plugins/api-docs/search/search-resolver.d.ts +5 -0
  171. package/dist/server/plugins/api-docs/search/search-resolver.js +1 -0
  172. package/dist/server/plugins/api-docs/spec-download.api.d.ts +4 -0
  173. package/dist/server/plugins/api-docs/spec-download.api.js +1 -0
  174. package/dist/server/plugins/api-docs/store-definition-bundles.d.ts +3 -0
  175. package/dist/server/plugins/api-docs/store-definition-bundles.js +1 -0
  176. package/dist/server/plugins/api-docs/utils/build-item-positions.d.ts +17 -0
  177. package/dist/server/plugins/api-docs/utils/build-item-positions.js +1 -0
  178. package/dist/server/plugins/api-docs/utils/build-routes-mapping.d.ts +3 -0
  179. package/dist/server/plugins/api-docs/utils/build-routes-mapping.js +1 -0
  180. package/dist/server/plugins/api-docs/utils/collect-item-routes.d.ts +12 -0
  181. package/dist/server/plugins/api-docs/utils/collect-item-routes.js +1 -0
  182. package/dist/server/plugins/api-docs/utils/decorators.d.ts +26 -0
  183. package/dist/server/plugins/api-docs/utils/decorators.js +1 -0
  184. package/dist/server/plugins/api-docs/utils/format-bundle-error.d.ts +6 -0
  185. package/dist/server/plugins/api-docs/utils/format-bundle-error.js +5 -0
  186. package/dist/server/plugins/api-docs/utils/normalize-api-version.d.ts +2 -0
  187. package/dist/server/plugins/api-docs/utils/normalize-api-version.js +1 -0
  188. package/dist/server/plugins/api-docs/utils/normalize-feedback-options.d.ts +2 -0
  189. package/dist/server/plugins/api-docs/utils/normalize-feedback-options.js +1 -0
  190. package/dist/server/plugins/api-docs/utils/relative-path-to-base-slug.d.ts +20 -0
  191. package/dist/server/plugins/api-docs/utils/relative-path-to-base-slug.js +1 -0
  192. package/dist/server/plugins/api-docs/utils/replace-file-extension.d.ts +2 -0
  193. package/dist/server/plugins/api-docs/utils/replace-file-extension.js +1 -0
  194. package/dist/server/plugins/api-docs/utils/resolve-api-doc-title.d.ts +3 -0
  195. package/dist/server/plugins/api-docs/utils/resolve-api-doc-title.js +1 -0
  196. package/dist/server/plugins/api-docs/utils/resolve-config-rbac.d.ts +10 -0
  197. package/dist/server/plugins/api-docs/utils/resolve-config-rbac.js +1 -0
  198. package/dist/server/plugins/api-docs/utils/to-relative-slug.d.ts +2 -0
  199. package/dist/server/plugins/api-docs/utils/to-relative-slug.js +1 -0
  200. package/dist/server/plugins/api-functions/index.js +1 -1
  201. package/dist/server/plugins/arazzo-docs/index.js +1 -1
  202. package/dist/server/plugins/asyncapi-docs/index.js +1 -1
  203. package/dist/server/plugins/catalog-classic/index.js +1 -1
  204. package/dist/server/plugins/catalog-entities/database/catalog-entities-diff-publisher.d.ts +1 -1
  205. package/dist/server/plugins/catalog-entities/database/catalog-entities-revisions-pruner.d.ts +4 -2
  206. package/dist/server/plugins/catalog-entities/database/catalog-entities-revisions-pruner.js +23 -3
  207. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +5 -5
  208. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-attributes-db-record.d.ts +1 -1
  209. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.d.ts +1 -1
  210. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-db-record-from-file-schema.d.ts +1 -1
  211. package/dist/server/plugins/catalog-entities/database/remote-publish-lock-service.d.ts +3 -3
  212. package/dist/server/plugins/catalog-entities/database/repositories/bffEntities/bff-entities-read-repository.d.ts +2 -2
  213. package/dist/server/plugins/catalog-entities/database/repositories/catalog-entities-repository.js +1 -1
  214. package/dist/server/plugins/catalog-entities/database/repositories/common/filters-repository.d.ts +1 -1
  215. package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.d.ts +1 -1
  216. package/dist/server/plugins/catalog-entities/database/repositories/entities/entities-read-repository.d.ts +1 -1
  217. package/dist/server/plugins/catalog-entities/database/repositories/entities/entities-write-repository.d.ts +2 -2
  218. package/dist/server/plugins/catalog-entities/database/repositories/entities/entities-write-repository.js +1 -1
  219. package/dist/server/plugins/catalog-entities/database/repositories/entityAttributes/entity-attributes-write-repository.d.ts +1 -1
  220. package/dist/server/plugins/catalog-entities/database/repositories/relations/relations-read-repository.d.ts +1 -1
  221. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.js +1 -1
  222. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.d.ts +13 -5
  223. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.js +1 -1
  224. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.d.ts +5 -2
  225. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.js +1 -1
  226. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.d.ts +6 -5
  227. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.js +2 -2
  228. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.d.ts +12 -5
  229. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.js +1 -1
  230. package/dist/server/plugins/catalog-entities/extensions/extractors/fs-entities-extractor.d.ts +1 -1
  231. package/dist/server/plugins/catalog-entities/plugin.js +1 -1
  232. package/dist/server/plugins/catalog-entities/template/index.js +1 -1
  233. package/dist/server/plugins/catalog-entities/types/openapi.d.ts +1 -1
  234. package/dist/server/plugins/catalog-entities/utils/get-not-accessible-catalog-resources.d.ts +1 -1
  235. package/dist/server/plugins/catalog-entities/utils/openapi-component-content-extractor.d.ts +4 -4
  236. package/dist/server/plugins/catalog-entities/utils/openapi-component-content-extractor.js +1 -1
  237. package/dist/server/plugins/catalog-entities/utils/openapi-schema-resolver.d.ts +4 -3
  238. package/dist/server/plugins/catalog-entities/utils/openapi-schema-resolver.js +1 -1
  239. package/dist/server/plugins/config-parser/index.js +1 -1
  240. package/dist/server/plugins/config-parser/loaders/utils/read-and-validate-config.js +1 -1
  241. package/dist/server/plugins/create-slugify.d.ts +17 -0
  242. package/dist/server/plugins/create-slugify.js +1 -0
  243. package/dist/server/plugins/default-theme/index.js +1 -1
  244. package/dist/server/plugins/dev-onboarding/index.d.ts +1 -1
  245. package/dist/server/plugins/dev-onboarding/index.js +1 -1
  246. package/dist/server/plugins/dev-onboarding/template/App.js +1 -1
  247. package/dist/server/plugins/dev-onboarding/template/AppsList.js +1 -1
  248. package/dist/server/plugins/dev-onboarding/template/components/ApiKeyItem.js +1 -1
  249. package/dist/server/plugins/dev-onboarding/template/components/ApiLogDetails.js +1 -1
  250. package/dist/server/plugins/dev-onboarding/template/components/ApiLogs.js +1 -1
  251. package/dist/server/plugins/dev-onboarding/template/components/CreateApiKey.js +1 -1
  252. package/dist/server/plugins/dev-onboarding/template/components/DeleteAppDialog.js +1 -1
  253. package/dist/server/plugins/dev-onboarding/template/components/EditApis.js +1 -1
  254. package/dist/server/plugins/dev-onboarding/template/components/EditAppDescriptionDialog.js +1 -1
  255. package/dist/server/plugins/dev-onboarding/template/components/EditAppDialog.js +1 -1
  256. package/dist/server/plugins/dev-onboarding/template/components/EditCallbackUrlDialog.js +1 -1
  257. package/dist/server/plugins/dev-onboarding/template/components/RevokeAPIKey.d.ts +1 -1
  258. package/dist/server/plugins/dev-onboarding/template/components/RevokeAPIKey.js +1 -1
  259. package/dist/server/plugins/dev-onboarding/template/components/RollAPIKey.d.ts +1 -1
  260. package/dist/server/plugins/dev-onboarding/template/components/RollAPIKey.js +1 -1
  261. package/dist/server/plugins/dev-onboarding/template/components/UpdateApiKey.js +1 -1
  262. package/dist/server/plugins/dev-onboarding/template/index.js +1 -1
  263. package/dist/server/plugins/entitlements/index.js +1 -1
  264. package/dist/server/plugins/graphql-docs/index.js +1 -1
  265. package/dist/server/plugins/graphql-docs/search/ai/utils.d.ts +1 -1
  266. package/dist/server/plugins/helpers/parse-partials.d.ts +3 -0
  267. package/dist/server/plugins/helpers/parse-partials.js +1 -0
  268. package/dist/server/plugins/l10n/index.js +1 -1
  269. package/dist/server/plugins/lifecycle.js +2 -2
  270. package/dist/server/plugins/markdown/attribute-resolvers/helpers/load-openapi-bundle.d.ts +5 -3
  271. package/dist/server/plugins/markdown/attribute-resolvers/helpers/load-openapi-bundle.js +1 -1
  272. package/dist/server/plugins/markdown/attribute-resolvers/resolve-json-example-ref.js +1 -1
  273. package/dist/server/plugins/markdown/attribute-resolvers/resolve-open-api-ref.js +1 -1
  274. package/dist/server/plugins/markdown/attribute-resolvers/resolve-openapi-code-samples.js +1 -1
  275. package/dist/server/plugins/markdown/attribute-resolvers/resolve-openapi-response-samples.js +1 -1
  276. package/dist/server/plugins/markdown/index.js +1 -1
  277. package/dist/server/plugins/markdown/markdoc/markdoc-options.d.ts +9 -9
  278. package/dist/server/plugins/markdown/markdoc/plugins/utils.d.ts +5 -0
  279. package/dist/server/plugins/markdown/markdoc/plugins/utils.js +1 -1
  280. package/dist/server/plugins/markdown/runtime-transform.js +1 -1
  281. package/dist/server/plugins/markdown/search/create-render-tag-fn.d.ts +2 -1
  282. package/dist/server/plugins/markdown/search/create-render-tag-fn.js +1 -1
  283. package/dist/server/plugins/markdown/search/get-ai-search-documents.js +9 -9
  284. package/dist/server/plugins/markdown/search/walk-sections.js +1 -1
  285. package/dist/server/plugins/markdown/utils/resolve-markdown-template.d.ts +1 -1
  286. package/dist/server/plugins/mcp/auth/auth-handlers.d.ts +3 -0
  287. package/dist/server/plugins/mcp/auth/auth-handlers.js +1 -1
  288. package/dist/server/plugins/mcp/codemode/capabilities/types.d.ts +1 -1
  289. package/dist/server/plugins/mcp/codemode/capabilities/utils.d.ts +1 -1
  290. package/dist/server/plugins/mcp/codemode/code-audit.d.ts +12 -0
  291. package/dist/server/plugins/mcp/codemode/code-audit.js +1 -0
  292. package/dist/server/plugins/mcp/codemode/code-execution-telemetry.d.ts +11 -0
  293. package/dist/server/plugins/mcp/codemode/code-execution-telemetry.js +1 -0
  294. package/dist/server/plugins/mcp/codemode/constants.js +1 -1
  295. package/dist/server/plugins/mcp/codemode/prompts.js +1 -1
  296. package/dist/server/plugins/mcp/codemode/tools/describe-tools.d.ts +2 -3
  297. package/dist/server/plugins/mcp/codemode/tools/execute-schema.d.ts +1 -1
  298. package/dist/server/plugins/mcp/codemode/tools/execute-schema.js +1 -1
  299. package/dist/server/plugins/mcp/codemode/tools/execute.d.ts +1 -0
  300. package/dist/server/plugins/mcp/codemode/tools/execute.js +1 -1
  301. package/dist/server/plugins/mcp/codemode/tools/manage-credentials.d.ts +19 -0
  302. package/dist/server/plugins/mcp/codemode/tools/manage-credentials.js +2 -0
  303. package/dist/server/plugins/mcp/constants.d.ts +3 -1
  304. package/dist/server/plugins/mcp/constants.js +1 -1
  305. package/dist/server/plugins/mcp/docs-mcp/tool-schemas.d.ts +1 -0
  306. package/dist/server/plugins/mcp/docs-mcp/tool-schemas.js +1 -1
  307. package/dist/server/plugins/mcp/docs-mcp/tools/core/create-anonymous-session.d.ts +11 -0
  308. package/dist/server/plugins/mcp/docs-mcp/tools/core/create-anonymous-session.js +1 -0
  309. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/constants.d.ts +4 -0
  310. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/constants.js +1 -0
  311. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/get-graphql-type-list.js +1 -1
  312. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/get-graphql-type.js +7 -4
  313. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/types.d.ts +7 -1
  314. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/types.js +0 -1
  315. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/utils.d.ts +5 -1
  316. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/utils.js +4 -2
  317. package/dist/server/plugins/mcp/docs-mcp/tools/index.d.ts +4 -0
  318. package/dist/server/plugins/mcp/docs-mcp/tools/index.js +1 -1
  319. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/constants.d.ts +2 -0
  320. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/constants.js +1 -0
  321. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/get-endpoint-info.js +1 -1
  322. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/get-endpoints.js +1 -1
  323. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/get-full-api-description.js +1 -1
  324. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/get-security-schemes.js +1 -1
  325. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/list-apis.js +1 -1
  326. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/load-api-description.d.ts +6 -2
  327. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/load-api-description.js +1 -1
  328. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/types.d.ts +2 -0
  329. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/utils.d.ts +2 -2
  330. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/utils.js +1 -1
  331. package/dist/server/plugins/mcp/docs-mcp/utils.d.ts +3 -3
  332. package/dist/server/plugins/mcp/docs-mcp/utils.js +1 -1
  333. package/dist/server/plugins/mcp/gateway-mcp/elicitation.d.ts +48 -0
  334. package/dist/server/plugins/mcp/gateway-mcp/elicitation.js +3 -0
  335. package/dist/server/plugins/mcp/gateway-mcp/eligibility.d.ts +5 -17
  336. package/dist/server/plugins/mcp/gateway-mcp/eligibility.js +1 -1
  337. package/dist/server/plugins/mcp/gateway-mcp/fetch/allowed-hosts.d.ts +9 -9
  338. package/dist/server/plugins/mcp/gateway-mcp/fetch/allowed-hosts.js +1 -1
  339. package/dist/server/plugins/mcp/gateway-mcp/fetch/fetch-bridge.d.ts +17 -1
  340. package/dist/server/plugins/mcp/gateway-mcp/fetch/fetch-bridge.js +1 -1
  341. package/dist/server/plugins/mcp/gateway-mcp/fetch/fetch-errors.d.ts +11 -0
  342. package/dist/server/plugins/mcp/gateway-mcp/fetch/fetch-errors.js +1 -0
  343. package/dist/server/plugins/mcp/gateway-mcp/fetch/fetch-telemetry.d.ts +14 -0
  344. package/dist/server/plugins/mcp/gateway-mcp/fetch/fetch-telemetry.js +1 -0
  345. package/dist/server/plugins/mcp/gateway-mcp/fetch/normalize-path.d.ts +6 -0
  346. package/dist/server/plugins/mcp/gateway-mcp/fetch/normalize-path.js +1 -0
  347. package/dist/server/plugins/mcp/gateway-mcp/fetch/redact.d.ts +4 -0
  348. package/dist/server/plugins/mcp/gateway-mcp/fetch/redact.js +1 -0
  349. package/dist/server/plugins/mcp/gateway-mcp/fetch/ssrf-blocklist.d.ts +22 -0
  350. package/dist/server/plugins/mcp/gateway-mcp/fetch/ssrf-blocklist.js +1 -0
  351. package/dist/server/plugins/mcp/gateway-mcp/fetch/ssrf-guard.d.ts +1 -1
  352. package/dist/server/plugins/mcp/gateway-mcp/fetch/ssrf-guard.js +1 -1
  353. package/dist/server/plugins/mcp/gateway-mcp/fetch/ssrf-safe-lookup.d.ts +13 -0
  354. package/dist/server/plugins/mcp/gateway-mcp/fetch/ssrf-safe-lookup.js +1 -0
  355. package/dist/server/plugins/mcp/gateway-mcp/fetch-capability.d.ts +8 -1
  356. package/dist/server/plugins/mcp/gateway-mcp/fetch-capability.js +1 -1
  357. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/apply-edge-rate-limit.d.ts +3 -0
  358. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/apply-edge-rate-limit.js +1 -0
  359. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/edge-limiter.d.ts +16 -0
  360. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/edge-limiter.js +1 -0
  361. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/ip-key.d.ts +2 -0
  362. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/ip-key.js +1 -0
  363. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/limits.d.ts +7 -0
  364. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/limits.js +1 -0
  365. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/rate-limit-telemetry.d.ts +8 -0
  366. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/rate-limit-telemetry.js +1 -0
  367. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/window-counter.d.ts +15 -0
  368. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/window-counter.js +1 -0
  369. package/dist/server/plugins/mcp/gateway-mcp/secret-store.d.ts +27 -0
  370. package/dist/server/plugins/mcp/gateway-mcp/secret-store.js +1 -0
  371. package/dist/server/plugins/mcp/gateway-mcp/subject.d.ts +20 -0
  372. package/dist/server/plugins/mcp/gateway-mcp/subject.js +1 -0
  373. package/dist/server/plugins/mcp/gateway-mcp/upstream-auth-scheme.d.ts +18 -0
  374. package/dist/server/plugins/mcp/gateway-mcp/upstream-auth-scheme.js +1 -0
  375. package/dist/server/plugins/mcp/gateway-mcp/upstream-auth.d.ts +11 -0
  376. package/dist/server/plugins/mcp/gateway-mcp/upstream-auth.js +1 -0
  377. package/dist/server/plugins/mcp/handlers/docs-mcp-handler.js +1 -1
  378. package/dist/server/plugins/mcp/handlers/errors.d.ts +3 -3
  379. package/dist/server/plugins/mcp/handlers/errors.js +1 -1
  380. package/dist/server/plugins/mcp/handlers/handle-mcp-request.js +1 -1
  381. package/dist/server/plugins/mcp/handlers/mcp-credentials-handler.d.ts +5 -0
  382. package/dist/server/plugins/mcp/handlers/mcp-credentials-handler.js +120 -0
  383. package/dist/server/plugins/mcp/index.d.ts +1 -0
  384. package/dist/server/plugins/mcp/index.js +1 -1
  385. package/dist/server/plugins/mcp/servers/docs-server.d.ts +3 -1
  386. package/dist/server/plugins/mcp/servers/docs-server.js +1 -1
  387. package/dist/server/plugins/mcp/servers/mcp-server.d.ts +15 -8
  388. package/dist/server/plugins/mcp/servers/mcp-server.js +3 -1
  389. package/dist/server/plugins/mcp/types.d.ts +16 -20
  390. package/dist/server/plugins/mcp/utils/json-schema-validator.d.ts +9 -0
  391. package/dist/server/plugins/mcp/utils/json-schema-validator.js +1 -0
  392. package/dist/server/plugins/mcp/utils/jwt.d.ts +0 -9
  393. package/dist/server/plugins/mcp/utils/jwt.js +1 -1
  394. package/dist/server/plugins/mcp/utils/mode.d.ts +12 -2
  395. package/dist/server/plugins/mcp/utils/mode.js +1 -1
  396. package/dist/server/plugins/mcp/utils/telemetry-attributes.d.ts +8 -0
  397. package/dist/server/plugins/mcp/utils/telemetry-attributes.js +1 -0
  398. package/dist/server/plugins/mcp/utils/xmcp-utils.d.ts +1 -1
  399. package/dist/server/plugins/mcp/utils.d.ts +17 -5
  400. package/dist/server/plugins/mcp/utils.js +1 -1
  401. package/dist/server/plugins/mcp/workers/execute-mcp-tool.js +1 -1
  402. package/dist/server/plugins/mcp/workers/mcp-tool-telemetry.d.ts +10 -2
  403. package/dist/server/plugins/mcp/workers/mcp-tool-telemetry.js +1 -1
  404. package/dist/server/plugins/openapi-docs/index.js +1 -1
  405. package/dist/server/plugins/openapi-docs/search/get-ai-search-documents.js +16 -16
  406. package/dist/server/plugins/openapi-docs/utils.js +1 -1
  407. package/dist/server/plugins/pages/index.js +1 -1
  408. package/dist/server/plugins/scorecard-classic/compute-scorecard.d.ts +1 -1
  409. package/dist/server/plugins/scorecard-classic/compute-scorecard.js +4 -4
  410. package/dist/server/plugins/scorecard-classic/index.d.ts +1 -1
  411. package/dist/server/plugins/scorecard-classic/index.js +1 -1
  412. package/dist/server/plugins/scorecard-classic/template/ApiDetailsPage.js +1 -1
  413. package/dist/server/plugins/scorecard-classic/template/RuleDetailsPage.js +1 -1
  414. package/dist/server/plugins/scorecard-classic/template/components.d.ts +1 -1
  415. package/dist/server/plugins/scorecard-classic/template/index.js +1 -1
  416. package/dist/server/plugins/scorecard-classic/template/useData.d.ts +1 -1
  417. package/dist/server/plugins/scorecard-classic/template/utils.d.ts +1 -1
  418. package/dist/server/plugins/scorecard-classic/template/views.js +1 -1
  419. package/dist/server/plugins/scorecards/plugin.js +1 -1
  420. package/dist/server/plugins/search/ai-indexer/prepare-semantic-documents.d.ts +1 -1
  421. package/dist/server/plugins/search/ai-indexer/prepare-semantic-documents.js +2 -2
  422. package/dist/server/plugins/search/documents/search-documents.js +1 -1
  423. package/dist/server/plugins/search/engines/flexsearch/index.js +1 -1
  424. package/dist/server/plugins/search/engines/flexsearch/search-index.js +1 -1
  425. package/dist/server/plugins/search/engines/search-engine.d.ts +1 -1
  426. package/dist/server/plugins/search/engines/typesense/index.js +1 -1
  427. package/dist/server/plugins/search/index.js +1 -1
  428. package/dist/server/plugins/search/llmstxt/index.d.ts +1 -1
  429. package/dist/server/plugins/search/llmstxt/index.js +4 -4
  430. package/dist/server/plugins/sidebars/index.d.ts +1 -1
  431. package/dist/server/plugins/sidebars/index.js +1 -1
  432. package/dist/server/plugins/sitemap/index.js +1 -1
  433. package/dist/server/plugins/sso/index.js +1 -1
  434. package/dist/server/providers/database/database-path-generator.d.ts +2 -2
  435. package/dist/server/providers/database/utils/storage-limit-validator.d.ts +1 -1
  436. package/dist/server/sandbox/sandbox.js +2 -2
  437. package/dist/server/sandbox/types.d.ts +3 -2
  438. package/dist/server/sandbox/utils/execution-budget.d.ts +4 -3
  439. package/dist/server/sandbox/utils/execution-budget.js +1 -1
  440. package/dist/server/ssr/render.js +1 -1
  441. package/dist/server/ssr/server-side-props/get-default-static-props.d.ts +1 -1
  442. package/dist/server/ssr/server-side-props/get-server-props-from-user-handler.d.ts +1 -1
  443. package/dist/server/ssr/template.d.ts +1 -1
  444. package/dist/server/ssr/utils.d.ts +1 -0
  445. package/dist/server/ssr/utils.js +5 -5
  446. package/dist/server/store.d.ts +2 -6
  447. package/dist/server/store.js +1 -1
  448. package/dist/server/tools/notifiers/logger.js +1 -1
  449. package/dist/server/tools/notifiers/reporter.js +6 -6
  450. package/dist/server/types/plugin-hooks.d.ts +1 -1
  451. package/dist/server/types/plugins/common.d.ts +4 -6
  452. package/dist/server/types/plugins/markdown.d.ts +1 -3
  453. package/dist/server/types/plugins/search.d.ts +1 -0
  454. package/dist/server/utils/catalog-classic/get-route-slug-to-catalog-slug-map.test.js +1 -1
  455. package/dist/server/utils/crypto/constants.d.ts +5 -0
  456. package/dist/server/utils/crypto/constants.js +1 -0
  457. package/dist/server/utils/crypto/decrypt-aes-gcm.d.ts +6 -0
  458. package/dist/server/utils/crypto/decrypt-aes-gcm.js +1 -0
  459. package/dist/server/utils/crypto/decrypt-claim-value.d.ts +6 -0
  460. package/dist/server/utils/crypto/decrypt-claim-value.js +1 -0
  461. package/dist/server/utils/crypto/derive-key.d.ts +5 -0
  462. package/dist/server/utils/crypto/derive-key.js +1 -0
  463. package/dist/server/utils/crypto/encrypt-aes-gcm.d.ts +6 -0
  464. package/dist/server/utils/crypto/encrypt-aes-gcm.js +1 -0
  465. package/dist/server/utils/crypto/encrypt-claim-value.d.ts +6 -0
  466. package/dist/server/utils/crypto/encrypt-claim-value.js +1 -0
  467. package/dist/server/utils/l10n/get-build-translate-context.d.ts +7 -0
  468. package/dist/server/utils/l10n/get-build-translate-context.js +1 -0
  469. package/dist/server/utils/llmstxt/agent-feedback-llms-footer.js +1 -1
  470. package/dist/server/utils/rbac.d.ts +4 -0
  471. package/dist/server/utils/rbac.js +1 -1
  472. package/dist/server/utils/report-all-errors.js +1 -1
  473. package/dist/server/utils/sandbox-context.d.ts +18 -0
  474. package/dist/server/utils/sandbox-context.js +1 -0
  475. package/dist/server/utils/shared-data.js +1 -1
  476. package/dist/server/web-server/auth.d.ts +34 -4
  477. package/dist/server/web-server/auth.js +3 -3
  478. package/dist/server/web-server/handle-api-route-request.js +1 -1
  479. package/dist/server/web-server/middleware/catalogAuthMiddleware.d.ts +1 -1
  480. package/dist/server/web-server/middleware/telemetry-middleware.js +1 -1
  481. package/dist/server/web-server/routes/api-routes/api-routes.js +1 -1
  482. package/dist/server/web-server/routes/auth.js +1 -1
  483. package/dist/server/web-server/routes/catalog/bff-catalog-related-entities.js +1 -1
  484. package/dist/server/web-server/routes/catalog/bff-catalog-revisions.js +1 -1
  485. package/dist/server/web-server/routes/catalog/bff-catalog.js +1 -1
  486. package/dist/server/web-server/routes/catalog/catalog-relations.js +1 -1
  487. package/dist/server/web-server/routes/catalog/catalog.js +1 -1
  488. package/dist/server/web-server/routes/catalog/helpers/has-access-to-entity.d.ts +1 -1
  489. package/dist/server/web-server/routes/catalog/helpers/upsert-pages-stats.d.ts +1 -1
  490. package/dist/server/web-server/routes/dynamic-route.js +1 -1
  491. package/dist/server/web-server/routes/feedback.d.ts +1 -1
  492. package/dist/server/web-server/routes/helpers/process-redirects.d.ts +1 -1
  493. package/dist/server/web-server/routes/mcp-routes/a2a.js +1 -1
  494. package/dist/server/web-server/routes/mcp-routes/agent-card.js +1 -1
  495. package/dist/server/web-server/routes/mcp-routes/mcp-oauth.d.ts +10 -6
  496. package/dist/server/web-server/routes/mcp-routes/mcp-oauth.js +1 -1
  497. package/dist/server/web-server/routes/mcp-routes/mcp-routes.js +1 -1
  498. package/dist/server/web-server/routes/mcp-routes/mcp-server-card.js +1 -1
  499. package/dist/server/web-server/routes/mcp-routes/utils/build-agent-card.d.ts +1 -1
  500. package/dist/server/web-server/routes/page-data.js +1 -1
  501. package/dist/server/web-server/routes/resolve-route.js +1 -1
  502. package/dist/server/web-server/routes/search.js +1 -1
  503. package/dist/server/web-server/routes/skills/skill-markdown.js +1 -1
  504. package/dist/server/web-server/routes/skills/skills-index.js +1 -1
  505. package/dist/server/web-server/utils/prepare-list-response.d.ts +1 -1
  506. package/dist/server/workers/api-routes-worker-pool.js +1 -1
  507. package/dist/server/workers/mcp-tool-worker-pool.js +1 -1
  508. package/dist/server/workers/worker-pool.d.ts +1 -0
  509. package/dist/server/workers/worker-pool.js +1 -1
  510. package/dist/types/entitlements.d.ts +6 -1
  511. package/dist/types/markdoc.d.ts +2 -1
  512. package/dist/utils/l10n/build-i18n-config.d.ts +24 -0
  513. package/dist/utils/l10n/build-i18n-config.js +1 -0
  514. package/dist/utils/l10n/create-translate.d.ts +19 -0
  515. package/dist/utils/l10n/create-translate.js +1 -0
  516. package/dist/utils/url/get-shared-data-fetch-url.d.ts +17 -0
  517. package/dist/utils/url/get-shared-data-fetch-url.js +1 -0
  518. package/dist/utils/url/parse-preview-url.d.ts +22 -0
  519. package/dist/utils/url/parse-preview-url.js +1 -0
  520. package/package.json +21 -20
  521. package/dist/markdoc/helpers/get-operation/get-operation-info-by-id.d.ts +0 -4
  522. package/dist/markdoc/helpers/get-operation/get-operation-info-by-id.js +0 -1
  523. package/dist/markdoc/helpers/get-operation/get-operation-info-by-pointer.d.ts +0 -4
  524. package/dist/markdoc/helpers/get-operation/get-operation-info-by-pointer.js +0 -1
  525. package/dist/markdoc/helpers/get-operation/get-operation.d.ts +0 -14
  526. package/dist/markdoc/helpers/get-operation/get-operation.js +0 -1
  527. package/dist/markdoc/helpers/get-operation/index.d.ts +0 -4
  528. package/dist/markdoc/helpers/get-operation/index.js +0 -1
  529. package/dist/markdoc/helpers/get-operation/types/index.d.ts +0 -4
  530. package/dist/markdoc/helpers/get-operation/types/index.js +0 -0
  531. package/dist/markdoc/helpers/get-operation/types/operation-identifier.d.ts +0 -5
  532. package/dist/markdoc/helpers/get-operation/types/operation-identifier.js +0 -0
  533. package/dist/markdoc/helpers/get-operation/types/operation-info.d.ts +0 -6
  534. package/dist/markdoc/helpers/get-operation/types/operation-info.js +0 -0
  535. package/dist/markdoc/helpers/get-operation/types/operation-parameters.d.ts +0 -3
  536. package/dist/markdoc/helpers/get-operation/types/operation-parameters.js +0 -0
  537. package/dist/server/plugins/markdown/attribute-resolvers/helpers/get-media-content-samples.d.ts +0 -4
  538. package/dist/server/plugins/markdown/attribute-resolvers/helpers/get-media-content-samples.js +0 -1
  539. package/dist/server/plugins/mcp/handlers/sse-keepalive.d.ts +0 -15
  540. package/dist/server/plugins/mcp/handlers/sse-keepalive.js +0 -3
@@ -1,5 +1,5 @@
1
- import{REDOCLY_TEAMS_RBAC as w}from"@redocly/config";import{basename as _,join as q}from"node:path";import C from"@markdoc/markdoc";import{joinSectionContent as J}from"../../../plugins/markdown/search/join-section-content.js";import{toMarkdown as G}from"../../../plugins/markdown/search/to-markdown.js";import{AstToSearchNodeTransformer as z}from"../../../plugins/markdown/search/walk-sections.js";import{createRenderTagFn as B}from"../../../plugins/markdown/search/create-render-tag-fn.js";import{canDownloadApiDefinition as v,isResourcePubliclyAccessible as V}from"../../../utils/rbac.js";import{PUBLIC_API_DEFINITIONS_FOLDER as Y}from"../../../constants/common.js";import{DEFAULT_ANONYMOUS_VISITOR_TEAM as H}from"../../../../constants/common.js";import{getLlmsTxtMdPathBySlug as I}from"../../../utils/llmstxt/get-llms-txt-md-path-by-slug.js";import{AiSearchIndexer as K}from"../ai-search-indexer.js";import{getLocaleFromRelativePath as Q}from"../../../fs/utils/get-locale-from-relative-path.js";import{extractDocumentSearchFacets as W}from"./search-facets.js";import{formatDocumentMetadata as X}from"../../search/utils.js";import{llmsTxtLink as M}from"../../search/llmstxt/index.js";import{replaceFileExtension as Z}from"../store-definition-bundles.js";const k=new Map,xe=({parser:s,options:c,info:n,tagOperations:r,relativePath:t,openapiContentItem:e,metadata:i,getSearchFacets:u,includeInLLMsTxt:a,excludeFromSearch:f})=>async(o,p,l,j)=>{if(f)return;const P=await o.getNavText?.()||_(o.fsPath),D=new K(s,c,o.baseSlug||o.slug),d=D.addItem(e);if(!d)return;const O=await l.getConfig(),b=Array.isArray(d.title)?d.title.join(" "):d.title;let g,m,y=k.get(t);if((e.type==="tag"||e.type==="section"&&e.infoDefinition)&&!y){const{all:A,publiclyAccessible:$}=ae(r.tagged,D,O),{all:S,publiclyAccessible:T}=ue(r.untagged,D,O);k.set(t,{taggedSearchDocuments:new Map(A),untaggedSearchDocuments:S,publiclyAccessibleTaggedSearchDocuments:new Map($),publiclyAccessibleUntaggedSearchDocuments:T})}y=k.get(t);const h="#";switch(e.type){case"operation":const A=D.getOperation(e);g=m=se({title:b,security:s.definition.security,document:d,version:d.version||n.version,headingLevel:h,operation:A});break;case"section":if(e.infoDefinition){y=k.get(t),m=await N({parser:s,info:n,staticData:p,relativePath:t,headingLevel:h,pageName:P,config:O}),m+=`
2
- `;for(const[S,T]of y?.publiclyAccessibleTaggedSearchDocuments?.entries()||[]){if(!T.length)continue;const U=s.definition.tags?.find(L=>L.name===S);m+=x({title:U?.["x-displayName"]||S,description:U?.description,operationSearchDocuments:T,headingLevel:`${h}#`})}const $=y?.publiclyAccessibleUntaggedSearchDocuments||[];$.length&&(m+=x({title:"Other",description:void 0,operationSearchDocuments:$,headingLevel:`${h}#`})),g=await N({parser:s,info:n,staticData:p,relativePath:t,headingLevel:h,pageName:P,config:O})}else if(e.ast){const $=new C.Ast.Node("document",{},e.ast),S=Array.from(new z({ast:$,partials:{},renderTag:B(j.markdocOptions.tags),getInnerContent:G,skipConditionals:!0}).transform());m=g=J(S)}break;case"tag":m=x({title:b,description:e.description,operationSearchDocuments:y?.publiclyAccessibleTaggedSearchDocuments.get(e.name)||[],headingLevel:h}),g=x({title:b,description:e.description,operationSearchDocuments:[],headingLevel:h});break;case"rsrc":case"prompt":case"tool":m=ce({title:b,description:e.description,name:e.name,xMcpConfig:s.definition["x-mcp"],headingLevel:h}),g=m;break}return{async getLLMsTxts(){return[{title:e.name,description:e.type==="tag"?e.description:void 0,content:m||"",slug:o.slug,fsPath:o.fsPath,includeInLLMsTxt:a}]},async getSearchDocuments(){if(e.type==="operation"||e.type==="section"&&(e.infoDefinition||e.ast)||e.type==="tag"){const A=Q(o.fsPath),$=W({...d,...i},n,u);return[{title:b,description:Array.isArray(d.text)?d.text.join(" "):d.text,content:g||"",url:d.url??o.slug,fsPath:o.fsPath,locale:A,product:o.product?.name,rbacTeams:d.rbacTeams,facets:$}]}return[]}}};async function N({parser:s,info:c,staticData:n,relativePath:r,pageName:t,headingLevel:e,config:i}){const u=X(c["x-metadata"]);let a=c.title?`${e} ${c.title}
1
+ import{REDOCLY_TEAMS_RBAC as x}from"@redocly/config";import{basename as C,join as _}from"node:path";import q from"@markdoc/markdoc";import{joinSectionContent as G}from"../../../plugins/markdown/search/join-section-content.js";import{toMarkdown as J}from"../../../plugins/markdown/search/to-markdown.js";import{AstToSearchNodeTransformer as B}from"../../../plugins/markdown/search/walk-sections.js";import{createRenderTagFn as z}from"../../../plugins/markdown/search/create-render-tag-fn.js";import{getBuildTranslateContext as v}from"../../../utils/l10n/get-build-translate-context.js";import{canDownloadApiDefinition as V,isResourcePubliclyAccessible as Y}from"../../../utils/rbac.js";import{PUBLIC_API_DEFINITIONS_FOLDER as H}from"../../../constants/common.js";import{DEFAULT_ANONYMOUS_VISITOR_TEAM as I}from"../../../../constants/common.js";import{getLlmsTxtMdPathBySlug as K}from"../../../utils/llmstxt/get-llms-txt-md-path-by-slug.js";import{AiSearchIndexer as Q}from"../ai-search-indexer.js";import{getLocaleFromRelativePath as W}from"../../../fs/utils/get-locale-from-relative-path.js";import{extractDocumentSearchFacets as X}from"./search-facets.js";import{formatDocumentMetadata as Z}from"../../search/utils.js";import{llmsTxtLink as M}from"../../search/llmstxt/index.js";import{replaceFileExtension as ee}from"../store-definition-bundles.js";const j=new Map,Ee=({parser:s,options:c,info:n,tagOperations:r,relativePath:t,openapiContentItem:e,metadata:i,getSearchFacets:u,includeInLLMsTxt:a,excludeFromSearch:f})=>async(o,p,l,O)=>{if(f)return;const U=await o.getNavText?.()||C(o.fsPath),T=new Q(s,c,o.baseSlug||o.slug),m=T.addItem(e);if(!m)return;const w=await l.getConfig(),D=Array.isArray(m.title)?m.title.join(" "):m.title;let $,d,y=j.get(t);if((e.type==="tag"||e.type==="section"&&e.infoDefinition)&&!y){const{all:A,publiclyAccessible:g}=ue(r.tagged,T,w),{all:S,publiclyAccessible:b}=le(r.untagged,T,w);j.set(t,{taggedSearchDocuments:new Map(A),untaggedSearchDocuments:S,publiclyAccessibleTaggedSearchDocuments:new Map(g),publiclyAccessibleUntaggedSearchDocuments:b})}y=j.get(t);const h="#";switch(e.type){case"operation":const A=T.getOperation(e);$=d=ce({title:D,security:s.definition.security,document:m,version:m.version||n.version,headingLevel:h,operation:A});break;case"section":if(e.infoDefinition){y=j.get(t),d=await N({parser:s,info:n,staticData:p,relativePath:t,headingLevel:h,pageName:U,config:w}),d+=`
2
+ `;for(const[S,b]of y?.publiclyAccessibleTaggedSearchDocuments?.entries()||[]){if(!b.length)continue;const k=s.definition.tags?.find(L=>L.name===S);d+=E({title:k?.["x-displayName"]||S,description:k?.description,operationSearchDocuments:b,headingLevel:`${h}#`})}const g=y?.publiclyAccessibleUntaggedSearchDocuments||[];g.length&&(d+=E({title:"Other",description:void 0,operationSearchDocuments:g,headingLevel:`${h}#`})),$=await N({parser:s,info:n,staticData:p,relativePath:t,headingLevel:h,pageName:U,config:w})}else if(e.ast){const g=new q.Ast.Node("document",{},e.ast),{locale:S,translate:b}=await v(o.slug,O.getGlobalData?.().l10n),k=Array.from(new B({ast:g,partials:{},renderTag:z(O.markdocOptions.tags,S,b),getInnerContent:J,skipConditionals:!0}).transform());d=$=G(k)}break;case"tag":d=E({title:D,description:e.description,operationSearchDocuments:y?.publiclyAccessibleTaggedSearchDocuments.get(e.name)||[],headingLevel:h}),$=E({title:D,description:e.description,operationSearchDocuments:[],headingLevel:h});break;case"rsrc":case"prompt":case"tool":d=re({title:D,description:e.description,name:e.name,xMcpConfig:s.definition["x-mcp"],headingLevel:h}),$=d;break}return{async getLLMsTxts(){return[{title:e.name,description:e.type==="tag"?e.description:void 0,content:d||"",slug:o.slug,fsPath:o.fsPath,includeInLLMsTxt:a}]},async getSearchDocuments(){if(e.type==="operation"||e.type==="section"&&(e.infoDefinition||e.ast)||e.type==="tag"){const A=W(o.fsPath),g=X({...m,...i},n,u);return[{title:D,description:Array.isArray(m.text)?m.text.join(" "):m.text,content:$||"",url:m.url??o.slug,fsPath:o.fsPath,locale:A,product:o.product?.name,rbacTeams:m.rbacTeams,facets:g}]}return[]}}};async function N({parser:s,info:c,staticData:n,relativePath:r,pageName:t,headingLevel:e,config:i}){const u=Z(c["x-metadata"]);let a=c.title?`${e} ${c.title}
3
3
 
4
4
  `:`${e} ${t}
5
5
 
@@ -12,14 +12,14 @@ import{REDOCLY_TEAMS_RBAC as w}from"@redocly/config";import{basename as _,join a
12
12
  `:"",e=`${e}#`,a+=u.length?`Metadata:
13
13
  ${u}
14
14
  `:"",a+=`
15
- `,a+=ee({parser:s,headingLevel:e}),a+=te({parser:s,headingLevel:e}),a+=await ne({info:c,staticData:n,relativePath:r,pageName:t,headingLevel:e,config:i}),a}function x({title:s="",description:c,operationSearchDocuments:n,headingLevel:r}){let t=`${r} ${s}
15
+ `,a+=ne({parser:s,headingLevel:e}),a+=se({parser:s,headingLevel:e}),a+=await te({info:c,staticData:n,relativePath:r,pageName:t,headingLevel:e,config:i}),a}function E({title:s="",description:c,operationSearchDocuments:n,headingLevel:r}){let t=`${r} ${s}
16
16
 
17
17
  `;return c&&(t+=`${c}
18
18
 
19
19
  `),n.length&&n.forEach(e=>{const i=Array.isArray(e.title)?e.title.join(" "):e.title;t+=`${r}# ${i}${e.deprecated?" (deprecated)":""}
20
20
 
21
- `,t+=` - ${M({title:`${e.httpMethod?.toUpperCase()} ${e.httpPath}`,description:Array.isArray(e.text)?e.text.join(" "):e.text,slug:I(e.url)})}`,t+=`
22
- `}),t}function ee({parser:s,headingLevel:c}){const{servers:n}=s.definition;if(n&&n.length){let r=`${c} Servers
21
+ `,t+=` - ${M({title:`${e.httpMethod?.toUpperCase()} ${e.httpPath}`,description:Array.isArray(e.text)?e.text.join(" "):e.text,slug:K(e.url)})}`,t+=`
22
+ `}),t}function ne({parser:s,headingLevel:c}){const{servers:n}=s.definition;if(n&&n.length){let r=`${c} Servers
23
23
 
24
24
  `;return n.forEach(t=>{r+=t.description?`${t.description}
25
25
  `:"",r+=`\`\`\`
@@ -31,9 +31,9 @@ ${t.url}
31
31
  `,r+=i.default?`Default: ${JSON.stringify(i.default)}
32
32
  `:"",r+=i.enum?`Enum: ${i.enum.map(u=>JSON.stringify(u)).join(", ")}
33
33
  `:""}),r+=`
34
- `)}),r}return""}async function ne({info:s,staticData:c,relativePath:n,pageName:r,headingLevel:t,config:e}){const i=q(c.props?.outdir||"",Y,Z(n,".yaml")),u=e.access?.rbac,a=e.access?.requiresLogin;if(v(i,u??{},a??!1,{isAuthenticated:!1,teams:[H]})){let f=`${t} Download OpenAPI description
34
+ `)}),r}return""}async function te({info:s,staticData:c,relativePath:n,pageName:r,headingLevel:t,config:e}){const i=_(c.props?.outdir||"",H,ee(n,".yaml")),u=e.access?.rbac,a=e.access?.requiresLogin;if(V(i,u??{},a??!1,{isAuthenticated:!1,teams:[I]})){let f=`${t} Download OpenAPI description
35
35
 
36
- `;return f+=M({title:s.title||r||"OpenAPI definition",description:void 0,slug:i}),f}return""}function te({parser:s,headingLevel:c}){if(!s.definition.components?.securitySchemes)return"";let n=`${c} Security
36
+ `;return f+=M({title:s.title||r||"OpenAPI definition",description:void 0,slug:i}),f}return""}function se({parser:s,headingLevel:c}){if(!s.definition.components?.securitySchemes)return"";let n=`${c} Security
37
37
 
38
38
  `;const{securitySchemes:r}=s.definition.components;return Object.keys(r).forEach(t=>{const e=r[t];e&&(n+=`${c}# ${t}
39
39
 
@@ -52,19 +52,19 @@ ${t.url}
52
52
  `),e.flows?.password?.scopes&&(n+=`Scopes:
53
53
  `,Object.entries(e.flows?.password?.scopes||{}).forEach(([i,u])=>{n+=`- \`${i}\`: ${u}
54
54
  `})),n+=`
55
- `)}),n}function se({title:s,security:c,document:n,version:r,headingLevel:t,operation:e}){const{text:i,httpMethod:u,httpPath:a,deprecated:f}=n,o=oe(n.parameters||[],`${t}#`),p=re(`${t}#`,n.parameters,e);let l=s?`${t} ${s}${f?" (deprecated)":""}
55
+ `)}),n}function ce({title:s,security:c,document:n,version:r,headingLevel:t,operation:e}){const{text:i,httpMethod:u,httpPath:a,deprecated:f}=n,o=ae(n.parameters||[],`${t}#`),p=ie(`${t}#`,n.parameters,e);let l=s?`${t} ${s}${f?" (deprecated)":""}
56
56
 
57
57
  `:"";return l+=i?`${i}
58
58
 
59
59
  `:"",l+=`Endpoint: ${u?.toUpperCase()} ${a}
60
60
  `,l+=r?`Version: ${r}
61
61
  `:"",l+=n.security?.length?`Security: ${n.security.join(", ")}
62
- `:c?.length?`Security: ${c.map(j=>j.id).join(", ")}
62
+ `:c?.length?`Security: ${c.map(O=>O.id).join(", ")}
63
63
  `:"",l+=`
64
64
  `,l+=o?`${o}
65
65
  `:"",l+=`
66
66
  `,l+=`${p.join(`
67
- `)}`,l}function ce({title:s,name:c,xMcpConfig:n,headingLevel:r}){const t=n?.tools.find(i=>i.name===c);if(!t)return"";let e=`${r} ${s}
67
+ `)}`,l}function re({title:s,name:c,xMcpConfig:n,headingLevel:r}){const t=n?.tools.find(i=>i.name===c);if(!t)return"";let e=`${r} ${s}
68
68
 
69
69
  `;return e+=t.description?`${t.description}
70
70
 
@@ -80,15 +80,15 @@ ${JSON.stringify(t.inputSchema,null,2)}
80
80
  ${JSON.stringify(t.outputSchema,null,2)}
81
81
  \`\`\`
82
82
 
83
- `),e}function re(s,c,n){return!c&&!n||!n?.responses?[]:n?.responses.filter(t=>!t.content?.mediaTypes[0]?.schema).map(t=>`${s} ${R(`response ${t.code} fields`)}
84
- `)}function ie(s,c,n,r){const t=JSON.stringify(s),e=r.get(t);return e?`${n}Enum: same as ${e} (${s.length} values)
83
+ `),e}function ie(s,c,n){return!c&&!n||!n?.responses?[]:n?.responses.filter(t=>!t.content?.mediaTypes[0]?.schema).map(t=>`${s} ${R(`response ${t.code} fields`)}
84
+ `)}function oe(s,c,n,r){const t=JSON.stringify(s),e=r.get(t);return e?`${n}Enum: same as ${e} (${s.length} values)
85
85
  `:(r.set(t,c),`${n}Enum: ${s.map(i=>JSON.stringify(i)).join(", ")}
86
- `)}function E(s,c,n,r){const t=`${c} `,e=s.oneOf,u=[...s.path||[],s.name].join("."),a=Array.isArray(s.description)?s.description.join(" "):s.description,f=!!e&&e.variants.length>1;let o=`${c}- \`${u}\` (${s.type}${s.required?", required":""})`;if(f&&(o+=e.discriminator?` \u2014 one of (discriminator: ${e.discriminator}):`:" \u2014 one of:"),o+=`
86
+ `)}function P(s,c,n,r){const t=`${c} `,e=s.oneOf,u=[...s.path||[],s.name].join("."),a=Array.isArray(s.description)?s.description.join(" "):s.description,f=!!e&&e.variants.length>1;let o=`${c}- \`${u}\` (${s.type}${s.required?", required":""})`;if(f&&(o+=e.discriminator?` \u2014 one of (discriminator: ${e.discriminator}):`:" \u2014 one of:"),o+=`
87
87
  `,o+=a?`${t}${a.trim()}
88
- `:"",s.enum){const p=r?`\`${u}\` in "${r}"`:`\`${u}\``;o+=ie(s.enum,p,t,n)}else s.example&&(o+=`${t}Example: ${s.example}
88
+ `:"",s.enum){const p=r?`\`${u}\` in "${r}"`:`\`${u}\``;o+=oe(s.enum,p,t,n)}else s.example&&(o+=`${t}Example: ${s.example}
89
89
  `);if(f)for(const p of e.variants){o+=`${c} - ${p.title}:
90
- `;for(const l of p.parameters)o+=E(l,`${c} `,n,p.title)}else if(e)for(const p of e.variants[0].parameters)o+=E(p,`${c} `,n);return o}function oe(s,c){const n={};for(const e of s){const i=`${e.place}${e.mediaType?` (${e.mediaType})`:""}`;n[i]=[...n[i]||[],e]}const r=new Map;return Object.entries(n).map(([e,i])=>{const u=i.map(a=>E(a," ",r));return`${c} ${R(e)}:
90
+ `;for(const l of p.parameters)o+=P(l,`${c} `,n,p.title)}else if(e)for(const p of e.variants[0].parameters)o+=P(p,`${c} `,n);return o}function ae(s,c){const n={};for(const e of s){const i=`${e.place}${e.mediaType?` (${e.mediaType})`:""}`;n[i]=[...n[i]||[],e]}const r=new Map;return Object.entries(n).map(([e,i])=>{const u=i.map(a=>P(a," ",r));return`${c} ${R(e)}:
91
91
 
92
92
  ${u.join(`
93
93
  `)}`}).join(`
94
- `)}function ae(s,c,n){const r=[],t=[];return s.forEach((e,i)=>{const u=[],a=[];e.forEach(f=>{const o=c.addItem(f);o&&(u.push(o),F({[w]:f[w],slug:o.url},n)&&a.push(o))}),r.push([i,u]),t.push([i,a])}),{all:r,publiclyAccessible:t}}function ue(s,c,n){const r=[],t=[];return s.forEach(e=>{const i=c.addItem(e);i&&(r.push(i),F({[w]:e[w],slug:i.url},n)&&t.push(i))}),{all:r,publiclyAccessible:t}}function R(s){return s.charAt(0).toUpperCase()+s.slice(1)}function F(s,c){return c.access?.requiresLogin?!0:V(s,c)}export{xe as getAiDocumentsStore};
94
+ `)}function ue(s,c,n){const r=[],t=[];return s.forEach((e,i)=>{const u=[],a=[];e.forEach(f=>{const o=c.addItem(f);o&&(u.push(o),F({[x]:f[x],slug:o.url},n)&&a.push(o))}),r.push([i,u]),t.push([i,a])}),{all:r,publiclyAccessible:t}}function le(s,c,n){const r=[],t=[];return s.forEach(e=>{const i=c.addItem(e);i&&(r.push(i),F({[x]:e[x],slug:i.url},n)&&t.push(i))}),{all:r,publiclyAccessible:t}}function R(s){return s.charAt(0).toUpperCase()+s.slice(1)}function F(s,c){return c.access?.requiresLogin?!0:Y(s,c)}export{Ee as getAiDocumentsStore};
@@ -1 +1 @@
1
- import{REDOCLY_TEAMS_RBAC as i}from"@redocly/config";import{combineUrls as p}from"@redocly/theme/core/utils";import{FEEDBACK_TYPES as c}from"../../../constants/common.js";import{normalizeRouteSlug as g}from"../../../utils/path/normalize-route-slug.js";function u(t){const{contentItems:r,sidebarItems:a,routeSlug:o,navItem:s}=t;let b=!0;for(const e of r){let n;switch(e.type){case"group":a.push({type:"separator",label:e.name,[i]:e[i]}),u({...t,contentItems:e.items,sidebarItems:a});break;case"tag":n=p(o,e.href);const m={type:"group",label:e.name,items:[],link:n,routeSlug:n,[i]:e[i]};a.push(m),u({routeSlug:o,contentItems:e.items,sidebarItems:m.items||[],navItem:s});break;case"operation":case"schema":case"rsrc":case"prompt":case"tool":e.isWebhook&&b&&(a.push({type:"separator",label:"Webhooks",variant:"secondary"}),b=!1),n=p(o,e.href),a.push({type:"link",label:e.name,httpVerb:e.type==="operation"?e.httpVerb:e.type,routeSlug:g(n),badges:e.badges,link:n,deprecated:e.deprecated,isAdditionalOperation:e.isAdditionalOperation,[i]:e[i]});break;case"section":if(e.depth===-1)continue;n=p(o,e.href);const l=e.href==="/",f={type:e.items.length?"group":"link",label:l&&s?.label?s.label:e.name,labelTranslationKey:s?.labelTranslationKey,routeSlug:n.split("#")[0]===o?o:g(n),link:n,items:[],...l&&s?.icon&&{icon:typeof s.icon=="object"?s.icon.srcSet:s.icon},...l&&s?.badges&&{badges:s.badges}};a.push(f),e.items.length&&u({routeSlug:o,contentItems:e.items,sidebarItems:f.items});break}}}function S({item:t}){return t.id===""?!0:t.type!=="group"||t.description!==""}const I=t=>(typeof t=="string"?t:t?.raw)?.replace(/\[(.*?)\][\[\(].*?[\]\)]/g,"$1")||"";function O(t){if(!t)return;let r="";const{type:a,settings:o}=t;switch(a){case c.RATING:r="Rate this section";break;case c.SENTIMENT:r="Was this section helpful?";break;case c.MOOD:r="Was this section helpful?";break;case c.COMMENT:r="Share your feedback about this section";break;case c.SCALE:r="How would you rate this section?";break}return{...t,settings:{...o,label:o?.label||r}}}function A(t){return(typeof t=="string"?t:t?.raw||"").replace(/<[^>]*>/g,"").replace(/```([\s\S]*?)```/g,"$1").replace(/`([^`]+)`/g,"$1").replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").trim()}function E(t){if(t?.oneOf)return t;if(t?.items?.oneOf)return t.items}export{u as convertOpenAPIDocs2Sidebar,E as getOneOfSchema,O as normalizeFeedbackOptions,I as removeMarkdownLinks,S as shouldAddRoute,A as stripFormatting};
1
+ import{REDOCLY_TEAMS_RBAC as i}from"@redocly/config";import{combineUrls as l}from"@redocly/theme/core/utils";import{FEEDBACK_TYPES as c}from"../../../constants/common.js";import{normalizeRouteSlug as f}from"../../../utils/path/normalize-route-slug.js";function u(t){const{contentItems:r,sidebarItems:a,routeSlug:o,navItem:s}=t;let m=!0;for(const e of r){let n;switch(e.type){case"group":a.push({type:"separator",label:e.name,hideWhenEmpty:!0,[i]:e[i]}),u({...t,contentItems:e.items,sidebarItems:a});break;case"tag":n=l(o,e.href);const b={type:"group",label:e.name,items:[],link:n,routeSlug:n,[i]:e[i]};a.push(b),u({routeSlug:o,contentItems:e.items,sidebarItems:b.items||[],navItem:s});break;case"operation":case"schema":case"rsrc":case"prompt":case"tool":e.isWebhook&&m&&(a.push({type:"separator",label:"Webhooks",variant:"secondary",hideWhenEmpty:!0}),m=!1),n=l(o,e.href),a.push({type:"link",label:e.name,httpVerb:e.type==="operation"?e.httpVerb:e.type,routeSlug:f(n),badges:e.badges,link:n,deprecated:e.deprecated,isAdditionalOperation:e.isAdditionalOperation,[i]:e[i]});break;case"section":if(e.depth===-1)continue;n=l(o,e.href);const p=e.href==="/",d={type:e.items.length?"group":"link",label:p&&s?.label?s.label:e.name,labelTranslationKey:s?.labelTranslationKey,routeSlug:n.split("#")[0]===o?o:f(n),link:n,items:[],...p&&s?.icon&&{icon:typeof s.icon=="object"?s.icon.srcSet:s.icon},...p&&s?.badges&&{badges:s.badges}};a.push(d),e.items.length&&u({routeSlug:o,contentItems:e.items,sidebarItems:d.items});break}}}function S({item:t}){return t.id===""?!0:t.type!=="group"||t.description!==""}const I=t=>(typeof t=="string"?t:t?.raw)?.replace(/\[(.*?)\][\[\(].*?[\]\)]/g,"$1")||"";function E(t){if(!t)return;let r="";const{type:a,settings:o}=t;switch(a){case c.RATING:r="Rate this section";break;case c.SENTIMENT:r="Was this section helpful?";break;case c.MOOD:r="Was this section helpful?";break;case c.COMMENT:r="Share your feedback about this section";break;case c.SCALE:r="How would you rate this section?";break}return{...t,settings:{...o,label:o?.label||r}}}function O(t){return(typeof t=="string"?t:t?.raw||"").replace(/<[^>]*>/g,"").replace(/```([\s\S]*?)```/g,"$1").replace(/`([^`]+)`/g,"$1").replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").trim()}function A(t){if(t?.oneOf)return t;if(t?.items?.oneOf)return t.items}export{u as convertOpenAPIDocs2Sidebar,A as getOneOfSchema,E as normalizeFeedbackOptions,I as removeMarkdownLinks,S as shouldAddRoute,O as stripFormatting};
@@ -1 +1 @@
1
- import g from"node:path";import{REDOCLY_TEAMS_RBAC as h}from"@redocly/config";import{slash as S}from"../../../utils/path/slash.js";import{canAccessFeature as b}from"../../utils/entitlements/can-access-feature.js";import{staticDataLoader as y}from"./loaders/static-data-loader.js";import{findFrontmatterSlugs as F,getSidebarSharedDataId as P,resolveFrontmatterSlugs as w}from"../utils.js";import{reactFrontmatterLoader as v}from"./loaders/react-frontmatter-loader.js";import{registerPageProps as D}from"../register-page-props.js";import{telemetryTraceStep as R}from"../../../cli/telemetry/helpers/trace-step.js";import{searchResolver as E}from"./search/search-resolver.js";async function x(){return{loaders:{"react-frontmatter":v},id:"react-pages",requiredEntitlements:["reactPages"],processContent:async(r,a)=>{await R("build.plugin.pages",async()=>{const{fs:o,cache:f}=a;for(const d of o.scan(/\.page\.tsx?$/)){const{relativePath:e,realRelativePath:l}=d;if(await a.isPathIgnored(e))continue;const p=r.createTemplate(S(e),g.resolve(o.cwd,l));await D(d,o,r);const{data:t}=await f.load(e,"react-frontmatter"),u=await F(e,"react-frontmatter",t,a),s=w(u,e);let c=null;t?.sidebar&&(c=await P(t.sidebar,e,a.fs)),(s.length?s.reverse():[void 0]).forEach(i=>{r.addRoute({excludeFromSearch:t?.excludeFromSearch||!1,slug:i,templateId:p,fsPath:e,sharedData:c?[{id:c,key:"sidebar"}]:void 0,[h]:b("rbac")?t?.rbac:void 0,getNavText:async()=>t?.seo?.title,getStaticData:async(m,n)=>({props:await y({frontmatter:t,relativePath:e},a,n)}),getSearchDocuments:E(t,e,r.getSearchFacets,r.setSearchFacets)})});for(const[i,{to:m,type:n}]of Object.entries(t?.redirects||{}))r.addRedirect(i,{to:m||s[0],type:n||301})}})}}}export{x as customPagesPlugin};
1
+ import g from"node:path";import{REDOCLY_TEAMS_RBAC as h}from"@redocly/config";import{slash as S}from"../../../utils/path/slash.js";import{canAccessFeature as y}from"../../utils/entitlements/can-access-feature.js";import{staticDataLoader as b}from"./loaders/static-data-loader.js";import{findFrontmatterSlugs as F,getSidebarSharedDataId as P,resolveFrontmatterSlugs as w}from"../utils.js";import{reactFrontmatterLoader as v}from"./loaders/react-frontmatter-loader.js";import{registerPageProps as D}from"../register-page-props.js";import{telemetryTraceStep as R}from"../../../cli/telemetry/helpers/trace-step.js";import{searchResolver as E}from"./search/search-resolver.js";async function x(){return{loaders:{"react-frontmatter":v},id:"react-pages",requiredEntitlements:["reactPages"],processContent:async(r,a)=>{await R("com.redocly.build.plugin.pages",async()=>{const{fs:o,cache:f}=a;for(const n of o.scan(/\.page\.tsx?$/)){const{relativePath:e,realRelativePath:l}=n;if(await a.isPathIgnored(e))continue;const p=r.createTemplate(S(e),g.resolve(o.cwd,l));await D(n,o,r);const{data:t}=await f.load(e,"react-frontmatter"),u=await F(e,"react-frontmatter",t,a),s=w(u,e);let c=null;t?.sidebar&&(c=await P(t.sidebar,e,a.fs)),(s.length?s.reverse():[void 0]).forEach(i=>{r.addRoute({excludeFromSearch:t?.excludeFromSearch||!1,slug:i,templateId:p,fsPath:e,sharedData:c?[{id:c,key:"sidebar"}]:void 0,[h]:y("rbac")?t?.rbac:void 0,getNavText:async()=>t?.seo?.title,getStaticData:async(m,d)=>({props:await b({frontmatter:t,relativePath:e},a,d)}),getSearchDocuments:E(t,e,r.getSearchFacets,r.setSearchFacets)})});for(const[i,{to:m,type:d}]of Object.entries(t?.redirects||{}))r.addRedirect(i,{to:m||s[0],type:d||301})}})}}}export{x as customPagesPlugin};
@@ -1,7 +1,7 @@
1
1
  import type { LifecycleContext, ProcessContentActions } from '../../types';
2
2
  import type { DetailedScorecardData } from './types.js';
3
3
  import { type ScorecardConfig, type RedoclyConfig } from '@redocly/theme/config';
4
- export declare function computeScorecard({ actions, context, scorecardConfig, reuniteConfig }: {
4
+ export declare function computeScorecard({ actions, context, scorecardConfig, reuniteConfig, }: {
5
5
  actions: ProcessContentActions;
6
6
  context: LifecycleContext;
7
7
  scorecardConfig: ScorecardConfig;
@@ -1,4 +1,4 @@
1
- import w from"node:path";import R from"picomatch";import{removeLeadingSlash as S}from"@redocly/theme/core/utils";import{parsePathVersions as O}from"../../../utils/path/parse-path-versions.js";import{logger as l}from"../../tools/notifiers/logger.js";import{ScorecardStatus as d}from"./types.js";import{getTarget as M}from"./loaders/scorecard.js";const P=15;async function y({actions:t,context:i,scorecardConfig:e,reuniteConfig:o}){l.info("Computing scorecard...");const a=e.levels||[],n=a[0],u=await t.loadOpenApiDefinitions(i),s=e.ignore||[],h=R(s),f=new Set,g=l.startTiming(),c={},p={};for(const r of u){if(!D(r,h,f))continue;const v=r.customOutputRelativeFile||r.realRelativePath;f.add(v);const m=await N(r,i,e,a,n);c[r.realRelativePath]=m,p[m.relativePath]=m}return l.infoTime(g,"Scorecard processed"),T(c,o,e),p}function D(t,i,e){if(t.isVirtual||!t.definition)return!1;const o=t.customOutputRelativeFile||t.realRelativePath,a=S(t.realRelativePath);return i(a)?(l.info(`Skipping scorecard calculation for ignored file: ${t.realRelativePath}`),!1):!e.has(o)}function L(t,i,e){return t-1<i?d.BelowMinimum:i<e-1?d.Minimum:d.Highest}async function N(t,i,e,o,a){let n=a.name;if(e.targets?.length){const r=await i.getConfig(w.posix.dirname(t.realRelativePath)),v=t.definition.info?.["x-metadata"]||{},m={title:t.definition.info?.title,version:t.definition.info?.version,...v,...r.metadata};n=(await M(e.targets,m))?.minimumLevel||a.name}const{data:{levels:u,scorecardLevelIdx:s,scorecardLevel:h}}=await i.cache.load(t.realRelativePath,"scorecard"),f=o.findIndex(r=>r.name===n),g=L(s,f,o.length),c=t.customOutputRelativeFile||t.realRelativePath,p=O(c)?.versionName;return{levels:u,status:g,targetLevel:n,scorecardLevel:h,scorecardLevelIdx:s,relativePath:c,title:t.definition.info?.title,version:p}}function T(t,i,e){const o=Object.values(t).filter(s=>s.status===d.BelowMinimum);if(o.length===0)return;const a=o.map(s=>s.relativePath);let n=`Detected OpenAPI definitions with score below minimum level:
2
- - ${a.slice(0,P).map(()=>"%rp").join(`
3
- - `)}`;a.length>P&&(n+=`
4
- ... and ${a.length-P} more`),i?.ignoreLint??e.ignoreNonCompliant?l.warn(n,...a):l.error(n,...a)}export{y as computeScorecard};
1
+ import w from"node:path";import S from"picomatch";import{removeLeadingSlash as O}from"@redocly/theme/core/utils";import{parsePathVersions as D}from"../../../utils/path/parse-path-versions.js";import{logger as c}from"../../tools/notifiers/logger.js";import{ScorecardStatus as d}from"./types.js";import{getTarget as M}from"./loaders/scorecard.js";const R=15;async function $({actions:t,context:i,scorecardConfig:e,reuniteConfig:o}){c.info("Computing scorecard...");const a=e.levels||[],n=a[0],u=await t.loadApiDocuments(i),r=B(u),h=e.ignore||[],v=S(h),m=new Set,f=c.startTiming(),p={},l={};for(const s of r){if(!L(s,v,m))continue;const g=s.customOutputRelativeFile||s.realRelativePath;m.add(g);const P=await N(s,i,e,a,n);p[s.realRelativePath]=P,l[P.relativePath]=P}return c.infoTime(f,"Scorecard processed"),T(p,o,e),l}function L(t,i,e){if(t.isVirtual||!t.definition)return!1;const o=t.customOutputRelativeFile||t.realRelativePath,a=O(t.realRelativePath);return i(a)?(c.info(`Skipping scorecard calculation for ignored file: ${t.realRelativePath}`),!1):!e.has(o)}function F(t,i,e){return t-1<i?d.BelowMinimum:i<e-1?d.Minimum:d.Highest}async function N(t,i,e,o,a){let n=a.name;if(e.targets?.length){const l=await i.getConfig(w.posix.dirname(t.realRelativePath)),s=t.definition.info?.["x-metadata"]||{},g={title:t.definition.info?.title,version:t.definition.info?.version,...s,...l.metadata};n=(await M(e.targets,g))?.minimumLevel||a.name}const{data:{levels:u,scorecardLevelIdx:r,scorecardLevel:h}}=await i.cache.load(t.realRelativePath,"scorecard"),v=o.findIndex(l=>l.name===n),m=F(r,v,o.length),f=t.customOutputRelativeFile||t.realRelativePath,p=D(f)?.versionName;return{levels:u,status:m,targetLevel:n,scorecardLevel:h,scorecardLevelIdx:r,relativePath:f,title:t.definition.info?.title,version:p}}function T(t,i,e){const o=Object.values(t).filter(r=>r.status===d.BelowMinimum);if(o.length===0)return;const a=o.map(r=>r.relativePath);let n=`Detected OpenAPI definitions with score below minimum level:
2
+ - ${a.slice(0,R).map(()=>"%rp").join(`
3
+ - `)}`;a.length>R&&(n+=`
4
+ ... and ${a.length-R} more`),i?.ignoreLint??e.ignoreNonCompliant?c.warn(n,...a):c.error(n,...a)}function B(t){const i=[];for(const e of t){if(e.type!=="openapi")continue;const o=e.document;i.push({realRelativePath:e.realRelativePath,customOutputRelativeFile:e.customOutputRelativeFile,isVirtual:e.isVirtual,definition:{info:o.info}})}return i}export{$ as computeScorecard};
@@ -5,7 +5,7 @@ export type ScorecardInfo = {
5
5
  rules: string[];
6
6
  rulesPerLevel: Record<string, string[]>;
7
7
  };
8
- export declare function scorecardClassicPlugin({ id, requiredEntitlements, loadersPrefix }: {
8
+ export declare function scorecardClassicPlugin({ id, requiredEntitlements, loadersPrefix, }: {
9
9
  id?: string;
10
10
  requiredEntitlements: Feature[];
11
11
  loadersPrefix?: string;
@@ -1 +1 @@
1
- import{writeFileSync as D}from"node:fs";import L from"path";import{SCORECARD_OUTPUT_FILE_NAME as w}from"../../constants/common.js";import{mapObject as E}from"../../../utils/object/map-object.js";import{envConfig as A}from"../../config/env-config.js";import{removeLeadingSlash as j}from"../../../utils/url/remove-leading-slash.js";import{combineUrls as O}from"@redocly/theme/core/utils";import{logger as _}from"../../tools/notifiers/logger.js";import{getRouteSlugToCatalogSlugMap as F}from"../../utils/catalog-classic/get-route-slug-to-catalog-slug-map.js";import{deepEqual as I}from"../../../utils/object/deep-equal.js";import{ensureDir as N}from"../../utils/index.js";import{getTemplatePath as q}from"./get-template-path.js";import{getAllRuleNames as U}from"./lint.js";import{getScorecardConfig as T}from"./get-scorecard-config.js";import{getScorecardSlug as k}from"./shared-utils.js";import{scorecardConfigLoader as M}from"./loaders/scorecard-config.js";import{scorecardLoader as W}from"./loaders/scorecard.js";import{computeScorecard as B}from"./compute-scorecard.js";import{telemetryTraceStep as J}from"../../../cli/telemetry/helpers/trace-step.js";const $="scorecardClassic";let u={},R={};async function ne({id:b,requiredEntitlements:P,loadersPrefix:v=""}){let p=null,y=null,h=!1;return{id:b??"scorecardClassic",requiredEntitlements:P??["scorecard"],loaders:{[`${v}scorecard-config`]:M,[`${v}scorecard`]:W},async processContent(r,l){await J("build.plugin.scorecard_classic",async S=>{const a=r.createTemplate($,q("./template/index.js")),g=await l.getConfig(),m=T(g),f=g?.reunite??{},i=[()=>p===null,()=>!I(u,m),()=>!I(R,f)].some(e=>e());u=m,S?.setAttribute("config",JSON.stringify(u||{})),R=f;const n=g.catalogClassic??{},c=u.levels||[];if(c.length<1)throw Error("Invalid configuration of levels config");i&&(p=await B({actions:r,context:l,scorecardConfig:u,reuniteConfig:R}));const{data:{configs:t}}=await l.cache.load("",`${v}scorecard-config`),{perLevel:d,all:s}=U(t);y={levelNames:c.map(e=>e.name),rules:s,rulesPerLevel:d};for(const[e,o]of Object.entries(n)){const C=O(o.slug,"scorecard/");r.addRoute({duplicateInAllLocales:!0,slug:C,fsPath:O(o.slug,"scorecard/"),templateId:a,hasClientRoutes:!0,excludeFromSidebar:!0,serverPropsGetterIds:[],sharedData:[{id:"scorecard",key:"scorecard"},{key:"catalog",id:"catalog-"+e}],getNavText:()=>Promise.resolve(o.title||"API design scorecard"),getStaticData:async()=>({props:{catalogId:e,catalogConfig:{...o,items:void 0},scorecardConfig:u,scorecardInfo:y}})})}})},afterRoutesCreated:async(r,l)=>{const S=await l.getConfig(),a=S.catalogClassic??{},g=T(S);if(Object.keys(a).length){const i=Object.keys(a).length>1?await F(r,l,a):null,n={};for(const[c,t]of Object.entries(p||{})){const d=r.getRouteByFsPath(c),s=d?.slug;if(s){if(d&&!g.ignoreMetadata){const e=i?i.get(s)??Object.values(a)[0].slug:Object.values(a)[0].slug,o=O(e,"scorecard/");d.metadata={...d.metadata,scorecardStatus:t.status,scorecardLevel:t.scorecardLevel,scorecardLevelIdx:t.scorecardLevelIdx,scorecardLevels:E(t.levels,C=>({uniqueErrors:C.uniqueErrors,uniqueWarnings:C.uniqueWarnings})),scoreCardSlug:o+"apis/"+encodeURIComponent(j(s))}}if(n[s]={...t,levels:E(t.levels,e=>({...e,problems:e.problems.map(o=>({ruleId:o.ruleId,severity:o.severity}))}))},!h){const e=L.resolve(r.outdir,"_scorecard",k(s));D(N(e),JSON.stringify(t))}}}await r.createSharedData("scorecard",n)}const m={};for(const[i,n]of Object.entries(p||{})){const c=r.getRouteByFsPath(i)?.slug;c&&(m[c]=n)}const f=A.REDOCLY_METADATA_OUTPUT_FOLDER;!h&&f&&(_.info("Writing scorecard data..."),D(L.join(f,w),JSON.stringify({scorecardData:m,...y}))),h=!0}}}export{ne as scorecardClassicPlugin};
1
+ import{writeFileSync as D}from"node:fs";import L from"path";import{SCORECARD_OUTPUT_FILE_NAME as w}from"../../constants/common.js";import{mapObject as E}from"../../../utils/object/map-object.js";import{envConfig as A}from"../../config/env-config.js";import{removeLeadingSlash as j}from"../../../utils/url/remove-leading-slash.js";import{combineUrls as O}from"@redocly/theme/core/utils";import{logger as _}from"../../tools/notifiers/logger.js";import{getRouteSlugToCatalogSlugMap as F}from"../../utils/catalog-classic/get-route-slug-to-catalog-slug-map.js";import{deepEqual as I}from"../../../utils/object/deep-equal.js";import{ensureDir as N}from"../../utils/index.js";import{getTemplatePath as q}from"./get-template-path.js";import{getAllRuleNames as U}from"./lint.js";import{getScorecardConfig as T}from"./get-scorecard-config.js";import{getScorecardSlug as k}from"./shared-utils.js";import{scorecardConfigLoader as M}from"./loaders/scorecard-config.js";import{scorecardLoader as W}from"./loaders/scorecard.js";import{computeScorecard as B}from"./compute-scorecard.js";import{telemetryTraceStep as J}from"../../../cli/telemetry/helpers/trace-step.js";const $="scorecardClassic";let u={},R={};async function ne({id:b,requiredEntitlements:P,loadersPrefix:v=""}){let p=null,y=null,h=!1;return{id:b??"scorecardClassic",requiredEntitlements:P??["scorecard"],loaders:{[`${v}scorecard-config`]:M,[`${v}scorecard`]:W},async processContent(r,l){await J("com.redocly.build.plugin.scorecardClassic",async S=>{const a=r.createTemplate($,q("./template/index.js")),g=await l.getConfig(),m=T(g),f=g?.reunite??{},i=[()=>p===null,()=>!I(u,m),()=>!I(R,f)].some(e=>e());u=m,S?.setAttribute("config",JSON.stringify(u||{})),R=f;const n=g.catalogClassic??{},c=u.levels||[];if(c.length<1)throw Error("Invalid configuration of levels config");i&&(p=await B({actions:r,context:l,scorecardConfig:u,reuniteConfig:R}));const{data:{configs:o}}=await l.cache.load("",`${v}scorecard-config`),{perLevel:d,all:s}=U(o);y={levelNames:c.map(e=>e.name),rules:s,rulesPerLevel:d};for(const[e,t]of Object.entries(n)){const C=O(t.slug,"scorecard/");r.addRoute({duplicateInAllLocales:!0,slug:C,fsPath:O(t.slug,"scorecard/"),templateId:a,hasClientRoutes:!0,excludeFromSidebar:!0,serverPropsGetterIds:[],sharedData:[{id:"scorecard",key:"scorecard"},{key:"catalog",id:"catalog-"+e}],getNavText:()=>Promise.resolve(t.title||"API design scorecard"),getStaticData:async()=>({props:{catalogId:e,catalogConfig:{...t,items:void 0},scorecardConfig:u,scorecardInfo:y}})})}})},afterRoutesCreated:async(r,l)=>{const S=await l.getConfig(),a=S.catalogClassic??{},g=T(S);if(Object.keys(a).length){const i=Object.keys(a).length>1?await F(r,l,a):null,n={};for(const[c,o]of Object.entries(p||{})){const d=r.getRouteByFsPath(c),s=d?.slug;if(s){if(d&&!g.ignoreMetadata){const e=i?i.get(s)??Object.values(a)[0].slug:Object.values(a)[0].slug,t=O(e,"scorecard/");d.metadata={...d.metadata,scorecardStatus:o.status,scorecardLevel:o.scorecardLevel,scorecardLevelIdx:o.scorecardLevelIdx,scorecardLevels:E(o.levels,C=>({uniqueErrors:C.uniqueErrors,uniqueWarnings:C.uniqueWarnings})),scoreCardSlug:t+"apis/"+encodeURIComponent(j(s))}}if(n[s]={...o,levels:E(o.levels,e=>({...e,problems:e.problems.map(t=>({ruleId:t.ruleId,severity:t.severity}))}))},!h){const e=L.resolve(r.outdir,"_scorecard",k(s));D(N(e),JSON.stringify(o))}}}await r.createSharedData("scorecard",n)}const m={};for(const[i,n]of Object.entries(p||{})){const c=r.getRouteByFsPath(i)?.slug;c&&(m[c]=n)}const f=A.REDOCLY_METADATA_OUTPUT_FOLDER;!h&&f&&(_.info("Writing scorecard data..."),D(L.join(f,w),JSON.stringify({scorecardData:m,...y}))),h=!0}}}export{ne as scorecardClassicPlugin};
@@ -1 +1 @@
1
- import*as t from"react";import{useParams as p}from"react-router-dom";import{useMemo as u}from"react";import{ApiPage as s}from"./views";import{useData as c}from"./useData";function I(r){const{apiSlug:e}=p(),{apis:o,scorecardInfo:n,teamLabel:i,catalogConfig:l}=c(r),a=u(()=>e?o.find(m=>m.api.link===`/${decodeURIComponent(e)}`):void 0,[o,e]);return a?t.createElement(s,{catalogSlug:l.slug,slug:`/${decodeURIComponent(e||"")}`,api:a,teamLabel:i,rulesPerLevel:n.rulesPerLevel}):t.createElement("div",null,"API not found")}export{I as ApiDetailPage};
1
+ import*as t from"react";import{useParams as p}from"react-router";import{useMemo as u}from"react";import{ApiPage as s}from"./views";import{useData as c}from"./useData";function I(r){const{apiSlug:e}=p(),{apis:o,scorecardInfo:n,teamLabel:i,catalogConfig:l}=c(r),a=u(()=>e?o.find(m=>m.api.link===`/${decodeURIComponent(e)}`):void 0,[o,e]);return a?t.createElement(s,{catalogSlug:l.slug,slug:`/${decodeURIComponent(e||"")}`,api:a,teamLabel:i,rulesPerLevel:n.rulesPerLevel}):t.createElement("div",null,"API not found")}export{I as ApiDetailPage};
@@ -1 +1 @@
1
- import{useParams as n}from"react-router-dom";import{useMemo as f}from"react";import*as l from"react";import{useData as d}from"./useData";import{RuleView as c}from"./views";function R(o){const{problemsByRule:a,hasTeam:r,hasPublishedAt:u,teamLabel:m,catalogConfig:s}=d(o),{ruleId:e}=n(),t=f(()=>e?a.find(i=>i.ruleId===e):void 0,[a,e]);return!e||!t?l.createElement("div",null,"Rule not found"):l.createElement(c,{catalogSlug:s.slug,slug:e,data:t,hasTeam:r,hasPublishedAt:u,teamLabel:m})}export{R as RuleDetailPage};
1
+ import{useParams as n}from"react-router";import{useMemo as f}from"react";import*as l from"react";import{useData as d}from"./useData";import{RuleView as c}from"./views";function R(o){const{problemsByRule:a,hasTeam:r,hasPublishedAt:u,teamLabel:m,catalogConfig:s}=d(o),{ruleId:e}=n(),t=f(()=>e?a.find(i=>i.ruleId===e):void 0,[a,e]);return!e||!t?l.createElement("div",null,"Rule not found"):l.createElement(c,{catalogSlug:s.slug,slug:e,data:t,hasTeam:r,hasPublishedAt:u,teamLabel:m})}export{R as RuleDetailPage};
@@ -4,7 +4,7 @@ export declare function ApiLevel({ level, colorVariable }: {
4
4
  level: string;
5
5
  colorVariable: string;
6
6
  }): React.JSX.Element;
7
- export declare function StatusDistribution({ summary }: {
7
+ export declare function StatusDistribution({ summary, }: {
8
8
  summary: {
9
9
  total: number;
10
10
  levels: Record<string, number>;
@@ -1 +1 @@
1
- import{Routes as a,Route as r}from"react-router-dom";import*as e from"react";import"react-date-picker/dist/DatePicker.css";import"react-calendar/dist/Calendar.css";import{ApiDetailPage as o}from"./ApiDetailsPage";import{RuleDetailPage as m}from"./RuleDetailsPage";import{ScorecardDashboard as p}from"./ScorecardDashboard";function l(t){return e.createElement(a,null,e.createElement(r,{path:"/",element:e.createElement(p,{pageProps:t.pageProps})}),e.createElement(r,{path:"/apis/:apiSlug",element:e.createElement(o,{pageProps:t.pageProps})}),e.createElement(r,{path:"/rules/:ruleId",element:e.createElement(m,{pageProps:t.pageProps})}),";")}export{l as default};
1
+ import{Routes as a,Route as r}from"react-router";import*as e from"react";import"react-date-picker/dist/DatePicker.css";import"react-calendar/dist/Calendar.css";import{ApiDetailPage as o}from"./ApiDetailsPage";import{RuleDetailPage as m}from"./RuleDetailsPage";import{ScorecardDashboard as p}from"./ScorecardDashboard";function l(t){return e.createElement(a,null,e.createElement(r,{path:"/",element:e.createElement(p,{pageProps:t.pageProps})}),e.createElement(r,{path:"/apis/:apiSlug",element:e.createElement(o,{pageProps:t.pageProps})}),e.createElement(r,{path:"/rules/:ruleId",element:e.createElement(m,{pageProps:t.pageProps})}),";")}export{l as default};
@@ -40,7 +40,7 @@ export declare function useData(props: {
40
40
  title: string;
41
41
  items: CatalogItem[];
42
42
  }[];
43
- filters: import("@redocly/theme/core/types").ResolvedFilter[];
43
+ filters: import("@redocly/theme").ResolvedFilter[];
44
44
  scorecardInfo: {
45
45
  levelNames: string[];
46
46
  rulesPerLevel: Record<string, string[]>;
@@ -1,4 +1,4 @@
1
- import type { Location } from 'react-router-dom';
1
+ import type { Location } from 'react-router';
2
2
  import type { DetailedScorecardData } from '../types';
3
3
  import type { ProblemWithCodeframe } from '../lint';
4
4
  export declare const OTHER_TEAMS_LABEL = "Other";
@@ -1 +1 @@
1
- import*as e from"react";import{useCallback as H,useMemo as b,useState as G,useEffect as _}from"react";import{useLocation as T}from"react-router-dom";import{Flex as U}from"@redocly/portal-legacy-ui";import{Button as x}from"@redocly/theme/components/Button/Button";import{AddIcon as I}from"@redocly/theme/icons/AddIcon/AddIcon";import{SubtractIcon as D}from"@redocly/theme/icons/SubtractIcon/SubtractIcon";import{ArrowLeftIcon as K}from"@redocly/theme/icons/ArrowLeftIcon/ArrowLeftIcon";import{getScorecardColorVariable as z,withoutPathPrefix as O}from"@redocly/theme/core/utils";import{Link as P}from"../../../../client/app/Link";import N from"../../../../client/app/CircularProgress";import{isDefined as R}from"../../../../utils/guards/is-defined.js";import{removeLeadingSlash as Z}from"../../../../utils/url/remove-leading-slash.js";import{StatusByLevelWidget as J}from"./StatusByLevelWidget";import{OTHER_TEAMS_LABEL as Q,NON_CONFORMANT as X}from"./utils";import{LevelIndicator as Y}from"./LevelIndicator";import{AppPageWrapper as V,CardValue as v,CardsWrapper as j,CatalogDescription as ee,ModeSwitcherTab as te,ModeSwitcherTabs as re,CardRow as B,ProblemsByStatusCardBody as W,ScoreCardStatusCardBody as F,TableWrap as ne,LevelComplianceCardTitle as le,ContentWithDotWrap as C,ScorecardCard as S,ScorecardCardTitle as w}from"./index.styles";import{ApiLevel as M,InstanceStatus as k,LevelStatus as $,RuleStatus as q}from"./components";import{Grid as A}from"./Grid/Grid";import{useDetailedScorecard as ae}from"./useDetailedScorecard";import{Gauge as se,GaugeValue as ce}from"./Gauge";function Te(p){const u=T(),{data:d,levelNames:i,hasPublishedAt:n,hasTeam:s,teamLabel:l}=p,f=H((a,c,E)=>{const g=a.getValue(E)?new Date(a.getValue(E)).getTime():0,t=c.getValue(E)?new Date(c.getValue(E)).getTime():0;return g>t?1:-1},[]),m=b(()=>[{id:"title",header:"API",accessorKey:"api.title",size:200,cell:({getValue:a,row:c})=>e.createElement(P,{to:O(u.pathname)+"/apis/"+encodeURIComponent(Z(c.original.api.link))},a())},n?{header:"Published at",accessorKey:"api.publishedAt",sortingFn:f,cell:({getValue:a})=>{const c=a();return c?new Date(c).toLocaleDateString():"-"}}:void 0,s?{header:l,accessorKey:"api.team"}:void 0,{id:"level",header:"Level",accessorKey:"scorecard.scorecardLevel",cell:({getValue:a,row:c})=>e.createElement(M,{level:a(),colorVariable:z(c.original?.scorecard.scorecardLevelIdx,i.length+1)})},...i.map(a=>({id:a,header:`${a}`,accessorKey:"scorecard.levels",cell:({getValue:c,row:E})=>{const g=c(),t=E.original.api.link;return g?.[a]?e.createElement(Y,{key:t,uniqueErrors:g[a].uniqueErrors,uniqueWarnings:g[a].uniqueWarnings,id:t}):null}}))].filter(R),[f,i,u.pathname,n,s,l]);return e.createElement(A,{columns:m,data:d,sortBy:[{id:"title",desc:!1}]})}function Ie(p){const u=T(),{data:d}=p,i=b(()=>[{header:"Rules",accessorKey:"ruleId",cell:({getValue:n})=>e.createElement(P,{to:O(u.pathname)+"/rules/"+encodeURIComponent(n())},n())},{id:"status",header:"Status",accessorKey:"status",size:200,cell:({row:n})=>e.createElement(q,{errors:n.original.errorApisCount,warnings:n.original.warningApisCount})},{header:"Problem APIs",size:200,accessorKey:"apis",cell:({getValue:n})=>n().length,sortDescFirst:!0},{header:"Problem count",size:200,accessorKey:"count",sortDescFirst:!0}],[u.pathname]);return e.createElement(A,{columns:i,data:d,sortBy:[{id:"status",desc:!0}]})}function De(p){const{data:u,levelNames:d,filters:i,setActiveTab:n,teamLabel:s,teamProperty:l}=p,f=b(()=>[{id:"team",header:`API ${s}`,accessorKey:"team",size:200,cell:({getValue:m})=>e.createElement("a",{href:"#",onClick:a=>{a.preventDefault(),n("apis"),i.find(c=>c.property===l)?.selectOption(m())}},m())},...[X,...d].map(m=>({id:m,header:`${m}`,accessorFn:a=>a.levels[m]?.apis}))],[i,d,n,s,l]);return e.createElement(A,{columns:f,data:u,sortBy:[{id:"team",desc:!1}],groupHeaderTitle:"APIs by level"})}function oe(p){const{data:u,title:d}=p,i=b(()=>[{id:"expand",maxSize:40,size:40,header:()=>null,enableSorting:!1,cell:({row:n})=>n.getCanExpand()?e.createElement(x,{onClick:n.getToggleExpandedHandler(),variant:"text",size:"medium",icon:n.getIsExpanded()?e.createElement(D,null):e.createElement(I,null)}):null},{header:"Rules",accessorKey:"ruleId",cell:({getValue:n,row:s})=>s.getCanExpand()?e.createElement("span",{onClick:s.getToggleExpandedHandler()},n()):null},{header:"Status",accessorKey:"status",size:200,cell:({getValue:n})=>{const s=n();return e.createElement(q,{errors:s?.errorsCount,warnings:s?.warningsCount})},enableSorting:!1},{header:"Problem count",accessorKey:"problemsCount",size:200,sortDescFirst:!0}],[]);return e.createElement(A,{columns:i,data:u,sortBy:[{id:"ruleId",desc:!1}],empty:e.createElement(e.Fragment,null,"\u2705 This API is compliant with ",e.createElement("strong",null,d)," level rules"),subRowKey:"problems"})}function Ke(p){const{catalogSlug:u,slug:d,data:i,hasTeam:n,hasPublishedAt:s,teamLabel:l}=p,{apis:f,apisCount:m,warningApisCount:a,errorApisCount:c,levels:E,count:g}=i,t=f.length===0,h=t?void 0:{id:"expand",maxSize:40,size:40,header:()=>null,enableSorting:!1,cell:({row:r})=>r.getCanExpand()?e.createElement(x,{onClick:r.getToggleExpandedHandler(),variant:"text",size:"medium",icon:r.getIsExpanded()?e.createElement(D,null):e.createElement(I,null)}):null},L=b(()=>[h,{header:"API",accessorKey:"title"},s?{header:"Published at",accessorKey:"publishedAt",cell:({getValue:r})=>{const o=r();return o?new Date(o).toLocaleDateString():"-"}}:void 0,n?{header:l,accessorKey:"team",cell:({getValue:r})=>r()||Q}:void 0,{header:"Problem count",size:200,accessorKey:"count",cell:({getValue:r})=>r()||0,sortDescFirst:!0}].filter(R),[n,s,l,t]),y=b(()=>Object.entries(i.teams).sort((r,o)=>o[1]-r[1]),[i.teams]);return e.createElement(V,null,e.createElement(x,{icon:e.createElement(K,null),iconPosition:"left",variant:"ghost",size:"large",to:`${u}scorecard`},"Back to dashboard"),e.createElement("h1",null,"Rule ",d),e.createElement(j,null,e.createElement(S,null,e.createElement(w,null,"Rule status"),e.createElement(F,null,e.createElement("div",null,e.createElement(v,null,m),e.createElement("br",null),"APIs"),e.createElement("div",null,e.createElement(C,null,e.createElement(v,{style:{textAlign:"right"}},m-a-c),e.createElement(k,{severity:"Pass"})),e.createElement(C,null,e.createElement(v,{style:{textAlign:"right"}},a),e.createElement(k,{severity:"Warn"})),e.createElement(C,null,e.createElement(v,{style:{textAlign:"right"}},c),e.createElement(k,{severity:"Error"}))))),e.createElement(S,null,e.createElement(w,null,"Problems by level"),e.createElement(W,null,Object.entries(E).map(([r,o])=>e.createElement(B,{key:r},e.createElement("span",null,r),e.createElement(se,{chunks:[{share:o.errors/g*100,colorVariable:"--scorecard-color-error"},{share:o.warnings/g*100,colorVariable:"--scorecard-color-warning"}]}),e.createElement(ce,null,o.errors+o.warnings))))),e.createElement(S,null,e.createElement(w,null,`Problems by ${l}`),e.createElement(W,null,y.slice(0,4).map(([r,o])=>e.createElement(B,{key:r},e.createElement("span",{style:{flex:1,textAlign:"left"}},r),e.createElement(v,null,o)))))),e.createElement(A,{columns:L,data:f,sortBy:[{id:"title",desc:!1}],subRowKey:"problems",slug:d}))}function ze(p){const{slug:u,api:d,teamLabel:i,catalogSlug:n}=p,{api:s}=d||{},{scorecard:l,isLoading:f}=ae(`/${u}`),m=l?.levels||{},[a,c]=G(Object.keys(m)[0]),E=b(()=>s?.publishedAt instanceof Date?s?.publishedAt.toLocaleDateString():s?.publishedAt,[s]);_(()=>{if(l){const t=l.levels||{};c(Object.keys(t)[0])}},[l]);const g=b(()=>{if(!l?.levels)return{};const t={};for(const h of Object.keys(l.levels)){const L=l.levels[h].problems.reduce((y,r)=>(y[r.ruleId]||(y[r.ruleId]=[]),y[r.ruleId].push(r),y),{});t[h]=Object.entries(L).map(([y,r])=>({ruleId:y,problems:[...r.filter(o=>o.severity==="error"),...r.filter(o=>o.severity==="warn")],problemsCount:r.length,status:{errorsCount:r.filter(o=>o.severity==="error").length,warningsCount:r.filter(o=>o.severity==="warn").length}}))}return t},[l?.levels]);return f?e.createElement(U,{justifyContent:"center",mt:"2em"},e.createElement(N,null)):l?e.createElement(V,null,e.createElement(x,{icon:e.createElement(K,null),iconPosition:"left",variant:"ghost",size:"large",to:`${n}scorecard`},"Back to dashboard"),e.createElement("h1",null,s?.title||u),e.createElement(ee,null,E&&e.createElement(e.Fragment,null,"Published at: ",new Date().toLocaleString(void 0,{timeZoneName:"short"}),e.createElement("br",null)),e.createElement(P,{to:u,external:!0},"Documentation")),e.createElement(j,null,e.createElement(S,null,e.createElement(le,null,e.createElement("span",null,"Scorecard level"),e.createElement(M,{level:l.scorecardLevel,colorVariable:z(l.scorecardLevelIdx,Object.keys(m).length)})),e.createElement(F,null,e.createElement("div",null,"Compliance by level"),e.createElement("div",null,Object.entries(l.levels).map(([t,h])=>e.createElement(C,{key:t},e.createElement(v,{style:{width:"100px",textAlign:"right"}},t),e.createElement($,{errors:h.errors,warnings:h.warnings})))))),e.createElement(J,{title:"Rules compliance",levels:Object.entries(l.levels).map(([t,h])=>({errors:h.uniqueErrors,warnings:h.uniqueWarnings,total:p.rulesPerLevel[t].length,name:t}))}),e.createElement(S,null,e.createElement(w,null,i),e.createElement(v,{style:{fontWeight:"normal"}},s?.team))),e.createElement(re,{style:{justifyContent:"flex-start"},"data-component-name":"Scorecard/ModeSwitcherTabs"},Object.keys(l.levels).map(t=>e.createElement(te,{"data-component-name":"Scorecard/ModeSwitcherTab",key:t,isActive:a===t,onClick:()=>c(t)},e.createElement(C,null,e.createElement("span",null,t)," ",e.createElement($,{errors:l.levels[t].errors,warnings:l.levels[t].warnings}))))),Object.keys(m).map(t=>e.createElement(ne,{key:t,isActive:a===t},e.createElement(oe,{title:t,data:g[t]})))):e.createElement("div",null,"Scorecard not found")}export{Te as ApiListView,ze as ApiPage,oe as ApiView,Ke as RuleView,Ie as RulesView,De as TeamsView};
1
+ import*as e from"react";import{useCallback as H,useMemo as b,useState as G,useEffect as _}from"react";import{useLocation as T}from"react-router";import{Flex as U}from"@redocly/portal-legacy-ui";import{Button as x}from"@redocly/theme/components/Button/Button";import{AddIcon as I}from"@redocly/theme/icons/AddIcon/AddIcon";import{SubtractIcon as D}from"@redocly/theme/icons/SubtractIcon/SubtractIcon";import{ArrowLeftIcon as K}from"@redocly/theme/icons/ArrowLeftIcon/ArrowLeftIcon";import{getScorecardColorVariable as z,withoutPathPrefix as O}from"@redocly/theme/core/utils";import{Link as P}from"../../../../client/app/Link";import N from"../../../../client/app/CircularProgress";import{isDefined as R}from"../../../../utils/guards/is-defined.js";import{removeLeadingSlash as Z}from"../../../../utils/url/remove-leading-slash.js";import{StatusByLevelWidget as J}from"./StatusByLevelWidget";import{OTHER_TEAMS_LABEL as Q,NON_CONFORMANT as X}from"./utils";import{LevelIndicator as Y}from"./LevelIndicator";import{AppPageWrapper as V,CardValue as v,CardsWrapper as j,CatalogDescription as ee,ModeSwitcherTab as te,ModeSwitcherTabs as re,CardRow as B,ProblemsByStatusCardBody as W,ScoreCardStatusCardBody as F,TableWrap as ne,LevelComplianceCardTitle as le,ContentWithDotWrap as C,ScorecardCard as S,ScorecardCardTitle as w}from"./index.styles";import{ApiLevel as M,InstanceStatus as k,LevelStatus as $,RuleStatus as q}from"./components";import{Grid as A}from"./Grid/Grid";import{useDetailedScorecard as ae}from"./useDetailedScorecard";import{Gauge as se,GaugeValue as ce}from"./Gauge";function Te(p){const u=T(),{data:d,levelNames:i,hasPublishedAt:n,hasTeam:s,teamLabel:l}=p,f=H((a,c,E)=>{const g=a.getValue(E)?new Date(a.getValue(E)).getTime():0,t=c.getValue(E)?new Date(c.getValue(E)).getTime():0;return g>t?1:-1},[]),m=b(()=>[{id:"title",header:"API",accessorKey:"api.title",size:200,cell:({getValue:a,row:c})=>e.createElement(P,{to:O(u.pathname)+"/apis/"+encodeURIComponent(Z(c.original.api.link))},a())},n?{header:"Published at",accessorKey:"api.publishedAt",sortingFn:f,cell:({getValue:a})=>{const c=a();return c?new Date(c).toLocaleDateString():"-"}}:void 0,s?{header:l,accessorKey:"api.team"}:void 0,{id:"level",header:"Level",accessorKey:"scorecard.scorecardLevel",cell:({getValue:a,row:c})=>e.createElement(M,{level:a(),colorVariable:z(c.original?.scorecard.scorecardLevelIdx,i.length+1)})},...i.map(a=>({id:a,header:`${a}`,accessorKey:"scorecard.levels",cell:({getValue:c,row:E})=>{const g=c(),t=E.original.api.link;return g?.[a]?e.createElement(Y,{key:t,uniqueErrors:g[a].uniqueErrors,uniqueWarnings:g[a].uniqueWarnings,id:t}):null}}))].filter(R),[f,i,u.pathname,n,s,l]);return e.createElement(A,{columns:m,data:d,sortBy:[{id:"title",desc:!1}]})}function Ie(p){const u=T(),{data:d}=p,i=b(()=>[{header:"Rules",accessorKey:"ruleId",cell:({getValue:n})=>e.createElement(P,{to:O(u.pathname)+"/rules/"+encodeURIComponent(n())},n())},{id:"status",header:"Status",accessorKey:"status",size:200,cell:({row:n})=>e.createElement(q,{errors:n.original.errorApisCount,warnings:n.original.warningApisCount})},{header:"Problem APIs",size:200,accessorKey:"apis",cell:({getValue:n})=>n().length,sortDescFirst:!0},{header:"Problem count",size:200,accessorKey:"count",sortDescFirst:!0}],[u.pathname]);return e.createElement(A,{columns:i,data:d,sortBy:[{id:"status",desc:!0}]})}function De(p){const{data:u,levelNames:d,filters:i,setActiveTab:n,teamLabel:s,teamProperty:l}=p,f=b(()=>[{id:"team",header:`API ${s}`,accessorKey:"team",size:200,cell:({getValue:m})=>e.createElement("a",{href:"#",onClick:a=>{a.preventDefault(),n("apis"),i.find(c=>c.property===l)?.selectOption(m())}},m())},...[X,...d].map(m=>({id:m,header:`${m}`,accessorFn:a=>a.levels[m]?.apis}))],[i,d,n,s,l]);return e.createElement(A,{columns:f,data:u,sortBy:[{id:"team",desc:!1}],groupHeaderTitle:"APIs by level"})}function oe(p){const{data:u,title:d}=p,i=b(()=>[{id:"expand",maxSize:40,size:40,header:()=>null,enableSorting:!1,cell:({row:n})=>n.getCanExpand()?e.createElement(x,{onClick:n.getToggleExpandedHandler(),variant:"text",size:"medium",icon:n.getIsExpanded()?e.createElement(D,null):e.createElement(I,null)}):null},{header:"Rules",accessorKey:"ruleId",cell:({getValue:n,row:s})=>s.getCanExpand()?e.createElement("span",{onClick:s.getToggleExpandedHandler()},n()):null},{header:"Status",accessorKey:"status",size:200,cell:({getValue:n})=>{const s=n();return e.createElement(q,{errors:s?.errorsCount,warnings:s?.warningsCount})},enableSorting:!1},{header:"Problem count",accessorKey:"problemsCount",size:200,sortDescFirst:!0}],[]);return e.createElement(A,{columns:i,data:u,sortBy:[{id:"ruleId",desc:!1}],empty:e.createElement(e.Fragment,null,"\u2705 This API is compliant with ",e.createElement("strong",null,d)," level rules"),subRowKey:"problems"})}function Ke(p){const{catalogSlug:u,slug:d,data:i,hasTeam:n,hasPublishedAt:s,teamLabel:l}=p,{apis:f,apisCount:m,warningApisCount:a,errorApisCount:c,levels:E,count:g}=i,t=f.length===0,h=t?void 0:{id:"expand",maxSize:40,size:40,header:()=>null,enableSorting:!1,cell:({row:r})=>r.getCanExpand()?e.createElement(x,{onClick:r.getToggleExpandedHandler(),variant:"text",size:"medium",icon:r.getIsExpanded()?e.createElement(D,null):e.createElement(I,null)}):null},L=b(()=>[h,{header:"API",accessorKey:"title"},s?{header:"Published at",accessorKey:"publishedAt",cell:({getValue:r})=>{const o=r();return o?new Date(o).toLocaleDateString():"-"}}:void 0,n?{header:l,accessorKey:"team",cell:({getValue:r})=>r()||Q}:void 0,{header:"Problem count",size:200,accessorKey:"count",cell:({getValue:r})=>r()||0,sortDescFirst:!0}].filter(R),[n,s,l,t]),y=b(()=>Object.entries(i.teams).sort((r,o)=>o[1]-r[1]),[i.teams]);return e.createElement(V,null,e.createElement(x,{icon:e.createElement(K,null),iconPosition:"left",variant:"ghost",size:"large",to:`${u}scorecard`},"Back to dashboard"),e.createElement("h1",null,"Rule ",d),e.createElement(j,null,e.createElement(S,null,e.createElement(w,null,"Rule status"),e.createElement(F,null,e.createElement("div",null,e.createElement(v,null,m),e.createElement("br",null),"APIs"),e.createElement("div",null,e.createElement(C,null,e.createElement(v,{style:{textAlign:"right"}},m-a-c),e.createElement(k,{severity:"Pass"})),e.createElement(C,null,e.createElement(v,{style:{textAlign:"right"}},a),e.createElement(k,{severity:"Warn"})),e.createElement(C,null,e.createElement(v,{style:{textAlign:"right"}},c),e.createElement(k,{severity:"Error"}))))),e.createElement(S,null,e.createElement(w,null,"Problems by level"),e.createElement(W,null,Object.entries(E).map(([r,o])=>e.createElement(B,{key:r},e.createElement("span",null,r),e.createElement(se,{chunks:[{share:o.errors/g*100,colorVariable:"--scorecard-color-error"},{share:o.warnings/g*100,colorVariable:"--scorecard-color-warning"}]}),e.createElement(ce,null,o.errors+o.warnings))))),e.createElement(S,null,e.createElement(w,null,`Problems by ${l}`),e.createElement(W,null,y.slice(0,4).map(([r,o])=>e.createElement(B,{key:r},e.createElement("span",{style:{flex:1,textAlign:"left"}},r),e.createElement(v,null,o)))))),e.createElement(A,{columns:L,data:f,sortBy:[{id:"title",desc:!1}],subRowKey:"problems",slug:d}))}function ze(p){const{slug:u,api:d,teamLabel:i,catalogSlug:n}=p,{api:s}=d||{},{scorecard:l,isLoading:f}=ae(`/${u}`),m=l?.levels||{},[a,c]=G(Object.keys(m)[0]),E=b(()=>s?.publishedAt instanceof Date?s?.publishedAt.toLocaleDateString():s?.publishedAt,[s]);_(()=>{if(l){const t=l.levels||{};c(Object.keys(t)[0])}},[l]);const g=b(()=>{if(!l?.levels)return{};const t={};for(const h of Object.keys(l.levels)){const L=l.levels[h].problems.reduce((y,r)=>(y[r.ruleId]||(y[r.ruleId]=[]),y[r.ruleId].push(r),y),{});t[h]=Object.entries(L).map(([y,r])=>({ruleId:y,problems:[...r.filter(o=>o.severity==="error"),...r.filter(o=>o.severity==="warn")],problemsCount:r.length,status:{errorsCount:r.filter(o=>o.severity==="error").length,warningsCount:r.filter(o=>o.severity==="warn").length}}))}return t},[l?.levels]);return f?e.createElement(U,{justifyContent:"center",mt:"2em"},e.createElement(N,null)):l?e.createElement(V,null,e.createElement(x,{icon:e.createElement(K,null),iconPosition:"left",variant:"ghost",size:"large",to:`${n}scorecard`},"Back to dashboard"),e.createElement("h1",null,s?.title||u),e.createElement(ee,null,E&&e.createElement(e.Fragment,null,"Published at: ",new Date().toLocaleString(void 0,{timeZoneName:"short"}),e.createElement("br",null)),e.createElement(P,{to:u,external:!0},"Documentation")),e.createElement(j,null,e.createElement(S,null,e.createElement(le,null,e.createElement("span",null,"Scorecard level"),e.createElement(M,{level:l.scorecardLevel,colorVariable:z(l.scorecardLevelIdx,Object.keys(m).length)})),e.createElement(F,null,e.createElement("div",null,"Compliance by level"),e.createElement("div",null,Object.entries(l.levels).map(([t,h])=>e.createElement(C,{key:t},e.createElement(v,{style:{width:"100px",textAlign:"right"}},t),e.createElement($,{errors:h.errors,warnings:h.warnings})))))),e.createElement(J,{title:"Rules compliance",levels:Object.entries(l.levels).map(([t,h])=>({errors:h.uniqueErrors,warnings:h.uniqueWarnings,total:p.rulesPerLevel[t].length,name:t}))}),e.createElement(S,null,e.createElement(w,null,i),e.createElement(v,{style:{fontWeight:"normal"}},s?.team))),e.createElement(re,{style:{justifyContent:"flex-start"},"data-component-name":"Scorecard/ModeSwitcherTabs"},Object.keys(l.levels).map(t=>e.createElement(te,{"data-component-name":"Scorecard/ModeSwitcherTab",key:t,isActive:a===t,onClick:()=>c(t)},e.createElement(C,null,e.createElement("span",null,t)," ",e.createElement($,{errors:l.levels[t].errors,warnings:l.levels[t].warnings}))))),Object.keys(m).map(t=>e.createElement(ne,{key:t,isActive:a===t},e.createElement(oe,{title:t,data:g[t]})))):e.createElement("div",null,"Scorecard not found")}export{Te as ApiListView,ze as ApiPage,oe as ApiView,Ke as RuleView,Ie as RulesView,De as TeamsView};
@@ -1 +1 @@
1
- import{envConfig as c}from"../../config/env-config.js";import{SCORECARDS_BASE_SLUG as i,SCORECARDS_TEMPLATE_ID as n}from"../../constants/plugins/scorecards.js";import{getTemplatePath as d}from"./utils/get-template-path.js";import{telemetryTraceStep as l}from"../../../cli/telemetry/helpers/trace-step.js";async function u(){return{id:"Scorecards",requiredEntitlements:["scorecards"],async processContent(e,r){await l("build.plugin.scorecards",async s=>{if(!c.NEW_SCORECARDS_ENABLED)return;const t=(await r.getConfig()).scorecards;s?.setAttribute("config",JSON.stringify(t));const{logger:o}=r;o.info("Scorecards plugin started");const a=e.createTemplate(n,d("../template/index.js"));e.addRoute({duplicateInAllLocales:!0,slug:i,fsPath:"",templateId:a,excludeFromSidebar:!0,hasClientRoutes:!0,getNavText:()=>Promise.resolve("Scorecards"),getStaticData:async()=>({props:{scorecardsConfig:t}})}),o.info("Scorecards plugin finished")})}}}var C=u;export{C as default,u as scorecardsPlugin};
1
+ import{envConfig as a}from"../../config/env-config.js";import{SCORECARDS_BASE_SLUG as i,SCORECARDS_TEMPLATE_ID as n}from"../../constants/plugins/scorecards.js";import{getTemplatePath as d}from"./utils/get-template-path.js";import{telemetryTraceStep as l}from"../../../cli/telemetry/helpers/trace-step.js";async function u(){return{id:"Scorecards",requiredEntitlements:["scorecards"],async processContent(e,r){await l("com.redocly.build.plugin.scorecards",async c=>{if(!a.NEW_SCORECARDS_ENABLED)return;const t=(await r.getConfig()).scorecards;c?.setAttribute("config",JSON.stringify(t));const{logger:o}=r;o.info("Scorecards plugin started");const s=e.createTemplate(n,d("../template/index.js"));e.addRoute({duplicateInAllLocales:!0,slug:i,fsPath:"",templateId:s,excludeFromSidebar:!0,hasClientRoutes:!0,getNavText:()=>Promise.resolve("Scorecards"),getStaticData:async()=>({props:{scorecardsConfig:t}})}),o.info("Scorecards plugin finished")})}}}var C=u;export{C as default,u as scorecardsPlugin};
@@ -4,7 +4,7 @@ import type { AfterRoutesCreatedActions, AfterRoutesCreatedLifecycleContext } fr
4
4
  * Chunking runs when any of these is enabled: AI search, llms.txt, or Docs MCP.
5
5
  * embeddingsEnabled is true when AI search or Docs MCP is enabled (shared embedding index).
6
6
  */
7
- export declare function prepareSemanticDocuments(actions: AfterRoutesCreatedActions, context: AfterRoutesCreatedLifecycleContext, { embeddingsEnabled, llmstxtEnabled }: {
7
+ export declare function prepareSemanticDocuments(actions: AfterRoutesCreatedActions, context: AfterRoutesCreatedLifecycleContext, { embeddingsEnabled, llmstxtEnabled, }: {
8
8
  embeddingsEnabled: boolean;
9
9
  llmstxtEnabled: boolean;
10
10
  }): Promise<void>;
@@ -1,3 +1,3 @@
1
- import p from"node:path";import{existsSync as X}from"node:fs";import{writeFile as D,access as N,rm as k,constants as B}from"fs/promises";import{REDOCLY_ROUTE_RBAC as _,REDOCLY_TEAMS_RBAC as h}from"@redocly/config";import U from"picomatch";import{combineUrls as j}from"@redocly/theme/core/utils";import{DEFAULT_LOCALE_PLACEHOLDER as E}from"../../../../constants/common.js";import{AI_INDEX_EXPORT_FOLDER as G}from"../../../constants/plugins/search.js";import{LLMS_TXT_FILE_NAME as H}from"../../../constants/common.js";import{envConfig as C}from"../../../config/env-config.js";import{logger as a}from"../../../tools/notifiers/logger.js";import{shaHexShort as Y}from"../../../utils/crypto/sha-hex-short.js";import{promiseMapLimit as P}from"../../../utils/async/promise-map-limit.js";import{getLlmsTxtMdPathBySlug as K}from"../../../utils/llmstxt/get-llms-txt-md-path-by-slug.js";import{buildAgentFeedbackLlmsFooter as J}from"../../../utils/llmstxt/agent-feedback-llms-footer.js";import{validateLLMsTxtConfig as V,generateLLMsTxt as W}from"../llmstxt/index.js";import{ensureDir as F}from"../../../utils/fs.js";import{isResourcePubliclyAccessible as q,extractTeamsFromScopeItems as z,getRbacTeamsListForResource as Q}from"../../../utils/rbac.js";const w=20,S="llms.txt:";async function Dt(t,i,{embeddingsEnabled:o,llmstxtEnabled:n}){const c=p.join(t.outdir,H);if(!n){try{await N(c,B.W_OK),await k(c)}catch{}if(!o)return}o&&a.info("Preparing semantic documents..."),n&&a.info(`${S} Generating llms.txt files...`);const T=a.startTiming(),l=a.startTiming(),m=t.getGlobalConfig("seo"),f=m?.llmstxt,d=C.REDOCLY_EXP_LLMSTXT_AGENT_FEEDBACK_ENABLED??!1,M=p.resolve(t.outdir,G),u=t.getConfig(),O=u.access?.rbac??{},b=t.getAllRoutes(),y=u?.l10n?.defaultLocale||u?.i18n?.defaultLocale||E,I=(f?.excludeFiles||[]).map(e=>U(e)),R=[];if(await P(b,w,async e=>{if(e.excludeFromSearch)return;const v=await Z(e,t),x=await tt(e,v,i,t);if(x){if(n)for(const s of await x.getLLMsTxts()){if(I.some($=>$(s.fsPath)))continue;const g=K(s.slug),r=p.join(t.outdir,g);F(r);const L=d?J(m,s.slug):void 0,A=L?`
1
+ import L from"node:path";import{existsSync as N}from"node:fs";import{writeFile as R,access as X,rm as B,constants as k}from"fs/promises";import{REDOCLY_ROUTE_RBAC as _,REDOCLY_TEAMS_RBAC as h}from"@redocly/config";import j from"picomatch";import{DEFAULT_LOCALE_PLACEHOLDER as E}from"../../../../constants/common.js";import{AI_INDEX_EXPORT_FOLDER as G}from"../../../constants/plugins/search.js";import{LLMS_TXT_FILE_NAME as Y}from"../../../constants/common.js";import{envConfig as C}from"../../../config/env-config.js";import{logger as c}from"../../../tools/notifiers/logger.js";import{shaHexShort as H}from"../../../utils/crypto/sha-hex-short.js";import{promiseMapLimit as P}from"../../../utils/async/promise-map-limit.js";import{getLlmsTxtMdPathBySlug as K}from"../../../utils/llmstxt/get-llms-txt-md-path-by-slug.js";import{buildAgentFeedbackLlmsFooter as U}from"../../../utils/llmstxt/agent-feedback-llms-footer.js";import{validateLLMsTxtConfig as J,generateLLMsTxt as V}from"../llmstxt/index.js";import{ensureDir as F}from"../../../utils/fs.js";import{isResourcePubliclyAccessible as W,extractTeamsFromScopeItems as q,getRbacTeamsListForResource as z}from"../../../utils/rbac.js";const w=20,S="llms.txt:";async function At(t,i,{embeddingsEnabled:o,llmstxtEnabled:s}){const l=L.join(t.outdir,Y);if(!s){try{await X(l,k.W_OK),await B(l)}catch{}if(!o)return}o&&c.info("Preparing semantic documents..."),s&&c.info(`${S} Generating llms.txt files...`);const p=c.startTiming(),a=c.startTiming(),m=t.getGlobalConfig("seo"),f=m?.llmstxt,T=C.REDOCLY_EXP_LLMSTXT_AGENT_FEEDBACK_ENABLED??!1,M=L.resolve(t.outdir,G),u=t.getConfig(),O=u.access?.rbac??{},y=t.getAllRoutes(),b=u?.l10n?.defaultLocale||u?.i18n?.defaultLocale||E,I=(f?.excludeFiles||[]).map(e=>j(e)),d=[];if(await P(y,w,async e=>{if(e.excludeFromSearch)return;const $=await Q(e,t),x=await Z(e,$,i,t);if(x){if(s)for(const n of await x.getLLMsTxts()){if(I.some(v=>v(n.fsPath)))continue;const A=K(n.slug),r=L.join(t.outdir,A);F(r);const g=T?U(m,n.slug):void 0,D=g?`
2
2
 
3
- ${L}`:"";await D(r,`${s.content}${A}`),t.setResourceResponseHeaders(g,[{name:"X-Robots-Tag",value:"noindex, follow"},...u.seo?.siteUrl?[{name:"Link",value:`<${j(u.seo.siteUrl,s.slug)}>; rel="canonical"`}]:[]]),s.includeInLLMsTxt&&q(e,u)&&R.push(s)}if(o&&C.isBuildMode){const s=await x.getSearchDocuments();if(!s.length)return;const g=et(e,O),r=e.versions?.find(({active:A})=>A),L=r&&{folder:r.folderId,label:r.label,default:r.default};await ot(s,e.fsPath,g,M,y,L)}}}),o&&a.infoTime(l,"Semantic search documents prepared"),R.length)try{V(f);const e=await W(R,f,{title:m?.title,description:m?.description},i);F(c),await D(c,e),a.infoTime(T,`${S} files generated`)}catch(e){a.error(`${S} Failed to generate llms.txt file. ${e.message}`)}}async function Z(t,i){return t.getStaticData?t.getStaticData(t,i):{}}async function tt(t,i,o,n){if(t.getAiDocumentsStore)return t.getAiDocumentsStore(t,{...i,[h]:t[h],[_]:t[_]},o,n)}function et(t,i){const o=z(t?.[h]);return o?.length?o:Q(t,i)}async function ot(t,i,o,n,c,T){await P(t,w,async l=>{const m=`${Y(i+l.content)}.json`,f=F(p.join(n,m)),d=l.locale===E?c:l.locale;X(f)||await D(f,JSON.stringify({...l,rbacTeams:o||[],version:T,locale:d}),"utf-8")})}export{Dt as prepareSemanticDocuments};
3
+ ${g}`:"";await R(r,`${n.content}${D}`),n.includeInLLMsTxt&&W(e,u)&&d.push(n)}if(o&&C.isBuildMode){const n=await x.getSearchDocuments();if(!n.length)return;const A=tt(e,O),r=e.versions?.find(({active:D})=>D),g=r&&{folder:r.folderId,label:r.label,default:r.default};await et(n,e.fsPath,A,M,b,g)}}}),o&&c.infoTime(a,"Semantic search documents prepared"),d.length)try{J(f);const e=await V(d,f,{title:m?.title,description:m?.description},i);F(l),await R(l,e),c.infoTime(p,`${S} files generated`)}catch(e){c.error(`${S} Failed to generate llms.txt file. ${e.message}`)}}async function Q(t,i){return t.getStaticData?t.getStaticData(t,i):{}}async function Z(t,i,o,s){if(t.getAiDocumentsStore)return t.getAiDocumentsStore(t,{...i,[h]:t[h],[_]:t[_]},o,s)}function tt(t,i){const o=q(t?.[h]);return o?.length?o:z(t,i)}async function et(t,i,o,s,l,p){await P(t,w,async a=>{const m=`${H(i+a.content)}.json`,f=F(L.join(s,m)),T=a.locale===E?l:a.locale;N(f)||await R(f,JSON.stringify({...a,rbacTeams:a.rbacTeams??o??[],version:p,locale:T}),"utf-8")})}export{At as prepareSemanticDocuments};
@@ -1 +1 @@
1
- import{REDOCLY_ROUTE_RBAC as S,REDOCLY_TEAMS_RBAC as g}from"@redocly/config";import{existsSync as A}from"fs";import{rm as B}from"node:fs/promises";import y from"node:path";import{DEFAULT_LOCALE_PLACEHOLDER as H}from"../../../../constants/common.js";import{SEARCH_DATA_EXPORT_FOLDER as D}from"../../../constants/plugins/search.js";import{envConfig as u}from"../../../config/env-config.js";import{logger as s}from"../../../tools/notifiers/logger.js";import{extractTeamsFromScopeItems as M,getRbacTeamsListForResource as P}from"../../../utils/index.js";import{getSearchDocumentGroup as U}from"../utils.js";import{telemetry as V}from"../../../../cli/telemetry/index.js";import{telemetryTraceStep as R}from"../../../../cli/telemetry/helpers/trace-step.js";async function Q(C,r,f){await R("build.plugin.search.prepare_search_documents",async()=>{s.info("Preparing search documents and create indexes...");const n=u.SEARCH_DEV_DEBUG?y.join(r.contentDir,"..","public","client"):r.outdir;(u.SEARCH_DEV_DEBUG||u.isBuildMode)&&A(`${n}/${D}`)&&await B(`${n}/${D}`,{recursive:!0});const b=s.startTiming(),v=r.getConfig().access?.rbac,F=[H,...C.localeFolders.map(a=>a.toLowerCase())];for(const a of F)await R("build.plugin.search.prepare_search_documents.locale",async c=>{const w=r.getAllRoutesForLocale(a);let h=0,T=0;for(const t of w){if(h++,t.excludeFromSearch)continue;const d=new Map,{product:l}=t,L=await t.getStaticData?.(t,r)||{},i=await t.getSearchDocuments?.(t,{...L,[g]:t[g],[S]:t[S]},r),o=t.versions?.find(m=>m.active),x=P(t,v??{});if(i){if(i&&i.length){T+=i.length;for(const m in i){let e=i[m];const _=M(e?.[g]),E=_?.length?_:x,$=e.tags||[];e={...e,...o&&{version:o.version,isDefaultVersion:o.default,versionFolderId:o.folderId},...l&&{product:l},rbacTeams:E,tags:[...$,...E,...o?o.default?["v:default"]:[`v:${o.folderId}:${o.version}`]:["v:default"],...l?[`p:${l.name}`]:[]],url:e.url&&(e.path&&e.path.length>1?e.url:e.url.split("#")[0])};const p=U(e.facets);if(p){const O=d.get(p)??[];d.set(p,[...O,e])}}}for(const[m,e]of d)await f.addDocuments(e,{locale:a,group:m,outDir:n})}}c?.setAttribute("locale",a),c?.setAttribute("totalDocuments",h),c?.setAttribute("totalSearchDocuments",T)});if(f.cleanupFacetValues(r),s.infoTime(b,"Search indexes created"),u.SEARCH_DEV_DEBUG||u.isBuildMode){s.info("Writing out search data...");const a=s.startTiming();await f.export(n);const c=s.infoTime(a,"Search data written");c&&V.sendTimingPerformedMessage(c),A(`${n}/${D}`)||s.warn("No content available for search. Consider hiding search in config.")}})}export{Q as prepareSearchDocuments};
1
+ import{REDOCLY_ROUTE_RBAC as b,REDOCLY_TEAMS_RBAC as g}from"@redocly/config";import{existsSync as A}from"fs";import{rm as O}from"node:fs/promises";import B from"node:path";import{DEFAULT_LOCALE_PLACEHOLDER as H}from"../../../../constants/common.js";import{SEARCH_DATA_EXPORT_FOLDER as D}from"../../../constants/plugins/search.js";import{envConfig as l}from"../../../config/env-config.js";import{logger as i}from"../../../tools/notifiers/logger.js";import{extractTeamsFromScopeItems as M,getRbacTeamsListForResource as P}from"../../../utils/index.js";import{getSearchDocumentGroup as U}from"../utils.js";import{telemetry as V}from"../../../../cli/telemetry/index.js";import{telemetryTraceStep as R}from"../../../../cli/telemetry/helpers/trace-step.js";async function Q(C,r,f){await R("com.redocly.build.plugin.search.prepareSearchDocuments",async()=>{i.info("Preparing search documents and create indexes...");const n=l.SEARCH_DEV_DEBUG?B.join(r.contentDir,"..","public","client"):r.outdir;(l.SEARCH_DEV_DEBUG||l.isBuildMode)&&A(`${n}/${D}`)&&await O(`${n}/${D}`,{recursive:!0});const _=i.startTiming(),v=r.getConfig().access?.rbac,F=[H,...C.localeFolders.map(a=>a.toLowerCase())];for(const a of F)await R("com.redocly.build.plugin.search.prepareSearchDocuments.locale",async c=>{const w=r.getAllRoutesForLocale(a);let h=0,S=0;for(const t of w){if(h++,t.excludeFromSearch)continue;const d=new Map,{product:u}=t,L=await t.getStaticData?.(t,r)||{},s=await t.getSearchDocuments?.(t,{...L,[g]:t[g],[b]:t[b]},r),o=t.versions?.find(m=>m.active),x=P(t,v??{});if(s){if(s&&s.length){S+=s.length;for(const m in s){let e=s[m];const T=M(e?.[g]),E=T?.length?T:x,y=e.tags||[];e={...e,...o&&{version:o.version,isDefaultVersion:o.default,versionFolderId:o.folderId},...u&&{product:u},rbacTeams:E,tags:[...y,...E,...o?o.default?["v:default"]:[`v:${o.folderId}:${o.version}`]:["v:default"],...u?[`p:${u.name}`]:[]],url:e.url&&(e.path&&e.path.length>1?e.url:e.url.split("#")[0])};const p=U(e.facets);if(p){const $=d.get(p)??[];d.set(p,[...$,e])}}}for(const[m,e]of d)await f.addDocuments(e,{locale:a,group:m,outDir:n})}}c?.setAttribute("locale",a),c?.setAttribute("totalDocuments",h),c?.setAttribute("totalSearchDocuments",S)});if(f.cleanupFacetValues(r),i.infoTime(_,"Search indexes created"),l.SEARCH_DEV_DEBUG||l.isBuildMode){i.info("Writing out search data...");const a=i.startTiming();await f.export(n);const c=i.infoTime(a,"Search data written");c&&V.sendTimingPerformedMessage([{id:"buildStep",object:"timing",uri:"urn:redocly:realm:cli:timing:buildStep",...c}]),A(`${n}/${D}`)||i.warn("No content available for search. Consider hiding search in config.")}})}export{Q as prepareSearchDocuments};
@@ -1 +1 @@
1
- import{readFile as w,readdir as y,appendFile as E}from"node:fs/promises";import m from"node:path";import{existsSync as F}from"node:fs";import{SEARCH_GROUP_FACET_FIELD as I,SEARCH_PRODUCT_FIELD as C,SEARCH_VERSION_FIELD as $}from"../../../../../constants/common.js";import{SEARCH_INDEX_FIELDS as A,SEARCH_DATA_EXPORT_FOLDER as _,SEARCH_MAX_INMEMORY_DOCUMENTS_COUNT as O}from"../../../../constants/plugins/search.js";import{telemetryTraceStep as v}from"../../../../telemetry/helpers/trace-step.js";import{envConfig as N}from"../../../../config/env-config.js";import{ensureDir as h}from"../../../../utils/index.js";import{FlexSearchIndex as j}from"./search-index.js";class J{#e=new Map;#s;#t=0;async initIndexSchema(e){this.#s={document:{id:"id",tag:"tags",index:A},worker:!1,tokenize:"forward",context:{depth:2,resolution:9}}}#n(e,s){const n=this.#e.get(e);if(n)return n.find(o=>o.id===s)}#o(e,s){let n=this.#n(e,s);return n||(n=new j(s,this.#s),this.#e.set(e,[...this.#e.get(e)??[],n])),n}async addDocuments(e,s){if(e.length){const{group:n,locale:o,outDir:a}=s,i=this.#o(o,n);for(const c of e)i.add(c),N.isBuildMode&&(this.#t++,this.#t>=O&&await this.exportDocuments(a))}}getIndexesSize(){return this.#e.size}async search(e,s,n){return await v("search",async o=>{const{query:a,locale:i,filter:c,loadMore:r}=e,l=this.#e.get(i)??[];let f=[],d="",x=["v:default"];if(o?.setAttribute("locale",i),c)for(const t of c)t.field===I?f=[...f,...t.values]:t.field===C?d=`p:${t.values[0]}`:t.field===$&&t.values.length&&t.values.length===2&&(x=[...x,`v:${t.values[0]}:${t.values[1]}`]);const g={auth:s,query:a,offset:0,SEARCH_GROUP_FACET_FIELD:I,product:d,versions:x},p=[];let u={facets:{},documents:{}};if(r){const t=this.#n(i,r.groupKey);t&&p.push(t.search({...g,offset:r.offset}))}else for(const t of l)f&&f.length?f.includes(t.id)&&p.push(t.search(g)):p.push(t.search(g));const R=await Promise.all(p);for(const t of R){u.documents={...u.documents,...t.documents};for(const[D,S]of Object.entries(t.facets))u.facets[D]?u.facets[D]=[...u.facets[D],...S]:u.facets[D]=S}return u})}async exportDocuments(e){const s='{"documents":[',n=h(m.join(e,_));for(const[o,a]of this.#e){const i=h(m.join(n,o));for(const c of a){const r=Array.from(c.documents);if(r.length===0)continue;const l=h(m.join(i,`${c.id}.json`)),f=!F(l),d=JSON.stringify(r).substring(1).slice(0,-1),x=f?s+d:","+d;await E(l,x,{encoding:"utf8"}),c.clearDocuments()}}this.#t=0}async exportIndexes(e){const s=h(m.join(e,_));for(const[n,o]of this.#e){const a=h(m.join(s,n));for(const i of o){const c=h(m.join(a,`${i.id}.json`)),r={};await i.export((f,d)=>{r[f]=d});const l=`],"index":${JSON.stringify(r)}}`;await E(c,l,{encoding:"utf8"})}}this.#e.clear()}async import(e){const s=`${e}/${_}`;if(!F(s))return;const n=await y(s);for(const o of n){const a=await y(`${s}/${o}`);for(const i of a){const c=`${s}/${o}/${i}`,r=JSON.parse(await w(c,"utf-8")),l=m.parse(i).name;await this.#o(o,l).import(r)}}}countFacets(e,s,n){const o={};for(const[a,i]of n)o[a]=i.values.map(c=>({value:c,count:0,isCounterVisible:!1}));return o}cleanupFacetValues(e){}}export{J as FlexSearch};
1
+ import{readFile as R,readdir as E,appendFile as F}from"node:fs/promises";import m from"node:path";import{existsSync as I}from"node:fs";import{SEARCH_GROUP_FACET_FIELD as S,SEARCH_PRODUCT_FIELD as w,SEARCH_VERSION_FIELD as C}from"../../../../../constants/common.js";import{SEARCH_INDEX_FIELDS as $,SEARCH_DATA_EXPORT_FOLDER as g,SEARCH_MAX_INMEMORY_DOCUMENTS_COUNT as O}from"../../../../constants/plugins/search.js";import{telemetryTraceStep as v}from"../../../../telemetry/helpers/trace-step.js";import{envConfig as j}from"../../../../config/env-config.js";import{ensureDir as h}from"../../../../utils/index.js";import{FlexSearchIndex as N}from"./search-index.js";class B{#e=new Map;#s;#t=0;async initIndexSchema(e){this.#s={document:{id:"id",tag:"tags",index:$},worker:!1,tokenize:"forward",context:{depth:2,resolution:9}}}#o(e,o){const i=this.#e.get(e);if(i)return i.find(t=>t.id===o)}#i(e,o){let i=this.#o(e,o);return i||(i=new N(o,this.#s),this.#e.set(e,[...this.#e.get(e)??[],i])),i}async addDocuments(e,o){if(e.length){const{group:i,locale:t,outDir:c}=o,n=this.#i(t,i);for(const r of e)n.add(r),j.isBuildMode&&(this.#t++,this.#t>=O&&await this.exportDocuments(c))}}getIndexesSize(){return this.#e.size}async search(e,o,i){return await v("com.redocly.search.performed",async t=>{t?.setAttribute("id","searchQueryId"),t?.setAttribute("object","searchQuery"),t?.setAttribute("uri","urn:redocly:realm:api:searchQuery:searchQueryId");const{query:c,locale:n,filter:r,loadMore:a}=e,l=this.#e.get(n)??[];let f=[],d="",x=["v:default"];if(t?.setAttribute("locale",n),r)for(const s of r)s.field===S?f=[...f,...s.values]:s.field===w?d=`p:${s.values[0]}`:s.field===C&&s.values.length&&s.values.length===2&&(x=[...x,`v:${s.values[0]}:${s.values[1]}`]);const D={auth:o,query:c,offset:0,SEARCH_GROUP_FACET_FIELD:S,product:d,versions:x},p=[];let u={facets:{},documents:{}};if(a){const s=this.#o(n,a.groupKey);s&&p.push(s.search({...D,offset:a.offset}))}else for(const s of l)f&&f.length?f.includes(s.id)&&p.push(s.search(D)):p.push(s.search(D));const A=await Promise.all(p);for(const s of A){u.documents={...u.documents,...s.documents};for(const[y,_]of Object.entries(s.facets))u.facets[y]?u.facets[y]=[...u.facets[y],..._]:u.facets[y]=_}return u})}async exportDocuments(e){const o='{"documents":[',i=h(m.join(e,g));for(const[t,c]of this.#e){const n=h(m.join(i,t));for(const r of c){const a=Array.from(r.documents);if(a.length===0)continue;const l=h(m.join(n,`${r.id}.json`)),f=!I(l),d=JSON.stringify(a).substring(1).slice(0,-1),x=f?o+d:","+d;await F(l,x,{encoding:"utf8"}),r.clearDocuments()}}this.#t=0}async exportIndexes(e){const o=h(m.join(e,g));for(const[i,t]of this.#e){const c=h(m.join(o,i));for(const n of t){const r=h(m.join(c,`${n.id}.json`)),a={};await n.export((f,d)=>{a[f]=d});const l=`],"index":${JSON.stringify(a)}}`;await F(r,l,{encoding:"utf8"})}}this.#e.clear()}async import(e){const o=`${e}/${g}`;if(!I(o))return;const i=await E(o);for(const t of i){const c=await E(`${o}/${t}`);for(const n of c){const r=`${o}/${t}/${n}`,a=JSON.parse(await R(r,"utf-8")),l=m.parse(n).name;await this.#i(t,l).import(a)}}}countFacets(e,o,i){const t={};for(const[c,n]of i)t[c]=n.values.map(r=>({value:r,count:0,isCounterVisible:!1}));return t}cleanupFacetValues(e){}}export{B as FlexSearch};
@@ -1 +1 @@
1
- import I from"flexsearch";import{REDOCLY_TEAMS_RBAC as S}from"@redocly/config";import{DISABLE_DEEP_LINK_IF_FIELDS_EXIST as L,SEARCH_LIMIT as w}from"../../../../constants/plugins/search.js";import{telemetryTraceStep as D}from"../../../../telemetry/helpers/trace-step.js";import{highlightTextForSearch as p}from"../../../../utils/search/highlight-text-for-search.js";class y{#e;#t=new Map;#s=1;id;constructor(e,t){this.id=e,this.#e=new I.Document(t)}get documents(){return this.#t.entries()}get documentsCount(){return this.#s}clearDocuments(){this.#t.clear()}async export(e){await this.#e.export(e)}async import(e){const{documents:t,index:s}=e;this.#t.clear();for(const[r,i]of t)this.#t.set(r,i);for(const[r,i]of Object.entries(s))await this.#e.import(r,i)}add(e){e.tags||(e.tags=[]),this.#t.set(this.#s,e[S]?e:{...e,[S]:void 0}),this.#e.add(this.#s,e),this.#s++}async search(e){return await D("search",async t=>{const{query:s,offset:r,auth:i,product:o,versions:a}=e,n=[],c=i.teams,h={limit:w,offset:r};let m=new Map,u=await this.#e.searchAsync(s,{...h,tag:c});if(o){const l=await this.#e.searchAsync(s,{...h,tag:o});u=this.#i(u,l),t?.setAttribute("product",o)}if(a&&a.length){const l=await this.#e.searchAsync(s,{...h,tag:a});u=this.#i(u,l),t?.setAttribute("versions",a.join(","))}for(const l of u)for(const d of l.result){const f=m.get(d)?.fields||[];m.set(d,{fields:l.field?[...f,l.field]:[...f]})}let g=0;for(const[l,d]of m.entries()){if(g>=w)break;const f=this.#t.get(l);f&&!this.#n(f,a)&&(n.push({document:this.#o(f,s,d.fields),highlight:this.#a(f,s,d.fields)}),g++)}return{documents:{[this.id]:n},facets:{}}})}#o(e,t,s){return this.#c(e,t,s)}#a(e,t,s){const r={};let i=!1;for(const o of s)if(o==="path")r.path=e.path?e.path.map(a=>p(t,a)):[];else if(o.includes("parameters")){if(!i){const a=o.split(":")[1],n=e.parameters?.find(c=>{const h=c[a];return this.#r(t,typeof h=="boolean"?h.toString():h)});n&&(r.parameters=[{name:p(t,n.name),description:p(t,n.description),place:p(t,n.place),path:n.path?n.path.map(c=>p(t,c)):[]}],i=!0)}}else r[o]=p(t,e[o]);return r}#r=(e,t)=>{if(t){const s=e.split(/\s+/g);return Array.isArray(t)?t.some(r=>s.some(i=>r.toLowerCase().includes(i.toLowerCase()))):s.some(r=>t.toLowerCase().includes(r.toLowerCase()))}else return!1};#i(e,t){const s=[];for(const r of e){const i=[];for(const o of t)for(const a of r.result){const n=o.result.find(c=>c===a);n&&i.push(n)}i.length&&s.push({result:i,field:r.field})}return s}#n(e,t){return!!(t&&t.length&&e.isDefaultVersion&&e.versionFolderId&&e.version&&t.some(s=>s.includes(e.versionFolderId??""))&&!t.some(s=>s.includes(e.version??"")))}#c(e,t,s){for(const i of L)if(s.some(o=>o===i))return e;let r;for(const i of s)if(i.includes("parameters")){const o=i.split(":")[1],a=e.parameters?.find(n=>{const c=n[o];return this.#r(t,typeof c=="boolean"?c.toString():c)});if(a){r=a.deepLink;break}}if(r){const i=r.split("#")[1];return{...e,url:`${e.url}#${i}`}}return e}}export{y as FlexSearchIndex};
1
+ import S from"flexsearch";import{REDOCLY_TEAMS_RBAC as I}from"@redocly/config";import{DISABLE_DEEP_LINK_IF_FIELDS_EXIST as w,SEARCH_LIMIT as y}from"../../../../constants/plugins/search.js";import{telemetryTraceStep as A}from"../../../../telemetry/helpers/trace-step.js";import{highlightTextForSearch as u}from"../../../../utils/search/highlight-text-for-search.js";class C{#e;#t=new Map;#s=1;id;constructor(e,t){this.id=e,this.#e=new S.Document(t)}get documents(){return this.#t.entries()}get documentsCount(){return this.#s}clearDocuments(){this.#t.clear()}async export(e){await this.#e.export(e)}async import(e){const{documents:t,index:s}=e;this.#t.clear();for(const[r,i]of t)this.#t.set(r,i);for(const[r,i]of Object.entries(s))await this.#e.import(r,i)}add(e){e.tags||(e.tags=[]),this.#t.set(this.#s,e[I]?e:{...e,[I]:void 0}),this.#e.add(this.#s,e),this.#s++}async search(e){return await A("com.redocly.search.performed",async t=>{t?.setAttribute("id","searchQueryId"),t?.setAttribute("object","searchQuery"),t?.setAttribute("uri","urn:redocly:realm:api:searchQuery:searchQueryId");const{query:s,offset:r,auth:i,product:o,versions:a}=e,n=[],c=i.teams,l={limit:y,offset:r};let m=new Map,d=await this.#e.searchAsync(s,{...l,tag:c});if(o){const h=await this.#e.searchAsync(s,{...l,tag:o});d=this.#i(d,h),t?.setAttribute("product",o)}if(a&&a.length){const h=await this.#e.searchAsync(s,{...l,tag:a});d=this.#i(d,h),t?.setAttribute("versions",a.join(","))}for(const h of d)for(const p of h.result){const f=m.get(p)?.fields||[];m.set(p,{fields:h.field?[...f,h.field]:[...f]})}let g=0;for(const[h,p]of m.entries()){if(g>=y)break;const f=this.#t.get(h);f&&!this.#n(f,a)&&(n.push({document:this.#o(f,s,p.fields),highlight:this.#a(f,s,p.fields)}),g++)}return{documents:{[this.id]:n},facets:{}}})}#o(e,t,s){return this.#c(e,t,s)}#a(e,t,s){const r={};let i=!1;for(const o of s)if(o==="path")r.path=e.path?e.path.map(a=>u(t,a)):[];else if(o.includes("parameters")){if(!i){const a=o.split(":")[1],n=e.parameters?.find(c=>{const l=c[a];return this.#r(t,typeof l=="boolean"?l.toString():l)});n&&(r.parameters=[{name:u(t,n.name),description:u(t,n.description),place:u(t,n.place),path:n.path?n.path.map(c=>u(t,c)):[]}],i=!0)}}else r[o]=u(t,e[o]);return r}#r=(e,t)=>{if(t){const s=e.split(/\s+/g);return Array.isArray(t)?t.some(r=>s.some(i=>r.toLowerCase().includes(i.toLowerCase()))):s.some(r=>t.toLowerCase().includes(r.toLowerCase()))}else return!1};#i(e,t){const s=[];for(const r of e){const i=[];for(const o of t)for(const a of r.result){const n=o.result.find(c=>c===a);n&&i.push(n)}i.length&&s.push({result:i,field:r.field})}return s}#n(e,t){return!!(t&&t.length&&e.isDefaultVersion&&e.versionFolderId&&e.version&&t.some(s=>s.includes(e.versionFolderId??""))&&!t.some(s=>s.includes(e.version??"")))}#c(e,t,s){for(const i of w)if(s.some(o=>o===i))return e;let r;for(const i of s)if(i.includes("parameters")){const o=i.split(":")[1],a=e.parameters?.find(n=>{const c=n[o];return this.#r(t,typeof c=="boolean"?c.toString():c)});if(a){r=a.deepLink;break}}if(r){const i=r.split("#")[1];return{...e,url:`${e.url}#${i}`}}return e}}export{C as FlexSearchIndex};
@@ -10,7 +10,7 @@ export declare class SearchEngine {
10
10
  initIndexSchema(searchFacets: Map<string, SearchFacet>): Promise<void>;
11
11
  addDocuments(documents: SearchDocument[], params: AddDocumentsParams): Promise<void>;
12
12
  search(params: SearchRequestParams, auth: AuthDetails, facets?: Map<string, SearchFacet>): Promise<SearchResponse>;
13
- countFacets(params: FacetCountsRequestParams, auth: AuthDetails, facets: Map<string, SearchFacet>): Promise<Record<string, import("@redocly/theme/core/types").SearchFacetCount[]>>;
13
+ countFacets(params: FacetCountsRequestParams, auth: AuthDetails, facets: Map<string, SearchFacet>): Promise<Record<string, import("@redocly/theme").SearchFacetCount[]>>;
14
14
  export(outDir: string): Promise<void>;
15
15
  import(sourceDir: string): Promise<void>;
16
16
  cleanupFacetValues(actions: AfterRoutesCreatedActions): void;
@@ -1 +1 @@
1
- import{appendFile as g}from"node:fs/promises";import{existsSync as I}from"node:fs";import m from"node:path";import{Client as $}from"typesense";import{SEARCH_GROUP_FACET_FIELD as E,SEARCH_PRODUCT_FIELD as R,SEARCH_RBAC_FIELD as A,SEARCH_VERSION_FIELD as f}from"../../../../../constants/common.js";import{BASE_SEARCH_DOCUMENT as T,DISABLE_DEEP_LINK_IF_FIELDS_EXIST as O,HIGHLIGHTED_TEXT_MAX_LENGTH as b,SEARCH_DATA_EXPORT_FOLDER as F,SEARCH_DOCUMENT_METADATA_KEY as P,SEARCH_GROUP_LIMIT as N,SEARCH_MAX_FACET_VALUES as S,SEARCH_MAX_INMEMORY_DOCUMENTS_COUNT as C}from"../../../../constants/plugins/search.js";import{telemetryTraceStep as D}from"../../../../telemetry/helpers/trace-step.js";import{envConfig as p}from"../../../../config/env-config.js";import{ensureDir as d}from"../../../../utils/index.js";class U{#e=null;#r="";#t=[{name:"title",type:"string",facet:!1,optional:!0},{name:"text",type:"string",facet:!1,optional:!0},{name:"path",type:"string[]",facet:!1,optional:!0},{name:"isAdditionalOperation",type:"bool",facet:!1,optional:!0,queryable:!1},{name:"deprecated",type:"bool",facet:!1,optional:!0,queryable:!1},{name:"parameters",type:"object[]",facet:!1,optional:!0},{name:R,type:"string",facet:!0,optional:!0},{name:f,type:"object",facet:!0,optional:!0},{name:A,type:"string[]",facet:!0},{name:"metadata_curated",type:"bool",facet:!1,optional:!0,queryable:!1},{name:"metadata_keywords_excludes",type:"string[]",facet:!1,optional:!0,queryable:!1},{name:"metadata_keywords_includes",type:"string[]",facet:!1,optional:!0,queryable:!1}];#s=new Map;#n={ORGANIZATION_ID:p.ORGANIZATION_ID??"",PROJECT_ID:p.PROJECT_ID??"",TYPESENSE_API_URL:p.TYPESENSE_API_URL??"",TYPESENSE_API_KEY:p.TYPESENSE_API_KEY??""};constructor(){if(!p.isBuildMode){for(const[e,t]of Object.entries(this.#n))if(!t)throw new Error(`Cannot initialize search index. ${e} is not set`);this.#r=`${this.#n.ORGANIZATION_ID}_${this.#n.PROJECT_ID}_`,this.#e=new $({nodes:[{url:this.#n.TYPESENSE_API_URL}],apiKey:this.#n.TYPESENSE_API_KEY,connectionTimeoutSeconds:5})}}async initIndexSchema(e){this.#p(e)}async addDocuments(e,t){e.push(T);const{locale:n,outDir:o}=t,s=e.map(i=>{const r={...i},c=i[P];return c&&(c.curated&&(r.metadata_curated=c.curated),c.excludes&&(r.metadata_keywords_excludes=c.excludes),c.includes&&(r.metadata_keywords_includes=c.includes)),r}),a=this.#s.get(n)??[];this.#s.set(n,a.concat(s)),a.length+e.length>=C&&await this.exportDocuments(o)}async search(e,t){return await D("search",async n=>{const{query:o,locale:s,filter:a,loadMore:i}=e,r=this.#c(s),c={collection:r,q:o||"*",query_by:this.#l(),max_facet_values:S};if(n?.setAttribute("collectionName",r),n?.setAttribute("locale",s),this.#e)if(i){const{groupKey:l,offset:u}=i,h={offset:u,filter_by:this.#o(t,a),facet_by:"*"};return n?.setAttribute("isLoadMore",!0),n?.setAttribute("filter",h.filter_by),this.#u(await this.#e.collections(r).documents().search({...c,...h}),l)}else{const l={group_by:this.#m(),group_limit:N,filter_by:this.#o(t,a)};n?.setAttribute("groups",l.group_by),n?.setAttribute("filter",l.filter_by);const u=[l,...this.#y(t,a)];return this.#f(await this.#e?.multiSearch.perform({searches:u},c),a)}else return{facets:{},documents:{}}})}#u(e,t){const n={facets:{},documents:{[t]:[]}};if(e.hits&&e.hits.length)for(const o of e.hits)n.documents[t].push({document:this.#a(o),highlight:this.#i(o)});return n}#f(e,t){const n={facets:{},documents:{}};for(const o of this.#_(t))n.documents[o]=[];if("results"in e)for(const o of e.results){if(o.facet_counts&&o.facet_counts.length)for(const s of o.facet_counts)n.facets[s.field_name]=s.counts.map(a=>({value:a.value,count:a.count}));if(o.grouped_hits&&o.grouped_hits.length)for(const s of o.grouped_hits){const a=s.group_key[0],i=[];for(const r of s.hits)i.push({document:this.#a(r),highlight:this.#i(r)});n.documents[a]=i}}return n}#a(e){return this.#h(e)}#i(e){const t={},n=[];for(const[o,s]of Object.entries(e.highlight??{}))if(Array.isArray(s)){if(o==="path"){const a=s,i=[];for(const r of a)i.push(r.snippet);t.path=i}else if(o==="parameters"){const a=s;for(const i of a){let r=!1;for(const[c,l]of Object.entries(i))if(c!=="deepLink")if(Array.isArray(l))for(const u of l)u.matched_tokens?.length&&(r=!0);else l.matched_tokens?.length&&(r=!0);if(r){const c={name:i.name?.snippet||"",description:i.description?.snippet||"",place:i.place?.snippet||"",path:i.path?.map(l=>l?.snippet)||[]};t.parameters=[c];break}}}}else t[o]=s.snippet,n.push(o);for(const[o,s]of Object.entries(e.document))!n.includes(o)&&typeof s=="string"&&(t[o]=s.length>b?`${s.substring(0,b)}...`:s);return t.parameters||(t.parameters=[]),t}#h(e){let t;const n=Object.keys(e.highlight);for(const s of O)if(n.some(a=>a===s))return e.document;const o=e.highlight.parameters;if(o){for(const s of o)for(const[a,i]of Object.entries(s))if(a!=="deepLink"){if(Array.isArray(i)){for(const r of i)if(r.matched_tokens?.length){t=s.deepLink.snippet;break}}else if(i.matched_tokens?.length){t=s.deepLink.snippet;break}}}if(t){const s=t.split("#")[1];return{...e.document,url:`${e.document.url}#${s}`}}return e.document}async exportDocuments(e){const t='{"documents":[',n=d(m.join(e,F));for(const[o,s]of this.#s){if(s.length===0)continue;const a=d(m.join(n,`${o}.json`)),i=!I(a),r=JSON.stringify(s).substring(1).slice(0,-1),c=i?t+r:","+r;await g(a,c,{encoding:"utf8"}),this.#s.set(o,[])}}async exportIndexes(e){const t=d(m.join(e,F));for(const n of this.#s.keys()){const o=d(m.join(t,`${n}.json`)),s=`],"schemaFields":${JSON.stringify(this.#t)}}`;await g(o,s,{encoding:"utf8"})}}async import(e){}async countFacets(e,t){return await D("search.facets",async n=>{const{locale:o,query:s,facetQuery:a,filter:i,field:r}=e,c=this.#c(o),l={q:s||"*",query_by:this.#l(),facet_by:"*",facet_query:this.#d(a,r),filter_by:this.#o(t,i,r),max_facet_values:S};if(n?.setAttribute("collectionName",c),n?.setAttribute("query",l.q),n?.setAttribute("facetQuery",l.facet_query),n?.setAttribute("filter",l.filter_by),this.#e){const u={},h=await this.#e.collections(c).documents().search(l);if(h.facet_counts&&h.facet_counts.length)for(const _ of h.facet_counts)u[_.field_name]=_.counts.map(y=>({value:y.value,count:y.count,isCounterVisible:!!s||(i?.length||0)>0}));return u}else return{}})}#c(e){return`${this.#r}${e}`}#p(e){for(const[t,{queryable:n}]of e)this.#t.find(o=>o.name===t)||this.#t.push({queryable:n,name:t,type:"string",facet:!0,optional:!0})}#l(){return this.#t.filter(e=>e.facet?e.queryable:e.queryable!==!1).map(e=>e.name).join(",")}#m(){return this.#t.filter(e=>e.facet&&e.name===E).map(e=>e.name).join(",")}#o(e,t,n){const o=`${A}:[${e.teams.map(a=>`'${a}'`).join(", ")}]`;let s=`${f}.isDefault:true`;if(t&&t.length){const a=t.filter(r=>r.field!==n&&r.field!==f).map(r=>{const c=r.values.map(l=>`'${l}'`);return c.length?`${r.field}:=[${c.join(", ")}]`:""}).join(" && "),i=t.find(r=>r.field===f);if(i&&i.values.length&&i.values.length===2){const r=i.values[0],c=i.values[1],l=`(${f}.folderId:! ${r} && ${f}.isDefault:true)`,u=`(${f}.folderId: ${r} && ${f}.version:='${c}')`;s=`(${l} || ${u})`}return a?`${o} && ${a} && ${s}`:`${o} && ${s}`}else return`${o} && ${s}`}#d(e,t){return e&&t?`${t}:${e}`:""}#_(e){const t=[];if(e&&e.length)for(const n of e)n.field===E&&t.push(...n.values);return t}#y(e,t){const n=[],o=this.#t.filter(s=>s.facet);for(const s of o){const a={facet_by:s.name,filter_by:this.#o(e,t,s.name)};n.push(a)}return n}cleanupFacetValues(e){const t=e.getSearchFacets();t.forEach(n=>{n.values=[]}),e.setSearchFacets(t)}}export{U as Typesense};
1
+ import{appendFile as g}from"node:fs/promises";import{existsSync as $}from"node:fs";import m from"node:path";import{Client as R}from"typesense";import{SEARCH_GROUP_FACET_FIELD as E,SEARCH_PRODUCT_FIELD as S,SEARCH_RBAC_FIELD as b,SEARCH_VERSION_FIELD as f}from"../../../../../constants/common.js";import{BASE_SEARCH_DOCUMENT as T,DISABLE_DEEP_LINK_IF_FIELDS_EXIST as O,HIGHLIGHTED_TEXT_MAX_LENGTH as A,SEARCH_DATA_EXPORT_FOLDER as F,SEARCH_DOCUMENT_METADATA_KEY as P,SEARCH_GROUP_LIMIT as N,SEARCH_MAX_FACET_VALUES as I,SEARCH_MAX_INMEMORY_DOCUMENTS_COUNT as C}from"../../../../constants/plugins/search.js";import{telemetryTraceStep as D}from"../../../../telemetry/helpers/trace-step.js";import{envConfig as p}from"../../../../config/env-config.js";import{ensureDir as d}from"../../../../utils/index.js";class U{#e=null;#n="";#t=[{name:"title",type:"string",facet:!1,optional:!0},{name:"text",type:"string",facet:!1,optional:!0},{name:"path",type:"string[]",facet:!1,optional:!0},{name:"isAdditionalOperation",type:"bool",facet:!1,optional:!0,queryable:!1},{name:"deprecated",type:"bool",facet:!1,optional:!0,queryable:!1},{name:"parameters",type:"object[]",facet:!1,optional:!0},{name:S,type:"string",facet:!0,optional:!0},{name:f,type:"object",facet:!0,optional:!0},{name:b,type:"string[]",facet:!0},{name:"metadata_curated",type:"bool",facet:!1,optional:!0,queryable:!1},{name:"metadata_keywords_excludes",type:"string[]",facet:!1,optional:!0,queryable:!1},{name:"metadata_keywords_includes",type:"string[]",facet:!1,optional:!0,queryable:!1}];#s=new Map;#r={ORGANIZATION_ID:p.ORGANIZATION_ID??"",PROJECT_ID:p.PROJECT_ID??"",TYPESENSE_API_URL:p.TYPESENSE_API_URL??"",TYPESENSE_API_KEY:p.TYPESENSE_API_KEY??""};constructor(){if(!p.isBuildMode){for(const[e,t]of Object.entries(this.#r))if(!t)throw new Error(`Cannot initialize search index. ${e} is not set`);this.#n=`${this.#r.ORGANIZATION_ID}_${this.#r.PROJECT_ID}_`,this.#e=new R({nodes:[{url:this.#r.TYPESENSE_API_URL}],apiKey:this.#r.TYPESENSE_API_KEY,connectionTimeoutSeconds:5})}}async initIndexSchema(e){this.#p(e)}async addDocuments(e,t){e.push(T);const{locale:s,outDir:o}=t,r=e.map(i=>{const n={...i},c=i[P];return c&&(c.curated&&(n.metadata_curated=c.curated),c.excludes&&(n.metadata_keywords_excludes=c.excludes),c.includes&&(n.metadata_keywords_includes=c.includes)),n}),a=this.#s.get(s)??[];this.#s.set(s,a.concat(r)),a.length+e.length>=C&&await this.exportDocuments(o)}async search(e,t){return await D("com.redocly.search.performed",async s=>{s?.setAttribute("id","searchQueryId"),s?.setAttribute("object","searchQuery"),s?.setAttribute("uri","urn:redocly:realm:api:searchQuery:searchQueryId");const{query:o,locale:r,filter:a,loadMore:i}=e,n=this.#c(r),c={collection:n,q:o||"*",query_by:this.#l(),max_facet_values:I};if(s?.setAttribute("collectionName",n),s?.setAttribute("locale",r),this.#e)if(i){const{groupKey:l,offset:u}=i,h={offset:u,filter_by:this.#o(t,a),facet_by:"*"};return s?.setAttribute("isLoadMore",!0),s?.setAttribute("filter",h.filter_by),this.#u(await this.#e.collections(n).documents().search({...c,...h}),l)}else{const l={group_by:this.#m(),group_limit:N,filter_by:this.#o(t,a)};s?.setAttribute("groups",l.group_by),s?.setAttribute("filter",l.filter_by);const u=[l,...this.#y(t,a)];return this.#f(await this.#e?.multiSearch.perform({searches:u},c),a)}else return{facets:{},documents:{}}})}#u(e,t){const s={facets:{},documents:{[t]:[]}};if(e.hits&&e.hits.length)for(const o of e.hits)s.documents[t].push({document:this.#a(o),highlight:this.#i(o)});return s}#f(e,t){const s={facets:{},documents:{}};for(const o of this.#_(t))s.documents[o]=[];if("results"in e)for(const o of e.results){if(o.facet_counts&&o.facet_counts.length)for(const r of o.facet_counts)s.facets[r.field_name]=r.counts.map(a=>({value:a.value,count:a.count}));if(o.grouped_hits&&o.grouped_hits.length)for(const r of o.grouped_hits){const a=r.group_key[0],i=[];for(const n of r.hits)i.push({document:this.#a(n),highlight:this.#i(n)});s.documents[a]=i}}return s}#a(e){return this.#h(e)}#i(e){const t={},s=[];for(const[o,r]of Object.entries(e.highlight??{}))if(Array.isArray(r)){if(o==="path"){const a=r,i=[];for(const n of a)i.push(n.snippet);t.path=i}else if(o==="parameters"){const a=r;for(const i of a){let n=!1;for(const[c,l]of Object.entries(i))if(c!=="deepLink")if(Array.isArray(l))for(const u of l)u.matched_tokens?.length&&(n=!0);else l.matched_tokens?.length&&(n=!0);if(n){const c={name:i.name?.snippet||"",description:i.description?.snippet||"",place:i.place?.snippet||"",path:i.path?.map(l=>l?.snippet)||[]};t.parameters=[c];break}}}}else t[o]=r.snippet,s.push(o);for(const[o,r]of Object.entries(e.document))!s.includes(o)&&typeof r=="string"&&(t[o]=r.length>A?`${r.substring(0,A)}...`:r);return t.parameters||(t.parameters=[]),t}#h(e){let t;const s=Object.keys(e.highlight??{});for(const r of O)if(s.some(a=>a===r))return e.document;const o=e.highlight?.parameters;if(o){for(const r of o)for(const[a,i]of Object.entries(r))if(a!=="deepLink"){if(Array.isArray(i)){for(const n of i)if(n.matched_tokens?.length){t=r.deepLink?.snippet??t;break}}else if(i.matched_tokens?.length){t=r.deepLink?.snippet??t;break}}}if(t){const r=t.split("#")[1];return{...e.document,url:`${e.document.url}#${r}`}}return e.document}async exportDocuments(e){const t='{"documents":[',s=d(m.join(e,F));for(const[o,r]of this.#s){if(r.length===0)continue;const a=d(m.join(s,`${o}.json`)),i=!$(a),n=JSON.stringify(r).substring(1).slice(0,-1),c=i?t+n:","+n;await g(a,c,{encoding:"utf8"}),this.#s.set(o,[])}}async exportIndexes(e){const t=d(m.join(e,F));for(const s of this.#s.keys()){const o=d(m.join(t,`${s}.json`)),r=`],"schemaFields":${JSON.stringify(this.#t)}}`;await g(o,r,{encoding:"utf8"})}}async import(e){}async countFacets(e,t){return await D("com.redocly.search.facets",async s=>{s?.setAttribute("id","searchFacetsId"),s?.setAttribute("object","searchFacets"),s?.setAttribute("uri","urn:redocly:realm:api:searchFacets:searchFacetsId");const{locale:o,query:r,facetQuery:a,filter:i,field:n}=e,c=this.#c(o),l={q:r||"*",query_by:this.#l(),facet_by:"*",facet_query:this.#d(a,n),filter_by:this.#o(t,i,n),max_facet_values:I};if(s?.setAttribute("collectionName",c),s?.setAttribute("query",l.q),s?.setAttribute("facetQuery",l.facet_query),s?.setAttribute("filter",l.filter_by),this.#e){const u={},h=await this.#e.collections(c).documents().search(l);if(h.facet_counts&&h.facet_counts.length)for(const _ of h.facet_counts)u[_.field_name]=_.counts.map(y=>({value:y.value,count:y.count,isCounterVisible:!!r||(i?.length||0)>0}));return u}else return{}})}#c(e){return`${this.#n}${e}`}#p(e){for(const[t,{queryable:s}]of e)this.#t.find(o=>o.name===t)||this.#t.push({queryable:s,name:t,type:"string",facet:!0,optional:!0})}#l(){return this.#t.filter(e=>e.facet?e.queryable:e.queryable!==!1).map(e=>e.name).join(",")}#m(){return this.#t.filter(e=>e.facet&&e.name===E).map(e=>e.name).join(",")}#o(e,t,s){const o=`${b}:[${e.teams.map(a=>`'${a}'`).join(", ")}]`;let r=`${f}.isDefault:true`;if(t&&t.length){const a=t.filter(n=>n.field!==s&&n.field!==f).map(n=>{const c=n.values.map(l=>`'${l}'`);return c.length?`${n.field}:=[${c.join(", ")}]`:""}).join(" && "),i=t.find(n=>n.field===f);if(i&&i.values.length&&i.values.length===2){const n=i.values[0],c=i.values[1],l=`(${f}.folderId:! ${n} && ${f}.isDefault:true)`,u=`(${f}.folderId: ${n} && ${f}.version:='${c}')`;r=`(${l} || ${u})`}return a?`${o} && ${a} && ${r}`:`${o} && ${r}`}else return`${o} && ${r}`}#d(e,t){return e&&t?`${t}:${e}`:""}#_(e){const t=[];if(e&&e.length)for(const s of e)s.field===E&&t.push(...s.values);return t}#y(e,t){const s=[],o=this.#t.filter(r=>r.facet);for(const r of o){const a={facet_by:r.name,filter_by:this.#o(e,t,r.name)};s.push(a)}return s}cleanupFacetValues(e){const t=e.getSearchFacets();t.forEach(s=>{s.values=[]}),e.setSearchFacets(t)}}export{U as Typesense};
@@ -1 +1 @@
1
- import{DEFAULT_SEARCH_ENGINE as s,REDOCLY_TEAMS_RBAC as E}from"@redocly/config";import{envConfig as c}from"../../config/env-config.js";import{logger as p}from"../../tools/notifiers/logger.js";import{reporter as u}from"../../tools/notifiers/reporter.js";import{prepareSearchDocuments as S}from"./documents/search-documents.js";import{SearchEngine as b}from"./engines/search-engine.js";import{prepareSemanticDocuments as D}from"./ai-indexer/prepare-semantic-documents.js";import{isAiSearchEnabled as y,shouldGenerateEmbeddings as A}from"./utils.js";import{telemetryTraceStep as C}from"../../../cli/telemetry/helpers/trace-step.js";import{EntitlementsProvider as R}from"../../entitlements/entitlements-provider.js";async function k(){let e=!0;return{async afterRoutesCreated(t,n){(c.SEARCH_DEV_REINIT||e)&&await _(t,n),e=!1},id:"search"}}async function _(e,t){await C("build.plugin.search",async n=>{const r=e.getConfig();if(n?.setAttribute("config",JSON.stringify(r.search||{})),r.search?.hide){p.info("Search is disabled in the config, skipping");return}const o=r.search?.engine||s,m=c.isDevelopMode?c.SEARCH_DEV_DEBUG?o:s:o,{l10n:l}=e.getGlobalData(),d=y(r),i=r.access?.rbac?.features?.aiSearch,f=A(r);let a;try{a=new b(m,l)}catch(g){await u.panic(g);return}await a.initIndexSchema(e.getSearchFacets()),e.setSearchEngine(a),e.setGlobalData({searchFeatures:{advanced:{enabled:m!==s&&!r.search?.filters?.hide},ai:{enabled:d,[E]:i&&Object.keys(i).length?i:void 0}}}),await S(t.fs,e,a);const h=R.instance().canAccessFeature("seo")===!0&&r.seo?.llmstxt?.hide!==!0;await D(e,t,{embeddingsEnabled:f,llmstxtEnabled:h})})}export{k as searchPlugin};
1
+ import{DEFAULT_SEARCH_ENGINE as s,REDOCLY_TEAMS_RBAC as E}from"@redocly/config";import{envConfig as c}from"../../config/env-config.js";import{logger as p}from"../../tools/notifiers/logger.js";import{reporter as u}from"../../tools/notifiers/reporter.js";import{prepareSearchDocuments as S}from"./documents/search-documents.js";import{SearchEngine as b}from"./engines/search-engine.js";import{prepareSemanticDocuments as y}from"./ai-indexer/prepare-semantic-documents.js";import{isAiSearchEnabled as D,shouldGenerateEmbeddings as A}from"./utils.js";import{telemetryTraceStep as C}from"../../../cli/telemetry/helpers/trace-step.js";import{EntitlementsProvider as R}from"../../entitlements/entitlements-provider.js";async function k(){let e=!0;return{async afterRoutesCreated(t,n){(c.SEARCH_DEV_REINIT||e)&&await _(t,n),e=!1},id:"search"}}async function _(e,t){await C("com.redocly.build.plugin.search",async n=>{const r=e.getConfig();if(n?.setAttribute("config",JSON.stringify(r.search||{})),r.search?.hide){p.info("Search is disabled in the config, skipping");return}const o=r.search?.engine||s,m=c.isDevelopMode?c.SEARCH_DEV_DEBUG?o:s:o,{l10n:l}=e.getGlobalData(),d=D(r),i=r.access?.rbac?.features?.aiSearch,f=A(r);let a;try{a=new b(m,l)}catch(g){await u.panic(g);return}await a.initIndexSchema(e.getSearchFacets()),e.setSearchEngine(a),e.setGlobalData({searchFeatures:{advanced:{enabled:m!==s&&!r.search?.filters?.hide},ai:{enabled:d,[E]:i&&Object.keys(i).length?i:void 0}}}),await S(t.fs,e,a);const h=R.instance().canAccessFeature("seo")===!0&&r.seo?.llmstxt?.hide!==!0;await y(e,t,{embeddingsEnabled:f,llmstxtEnabled:h})})}export{k as searchPlugin};
@@ -5,7 +5,7 @@ export declare function generateLLMsTxt(llmstxts: LLMsTxt[], llmstxtConfig: SeoC
5
5
  title?: string;
6
6
  description?: string;
7
7
  } | undefined, context: AfterRoutesCreatedLifecycleContext): Promise<string>;
8
- export declare function llmsTxtLink({ title, description, slug }: {
8
+ export declare function llmsTxtLink({ title, description, slug, }: {
9
9
  title: LLMsTxt['title'];
10
10
  description: LLMsTxt['description'];
11
11
  slug: LLMsTxt['slug'];
@@ -1,4 +1,4 @@
1
- import d from"picomatch";import{dirname as T,resolve as x}from"node:path";import{access as $,readFile as E,constants as F}from"fs/promises";import{removeTrailingSlash as w}from"../../../../utils/url/remove-trailing-slash.js";import{logger as g}from"../../../tools/notifiers/logger.js";import{withPathPrefix as y}from"@redocly/theme/core/utils";import{envConfig as I}from"../../../config/env-config.js";import{getLlmsTxtMdPathBySlug as v}from"../../../utils/llmstxt/get-llms-txt-md-path-by-slug.js";const a="llms.txt",u="Table of contents";async function M(t,e,n={title:a,description:void 0},o){if(!e)return{title:n.title||a,description:n.description,details:void 0,sections:[{title:u,description:void 0,llmstxts:t}]};const s=e.title||n.title||a,r=e.description||n.description,i=await _(e,o),c=e.sections?.map(l=>{const{title:f,description:h,excludeFiles:m,includeFiles:L}=l,P=p(t,{excludeFiles:m,includeFiles:L});return{title:f,description:h,llmstxts:P}});return{title:s,description:r,details:i,sections:c||[{title:u,description:void 0,llmstxts:p(t,{includeFiles:["**/*"],excludeFiles:[]})}]}}async function _(t,e){const n=await e.getConfig();if(t?.details?.path&&n.configPath)try{const o=e.fs.getFileInfo(n.configPath);if(!o)throw new Error(`Config file ${n.configPath} not found`);const s=x(e.fs.cwd,T(o.relativePath),t.details.path);return await $(s,F.R_OK),E(s,"utf-8")}catch{throw new Error(`${t.details.path} is not accessible`)}if(t?.details?.content)return t.details.content}function p(t,e){const{excludeFiles:n,includeFiles:o}=e,s=n?.map(i=>d(i)),r=o?.map(i=>d(i));return t.filter(i=>s?.some(l=>l(i.fsPath))?!1:r?.some(l=>l(i.fsPath)))}async function j(t,e,n={title:a,description:void 0},o){const s=await M(t,e,n,o),r=[`# ${s.title}
1
+ import d from"picomatch";import{dirname as T,resolve as x}from"node:path";import{access as $,readFile as E,constants as F}from"fs/promises";import{removeTrailingSlash as w}from"../../../../utils/url/remove-trailing-slash.js";import{logger as g}from"../../../tools/notifiers/logger.js";import{withPathPrefix as y}from"@redocly/theme/core/utils";import{envConfig as I}from"../../../config/env-config.js";import{getLlmsTxtMdPathBySlug as v}from"../../../utils/llmstxt/get-llms-txt-md-path-by-slug.js";const a="llms.txt",u="Table of contents";async function D(t,e,n={title:a,description:void 0},o){if(!e)return{title:n.title||a,description:n.description,details:void 0,sections:[{title:u,description:void 0,llmstxts:t}]};const s=e.title||n.title||a,r=e.description||n.description,i=await M(e,o),c=e.sections?.map(l=>{const{title:f,description:h,excludeFiles:m,includeFiles:L}=l,P=p(t,{excludeFiles:m,includeFiles:L});return{title:f,description:h,llmstxts:P}});return{title:s,description:r,details:i,sections:c||[{title:u,description:void 0,llmstxts:p(t,{includeFiles:["**/*"],excludeFiles:[]})}]}}async function M(t,e){const n=await e.getConfig();if(t?.details?.path&&n.configPath)try{const o=e.fs.getFileInfo(n.configPath);if(!o)throw new Error(`Config file ${n.configPath} not found`);const s=x(e.fs.cwd,T(o.relativePath),t.details.path);return await $(s,F.R_OK),E(s,"utf-8")}catch{throw new Error(`${t.details.path} is not accessible`)}if(t?.details?.content)return t.details.content}function p(t,e){const{excludeFiles:n,includeFiles:o}=e,s=n?.map(i=>d(i)),r=o?.map(i=>d(i));return t.filter(i=>s?.some(l=>l(i.fsPath))?!1:r?.some(l=>l(i.fsPath)))}async function j(t,e,n={title:a,description:void 0},o){const s=await D(t,e,n,o),r=[`# ${s.title}
2
2
 
3
3
  `];return s.description&&r.push(`> ${s.description}
4
4
 
@@ -8,6 +8,6 @@ import d from"picomatch";import{dirname as T,resolve as x}from"node:path";import
8
8
  `),i.description?r.push(`${i.description.replace(/\n+$/,"")}
9
9
 
10
10
  `):r.push(`
11
- `),i.llmstxts.forEach(c=>{r.push(` - ${D({title:c.title,description:c.description,slug:v(c.slug)})}`)}),r.push(`
12
- `)}),r.join("")}function D({title:t,description:e,slug:n}){return`[${t}](${w(I.REDOCLY_PUBLIC_URL||"")}${encodeURI(y(n))})${e?`: ${e}`:""}
13
- `}function K(t){if(t?.details?.path&&t?.details?.content)throw new Error('"details.path" and "details.content" are mutually exclusive. Please use only one of them.')}export{j as generateLLMsTxt,D as llmsTxtLink,K as validateLLMsTxtConfig};
11
+ `),i.llmstxts.forEach(c=>{r.push(` - ${_({title:c.title,description:c.description,slug:v(c.slug)})}`)}),r.push(`
12
+ `)}),r.join("")}function _({title:t,description:e,slug:n}){const o=e?.replace(/\s+/g," ").trim();return`[${t}](${w(I.REDOCLY_PUBLIC_URL||"")}${encodeURI(y(n))})${o?`: ${o}`:""}
13
+ `}function K(t){if(t?.details?.path&&t?.details?.content)throw new Error('"details.path" and "details.content" are mutually exclusive. Please use only one of them.')}export{j as generateLLMsTxt,_ as llmsTxtLink,K as validateLLMsTxtConfig};
@@ -1,7 +1,7 @@
1
1
  import type { LifecyclePluginInstance, PluginOptions } from '../../types';
2
2
  import type { ResolvedNavItem } from '@redocly/config';
3
3
  import type { ContentFs } from '../../fs/content-fs.js';
4
- export declare function sidebarsPlugin({ contentDir }: PluginOptions): Promise<LifecyclePluginInstance>;
4
+ export declare function sidebarsPlugin({ contentDir, }: PluginOptions): Promise<LifecyclePluginInstance>;
5
5
  export declare function stripMarkdocFromDescriptions(items: ResolvedNavItem[]): void;
6
6
  export declare function resolveSidebarId(relativePath: string, sidebarPath: string, fs: ContentFs): Promise<string | null>;
7
7
  //# sourceMappingURL=index.d.ts.map