@redocly/realm 0.136.0-next.0 → 0.136.0-next.10

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 (535) hide show
  1. package/CHANGELOG.md +202 -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/TestProvider.d.ts +1 -1
  14. package/dist/client/TestProvider.js +1 -1
  15. package/dist/client/api-docs-builder-entry.d.ts +3 -0
  16. package/dist/client/api-docs-builder-entry.js +1 -0
  17. package/dist/client/app/ConditionalLink.d.ts +1 -1
  18. package/dist/client/app/Feedback/useSubmitFeedback.js +1 -1
  19. package/dist/client/app/Sidebar/Sidebar.js +3 -3
  20. package/dist/client/app/Sidebar/helpers/hide-empty-separators.d.ts +13 -0
  21. package/dist/client/app/Sidebar/helpers/hide-empty-separators.js +1 -0
  22. package/dist/client/app/Sidebar/useActions.js +1 -1
  23. package/dist/client/app/Sidebar/utils.js +1 -1
  24. package/dist/client/app/hooks/catalog/useCatalogFilter.d.ts +1 -1
  25. package/dist/client/app/hooks/catalog/useCatalogViewMode.js +1 -1
  26. package/dist/client/app/hooks/catalog/useFetchCatalogEntities.d.ts +1 -1
  27. package/dist/client/app/hooks/catalog/useFetchCatalogEntities.js +1 -1
  28. package/dist/client/app/hooks/catalog/useFetchCatalogEntitiesRelations.d.ts +2 -2
  29. package/dist/client/app/hooks/catalog/useFetchCatalogEntitiesRelations.js +1 -1
  30. package/dist/client/app/hooks/catalog/useFetchCatalogEntityRevisions.d.ts +1 -1
  31. package/dist/client/app/hooks/catalog/useSearchTracker.d.ts +2 -5
  32. package/dist/client/app/hooks/catalog/useSearchTracker.js +1 -1
  33. package/dist/client/app/hooks/codeHighlight/useCodeHighlight.d.ts +1 -6
  34. package/dist/client/app/hooks/codeHighlight/useCodeHighlight.js +1 -1
  35. package/dist/client/app/hooks/index.d.ts +1 -0
  36. package/dist/client/app/hooks/index.js +1 -1
  37. package/dist/client/app/hooks/useAutoScroll.js +1 -1
  38. package/dist/client/app/hooks/useUserClaims.js +1 -1
  39. package/dist/client/app/l10n/hooks/index.d.ts +1 -0
  40. package/dist/client/app/l10n/hooks/index.js +1 -1
  41. package/dist/client/app/l10n/hooks/useTranslate.js +1 -1
  42. package/dist/client/app/l10n/hooks/useTranslationKeys.d.ts +2 -0
  43. package/dist/client/app/l10n/hooks/useTranslationKeys.js +1 -0
  44. package/dist/client/app/l10n/initL10n.js +1 -1
  45. package/dist/client/app/markdoc/custom-components/openapi/json-schema.d.ts +1 -1
  46. package/dist/client/app/markdoc/custom-components/openapi/json-schema.js +1 -1
  47. package/dist/client/app/markdoc/custom-components/openapi/openapi-code-sample.d.ts +1 -5
  48. package/dist/client/app/markdoc/custom-components/openapi/openapi-code-sample.js +1 -1
  49. package/dist/client/app/markdoc/custom-components/openapi/openapi-example.js +1 -1
  50. package/dist/client/app/markdoc/custom-components/openapi/openapi-response-sample.js +1 -1
  51. package/dist/client/app/markdoc/custom-components/openapi/replay-openapi.d.ts +8 -24
  52. package/dist/client/app/markdoc/custom-components/openapi/replay-openapi.js +1 -1
  53. package/dist/client/app/markdoc/hooks/use-store.d.ts +8 -6
  54. package/dist/client/app/markdoc/utils/build-replay-operation-source-map.d.ts +20 -0
  55. package/dist/client/app/markdoc/utils/build-replay-operation-source-map.js +1 -0
  56. package/dist/client/app/markdoc/utils/find-api-item.d.ts +15 -0
  57. package/dist/client/app/markdoc/utils/find-api-item.js +1 -0
  58. package/dist/client/app/markdoc/utils/find-code-sample-panel.d.ts +11 -0
  59. package/dist/client/app/markdoc/utils/find-code-sample-panel.js +1 -0
  60. package/dist/client/app/markdoc/utils/find-openapi-response-samples.d.ts +15 -0
  61. package/dist/client/app/markdoc/utils/find-openapi-response-samples.js +1 -0
  62. package/dist/client/app/markdoc/utils/openapi-panel-entry.d.ts +18 -0
  63. package/dist/client/app/markdoc/utils/openapi-panel-entry.js +1 -0
  64. package/dist/client/app/pages/DevLogin/DevLoginForm.d.ts +1 -1
  65. package/dist/client/app/useGlobalData.d.ts +1 -1
  66. package/dist/client/app/usePreloadHistory.d.ts +2 -2
  67. package/dist/client/app/usePreloadHistory.js +1 -1
  68. package/dist/client/app/utils/loadAndNavigate.d.ts +1 -1
  69. package/dist/client/app/utils/loadAndNavigate.js +1 -1
  70. package/dist/client/app/utils/resolveRouteBySlug.js +1 -1
  71. package/dist/client/app/utils/same-resolved-route.d.ts +5 -0
  72. package/dist/client/app/utils/same-resolved-route.js +1 -0
  73. package/dist/client/browser-entry.js +2 -2
  74. package/dist/client/providers/page-data/hooks.d.ts +2 -2
  75. package/dist/client/providers/post-message/PostMessageProvider.js +1 -1
  76. package/dist/client/providers/post-message/use-post-message.d.ts +1 -1
  77. package/dist/client/providers/theme/ThemeDataProvider.js +1 -1
  78. package/dist/client/runtime/loader.js +1 -1
  79. package/dist/client/templates/api-docs/helpers.d.ts +10 -0
  80. package/dist/client/templates/api-docs/helpers.js +1 -0
  81. package/dist/client/templates/api-docs/template.d.ts +17 -0
  82. package/dist/client/templates/api-docs/template.js +14 -0
  83. package/dist/client/templates/openapi-docs/helpers.d.ts +1 -1
  84. package/dist/client/templates/openapi-docs/helpers.js +2 -2
  85. package/dist/client/types/sidebar.d.ts +0 -1
  86. package/dist/client/utils/utils.d.ts +0 -2
  87. package/dist/client/utils/utils.js +1 -1
  88. package/dist/constants/common.d.ts +14 -1
  89. package/dist/constants/common.js +1 -1
  90. package/dist/constants/l10n/langs/ar.js +1 -1
  91. package/dist/constants/l10n/langs/de.js +1 -1
  92. package/dist/constants/l10n/langs/en.js +1 -1
  93. package/dist/constants/l10n/langs/es.js +1 -1
  94. package/dist/constants/l10n/langs/fr.js +1 -1
  95. package/dist/constants/l10n/langs/hi.js +1 -1
  96. package/dist/constants/l10n/langs/it.js +1 -1
  97. package/dist/constants/l10n/langs/ja.js +1 -1
  98. package/dist/constants/l10n/langs/ko.js +1 -1
  99. package/dist/constants/l10n/langs/pl.js +1 -1
  100. package/dist/constants/l10n/langs/pt-BR.js +1 -1
  101. package/dist/constants/l10n/langs/pt.js +1 -1
  102. package/dist/constants/l10n/langs/ru.js +1 -1
  103. package/dist/constants/l10n/langs/uk.js +1 -1
  104. package/dist/constants/l10n/langs/zh.js +1 -1
  105. package/dist/markdoc/tags/index.d.ts +48 -2
  106. package/dist/server/api-routes/execute-api-route.js +1 -1
  107. package/dist/server/api-routes/helpers/enhance-context.d.ts +3 -1
  108. package/dist/server/api-routes/helpers/enhance-context.js +1 -1
  109. package/dist/server/api-routes/helpers/is-mock-server.d.ts +2 -0
  110. package/dist/server/api-routes/helpers/is-mock-server.js +1 -0
  111. package/dist/server/api-routes/helpers/read-stream-with-size-limit.d.ts +1 -1
  112. package/dist/server/api-routes/mock-server/kv-state-store.d.ts +3 -0
  113. package/dist/server/api-routes/mock-server/kv-state-store.js +1 -0
  114. package/dist/server/api-routes/mock-server/mock-js-executor.d.ts +3 -0
  115. package/dist/server/api-routes/mock-server/mock-js-executor.js +13 -0
  116. package/dist/server/api-routes/run-api-routes-worker.d.ts +1 -1
  117. package/dist/server/api-routes/run-api-routes-worker.js +1 -1
  118. package/dist/server/config/env-config.d.ts +4 -4
  119. package/dist/server/config/env-schema.d.ts +10 -10
  120. package/dist/server/config/env-schemas/catalog.d.ts +3 -0
  121. package/dist/server/config/env-schemas/catalog.js +1 -1
  122. package/dist/server/config/env-schemas/feature-flags.d.ts +4 -8
  123. package/dist/server/config/env-schemas/feature-flags.js +1 -1
  124. package/dist/server/constants/common.d.ts +2 -0
  125. package/dist/server/constants/common.js +1 -1
  126. package/dist/server/constants/entitlements.js +1 -1
  127. package/dist/server/constants/plugins/api-docs.d.ts +3 -0
  128. package/dist/server/constants/plugins/api-docs.js +1 -0
  129. package/dist/server/esbuild/esbuild-logger.js +3 -3
  130. package/dist/server/esbuild/esbuild.js +3 -3
  131. package/dist/server/esbuild/plugins/api-docs-module-replacer/empty-check.d.ts +9 -0
  132. package/dist/server/esbuild/plugins/api-docs-module-replacer/empty-check.js +1 -0
  133. package/dist/server/esbuild/plugins/api-docs-module-replacer/empty-overlay.d.ts +2 -0
  134. package/dist/server/esbuild/plugins/api-docs-module-replacer/empty-overlay.js +1 -0
  135. package/dist/server/esbuild/plugins/api-docs-module-replacer/index.d.ts +6 -0
  136. package/dist/server/esbuild/plugins/api-docs-module-replacer/index.js +1 -0
  137. package/dist/server/persistence/cache/mappers/create-cache-db-record.d.ts +1 -1
  138. package/dist/server/persistence/file-hashes/mappers/create-file-hash-db-record.d.ts +1 -1
  139. package/dist/server/persistence/kv/mappers/create-kv-db-record.d.ts +1 -1
  140. package/dist/server/plugins/api-docs/get-server-props.d.ts +4 -0
  141. package/dist/server/plugins/api-docs/get-server-props.js +1 -0
  142. package/dist/server/plugins/api-docs/get-template-path.d.ts +2 -0
  143. package/dist/server/plugins/api-docs/get-template-path.js +1 -0
  144. package/dist/server/plugins/api-docs/import-api-docs-builder.d.ts +8 -0
  145. package/dist/server/plugins/api-docs/import-api-docs-builder.js +1 -0
  146. package/dist/server/plugins/api-docs/index.d.ts +19 -0
  147. package/dist/server/plugins/api-docs/index.js +1 -0
  148. package/dist/server/plugins/api-docs/loader.d.ts +35 -0
  149. package/dist/server/plugins/api-docs/loader.js +3 -0
  150. package/dist/server/plugins/api-docs/options.d.ts +14 -0
  151. package/dist/server/plugins/api-docs/options.js +1 -0
  152. package/dist/server/plugins/api-docs/search/get-ai-search-documents.d.ts +20 -0
  153. package/dist/server/plugins/api-docs/search/get-ai-search-documents.js +105 -0
  154. package/dist/server/plugins/api-docs/search/search-facets.d.ts +10 -0
  155. package/dist/server/plugins/api-docs/search/search-facets.js +1 -0
  156. package/dist/server/plugins/api-docs/search/search-indexer.d.ts +9 -0
  157. package/dist/server/plugins/api-docs/search/search-indexer.js +1 -0
  158. package/dist/server/plugins/api-docs/search/search-resolver.d.ts +5 -0
  159. package/dist/server/plugins/api-docs/search/search-resolver.js +1 -0
  160. package/dist/server/plugins/api-docs/spec-download.api.d.ts +4 -0
  161. package/dist/server/plugins/api-docs/spec-download.api.js +1 -0
  162. package/dist/server/plugins/api-docs/store-definition-bundles.d.ts +3 -0
  163. package/dist/server/plugins/api-docs/store-definition-bundles.js +1 -0
  164. package/dist/server/plugins/api-docs/utils/build-item-positions.d.ts +17 -0
  165. package/dist/server/plugins/api-docs/utils/build-item-positions.js +1 -0
  166. package/dist/server/plugins/api-docs/utils/build-routes-mapping.d.ts +3 -0
  167. package/dist/server/plugins/api-docs/utils/build-routes-mapping.js +1 -0
  168. package/dist/server/plugins/api-docs/utils/collect-item-routes.d.ts +12 -0
  169. package/dist/server/plugins/api-docs/utils/collect-item-routes.js +1 -0
  170. package/dist/server/plugins/api-docs/utils/decorators.d.ts +26 -0
  171. package/dist/server/plugins/api-docs/utils/decorators.js +1 -0
  172. package/dist/server/plugins/api-docs/utils/format-bundle-error.d.ts +6 -0
  173. package/dist/server/plugins/api-docs/utils/format-bundle-error.js +5 -0
  174. package/dist/server/plugins/api-docs/utils/normalize-api-version.d.ts +2 -0
  175. package/dist/server/plugins/api-docs/utils/normalize-api-version.js +1 -0
  176. package/dist/server/plugins/api-docs/utils/normalize-feedback-options.d.ts +2 -0
  177. package/dist/server/plugins/api-docs/utils/normalize-feedback-options.js +1 -0
  178. package/dist/server/plugins/api-docs/utils/relative-path-to-base-slug.d.ts +20 -0
  179. package/dist/server/plugins/api-docs/utils/relative-path-to-base-slug.js +1 -0
  180. package/dist/server/plugins/api-docs/utils/replace-file-extension.d.ts +2 -0
  181. package/dist/server/plugins/api-docs/utils/replace-file-extension.js +1 -0
  182. package/dist/server/plugins/api-docs/utils/resolve-api-doc-title.d.ts +3 -0
  183. package/dist/server/plugins/api-docs/utils/resolve-api-doc-title.js +1 -0
  184. package/dist/server/plugins/api-docs/utils/resolve-config-rbac.d.ts +10 -0
  185. package/dist/server/plugins/api-docs/utils/resolve-config-rbac.js +1 -0
  186. package/dist/server/plugins/api-docs/utils/to-relative-slug.d.ts +2 -0
  187. package/dist/server/plugins/api-docs/utils/to-relative-slug.js +1 -0
  188. package/dist/server/plugins/api-functions/index.js +1 -1
  189. package/dist/server/plugins/arazzo-docs/index.js +1 -1
  190. package/dist/server/plugins/asyncapi-docs/index.js +1 -1
  191. package/dist/server/plugins/catalog-classic/index.js +1 -1
  192. package/dist/server/plugins/catalog-entities/database/catalog-entities-diff-publisher.d.ts +27 -0
  193. package/dist/server/plugins/catalog-entities/database/catalog-entities-diff-publisher.js +12 -0
  194. package/dist/server/plugins/catalog-entities/database/catalog-entities-publisher.js +1 -12
  195. package/dist/server/plugins/catalog-entities/database/catalog-entities-revisions-pruner.d.ts +22 -0
  196. package/dist/server/plugins/catalog-entities/database/catalog-entities-revisions-pruner.js +62 -0
  197. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +5 -5
  198. package/dist/server/plugins/catalog-entities/database/consts.d.ts +5 -0
  199. package/dist/server/plugins/catalog-entities/database/consts.js +1 -1
  200. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-attributes-db-record.d.ts +1 -1
  201. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.d.ts +1 -1
  202. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-db-record-from-file-schema.d.ts +1 -1
  203. package/dist/server/plugins/catalog-entities/database/remote-publish-lock-service.d.ts +3 -3
  204. package/dist/server/plugins/catalog-entities/database/repositories/bffEntities/bff-entities-read-repository.d.ts +2 -2
  205. package/dist/server/plugins/catalog-entities/database/repositories/catalog-entities-repository.js +1 -1
  206. package/dist/server/plugins/catalog-entities/database/repositories/common/filters-repository.d.ts +1 -1
  207. package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.d.ts +1 -1
  208. package/dist/server/plugins/catalog-entities/database/repositories/entities/entities-read-repository.d.ts +1 -1
  209. package/dist/server/plugins/catalog-entities/database/repositories/entities/entities-write-repository.d.ts +2 -2
  210. package/dist/server/plugins/catalog-entities/database/repositories/entities/entities-write-repository.js +1 -1
  211. package/dist/server/plugins/catalog-entities/database/repositories/entityAttributes/entity-attributes-write-repository.d.ts +1 -1
  212. package/dist/server/plugins/catalog-entities/database/repositories/relations/relations-read-repository.d.ts +1 -1
  213. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.js +1 -1
  214. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.d.ts +13 -5
  215. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.js +1 -1
  216. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.d.ts +5 -2
  217. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.js +1 -1
  218. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.d.ts +6 -5
  219. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.js +2 -2
  220. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.d.ts +12 -5
  221. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.js +1 -1
  222. package/dist/server/plugins/catalog-entities/extensions/extractors/fs-entities-extractor.d.ts +1 -1
  223. package/dist/server/plugins/catalog-entities/plugin.js +1 -1
  224. package/dist/server/plugins/catalog-entities/template/index.js +1 -1
  225. package/dist/server/plugins/catalog-entities/types/openapi.d.ts +1 -1
  226. package/dist/server/plugins/catalog-entities/utils/get-not-accessible-catalog-resources.d.ts +1 -1
  227. package/dist/server/plugins/catalog-entities/utils/openapi-component-content-extractor.d.ts +4 -4
  228. package/dist/server/plugins/catalog-entities/utils/openapi-component-content-extractor.js +1 -1
  229. package/dist/server/plugins/catalog-entities/utils/openapi-schema-resolver.d.ts +4 -3
  230. package/dist/server/plugins/catalog-entities/utils/openapi-schema-resolver.js +1 -1
  231. package/dist/server/plugins/config-parser/index.js +1 -1
  232. package/dist/server/plugins/config-parser/loaders/utils/read-and-validate-config.js +1 -1
  233. package/dist/server/plugins/create-slugify.d.ts +17 -0
  234. package/dist/server/plugins/create-slugify.js +1 -0
  235. package/dist/server/plugins/default-theme/index.js +1 -1
  236. package/dist/server/plugins/dev-onboarding/index.d.ts +1 -1
  237. package/dist/server/plugins/dev-onboarding/index.js +1 -1
  238. package/dist/server/plugins/dev-onboarding/template/components/RevokeAPIKey.d.ts +1 -1
  239. package/dist/server/plugins/dev-onboarding/template/components/RollAPIKey.d.ts +1 -1
  240. package/dist/server/plugins/entitlements/index.js +1 -1
  241. package/dist/server/plugins/graphql-docs/index.js +1 -1
  242. package/dist/server/plugins/graphql-docs/search/ai/utils.d.ts +1 -1
  243. package/dist/server/plugins/helpers/parse-partials.d.ts +3 -0
  244. package/dist/server/plugins/helpers/parse-partials.js +1 -0
  245. package/dist/server/plugins/l10n/index.js +1 -1
  246. package/dist/server/plugins/lifecycle.js +2 -2
  247. package/dist/server/plugins/markdown/attribute-resolvers/helpers/load-openapi-bundle.d.ts +5 -3
  248. package/dist/server/plugins/markdown/attribute-resolvers/helpers/load-openapi-bundle.js +1 -1
  249. package/dist/server/plugins/markdown/attribute-resolvers/resolve-json-example-ref.js +1 -1
  250. package/dist/server/plugins/markdown/attribute-resolvers/resolve-open-api-ref.js +1 -1
  251. package/dist/server/plugins/markdown/attribute-resolvers/resolve-openapi-code-samples.js +1 -1
  252. package/dist/server/plugins/markdown/attribute-resolvers/resolve-openapi-response-samples.js +1 -1
  253. package/dist/server/plugins/markdown/index.js +1 -1
  254. package/dist/server/plugins/markdown/markdoc/markdoc-options.d.ts +9 -9
  255. package/dist/server/plugins/markdown/markdoc/plugins/utils.d.ts +5 -0
  256. package/dist/server/plugins/markdown/markdoc/plugins/utils.js +1 -1
  257. package/dist/server/plugins/markdown/runtime-transform.js +1 -1
  258. package/dist/server/plugins/markdown/search/create-render-tag-fn.d.ts +2 -1
  259. package/dist/server/plugins/markdown/search/create-render-tag-fn.js +1 -1
  260. package/dist/server/plugins/markdown/search/get-ai-search-documents.js +9 -9
  261. package/dist/server/plugins/markdown/search/walk-sections.js +1 -1
  262. package/dist/server/plugins/markdown/utils/resolve-markdown-template.d.ts +1 -1
  263. package/dist/server/plugins/mcp/auth/auth-handlers.d.ts +3 -0
  264. package/dist/server/plugins/mcp/auth/auth-handlers.js +1 -1
  265. package/dist/server/plugins/mcp/codemode/capabilities/types.d.ts +1 -1
  266. package/dist/server/plugins/mcp/codemode/capabilities/utils.d.ts +1 -1
  267. package/dist/server/plugins/mcp/codemode/code-audit.d.ts +12 -0
  268. package/dist/server/plugins/mcp/codemode/code-audit.js +1 -0
  269. package/dist/server/plugins/mcp/codemode/code-execution-telemetry.d.ts +11 -0
  270. package/dist/server/plugins/mcp/codemode/code-execution-telemetry.js +1 -0
  271. package/dist/server/plugins/mcp/codemode/constants.d.ts +3 -0
  272. package/dist/server/plugins/mcp/codemode/constants.js +1 -1
  273. package/dist/server/plugins/mcp/codemode/prompts.js +1 -1
  274. package/dist/server/plugins/mcp/codemode/sandbox/create-sandbox-setup.d.ts +10 -0
  275. package/dist/server/plugins/mcp/codemode/sandbox/create-sandbox-setup.js +11 -0
  276. package/dist/server/plugins/mcp/codemode/sandbox/polyfills.d.ts +2 -0
  277. package/dist/server/plugins/mcp/codemode/sandbox/{sandbox-polyfills.js → polyfills.js} +7 -8
  278. package/dist/server/plugins/mcp/codemode/tools/describe-tools.d.ts +2 -3
  279. package/dist/server/plugins/mcp/codemode/tools/execute-schema.d.ts +1 -1
  280. package/dist/server/plugins/mcp/codemode/tools/execute-schema.js +1 -1
  281. package/dist/server/plugins/mcp/codemode/tools/execute.d.ts +1 -0
  282. package/dist/server/plugins/mcp/codemode/tools/execute.js +1 -1
  283. package/dist/server/plugins/mcp/codemode/types.d.ts +0 -8
  284. package/dist/server/plugins/mcp/constants.d.ts +2 -1
  285. package/dist/server/plugins/mcp/constants.js +1 -1
  286. package/dist/server/plugins/mcp/docs-mcp/tool-schemas.d.ts +1 -0
  287. package/dist/server/plugins/mcp/docs-mcp/tool-schemas.js +1 -1
  288. package/dist/server/plugins/mcp/docs-mcp/tools/core/create-anonymous-session.d.ts +11 -0
  289. package/dist/server/plugins/mcp/docs-mcp/tools/core/create-anonymous-session.js +1 -0
  290. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/constants.d.ts +4 -0
  291. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/constants.js +1 -0
  292. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/get-graphql-type-list.js +1 -1
  293. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/get-graphql-type.js +7 -4
  294. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/types.d.ts +7 -1
  295. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/types.js +0 -1
  296. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/utils.d.ts +5 -1
  297. package/dist/server/plugins/mcp/docs-mcp/tools/graphql/utils.js +4 -2
  298. package/dist/server/plugins/mcp/docs-mcp/tools/index.d.ts +4 -0
  299. package/dist/server/plugins/mcp/docs-mcp/tools/index.js +1 -1
  300. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/constants.d.ts +2 -0
  301. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/constants.js +1 -0
  302. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/get-endpoint-info.js +1 -1
  303. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/get-endpoints.js +1 -1
  304. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/get-full-api-description.js +1 -1
  305. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/get-security-schemes.js +1 -1
  306. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/list-apis.js +1 -1
  307. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/load-api-description.d.ts +6 -2
  308. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/load-api-description.js +1 -1
  309. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/types.d.ts +2 -0
  310. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/utils.d.ts +2 -2
  311. package/dist/server/plugins/mcp/docs-mcp/tools/openapi/utils.js +1 -1
  312. package/dist/server/plugins/mcp/docs-mcp/utils.d.ts +3 -3
  313. package/dist/server/plugins/mcp/docs-mcp/utils.js +1 -1
  314. package/dist/server/plugins/mcp/gateway-mcp/elicitation.d.ts +28 -0
  315. package/dist/server/plugins/mcp/gateway-mcp/elicitation.js +2 -0
  316. package/dist/server/plugins/mcp/gateway-mcp/eligibility.d.ts +5 -17
  317. package/dist/server/plugins/mcp/gateway-mcp/eligibility.js +1 -1
  318. package/dist/server/plugins/mcp/gateway-mcp/fetch/allowed-hosts.d.ts +9 -9
  319. package/dist/server/plugins/mcp/gateway-mcp/fetch/allowed-hosts.js +1 -1
  320. package/dist/server/plugins/mcp/gateway-mcp/fetch/fetch-bridge.d.ts +17 -1
  321. package/dist/server/plugins/mcp/gateway-mcp/fetch/fetch-bridge.js +1 -1
  322. package/dist/server/plugins/mcp/gateway-mcp/fetch/fetch-errors.d.ts +11 -0
  323. package/dist/server/plugins/mcp/gateway-mcp/fetch/fetch-errors.js +1 -0
  324. package/dist/server/plugins/mcp/gateway-mcp/fetch/fetch-telemetry.d.ts +14 -0
  325. package/dist/server/plugins/mcp/gateway-mcp/fetch/fetch-telemetry.js +1 -0
  326. package/dist/server/plugins/mcp/gateway-mcp/fetch/normalize-path.d.ts +6 -0
  327. package/dist/server/plugins/mcp/gateway-mcp/fetch/normalize-path.js +1 -0
  328. package/dist/server/plugins/mcp/gateway-mcp/fetch/redact.d.ts +4 -0
  329. package/dist/server/plugins/mcp/gateway-mcp/fetch/redact.js +1 -0
  330. package/dist/server/plugins/mcp/gateway-mcp/fetch/ssrf-blocklist.d.ts +22 -0
  331. package/dist/server/plugins/mcp/gateway-mcp/fetch/ssrf-blocklist.js +1 -0
  332. package/dist/server/plugins/mcp/gateway-mcp/fetch/ssrf-guard.d.ts +1 -1
  333. package/dist/server/plugins/mcp/gateway-mcp/fetch/ssrf-guard.js +1 -1
  334. package/dist/server/plugins/mcp/gateway-mcp/fetch/ssrf-safe-lookup.d.ts +13 -0
  335. package/dist/server/plugins/mcp/gateway-mcp/fetch/ssrf-safe-lookup.js +1 -0
  336. package/dist/server/plugins/mcp/gateway-mcp/fetch-capability.d.ts +8 -1
  337. package/dist/server/plugins/mcp/gateway-mcp/fetch-capability.js +1 -1
  338. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/apply-edge-rate-limit.d.ts +3 -0
  339. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/apply-edge-rate-limit.js +1 -0
  340. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/edge-limiter.d.ts +16 -0
  341. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/edge-limiter.js +1 -0
  342. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/ip-key.d.ts +2 -0
  343. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/ip-key.js +1 -0
  344. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/limits.d.ts +7 -0
  345. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/limits.js +1 -0
  346. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/rate-limit-telemetry.d.ts +8 -0
  347. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/rate-limit-telemetry.js +1 -0
  348. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/window-counter.d.ts +15 -0
  349. package/dist/server/plugins/mcp/gateway-mcp/rate-limit/window-counter.js +1 -0
  350. package/dist/server/plugins/mcp/gateway-mcp/secret-store.d.ts +24 -0
  351. package/dist/server/plugins/mcp/gateway-mcp/secret-store.js +1 -0
  352. package/dist/server/plugins/mcp/gateway-mcp/subject.d.ts +20 -0
  353. package/dist/server/plugins/mcp/gateway-mcp/subject.js +1 -0
  354. package/dist/server/plugins/mcp/gateway-mcp/upstream-auth-scheme.d.ts +18 -0
  355. package/dist/server/plugins/mcp/gateway-mcp/upstream-auth-scheme.js +1 -0
  356. package/dist/server/plugins/mcp/gateway-mcp/upstream-auth.d.ts +10 -0
  357. package/dist/server/plugins/mcp/gateway-mcp/upstream-auth.js +1 -0
  358. package/dist/server/plugins/mcp/handlers/docs-mcp-handler.js +1 -1
  359. package/dist/server/plugins/mcp/handlers/errors.d.ts +3 -3
  360. package/dist/server/plugins/mcp/handlers/errors.js +1 -1
  361. package/dist/server/plugins/mcp/handlers/handle-mcp-request.js +1 -1
  362. package/dist/server/plugins/mcp/handlers/mcp-credentials-handler.d.ts +5 -0
  363. package/dist/server/plugins/mcp/handlers/mcp-credentials-handler.js +101 -0
  364. package/dist/server/plugins/mcp/index.d.ts +1 -0
  365. package/dist/server/plugins/mcp/index.js +1 -1
  366. package/dist/server/plugins/mcp/servers/docs-server.d.ts +3 -1
  367. package/dist/server/plugins/mcp/servers/docs-server.js +1 -1
  368. package/dist/server/plugins/mcp/servers/mcp-server.d.ts +15 -8
  369. package/dist/server/plugins/mcp/servers/mcp-server.js +1 -1
  370. package/dist/server/plugins/mcp/types.d.ts +16 -20
  371. package/dist/server/plugins/mcp/utils/json-schema-validator.d.ts +9 -0
  372. package/dist/server/plugins/mcp/utils/json-schema-validator.js +1 -0
  373. package/dist/server/plugins/mcp/utils/jwt.d.ts +0 -9
  374. package/dist/server/plugins/mcp/utils/jwt.js +1 -1
  375. package/dist/server/plugins/mcp/utils/mode.d.ts +12 -2
  376. package/dist/server/plugins/mcp/utils/mode.js +1 -1
  377. package/dist/server/plugins/mcp/utils/telemetry-attributes.d.ts +8 -0
  378. package/dist/server/plugins/mcp/utils/telemetry-attributes.js +1 -0
  379. package/dist/server/plugins/mcp/utils/xmcp-utils.d.ts +1 -1
  380. package/dist/server/plugins/mcp/utils.d.ts +17 -5
  381. package/dist/server/plugins/mcp/utils.js +1 -1
  382. package/dist/server/plugins/mcp/workers/execute-mcp-tool.js +1 -1
  383. package/dist/server/plugins/mcp/workers/mcp-tool-telemetry.d.ts +10 -2
  384. package/dist/server/plugins/mcp/workers/mcp-tool-telemetry.js +1 -1
  385. package/dist/server/plugins/openapi-docs/index.js +1 -1
  386. package/dist/server/plugins/openapi-docs/search/get-ai-search-documents.js +16 -16
  387. package/dist/server/plugins/openapi-docs/utils.js +1 -1
  388. package/dist/server/plugins/pages/index.js +1 -1
  389. package/dist/server/plugins/scorecard-classic/compute-scorecard.d.ts +1 -1
  390. package/dist/server/plugins/scorecard-classic/compute-scorecard.js +4 -4
  391. package/dist/server/plugins/scorecard-classic/index.d.ts +1 -1
  392. package/dist/server/plugins/scorecard-classic/index.js +1 -1
  393. package/dist/server/plugins/scorecard-classic/template/components.d.ts +1 -1
  394. package/dist/server/plugins/scorecard-classic/template/useData.d.ts +1 -1
  395. package/dist/server/plugins/scorecards/plugin.js +1 -1
  396. package/dist/server/plugins/search/ai-indexer/prepare-semantic-documents.d.ts +1 -1
  397. package/dist/server/plugins/search/ai-indexer/prepare-semantic-documents.js +2 -2
  398. package/dist/server/plugins/search/documents/search-documents.js +1 -1
  399. package/dist/server/plugins/search/engines/flexsearch/index.js +1 -1
  400. package/dist/server/plugins/search/engines/flexsearch/search-index.js +1 -1
  401. package/dist/server/plugins/search/engines/search-engine.d.ts +1 -1
  402. package/dist/server/plugins/search/engines/typesense/index.js +1 -1
  403. package/dist/server/plugins/search/index.js +1 -1
  404. package/dist/server/plugins/search/llmstxt/index.d.ts +1 -1
  405. package/dist/server/plugins/search/llmstxt/index.js +4 -4
  406. package/dist/server/plugins/sidebars/index.d.ts +1 -1
  407. package/dist/server/plugins/sidebars/index.js +1 -1
  408. package/dist/server/plugins/sitemap/index.js +1 -1
  409. package/dist/server/plugins/sso/index.js +1 -1
  410. package/dist/server/providers/database/database-path-generator.d.ts +2 -2
  411. package/dist/server/providers/database/utils/storage-limit-validator.d.ts +1 -1
  412. package/dist/server/sandbox/constants/host-functions.d.ts +3 -0
  413. package/dist/server/sandbox/constants/host-functions.js +1 -0
  414. package/dist/server/sandbox/constants/sandbox.d.ts +6 -0
  415. package/dist/server/sandbox/constants/sandbox.js +1 -0
  416. package/dist/server/sandbox/sandbox.d.ts +8 -0
  417. package/dist/server/sandbox/sandbox.js +3 -0
  418. package/dist/server/sandbox/types.d.ts +25 -0
  419. package/dist/server/sandbox/utils/eval-guest-code.d.ts +15 -0
  420. package/dist/server/sandbox/utils/eval-guest-code.js +1 -0
  421. package/dist/server/sandbox/utils/execution-budget.d.ts +12 -0
  422. package/dist/server/sandbox/utils/execution-budget.js +1 -0
  423. package/dist/server/sandbox/utils/setup-host-functions.d.ts +18 -0
  424. package/dist/server/sandbox/utils/setup-host-functions.js +5 -0
  425. package/dist/server/ssr/render.js +1 -1
  426. package/dist/server/ssr/server-side-props/get-default-static-props.d.ts +1 -1
  427. package/dist/server/ssr/server-side-props/get-server-props-from-user-handler.d.ts +1 -1
  428. package/dist/server/ssr/template.d.ts +1 -1
  429. package/dist/server/ssr/utils.d.ts +1 -0
  430. package/dist/server/ssr/utils.js +5 -5
  431. package/dist/server/store.d.ts +2 -6
  432. package/dist/server/store.js +1 -1
  433. package/dist/server/tools/notifiers/logger.js +1 -1
  434. package/dist/server/tools/notifiers/reporter.js +6 -6
  435. package/dist/server/types/plugins/common.d.ts +4 -6
  436. package/dist/server/types/plugins/markdown.d.ts +1 -3
  437. package/dist/server/types/plugins/search.d.ts +1 -0
  438. package/dist/server/utils/catalog-classic/get-route-slug-to-catalog-slug-map.test.js +1 -1
  439. package/dist/server/utils/crypto/constants.d.ts +5 -0
  440. package/dist/server/utils/crypto/constants.js +1 -0
  441. package/dist/server/utils/crypto/decrypt-aes-gcm.d.ts +6 -0
  442. package/dist/server/utils/crypto/decrypt-aes-gcm.js +1 -0
  443. package/dist/server/utils/crypto/decrypt-claim-value.d.ts +6 -0
  444. package/dist/server/utils/crypto/decrypt-claim-value.js +1 -0
  445. package/dist/server/utils/crypto/derive-key.d.ts +5 -0
  446. package/dist/server/utils/crypto/derive-key.js +1 -0
  447. package/dist/server/utils/crypto/encrypt-aes-gcm.d.ts +6 -0
  448. package/dist/server/utils/crypto/encrypt-aes-gcm.js +1 -0
  449. package/dist/server/utils/crypto/encrypt-claim-value.d.ts +6 -0
  450. package/dist/server/utils/crypto/encrypt-claim-value.js +1 -0
  451. package/dist/server/utils/fetch-with-client.d.ts +10 -0
  452. package/dist/server/utils/fetch-with-client.js +1 -0
  453. package/dist/server/utils/l10n/get-build-translate-context.d.ts +7 -0
  454. package/dist/server/utils/l10n/get-build-translate-context.js +1 -0
  455. package/dist/server/utils/llmstxt/agent-feedback-llms-footer.js +1 -1
  456. package/dist/server/utils/rbac.d.ts +4 -0
  457. package/dist/server/utils/rbac.js +1 -1
  458. package/dist/server/utils/report-all-errors.js +1 -1
  459. package/dist/server/utils/sandbox-context.d.ts +18 -0
  460. package/dist/server/utils/sandbox-context.js +1 -0
  461. package/dist/server/utils/shared-data.js +1 -1
  462. package/dist/server/web-server/auth.d.ts +34 -4
  463. package/dist/server/web-server/auth.js +3 -3
  464. package/dist/server/web-server/handle-api-route-request.js +1 -1
  465. package/dist/server/web-server/middleware/apiKeyMiddleware.js +1 -1
  466. package/dist/server/web-server/middleware/catalogAuthMiddleware.d.ts +1 -1
  467. package/dist/server/web-server/middleware/catalogAuthMiddleware.js +1 -1
  468. package/dist/server/web-server/middleware/telemetry-middleware.js +1 -1
  469. package/dist/server/web-server/routes/api-routes/api-routes.js +1 -1
  470. package/dist/server/web-server/routes/ask-ai.js +1 -1
  471. package/dist/server/web-server/routes/auth.js +1 -1
  472. package/dist/server/web-server/routes/catalog/bff-catalog-related-entities.js +1 -1
  473. package/dist/server/web-server/routes/catalog/bff-catalog-revisions.js +1 -1
  474. package/dist/server/web-server/routes/catalog/bff-catalog.js +1 -1
  475. package/dist/server/web-server/routes/catalog/catalog-relations.js +1 -1
  476. package/dist/server/web-server/routes/catalog/catalog.js +1 -1
  477. package/dist/server/web-server/routes/catalog/helpers/has-access-to-entity.d.ts +1 -1
  478. package/dist/server/web-server/routes/catalog/helpers/upsert-pages-stats.d.ts +1 -1
  479. package/dist/server/web-server/routes/catalog/helpers/upsert-pages-stats.js +1 -1
  480. package/dist/server/web-server/routes/dynamic-route.js +1 -1
  481. package/dist/server/web-server/routes/feedback.d.ts +1 -1
  482. package/dist/server/web-server/routes/feedback.js +1 -1
  483. package/dist/server/web-server/routes/helpers/process-redirects.d.ts +1 -1
  484. package/dist/server/web-server/routes/mcp-routes/a2a.js +1 -1
  485. package/dist/server/web-server/routes/mcp-routes/agent-card.js +1 -1
  486. package/dist/server/web-server/routes/mcp-routes/mcp-oauth.d.ts +10 -6
  487. package/dist/server/web-server/routes/mcp-routes/mcp-oauth.js +1 -1
  488. package/dist/server/web-server/routes/mcp-routes/mcp-routes.js +1 -1
  489. package/dist/server/web-server/routes/mcp-routes/mcp-server-card.js +1 -1
  490. package/dist/server/web-server/routes/mcp-routes/utils/build-agent-card.d.ts +1 -1
  491. package/dist/server/web-server/routes/page-data.js +1 -1
  492. package/dist/server/web-server/routes/resolve-route.js +1 -1
  493. package/dist/server/web-server/routes/search.js +1 -1
  494. package/dist/server/web-server/routes/semantic-search.js +1 -1
  495. package/dist/server/web-server/routes/skills/skill-markdown.js +1 -1
  496. package/dist/server/web-server/routes/skills/skills-index.js +1 -1
  497. package/dist/server/web-server/utils/prepare-list-response.d.ts +1 -1
  498. package/dist/server/workers/api-routes-worker-pool.js +1 -1
  499. package/dist/server/workers/mcp-tool-worker-pool.js +1 -1
  500. package/dist/server/workers/worker-pool.d.ts +1 -0
  501. package/dist/server/workers/worker-pool.js +1 -1
  502. package/dist/types/entitlements.d.ts +6 -1
  503. package/dist/types/markdoc.d.ts +2 -1
  504. package/dist/utils/l10n/build-i18n-config.d.ts +24 -0
  505. package/dist/utils/l10n/build-i18n-config.js +1 -0
  506. package/dist/utils/l10n/create-translate.d.ts +19 -0
  507. package/dist/utils/l10n/create-translate.js +1 -0
  508. package/dist/utils/url/get-shared-data-fetch-url.d.ts +17 -0
  509. package/dist/utils/url/get-shared-data-fetch-url.js +1 -0
  510. package/dist/utils/url/parse-preview-url.d.ts +22 -0
  511. package/dist/utils/url/parse-preview-url.js +1 -0
  512. package/package.json +16 -15
  513. package/dist/markdoc/helpers/get-operation/get-operation-info-by-id.d.ts +0 -4
  514. package/dist/markdoc/helpers/get-operation/get-operation-info-by-id.js +0 -1
  515. package/dist/markdoc/helpers/get-operation/get-operation-info-by-pointer.d.ts +0 -4
  516. package/dist/markdoc/helpers/get-operation/get-operation-info-by-pointer.js +0 -1
  517. package/dist/markdoc/helpers/get-operation/get-operation.d.ts +0 -14
  518. package/dist/markdoc/helpers/get-operation/get-operation.js +0 -1
  519. package/dist/markdoc/helpers/get-operation/index.d.ts +0 -4
  520. package/dist/markdoc/helpers/get-operation/index.js +0 -1
  521. package/dist/markdoc/helpers/get-operation/types/index.d.ts +0 -4
  522. package/dist/markdoc/helpers/get-operation/types/operation-identifier.d.ts +0 -5
  523. package/dist/markdoc/helpers/get-operation/types/operation-identifier.js +0 -0
  524. package/dist/markdoc/helpers/get-operation/types/operation-info.d.ts +0 -6
  525. package/dist/markdoc/helpers/get-operation/types/operation-info.js +0 -0
  526. package/dist/markdoc/helpers/get-operation/types/operation-parameters.d.ts +0 -3
  527. package/dist/markdoc/helpers/get-operation/types/operation-parameters.js +0 -0
  528. package/dist/server/plugins/markdown/attribute-resolvers/helpers/get-media-content-samples.d.ts +0 -4
  529. package/dist/server/plugins/markdown/attribute-resolvers/helpers/get-media-content-samples.js +0 -1
  530. package/dist/server/plugins/mcp/codemode/sandbox/sandbox-polyfills.d.ts +0 -3
  531. package/dist/server/plugins/mcp/codemode/sandbox/sandbox.d.ts +0 -3
  532. package/dist/server/plugins/mcp/codemode/sandbox/sandbox.js +0 -15
  533. package/dist/server/plugins/mcp/handlers/sse-keepalive.d.ts +0 -15
  534. package/dist/server/plugins/mcp/handlers/sse-keepalive.js +0 -3
  535. /package/dist/{markdoc/helpers/get-operation/types/index.js → server/sandbox/types.js} +0 -0
@@ -0,0 +1,105 @@
1
+ import P from"node:path";import{REDOCLY_TEAMS_RBAC as O}from"@redocly/config";import{nodeTypes as h,contentType as g}from"@redocly/api-docs";import{normalizeApiVersion as sn}from"../utils/normalize-api-version.js";import{replaceFileExtension as v}from"../utils/replace-file-extension.js";import{isResourcePubliclyAccessible as cn,canDownloadApiDefinition as ln,extractTeamsFromScopeItems as fn}from"../../../utils/rbac.js";import{getLlmsTxtMdPathBySlug as J}from"../../../utils/llmstxt/get-llms-txt-md-path-by-slug.js";import{PUBLIC_API_DEFINITIONS_FOLDER as Q}from"../../../constants/common.js";import{DEFAULT_ANONYMOUS_VISITOR_TEAM as an,GRAPHQL_SPEC_SLUG as pn}from"../../../../constants/common.js";import{toMarkdown as N}from"../../markdown/search/to-markdown.js";import{createRenderTagFn as un}from"../../markdown/search/create-render-tag-fn.js";import{getLocaleFromRelativePath as dn}from"../../../fs/utils/get-locale-from-relative-path.js";import{getBuildTranslateContext as hn}from"../../../utils/l10n/get-build-translate-context.js";import{llmsTxtLink as w}from"../../search/llmstxt/index.js";import{formatDocumentMetadata as mn}from"../../search/utils.js";import{extractDocumentSearchFacets as $n}from"./search-facets.js";import{ApiDocsSearchIndexer as gn}from"./search-indexer.js";function A(t,r){return r==="openapi"&&"openapi"in t}function Y(t,r){return r==="asyncapi"&&"asyncapi"in t}function Jn({items:t,metadata:r,store:c,document:n,specType:o,excludeFromSearch:i,basePath:e,getSearchFacets:l,markdocTags:s}){return async(f,a,u,d)=>{if(i)return;const m={...d.markdocOptions?.tags,...s},{locale:X,translate:Z}=await hn(f.slug,d.getGlobalData?.().l10n),C=un(m,X,Z),x=await u.getConfig(),R=dn(f.fsPath),M=new gn(e,c?.schemaStore,n),j=y=>{for(const p of y)M.addItem(p),p.items?.length&&j(p.items)};j(t);const nn=M.getResult(),V=new Map;for(const y of nn)V.set(y.url,y);const L=typeof r.title=="string"?r.title:void 0,_=sn(r.version),E=$n(f.metadata||{},L,_,l),I=[],S=[],F=yn(r,n,o),q=bn(o,r,f.fsPath,x),tn=Sn(t,x,C),en=F+q+`
2
+ `+tn,on=F+q;S.push({title:L||"API Overview",description:typeof r.description=="string"?r.description:void 0,content:en,slug:e,fsPath:f.fsPath,includeInLLMsTxt:!0}),I.push({title:L||"API Overview",content:on,url:e,fsPath:f.fsPath,locale:R,product:f.product?.name,facets:E});const rn=n&&A(n,o)?n.security:void 0,D=y=>{for(const p of y){if(!p.content||!p.link){p.items?.length&&D(p.items);continue}const k=V.get(p.link),G=p.content.contentType,z=p[O],W=z?fn(z):void 0,B=W?.length?W:void 0;if(G===g.ITEM){const $=Pn(p,n,o)??H(p,k,o,_,rn,C);if($){const b=p.label||"";S.push({title:b,description:void 0,content:$,slug:p.link,fsPath:f.fsPath,includeInLLMsTxt:!1}),I.push({title:b,content:$,url:p.link,fsPath:f.fsPath,locale:R,product:f.product?.name,facets:E,rbacTeams:B})}}else if(G===g.GROUP){const $=On(p,x,o,C);if($){const b=p.label||"";S.push({title:b,description:k?Ln(k.text):void 0,content:$.llmstxt,slug:p.link,fsPath:f.fsPath,includeInLLMsTxt:!1}),I.push({title:b,content:$.aiSearch,url:p.link,fsPath:f.fsPath,locale:R,product:f.product?.name,facets:E,rbacTeams:B})}}p.items?.length&&D(p.items)}};return D(t),{async getLLMsTxts(){return S},async getSearchDocuments(){return I}}}}function yn(t,r,c){const n=typeof t.title=="string"?t.title:"",o=typeof t.description=="string"?t.description:"",i=typeof t.summary=="string"?t.summary:"",e=typeof t.version=="string"?t.version:"";let l=n?`# ${n}
3
+
4
+ `:"";if(l+=o?`${o}
5
+
6
+ `:"",l+=i?`${i}
7
+
8
+ `:"",l+=e?`Version: ${e}
9
+ `:"",r){if(A(r,c)){const{info:s}=r;s?.license?.name&&(l+=`License: ${s.license.name}
10
+ `);const f=s["x-metadata"],a=mn(f);a&&(l+=`
11
+ Metadata:
12
+ ${a}
13
+ `)}else if(Y(r,c)){const{info:s}=r;s?.license?.name&&(l+=`License: ${s.license.name}
14
+ `)}}return l+=`
15
+ `,l+=An(r,c),l+=In(r,c),l}function bn(t,r,c,n){if(!c)return"";let o,i,e;if(t==="openapi")o=P.posix.join(Q,v(c,".yaml")),i="## Download OpenAPI description",e="OpenAPI definition";else if(t==="asyncapi")o=P.posix.join(Q,v(c,".yaml")),i="## Download AsyncAPI description",e="AsyncAPI definition";else if(t==="graphql"){const f=P.posix.extname(c)||".graphql";o=P.posix.join(pn,v(c,f)),i="## Download GraphQL schema",e="GraphQL schema"}else return"";if(!ln(o,n.access?.rbac??{},n.access?.requiresLogin??!1,{isAuthenticated:!1,teams:[an]}))return"";const s=typeof r.title=="string"&&r.title||e;return`${i}
16
+
17
+ - ${w({title:s,description:void 0,slug:o})}`}function An(t,r){if(!t)return"";if(A(t,r)){const{servers:c}=t;if(!c?.length)return"";let n=`## Servers
18
+
19
+ `;for(const o of c)if(o.description&&(n+=`${o.description}
20
+ `),n+=`\`\`\`
21
+ ${o.url}
22
+ \`\`\`
23
+
24
+ `,o.variables){n+=`Variables:
25
+ `;for(const[i,e]of Object.entries(o.variables))n+=`- \`${i}\`${e.description?`: ${e.description}`:""}
26
+ `,e.default&&(n+=` Default: ${JSON.stringify(e.default)}
27
+ `),e.enum&&(n+=` Enum: ${e.enum.map(l=>JSON.stringify(l)).join(", ")}
28
+ `);n+=`
29
+ `}return n}if(Y(t,r)){const{servers:c}=t;if(!c||!Object.keys(c).length)return"";let n=`## Servers
30
+
31
+ `;for(const[o,i]of Object.entries(c))n+=`### ${o}
32
+
33
+ `,i.description&&(n+=`${i.description}
34
+ `),i.host&&(n+=`Host: ${i.host}
35
+ `),i.protocol&&(n+=`Protocol: ${i.protocol}
36
+ `),i.protocolVersion&&(n+=`Protocol Version: ${i.protocolVersion}
37
+ `),i.pathname&&(n+=`Pathname: ${i.pathname}
38
+ `),n+=`
39
+ `;return n}return""}function In(t,r){if(!t||!A(t,r))return"";const c=t.components?.securitySchemes;if(!c)return"";let n=`## Security
40
+
41
+ `;for(const[o,i]of Object.entries(c)){if(!i||"$ref"in i)continue;const e=i;n+=`### ${o}
42
+
43
+ `,e.description&&(n+=`${e.description}
44
+
45
+ `),e.type&&(n+=`Type: ${e.type}
46
+ `),e.in&&(n+=`In: ${e.in}
47
+ `),e.name&&(n+=`Name: ${e.name}
48
+ `),e.scheme&&(n+=`Scheme: ${e.scheme}
49
+ `),e.bearerFormat&&(n+=`Bearer Format: ${e.bearerFormat}
50
+ `),e.openIdConnectUrl&&(n+=`OpenID Connect URL: ${e.openIdConnectUrl}
51
+ `);const l=e.flows,s=l?.implicit||l?.password||l?.clientCredentials||l?.authorizationCode;if(s&&("authorizationUrl"in s&&s.authorizationUrl&&(n+=`Authorization URL: ${s.authorizationUrl}
52
+ `),"tokenUrl"in s&&s.tokenUrl&&(n+=`Token URL: ${s.tokenUrl}
53
+ `),s.scopes)){n+=`Scopes:
54
+ `;for(const[f,a]of Object.entries(s.scopes))n+=`- \`${f}\`: ${a}
55
+ `}n+=`
56
+ `}return n}function Sn(t,r,c){let n="";const o=(i,e)=>{for(const l of i)if(l.link){if(l.content?.contentType===g.GROUP)n+=`${e} ${l.label||""}
57
+
58
+ `,l.items?.length&&o(l.items,e+"#");else if(l.content?.contentType===g.ITEM){if(!U(l,r))continue;const s=l,f=s.httpVerb,a=s.httpPath,u=f&&a?`${f.toUpperCase()} ${a}`:l.label||"",d=l.content?T(l.content.children,c):void 0;n+=` - ${w({title:u,description:d?d.slice(0,200):void 0,slug:J(l.link)})}`}}};return o(t,"##"),n}function H(t,r,c,n,o,i){if(!t.content)return;const e=t,l=t.label||"",s=T(t.content.children,i),f=t.content.meta?.deprecated;let a=`# ${l}${f?" (deprecated)":""}
59
+
60
+ `;if(s&&(a+=`${s}
61
+
62
+ `),c==="openapi"||c==="asyncapi"){const u=e.httpVerb,d=e.httpPath;u&&d?a+=`Endpoint: ${u.toUpperCase()} ${d}
63
+ `:u&&(a+=`Method: ${u.toUpperCase()}
64
+ `),n&&(a+=`Version: ${n}
65
+ `);const m=Tn(t.content.children,o);m&&(a+=`Security: ${m}
66
+ `)}return r?.parameters?.length&&c!=="graphql"&&(a+=`
67
+ `+Cn(r.parameters)+`
68
+ `),c==="graphql"&&(a+=xn(t.content.children)),a}function Pn(t,r,c){if(t.httpVerb!=="tool"||!r||!A(r,c))return;const n=t.content?.meta?.name,o=n?r["x-mcp"]?.tools?.find(e=>e.name===n):void 0;if(!o)return;let i=`# ${t.label||o.name}
69
+
70
+ `;return typeof o.description=="string"&&o.description&&(i+=`${o.description}
71
+
72
+ `),i+=`## Input schema:
73
+
74
+ `,i+=`\`\`\`json
75
+ ${JSON.stringify(o.inputSchema,null,2)}
76
+ \`\`\`
77
+
78
+ `,o.outputSchema&&(i+=`## Output schema:
79
+
80
+ `,i+=`\`\`\`json
81
+ ${JSON.stringify(o.outputSchema,null,2)}
82
+ \`\`\`
83
+
84
+ `),i}function On(t,r,c,n){if(!t.content)return;const o=t.label||"",i=T(t.content.children,n);let e=`# ${o}
85
+
86
+ `;if(i&&(e+=`${i}
87
+
88
+ `),c==="graphql"){let s="";const f=a=>{for(const u of a??[])if(!(!u.content||!U(u,r)))if(u.content.contentType===g.ITEM){const d=H(u,void 0,c,void 0,void 0,n);d&&(s+=`${d}
89
+
90
+ ---
91
+
92
+ `)}else u.content.contentType===g.GROUP&&f(u.items)};return f(t.items),{llmstxt:e+s,aiSearch:e}}let l="";if(t.items?.length)for(const s of t.items){if(!s.link||!s.content||s.content.contentType!==g.ITEM||!U(s,r))continue;const f=s,a=f.httpVerb,u=f.httpPath,d=a&&u?`${a.toUpperCase()} ${u}`:s.label||"",m=s.content?T(s.content.children,n):void 0;l+=` - ${w({title:d,description:m?m.slice(0,200):void 0,slug:J(s.link)})}`}return{llmstxt:e+l,aiSearch:e}}function Tn(t,r){const c=[],n=o=>{for(const i of o)if(i.nodeType===h.SECURITY){const e=i;for(const l of e.requirements)for(const s of l.schemes)s[O]||s.name&&!c.includes(s.name)&&c.push(s.name)}else(i.nodeType===h.CONTAINER||i.nodeType===h.OVERVIEW_SECTION_WRAPPER)&&n(i.children)};if(n(t),c.length)return c.join(", ");if(r?.length){const o=r.flatMap(i=>Object.keys(i));if(o.length)return[...new Set(o)].join(", ")}}function Cn(t){const r={};for(const n of t){const o=`${n.place}${n.mediaType?` (${n.mediaType})`:""}`;r[o]||(r[o]=[]),r[o].push(n)}return Object.entries(r).map(([n,o])=>{const i=o.map(e=>{const l=[...e.path||[],e.name],s=Array.isArray(e.description)?e.description.join(" "):e.description;let f=` - \`${l.join(".")}\` (${e.type}${e.required?", required":""})
93
+ `;return s&&(f+=` ${s.trim()}
94
+ `),e.enum?f+=` Enum: ${e.enum.map(a=>JSON.stringify(a)).join(", ")}
95
+ `:e.example&&(f+=` Example: ${e.example}
96
+ `),f});return`## ${K(n)}:
97
+
98
+ ${i.join(`
99
+ `)}`}).join(`
100
+ `)}function xn(t){let r="";const c=n=>{for(const o of n)if(o.nodeType===h.ITEM){const i=o;i.graphqlSchema&&(r+=Rn(i.graphqlSchema,i.variant))}else(o.nodeType===h.CONTAINER||o.nodeType===h.OVERVIEW_SECTION_WRAPPER)&&c(o.children)};return c(t),r}function Rn(t,r){let n=`
101
+ ## ${K(r==="return-type"?"Return type":r==="graphql-args"||r==="arguments"?"Arguments":r==="graphql-fields"?"Fields":r)}:
102
+
103
+ `;const o=i=>{const e=i.description?N(Array.isArray(i.description)?i.description:[i.description]).trim():"";return` - \`${i.name}\` (${i.type})${e?`: ${e}`:""}
104
+ `};if(!Array.isArray(t)){const i=t.description?N(Array.isArray(t.description)?t.description:[t.description]).trim():"";n+=` Type: ${t.type}`,i&&(n+=` - ${i}`),n+=`
105
+ `;for(const e of t.fields??[])n+=o(e);return n}if(!t.length)return"";for(const i of t)n+=o(i);return n}function T(t,r){const c=[],n=i=>{for(const e of i)if(e.nodeType===h.MARKDOC){const l=e.content,s=Array.isArray(l)?l:[l],f=N(s,{renderTag:r}).trim();f&&c.push(f)}else(e.nodeType===h.CONTAINER||e.nodeType===h.OVERVIEW_SECTION_WRAPPER)&&n(e.children)};return n(t),c.join(" ").trim()||void 0}function Ln(t){return(Array.isArray(t)?t.join(" "):t)||void 0}function K(t){return t.charAt(0).toUpperCase()+t.slice(1)}function U(t,r){return r.access?.requiresLogin?!0:cn({slug:t.link||"",[O]:t[O]},r)}export{Jn as getAiDocumentsStore};
@@ -0,0 +1,10 @@
1
+ import type { SearchFacet } from '@redocly/theme/core/types';
2
+ export declare function setDocumentSearchFacets(documentSearchFacets: {
3
+ [key: string]: string | Set<string>;
4
+ }, getSearchFacets: () => Map<string, SearchFacet>, setSearchFacets: (searchFacets: Map<string, SearchFacet>) => void): void;
5
+ export declare function extractDocumentSearchFacets(metadata: {
6
+ [key: string]: unknown;
7
+ }, apiTitle: string | undefined, apiVersion: string | undefined, getSearchFacets: () => Map<string, SearchFacet>): {
8
+ [key: string]: string;
9
+ };
10
+ //# sourceMappingURL=search-facets.d.ts.map
@@ -0,0 +1 @@
1
+ import{SEARCH_GROUP_FACET_FIELD as a}from"../../../../constants/common.js";import{SEARCH_GROUP_NAME_API as u}from"../../../constants/plugins/search.js";function F(e,n,s){const f=n();for(const[t,o]of Object.entries(e)){const c=f.get(t);if(c){const r=new Set(c.values??[]);if(o instanceof Set)for(const i of o)r.add(i);else r.add(o);c.values=Array.from(r)}}s(f)}function h(e,n,s,f){const t={[a]:u,...n&&{apiTitle:n},...s&&{apiVersion:s}};if(!e)return t;const o=f();for(const[c,r]of Object.entries(e))o.has(c)&&(t[c]=String(r));return e.title&&(t.apiTitle=String(e.title)),t}export{h as extractDocumentSearchFacets,F as setDocumentSearchFacets};
@@ -0,0 +1,9 @@
1
+ import type { ApiItem, SchemaEntry } from '@redocly/api-docs';
2
+ import type { SearchDocument } from '../../../types';
3
+ export declare class ApiDocsSearchIndexer {
4
+ #private;
5
+ constructor(basePath: string, schemaStore?: Record<string, SchemaEntry>, document?: Record<string, unknown>);
6
+ addItem(item: ApiItem): void;
7
+ getResult(): SearchDocument[];
8
+ }
9
+ //# sourceMappingURL=search-indexer.d.ts.map
@@ -0,0 +1 @@
1
+ import{REDOCLY_TEAMS_RBAC as p}from"@redocly/config";import{extractFullText as W,nodeTypes as g,contentType as P,schemaKind as j}from"@redocly/api-docs";import{toMarkdown as H}from"../../markdown/search/to-markdown.js";const L=10,_=200,C="message payload",D="message headers";function E(h){if(typeof h=="string")return h;const e=Array.isArray(h)?h:[h];return H(e).trim()}function N(h){return h.length>_?`${h.slice(0,_)}\u2026`:h}class B{#c=[];#i;#s;#o;#f;constructor(e,t,n){this.#i=e,this.#s=t,this.#o=n}addItem(e){if(!(!e.link||!e.content))try{switch(e.content.contentType){case P.OVERVIEW:this.#a(e,this.#i);break;case P.GROUP:case P.ITEM:this.#a(e,e.link);break}}catch(t){console.error(`Cannot add item to api-docs search indexer [${e.label}, ${e.link}]:`,t.message)}}#a(e,t){if(!e.content)return;const n=t.startsWith(this.#i+"/")?t.slice(this.#i.length+1):t.split("/").slice(-2).join("/"),i=e.content.children,o=this.#p(i),f=this.#y(i,n),r=e,s={id:t,url:t,title:e.label??"",text:o,path:[],deprecated:e.content.meta?.deprecated,..."httpVerb"in e&&e.httpVerb?{httpMethod:e.httpVerb}:{},..."httpPath"in e&&e.httpPath?{httpPath:e.httpPath}:{},..."badges"in e&&Array.isArray(e.badges)&&e.badges.length?{badges:e.badges}:{},..."isAdditionalOperation"in e&&e.isAdditionalOperation?{isAdditionalOperation:!0}:{},[p]:r[p],...f.length&&{parameters:f}};this.#c.push(s)}#p(e){const t=[],n=i=>{for(const o of i)if(o.nodeType===g.MARKDOC){const f=o;if(this.#h(f.content))continue;const r=W(f.content);r&&t.push(r)}else(o.nodeType===g.CONTAINER||o.nodeType===g.OVERVIEW_SECTION_WRAPPER)&&n(o.children)};return n(e),t.join(" ").trim()}#h(e){let t=!1,n=!1;const i=f=>{f.type==="code"&&f.attributes?.content?t=!0:f.type==="text"&&f.attributes?.content&&(n=!0);for(const r of f.children??[])i(r)},o=Array.isArray(e)?e:[e];for(const f of o)i(f);return t&&!n}#y(e,t){const n={},i=new Set,o=f=>{for(const r of f)if(r.nodeType===g.ITEM){const s=r;if(s[p])continue;if(s.parameters?.length)for(const a of s.parameters){if(a[p])continue;const d=this.#O(s.variant),c=this.#$(s.variant),u=a.description?E(a.description):"",l=this.#A(a.schemaId),$={name:a.name,description:u,place:d,mediaType:void 0,type:l,required:a.required??!1,deepLink:this.#d(t,"request",c,void 0,void 0,[a.name]),example:void 0,enum:void 0};n[this.#n($)]=$}this.#g(s,n,i,t)}else if(r.nodeType===g.CONTAINER){const s=r;if(s[p])continue;o(s.children)}else r.nodeType===g.OVERVIEW_SECTION_WRAPPER&&o(r.children)};return o(e),Object.values(n)}#n(e){return[...Array.isArray(e.path)?e.path:[],e.name.toString()].join(".")+e.description+e.place}#d(e,t,n,i,o,f){if(!e)return"";const r=f.join("/"),s=[`t=${t}`];return n&&s.push(`in=${n}`),o&&s.push(`c=${o}`),i&&s.push(`ct=${i}`),r&&s.push(`path=${r}`),`/${e}#${e}/${s.join("&")}`.toLowerCase()}#m(e,t,n,i){if(!e)return"";let o="messages";t&&(o+=`&m=${t}`),o+=`&t=${n}`;const f=i.join("/");return f&&(o+=`&path=${f}`),`/${e}#${e}/${o}`.toLowerCase()}#$(e){switch(e){case"query":return"query";case"path":return"path";case"headers":return"header";case"cookies":return"cookie";default:return}}#O(e){switch(e){case"query":return"query parameters";case"path":return"path parameters";case"headers":return"header parameters";case"cookies":return"cookie parameters";case"parameters":return"channel parameters";default:return e?`${e} parameters`:"parameters"}}#A(e){const t=this.#s?.[e];if(!t||t.kind!==j.JSON_SCHEMA)return"unknown";const n=t.data,i=this.#l(n);return this.#u(i)}#u(e){return Array.isArray(e.type)?e.type.join(" | "):e.type?e.type:e.properties||e.additionalProperties?"object":e.items?"array":e.enum?"string":"any"}#g(e,t,n,i){const o=this.#E(e);if(e.graphqlSchema&&Array.isArray(e.graphqlSchema)){this.#S(e.graphqlSchema,o,t);return}if(!this.#s||!this.#o)return;const f=o.startsWith("response");if(e.mediaTypeSchemas){const r=Object.entries(e.mediaTypeSchemas),s=r.find(([,a])=>!a[p]);if(s){const[a,d]=s;d.schemaId&&this.#r(d.schemaId,o,a,r.length>1,f,t,[],n,i)}}else e.schemaId&&this.#r(e.schemaId,o,void 0,!1,f,t,[],n,i);if(e.responses)for(const r of e.responses){if(r[p])continue;const s=`response ${r.code} fields`,a=new Set;if(r.mediaTypeContent){const d=Object.entries(r.mediaTypeContent),c=d.find(([,u])=>!u[p]);if(c){const[u,l]=c;l.schemaId&&this.#r(l.schemaId,s,u,d.length>1,!0,t,[],a,i)}}else r.schemaId&&this.#r(r.schemaId,s,r.mediaType,!1,!0,t,[],a,i)}if(e.messages)for(const r of e.messages){if(r[p])continue;const s=r.description?E(r.description):"",a=r.summary??"",d={name:r.name,description:(s+a).trim(),place:"message",mediaType:void 0,type:"unknown",required:!1,example:void 0,enum:void 0};t[this.#n(d)]=d,this.#f=r.name;const c=new Set;r.schemaId&&this.#r(r.schemaId,C,r.contentType,!1,!1,t,[],c,i),r.headerSchemaId&&this.#r(r.headerSchemaId,D,void 0,!1,!1,t,[],c,i),this.#f=void 0}}#E(e){switch(e.variant){case"body":return"request fields";case"responses":return"response fields";case"graphql-fields":return"fields";case"graphql-args":return"arguments";case"return-type":return"return type fields";default:return e.variant??"fields"}}#S(e,t,n){for(const i of e){const o=i.description?E(i.description):"",f={name:i.name,description:o,place:t,mediaType:void 0,path:[],type:i.type??"unknown",required:!1,example:void 0,enum:void 0};if(n[this.#n(f)]=f,i.args?.length)for(const r of i.args){const s=r.description?E(r.description):"",a={name:r.name,description:s,place:"arguments",mediaType:void 0,path:[i.name],type:r.type??"unknown",required:!1,example:void 0,enum:void 0};n[this.#n(a)]=a}}}#r(e,t,n,i,o,f,r,s,a=""){const d=this.#s?.[e];if(!d||d.kind!==j.JSON_SCHEMA||d[p])return;const c=d.data,u=i?n:void 0;this.#t(c,t,n,u,o,f,r,s,0,a)}#I(e){const t=e.match(/^response (\d+)/);return t?t[1]:void 0}#l(e){if(e.allOf){const t={};for(const n of e.allOf){const i=n.$ref?this.#e(n.$ref):n;if(i){const o=t.properties,f=t.required;Object.assign(t,i),(o||i.properties)&&(t.properties={...o||{},...i.properties||{}}),(f||i.required)&&(t.required=[...f||[],...i.required||[]])}}return delete t.allOf,e.description&&(t.description=e.description),t}if(e.$ref){const t=this.#e(e.$ref);if(t){const n={...t};return e.description&&(n.description=e.description),n}}return e}#e(e){if(!e.startsWith("#/"))return;const t=e.slice(2).split("/");let n=this.#o;for(const i of t){if(n==null||typeof n!="object")return;n=n[i]}return n!=null&&typeof n=="object"?n:void 0}#t(e,t,n,i,o,f,r,s,a,d=""){if(!(a>L||e[p])){if(e.$ref){if(s.has(e.$ref))return;s.add(e.$ref);const c=this.#e(e.$ref);c&&this.#t(c,t,n,i,o,f,r,s,a,d);return}if(e.allOf){const c={};for(const u of e.allOf){let l=u;if(u.$ref){if(s.has(u.$ref))continue;s.add(u.$ref),l=this.#e(u.$ref)}if(l){const $=c.properties,A=c.required;Object.assign(c,l),($||l.properties)&&(c.properties={...$||{},...l.properties||{}}),(A||l.required)&&(c.required=[...A||[],...l.required||[]])}}delete c.allOf,this.#t(c,t,n,i,o,f,r,s,a,d);return}if(e.discriminator&&e.properties&&e.oneOf){this.#t({...e,oneOf:void 0,discriminator:void 0},t,n,i,o,f,r,s,a,d);return}if(e.oneOf||e.anyOf){for(const c of e.oneOf||e.anyOf||[]){if(c.$ref){if(s.has(c.$ref))continue;s.add(c.$ref)}const u=c.$ref?this.#e(c.$ref):c;u&&this.#t(u,t,n,i,o,f,r,s,a+1,d)}return}if(e.properties){const c=e.required||[],u=this.#I(t),l=o?"response":"request",$=t===C?"payload":t===D?"headers":void 0;for(const[A,O]of Object.entries(e.properties)){if(O[p])continue;if(O.$ref){if(s.has(O.$ref))continue;s.add(O.$ref)}const m=O.$ref?this.#e(O.$ref):O;if(!m)continue;let x=!1;if(m.allOf){let b=!1;for(const q of m.allOf)q.$ref?s.has(q.$ref)||(s.add(q.$ref),b=!0):b=!0;x=!b}const y=this.#l(m);if(m[p]||y[p]||y.readOnly&&!o||y.writeOnly&&o||m.additionalProperties!==void 0&&!m.properties)continue;const T=m.description??y.description,R=T?E(T):"",S=m.example??y.example,V=S!==void 0?N(typeof S=="string"?S:JSON.stringify(S)):void 0,v=Array.isArray(y.enum)&&y.enum.length?y.enum:void 0,I=[...r,A],w={name:A,description:R,place:t,mediaType:n,path:r,type:this.#u(y),required:c.includes(A),deepLink:$?this.#m(d,this.#f,$,I):this.#d(d,l,void 0,i,u,I),example:V,enum:v},k=this.#n(w);f[k]==null&&(f[k]=w,x||this.#t(y,t,n,i,o,f,I,s,a+1,d))}}if(e.items&&typeof e.items=="object"&&!Array.isArray(e.items)){if(e.items.$ref){if(s.has(e.items.$ref))return;s.add(e.items.$ref)}const c=e.items.$ref?this.#e(e.items.$ref):e.items;c&&this.#t(c,t,n,i,o,f,r,s,a+1,d)}}}getResult(){return this.#c}}export{B as ApiDocsSearchIndexer};
@@ -0,0 +1,5 @@
1
+ import type { SearchFacet } from '@redocly/theme/core/types';
2
+ import type { ApiItem, ApiDocsMetadata, ApiStore } from '@redocly/api-docs';
3
+ import type { PageRouteDetails, SearchDocument } from '../../../types';
4
+ export declare function searchResolver(items: ApiItem[], metadata: ApiDocsMetadata, getSearchFacets: () => Map<string, SearchFacet>, setSearchFacets: (searchFacets: Map<string, SearchFacet>) => void, excludeFromSearch?: boolean, store?: ApiStore, document?: Record<string, unknown>): (route: PageRouteDetails) => Promise<SearchDocument[]>;
5
+ //# sourceMappingURL=search-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ import{REDOCLY_ROUTE_RBAC as p,REDOCLY_TEAMS_RBAC as o}from"@redocly/config";import{extractDocumentSearchFacets as A,setDocumentSearchFacets as D}from"./search-facets.js";import{ApiDocsSearchIndexer as d}from"./search-indexer.js";import{normalizeApiVersion as x}from"../utils/normalize-api-version.js";function O(h,i,c,u,R,g,S){return async e=>{if(R)return[];const a=e.baseSlug||e.slug,m=new d(a,g?.schemaStore,S),f=t=>{for(const r of t)m.addItem(r),r.items?.length&&f(r.items)};f(h);const s=typeof i.title=="string"?i.title:void 0,n=x(i.version),l=A(e.metadata||{},s,n,c);return D(l,c,u),m.getResult().map(t=>({...t,...t.url===a&&s&&{title:n?`${s} (${n})`:s},[o]:t[o]??e[o],[p]:e[p]??{slug:e.slug,fsPath:e.fsPath},facets:l}))}}export{O as searchResolver};
@@ -0,0 +1,4 @@
1
+ import type { ApiRoutesHandler } from '@redocly/config';
2
+ declare const specDownloadApi: ApiRoutesHandler;
3
+ export default specDownloadApi;
4
+ //# sourceMappingURL=spec-download.api.d.ts.map
@@ -0,0 +1 @@
1
+ import e from"node:path";import{existsSync as c}from"node:fs";import{readFile as F}from"node:fs/promises";import C from"js-yaml";import{withoutPathPrefix as U}from"@redocly/theme/core/utils";import{DEPRECATED_PUBLIC_API_DEFINITIONS_FOLDER as I,PUBLIC_API_DEFINITIONS_FOLDER as p}from"../../constants/common.js";import{GRAPHQL_SPEC_SLUG as y}from"../../../constants/common.js";import{canDownloadApiDefinition as O,filterDataByAccessDeep as q}from"../../utils/rbac.js";function A(a,t){const n=e.parse(a);return e.join(n.dir,n.name+t)}const T=async(a,t,n)=>{const{isAuthenticated:i,teams:l,claims:{email:f}}=t.user,S=new URL(a.url),o=U(S.pathname),m=o.startsWith(y),s=decodeURIComponent(m?o.replace(y,""):o.replace(p,"").replace(I,"")),{rbac:u={},requiresLogin:d=!1}=t.config.access||{};if(!O(o,u,d,{isAuthenticated:i,email:f,teams:l}))return new Response("Unauthorized",{status:i?403:401});const r=n.props?.outdir||"";if(m){const E=e.join(r,p,s);if(!c(E))return new Response("Not found",{status:404});const x=await F(E,"utf-8");return new Response(x,{headers:{"Content-Type":"application/graphql"}})}const h=e.join(r,p,A(s,".json")),P=e.join(r,I,A(s,".json")),R=c(h),_=c(P);if(!R&&!_)return new Response("Not found",{status:404});const L=await F(R?h:P,"utf-8"),N=JSON.parse(L),w=q(N,{isAuthenticated:i,email:f,teams:l},u,d),D=e.extname(s),j=D===".yaml"?C.dump(w):JSON.stringify(w,null,2);return new Response(j,{headers:{"Content-Type":D===".yaml"?"application/yaml":"application/json"}})};var k=T;export{k as default};
@@ -0,0 +1,3 @@
1
+ import type { BundledApiDefinition } from './loader.js';
2
+ export declare function storeDefinitionBundles(definitions: BundledApiDefinition[], outDir: string): void;
3
+ //# sourceMappingURL=store-definition-bundles.d.ts.map
@@ -0,0 +1 @@
1
+ import{writeFileSync as m}from"fs";import p from"path";import{print as d}from"graphql";import{PUBLIC_API_DEFINITIONS_FOLDER as h,PUBLIC_STATIC_FOLDER as a}from"../../constants/common.js";import{logger as u}from"../../tools/notifiers/logger.js";import{ensureDir as g}from"../../utils/fs.js";import{replaceFileExtension as S}from"./utils/replace-file-extension.js";const r=new Map;function D(f,t){const n=h.slice(1);try{for(const e of f){const{document:s,relativePath:i,hash:o,type:c}=e;if(r.get(i)!==o){if(c==="graphql"){l({outDir:t,definitionFolder:n,relativePath:i,definitionString:d(s)}),r.set(i,o);continue}if(i.startsWith(a+"/")){l({outDir:t,definitionFolder:".",relativePath:i.replace(a+"/",""),definitionString:JSON.stringify(s,null,2)}),r.set(i,o);continue}l({outDir:t,definitionFolder:n,relativePath:S(i,".json"),definitionString:JSON.stringify(s,null,2)}),r.set(i,o)}}}catch(e){u.error("failed to store definition bundles",e)}}function l({outDir:f,definitionString:t,relativePath:n,definitionFolder:e}){m(g(p.resolve(f,`${e}/${n}`)),t,"utf8")}export{D as storeDefinitionBundles};
@@ -0,0 +1,17 @@
1
+ import type { ApiItem } from '@redocly/api-docs';
2
+ export type ItemPosition = {
3
+ position: {
4
+ start: {
5
+ lineNumber: number;
6
+ column: number;
7
+ };
8
+ end?: {
9
+ lineNumber: number;
10
+ column: number;
11
+ };
12
+ };
13
+ startLine: number;
14
+ endLine: number;
15
+ };
16
+ export declare function buildItemPositions(items: ApiItem[], baseSlug: string, acc?: Record<string, ItemPosition>): Record<string, ItemPosition>;
17
+ //# sourceMappingURL=build-item-positions.d.ts.map
@@ -0,0 +1 @@
1
+ import{toRelativeSlug as s}from"./to-relative-slug.js";function m(r,n,i={}){for(const t of r){const e=t.content?.meta?.position,o=t.routeSlug??t.link;e&&o&&(i[s(o,n)]={position:e,startLine:e.start.lineNumber,endLine:e.end?.lineNumber??e.start.lineNumber}),t.items?.length&&m(t.items,n,i)}return i}export{m as buildItemPositions};
@@ -0,0 +1,3 @@
1
+ import type { ApiItem } from '@redocly/api-docs';
2
+ export declare function buildRoutesMapping(items: ApiItem[], baseSlug: string, acc?: Record<string, string>): Record<string, string>;
3
+ //# sourceMappingURL=build-routes-mapping.d.ts.map
@@ -0,0 +1 @@
1
+ import{toRelativeSlug as u}from"./to-relative-slug.js";function f(r,e,o={}){for(const t of r){const i=t.content?.meta?.pointer,n=t.routeSlug??t.link;i&&n&&(o[`#${i}`]=u(n,e)),t.items?.length&&f(t.items,e,o)}return o}export{f as buildRoutesMapping};
@@ -0,0 +1,12 @@
1
+ import { REDOCLY_TEAMS_RBAC } from '@redocly/config';
2
+ import type { ApiItem } from '@redocly/api-docs';
3
+ import type { RbacScopeItems } from '@redocly/config';
4
+ export type ItemRouteEntry = {
5
+ link: string;
6
+ label?: string;
7
+ httpVerb?: string;
8
+ metadata?: Record<string, unknown>;
9
+ [REDOCLY_TEAMS_RBAC]?: RbacScopeItems;
10
+ };
11
+ export declare function collectItemRoutes(items: ApiItem[], configRbac?: RbacScopeItems, inheritedRbac?: RbacScopeItems): ItemRouteEntry[];
12
+ //# sourceMappingURL=collect-item-routes.d.ts.map
@@ -0,0 +1 @@
1
+ import{REDOCLY_TEAMS_RBAC as n}from"@redocly/config";function i(m,o,l){const e=[];for(const t of m){const s=t[n],a=s??l??o;t.link&&e.push({link:t.link,label:t.label,httpVerb:t.httpVerb,metadata:t.metadata,[n]:a}),t.items&&t.items.length>0&&e.push(...i(t.items,o,s??l))}return e}export{i as collectItemRoutes};
@@ -0,0 +1,26 @@
1
+ import type { RawUniversalConfig } from '@redocly/openapi-core';
2
+ export declare function isPlainNonMarkdownText(markdown: string): boolean;
3
+ export declare const MarkdownParserDecorator: ({ outputRelativePath, cwd, }: {
4
+ outputRelativePath: string;
5
+ cwd: string;
6
+ }) => {
7
+ any: {
8
+ leave(node: Record<string, unknown>, ctx: any): void;
9
+ };
10
+ ref: {
11
+ leave(node: Record<string, unknown>, ctx: any): void;
12
+ };
13
+ };
14
+ export declare const RbacDecorator: () => {
15
+ Tag: {
16
+ enter(node: Record<string, unknown>): void;
17
+ };
18
+ any: {
19
+ leave(node: Record<string, unknown>, ctx: any): void;
20
+ };
21
+ ref: {
22
+ leave(node: Record<string, unknown>): void;
23
+ };
24
+ };
25
+ export declare function injectDecoratorIntoConfig(config: RawUniversalConfig, outputRelativePath: string, cwd: string): RawUniversalConfig;
26
+ //# sourceMappingURL=decorators.d.ts.map
@@ -0,0 +1 @@
1
+ import b from"node:path";import{REDOCLY_TEAMS_RBAC as p}from"@redocly/config";import{slash as k}from"../../../../utils/path/slash.js";function f(t,r,a){if(!r)throw new Error("Visitor required");if(t){t.description&&r(t,"description",a.location.absolutePointer+"/description",a);for(const o in t["x-enumDescriptions"])r(t["x-enumDescriptions"],o,a.location.absolutePointer+"/x-enumDescriptions/"+o,a)}}const x=/^[a-zA-Z0-9\s\-,.!\?:;'"()/]+$/,d=/^\s*(?:[-+*]\s|\d+[.)]\s)/m;function g(t){return x.test(t)&&!d.test(t)}const s=({outputRelativePath:t,cwd:r})=>{const a=function(e,m,l,u){const{node:n}=u.resolve(e[m]);if(!n||typeof n!="string"||g(n))return;const i=u.getVisitorData();i.markdocChunks=i.markdocChunks||[],i.markdocChunks.push({node:e,pointer:k(b.relative(r,l)),markdown:n,relativePath:t,key:m})};return{any:{leave(o,e){f(o,a,e)}},ref:{leave(o,e){f(o,a,e)}}}},c=()=>{const t={};return{Tag:{enter(r){r?.["x-rbac"]&&(t[String(r.name)]=r["x-rbac"])}},any:{leave(r,a){if((a.type.name==="Operation"||a.type.name==="Webhook")&&"tags"in r&&Array.isArray(r.tags))for(const o of r.tags)t[o]&&(r["x-rbac"]=r["x-rbac"]||t[o]);r?.["x-rbac"]&&(r[p]=r["x-rbac"],delete r["x-rbac"])}},ref:{leave(r){r?.["x-rbac"]&&(r[p]=r["x-rbac"],delete r["x-rbac"])}}}};function D(t,r,a){const o={id:"markdown",decorators:{oas2:{markdown:s,rbac:c},oas3:{markdown:s,rbac:c},async3:{markdown:s,rbac:c}}};return{...t,decorators:{"markdown/rbac":"on","markdown/markdown":{outputRelativePath:r,cwd:a},...t.decorators||{}},plugins:[...t.plugins||[],o]}}export{s as MarkdownParserDecorator,c as RbacDecorator,D as injectDecoratorIntoConfig,g as isPlainNonMarkdownText};
@@ -0,0 +1,6 @@
1
+ import { type NormalizedProblem } from '@redocly/openapi-core';
2
+ /**
3
+ * Formats a bundle error with file path, line/column, and codeframe for better debugging.
4
+ */
5
+ export declare function formatBundleError(problem: NormalizedProblem, cwd: string): Promise<string>;
6
+ //# sourceMappingURL=format-bundle-error.d.ts.map
@@ -0,0 +1,5 @@
1
+ import f from"node:path";import{getLineColLocation as m,isAbsoluteUrl as g}from"@redocly/openapi-core";import{gray as s}from"../../../tools/notifiers/helpers/colors.js";import{getCodeframe as h}from"../../../utils/codeframes/codeframes.js";async function P(o,c){const e=o.location?.[0];if(!e)return`${o.message} at `;if(!e.source){const t=e.pointer??"";return`${o.message} at ${t}`}const n=g(e.source.absoluteRef)?e.source.absoluteRef:f.relative(c,e.source.absoluteRef);try{const t=m(e),i=e.pointer?s(`at ${e.pointer}`):"",l=`${n}:${t.start.line}:${t.start.col}`;let r="";try{const a=e.source?.getLines()??[],u={start:{line:t.start.line,character:t.start.col},end:{line:t.end?.line??t.start.line,character:t.end?.col??Math.max(t.start.col+1,a[t.start.line-1]?.length??t.start.col)},lines:a},{frame:$}=h(u,!0);r=$}catch{r=""}return`${l} ${i}
2
+ ${o.message}
3
+ ${r?`${r}
4
+ `:""}`}catch{const t=e.pointer?s(`at ${e.pointer}`):"";return`${n} ${t}
5
+ ${o.message}`}}export{P as formatBundleError};
@@ -0,0 +1,2 @@
1
+ export declare function normalizeApiVersion(value: unknown): string | undefined;
2
+ //# sourceMappingURL=normalize-api-version.d.ts.map
@@ -0,0 +1 @@
1
+ function r(n){if(!(n==null||typeof n=="object"))return String(n)}export{r as normalizeApiVersion};
@@ -0,0 +1,2 @@
1
+ export declare function normalizeFeedbackOptions(feedbackOptions: Record<string, any> | null | undefined): Record<string, any> | undefined;
2
+ //# sourceMappingURL=normalize-feedback-options.d.ts.map
@@ -0,0 +1 @@
1
+ import{FEEDBACK_TYPES as t}from"../../../../constants/common.js";function o(s){if(!s)return;let e="";const{type:i,settings:a}=s;switch(i){case t.RATING:e="Rate this section";break;case t.SENTIMENT:e="Was this section helpful?";break;case t.MOOD:e="Was this section helpful?";break;case t.COMMENT:e="Share your feedback about this section";break;case t.SCALE:e="How would you rate this section?";break}return{...s,settings:{...a,label:a?.label||e}}}export{o as normalizeFeedbackOptions};
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Convert a spec file's relative path to its base route slug, applying the same
3
+ * l10n transform the route builder uses (`@l10n/de/foo.yaml` -> `/de/foo`).
4
+ *
5
+ * Index files map to their directory URL (`foo/index.yaml` -> `/foo`). The
6
+ * index decision reuses `parseBaseName` — the exact primitive the core route
7
+ * slugifier uses (`isIndexFile` in server/plugins/lifecycle.ts) — so it can't
8
+ * drift from the core / openapi-docs. Without it, an API mounted at
9
+ * `output: foo/index.yaml` would land at `/foo/index` and break links/sidebar
10
+ * entries that reference it by its `index.yaml` output path.
11
+ *
12
+ * NOTE: this transform does NOT apply the content-slugs normalizations
13
+ * (versioned `@x.y` folders, custom slugs) — route building derives slugs
14
+ * through `createSlugify` instead. It is used by the loader-time mock-server
15
+ * URL (`options.ts`) and by `rebaseAutoMockServerUrl` (`index.ts`), which
16
+ * reconstructs the same value to detect the auto-generated URL and rebase it
17
+ * onto the normalized route slug.
18
+ */
19
+ export declare function relativePathToBaseSlug(relativePath: string): string;
20
+ //# sourceMappingURL=relative-path-to-base-slug.d.ts.map
@@ -0,0 +1 @@
1
+ import i from"node:path";import{isL10nPath as m}from"../../../fs/utils/is-l10n-path.js";import{getLocaleFromRelativePath as n}from"../../../fs/utils/get-locale-from-relative-path.js";import{removeL10nPrefix as s}from"../../../fs/utils/remove-l10n-prefix.js";import{parseBaseName as p}from"../../utils.js";function h(r){const{baseName:t,isIndexFile:a}=p(r),e=i.posix.dirname(r),o=a?e==="."?"":e:e==="."?t:i.posix.join(e,t);return m(o)?("/"+n(o).toLowerCase()+"/"+s(o)).replace(/\/{2,}/g,"/"):("/"+o).replace(/\/{2,}/g,"/")}export{h as relativePathToBaseSlug};
@@ -0,0 +1,2 @@
1
+ export declare function replaceFileExtension(filePath: string, fileExt: string): string;
2
+ //# sourceMappingURL=replace-file-extension.d.ts.map
@@ -0,0 +1 @@
1
+ import n from"node:path";function s(o,e){const i=n.posix.dirname(o),p=n.posix.basename(o,n.posix.extname(o))+e;return n.posix.join(i,p)}export{s as replaceFileExtension};
@@ -0,0 +1,3 @@
1
+ import type { ApiItem } from '@redocly/api-docs';
2
+ export declare function resolveApiDocTitle(info: Record<string, unknown> | undefined, type: string, navItems: ApiItem[]): string | undefined;
3
+ //# sourceMappingURL=resolve-api-doc-title.d.ts.map
@@ -0,0 +1 @@
1
+ function n(e,r,i){if(typeof e?.title=="string")return e.title;if(r==="graphql"){const t=i[0]?.label;if(typeof t=="string")return t}}export{n as resolveApiDocTitle};
@@ -0,0 +1,10 @@
1
+ import type { RbacScopeItems } from '@redocly/config';
2
+ type ConfigWithRbac = {
3
+ access?: {
4
+ rbac?: unknown;
5
+ };
6
+ rbac?: unknown;
7
+ };
8
+ export declare function resolveConfigRbac(config?: ConfigWithRbac): RbacScopeItems | undefined;
9
+ export {};
10
+ //# sourceMappingURL=resolve-config-rbac.d.ts.map
@@ -0,0 +1 @@
1
+ import{isRbacScopeItems as e}from"../../../utils/rbac/is-rbac-scope-items.js";function a(r){if(e(r?.access?.rbac))return r.access.rbac;if(e(r?.rbac))return r.rbac}export{a as resolveConfigRbac};
@@ -0,0 +1,2 @@
1
+ export declare function toRelativeSlug(absoluteSlug: string, baseSlug: string): string;
2
+ //# sourceMappingURL=to-relative-slug.d.ts.map
@@ -0,0 +1 @@
1
+ function i(r,t){return t?r===t?"":r.startsWith(`${t}/`)?r.slice(t.length+1):r:r}export{i as toRelativeSlug};
@@ -1 +1 @@
1
- import{join as c}from"path";import{transformSync as l}from"esbuild";import{REDOCLY_ROUTE_RBAC as p}from"@redocly/config";import{removeTrailingSlash as d}from"../../../utils/url/remove-trailing-slash.js";import{removeLeadingSlash as m}from"../../../utils/url/remove-leading-slash.js";import{logger as u}from"../../tools/notifiers/logger.js";import{envConfig as g}from"../../config/env-config.js";import{USER_DEFINED_API_FUNCTIONS_COUNTER_KEY as h}from"../../../server/store.js";import{parseRouteFsPathForHono as F}from"./helpers/parse-route-fs-path-for-hono.js";import{telemetryTraceStep as A}from"../../../cli/telemetry/helpers/trace-step.js";const f="api-functions",P=/\bexport\s+default\b|\bexport\s*\{[^}]*\b(?:default\s*[,}]|\w+\s+as\s+default\b)/;async function E(t,o){let i;try{i=await o.fs.read(t),l(i,{loader:t.endsWith(".js")?"js":"ts"})}catch(e){const a=e instanceof Error?e.message:String(e);return u.warn(`Skipping API function ${t} because it cannot be parsed: ${a}`),!1}if(!P.test(i)){const e=`API function ${t} does not export a default function. Add 'export default function (request, context) { ... }' to define an API function.`;return g.isDevelopMode?(u.warn(e),!0):(u.warn(`Skipping ${e}`),!1)}return!0}function R(t){return m(d(t))}function I(t){return`^${R(t)}`}function _(t){const o=t.map(I);return o.push(".*@api"),new RegExp(`(${o.join("|")})/.*.(ts|js)$`)}async function H(){return{id:"ApiFunctions",requiredEntitlements:["apiFunctions"],async processContent(t,o){await A("build.plugin.api_functions",async i=>{const e=await o.getConfig();i?.setAttribute("config",JSON.stringify(e.apiFunctions||{}));const a=_(e.apiFunctions?.folders||[]),s=[];for(const n of o.fs.scan(a)){if(n.isVirtual)continue;const r=F(n.relativePath);r&&await E(n.relativePath,o)&&s.push({requestHandlerId:`${f}:${r.handler}`,fullPath:c(t.contentDir,r.handler),slug:r.path,httpMethod:r.method,fsPath:n.relativePath})}t.clearRequestHandlersByPrefix(`${f}:`);for(const n of s)t.createRequestHandler(n.requestHandlerId,n.fullPath),t.addApiRoute({requestHandlerId:n.requestHandlerId,slug:n.slug,fsPath:n.fsPath,httpMethod:n.httpMethod,[p]:{fsPath:n.fsPath,slug:n.slug}});i?.setAttribute("definedApiFunctions",String(s.length)),t.setGlobalConfig({[h]:s.length})})}}}export{f as API_FUNCTIONS_REQUEST_HANDLER_ID,H as apiFunctionsPlugin};
1
+ import{join as c}from"path";import{transformSync as l}from"esbuild";import{REDOCLY_ROUTE_RBAC as p}from"@redocly/config";import{removeTrailingSlash as d}from"../../../utils/url/remove-trailing-slash.js";import{removeLeadingSlash as m}from"../../../utils/url/remove-leading-slash.js";import{logger as u}from"../../tools/notifiers/logger.js";import{envConfig as g}from"../../config/env-config.js";import{USER_DEFINED_API_FUNCTIONS_COUNTER_KEY as h}from"../../../server/store.js";import{parseRouteFsPathForHono as F}from"./helpers/parse-route-fs-path-for-hono.js";import{telemetryTraceStep as A}from"../../../cli/telemetry/helpers/trace-step.js";const f="api-functions",P=/\bexport\s+default\b|\bexport\s*\{[^}]*\b(?:default\s*[,}]|\w+\s+as\s+default\b)/;async function E(t,o){let r;try{r=await o.fs.read(t),l(r,{loader:t.endsWith(".js")?"js":"ts"})}catch(e){const a=e instanceof Error?e.message:String(e);return u.warn(`Skipping API function ${t} because it cannot be parsed: ${a}`),!1}if(!P.test(r)){const e=`API function ${t} does not export a default function. Add 'export default function (request, context) { ... }' to define an API function.`;return g.isDevelopMode?(u.warn(e),!0):(u.warn(`Skipping ${e}`),!1)}return!0}function R(t){return m(d(t))}function I(t){return`^${R(t)}`}function b(t){const o=t.map(I);return o.push(".*@api"),new RegExp(`(${o.join("|")})/.*.(ts|js)$`)}async function H(){return{id:"ApiFunctions",requiredEntitlements:["apiFunctions"],async processContent(t,o){await A("com.redocly.build.plugin.apiFunctions",async r=>{const e=await o.getConfig();r?.setAttribute("config",JSON.stringify(e.apiFunctions||{}));const a=b(e.apiFunctions?.folders||[]),s=[];for(const n of o.fs.scan(a)){if(n.isVirtual)continue;const i=F(n.relativePath);i&&await E(n.relativePath,o)&&s.push({requestHandlerId:`${f}:${i.handler}`,fullPath:c(t.contentDir,i.handler),slug:i.path,httpMethod:i.method,fsPath:n.relativePath})}t.clearRequestHandlersByPrefix(`${f}:`);for(const n of s)t.createRequestHandler(n.requestHandlerId,n.fullPath),t.addApiRoute({requestHandlerId:n.requestHandlerId,slug:n.slug,fsPath:n.fsPath,httpMethod:n.httpMethod,[p]:{fsPath:n.fsPath,slug:n.slug}});r?.setAttribute("definedApiFunctions",String(s.length)),t.setGlobalConfig({[h]:s.length})})}}}export{f as API_FUNCTIONS_REQUEST_HANDLER_ID,H as apiFunctionsPlugin};
@@ -1 +1 @@
1
- import{simplifyAstStructure as h}from"@redocly/openapi-docs/lib/utils/simplifyAstStructure.js";import{storeDefinitionBundles as p}from"./store-definition-bundles.js";import{arazzoDocLoader as y,arazzoDocsLoader as P}from"./arazzo-doc-loader.js";import{telemetryTraceStep as k}from"../../../cli/telemetry/helpers/trace-step.js";const u="arazzo-docs-";async function $(w){let l=[];return{id:"arazzo",loaders:{"arazzo-doc":y,"arazzo-docs":P},processContent:async(e,o)=>{await k("build.plugin.arazzo_docs",async()=>{for(const t of await o.fs.scan(/(\.ya?ml|\.json)$/))if(!await o.isPathIgnored(t.relativePath))try{const{data:a,compoundHash:c}=await o.cache.load(t.realRelativePath,"arazzo-doc");if(!a?.length)continue;l=a.map(({markdocChunks:r,relativePath:n,isVirtual:i,customOutputRelativeFile:s,realRelativePath:d})=>({chunks:r,relativePath:n,realRelativePath:d,isVirtual:s!=null||t.isVirtual||i})),p(a,e.outdir,c);for(const r of a){const n=`${u}${r.relativePath}`;await e.createSharedData(n,{document:r.document})}}catch(a){console.error(a)}})},afterRoutesCreated:async(e,o)=>{for(const{chunks:t,relativePath:a,isVirtual:c,realRelativePath:r}of l)await o.cache.load(a,{loader:async function(){await o.cache.load(r,"arazzo-doc");for(const{node:i,markdown:s,pointer:d,key:z,relativePath:m}of t){const{ast:f}=await e.parseMarkdoc({input:{content:s,relativePath:d,isVirtual:c},context:o,deps:{sharedDataIds:[`${u}${m}`]}});i[`x-parsed-md-${z}`]={result:h(f)}}},name:"arazzo-markdoc-inline-parser"})}}}export{$ as arazzoDocsPlugin};
1
+ import{simplifyAstStructure as h}from"@redocly/api-docs";import{storeDefinitionBundles as p}from"./store-definition-bundles.js";import{arazzoDocLoader as y,arazzoDocsLoader as D}from"./arazzo-doc-loader.js";import{telemetryTraceStep as P}from"../../../cli/telemetry/helpers/trace-step.js";const u="arazzo-docs-";async function $(k){let l=[];return{id:"arazzo",loaders:{"arazzo-doc":y,"arazzo-docs":D},processContent:async(e,o)=>{await P("com.redocly.build.plugin.arazzoDocs",async()=>{for(const t of await o.fs.scan(/(\.ya?ml|\.json)$/))if(!await o.isPathIgnored(t.relativePath))try{const{data:a,compoundHash:n}=await o.cache.load(t.realRelativePath,"arazzo-doc");if(!a?.length)continue;l=a.map(({markdocChunks:r,relativePath:c,isVirtual:i,customOutputRelativeFile:s,realRelativePath:d})=>({chunks:r,relativePath:c,realRelativePath:d,isVirtual:s!=null||t.isVirtual||i})),p(a,e.outdir,n);for(const r of a){const c=`${u}${r.relativePath}`;await e.createSharedData(c,{document:r.document})}}catch(a){console.error(a)}})},afterRoutesCreated:async(e,o)=>{for(const{chunks:t,relativePath:a,isVirtual:n,realRelativePath:r}of l)await o.cache.load(a,{loader:async function(){await o.cache.load(r,"arazzo-doc");for(const{node:i,markdown:s,pointer:d,key:z,relativePath:m}of t){const{ast:f}=await e.parseMarkdoc({input:{content:s,relativePath:d,isVirtual:n},context:o,deps:{sharedDataIds:[`${u}${m}`]}});i[`x-parsed-md-${z}`]={result:h(f)}}},name:"arazzo-markdoc-inline-parser"})}}}export{$ as arazzoDocsPlugin};
@@ -1 +1 @@
1
- import A from"path";import{simplifyAstStructure as E}from"@redocly/openapi-docs/lib/utils/simplifyAstStructure.js";import{buildMenuItems as $}from"@redocly/asyncapi-docs/lib/utils/build-menu-items.js";import{findFirstBinding as T}from"@redocly/asyncapi-docs/lib/utils/find-first-binding.js";import{ASYNC_API_DOCS_TEMPLATE_ID as v}from"../../../constants/common.js";import{combineUrls as D}from"@redocly/theme/core/utils";import{PUBLIC_API_DEFINITIONS_FOLDER as R}from"../../constants/common.js";import{logger as x}from"../../tools/notifiers/logger.js";import{getRouteSlugsForPath as F}from"../utils.js";import{getTemplatePath as b}from"./get-template-path.js";import{storeDefinitionBundles as O}from"./store-definition-bundles.js";import{asyncapiDocLoader as N,asyncapiDocsLoader as j}from"./asyncapi-doc-loader.js";import{searchResolver as L}from"./search/search-resolver.js";import{getAiDocumentsStore as G}from"./search/get-ai-search-documents.js";import{telemetryTraceStep as M}from"../../../cli/telemetry/helpers/trace-step.js";const _="asyncapi-docs-";async function ot(d){let p=[],u=new Set;return{id:"asyncapi",requiredEntitlements:["asyncapi"],loaders:{"asyncapi-doc":N,"asyncapi-docs":j},processContent:async(e,o)=>{await M("build.plugin.asyncapi_docs",async()=>{if((await o.getConfig()).plugins?.some(l=>l.startsWith("@redocly/portal-plugin-async-api/"))){x.warn("The plugin '@redocly/portal-plugin-async-api' is deprecated. Please remove it from your config to use built-in AsyncAPI docs.");return}const c=e.createTemplate(v,b("../../../client/templates/asyncapi-docs/template.js")),g=e.registerServerPropsGetter(v,b("./get-server-props.js"));for(const l of await o.fs.scan(/(\.ya?ml|\.json)$/))if(!await o.isPathIgnored(l.relativePath))try{const{data:r,compoundHash:w}=await o.cache.load(l.realRelativePath,"asyncapi-doc");if(!r?.length)continue;p=r.map(({markdocChunks:t,relativePath:s,isVirtual:m,customOutputRelativeFile:f,realRelativePath:y})=>({chunks:t,relativePath:s,realRelativePath:y,isVirtual:f!=null||l.isVirtual||m})),O(r,e.outdir,w);for(const t of r){const s=`${_}${t.relativePath}`,m=T(t.document),{navItems:f,apiItems:y}=$({asyncApiDoc:t.document,protocol:m||""}),I=[{url:D(R,`${C(t.relativePath,".json")}?download`)},{url:D(R,`${C(t.relativePath,".yaml")}?download`)}];await e.createSharedData(s,{document:t.document,apiItems:y,protocol:m,downloadUrls:I}),f.forEach(i=>{const n={fsPath:t.relativePath,slugSuffix:`/${i.link}`,templateId:c,sharedData:[{key:"AsyncApiDefinition",id:s}],getStaticData:S(o.withPathPrefix,i.label),serverPropsGetterIds:[g]};e.addRoute(n),i.items&&i.items.forEach(a=>{e.addRoute({...n,slugSuffix:`/${a.link}`,getStaticData:S(o.withPathPrefix,a.label)}),a.items&&a.items.forEach(h=>{e.addRoute({...n,slugSuffix:`/${h.link}`,getStaticData:S(o.withPathPrefix,a.label)})})})}),e.addRoute({fsPath:t.customOutputRelativeFile||t.relativePath,templateId:c,hasClientRoutes:!0,getSidebar:i=>{const n=a=>{const h={...a};return a.link&&(h.routeSlug=D(i.slug,a.link),h.link=D(i.slug,a.link)),a.items&&(h.items=a.items.map(n)),h};return[{type:"link",label:t.document.info?.title??"AsyncAPI Overview",routeSlug:i.slug,link:i.slug},...f.map(n)]},getSearchDocuments:L(e,t.document),getStaticData:S(o.withPathPrefix,t.document.info?.title??"AsyncAPI Docs"),getAiDocumentsStore:G({actions:e,document:t.document,metadata:{type:"asyncapi",title:t.document.info?.title??"AsyncAPI Docs",description:t.document.info?.description??"",...t.document.info?.["x-metadata"]??{}}}),metadata:{type:"asyncapi",title:t.document.info?.title??"AsyncAPI Docs",description:t.document.info?.description??"",...t.document.info?.["x-metadata"]??{}},sharedData:[{key:"AsyncApiDefinition",id:s}]})}}catch(r){console.error(r)}})},afterRoutesCreated:async(e,o)=>{const P=new Set;for(const{chunks:c,relativePath:g,isVirtual:l,realRelativePath:r}of p){const w=F(e.getAllRoutes(),g),t=(await o.cache.load(r,"asyncapi-doc")).compoundHash;await o.cache.load(g,{loader:async function(){for(const{node:m,markdown:f,pointer:y,key:I,relativePath:i}of c){const{ast:n}=await e.parseMarkdoc({input:{content:f,relativePath:y,isVirtual:l},context:o,deps:{sharedDataIds:[`${_}${i}`],routeSlugs:w}});m[`x-parsed-md-${I}`]={result:E(n)}}},name:"asyncapi-markdoc-inline-parser"},[t]);for(const{pointer:s}of c)P.add(s)}const k=u.difference(P);for(const c of k)o.cache.delete(c);u=P}}}function S(d,p){return async function(u,e){return{props:{settings:{baseUrlPath:d(u.baseSlug)},disableAutoScroll:!0,seo:{title:p}}}}}function C(d,p){const u=A.posix.dirname(d),e=A.posix.basename(d,A.posix.extname(d))+p;return A.posix.join(u,e)}export{ot as asyncAPIDocsPlugin};
1
+ import A from"path";import{simplifyAstStructure as E}from"@redocly/openapi-docs/lib/utils/simplifyAstStructure.js";import{buildMenuItems as $}from"@redocly/asyncapi-docs/lib/utils/build-menu-items.js";import{findFirstBinding as T}from"@redocly/asyncapi-docs/lib/utils/find-first-binding.js";import{ASYNC_API_DOCS_TEMPLATE_ID as v}from"../../../constants/common.js";import{combineUrls as D}from"@redocly/theme/core/utils";import{PUBLIC_API_DEFINITIONS_FOLDER as R}from"../../constants/common.js";import{logger as x}from"../../tools/notifiers/logger.js";import{getRouteSlugsForPath as F}from"../utils.js";import{getTemplatePath as b}from"./get-template-path.js";import{storeDefinitionBundles as O}from"./store-definition-bundles.js";import{asyncapiDocLoader as N,asyncapiDocsLoader as j}from"./asyncapi-doc-loader.js";import{searchResolver as L}from"./search/search-resolver.js";import{getAiDocumentsStore as G}from"./search/get-ai-search-documents.js";import{telemetryTraceStep as M}from"../../../cli/telemetry/helpers/trace-step.js";const _="asyncapi-docs-";async function ot(d){let p=[],u=new Set;return{id:"asyncapi",requiredEntitlements:["asyncapi"],loaders:{"asyncapi-doc":N,"asyncapi-docs":j},processContent:async(e,o)=>{await M("com.redocly.build.plugin.asyncapiDocs",async()=>{if((await o.getConfig()).plugins?.some(l=>l.startsWith("@redocly/portal-plugin-async-api/"))){x.warn("The plugin '@redocly/portal-plugin-async-api' is deprecated. Please remove it from your config to use built-in AsyncAPI docs.");return}const c=e.createTemplate(v,b("../../../client/templates/asyncapi-docs/template.js")),g=e.registerServerPropsGetter(v,b("./get-server-props.js"));for(const l of await o.fs.scan(/(\.ya?ml|\.json)$/))if(!await o.isPathIgnored(l.relativePath))try{const{data:r,compoundHash:w}=await o.cache.load(l.realRelativePath,"asyncapi-doc");if(!r?.length)continue;p=r.map(({markdocChunks:t,relativePath:s,isVirtual:m,customOutputRelativeFile:f,realRelativePath:y})=>({chunks:t,relativePath:s,realRelativePath:y,isVirtual:f!=null||l.isVirtual||m})),O(r,e.outdir,w);for(const t of r){const s=`${_}${t.relativePath}`,m=T(t.document),{navItems:f,apiItems:y}=$({asyncApiDoc:t.document,protocol:m||""}),I=[{url:D(R,`${C(t.relativePath,".json")}?download`)},{url:D(R,`${C(t.relativePath,".yaml")}?download`)}];await e.createSharedData(s,{document:t.document,apiItems:y,protocol:m,downloadUrls:I}),f.forEach(i=>{const n={fsPath:t.relativePath,slugSuffix:`/${i.link}`,templateId:c,sharedData:[{key:"AsyncApiDefinition",id:s}],getStaticData:S(o.withPathPrefix,i.label),serverPropsGetterIds:[g]};e.addRoute(n),i.items&&i.items.forEach(a=>{e.addRoute({...n,slugSuffix:`/${a.link}`,getStaticData:S(o.withPathPrefix,a.label)}),a.items&&a.items.forEach(h=>{e.addRoute({...n,slugSuffix:`/${h.link}`,getStaticData:S(o.withPathPrefix,a.label)})})})}),e.addRoute({fsPath:t.customOutputRelativeFile||t.relativePath,templateId:c,hasClientRoutes:!0,getSidebar:i=>{const n=a=>{const h={...a};return a.link&&(h.routeSlug=D(i.slug,a.link),h.link=D(i.slug,a.link)),a.items&&(h.items=a.items.map(n)),h};return[{type:"link",label:t.document.info?.title??"AsyncAPI Overview",routeSlug:i.slug,link:i.slug},...f.map(n)]},getSearchDocuments:L(e,t.document),getStaticData:S(o.withPathPrefix,t.document.info?.title??"AsyncAPI Docs"),getAiDocumentsStore:G({actions:e,document:t.document,metadata:{type:"asyncapi",title:t.document.info?.title??"AsyncAPI Docs",description:t.document.info?.description??"",...t.document.info?.["x-metadata"]??{}}}),metadata:{type:"asyncapi",title:t.document.info?.title??"AsyncAPI Docs",description:t.document.info?.description??"",...t.document.info?.["x-metadata"]??{}},sharedData:[{key:"AsyncApiDefinition",id:s}]})}}catch(r){console.error(r)}})},afterRoutesCreated:async(e,o)=>{const P=new Set;for(const{chunks:c,relativePath:g,isVirtual:l,realRelativePath:r}of p){const w=F(e.getAllRoutes(),g),t=(await o.cache.load(r,"asyncapi-doc")).compoundHash;await o.cache.load(g,{loader:async function(){for(const{node:m,markdown:f,pointer:y,key:I,relativePath:i}of c){const{ast:n}=await e.parseMarkdoc({input:{content:f,relativePath:y,isVirtual:l},context:o,deps:{sharedDataIds:[`${_}${i}`],routeSlugs:w}});m[`x-parsed-md-${I}`]={result:E(n)}}},name:"asyncapi-markdoc-inline-parser"},[t]);for(const{pointer:s}of c)P.add(s)}const k=u.difference(P);for(const c of k)o.cache.delete(c);u=P}}}function S(d,p){return async function(u,e){return{props:{settings:{baseUrlPath:d(u.baseSlug)},disableAutoScroll:!0,seo:{title:p}}}}}function C(d,p){const u=A.posix.dirname(d),e=A.posix.basename(d,A.posix.extname(d))+p;return A.posix.join(u,e)}export{ot as asyncAPIDocsPlugin};
@@ -1 +1 @@
1
- import{isTruthy as n}from"../../../utils/guards/is-truthy.js";import{normalizeRouteSlug as g}from"../../../utils/path/normalize-route-slug.js";import{telemetryTraceStep as u}from"../../../cli/telemetry/helpers/trace-step.js";async function d(){return{id:"CatalogClassic",requiredEntitlements:["catalogClassic"],async processContent(a,{getConfig:l}){await u("build.plugin.catalog_classic",async o=>{const c=a.createTemplate("catalogClassic","@redocly/theme/components/CatalogClassic/CatalogClassic"),e=await l(),i=e.catalogClassic??{};o?.setAttribute("config",JSON.stringify(e.catalogClassic));for(const[r,t]of Object.entries(i)){const s=g(t.slug);a.addRoute({duplicateInAllLocales:!0,slug:s,fsPath:s,templateId:c,excludeFromSidebar:!0,serverPropsGetterIds:[],getNavText:()=>Promise.resolve(t.title||"API Catalog"),getStaticData:async()=>({props:{catalogId:r,catalogConfig:{...t,filters:t.filters?.filter(n),items:void 0},seo:{title:t.title||"API Catalog"}}})})}})}}}export{d as catalogClassicPlugin};
1
+ import{isTruthy as n}from"../../../utils/guards/is-truthy.js";import{normalizeRouteSlug as g}from"../../../utils/path/normalize-route-slug.js";import{telemetryTraceStep as u}from"../../../cli/telemetry/helpers/trace-step.js";async function f(){return{id:"CatalogClassic",requiredEntitlements:["catalogClassic"],async processContent(a,{getConfig:o}){await u("com.redocly.build.plugin.catalogClassic",async s=>{const c=a.createTemplate("catalogClassic","@redocly/theme/components/CatalogClassic/CatalogClassic"),e=await o(),i=e.catalogClassic??{};s?.setAttribute("config",JSON.stringify(e.catalogClassic));for(const[r,t]of Object.entries(i)){const l=g(t.slug);a.addRoute({duplicateInAllLocales:!0,slug:l,fsPath:l,templateId:c,excludeFromSidebar:!0,serverPropsGetterIds:[],getNavText:()=>Promise.resolve(t.title||"API Catalog"),getStaticData:async()=>({props:{catalogId:r,catalogConfig:{...t,filters:t.filters?.filter(n),items:void 0},seo:{title:t.title||"API Catalog"}}})})}})}}}export{f as catalogClassicPlugin};
@@ -0,0 +1,27 @@
1
+ import type { DatabaseConnection, PublishRowsResult } from './types';
2
+ export type PublishDiffTableResult = PublishRowsResult & {
3
+ deleted: number;
4
+ };
5
+ export type PublishDiffResult = {
6
+ entities: PublishDiffTableResult;
7
+ relations: PublishDiffTableResult;
8
+ attributes: PublishRowsResult;
9
+ orphanAttributesDeleted: number;
10
+ };
11
+ export declare class CatalogEntitiesDiffPublisher {
12
+ #private;
13
+ static publishDiff({ runId, localConnection, remoteConnection, scopeFiles, chunkSize, }: {
14
+ runId: string;
15
+ localConnection: DatabaseConnection;
16
+ remoteConnection: DatabaseConnection;
17
+ /**
18
+ * Source files to converge (changed + removed for delta publishes, the
19
+ * full local file list for full publishes). Files outside this scope are
20
+ * never read or touched on the remote — this preserves the old sweep's
21
+ * "never delete data for files absent from the local snapshot" guarantee.
22
+ */
23
+ scopeFiles: string[];
24
+ chunkSize: number;
25
+ }): Promise<PublishDiffResult>;
26
+ }
27
+ //# sourceMappingURL=catalog-entities-diff-publisher.d.ts.map
@@ -0,0 +1,12 @@
1
+ import{and as K,eq as L,inArray as w,isNotNull as U,sql as f}from"drizzle-orm";import{logger as H}from"../../../tools/notifiers/logger.js";import{sha1 as M}from"../../../utils/crypto/sha1.js";import{entitiesAttributesTable as S}from"../../../providers/database/databases/sqlite-db/schemas/entities-attributes-table.js";import{entitiesRelationsTable as u}from"../../../providers/database/databases/sqlite-db/schemas/entities-relations-table.js";import{entitiesTable as g}from"../../../providers/database/databases/sqlite-db/schemas/entities-table.js";import{BATCH_TRANSIENT_RETRY as k,withTransientErrorRetry as A}from"../../../providers/database/transient-sqld-error.js";import{ATTRIBUTES_UPSERT_SET as $,DELETE_IDS_CHUNK_SIZE as b,ENTITIES_UPSERT_SET as F,MAX_BATCH_PAYLOAD_BYTES as _,MAX_LOGGED_DB_ERROR_LENGTH as v,MIN_RETRYABLE_BATCH_SIZE as J,RELATIONS_UPSERT_SET as V,SCOPE_FILES_BATCH_SIZE as W,SYNC_SCAN_PAGE_SIZE as m}from"./consts.js";class o{static async publishDiff({runId:t,localConnection:s,remoteConnection:i,scopeFiles:n,chunkSize:a}){await A(()=>i.client.sync(),k);const c={entities:{upserted:0,skipped:0,deleted:0},relations:{upserted:0,skipped:0,deleted:0},attributes:{upserted:0,skipped:0},orphanAttributesDeleted:0};for(const r of o.#i(n,W)){const l=await o.#n({runId:t,localConnection:s,remoteConnection:i,filesBatch:r,chunkSize:a});c.entities.upserted+=l.upserted,c.entities.skipped+=l.skipped,c.entities.deleted+=l.deleted;const e=await o.#c({runId:t,localConnection:s,remoteConnection:i,filesBatch:r,chunkSize:a});c.relations.upserted+=e.upserted,c.relations.skipped+=e.skipped,c.relations.deleted+=e.deleted;const d=await o.#a({localConnection:s,remoteConnection:i,filesBatch:r,chunkSize:a});c.attributes.upserted+=d.upserted,c.attributes.skipped+=d.skipped}return c.orphanAttributesDeleted=await o.#o(i),c}static async#n({runId:t,localConnection:s,remoteConnection:i,filesBatch:n,chunkSize:a}){const c=e=>JSON.stringify([e.key,e.source,e.revision,e.version]),r=e=>o.#s([e.organizationId,e.projectId,e.type,e.title,e.summary,e.tags,e.metadata,e.git,e.contact,e.links,e.sourceFile,e.fileHash,e.hash,o.#e(e.isCurrent),o.#e(e.isDefaultVersion),o.#e(e.isDeleted),e.scorecardsStatus]),l=K(L(g.source,"file"),w(g.sourceFile,n));return o.#t({chunkSize:a,selectRemotePage:(e,d)=>i.client.client.select().from(g).where(l).orderBy(f`rowid`).limit(d).offset(e).all(),selectLocalPage:(e,d)=>s.client.client.select().from(g).where(l).orderBy(f`rowid`).limit(d).offset(e).all(),logicalKey:c,digest:r,decorateRow:e=>({...e,lastSeenRunId:t}),runUpsert:async e=>{await i.client.client.insert(g).values(e).onConflictDoUpdate({target:[g.key,g.source,g.revision,g.version],set:F}).run()},runDeleteByIds:e=>i.client.client.delete(g).where(w(g.id,e)),describeSkippedRow:e=>`entity key=${String(e.key)}`})}static async#c({runId:t,localConnection:s,remoteConnection:i,filesBatch:n,chunkSize:a}){const c=e=>JSON.stringify([e.sourceKey,e.targetKey,e.sourceVersion,e.targetVersion,e.sourceRevision,e.targetRevision,e.sourceToTargetRelation]),r=e=>o.#s([e.organizationId,e.projectId,e.targetToSourceRelation,e.sourceFile,e.fileHash,o.#e(e.isDeleted)]),l=K(U(u.sourceFile),w(u.sourceFile,n));return o.#t({chunkSize:a,selectRemotePage:(e,d)=>i.client.client.select().from(u).where(l).orderBy(f`rowid`).limit(d).offset(e).all(),selectLocalPage:(e,d)=>s.client.client.select().from(u).where(l).orderBy(f`rowid`).limit(d).offset(e).all(),logicalKey:c,digest:r,decorateRow:e=>({...e,lastSeenRunId:t}),runUpsert:async e=>{await i.client.client.insert(u).values(e).onConflictDoUpdate({target:[u.sourceKey,u.targetKey,u.sourceVersion,u.targetVersion,u.sourceRevision,u.targetRevision,u.sourceToTargetRelation],set:V}).run()},runDeleteByIds:e=>i.client.client.delete(u).where(w(u.id,e)),describeSkippedRow:e=>{const d=e;return`relation sourceKey=${String(d.sourceKey)} targetKey=${String(d.targetKey)}`}})}static async#a({localConnection:t,remoteConnection:s,filesBatch:i,chunkSize:n}){const a=()=>f`EXISTS (
2
+ SELECT 1
3
+ FROM entities e
4
+ WHERE e.key = ${S.entityKey}
5
+ AND e.source = 'file'
6
+ AND e.source_file IN (${f.join(i.map(r=>f`${r}`),f`, `)})
7
+ )`,c=await o.#t({chunkSize:n,selectRemotePage:(r,l)=>s.client.client.select().from(S).where(a()).orderBy(f`rowid`).limit(l).offset(r).all(),selectLocalPage:(r,l)=>t.client.client.select().from(S).where(a()).orderBy(f`rowid`).limit(l).offset(r).all(),logicalKey:r=>r.entityKey,digest:r=>o.#s([r.organizationId,r.projectId,r.rbacTeams]),runUpsert:async r=>{await s.client.client.insert(S).values(r).onConflictDoUpdate({target:[S.entityKey],set:$}).run()},runDeleteByIds:null});return{upserted:c.upserted,skipped:c.skipped}}static async#t({chunkSize:t,selectRemotePage:s,selectLocalPage:i,logicalKey:n,digest:a,decorateRow:c,runUpsert:r,runDeleteByIds:l,describeSkippedRow:e}){const d=new Map;for(let R=0;;R+=m){const p=await A(()=>s(R,m),k);for(const y of p)d.set(n(y),{id:y.id,digest:a(y),seen:!1});if(p.length<m)break}let I=0,E=0,T=[];const B=async()=>{if(!T.length)return;const R=T;T=[];for(const p of o.#l(R,t,_)){const y=await o.#r({rows:p,runOperation:r,shouldSkipIsolatedRow:e?(h,O)=>o.#u(O)?(H.warn(`Skipping ${e(h)} due to remote insert error: ${o.#p(O)}`),!0):!1:void 0});I+=y.upserted,E+=y.skipped}};for(let R=0;;R+=m){const p=await i(R,m);for(const y of p){const h=d.get(n(y));if(h&&(h.seen=!0,h.digest===a(y))){E+=1;continue}T.push(c?c(y):y),T.length>=t&&await B()}if(p.length<m)break}await B();let N=0;if(l){const R=[];for(const p of d.values())p.seen||R.push(p.id);for(const p of o.#i(R,b))await A(()=>l(p).run(),k),N+=p.length}return{upserted:I,skipped:E,deleted:N}}static async#o(t){const s=await A(()=>t.client.client.delete(S).where(f`NOT EXISTS (
8
+ SELECT 1
9
+ FROM entities e
10
+ WHERE e.key = ${S.entityKey}
11
+ AND COALESCE(e.is_deleted, 0) = 0
12
+ )`).run(),k);return Number(s.rowsAffected??0)}static#e(t){return t==null?null:!!t}static#s(t){return M(JSON.stringify(t))}static#i(t,s){const i=[];for(let n=0;n<t.length;n+=s)i.push(t.slice(n,n+s));return i}static#l(t,s,i){const n=[];let a=[],c=0;for(const r of t){const l=o.#d(r);a.length>0&&(a.length>=s||c+l>i)&&(n.push(a),a=[],c=0),a.push(r),c+=l}return a.length>0&&n.push(a),n}static#d(t){try{return JSON.stringify(t).length}catch{return 0}}static async#r({rows:t,runOperation:s,shouldSkipIsolatedRow:i}){try{return await A(()=>s(t),k),{upserted:t.length,skipped:0}}catch(n){if(t.length<J){if(!i)throw n;if(await i(t[0],n))return{upserted:0,skipped:1};throw n}const a=Math.floor(t.length/2),c=await o.#r({rows:t.slice(0,a),runOperation:s,shouldSkipIsolatedRow:i}),r=await o.#r({rows:t.slice(a),runOperation:s,shouldSkipIsolatedRow:i});return{upserted:c.upserted+r.upserted,skipped:c.skipped+r.skipped}}}static#u(t){if(!(t instanceof Error))return!1;const s=t.message.toLowerCase();return s.includes("code: 11")||s.includes("too many sql variables")||s.includes("string or blob too big")||s.includes("statement too long")||s.includes("request body too large")||s.includes("payload too large")||s.includes("body too large")||s.includes("resource exhausted")}static#p(t){const n=(t instanceof Error?t.message:typeof t=="string"?t:JSON.stringify(t)).split(" params:")[0].replace(/\s+/g," ").trim();return n.length>v?`${n.slice(0,v)}...`:n}}export{o as CatalogEntitiesDiffPublisher};
@@ -1,12 +1 @@
1
- import{and as F,eq as D,inArray as T,isNotNull as v,isNull as N,ne as $,or as g,sql as w}from"drizzle-orm";import{ulid as B}from"ulid";import{logger as A}from"../../../tools/notifiers/logger.js";import{DatabaseConnectionFactory as L}from"../../../providers/database/database-connection-factory.js";import{entitiesAttributesTable as p}from"../../../providers/database/databases/sqlite-db/schemas/entities-attributes-table.js";import{entitiesRelationsTable as d}from"../../../providers/database/databases/sqlite-db/schemas/entities-relations-table.js";import{entitiesTable as l}from"../../../providers/database/databases/sqlite-db/schemas/entities-table.js";import{BATCH_TRANSIENT_RETRY as H,withTransientErrorRetry as K}from"../../../providers/database/transient-sqld-error.js";import{envConfig as k}from"../../../config/env-config.js";import{ATTRIBUTES_UPSERT_SET as M,DEFAULT_CHUNK_SIZE as z,ENTITIES_UPSERT_SET as J,MAX_BATCH_PAYLOAD_BYTES as V,MAX_LOGGED_DB_ERROR_LENGTH as O,MIN_RETRYABLE_BATCH_SIZE as x,RELATIONS_UPSERT_SET as Y}from"./consts.js";import{INTERNAL_CATALOG_PUBLISH_KEY_PREFIX as X,RemotePublishLockService as b}from"./remote-publish-lock-service.js";const U=`${X}::last-successful-publish`;class o{static async publishFromLocalToRemote(e){const t=B();if(k.isDevelopMode||!k.isProductionEnv)return{runId:t,published:!1,shouldFinalizeFileHashes:!0};const{baseDbDir:n,chunkSize:r=z,changedSourceFiles:s=[],removedSourceFiles:a=[]}=e,[i,c]=await Promise.all([L.create({baseDbDir:n,databaseType:"local"}),L.create({baseDbDir:n,databaseType:"remote"})]);if(!i||!c)return A.warn("Skipping entities remote sync: local or remote connection is unavailable"),{runId:t,published:!1,shouldFinalizeFileHashes:!1};const u="changedSourceFiles"in e||"removedSourceFiles"in e,f=Array.from(new Set([...s,...a]));if(u&&f.length===0)return{runId:t,published:!0,shouldFinalizeFileHashes:!0};const h=u?s.length?s:"none":void 0,m=u?f:await o.#w(i),S=await b.runUnderRemotePublishLock({runId:t,remoteConnection:c,run:async()=>{const R=o.#d(),y=await o.#i({remoteConnection:c,token:R});if(!y.shouldPublish)return A.info(`Publishing entities to the database skipped: ${y.reason}`),!1;try{return await o.#h({runId:t,chunkSize:r,localConnection:i,remoteConnection:c,sourceFilesFilter:h}),await o.#m({runId:t,chunkSize:r,localConnection:i,remoteConnection:c,sourceFilesFilter:h}),await o.#y({chunkSize:r,localConnection:i,remoteConnection:c,sourceFilesFilter:h}),await o.#F({runId:t,remoteConnection:c,sourceFilesFilter:m}),await o.#a({runId:t,remoteConnection:c,token:R}),!0}catch(I){const E=o.#o(I);throw A.error(`Failed to publish entities to the database: ${E}`),new Error(`[CatalogEntitiesPublisher.publishFromLocalToRemote] Failed runId=${t}. ${E}`,{cause:I instanceof Error?I:void 0})}}});return{runId:t,published:S,shouldFinalizeFileHashes:!0}}static async#i({remoteConnection:e,token:t}){if(!t)return{shouldPublish:!0};const n=o.#n(),r=await b.getInternalCacheValue({remoteConnection:e,key:n});if(!r)return{shouldPublish:!0};const s=o.#l(r);return s?o.#p(t,s.token)<0?{shouldPublish:!1,reason:`Freshness gate blocked stale publish: current ${t.source}="${t.value}" is older than latest successful ${s.token.source}="${s.token.value}" recordedAt=${s.recordedAt}.`}:{shouldPublish:!0}:{shouldPublish:!0}}static async#a({runId:e,remoteConnection:t,token:n}){if(!n)return;const r=o.#n(),s=JSON.stringify({runId:e,recordedAt:new Date().toISOString(),token:n});await b.upsertInternalCacheValue({remoteConnection:t,key:r,value:s,ttl:null})}static#n(){const e=k.PUBLIC_REDOCLY_BRANCH_NAME?.trim();return e?`${U}::branch::${e}`:`${U}::default`}static#l(e){try{const t=JSON.parse(e);return typeof t.runId!="string"||typeof t.recordedAt!="string"||!o.#u(t.token)?null:{runId:t.runId,recordedAt:t.recordedAt,token:t.token}}catch{return null}}static#u(e){if(!e||typeof e!="object")return!1;const t=e;return typeof t.value=="string"&&t.source==="PROJECT_BUILD_ID"}static#d(){const e=[{source:"PROJECT_BUILD_ID",value:k.PROJECT_BUILD_ID}];for(const t of e){const n=t.value?.trim();if(!n)continue;const r=o.#f(n);if(r)return{source:t.source,value:r}}return null}static#f(e){return e.match(/[0-9A-HJKMNP-TV-Z]{26}/i)?.[0]?.toUpperCase()??null}static#p(e,t){return e.value===t.value?0:e.value>t.value?1:-1}static#h(e){const{runId:t,localConnection:n,remoteConnection:r,sourceFilesFilter:s,chunkSize:a}=e,i=o.#e(s);return o.#t({chunkSize:a,sourceFilesFilter:s,selectRows:(c,u)=>n.client.client.select().from(l).where(F(D(l.source,"file"),i?T(l.sourceFile,i):void 0)).limit(u).offset(c).all(),decorateRow:c=>({...c,lastSeenRunId:t}),runUpsert:async c=>{await r.client.client.insert(l).values(c).onConflictDoUpdate({target:[l.key,l.source,l.revision,l.version],set:J}).run()},describeSkippedRow:c=>`entity key=${String(c.key)}`})}static#m(e){const{runId:t,localConnection:n,remoteConnection:r,sourceFilesFilter:s,chunkSize:a}=e,i=o.#e(s);return o.#t({chunkSize:a,sourceFilesFilter:s,selectRows:(c,u)=>n.client.client.select().from(d).where(F(v(d.sourceFile),i?T(d.sourceFile,i):void 0)).limit(u).offset(c).all(),decorateRow:c=>({...c,lastSeenRunId:t}),runUpsert:async c=>{await r.client.client.insert(d).values(c).onConflictDoUpdate({target:[d.sourceKey,d.targetKey,d.sourceVersion,d.targetVersion,d.sourceRevision,d.targetRevision,d.sourceToTargetRelation],set:Y}).run()},describeSkippedRow:c=>{const u=c;return`relation sourceKey=${String(u.sourceKey)} targetKey=${String(u.targetKey)}`}})}static#y(e){const{localConnection:t,remoteConnection:n,sourceFilesFilter:r,chunkSize:s}=e,a=o.#e(r);return o.#t({chunkSize:s,sourceFilesFilter:r,selectRows:(i,c)=>t.client.client.select().from(p).where(a?w`EXISTS (
2
- SELECT 1
3
- FROM entities e
4
- WHERE e.key = ${p.entityKey}
5
- AND e.source = 'file'
6
- AND e.source_file IN (${w.join(a.map(u=>w`${u}`),w`, `)})
7
- )`:void 0).limit(c).offset(i).all(),runUpsert:async i=>{await n.client.client.insert(p).values(i).onConflictDoUpdate({target:[p.entityKey],set:M}).run()}})}static#e(e){return Array.isArray(e)&&e.length>0?e:void 0}static async#t({chunkSize:e,sourceFilesFilter:t,selectRows:n,decorateRow:r,runUpsert:s,describeSkippedRow:a}){if(t==="none")return{upserted:0,skipped:0};let i=0,c=0,u=0;for(;;){const f=await n(i,e);if(!f.length)return{upserted:c,skipped:u};const h=r?f.map(m=>r(m)):f;for(const m of o.#S(h,e,V)){const S=await o.#s({rows:m,runOperation:s,shouldSkipIsolatedRow:a?(R,y)=>o.#T(y)?(A.warn(`Skipping ${a(R)} due to remote insert error: ${o.#o(y)}`),!0):!1:void 0});c+=S.upserted,u+=S.skipped}i+=e}}static async#F({runId:e,remoteConnection:t,sourceFilesFilter:n}){if(n==="none")return{staleEntitiesDeleted:0,staleRelationsDeleted:0,orphanAttributesDeleted:0};const r=t.client.client,s=o.#e(n),a=await o.#r(()=>r.delete(d).where(F(v(d.sourceFile),s?T(d.sourceFile,s):void 0,g(N(d.lastSeenRunId),$(d.lastSeenRunId,e)))).run()),i=await o.#r(()=>r.delete(l).where(F(D(l.source,"file"),s?T(l.sourceFile,s):void 0,g(N(l.lastSeenRunId),$(l.lastSeenRunId,e)))).run()),c=await o.#r(()=>r.delete(p).where(w`NOT EXISTS (
8
- SELECT 1
9
- FROM entities e
10
- WHERE e.key = ${p.entityKey}
11
- AND COALESCE(e.is_deleted, 0) = 0
12
- )`).run());return{staleEntitiesDeleted:i,staleRelationsDeleted:a,orphanAttributesDeleted:c}}static async#w(e){const n=(await e.client.client.selectDistinct({sourceFile:l.sourceFile}).from(l).where(F(D(l.source,"file"),v(l.sourceFile))).all()).map(({sourceFile:r})=>r).filter(r=>!!r);return n.length===0?"none":n}static async#r(e){const t=await o.#c(e);return Number(t.rowsAffected??0)}static#S(e,t,n){const r=[];let s=[],a=0;for(const i of e){const c=o.#R(i);s.length>0&&(s.length>=t||a+c>n)&&(r.push(s),s=[],a=0),s.push(i),a+=c}return s.length>0&&r.push(s),r}static#R(e){try{return JSON.stringify(e).length}catch{return 0}}static async#s({rows:e,runOperation:t,shouldSkipIsolatedRow:n}){try{return await o.#c(()=>t(e)),{upserted:e.length,skipped:0}}catch(r){if(e.length<x){if(!n)throw r;if(await n(e[0],r))return{upserted:0,skipped:1};throw r}const s=Math.floor(e.length/2),a=await o.#s({rows:e.slice(0,s),runOperation:t,shouldSkipIsolatedRow:n}),i=await o.#s({rows:e.slice(s),runOperation:t,shouldSkipIsolatedRow:n});return{upserted:a.upserted+i.upserted,skipped:a.skipped+i.skipped}}}static#T(e){if(!(e instanceof Error))return!1;const t=e.message.toLowerCase();return t.includes("code: 11")||t.includes("too many sql variables")||t.includes("string or blob too big")||t.includes("statement too long")||t.includes("request body too large")||t.includes("payload too large")||t.includes("body too large")||t.includes("resource exhausted")}static#o(e){const n=(e instanceof Error?e.message:typeof e=="string"?e:JSON.stringify(e)).split(" params:")[0],s=o.#A(n).replace(/\s+/g," ").trim();return s.length>O?`${s.slice(0,O)}...`:s}static#A(e){const t="Failed query:",n=e.indexOf(t);if(n===-1)return e;const r=e.slice(0,n).trim();return r?`${r}. ${t} <omitted for brevity>`:`${t} <omitted for brevity>`}static#c(e){return K(e,H)}}export{o as CatalogEntitiesPublisher};
1
+ import{and as T,eq as k,isNotNull as D}from"drizzle-orm";import{ulid as v}from"ulid";import{logger as c}from"../../../tools/notifiers/logger.js";import{DatabaseConnectionFactory as R}from"../../../providers/database/database-connection-factory.js";import{entitiesTable as u}from"../../../providers/database/databases/sqlite-db/schemas/entities-table.js";import{BATCH_TRANSIENT_RETRY as E,withTransientErrorRetry as g}from"../../../providers/database/transient-sqld-error.js";import{envConfig as l}from"../../../config/env-config.js";import{DEFAULT_CHUNK_SIZE as A,MAX_LOGGED_DB_ERROR_LENGTH as $}from"./consts.js";import{CatalogEntitiesDiffPublisher as L}from"./catalog-entities-diff-publisher.js";import{INTERNAL_CATALOG_PUBLISH_KEY_PREFIX as P,RemotePublishLockService as f}from"./remote-publish-lock-service.js";const w=`${P}::last-successful-publish`;class i{static async publishFromLocalToRemote(t){const e=v();if(l.isDevelopMode||!l.isProductionEnv)return{runId:e,published:!1,shouldFinalizeFileHashes:!0};const{baseDbDir:s,chunkSize:r=A,changedSourceFiles:n=[],removedSourceFiles:h=[]}=t,[d,a]=await Promise.all([R.create({baseDbDir:s,databaseType:"local"}),R.create({baseDbDir:s,databaseType:"remote"})]);if(!d||!a)return c.warn("Skipping entities remote sync: local or remote connection is unavailable"),{runId:e,published:!1,shouldFinalizeFileHashes:!1};const p="changedSourceFiles"in t||"removedSourceFiles"in t,m=Array.from(new Set([...n,...h]));if(p&&m.length===0)return{runId:e,published:!0,shouldFinalizeFileHashes:!0};const F=p?m:await i.#c(d),I=await f.runUnderRemotePublishLock({runId:e,remoteConnection:a,run:async()=>{await g(()=>a.client.sync(),E);const b=i.#o(),y=await i.#t({remoteConnection:a,token:b});if(!y.shouldPublish)return c.info(`Publishing entities to the database skipped: ${y.reason}`),!1;try{if(F!=="none"){const o=await L.publishDiff({runId:e,localConnection:d,remoteConnection:a,scopeFiles:F,chunkSize:r});c.info(`Entities publish diff: entities upserted=${o.entities.upserted} unchanged=${o.entities.skipped} deleted=${o.entities.deleted}, relations upserted=${o.relations.upserted} unchanged=${o.relations.skipped} deleted=${o.relations.deleted}, attributes upserted=${o.attributes.upserted} unchanged=${o.attributes.skipped}, orphan attributes deleted=${o.orphanAttributesDeleted}`)}return await i.#s({runId:e,remoteConnection:a,token:b}),!0}catch(o){const S=i.#u(o);throw c.error(`Failed to publish entities to the database: ${S}`),new Error(`[CatalogEntitiesPublisher.publishFromLocalToRemote] Failed runId=${e}. ${S}`,{cause:o instanceof Error?o:void 0})}}});return{runId:e,published:I,shouldFinalizeFileHashes:!0}}static async#t({remoteConnection:t,token:e}){if(!e)return{shouldPublish:!0};const s=i.#e(),r=await f.getInternalCacheValue({remoteConnection:t,key:s});if(!r)return{shouldPublish:!0};const n=i.#r(r);return n?i.#a(e,n.token)<0?{shouldPublish:!1,reason:`Freshness gate blocked stale publish: current ${e.source}="${e.value}" is older than latest successful ${n.token.source}="${n.token.value}" recordedAt=${n.recordedAt}.`}:{shouldPublish:!0}:{shouldPublish:!0}}static async#s({runId:t,remoteConnection:e,token:s}){if(!s)return;const r=i.#e(),n=JSON.stringify({runId:t,recordedAt:new Date().toISOString(),token:s});await f.upsertInternalCacheValue({remoteConnection:e,key:r,value:n,ttl:null})}static#e(){const t=l.PUBLIC_REDOCLY_BRANCH_NAME?.trim();return t?`${w}::branch::${t}`:`${w}::default`}static#r(t){try{const e=JSON.parse(t);return typeof e.runId!="string"||typeof e.recordedAt!="string"||!i.#n(e.token)?null:{runId:e.runId,recordedAt:e.recordedAt,token:e.token}}catch{return null}}static#n(t){if(!t||typeof t!="object")return!1;const e=t;return typeof e.value=="string"&&e.source==="PROJECT_BUILD_ID"}static#o(){const t=[{source:"PROJECT_BUILD_ID",value:l.PROJECT_BUILD_ID}];for(const e of t){const s=e.value?.trim();if(!s)continue;const r=i.#i(s);if(r)return{source:e.source,value:r}}return null}static#i(t){return t.match(/[0-9A-HJKMNP-TV-Z]{26}/i)?.[0]?.toUpperCase()??null}static#a(t,e){return t.value===e.value?0:t.value>e.value?1:-1}static async#c(t){const s=(await t.client.client.selectDistinct({sourceFile:u.sourceFile}).from(u).where(T(k(u.source,"file"),D(u.sourceFile))).all()).map(({sourceFile:r})=>r).filter(r=>!!r);return s.length===0?"none":s}static#u(t){const s=(t instanceof Error?t.message:typeof t=="string"?t:JSON.stringify(t)).split(" params:")[0],n=i.#l(s).replace(/\s+/g," ").trim();return n.length>$?`${n.slice(0,$)}...`:n}static#l(t){const e="Failed query:",s=t.indexOf(e);if(s===-1)return t;const r=t.slice(0,s).trim();return r?`${r}. ${e} <omitted for brevity>`:`${e} <omitted for brevity>`}}export{i as CatalogEntitiesPublisher};
@@ -0,0 +1,22 @@
1
+ import type { DatabaseConnection } from './types';
2
+ export type PruneLocalRevisionsResult = {
3
+ prunedEntities: number;
4
+ prunedRelations: number;
5
+ legacyRelationsHealed: number;
6
+ legacyRelationsDeleted: number;
7
+ affectedSourceFiles: string[];
8
+ vacuumed: boolean;
9
+ };
10
+ export declare class CatalogEntitiesRevisionsPruner {
11
+ #private;
12
+ static pruneLocalRevisions({ localConnection, maxRevisions, vacuumThreshold, }: {
13
+ localConnection: DatabaseConnection;
14
+ maxRevisions: number;
15
+ vacuumThreshold?: number;
16
+ }): Promise<PruneLocalRevisionsResult>;
17
+ static confirmPrunedFiles({ localConnection, sourceFiles, }: {
18
+ localConnection: DatabaseConnection;
19
+ sourceFiles: string[];
20
+ }): Promise<void>;
21
+ }
22
+ //# sourceMappingURL=catalog-entities-revisions-pruner.d.ts.map