@redocly/realm 0.130.0-custom.2 → 0.130.0-custom.21

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 (428) hide show
  1. package/CHANGELOG.md +116 -0
  2. package/dist/bin.js +1 -1
  3. package/dist/cli/develop.js +1 -1
  4. package/dist/cli/eject/resolveTheme.d.ts +1 -1
  5. package/dist/cli/eject/resolveTheme.js +1 -1
  6. package/dist/cli/prepare/copy-env-files.js +1 -1
  7. package/dist/cli/prepare/index.js +1 -1
  8. package/dist/cli/stats/collectors/openapi.js +1 -1
  9. package/dist/cli/telemetry/index.js +1 -1
  10. package/dist/client/App.js +1 -1
  11. package/dist/client/ErrorBoundary.js +1 -1
  12. package/dist/client/app/DevModeFloatingBar/index.d.ts +3 -0
  13. package/dist/client/app/DevModeFloatingBar/index.js +43 -0
  14. package/dist/client/app/Feedback/useSubmitFeedback.js +1 -1
  15. package/dist/client/app/Sidebar/InstancePicker.d.ts +10 -0
  16. package/dist/client/app/Sidebar/InstancePicker.js +48 -0
  17. package/dist/client/app/Sidebar/Sidebar.js +11 -3
  18. package/dist/client/app/Sidebar/useBreadcrumbs.js +1 -1
  19. package/dist/client/app/Sidebar/useSidebarItems.js +1 -1
  20. package/dist/client/app/hooks/catalog/useCatalogClassic.js +1 -1
  21. package/dist/client/app/hooks/useAutoScroll.js +1 -1
  22. package/dist/client/app/hooks/useRouteChangeTracker.js +1 -1
  23. package/dist/client/app/hooks/utils/pathname-matches-active-section.d.ts +6 -0
  24. package/dist/client/app/hooks/utils/pathname-matches-active-section.js +1 -0
  25. package/dist/client/app/markdoc/custom-components/html-script.js +1 -0
  26. package/dist/client/app/markdoc/custom-components/openapi/openapi-code-sample.js +1 -0
  27. package/dist/client/app/markdoc/custom-components/openapi/openapi-response-sample.js +1 -0
  28. package/dist/client/app/markdoc/custom-components/openapi/replay-openapi.js +1 -0
  29. package/dist/client/app/markdoc/hooks/use-store.js +1 -0
  30. package/dist/client/browser-entry.js +5 -5
  31. package/dist/client/constants/common.d.ts +2 -0
  32. package/dist/client/constants/common.js +1 -0
  33. package/dist/client/providers/hooks.js +1 -1
  34. package/dist/client/runtime/loader.js +1 -1
  35. package/dist/client/runtime/useSocketMessages.js +1 -1
  36. package/dist/{server/plugins/asyncapi-docs/template → client/templates/asyncapi-docs}/helpers.d.ts +3 -3
  37. package/dist/client/templates/asyncapi-docs/helpers.js +1 -0
  38. package/dist/{server/plugins/asyncapi-docs/template/AsyncApiDocs.d.ts → client/templates/asyncapi-docs/template.d.ts} +1 -1
  39. package/dist/{server/plugins/asyncapi-docs/template/AsyncApiDocs.js → client/templates/asyncapi-docs/template.js} +1 -1
  40. package/dist/{server/plugins/openapi-docs/template → client/templates/openapi-docs}/helpers.d.ts +14 -1
  41. package/dist/client/templates/openapi-docs/helpers.js +5 -0
  42. package/dist/{server/plugins/openapi-docs/template/OpenAPIDocs.d.ts → client/templates/openapi-docs/template.d.ts} +1 -1
  43. package/dist/{server/plugins/openapi-docs/template/OpenAPIDocs.js → client/templates/openapi-docs/template.js} +1 -1
  44. package/dist/client/utils/catalog/inject-catalog-items.d.ts +1 -1
  45. package/dist/client/utils/catalog/inject-catalog-items.js +1 -1
  46. package/dist/constants/catalog-entities.d.ts +12 -0
  47. package/dist/constants/catalog-entities.js +1 -0
  48. package/dist/constants/common.d.ts +2 -2
  49. package/dist/constants/common.js +1 -1
  50. package/dist/constants/l10n/langs/ar.js +1 -1
  51. package/dist/constants/l10n/langs/de.js +1 -1
  52. package/dist/constants/l10n/langs/en.js +1 -1
  53. package/dist/constants/l10n/langs/es.js +1 -1
  54. package/dist/constants/l10n/langs/fr.js +1 -1
  55. package/dist/constants/l10n/langs/hi.js +1 -1
  56. package/dist/constants/l10n/langs/it.js +1 -1
  57. package/dist/constants/l10n/langs/ja.js +1 -1
  58. package/dist/constants/l10n/langs/ko.js +1 -1
  59. package/dist/constants/l10n/langs/pl.js +1 -1
  60. package/dist/constants/l10n/langs/pt-BR.js +1 -1
  61. package/dist/constants/l10n/langs/pt.js +1 -1
  62. package/dist/constants/l10n/langs/ru.js +1 -1
  63. package/dist/constants/l10n/langs/uk.js +1 -1
  64. package/dist/constants/l10n/langs/zh.js +1 -1
  65. package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/get-inner-text.d.ts +1 -1
  66. package/dist/markdoc/helpers/get-inner-text.js +2 -0
  67. package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/get-variable.d.ts +2 -2
  68. package/dist/markdoc/helpers/get-variable.js +1 -0
  69. package/dist/markdoc/nodes/fence/index.js +1 -0
  70. package/dist/markdoc/nodes/heading.js +1 -0
  71. package/dist/{server/plugins/markdown/markdoc → markdoc}/tags/index.d.ts +6 -6
  72. package/dist/markdoc/tags/json-example.d.ts +3 -0
  73. package/dist/markdoc/tags/json-schema.d.ts +3 -0
  74. package/dist/markdoc/tags/openapi-code-sample.d.ts +3 -0
  75. package/dist/markdoc/tags/openapi-example.d.ts +3 -0
  76. package/dist/markdoc/tags/openapi-response-sample.d.ts +3 -0
  77. package/dist/markdoc/tags/replay-openapi.d.ts +3 -0
  78. package/dist/markdoc/types.d.ts +8 -0
  79. package/dist/markdoc/types.js +0 -0
  80. package/dist/server/api-routes/import-api-routes-handlers.js +1 -1
  81. package/dist/server/api-routes/run-api-routes-worker.js +1 -1
  82. package/dist/server/config/env-config.js +1 -0
  83. package/dist/{config → server/config}/env-schema.d.ts +6 -3
  84. package/dist/{config → server/config}/env-schemas/database.d.ts +1 -1
  85. package/dist/server/config/env-schemas/database.js +1 -0
  86. package/dist/{config → server/config}/env-schemas/organization-project.d.ts +3 -0
  87. package/dist/{config → server/config}/env-schemas/organization-project.js +1 -1
  88. package/dist/server/constants/common.d.ts +3 -0
  89. package/dist/server/constants/common.js +1 -1
  90. package/dist/server/constants/feedback.d.ts +6 -0
  91. package/dist/server/constants/feedback.js +1 -0
  92. package/dist/server/constants/plugins/catalog-entities.d.ts +0 -11
  93. package/dist/server/constants/plugins/catalog-entities.js +1 -1
  94. package/dist/server/entitlements/entitlements-provider.js +1 -1
  95. package/dist/server/esbuild/esbuild-logger.js +1 -1
  96. package/dist/server/esbuild/esbuild.js +1 -1
  97. package/dist/server/esbuild/plugins/assets-resolver.js +1 -1
  98. package/dist/server/esbuild/plugins/esbuild-compile-resolver.js +1 -1
  99. package/dist/server/esbuild/plugins/styled-components-ssr.js +1 -1
  100. package/dist/server/esbuild/plugins/themes-resolver.js +2 -2
  101. package/dist/server/{config/external-plugins.d.ts → external-plugins/resolve-external-plugins.d.ts} +2 -2
  102. package/dist/server/external-plugins/resolve-external-plugins.js +1 -0
  103. package/dist/server/fs/cache.js +1 -1
  104. package/dist/server/fs/fast-mtime.js +3 -3
  105. package/dist/server/fs/last-modified-tracker.js +1 -1
  106. package/dist/server/fs/utils/is-loader-cache-enabled.js +1 -1
  107. package/dist/server/node-bundle-entry.js +1 -1
  108. package/dist/server/plugins/analytics/adobe/index.js +1 -1
  109. package/dist/server/plugins/analytics/amplitude/index.js +1 -1
  110. package/dist/server/plugins/analytics/fullstory/index.js +1 -1
  111. package/dist/server/plugins/analytics/ga/index.js +1 -1
  112. package/dist/server/plugins/analytics/gtm/browser-hooks.js +1 -1
  113. package/dist/server/plugins/analytics/gtm/index.js +1 -1
  114. package/dist/server/plugins/analytics/heap/index.js +1 -1
  115. package/dist/server/plugins/analytics/rudderstack/index.js +1 -1
  116. package/dist/server/plugins/analytics/segment/index.js +1 -1
  117. package/dist/server/plugins/asyncapi-docs/index.js +1 -1
  118. package/dist/server/plugins/asyncapi-docs/search/get-ai-search-documents.js +27 -27
  119. package/dist/server/plugins/catalog-classic/get-server-props.js +1 -1
  120. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
  121. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +2 -2
  122. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.js +1 -1
  123. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.js +1 -1
  124. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.js +1 -1
  125. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.js +1 -1
  126. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.js +1 -1
  127. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.js +1 -1
  128. package/dist/server/plugins/catalog-entities/extensions/extractors/fs-entities-extractor.js +1 -1
  129. package/dist/server/plugins/catalog-entities/plugin.js +1 -1
  130. package/dist/server/plugins/config-parser/loaders/redocly-config-loader.js +1 -1
  131. package/dist/server/plugins/config-parser/loaders/utils/read-and-validate-config.js +1 -1
  132. package/dist/server/plugins/default-theme/index.js +1 -1
  133. package/dist/server/plugins/entitlements/index.js +1 -1
  134. package/dist/server/plugins/graphql-docs/index.js +1 -1
  135. package/dist/server/plugins/lifecycle.js +1 -1
  136. package/dist/server/plugins/markdown/attribute-resolvers/code-walkthrough/filesets-resolver.js +1 -1
  137. package/dist/server/plugins/markdown/attribute-resolvers/resolve-code-snippet-from-file.js +1 -1
  138. package/dist/server/plugins/markdown/attribute-resolvers/resolve-html-href.js +1 -1
  139. package/dist/server/plugins/markdown/attribute-resolvers/resolve-html-source-attribute.js +1 -1
  140. package/dist/server/plugins/markdown/attribute-resolvers/resolve-image-src-set.js +1 -1
  141. package/dist/server/plugins/markdown/attribute-resolvers/resolve-image-src.js +1 -1
  142. package/dist/server/plugins/markdown/attribute-resolvers/resolve-json-example-ref.js +1 -1
  143. package/dist/server/plugins/markdown/attribute-resolvers/resolve-json-schema-ref.js +1 -1
  144. package/dist/server/plugins/markdown/attribute-resolvers/resolve-link.js +1 -1
  145. package/dist/server/plugins/markdown/attribute-resolvers/resolve-native-md-link.js +1 -1
  146. package/dist/server/plugins/markdown/attribute-resolvers/resolve-nav-links.js +1 -1
  147. package/dist/server/plugins/markdown/attribute-resolvers/resolve-open-api-ref.js +1 -1
  148. package/dist/server/plugins/markdown/attribute-resolvers/resolve-parsed-yaml.js +1 -1
  149. package/dist/server/plugins/markdown/attribute-resolvers/resolve-raw-content.js +1 -1
  150. package/dist/server/plugins/markdown/attribute-resolvers/resolve-relative-or-cdn-icon.js +1 -1
  151. package/dist/server/plugins/markdown/attribute-resolvers/resolve-relative-path.js +1 -1
  152. package/dist/server/plugins/markdown/attribute-resolvers/resolve-sample-from-json-schema.js +1 -1
  153. package/dist/server/plugins/markdown/attribute-resolvers/resolve-svg-content.js +1 -1
  154. package/dist/server/plugins/markdown/markdoc/import-user-tags.js +1 -1
  155. package/dist/server/plugins/markdown/markdoc/markdoc-options.js +1 -1
  156. package/dist/server/plugins/markdown/markdoc/partials.js +1 -1
  157. package/dist/server/plugins/markdown/markdoc/plugins/headings.js +1 -1
  158. package/dist/server/plugins/markdown/markdoc/plugins/render-mermaid.js +1 -1
  159. package/dist/server/plugins/markdown/markdoc/plugins/utils.js +1 -1
  160. package/dist/server/plugins/markdown/runtime-transform.js +1 -1
  161. package/dist/server/plugins/markdown/search/get-ai-search-documents.js +1 -1
  162. package/dist/server/plugins/markdown/search/get-search-documents.js +2 -2
  163. package/dist/server/plugins/markdown/search/nodes/section-node.js +1 -1
  164. package/dist/server/plugins/markdown/search/search-resolver.js +1 -1
  165. package/dist/server/plugins/markdown/search/to-markdown.js +17 -13
  166. package/dist/server/plugins/markdown/search/walk-sections.js +1 -1
  167. package/dist/server/plugins/markdown/utils/stringify-tag-children-objects.js +1 -1
  168. package/dist/server/plugins/mcp/docs-mcp/tools/docs-mcp-tool.d.ts +5 -1
  169. package/dist/server/plugins/mcp/docs-mcp/tools/docs-mcp-tool.js +1 -1
  170. package/dist/server/plugins/mcp/docs-mcp/tools/index.js +1 -1
  171. package/dist/server/plugins/mcp/docs-mcp/tools/search.d.ts +3 -2
  172. package/dist/server/plugins/mcp/docs-mcp/tools/search.js +6 -1
  173. package/dist/server/plugins/mcp/handlers/docs-mcp-handler.js +1 -1
  174. package/dist/server/plugins/mcp/handlers/handle-mcp-request.js +1 -1
  175. package/dist/server/plugins/mcp/servers/docs-server.d.ts +9 -2
  176. package/dist/server/plugins/mcp/servers/docs-server.js +1 -1
  177. package/dist/server/plugins/mcp/types.d.ts +20 -1
  178. package/dist/server/plugins/openapi-docs/decorators.js +1 -1
  179. package/dist/server/plugins/openapi-docs/get-server-props-custom-fields.js +1 -1
  180. package/dist/server/plugins/openapi-docs/index.js +1 -1
  181. package/dist/server/plugins/openapi-docs/instances.d.ts +33 -0
  182. package/dist/server/plugins/openapi-docs/instances.js +1 -0
  183. package/dist/server/plugins/openapi-docs/search/get-ai-search-documents.js +20 -20
  184. package/dist/server/plugins/openapi-docs/search-indexer.js +1 -1
  185. package/dist/server/plugins/scorecard-classic/compute-scorecard.js +4 -4
  186. package/dist/server/plugins/scorecard-classic/index.js +1 -1
  187. package/dist/server/plugins/scorecard-classic/lint.js +1 -1
  188. package/dist/server/plugins/scorecard-classic/template/Grid/Grid.d.ts +2 -1
  189. package/dist/server/plugins/scorecard-classic/template/Grid/Grid.js +3 -3
  190. package/dist/server/plugins/scorecard-classic/template/Grid/GridHeader.js +15 -9
  191. package/dist/server/plugins/scorecard-classic/template/Grid/GridRow.js +1 -1
  192. package/dist/server/plugins/scorecard-classic/template/index.styles.js +5 -6
  193. package/dist/server/plugins/scorecard-classic/template/views.js +1 -1
  194. package/dist/server/plugins/scorecards/database/scorecards-config-service.js +1 -1
  195. package/dist/server/plugins/scorecards/plugin.js +1 -1
  196. package/dist/server/plugins/scorecards/workers/run-scorecards-worker.js +1 -1
  197. package/dist/server/plugins/search/ai-indexer/prepare-semantic-documents.d.ts +11 -0
  198. package/dist/server/plugins/search/ai-indexer/prepare-semantic-documents.js +1 -0
  199. package/dist/server/plugins/search/documents/search-documents.js +1 -1
  200. package/dist/server/plugins/search/engines/flexsearch/index.js +1 -1
  201. package/dist/server/plugins/search/engines/typesense/index.js +1 -1
  202. package/dist/server/plugins/search/index.js +1 -1
  203. package/dist/server/plugins/search/llmstxt/index.js +1 -1
  204. package/dist/server/plugins/search/utils.d.ts +2 -0
  205. package/dist/server/plugins/search/utils.js +2 -2
  206. package/dist/server/plugins/sidebars/index.js +2 -2
  207. package/dist/server/plugins/sso/index.js +1 -1
  208. package/dist/server/providers/database/base-repository.js +1 -1
  209. package/dist/server/providers/database/database-connection-factory.js +1 -1
  210. package/dist/server/providers/database/database-preconnect-service.js +1 -1
  211. package/dist/server/providers/database/databases/sqld-sqlite/drizzle.config.js +1 -1
  212. package/dist/server/ssr/render.js +1 -1
  213. package/dist/server/ssr/server-side-props/get-server-props-from-user-handler.js +1 -1
  214. package/dist/server/ssr/utils.js +1 -1
  215. package/dist/server/store.d.ts +3 -1
  216. package/dist/server/store.js +1 -1
  217. package/dist/server/telemetry/index.js +1 -1
  218. package/dist/server/tools/notifiers/formatter.js +1 -1
  219. package/dist/server/tools/notifiers/helpers/colors.js +1 -1
  220. package/dist/server/tools/notifiers/logger.js +1 -1
  221. package/dist/server/tools/notifiers/reporter.js +1 -1
  222. package/dist/server/tools/notifiers/terminal-manager.js +1 -1
  223. package/dist/server/types/plugins/common.d.ts +1 -0
  224. package/dist/server/types/plugins/markdown.d.ts +0 -7
  225. package/dist/server/utils/ai-agent-detection.d.ts +16 -0
  226. package/dist/server/utils/ai-agent-detection.js +1 -0
  227. package/dist/server/utils/envs/load-env-variables.js +1 -1
  228. package/dist/server/utils/fs.js +1 -1
  229. package/dist/server/utils/index.d.ts +2 -2
  230. package/dist/server/utils/index.js +1 -1
  231. package/dist/server/utils/is-catalog-entities-enabled.js +1 -1
  232. package/dist/server/utils/is-scorecards-enabled.js +1 -1
  233. package/dist/server/utils/report-all-errors.js +1 -1
  234. package/dist/server/version.js +1 -1
  235. package/dist/server/web-server/auth.d.ts +2 -0
  236. package/dist/server/web-server/auth.js +4 -4
  237. package/dist/server/web-server/handle-api-route-request.js +1 -1
  238. package/dist/server/web-server/http.js +2 -2
  239. package/dist/server/web-server/middleware/apiKeyMiddleware.js +1 -1
  240. package/dist/server/web-server/middleware/catalogAuthMiddleware.js +1 -1
  241. package/dist/server/web-server/middleware/corsMiddleware.js +1 -1
  242. package/dist/server/web-server/middleware/dynamic-middleware/dynamic-middleware.js +1 -1
  243. package/dist/server/web-server/middleware/idleTimeoutMiddleware.js +1 -1
  244. package/dist/server/web-server/middleware/responseHeadersMiddleware.js +1 -1
  245. package/dist/server/web-server/mime-types.js +1 -1
  246. package/dist/server/web-server/routes/auth.js +1 -1
  247. package/dist/server/web-server/routes/cors-proxy.d.ts +5 -0
  248. package/dist/server/web-server/routes/cors-proxy.js +2 -0
  249. package/dist/server/web-server/routes/dynamic-route.js +1 -1
  250. package/dist/server/web-server/routes/error.js +1 -1
  251. package/dist/server/web-server/routes/feedback.js +1 -1
  252. package/dist/server/web-server/routes/helpers/get-md-asset-pathname.d.ts +2 -0
  253. package/dist/server/web-server/routes/helpers/get-md-asset-pathname.js +1 -0
  254. package/dist/server/web-server/routes/index.js +1 -1
  255. package/dist/server/web-server/routes/info.js +1 -1
  256. package/dist/server/web-server/routes/mcp-oauth.js +1 -1
  257. package/dist/server/web-server/routes/otel/otel.js +1 -1
  258. package/dist/server/web-server/routes/page-data.js +1 -1
  259. package/dist/server/web-server/routes/path-prefix-redirect.js +1 -1
  260. package/dist/server/web-server/routes/resolve-route.js +1 -1
  261. package/dist/server/web-server/routes/semantic-search.d.ts +4 -0
  262. package/dist/server/web-server/routes/semantic-search.js +1 -0
  263. package/dist/server/workers/worker-pool.js +1 -1
  264. package/dist/{server/utils → utils}/slugger.d.ts +13 -0
  265. package/package.json +11 -11
  266. package/dist/client/app/ErrorBubble/index.d.ts +0 -3
  267. package/dist/client/app/ErrorBubble/index.js +0 -59
  268. package/dist/client/app/PageCounter/index.d.ts +0 -3
  269. package/dist/client/app/PageCounter/index.js +0 -64
  270. package/dist/config/env-config.js +0 -1
  271. package/dist/config/env-schemas/database.js +0 -1
  272. package/dist/server/config/external-plugins.js +0 -1
  273. package/dist/server/plugins/asyncapi-docs/template/helpers.js +0 -1
  274. package/dist/server/plugins/markdown/markdoc/custom-components/html-script.js +0 -1
  275. package/dist/server/plugins/markdown/markdoc/custom-components/openapi/openapi-code-sample.js +0 -1
  276. package/dist/server/plugins/markdown/markdoc/custom-components/openapi/openapi-response-sample.js +0 -1
  277. package/dist/server/plugins/markdown/markdoc/custom-components/openapi/replay-openapi.js +0 -1
  278. package/dist/server/plugins/markdown/markdoc/helpers/get-inner-text.js +0 -2
  279. package/dist/server/plugins/markdown/markdoc/helpers/get-variable.js +0 -1
  280. package/dist/server/plugins/markdown/markdoc/hooks/use-store.js +0 -1
  281. package/dist/server/plugins/markdown/markdoc/nodes/fence/index.js +0 -1
  282. package/dist/server/plugins/markdown/markdoc/nodes/heading.js +0 -1
  283. package/dist/server/plugins/markdown/markdoc/tags/json-example.d.ts +0 -3
  284. package/dist/server/plugins/markdown/markdoc/tags/json-schema.d.ts +0 -3
  285. package/dist/server/plugins/markdown/markdoc/tags/openapi-code-sample.d.ts +0 -3
  286. package/dist/server/plugins/markdown/markdoc/tags/openapi-example.d.ts +0 -3
  287. package/dist/server/plugins/markdown/markdoc/tags/openapi-response-sample.d.ts +0 -3
  288. package/dist/server/plugins/markdown/markdoc/tags/replay-openapi.d.ts +0 -3
  289. package/dist/server/plugins/openapi-docs/template/helpers.js +0 -5
  290. package/dist/server/plugins/search/ai-indexer/prepare-ai-search-documents.d.ts +0 -6
  291. package/dist/server/plugins/search/ai-indexer/prepare-ai-search-documents.js +0 -1
  292. /package/dist/client/app/{ErrorBubble → DevModeFloatingBar}/DetailedErrors.d.ts +0 -0
  293. /package/dist/client/app/{ErrorBubble → DevModeFloatingBar}/DetailedErrors.js +0 -0
  294. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/html-script.d.ts +0 -0
  295. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/index.d.ts +0 -0
  296. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/index.js +0 -0
  297. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/explain-step.d.ts +0 -0
  298. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/explain-step.js +0 -0
  299. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/get-operation/get-operation-info-by-id.d.ts +0 -0
  300. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/get-operation/get-operation-info-by-id.js +0 -0
  301. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/get-operation/get-operation-info-by-pointer.d.ts +0 -0
  302. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/get-operation/get-operation-info-by-pointer.js +0 -0
  303. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/get-operation/get-operation.d.ts +0 -0
  304. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/get-operation/get-operation.js +0 -0
  305. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/get-operation/index.d.ts +0 -0
  306. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/get-operation/index.js +0 -0
  307. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/get-operation/types/index.d.ts +0 -0
  308. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/get-operation/types/index.js +0 -0
  309. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/get-operation/types/operation-identifier.d.ts +0 -0
  310. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/get-operation/types/operation-identifier.js +0 -0
  311. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/get-operation/types/operation-info.d.ts +0 -0
  312. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/get-operation/types/operation-info.js +0 -0
  313. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/get-operation/types/operation-parameters.d.ts +0 -0
  314. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/get-operation/types/operation-parameters.js +0 -0
  315. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/index.d.ts +0 -0
  316. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/index.js +0 -0
  317. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/json-example.d.ts +0 -0
  318. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/json-example.js +0 -0
  319. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/json-schema.d.ts +0 -0
  320. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/json-schema.js +0 -0
  321. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/openapi-code-sample.d.ts +0 -0
  322. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/openapi-example.d.ts +0 -0
  323. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/openapi-example.js +0 -0
  324. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/openapi-response-sample.d.ts +0 -0
  325. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/replay-openapi.d.ts +0 -0
  326. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/step-by-step-wrapper.d.ts +0 -0
  327. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/openapi/step-by-step-wrapper.js +0 -0
  328. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/styled.elements.d.ts +0 -0
  329. /package/dist/{server/plugins/markdown → client/app}/markdoc/custom-components/styled.elements.js +0 -0
  330. /package/dist/{server/plugins/markdown → client/app}/markdoc/hooks/use-store.d.ts +0 -0
  331. /package/dist/{server/plugins/openapi-docs/template → client/templates/openapi-docs}/mock-server-config.d.ts +0 -0
  332. /package/dist/{server/plugins/openapi-docs/template → client/templates/openapi-docs}/mock-server-config.js +0 -0
  333. /package/dist/{server/plugins/markdown/markdoc → markdoc}/attributes/definition-path.d.ts +0 -0
  334. /package/dist/{server/plugins/markdown/markdoc → markdoc}/attributes/definition-path.js +0 -0
  335. /package/dist/{server/plugins/markdown/markdoc → markdoc}/attributes/index.d.ts +0 -0
  336. /package/dist/{server/plugins/markdown/markdoc → markdoc}/attributes/index.js +0 -0
  337. /package/dist/{server/plugins/markdown/markdoc → markdoc}/attributes/json-example-ref.d.ts +0 -0
  338. /package/dist/{server/plugins/markdown/markdoc → markdoc}/attributes/json-example-ref.js +0 -0
  339. /package/dist/{server/plugins/markdown/markdoc → markdoc}/attributes/json-schema-ref.d.ts +0 -0
  340. /package/dist/{server/plugins/markdown/markdoc → markdoc}/attributes/json-schema-ref.js +0 -0
  341. /package/dist/{server/plugins/markdown/markdoc → markdoc}/attributes/parsed-yaml.d.ts +0 -0
  342. /package/dist/{server/plugins/markdown/markdoc → markdoc}/attributes/parsed-yaml.js +0 -0
  343. /package/dist/{server/plugins/markdown/markdoc → markdoc}/attributes/raw-content.d.ts +0 -0
  344. /package/dist/{server/plugins/markdown/markdoc → markdoc}/attributes/raw-content.js +0 -0
  345. /package/dist/{server/plugins/markdown/markdoc → markdoc}/attributes/sample-from-json-schema.d.ts +0 -0
  346. /package/dist/{server/plugins/markdown/markdoc → markdoc}/attributes/sample-from-json-schema.js +0 -0
  347. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/extract-rbac-from-condition-node.d.ts +0 -0
  348. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/extract-rbac-from-condition-node.js +0 -0
  349. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/get-node-attribute.d.ts +0 -0
  350. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/get-node-attribute.js +0 -0
  351. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-code-node.d.ts +0 -0
  352. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-code-node.js +0 -0
  353. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-conditional-node.d.ts +0 -0
  354. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-conditional-node.js +0 -0
  355. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-content-node.d.ts +0 -0
  356. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-content-node.js +0 -0
  357. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-example-node.d.ts +0 -0
  358. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-example-node.js +0 -0
  359. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-fence-node.d.ts +0 -0
  360. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-fence-node.js +0 -0
  361. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-function.d.ts +0 -0
  362. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-function.js +0 -0
  363. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-list-node.d.ts +0 -0
  364. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-list-node.js +0 -0
  365. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-node.d.ts +0 -0
  366. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-node.js +0 -0
  367. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-string-node.d.ts +0 -0
  368. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-string-node.js +0 -0
  369. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-tag.d.ts +0 -0
  370. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-tag.js +0 -0
  371. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-text-node.d.ts +0 -0
  372. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-text-node.js +0 -0
  373. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-variable.d.ts +0 -0
  374. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/guards/is-variable.js +0 -0
  375. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/remove-markdoc-tags.d.ts +0 -0
  376. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/remove-markdoc-tags.js +0 -0
  377. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/set-node-attribute-value.d.ts +0 -0
  378. /package/dist/{server/plugins/markdown/markdoc → markdoc}/helpers/set-node-attribute-value.js +0 -0
  379. /package/dist/{server/plugins/markdown/markdoc → markdoc}/nodes/fence/escape-html.d.ts +0 -0
  380. /package/dist/{server/plugins/markdown/markdoc → markdoc}/nodes/fence/escape-html.js +0 -0
  381. /package/dist/{server/plugins/markdown/markdoc → markdoc}/nodes/fence/index.d.ts +0 -0
  382. /package/dist/{server/plugins/markdown/markdoc → markdoc}/nodes/gfm-list-item.d.ts +0 -0
  383. /package/dist/{server/plugins/markdown/markdoc → markdoc}/nodes/gfm-list-item.js +0 -0
  384. /package/dist/{server/plugins/markdown/markdoc → markdoc}/nodes/heading.d.ts +0 -0
  385. /package/dist/{server/plugins/markdown/markdoc → markdoc}/nodes/index.d.ts +0 -0
  386. /package/dist/{server/plugins/markdown/markdoc → markdoc}/nodes/index.js +0 -0
  387. /package/dist/{server/plugins/markdown/markdoc → markdoc}/nodes/table.d.ts +0 -0
  388. /package/dist/{server/plugins/markdown/markdoc → markdoc}/nodes/table.js +0 -0
  389. /package/dist/{server/plugins/markdown/markdoc → markdoc}/nodes/text.d.ts +0 -0
  390. /package/dist/{server/plugins/markdown/markdoc → markdoc}/nodes/text.js +0 -0
  391. /package/dist/{server/plugins/markdown/markdoc → markdoc}/tags/index.js +0 -0
  392. /package/dist/{server/plugins/markdown/markdoc → markdoc}/tags/json-example.js +0 -0
  393. /package/dist/{server/plugins/markdown/markdoc → markdoc}/tags/json-schema.js +0 -0
  394. /package/dist/{server/plugins/markdown/markdoc → markdoc}/tags/openapi-code-sample.js +0 -0
  395. /package/dist/{server/plugins/markdown/markdoc → markdoc}/tags/openapi-example.js +0 -0
  396. /package/dist/{server/plugins/markdown/markdoc → markdoc}/tags/openapi-response-sample.js +0 -0
  397. /package/dist/{server/plugins/markdown/markdoc → markdoc}/tags/replay-openapi.js +0 -0
  398. /package/dist/{config → server/config}/env-config.d.ts +0 -0
  399. /package/dist/{config → server/config}/env-schema.js +0 -0
  400. /package/dist/{config → server/config}/env-schemas/api-urls.d.ts +0 -0
  401. /package/dist/{config → server/config}/env-schemas/api-urls.js +0 -0
  402. /package/dist/{config → server/config}/env-schemas/auth.d.ts +0 -0
  403. /package/dist/{config → server/config}/env-schemas/auth.js +0 -0
  404. /package/dist/{config → server/config}/env-schemas/catalog.d.ts +0 -0
  405. /package/dist/{config → server/config}/env-schemas/catalog.js +0 -0
  406. /package/dist/{config → server/config}/env-schemas/environment-detection.d.ts +0 -0
  407. /package/dist/{config → server/config}/env-schemas/environment-detection.js +0 -0
  408. /package/dist/{config → server/config}/env-schemas/feature-flags.d.ts +0 -0
  409. /package/dist/{config → server/config}/env-schemas/feature-flags.js +0 -0
  410. /package/dist/{config → server/config}/env-schemas/scorecards.d.ts +0 -0
  411. /package/dist/{config → server/config}/env-schemas/scorecards.js +0 -0
  412. /package/dist/{config → server/config}/env-schemas/search.d.ts +0 -0
  413. /package/dist/{config → server/config}/env-schemas/search.js +0 -0
  414. /package/dist/{config → server/config}/env-schemas/server-config.d.ts +0 -0
  415. /package/dist/{config → server/config}/env-schemas/server-config.js +0 -0
  416. /package/dist/{config → server/config}/env-schemas/site.d.ts +0 -0
  417. /package/dist/{config → server/config}/env-schemas/site.js +0 -0
  418. /package/dist/{config → server/config}/env-schemas/ssr.d.ts +0 -0
  419. /package/dist/{config → server/config}/env-schemas/ssr.js +0 -0
  420. /package/dist/{config → server/config}/env-schemas/telemetry.d.ts +0 -0
  421. /package/dist/{config → server/config}/env-schemas/telemetry.js +0 -0
  422. /package/dist/{config → server/config}/env-schemas/test.d.ts +0 -0
  423. /package/dist/{config → server/config}/env-schemas/test.js +0 -0
  424. /package/dist/server/{config → external-plugins}/resolve-module.d.ts +0 -0
  425. /package/dist/server/{config → external-plugins}/resolve-module.js +0 -0
  426. /package/dist/{server/utils → utils}/conflict-resolvers.d.ts +0 -0
  427. /package/dist/{server/utils → utils}/conflict-resolvers.js +0 -0
  428. /package/dist/{server/utils → utils}/slugger.js +0 -0
@@ -1 +1 @@
1
- import*as l from"path";import{lintDocument as b,getTotals as g,getLineColLocation as P,Source as v,getCodeframe as h}from"@redocly/openapi-core";import{slash as m}from"../../../utils/path/slash.js";import{getUniqueProblemsCount as w}from"./shared-utils.js";const p=10;async function C(a,r,t,e,s=!1){const o=l.resolve(t.fs.cwd,a.relativePath),n=r.resolvedConfig.apis??{},i=Object.keys(n).find(f=>l.resolve(r.configPath?l.dirname(r.configPath):t.fs.cwd,n[f].root)===o),c={config:r.forAlias(i),base:l.dirname(o),document:{source:new v(o,a.content),parsed:a.parsed},externalRefResolver:e},u=await b(c),d=w(u);return{...g(u),uniqueErrors:d.errors,uniqueWarnings:d.warnings,problems:y(u,t.fs.cwd).filter(f=>!f.ignored||s&&f.ruleId!=="struct")}}function E(a){const r=new Set,t={};for(const[e,s]of Object.entries(a)){const o=t[e]=t[e]||new Set,n=s.rules.oas3_0;for(const i of Object.keys(n))if(i==="assertions"){if(!Array.isArray(n[i]))continue;for(const c of n[i])c&&(o.add(c.assertionId),r.add(c.assertionId))}else r.add(i),o.add(i)}return{perLevel:Object.fromEntries(Object.entries(t).map(([e,s])=>[e,Array.from(s)])),all:Array.from(r)}}function y(a,r){const t={};return a.map(e=>{const s=t[e.ruleId]||0;t[e.ruleId]=s+1;const o=e.location[0];if(s>p)return{...e,codeframe:`Only first ${p} code frames are shown.`,location:{...o,source:{absoluteRef:m(l.relative(r,o.source.absoluteRef))}},from:void 0};const n=P(o);return{...e,codeframe:h(n,!1),location:{...o,source:{absoluteRef:m(l.relative(r,o.source.absoluteRef))}},from:void 0}})}export{E as getAllRuleNames,C as lintDefinition};
1
+ import*as f from"path";import{lintDocument as g,getTotals as h,getLineColLocation as v,Source as C,getCodeframe as P}from"@redocly/openapi-core";import{slash as p}from"../../../utils/path/slash.js";import{getUniqueProblemsCount as O}from"./shared-utils.js";const b=10;async function j(a,s,t,e,r=!1){const o=f.resolve(t.fs.cwd,a.relativePath),l=s.resolvedConfig.apis??{},d=Object.keys(l).find(c=>f.resolve(s.configPath?f.dirname(s.configPath):t.fs.cwd,l[c].root)===o),u={config:s.forAlias(d),base:f.dirname(o),document:{source:new C(o,a.content),parsed:a.parsed},externalRefResolver:e},n=await g(u),i=O(n);return{...h(n),uniqueErrors:i.errors,uniqueWarnings:i.warnings,problems:A(n,t.fs.cwd).filter(c=>!c.ignored||r&&c.ruleId!=="struct")}}function E(a){const s=new Set,t={};for(const[e,r]of Object.entries(a)){const o=t[e]=t[e]||new Set,l=[r],d=r.resolvedConfig?.apis??{};for(const u of Object.keys(d)){const n=r.forAlias(u);n&&n!==r&&l.push(n)}for(const u of l){const n=Object.values(u.rules).flatMap(i=>Object.entries(i));for(const[i,c]of n)if(i==="assertions"){if(!Array.isArray(c))continue;for(const m of c)m&&(o.add(m.assertionId),s.add(m.assertionId))}else s.add(i),o.add(i)}}return{perLevel:Object.fromEntries(Object.entries(t).map(([e,r])=>[e,Array.from(r)])),all:Array.from(s)}}function A(a,s){const t={};return a.map(e=>{const r=t[e.ruleId]||0;t[e.ruleId]=r+1;const o=e.location[0];if(r>b)return{...e,codeframe:`Only first ${b} code frames are shown.`,location:{...o,source:{absoluteRef:p(f.relative(s,o.source.absoluteRef))}},from:void 0};const l=v(o);return{...e,codeframe:P(l,!1),location:{...o,source:{absoluteRef:p(f.relative(s,o.source.absoluteRef))}},from:void 0}})}export{E as getAllRuleNames,j as lintDefinition};
@@ -9,8 +9,9 @@ export type PossibleRowData = (Data | RuleProblem | TeamStats | Problem | Catalo
9
9
  export type GridProps = {
10
10
  data: PossibleRowData[];
11
11
  columns: ColumnDef<PossibleRowData>[];
12
+ gridTemplateColumns?: string;
12
13
  };
13
- export declare const Grid: ({ data, columns, sortBy, empty, subRowKey, slug, groupHeaderTitle, virtualized, }: GridProps & {
14
+ export declare const Grid: ({ data, columns, gridTemplateColumns: gridTemplateColumnsOverride, sortBy, empty, subRowKey, slug, groupHeaderTitle, virtualized, }: GridProps & {
14
15
  sortBy?: SortingState;
15
16
  empty?: ReactElement | string;
16
17
  subRowKey?: string;
@@ -1,8 +1,8 @@
1
- import t,{useMemo as c,useState as z,useEffect as G}from"react";import{useReactTable as $,getCoreRowModel as k,getSortedRowModel as A,getExpandedRowModel as I}from"@tanstack/react-table";import g from"styled-components";import{useWindowVirtualizer as H}from"@tanstack/react-virtual";import{SpinnerLoader as L}from"@redocly/theme/components/Loaders/SpinnerLoader";import{GridRow as p}from"./GridRow";import{GridHeader as V}from"./GridHeader";const P=({data:i,columns:n,sortBy:l,empty:w,subRowKey:s="subrows",slug:f,groupHeaderTitle:E,virtualized:R=!0})=>{const h=c(()=>l||[],[l]),v=$({columns:n,data:i,getCoreRowModel:k(),getSortedRowModel:A(),getExpandedRowModel:I(),getSubRows:e=>{const o=e?.[s];return Array.isArray(o)?o:[]},...l?{initialState:{sorting:h}}:{},autoResetExpanded:!1}),{getHeaderGroups:y,getRowModel:x}=v,C=y(),{rows:M}=x(),r=M.filter(e=>e.depth===0),[d,S]=z(!1);G(()=>{S(!0)},[]);const m=H({count:r.length,estimateSize:()=>54,overscan:R?15:9999,getItemKey(e){return`vi-row-${r[e].id}-${r.length}`}}),T=d?m.getVirtualItems():[],b=r.slice(0,50),a=c(()=>i.some(o=>{const u=o[s];return Array.isArray(u)&&u.length>0})?`50px repeat(${n.length-1}, 1fr)`:`25% repeat(${n.length-1}, 1fr)`,[n.length,i,s]);return t.createElement("div",{role:"table"},t.createElement(V,{headerGroups:C,gridTemplateColumns:a,groupHeaderTitle:E}),t.createElement(j,{style:{height:d?m.getTotalSize():"auto"},role:"rowgroup"},r.length>0?d?T.map(e=>{const o=r[e.index];return t.createElement(p,{key:e.key,variant:"virtualized",row:o,slug:f,virtualRow:e,virtualizer:m,gridTemplateColumns:a})}):t.createElement(t.Fragment,null,b.map(e=>t.createElement(p,{key:`ssr-row-${e.id}`,variant:"ssr",row:e,gridTemplateColumns:a})),t.createElement(D,null,t.createElement(L,{color:"var(--link-color-primary)",size:"20px"}))):t.createElement(p,{variant:"noData",empty:w,gridTemplateColumns:a})))},j=g.div`
1
+ import t,{useMemo as g,useState as T,useEffect as $}from"react";import{useReactTable as k,getCoreRowModel as A,getSortedRowModel as I,getExpandedRowModel as H}from"@tanstack/react-table";import w from"styled-components";import{useWindowVirtualizer as L}from"@tanstack/react-virtual";import{SpinnerLoader as V}from"@redocly/theme/components/Loaders/SpinnerLoader";import{GridRow as c}from"./GridRow";import{GridHeader as j}from"./GridHeader";const U=({data:i,columns:n,gridTemplateColumns:l,sortBy:s,empty:f,subRowKey:m="subrows",slug:E,groupHeaderTitle:R,virtualized:h=!0})=>{const y=g(()=>s||[],[s]),v=k({columns:n,data:i,getCoreRowModel:A(),getSortedRowModel:I(),getExpandedRowModel:H(),getSubRows:e=>{const o=e?.[m];return Array.isArray(o)?o:[]},...s?{initialState:{sorting:y}}:{},autoResetExpanded:!1}),{getHeaderGroups:x,getRowModel:C}=v,M=x(),{rows:S}=C(),r=S.filter(e=>e.depth===0),[d,b]=T(!1);$(()=>{b(!0)},[]);const u=L({count:r.length,estimateSize:()=>54,overscan:h?15:9999,getItemKey(e){return`vi-row-${r[e].id}-${r.length}`}}),z=d?u.getVirtualItems():[],G=r.slice(0,50),a=g(()=>l||(i.some(o=>{const p=o[m];return Array.isArray(p)&&p.length>0})?`50px repeat(${n.length-1}, 1fr)`:`25% repeat(${n.length-1}, 1fr)`),[n.length,i,m,l]);return t.createElement("div",{role:"table"},t.createElement(j,{headerGroups:M,gridTemplateColumns:a,groupHeaderTitle:R}),t.createElement(D,{style:{height:d?u.getTotalSize():"auto"},role:"rowgroup"},r.length>0?d?z.map(e=>{const o=r[e.index];return t.createElement(c,{key:e.key,variant:"virtualized",row:o,slug:E,virtualRow:e,virtualizer:u,gridTemplateColumns:a})}):t.createElement(t.Fragment,null,G.map(e=>t.createElement(c,{key:`ssr-row-${e.id}`,variant:"ssr",row:e,gridTemplateColumns:a})),t.createElement(F,null,t.createElement(V,{color:"var(--link-color-primary)",size:"20px"}))):t.createElement(c,{variant:"noData",empty:f,gridTemplateColumns:a})))},D=w.div`
2
2
  position: relative;
3
- `,D=g.div`
3
+ `,F=w.div`
4
4
  display: flex;
5
5
  justify-content: center;
6
6
  align-items: center;
7
7
  margin: 10px;
8
- `;export{P as Grid};
8
+ `;export{U as Grid};
@@ -1,17 +1,21 @@
1
- import o from"react";import l from"styled-components";import{flexRender as a}from"@tanstack/react-table";const C=({headerGroups:e,gridTemplateColumns:t,groupHeaderTitle:n})=>o.createElement(s,null,n&&o.createElement(g,{gridTemplateColumns:t,role:"row"},o.createElement(d,{gridColumn:"1",role:"cell"}),o.createElement(d,{gridColumn:"2 / -1",role:"cell"},o.createElement("span",null,n))),e.map((i,c)=>o.createElement(p,{key:`header-group-${c}`,gridTemplateColumns:t,role:"row"},i.headers.map((r,m)=>o.createElement(u,{key:r.id,gridColumn:m+1,onClick:r.column.getToggleSortingHandler(),role:"cell"},a(r.column.columnDef.header,r.getContext()),r.column.getCanSort()?o.createElement(x,null,r.column.getIsSorted()?r.column.getIsSorted()==="desc"?"\u25BE":"\u25B4":"\u21D5"):null))))),s=l.div`
1
+ import e from"react";import l from"styled-components";import{flexRender as m}from"@tanstack/react-table";const y=({headerGroups:o,gridTemplateColumns:t,groupHeaderTitle:n})=>e.createElement(s,null,n&&e.createElement(g,{gridTemplateColumns:t,role:"row"},e.createElement(i,{gridColumn:"1",role:"cell"}),e.createElement(i,{gridColumn:"2 / -1",role:"cell"},e.createElement("span",null,n))),o.map((d,c)=>e.createElement(p,{key:`header-group-${c}`,gridTemplateColumns:t,role:"row"},d.headers.map((r,a)=>e.createElement(u,{key:r.id,gridColumn:a+1,onClick:r.column.getToggleSortingHandler(),role:"cell"},m(r.column.columnDef.header,r.getContext()),r.column.getCanSort()?e.createElement(x,null,r.column.getIsSorted()?r.column.getIsSorted()==="desc"?"\u25BE":"\u25B4":"\u21D5"):null))))),s=l.div`
2
2
  border: 1px solid var(--border-color-primary);
3
3
  min-width: 775px;
4
+ position: sticky;
5
+ top: var(--navbar-height);
6
+ z-index: 1;
7
+ background-color: var(--color-white);
4
8
  `,g=l.div`
5
9
  display: grid;
6
- grid-template-columns: ${e=>e.gridTemplateColumns};
10
+ grid-template-columns: ${o=>o.gridTemplateColumns};
7
11
  width: 100%;
8
12
  min-width: 775px;
9
- `,d=l.div`
10
- padding: 5px 15px;
13
+ `,i=l.div`
14
+ padding: 5px;
11
15
  background-color: var(--bg-color-raised);
12
16
  font-weight: bold;
13
17
  color: var(--text-color-secondary);
14
- grid-column: ${e=>e.gridColumn};
18
+ grid-column: ${o=>o.gridColumn};
15
19
  display: flex;
16
20
  justify-content: center;
17
21
  align-items: center;
@@ -23,20 +27,22 @@ import o from"react";import l from"styled-components";import{flexRender as a}fro
23
27
  }
24
28
  `,p=l.div`
25
29
  display: grid;
26
- grid-template-columns: ${e=>e.gridTemplateColumns};
30
+ grid-template-columns: ${o=>o.gridTemplateColumns};
27
31
  width: 100%;
28
32
  `,u=l.div`
29
- padding: 5px 15px;
33
+ padding: 5px;
30
34
  background-color: var(--bg-color-raised);
31
35
  font-weight: bold;
32
36
  color: var(--text-color-secondary);
33
37
  cursor: pointer;
34
- grid-column: ${e=>e.gridColumn};
38
+ grid-column: ${o=>o.gridColumn};
35
39
  box-sizing: border-box;
40
+ overflow: hidden;
41
+ text-overflow: ellipsis;
36
42
 
37
43
  &:first-child {
38
44
  justify-content: flex-start;
39
45
  }
40
46
  `,x=l.span`
41
47
  font-family: monospace;
42
- `;export{C as GridHeader};
48
+ `;export{y as GridHeader};
@@ -22,7 +22,7 @@ import i from"react";import{flexRender as m}from"@tanstack/react-table";import l
22
22
  grid-template-columns: ${e=>e.gridTemplateColumns};
23
23
  align-items: center;
24
24
  `,p=l.div`
25
- padding: 5px 15px;
25
+ padding: 5px;
26
26
  text-align: left;
27
27
  grid-column: ${e=>e.gridColumn};
28
28
 
@@ -38,11 +38,11 @@ import r from"styled-components";import{Popup as e}from"reactjs-popup";import{Bu
38
38
  `,a=r.span`
39
39
  vertical-align: middle;
40
40
  display: inline-block;
41
- `,f=r(a)`
41
+ `,g=r(a)`
42
42
  margin-right: 0;
43
43
  text-align: right;
44
44
  width: 65px;
45
- `,g=r.div`
45
+ `,f=r.div`
46
46
  display: flex;
47
47
  flex-wrap: wrap;
48
48
  gap: 20px;
@@ -78,7 +78,7 @@ import r from"styled-components";import{Popup as e}from"reactjs-popup";import{Bu
78
78
  }
79
79
 
80
80
  thead th {
81
- padding: 5px 15px;
81
+ padding: 5px;
82
82
  background-color: var(--bg-color-raised);
83
83
 
84
84
  &:first-child {
@@ -96,7 +96,7 @@ import r from"styled-components";import{Popup as e}from"reactjs-popup";import{Bu
96
96
 
97
97
  th,
98
98
  td {
99
- padding: 5px 15px;
99
+ padding: 5px;
100
100
  text-align: left;
101
101
  flex: 1;
102
102
  }
@@ -208,7 +208,6 @@ import r from"styled-components";import{Popup as e}from"reactjs-popup";import{Bu
208
208
  border-bottom: ${({isActive:o})=>o?"1px solid var(--text-color-secondary);":"1px solid transparent"};
209
209
  `,C=r.div`
210
210
  max-width: 100%;
211
- overflow: auto;
212
211
  visibility: ${({isActive:o})=>o?"visible":"hidden"};
213
212
  height: ${({isActive:o})=>o?"auto":"0"};
214
213
  opacity: ${({isActive:o})=>o?"1":"0"};
@@ -291,4 +290,4 @@ import r from"styled-components";import{Popup as e}from"reactjs-popup";import{Bu
291
290
  'Noto Color Emoji',
292
291
  'EmojiOne Color';
293
292
  vertical-align: middle;
294
- `;export{k as AppPageWrapper,b as CardRow,a as CardValue,g as CardsWrapper,v as CatalogDescription,n as CatalogPageWrapper,T as Code,M as ContentWithDotWrap,m as Dot,D as EmojiWrap,I as FilePreview,f as GaugeNumber,E as GroupTh,P as InstanceControlsWrap,z as InstanceMessage,W as InstanceReference,j as InstanceWrap,B as LevelComplianceCardTitle,w as ModeSwitcherTab,y as ModeSwitcherTabs,x as ProblemsByStatusCardBody,s as ScoreCardStatusCardBody,c as ScorecardCard,i as ScorecardCardTitle,$ as SortIcon,u as StyledInput,S as StyledPopup,h as StyledTable,C as TableWrap};
293
+ `;export{k as AppPageWrapper,b as CardRow,a as CardValue,f as CardsWrapper,v as CatalogDescription,n as CatalogPageWrapper,T as Code,M as ContentWithDotWrap,m as Dot,D as EmojiWrap,I as FilePreview,g as GaugeNumber,E as GroupTh,P as InstanceControlsWrap,z as InstanceMessage,W as InstanceReference,j as InstanceWrap,B as LevelComplianceCardTitle,w as ModeSwitcherTab,y as ModeSwitcherTabs,x as ProblemsByStatusCardBody,s as ScoreCardStatusCardBody,c as ScorecardCard,i as ScorecardCardTitle,$ as SortIcon,u as StyledInput,S as StyledPopup,h as StyledTable,C as TableWrap};
@@ -1 +1 @@
1
- import*as e from"react";import{useCallback as _,useMemo as b,useState as U,useEffect as Z}from"react";import{useLocation as K}from"react-router-dom";import{Flex as J}from"@redocly/portal-legacy-ui";import{Button as w}from"@redocly/theme/components/Button/Button";import{AddIcon as V}from"@redocly/theme/icons/AddIcon/AddIcon";import{SubtractIcon as O}from"@redocly/theme/icons/SubtractIcon/SubtractIcon";import{ArrowLeftIcon as R}from"@redocly/theme/icons/ArrowLeftIcon/ArrowLeftIcon";import{useProcessScorecard as N}from"@redocly/theme/ext/process-scorecard";import{getScorecardColorVariable as z,withoutPathPrefix as I}from"@redocly/theme/core/utils";import{Link as T}from"../../../../client/app/Link";import Q from"../../../../client/app/CircularProgress";import{isDefined as W}from"../../../../utils/guards/is-defined.js";import{removeLeadingSlash as X}from"../../../../utils/url/remove-leading-slash.js";import{StatusByLevelWidget as Y}from"./StatusByLevelWidget";import{OTHER_TEAMS_LABEL as ee,NON_CONFORMANT as te}from"./utils";import{LevelIndicator as re}from"./LevelIndicator";import{AppPageWrapper as j,CardValue as S,CardsWrapper as B,CatalogDescription as ne,ModeSwitcherTab as ae,ModeSwitcherTabs as le,CardRow as F,ProblemsByStatusCardBody as q,ScoreCardStatusCardBody as M,TableWrap as se,LevelComplianceCardTitle as ce,ContentWithDotWrap as A,ScorecardCard as x,ScorecardCardTitle as L}from"./index.styles";import{ApiLevel as $,InstanceStatus as D,LevelStatus as H,RuleStatus as G}from"./components";import{Grid as P}from"./Grid/Grid";import{useDetailedScorecard as oe}from"./useDetailedScorecard";import{Gauge as ie,GaugeValue as ue}from"./Gauge";function Oe(g){const u=K(),{data:m,levelNames:i,hasPublishedAt:r,hasTeam:s,teamLabel:p}=g,y=_((t,a,d)=>{const o=t.getValue(d)?new Date(t.getValue(d)).getTime():0,f=a.getValue(d)?new Date(a.getValue(d)).getTime():0;return o>f?1:-1},[]),E=b(()=>[{id:"title",header:"API",accessorKey:"api.title",size:200,cell:({getValue:t,row:a})=>e.createElement(T,{to:I(u.pathname)+"/apis/"+encodeURIComponent(X(a.original.api.link))},t()," ",a.original.api.version)},r?{header:"Published at",accessorKey:"api.publishedAt",sortingFn:y,cell:({getValue:t})=>{const a=t();return a?new Date(a).toLocaleDateString():"-"}}:void 0,s?{header:p,accessorKey:"api.team"}:void 0,{id:"level",header:"Level",accessorKey:"scorecard.scorecardLevel",cell:({getValue:t,row:a})=>e.createElement($,{level:t(),colorVariable:z(a.original?.scorecard.scorecardLevelIdx,i.length+1)})},...i.map(t=>({id:t,header:`${t}`,accessorKey:"scorecard.levels",sortingFn:(a,d,o)=>{const f=a.getValue(o)[o].uniqueErrors,v=d.getValue(o)[o].uniqueErrors,n=a.getValue(o)[o].uniqueWarnings,h=d.getValue(o)[o].uniqueWarnings;return f===v?n-h:f-v},cell:({getValue:a,row:{original:d}})=>{const o=a(),f=d.api.link;return o?.[t]?e.createElement(re,{key:f,uniqueErrors:o[t].uniqueErrors,uniqueWarnings:o[t].uniqueWarnings,customDisplay:o[t].customDisplay,id:f}):null}}))].filter(W),[y,i,u.pathname,r,s,p]);return e.createElement(P,{columns:E,data:m,sortBy:[{id:"title",desc:!1}]})}function Re(g){const u=K(),{data:m}=g,i=b(()=>[{header:"Rules",accessorKey:"ruleId",cell:({getValue:r})=>e.createElement(T,{to:I(u.pathname)+"/rules/"+encodeURIComponent(r())},r())},{id:"status",header:"Status",accessorKey:"status",size:200,cell:({row:r})=>e.createElement(G,{errors:r.original.errorApisCount,warnings:r.original.warningApisCount})},{header:"Problem APIs",width:200,accessorKey:"apisCount",cell:({getValue:r})=>r(),sortDescFirst:!0},{header:"Problem count",size:200,accessorKey:"count",sortDescFirst:!0}],[u.pathname]);return e.createElement(P,{columns:i,data:m,virtualized:!1,sortBy:[{id:"status",desc:!0}]})}function ze(g){const{data:u,levelNames:m,filters:i,setActiveTab:r,teamLabel:s,teamProperty:p}=g,y=b(()=>[{id:"team",header:`API ${s}`,accessorKey:"team",size:200,cell:({getValue:E})=>e.createElement("a",{href:"#",onClick:t=>{t.preventDefault(),r("apis"),i.find(a=>a.property===p)?.selectOption(E())}},E())},...[te,...m].map(E=>({id:E,header:`${E}`,accessorFn:t=>t.levels[E]?.apis}))],[i,m,r,s,p]);return e.createElement(P,{columns:y,data:u,sortBy:[{id:"team",desc:!1}],groupHeaderTitle:"APIs by level"})}function me(g){const{data:u,title:m}=g,i=b(()=>[{id:"expand",maxSize:40,size:40,header:()=>null,enableSorting:!1,cell:({row:r})=>r.getCanExpand()?e.createElement(w,{onClick:r.getToggleExpandedHandler(),variant:"text",size:"medium",icon:r.getIsExpanded()?e.createElement(O,null):e.createElement(V,null)}):null},{header:"Rules",accessorKey:"ruleId",cell:({getValue:r,row:s})=>s.getCanExpand()?e.createElement("span",{onClick:s.getToggleExpandedHandler()},r()):null},{header:"Status",accessorKey:"status",size:200,cell:({getValue:r})=>{const s=r();return e.createElement(G,{errors:s?.errorsCount,warnings:s?.warningsCount})},enableSorting:!1},{header:"Problem count",accessorKey:"problemsCount",size:200,sortDescFirst:!0}],[]);return e.createElement(P,{columns:i,data:u,sortBy:[{id:"ruleId",desc:!1}],empty:e.createElement(e.Fragment,null,"\u2705 This API is compliant with ",e.createElement("strong",null,m)," level rules"),subRowKey:"problems"})}function Ie(g){const{catalogSlug:u,slug:m,data:i,hasTeam:r,hasPublishedAt:s,teamLabel:p}=g,{apis:y,apisCount:E,warningApisCount:t,errorApisCount:a,levels:d,count:o}=i,f=b(()=>Object.values(y),[y]),v=f.length===0,n=v?void 0:{id:"expand",maxSize:40,size:40,header:()=>null,enableSorting:!1,cell:({row:l})=>l.getCanExpand()?e.createElement(w,{onClick:l.getToggleExpandedHandler(),variant:"text",size:"medium",icon:l.getIsExpanded()?e.createElement(O,null):e.createElement(V,null)}):null},h=b(()=>[n,{header:"API",accessorKey:"title"},s?{header:"Published at",accessorKey:"publishedAt",cell:({getValue:l})=>{const c=l();return c?new Date(c).toLocaleDateString():"-"}}:void 0,r?{header:p,accessorKey:"team",cell:({getValue:l})=>l()||ee}:void 0,{header:"Problem count",size:200,accessorKey:"count",cell:({getValue:l})=>l()||0,sortDescFirst:!0}].filter(W),[r,s,p,v]),k=b(()=>Object.entries(i.teams).sort((l,c)=>c[1]-l[1]),[i.teams]);return e.createElement(j,null,e.createElement(w,{icon:e.createElement(R,null),iconPosition:"left",variant:"ghost",size:"large",to:`${u}scorecard`},"Back to dashboard"),e.createElement("h1",null,"Rule ",m),e.createElement(B,null,e.createElement(x,null,e.createElement(L,null,"Rule status"),e.createElement(M,null,e.createElement("div",null,e.createElement(S,null,E),e.createElement("br",null),"APIs"),e.createElement("div",null,e.createElement(A,null,e.createElement(S,{style:{textAlign:"right"}},E-t-a),e.createElement(D,{severity:"Pass"})),e.createElement(A,null,e.createElement(S,{style:{textAlign:"right"}},t),e.createElement(D,{severity:"Warn"})),e.createElement(A,null,e.createElement(S,{style:{textAlign:"right"}},a),e.createElement(D,{severity:"Error"}))))),e.createElement(x,null,e.createElement(L,null,"Problems by level"),e.createElement(q,null,Object.entries(d).map(([l,c])=>e.createElement(F,{key:l},e.createElement("span",null,l),e.createElement(ie,{chunks:[{share:c.errors/o*100,colorVariable:"--scorecard-color-error"},{share:c.warnings/o*100,colorVariable:"--scorecard-color-warning"}]}),e.createElement(ue,null,c.errors+c.warnings))))),e.createElement(x,null,e.createElement(L,null,`Problems by ${p}`),e.createElement(q,null,k.slice(0,4).map(([l,c])=>e.createElement(F,{key:l},e.createElement("span",{style:{flex:1,textAlign:"left"}},l),e.createElement(S,null,c)))))),e.createElement(P,{columns:h,data:f,sortBy:[{id:"title",desc:!1}],subRowKey:"problems",slug:m}))}function We(g){const{slug:u,api:m,teamLabel:i,catalogSlug:r}=g,{api:s}=m||{},{scorecard:p,isLoading:y}=oe(`/${u}`),{processScorecard:E}=N(),t=p&&E(p,m.api),a=t?.levels||{},[d,o]=U(Object.keys(a)[0]),f=b(()=>s?.publishedAt instanceof Date?s?.publishedAt.toLocaleDateString():s?.publishedAt,[s]);Z(()=>{if(t){const n=t.levels||{};o(Object.keys(n)[0])}},[p]);const v=b(()=>{if(!t?.levels)return{};const n={};for(const h of Object.keys(t.levels)){const k=t.levels[h].problems.reduce((l,c)=>(l[c.ruleId]||(l[c.ruleId]=[]),l[c.ruleId].push(c),l),{});n[h]=Object.entries(k).map(([l,c])=>({ruleId:l,problems:[...c.filter(C=>C.severity==="error"),...c.filter(C=>C.severity==="warn")],problemsCount:c.length,status:{errorsCount:c.filter(C=>C.severity==="error").length,warningsCount:c.filter(C=>C.severity==="warn").length}}))}return n},[t?.levels]);return y?e.createElement(J,{justifyContent:"center",mt:"2em"},e.createElement(Q,null)):t?e.createElement(j,null,e.createElement(w,{icon:e.createElement(R,null),iconPosition:"left",variant:"ghost",size:"large",to:`${r}scorecard`},"Back to dashboard"),e.createElement("h1",null,s?.title||u),e.createElement(ne,null,f&&e.createElement(e.Fragment,null,"Published at: ",new Date().toLocaleString(void 0,{timeZoneName:"short"}),e.createElement("br",null)),e.createElement(T,{to:s?.link,external:!0},"Documentation")),e.createElement(B,null,e.createElement(x,null,e.createElement(ce,null,e.createElement("span",null,"Scorecard level"),e.createElement($,{level:t.scorecardLevel,colorVariable:z(t.scorecardLevelIdx,Object.keys(a).length)})),e.createElement(M,null,e.createElement("div",null,"Compliance by level"),e.createElement("div",null,Object.entries(t.levels).map(([n,h])=>e.createElement(A,{key:n},e.createElement(S,{style:{width:"100px",textAlign:"right"}},n),e.createElement(H,{errors:h.errors,warnings:h.warnings})))))),e.createElement(Y,{title:"Rules compliance",levels:Object.entries(t.levels).map(([n,h])=>({errors:h.uniqueErrors,warnings:h.uniqueWarnings,total:g.rulesPerLevel[n].length,name:n}))}),e.createElement(x,null,e.createElement(L,null,i),e.createElement(S,{style:{fontWeight:"normal"}},s?.team))),e.createElement(le,{style:{justifyContent:"flex-start"},"data-component-name":"Scorecard/ModeSwitcherTabs"},Object.keys(t.levels).map(n=>e.createElement(ae,{"data-component-name":"Scorecard/ModeSwitcherTab",key:n,isActive:d===n,onClick:()=>o(n)},e.createElement(A,null,e.createElement("span",null,n)," ",e.createElement(H,{errors:t.levels[n].errors,warnings:t.levels[n].warnings}))))),Object.keys(a).map(n=>e.createElement(se,{key:n,isActive:d===n},e.createElement(me,{title:n,data:v[n]})))):e.createElement("div",null,"Scorecard not found")}export{Oe as ApiListView,We as ApiPage,me as ApiView,Ie as RuleView,Re as RulesView,ze as TeamsView};
1
+ import*as e from"react";import{useCallback as ce,useMemo as E,useState as ue,useEffect as de}from"react";import{useLocation as M}from"react-router-dom";import{Flex as me}from"@redocly/portal-legacy-ui";import{Button as F}from"@redocly/theme/components/Button/Button";import{AddIcon as J}from"@redocly/theme/icons/AddIcon/AddIcon";import{SubtractIcon as Q}from"@redocly/theme/icons/SubtractIcon/SubtractIcon";import{ArrowLeftIcon as X}from"@redocly/theme/icons/ArrowLeftIcon/ArrowLeftIcon";import{useProcessScorecard as Y}from"@redocly/theme/ext/process-scorecard";import{getScorecardColorVariable as ee,withoutPathPrefix as te}from"@redocly/theme/core/utils";import{Link as $}from"../../../../client/app/Link";import pe from"../../../../client/app/CircularProgress";import{isDefined as H}from"../../../../utils/guards/is-defined.js";import{removeLeadingSlash as ge}from"../../../../utils/url/remove-leading-slash.js";import{StatusByLevelWidget as fe}from"./StatusByLevelWidget";import{OTHER_TEAMS_LABEL as Ee,NON_CONFORMANT as he}from"./utils";import{LevelIndicator as be}from"./LevelIndicator";import{AppPageWrapper as re,CardValue as V,CardsWrapper as ne,CatalogDescription as ye,ModeSwitcherTab as G,ModeSwitcherTabs as ve,CardRow as ae,ProblemsByStatusCardBody as le,ScoreCardStatusCardBody as se,TableWrap as U,LevelComplianceCardTitle as Se,ContentWithDotWrap as z,ScorecardCard as I,ScorecardCardTitle as K}from"./index.styles";import{ApiLevel as ie,InstanceStatus as _,LevelStatus as B,RuleStatus as oe}from"./components";import{Grid as N}from"./Grid/Grid";import{useDetailedScorecard as Ce}from"./useDetailedScorecard";import{Gauge as we,GaugeValue as Ae}from"./Gauge";function xe(c,d,p){if(c===d)return 0;if(c==null||c==="")return 1;if(d==null||d==="")return-1;if(p==="number"){const m=Number(c),a=Number(d),s=Number.isNaN(m),g=Number.isNaN(a);return s&&g?0:s?1:g?-1:m-a}if(p==="date"){const m=new Date(String(c)).getTime(),a=new Date(String(d)).getTime(),s=Number.isNaN(m),g=Number.isNaN(a);return s&&g?0:s?1:g?-1:m-a}return String(c).localeCompare(String(d))}function W(c){return c==="error"?{errors:1,warnings:0}:c==="warning"?{errors:0,warnings:1}:{errors:0,warnings:0}}function _e(c){const d=M(),{data:p,levelNames:m,hasPublishedAt:a,hasTeam:s,teamLabel:g}=c,{getApiTableColumns:T}=Y(),b=ce((o,S,h)=>{const P=o.getValue(h)?new Date(o.getValue(h)).getTime():0,n=S.getValue(h)?new Date(S.getValue(h)).getTime():0;return P>n?1:-1},[]),v=E(()=>{const o=T?.()??[],S=o.filter(n=>n.placement==="beforeLevels"),h=o.filter(n=>n.placement!=="beforeLevels"),P=n=>({id:n.id,header:String(n.header),accessorFn:i=>n.getValue?.(i)??n.getSortValue?.(i),enableSorting:!!(n.sortingFn||n.sortRule||n.getSortValue||n.getValue),sortingFn:(i,f,r)=>{const l=i.original,w=f.original,k=n.getSortValue?.(l)??i.getValue(r),A=n.getSortValue?.(w)??f.getValue(r);return n.sortingFn?n.sortingFn({rowA:l,rowB:w,valueA:k,valueB:A}):xe(k,A,n.sortRule||"string")},...n.sortDescFirst!==void 0?{sortDescFirst:n.sortDescFirst}:{},cell:({getValue:i,row:f})=>{const r=i(),l=f.original;return n.render?n.render({row:l,value:r}):r==null||r===""?"-":String(r)},...n.size!==void 0?{size:n.size}:{},...n.minSize!==void 0?{minSize:n.minSize}:{},...n.maxSize!==void 0?{maxSize:n.maxSize}:{}});return[{id:"title",header:"API",accessorKey:"api.title",size:200,cell:({getValue:n,row:i})=>e.createElement($,{to:te(d.pathname)+"/apis/"+encodeURIComponent(ge(i.original.api.link))},n()," ",i.original.api.version)},a?{header:"Published at",accessorKey:"api.publishedAt",sortingFn:b,cell:({getValue:n})=>{const i=n();return i?new Date(i).toLocaleDateString():"-"}}:void 0,s?{header:g,accessorKey:"api.team"}:void 0,{id:"level",header:"Level",accessorKey:"scorecard.scorecardLevel",cell:({getValue:n,row:i})=>e.createElement(ie,{level:n(),colorVariable:ee(i.original?.scorecard.scorecardLevelIdx,m.length+1)})},...S.map(P),...m.map(n=>({id:n,header:`${n}`,accessorKey:"scorecard.levels",sortingFn:(i,f,r)=>{const l=i.getValue(r)[r].uniqueErrors,w=f.getValue(r)[r].uniqueErrors,k=i.getValue(r)[r].uniqueWarnings,A=f.getValue(r)[r].uniqueWarnings;return l===w?k-A:l-w},cell:({getValue:i,row:{original:f}})=>{const r=i(),l=f.api.link;return r?.[n]?e.createElement(be,{key:l,uniqueErrors:r[n].uniqueErrors,uniqueWarnings:r[n].uniqueWarnings,customDisplay:r[n].customDisplay,id:l}):null}})),...h.map(P)].filter(H)},[b,m,d.pathname,a,s,g,T]),D=E(()=>{const o=Math.max(v.length-3,0);return`25% max(140px, 15%) max(140px, 10%)${o>0?` repeat(${o}, 1fr)`:""}`},[v.length]);return e.createElement(N,{columns:v,data:p,sortBy:[{id:"title",desc:!1}],gridTemplateColumns:D})}function Ze(c){const d=M(),{data:p}=c,m=E(()=>[{header:"Rules",accessorKey:"ruleId",cell:({getValue:a})=>e.createElement($,{to:te(d.pathname)+"/rules/"+encodeURIComponent(a())},a())},{id:"status",header:"Status",accessorKey:"status",size:200,cell:({row:a})=>e.createElement(oe,{errors:a.original.errorApisCount,warnings:a.original.warningApisCount})},{header:"Problem APIs",width:200,accessorKey:"apisCount",cell:({getValue:a})=>a(),sortDescFirst:!0},{header:"Problem count",size:200,accessorKey:"count",sortDescFirst:!0}],[d.pathname]);return e.createElement(N,{columns:m,data:p,virtualized:!1,sortBy:[{id:"status",desc:!0}]})}function Je(c){const{data:d,levelNames:p,filters:m,setActiveTab:a,teamLabel:s,teamProperty:g}=c,T=E(()=>[{id:"team",header:`API ${s}`,accessorKey:"team",size:200,cell:({getValue:b})=>e.createElement("a",{href:"#",onClick:v=>{v.preventDefault(),a("apis"),m.find(D=>D.property===g)?.selectOption(b())}},b())},...[he,...p].map(b=>({id:b,header:`${b}`,accessorFn:v=>v.levels[b]?.apis}))],[m,p,a,s,g]);return e.createElement(N,{columns:T,data:d,sortBy:[{id:"team",desc:!1}],groupHeaderTitle:"APIs by level"})}function Te(c){const{data:d,title:p}=c,m=E(()=>[{id:"expand",maxSize:40,size:40,header:()=>null,enableSorting:!1,cell:({row:a})=>a.getCanExpand()?e.createElement(F,{onClick:a.getToggleExpandedHandler(),variant:"text",size:"medium",icon:a.getIsExpanded()?e.createElement(Q,null):e.createElement(J,null)}):null},{header:"Rules",accessorKey:"ruleId",cell:({getValue:a,row:s})=>s.getCanExpand()?e.createElement("span",{onClick:s.getToggleExpandedHandler()},a()):null},{header:"Status",accessorKey:"status",size:200,cell:({getValue:a})=>{const s=a();return e.createElement(oe,{errors:s?.errorsCount,warnings:s?.warningsCount})},enableSorting:!1},{header:"Problem count",accessorKey:"problemsCount",size:200,sortDescFirst:!0}],[]);return e.createElement(N,{columns:m,data:d,sortBy:[{id:"ruleId",desc:!1}],empty:e.createElement(e.Fragment,null,"\u2705 This API is compliant with ",e.createElement("strong",null,p)," level rules"),subRowKey:"problems"})}function Qe(c){const{catalogSlug:d,slug:p,data:m,hasTeam:a,hasPublishedAt:s,teamLabel:g}=c,{apis:T,apisCount:b,warningApisCount:v,errorApisCount:D,levels:o,count:S}=m,h=E(()=>Object.values(T),[T]),P=h.length===0,n=P?void 0:{id:"expand",maxSize:40,size:40,header:()=>null,enableSorting:!1,cell:({row:r})=>r.getCanExpand()?e.createElement(F,{onClick:r.getToggleExpandedHandler(),variant:"text",size:"medium",icon:r.getIsExpanded()?e.createElement(Q,null):e.createElement(J,null)}):null},i=E(()=>[n,{header:"API",accessorKey:"title"},s?{header:"Published at",accessorKey:"publishedAt",cell:({getValue:r})=>{const l=r();return l?new Date(l).toLocaleDateString():"-"}}:void 0,a?{header:g,accessorKey:"team",cell:({getValue:r})=>r()||Ee}:void 0,{header:"Problem count",size:200,accessorKey:"count",cell:({getValue:r})=>r()||0,sortDescFirst:!0}].filter(H),[a,s,g,P]),f=E(()=>Object.entries(m.teams).sort((r,l)=>l[1]-r[1]),[m.teams]);return e.createElement(re,null,e.createElement(F,{icon:e.createElement(X,null),iconPosition:"left",variant:"ghost",size:"large",to:`${d}scorecard`},"Back to dashboard"),e.createElement("h1",null,"Rule ",p),e.createElement(ne,null,e.createElement(I,null,e.createElement(K,null,"Rule status"),e.createElement(se,null,e.createElement("div",null,e.createElement(V,null,b),e.createElement("br",null),"APIs"),e.createElement("div",null,e.createElement(z,null,e.createElement(V,{style:{textAlign:"right"}},b-v-D),e.createElement(_,{severity:"Pass"})),e.createElement(z,null,e.createElement(V,{style:{textAlign:"right"}},v),e.createElement(_,{severity:"Warn"})),e.createElement(z,null,e.createElement(V,{style:{textAlign:"right"}},D),e.createElement(_,{severity:"Error"}))))),e.createElement(I,null,e.createElement(K,null,"Problems by level"),e.createElement(le,null,Object.entries(o).map(([r,l])=>e.createElement(ae,{key:r},e.createElement("span",null,r),e.createElement(we,{chunks:[{share:l.errors/S*100,colorVariable:"--scorecard-color-error"},{share:l.warnings/S*100,colorVariable:"--scorecard-color-warning"}]}),e.createElement(Ae,null,l.errors+l.warnings))))),e.createElement(I,null,e.createElement(K,null,`Problems by ${g}`),e.createElement(le,null,f.slice(0,4).map(([r,l])=>e.createElement(ae,{key:r},e.createElement("span",{style:{flex:1,textAlign:"left"}},r),e.createElement(V,null,l)))))),e.createElement(N,{columns:i,data:h,sortBy:[{id:"title",desc:!1}],subRowKey:"problems",slug:p}))}function Xe(c){const{slug:d,api:p,teamLabel:m,catalogSlug:a}=c,{api:s}=p||{},g=M(),{scorecard:T,isLoading:b}=Ce(`/${d}`),{processScorecard:v,getApiTableColumns:D}=Y(),o=T&&v(T,p.api),S=o?.levels||{},h=E(()=>Object.keys(S),[S]),P=E(()=>s?.publishedAt instanceof Date?s?.publishedAt.toLocaleDateString():s?.publishedAt,[s]),n=E(()=>{if(!o?.levels)return{};const t={};for(const u of Object.keys(o.levels)){const x=o.levels[u].problems.reduce((L,C)=>(L[C.ruleId]||(L[C.ruleId]=[]),L[C.ruleId].push(C),L),{});t[u]=Object.entries(x).map(([L,C])=>({ruleId:L,problems:[...C.filter(y=>y.severity==="error"),...C.filter(y=>y.severity==="warn")],problemsCount:C.length,status:{errorsCount:C.filter(y=>y.severity==="error").length,warningsCount:C.filter(y=>y.severity==="warn").length}}))}return t},[o?.levels]),i=E(()=>{if(!o)return[];const t={api:p.api,scorecard:o};return(D?.()??[]).filter(u=>!u.details?.hidden).map(u=>{const x=u.getValue?.(t),L=u.details?.description,C=typeof L=="function"?L(t):L;let y;if(u.details?.render){if(y=u.details.render({row:t,value:x}),y===null)return}else if(u.render){if(y=u.render({row:t,value:x}),y===null)return}else y=x==null||x===""?"-":String(x);const O=u.details?.status,q=typeof O=="function"?O({row:t,value:x}):O,Z=u.details?.statusRule;let j=q||"success";return!q&&Z==="problem-if-truthy"&&(j=x?"error":"success"),!q&&Z==="problem-if-falsy"&&(j=x?"success":"error"),{id:`custom-${u.id}`,label:u.details?.tabLabel||u.header,description:C,content:y,placement:u.placement==="beforeLevels"?"beforeLevels":"afterLevels",status:j}}).filter(H)},[p.api,D,o]),f=E(()=>i.filter(t=>t.placement==="beforeLevels"),[i]),r=E(()=>i.filter(t=>t.placement==="afterLevels"),[i]),l=E(()=>[...f.map(t=>t.id),...h,...r.map(t=>t.id)],[r,f,h]),w=E(()=>new URLSearchParams(g.search).get("tab")?.trim()||void 0,[g.search]),k=E(()=>{if(w)return h.includes(w)?w:[...f,...r].find(t=>t.label===w)?.id},[r,f,h,w]),[A,R]=ue(l[0]||"");return de(()=>{if(l.length){if(k&&l.includes(k)){R(k);return}R(t=>l.includes(t)?t:l[0])}},[l,k]),b?e.createElement(me,{justifyContent:"center",mt:"2em"},e.createElement(pe,null)):o?e.createElement(re,null,e.createElement(F,{icon:e.createElement(X,null),iconPosition:"left",variant:"ghost",size:"large",to:`${a}scorecard`},"Back to dashboard"),e.createElement("h1",null,s?.title||d),e.createElement(ye,null,P&&e.createElement(e.Fragment,null,"Published at: ",new Date().toLocaleString(void 0,{timeZoneName:"short"}),e.createElement("br",null)),e.createElement($,{to:s?.link,external:!0},"Documentation")),e.createElement(ne,null,e.createElement(I,null,e.createElement(Se,null,e.createElement("span",null,"Scorecard level"),e.createElement(ie,{level:o.scorecardLevel,colorVariable:ee(o.scorecardLevelIdx,Object.keys(S).length)})),e.createElement(se,null,e.createElement("div",null,"Compliance by level"),e.createElement("div",null,Object.entries(o.levels).map(([t,u])=>e.createElement(z,{key:t},e.createElement(V,{style:{width:"100px",textAlign:"right"}},t),e.createElement(B,{errors:u.errors,warnings:u.warnings})))))),e.createElement(fe,{title:"Rules compliance",levels:Object.entries(o.levels).map(([t,u])=>({errors:u.uniqueErrors,warnings:u.uniqueWarnings,total:c.rulesPerLevel[t].length,name:t}))}),e.createElement(I,null,e.createElement(K,null,m),e.createElement(V,{style:{fontWeight:"normal"}},s?.team))),e.createElement(ve,{style:{justifyContent:"flex-start"},"data-component-name":"Scorecard/ModeSwitcherTabs"},f.map(t=>e.createElement(G,{"data-component-name":"Scorecard/ModeSwitcherTab",key:t.id,isActive:A===t.id,onClick:()=>R(t.id)},e.createElement(z,null,e.createElement("span",null,t.label),e.createElement(B,{errors:W(t.status).errors,warnings:W(t.status).warnings})))),h.map(t=>e.createElement(G,{"data-component-name":"Scorecard/ModeSwitcherTab",key:t,isActive:A===t,onClick:()=>R(t)},e.createElement(z,null,e.createElement("span",null,t)," ",e.createElement(B,{errors:o.levels[t].errors,warnings:o.levels[t].warnings})))),r.map(t=>e.createElement(G,{"data-component-name":"Scorecard/ModeSwitcherTab",key:t.id,isActive:A===t.id,onClick:()=>R(t.id)},e.createElement(z,null,e.createElement("span",null,t.label),e.createElement(B,{errors:W(t.status).errors,warnings:W(t.status).warnings}))))),f.map(t=>e.createElement(U,{key:t.id,isActive:A===t.id},e.createElement(I,null,t.description?e.createElement("p",{style:{marginTop:0,marginBottom:12,color:"var(--text-color-secondary)"}},t.description):null,e.createElement("div",null,t.content)))),h.map(t=>e.createElement(U,{key:t,isActive:A===t},e.createElement(Te,{title:t,data:n[t]}))),r.map(t=>e.createElement(U,{key:t.id,isActive:A===t.id},e.createElement(I,null,t.description?e.createElement("p",{style:{marginTop:0,marginBottom:12,color:"var(--text-color-secondary)"}},t.description):null,e.createElement("div",null,t.content))))):e.createElement("div",null,"Scorecard not found")}export{_e as ApiListView,Xe as ApiPage,Te as ApiView,Qe as RuleView,Ze as RulesView,Je as TeamsView};
@@ -1 +1 @@
1
- import{ulid as g}from"ulid";import{logger as r}from"../../../tools/notifiers/logger.js";import{DatabaseConnectionFactory as l}from"../../../providers/database/database-connection-factory.js";import{BaseRepository as d}from"../../../providers/database/base-repository.js";import{shaHex as h}from"../../../utils/crypto/sha-hex.js";import{hasOptionsChanged as m}from"../../../plugins/catalog-entities/utils/has-options-changed.js";import{slug as y}from"../../../utils/slugger.js";import{withTimestamp as f}from"../../../utils/time/with-timestamp.js";import{ScorecardsConfigLocalRepository as p}from"./repositories/local/scorecards-config-local-repository.js";class o extends d{static#i;static#e;#t;constructor(t){if(!t)throw new Error("Database connection is required for ScorecardsConfigService");super(t),this.#t=new p(this.databaseClient)}static async getInstance(t){const i=m(o.#e,t);if(!o.#i||i){const n=await l.create("main-local",t);if(!n)throw new Error("Failed to create db connection for scorecards config service");o.#i=new o(n),o.#e=t}return o.#i}async syncConfig(t,i){const n=new Set;(!Array.isArray(t)||t.length===0)&&r.verbose("No scorecard configs to sync"),r.verbose(`Starting scorecard config sync for ${t.length} config(s)`);for(const s of t)try{const e=s.key;if(!/^[a-z0-9-]+$/i.test(e)){r.error(`Skipping invalid scorecard config item: key "${e}" does not match kebab-case format (letters, numbers, and dashes only)`,{scorecard:s});continue}n.add(e);const a=this.#s(s),c=await this.#t.findActiveConfigByKey(e);if(c){if(c.configHash===a){r.verbose(`Config "${e}" unchanged, skipping update`);continue}r.verbose(`Updating config "${e}"`),await this.#r(c.id,s,a)}else r.verbose(`Inserting new config "${e}"`),await this.#n(e,s,a);i&&await i(e)}catch(e){r.error("Error processing scorecard config item:",{error:e.message??e,scorecard:s})}await this.#o(n),r.verbose("Sync scorecard configuration: success")}#s(t){const i=JSON.stringify({entities:t.entities,levels:t.levels});return h(i)}async#n(t,i,n){await this.#t.insertConfig(f({id:`sc_${g()}`,key:t,slug:y(t),name:i.name,description:i.description??null,entitiesFilter:JSON.stringify(i.entities),levels:JSON.stringify(i.levels),configHash:n,archivedAt:null}))}async#r(t,i,n){const s=f({entitiesFilter:JSON.stringify(i.entities),levels:JSON.stringify(i.levels),configHash:n,archivedAt:null},{fields:["updatedAt"]});await this.#t.updateConfigById(t,s)}async#o(t){const i=await this.#t.findAllActiveConfigs(),n=new Date().toISOString();for(const s of i)if(!t.has(s.key)){r.verbose(`Archiving removed config "${s.key}"`);try{await this.#t.archiveConfigById(s.id,n)}catch(e){r.error(`Error archiving config item "${s.key}":`,e.message??e)}}}}export{o as ScorecardsConfigService};
1
+ import{ulid as g}from"ulid";import{logger as r}from"../../../tools/notifiers/logger.js";import{DatabaseConnectionFactory as l}from"../../../providers/database/database-connection-factory.js";import{BaseRepository as d}from"../../../providers/database/base-repository.js";import{shaHex as h}from"../../../utils/crypto/sha-hex.js";import{hasOptionsChanged as m}from"../../../plugins/catalog-entities/utils/has-options-changed.js";import{slug as y}from"../../../../utils/slugger.js";import{withTimestamp as f}from"../../../utils/time/with-timestamp.js";import{ScorecardsConfigLocalRepository as p}from"./repositories/local/scorecards-config-local-repository.js";class o extends d{static#i;static#e;#t;constructor(t){if(!t)throw new Error("Database connection is required for ScorecardsConfigService");super(t),this.#t=new p(this.databaseClient)}static async getInstance(t){const i=m(o.#e,t);if(!o.#i||i){const n=await l.create("main-local",t);if(!n)throw new Error("Failed to create db connection for scorecards config service");o.#i=new o(n),o.#e=t}return o.#i}async syncConfig(t,i){const n=new Set;(!Array.isArray(t)||t.length===0)&&r.verbose("No scorecard configs to sync"),r.verbose(`Starting scorecard config sync for ${t.length} config(s)`);for(const s of t)try{const e=s.key;if(!/^[a-z0-9-]+$/i.test(e)){r.error(`Skipping invalid scorecard config item: key "${e}" does not match kebab-case format (letters, numbers, and dashes only)`,{scorecard:s});continue}n.add(e);const a=this.#s(s),c=await this.#t.findActiveConfigByKey(e);if(c){if(c.configHash===a){r.verbose(`Config "${e}" unchanged, skipping update`);continue}r.verbose(`Updating config "${e}"`),await this.#r(c.id,s,a)}else r.verbose(`Inserting new config "${e}"`),await this.#n(e,s,a);i&&await i(e)}catch(e){r.error("Error processing scorecard config item:",{error:e.message??e,scorecard:s})}await this.#o(n),r.verbose("Sync scorecard configuration: success")}#s(t){const i=JSON.stringify({entities:t.entities,levels:t.levels});return h(i)}async#n(t,i,n){await this.#t.insertConfig(f({id:`sc_${g()}`,key:t,slug:y(t),name:i.name,description:i.description??null,entitiesFilter:JSON.stringify(i.entities),levels:JSON.stringify(i.levels),configHash:n,archivedAt:null}))}async#r(t,i,n){const s=f({entitiesFilter:JSON.stringify(i.entities),levels:JSON.stringify(i.levels),configHash:n,archivedAt:null},{fields:["updatedAt"]});await this.#t.updateConfigById(t,s)}async#o(t){const i=await this.#t.findAllActiveConfigs(),n=new Date().toISOString();for(const s of i)if(!t.has(s.key)){r.verbose(`Archiving removed config "${s.key}"`);try{await this.#t.archiveConfigById(s.id,n)}catch(e){r.error(`Error archiving config item "${s.key}":`,e.message??e)}}}}export{o as ScorecardsConfigService};
@@ -1 +1 @@
1
- import{envConfig as c}from"../../../config/env-config.js";import{SCORECARDS_BASE_SLUG as i,SCORECARDS_TEMPLATE_ID as n}from"../../constants/plugins/scorecards.js";import{getTemplatePath as d}from"./utils/get-template-path.js";import{telemetryTraceStep as l}from"../../../cli/telemetry/helpers/trace-step.js";async function u(){return{id:"Scorecards",requiredEntitlements:["scorecards"],async processContent(e,r){await l("build.plugin.scorecards",async s=>{if(c.NEW_SCORECARDS_ENABLED!=="true")return;const t=(await r.getConfig()).scorecards;s?.setAttribute("config",JSON.stringify(t));const{logger:o}=r;o.info("Scorecards plugin started");const a=e.createTemplate(n,d("../template/index.js"));e.addRoute({duplicateInAllLocales:!0,slug:i,fsPath:"",templateId:a,excludeFromSidebar:!0,hasClientRoutes:!0,getNavText:()=>Promise.resolve("Scorecards"),getStaticData:async()=>({props:{scorecardsConfig:t}})}),o.info("Scorecards plugin finished")})}}}var C=u;export{C as default,u as scorecardsPlugin};
1
+ import{envConfig as c}from"../../config/env-config.js";import{SCORECARDS_BASE_SLUG as i,SCORECARDS_TEMPLATE_ID as n}from"../../constants/plugins/scorecards.js";import{getTemplatePath as d}from"./utils/get-template-path.js";import{telemetryTraceStep as l}from"../../../cli/telemetry/helpers/trace-step.js";async function u(){return{id:"Scorecards",requiredEntitlements:["scorecards"],async processContent(e,r){await l("build.plugin.scorecards",async s=>{if(c.NEW_SCORECARDS_ENABLED!=="true")return;const t=(await r.getConfig()).scorecards;s?.setAttribute("config",JSON.stringify(t));const{logger:o}=r;o.info("Scorecards plugin started");const a=e.createTemplate(n,d("../template/index.js"));e.addRoute({duplicateInAllLocales:!0,slug:i,fsPath:"",templateId:a,excludeFromSidebar:!0,hasClientRoutes:!0,getNavText:()=>Promise.resolve("Scorecards"),getStaticData:async()=>({props:{scorecardsConfig:t}})}),o.info("Scorecards plugin finished")})}}}var C=u;export{C as default,u as scorecardsPlugin};
@@ -1 +1 @@
1
- import{SCORECARDS_WORKER_KEY as f,scorecardsWorker as m}from"../../../workers/scorecards-worker-pool.js";import{logger as e}from"../../../tools/notifiers/logger.js";import{envConfig as u}from"../../../../config/env-config.js";const o=5;async function n(s){const{baseDbDir:c,scorecardsConfig:a,attempt:t}=s;try{const r=await m.exec(f,[{baseDbDir:c,scorecardsConfig:a,pollingIntervalMs:parseInt(u.SCORECARDS_POLLING_INTERVAL_MS||"3000",10)}]);if(r.success)return e.info(`${r.message}`),Promise.resolve();e.error(`Execute Scorecards Worker: failed (attempt ${t}/${o}): ${r.error}`)}catch(r){const i=r instanceof Error?r.message:String(r);e.error(`Execute Scorecards Worker: failed (attempt ${t}/${o}): ${i}`)}return t<o?(e.info(`Execute Scorecards Worker: retrying... (attempt ${t+1}/${o})`),n({baseDbDir:c,scorecardsConfig:a,attempt:t+1})):(e.error(`Execute Scorecards Worker: failed. Scorecards Worker could not be started after all ${o} attempts`),Promise.resolve())}async function p(s,c){return e.info("Start Scorecards Worker: executing..."),n({baseDbDir:s,scorecardsConfig:c,attempt:1})}export{p as runScorecardsWorker};
1
+ import{SCORECARDS_WORKER_KEY as f,scorecardsWorker as m}from"../../../workers/scorecards-worker-pool.js";import{logger as e}from"../../../tools/notifiers/logger.js";import{envConfig as u}from"../../../config/env-config.js";const o=5;async function n(s){const{baseDbDir:c,scorecardsConfig:a,attempt:t}=s;try{const r=await m.exec(f,[{baseDbDir:c,scorecardsConfig:a,pollingIntervalMs:parseInt(u.SCORECARDS_POLLING_INTERVAL_MS||"3000",10)}]);if(r.success)return e.info(`${r.message}`),Promise.resolve();e.error(`Execute Scorecards Worker: failed (attempt ${t}/${o}): ${r.error}`)}catch(r){const i=r instanceof Error?r.message:String(r);e.error(`Execute Scorecards Worker: failed (attempt ${t}/${o}): ${i}`)}return t<o?(e.info(`Execute Scorecards Worker: retrying... (attempt ${t+1}/${o})`),n({baseDbDir:c,scorecardsConfig:a,attempt:t+1})):(e.error(`Execute Scorecards Worker: failed. Scorecards Worker could not be started after all ${o} attempts`),Promise.resolve())}async function p(s,c){return e.info("Start Scorecards Worker: executing..."),n({baseDbDir:s,scorecardsConfig:c,attempt:1})}export{p as runScorecardsWorker};
@@ -0,0 +1,11 @@
1
+ import type { AfterRoutesCreatedActions, AfterRoutesCreatedLifecycleContext } from '../../../types';
2
+ /**
3
+ * Prepares chunked documents for semantic search, llms.txt, and Docs MCP.
4
+ * Chunking runs when any of these is enabled: AI search, llms.txt, or Docs MCP.
5
+ * embeddingsEnabled is true when AI search or Docs MCP is enabled (shared embedding index).
6
+ */
7
+ export declare function prepareSemanticDocuments(actions: AfterRoutesCreatedActions, context: AfterRoutesCreatedLifecycleContext, { embeddingsEnabled, llmstxtEnabled, }: {
8
+ embeddingsEnabled: boolean;
9
+ llmstxtEnabled: boolean;
10
+ }): Promise<void>;
11
+ //# sourceMappingURL=prepare-semantic-documents.d.ts.map
@@ -0,0 +1 @@
1
+ import L from"node:path";import{existsSync as $}from"node:fs";import{writeFile as x,access as N,rm as X,constants as b}from"fs/promises";import{REDOCLY_ROUTE_RBAC as _,REDOCLY_TEAMS_RBAC as R}from"@redocly/config";import j from"picomatch";import{DEFAULT_LOCALE_PLACEHOLDER as M}from"../../../../constants/common.js";import{AI_INDEX_EXPORT_FOLDER as k}from"../../../constants/plugins/search.js";import{LLMS_TXT_FILE_NAME as B}from"../../../constants/common.js";import{envConfig as w}from"../../../config/env-config.js";import{logger as a}from"../../../tools/notifiers/logger.js";import{shaHexShort as G}from"../../../utils/crypto/sha-hex-short.js";import{promiseMapLimit as C}from"../../../utils/async/promise-map-limit.js";import{validateLLMsTxtConfig as H,generateLLMsTxt as U,getLLMsTxtMdSlug as Y}from"../llmstxt/index.js";import{ensureDir as S}from"../../../utils/fs.js";import{isResourcePubliclyAccessible as J,extractTeamsFromScopeItems as K,getRbacTeamsListForResource as V}from"../../../utils/rbac.js";const P=20,A="llms.txt:";async function pt(t,i,{embeddingsEnabled:o,llmstxtEnabled:n}){const s=L.join(t.outdir,B);if(!n){try{await N(s,b.W_OK),await X(s)}catch{}if(!o)return}o&&a.info("Preparing semantic documents..."),n&&a.info(`${A} Generating llms.txt files...`);const T=a.startTiming(),c=a.startTiming(),f=t.getGlobalConfig("seo"),l=f?.llmstxt,d=L.resolve(t.outdir,k),u=t.getConfig(),F=u.rbac??{};let D=t.getAllRoutes();const y=u?.l10n?.defaultLocale||u?.i18n?.defaultLocale||M,E=(l?.excludeFiles||[]).map(e=>j(e)),h=[];if(w.isDevelopMode&&(D=D.slice(0,50)),await C(D,P,async e=>{if(e.excludeFromSearch)return;const O=await W(e,t);let g;try{g=await q(e,O,i,t)}catch(r){console.log(r),a.warn(`Error generating AI search documents for route ${e.slug}`)}if(g){if(n)for(const r of await g.getLLMsTxts()){if(E.some(m=>m(r.fsPath)))continue;const p=L.join(t.outdir,Y(r.slug));S(p),await x(p,r.content),r.includeInLLMsTxt&&J(e,u)&&h.push(r)}if(o&&w.isBuildMode){const r=await g.getSearchDocuments();if(!r.length)return;const p=z(e,F),m=e.versions?.find(({active:v})=>v),I=m&&{folder:m.folderId,label:m.label,default:m.default};await Q(r,e.fsPath,p,d,y,I)}}}),o&&a.infoTime(c,"Semantic search documents prepared"),h.length)try{H(l);const e=await U(h,l,{title:f?.title,description:f?.description},i);S(s),await x(s,e),a.infoTime(T,`${A} files generated`)}catch(e){a.error(`${A} Failed to generate llms.txt file. ${e.message}`)}}async function W(t,i){return t.getStaticData?t.getStaticData(t,{...i,contentDir:i.contentDir,parseMarkdoc:(o,n,s)=>i.parseMarkdoc(o,n,s)}):{}}async function q(t,i,o,n){if(t.getAiDocumentsStore)return t.getAiDocumentsStore(t,{...i,[R]:t[R],[_]:t[_]},o,n)}function z(t,i){const o=K(t?.[R]);return o?.length?o:V(t,i)}async function Q(t,i,o,n,s,T){await C(t,P,async c=>{const f=`${G(i+c.content)}.json`,l=S(L.join(n,f)),d=c.locale===M?s:c.locale;$(l)||await x(l,JSON.stringify({...c,rbacTeams:o||[],version:T,locale:d}),"utf-8")})}export{pt as prepareSemanticDocuments};
@@ -1 +1 @@
1
- import{REDOCLY_ROUTE_RBAC as R,REDOCLY_TEAMS_RBAC as D}from"@redocly/config";import{existsSync as y}from"fs";import{rm as O}from"node:fs/promises";import{DEFAULT_LOCALE_PLACEHOLDER as $}from"../../../../constants/common.js";import{SEARCH_DATA_EXPORT_FOLDER as S}from"../../../constants/plugins/search.js";import{envConfig as h}from"../../../../config/env-config.js";import{logger as c}from"../../../tools/notifiers/logger.js";import{extractTeamsFromScopeItems as P,getRbacTeamsListForResource as I}from"../../../utils/index.js";import{getSearchDocumentGroup as k}from"../utils.js";import{telemetry as B}from"../../../../cli/telemetry/index.js";import{telemetryTraceStep as v}from"../../../../cli/telemetry/helpers/trace-step.js";async function K(A,t,l){await v("build.plugin.search.prepare_search_documents",async()=>{c.info("Preparing search documents and create indexes..."),h.isBuildMode&&y(`${t.outdir}/${S}`)&&await O(`${t.outdir}/${S}`,{recursive:!0});const _=c.startTiming(),F=t.getConfig().rbac,C=[$,...A.localeFolders.map(a=>a.toLowerCase())];let f=1/0;h.isDevelopMode&&(f=50);let d=0;for(const a of C)await v("build.plugin.search.prepare_search_documents.locale",async s=>{const L=t.getAllRoutesForLocale(a);let T=0,w=0;for(const r of L){if(d>=f)break;if(d++,T++,r.excludeFromSearch)continue;const p=new Map,{product:n}=r,x=await r.getStaticData?.(r,{...t,contentDir:t.contentDir,parseMarkdoc:(e,i,u)=>t.parseMarkdoc(e,i,u)})||{},m=await r.getSearchDocuments?.(r,{...x,[D]:r[D],[R]:r[R]},t),o=r.versions?.find(e=>e.active),E=I(r,F??{});if(m){if(m&&m.length)for(let e of m){const i=P(e?.[D]),u=i?.length?i:E,M=e.tags||[];e={...e,...o&&{version:o.version,isDefaultVersion:o.default,versionFolderId:o.folderId},...n&&{product:n},rbacTeams:u,tags:[...M,...u,...o?o.default?["v:default"]:[`v:${o.folderId}:${o.version}`]:["v:default"],...n?[`p:${n.name}`]:[]],url:e.url&&(e.path&&e.path.length>1?e.url:e.url.split("#")[0])};const g=k(e.facets);if(g){const b=p.get(g)??[];b.push(e),p.set(g,b)}}if(d>=f)break;for(const[e,i]of p)await l.addDocuments(i,{locale:a,group:e,outDir:t.outdir})}}s?.setAttribute("locale",a),s?.setAttribute("totalDocuments",T),s?.setAttribute("totalSearchDocuments",w)});if(l.cleanupFacetValues(t),c.infoTime(_,"Search indexes created"),h.isBuildMode){c.info("Writing out search data...");const a=c.startTiming();await l.export(t.outdir);const s=c.infoTime(a,"Search data written");s&&B.sendTimingPerformedMessage(s)}})}export{K as prepareSearchDocuments};
1
+ import{REDOCLY_ROUTE_RBAC as R,REDOCLY_TEAMS_RBAC as D}from"@redocly/config";import{existsSync as y}from"fs";import{rm as O}from"node:fs/promises";import{DEFAULT_LOCALE_PLACEHOLDER as $}from"../../../../constants/common.js";import{SEARCH_DATA_EXPORT_FOLDER as S}from"../../../constants/plugins/search.js";import{envConfig as h}from"../../../config/env-config.js";import{logger as c}from"../../../tools/notifiers/logger.js";import{extractTeamsFromScopeItems as P,getRbacTeamsListForResource as I}from"../../../utils/index.js";import{getSearchDocumentGroup as k}from"../utils.js";import{telemetry as B}from"../../../../cli/telemetry/index.js";import{telemetryTraceStep as v}from"../../../../cli/telemetry/helpers/trace-step.js";async function K(A,t,l){await v("build.plugin.search.prepare_search_documents",async()=>{c.info("Preparing search documents and create indexes..."),h.isBuildMode&&y(`${t.outdir}/${S}`)&&await O(`${t.outdir}/${S}`,{recursive:!0});const _=c.startTiming(),F=t.getConfig().rbac,C=[$,...A.localeFolders.map(a=>a.toLowerCase())];let f=1/0;h.isDevelopMode&&(f=50);let d=0;for(const a of C)await v("build.plugin.search.prepare_search_documents.locale",async s=>{const L=t.getAllRoutesForLocale(a);let T=0,w=0;for(const r of L){if(d>=f)break;if(d++,T++,r.excludeFromSearch)continue;const p=new Map,{product:n}=r,x=await r.getStaticData?.(r,{...t,contentDir:t.contentDir,parseMarkdoc:(e,i,u)=>t.parseMarkdoc(e,i,u)})||{},m=await r.getSearchDocuments?.(r,{...x,[D]:r[D],[R]:r[R]},t),o=r.versions?.find(e=>e.active),E=I(r,F??{});if(m){if(m&&m.length)for(let e of m){const i=P(e?.[D]),u=i?.length?i:E,M=e.tags||[];e={...e,...o&&{version:o.version,isDefaultVersion:o.default,versionFolderId:o.folderId},...n&&{product:n},rbacTeams:u,tags:[...M,...u,...o?o.default?["v:default"]:[`v:${o.folderId}:${o.version}`]:["v:default"],...n?[`p:${n.name}`]:[]],url:e.url&&(e.path&&e.path.length>1?e.url:e.url.split("#")[0])};const g=k(e.facets);if(g){const b=p.get(g)??[];b.push(e),p.set(g,b)}}if(d>=f)break;for(const[e,i]of p)await l.addDocuments(i,{locale:a,group:e,outDir:t.outdir})}}s?.setAttribute("locale",a),s?.setAttribute("totalDocuments",T),s?.setAttribute("totalSearchDocuments",w)});if(l.cleanupFacetValues(t),c.infoTime(_,"Search indexes created"),h.isBuildMode){c.info("Writing out search data...");const a=c.startTiming();await l.export(t.outdir);const s=c.infoTime(a,"Search data written");s&&B.sendTimingPerformedMessage(s)}})}export{K as prepareSearchDocuments};
@@ -1 +1 @@
1
- import{readFile as R,readdir as y,appendFile as E}from"node:fs/promises";import m from"node:path";import{existsSync as w}from"node:fs";import{SEARCH_GROUP_FACET_FIELD as F,SEARCH_PRODUCT_FIELD as C,SEARCH_VERSION_FIELD as $}from"../../../../../constants/common.js";import{SEARCH_INDEX_FIELDS as A,SEARCH_DATA_EXPORT_FOLDER as _,SEARCH_MAX_INMEMORY_DOCUMENTS_COUNT as O}from"../../../../constants/plugins/search.js";import{telemetryTraceStep as v}from"../../../../telemetry/helpers/trace-step.js";import{envConfig as N}from"../../../../../config/env-config.js";import{ensureDir as h}from"../../../../utils/index.js";import{FlexSearchIndex as j}from"./search-index.js";class J{#e=new Map;#s;#t=0;async initIndexSchema(t){this.#s={document:{id:"id",tag:"tags",index:A},worker:!1,tokenize:"forward",context:{depth:2,resolution:9}}}#o(t,o){const e=this.#e.get(t);if(e)return e.find(n=>n.id===o)}#n(t,o){let e=this.#o(t,o);return e||(e=new j(o,this.#s),this.#e.set(t,[...this.#e.get(t)??[],e])),e}async addDocuments(t,o){if(t.length){const{group:e,locale:n,outDir:c}=o,i=this.#n(n,e);for(const a of t)i.add(a),N.isBuildMode&&(this.#t++,this.#t>=O&&await this.exportDocuments(c))}}getIndexesSize(){return this.#e.size}async search(t,o){return await v("search",async e=>{const{query:n,locale:c,filter:i,loadMore:a,auth:f}=t,l=this.#e.get(c)??[];let r=[],d="",x=["v:default"];if(e?.setAttribute("locale",c),i)for(const s of i)s.field===F?r=[...r,...s.values]:s.field===C?d=`p:${s.values[0]}`:s.field===$&&s.values.length&&s.values.length===2&&(x=[...x,`v:${s.values[0]}:${s.values[1]}`]);const g={auth:f,query:n,offset:0,SEARCH_GROUP_FACET_FIELD:F,product:d,versions:x},p=[];let u={facets:{},documents:{}};if(a){const s=this.#o(c,a.groupKey);s&&p.push(s.search({...g,offset:a.offset}))}else for(const s of l)r&&r.length?r.includes(s.id)&&p.push(s.search(g)):p.push(s.search(g));const I=await Promise.all(p);for(const s of I){u.documents={...u.documents,...s.documents};for(const[D,S]of Object.entries(s.facets))u.facets[D]?u.facets[D]=[...u.facets[D],...S]:u.facets[D]=S}return u})}async exportDocuments(t){const o='{"documents":[',e=h(m.join(t,_));for(const[n,c]of this.#e){const i=h(m.join(e,n));for(const a of c){const f=Array.from(a.documents);if(f.length===0)continue;const l=h(m.join(i,`${a.id}.json`)),r=!w(l),d=JSON.stringify(f).substring(1).slice(0,-1),x=r?o+d:","+d;await E(l,x,{encoding:"utf8"}),a.clearDocuments()}}this.#t=0}async exportIndexes(t){const o=h(m.join(t,_));for(const[e,n]of this.#e){const c=h(m.join(o,e));for(const i of n){const a=h(m.join(c,`${i.id}.json`)),f={};await i.export((r,d)=>{f[r]=d});const l=`],"index":${JSON.stringify(f)}}`;await E(a,l,{encoding:"utf8"})}}this.#e.clear()}async import(t){const o=`${t}/${_}`,e=await y(o);for(const n of e){const c=await y(`${o}/${n}`);for(const i of c){const a=`${o}/${n}/${i}`,f=JSON.parse(await R(a,"utf-8")),l=m.parse(i).name;await this.#n(n,l).import(f)}}}countFacets(t,o){const e={};for(const[n,c]of o)e[n]=c.values.map(i=>({value:i,count:0,isCounterVisible:!1}));return e}cleanupFacetValues(t){}}export{J as FlexSearch};
1
+ import{readFile as R,readdir as y,appendFile as E}from"node:fs/promises";import m from"node:path";import{existsSync as w}from"node:fs";import{SEARCH_GROUP_FACET_FIELD as F,SEARCH_PRODUCT_FIELD as C,SEARCH_VERSION_FIELD as $}from"../../../../../constants/common.js";import{SEARCH_INDEX_FIELDS as A,SEARCH_DATA_EXPORT_FOLDER as _,SEARCH_MAX_INMEMORY_DOCUMENTS_COUNT as O}from"../../../../constants/plugins/search.js";import{telemetryTraceStep as v}from"../../../../telemetry/helpers/trace-step.js";import{envConfig as N}from"../../../../config/env-config.js";import{ensureDir as h}from"../../../../utils/index.js";import{FlexSearchIndex as j}from"./search-index.js";class J{#e=new Map;#s;#t=0;async initIndexSchema(t){this.#s={document:{id:"id",tag:"tags",index:A},worker:!1,tokenize:"forward",context:{depth:2,resolution:9}}}#o(t,o){const e=this.#e.get(t);if(e)return e.find(n=>n.id===o)}#n(t,o){let e=this.#o(t,o);return e||(e=new j(o,this.#s),this.#e.set(t,[...this.#e.get(t)??[],e])),e}async addDocuments(t,o){if(t.length){const{group:e,locale:n,outDir:c}=o,i=this.#n(n,e);for(const a of t)i.add(a),N.isBuildMode&&(this.#t++,this.#t>=O&&await this.exportDocuments(c))}}getIndexesSize(){return this.#e.size}async search(t,o){return await v("search",async e=>{const{query:n,locale:c,filter:i,loadMore:a,auth:f}=t,l=this.#e.get(c)??[];let r=[],d="",x=["v:default"];if(e?.setAttribute("locale",c),i)for(const s of i)s.field===F?r=[...r,...s.values]:s.field===C?d=`p:${s.values[0]}`:s.field===$&&s.values.length&&s.values.length===2&&(x=[...x,`v:${s.values[0]}:${s.values[1]}`]);const g={auth:f,query:n,offset:0,SEARCH_GROUP_FACET_FIELD:F,product:d,versions:x},p=[];let u={facets:{},documents:{}};if(a){const s=this.#o(c,a.groupKey);s&&p.push(s.search({...g,offset:a.offset}))}else for(const s of l)r&&r.length?r.includes(s.id)&&p.push(s.search(g)):p.push(s.search(g));const I=await Promise.all(p);for(const s of I){u.documents={...u.documents,...s.documents};for(const[D,S]of Object.entries(s.facets))u.facets[D]?u.facets[D]=[...u.facets[D],...S]:u.facets[D]=S}return u})}async exportDocuments(t){const o='{"documents":[',e=h(m.join(t,_));for(const[n,c]of this.#e){const i=h(m.join(e,n));for(const a of c){const f=Array.from(a.documents);if(f.length===0)continue;const l=h(m.join(i,`${a.id}.json`)),r=!w(l),d=JSON.stringify(f).substring(1).slice(0,-1),x=r?o+d:","+d;await E(l,x,{encoding:"utf8"}),a.clearDocuments()}}this.#t=0}async exportIndexes(t){const o=h(m.join(t,_));for(const[e,n]of this.#e){const c=h(m.join(o,e));for(const i of n){const a=h(m.join(c,`${i.id}.json`)),f={};await i.export((r,d)=>{f[r]=d});const l=`],"index":${JSON.stringify(f)}}`;await E(a,l,{encoding:"utf8"})}}this.#e.clear()}async import(t){const o=`${t}/${_}`,e=await y(o);for(const n of e){const c=await y(`${o}/${n}`);for(const i of c){const a=`${o}/${n}/${i}`,f=JSON.parse(await R(a,"utf-8")),l=m.parse(i).name;await this.#n(n,l).import(f)}}}countFacets(t,o){const e={};for(const[n,c]of o)e[n]=c.values.map(i=>({value:i,count:0,isCounterVisible:!1}));return e}cleanupFacetValues(t){}}export{J as FlexSearch};
@@ -1 +1 @@
1
- import{appendFile as A}from"node:fs/promises";import{existsSync as v}from"node:fs";import m from"node:path";import{Client as R}from"typesense";import{SEARCH_GROUP_FACET_FIELD as D,SEARCH_PRODUCT_FIELD as b,SEARCH_RBAC_FIELD as g,SEARCH_VERSION_FIELD as h}from"../../../../../constants/common.js";import{BASE_SEARCH_DOCUMENT as $,DEFAULT_ORGANIZATION_ID as O,DEFAULT_PROJECT_ID as P,DEFAULT_TYPESENSE_API_KEY as N,DEFAULT_TYPESENSE_API_URL as L,DISABLE_DEEP_LINK_IF_FIELDS_EXIST as C,HIGHLIGHTED_TEXT_MAX_LENGTH as I,SEARCH_DATA_EXPORT_FOLDER as F,SEARCH_DOCUMENT_METADATA_KEY as M,SEARCH_GROUP_LIMIT as w,SEARCH_MAX_FACET_VALUES as S,SEARCH_MAX_INMEMORY_DOCUMENTS_COUNT as k}from"../../../../constants/plugins/search.js";import{telemetryTraceStep as T}from"../../../../telemetry/helpers/trace-step.js";import{envConfig as u}from"../../../../../config/env-config.js";import{logger as j}from"../../../../tools/notifiers/logger.js";import{ensureDir as d}from"../../../../utils/index.js";class Q{#e=null;#r="";#t=[{name:"title",type:"string",facet:!1,optional:!0},{name:"text",type:"string",facet:!1,optional:!0},{name:"path",type:"string[]",facet:!1,optional:!0},{name:"isAdditionalOperation",type:"bool",facet:!1,optional:!0},{name:"parameters",type:"object[]",facet:!1,optional:!0},{name:b,type:"string",facet:!0,optional:!0},{name:h,type:"object",facet:!0,optional:!0},{name:g,type:"string[]",facet:!0},{name:"metadata_curated",type:"auto",facet:!1,optional:!0},{name:"metadata_keywords_excludes",type:"auto",facet:!1,optional:!0},{name:"metadata_keywords_includes",type:"auto",facet:!1,optional:!0}];#s=new Map;#o={ORGANIZATION_ID:u.ORGANIZATION_ID||(u.isDevelopMode?O:""),PROJECT_ID:u.PROJECT_ID||(u.isDevelopMode?P:""),TYPESENSE_API_URL:u.TYPESENSE_API_URL||(u.isDevelopMode?L:""),TYPESENSE_API_KEY:u.TYPESENSE_API_KEY||(u.isDevelopMode?N:"")};constructor(){if(!u.isBuildMode){for(const[e,t]of Object.entries(this.#o))if(!t)throw new Error(`Cannot initialize search index. ${e} is not set`);this.#r=`${this.#o.ORGANIZATION_ID}_${this.#o.PROJECT_ID}_`,this.#e=new R({nodes:[{url:this.#o.TYPESENSE_API_URL}],apiKey:this.#o.TYPESENSE_API_KEY,connectionTimeoutSeconds:5})}}async initIndexSchema(e){this.#d(e),u.isDevelopMode&&await this.#m()}async addDocuments(e,t){e.push($);const{locale:i,outDir:r}=t,o=e.map(n=>{const s={...n},a=n[M];return a&&(a.curated&&(s.metadata_curated=a.curated),a.excludes&&(s.metadata_keywords_excludes=a.excludes),a.includes&&(s.metadata_keywords_includes=a.includes)),s});if(u.isDevelopMode){if(o.length){await this.#p(i);try{const n=o.map(s=>({url:s.url,title:s.title,text:s.text,path:s.path,httpMethod:s.httpMethod,isAdditionalOperation:s.isAdditionalOperation,httpPath:s.httpPath,parameters:Array.isArray(s.parameters)?s.parameters.map(a=>({...a,enum:void 0})):[],[b]:s.product?s.product.name:"",[g]:s.rbacTeams??[],[h]:s.version?{isDefault:s.isDefaultVersion,version:s.version,folderId:s.versionFolderId}:{isDefault:!0},...s.facets}));await this.#e?.collections(i).documents().import(n)}catch(n){if(n.importResults)for(const s of n.importResults)s.success===!1&&j.error(`Error adding document to collection: ${i}: ${s.error}`)}}}else{const n=this.#s.get(i)??[];this.#s.set(i,n.concat(o)),n.length+e.length>=k&&await this.exportDocuments(r)}}async search(e){return await T("search",async t=>{const{query:i,locale:r,filter:o,loadMore:n,auth:s}=e,a=u.isDevelopMode?r:this.#c(r),l={collection:a,q:i||"*",query_by:this.#l(),max_facet_values:S};if(t?.setAttribute("collectionName",a),t?.setAttribute("locale",r),this.#e)if(n){const{groupKey:c,offset:f}=n,p={offset:f,filter_by:this.#i(s,o),facet_by:"*"};return t?.setAttribute("isLoadMore",!0),t?.setAttribute("filter",p.filter_by),this.#u(await this.#e.collections(a).documents().search({...l,...p}),c)}else{const c={group_by:this.#_(),group_limit:w,filter_by:this.#i(s,o)};t?.setAttribute("groups",c.group_by),t?.setAttribute("filter",c.filter_by);const f=[c,...this.#E(s,o)];return this.#f(await this.#e?.multiSearch.perform({searches:f},l),o)}else return{facets:{},documents:{}}})}#u(e,t){const i={facets:{},documents:{[t]:[]}};if(e.hits&&e.hits.length)for(const r of e.hits)i.documents[t].push({document:this.#a(r),highlight:this.#n(r)});return i}#f(e,t){const i={facets:{},documents:{}};for(const r of this.#y(t))i.documents[r]=[];if("results"in e)for(const r of e.results){if(r.facet_counts&&r.facet_counts.length)for(const o of r.facet_counts)i.facets[o.field_name]=o.counts.map(n=>({value:n.value,count:n.count}));if(r.grouped_hits&&r.grouped_hits.length)for(const o of r.grouped_hits){const n=o.group_key[0],s=[];for(const a of o.hits)s.push({document:this.#a(a),highlight:this.#n(a)});i.documents[n]=s}}return i}#a(e){return this.#h(e)}#n(e){const t={},i=[];for(const[r,o]of Object.entries(e.highlight??{}))if(Array.isArray(o)){if(r==="path"){const n=o,s=[];for(const a of n)s.push(a.snippet);t.path=s}else if(r==="parameters"){const n=o;for(const s of n){let a=!1;for(const[l,c]of Object.entries(s))if(l!=="deepLink")if(Array.isArray(c))for(const f of c)f.matched_tokens?.length&&(a=!0);else c.matched_tokens?.length&&(a=!0);if(a){const l={name:s.name?.snippet||"",description:s.description?.snippet||"",place:s.place?.snippet||"",path:s.path?.map(c=>c?.snippet)||[]};t.parameters=[l];break}}}}else t[r]=o.snippet,i.push(r);for(const[r,o]of Object.entries(e.document))!i.includes(r)&&typeof o=="string"&&(t[r]=o.length>I?`${o.substring(0,I)}...`:o);return t.parameters||(t.parameters=[]),t}#h(e){let t;const i=Object.keys(e.highlight);for(const o of C)if(i.some(n=>n===o))return e.document;const r=e.highlight.parameters;if(r){for(const o of r)for(const[n,s]of Object.entries(o))if(n!=="deepLink"){if(Array.isArray(s)){for(const a of s)if(a.matched_tokens?.length){t=o.deepLink.snippet;break}}else if(s.matched_tokens?.length){t=o.deepLink.snippet;break}}}if(t){const o=t.split("#")[1];return{...e.document,url:`${e.document.url}#${o}`}}return e.document}async exportDocuments(e){const t='{"documents":[',i=d(m.join(e,F));for(const[r,o]of this.#s){if(o.length===0)continue;const n=d(m.join(i,`${r}.json`)),s=!v(n),a=JSON.stringify(o).substring(1).slice(0,-1),l=s?t+a:","+a;await A(n,l,{encoding:"utf8"}),this.#s.set(r,[])}}async exportIndexes(e){const t=d(m.join(e,F));for(const i of this.#s.keys()){const r=d(m.join(t,`${i}.json`)),o=`],"schemaFields":${JSON.stringify(this.#t)}}`;await A(r,o,{encoding:"utf8"})}}async import(e){}async countFacets(e,t){return await T("search.facets",async i=>{const{locale:r,query:o,facetQuery:n,filter:s,field:a,auth:l}=e,c=u.isDevelopMode?r:this.#c(r),f={q:o||"*",query_by:this.#l(),facet_by:"*",facet_query:this.#g(n,a),filter_by:this.#i(l,s,a),max_facet_values:S};if(i?.setAttribute("collectionName",c),i?.setAttribute("query",f.q),i?.setAttribute("facetQuery",f.facet_query),i?.setAttribute("filter",f.filter_by),this.#e){const p={},_=await this.#e.collections(c).documents().search(f);if(_.facet_counts&&_.facet_counts.length)for(const y of _.facet_counts)p[y.field_name]=y.counts.map(E=>({value:E.value,count:E.count,isCounterVisible:!!o||(s?.length||0)>0}));return p}else return{}})}#c(e){return`${this.#r}${e}`}async#p(e){const t=await this.#e?.collections().retrieve();t&&t.length&&t.find(i=>i.name===e)||await this.#e?.collections().create({name:e,fields:this.#t,enable_nested_fields:!0})}async#m(){const e=await this.#e?.collections().retrieve();for(const t of e??[])await this.#e?.collections(t.name).delete()}#d(e){for(const[t]of e)this.#t.find(i=>i.name===t)||this.#t.push({name:t,type:"string",facet:!0,optional:!0})}#l(){return this.#t.filter(e=>!e.facet&&!e.name.startsWith("metadata_")&&e.name!=="isAdditionalOperation").map(e=>e.name).join(",")}#_(){return this.#t.filter(e=>e.facet&&e.name===D).map(e=>e.name).join(",")}#i(e,t,i){const r=`${g}:[${e.teams.map(n=>`'${n}'`).join(", ")}]`;let o=`${h}.isDefault:true`;if(t&&t.length){const n=t.filter(a=>a.field!==i&&a.field!==h).map(a=>{const l=a.values.map(c=>`'${c}'`);return l.length?`${a.field}:[${l.join(", ")}]`:""}).join(" && "),s=t.find(a=>a.field===h);if(s&&s.values.length&&s.values.length===2){const a=s.values[0],l=s.values[1],c=`(${h}.folderId:! ${a} && ${h}.isDefault:true)`,f=`(${h}.folderId:${a} && ${h}.version:${l})`;o=`(${c} || ${f})`}return n?`${r} && ${n} && ${o}`:`${r} && ${o}`}else return`${r} && ${o}`}#g(e,t){return e&&t?`${t}:${e}`:""}#y(e){const t=[];if(e&&e.length)for(const i of e)i.field===D&&t.push(...i.values);return t}#E(e,t){const i=[],r=this.#t.filter(o=>o.facet);for(const o of r){const n={facet_by:o.name,filter_by:this.#i(e,t,o.name)};i.push(n)}return i}cleanupFacetValues(e){const t=e.getSearchFacets();t.forEach(i=>{i.values=[]}),e.setSearchFacets(t)}}export{Q as Typesense};
1
+ import{appendFile as A}from"node:fs/promises";import{existsSync as v}from"node:fs";import m from"node:path";import{Client as R}from"typesense";import{SEARCH_GROUP_FACET_FIELD as D,SEARCH_PRODUCT_FIELD as b,SEARCH_RBAC_FIELD as g,SEARCH_VERSION_FIELD as h}from"../../../../../constants/common.js";import{BASE_SEARCH_DOCUMENT as $,DEFAULT_ORGANIZATION_ID as O,DEFAULT_PROJECT_ID as P,DEFAULT_TYPESENSE_API_KEY as N,DEFAULT_TYPESENSE_API_URL as L,DISABLE_DEEP_LINK_IF_FIELDS_EXIST as C,HIGHLIGHTED_TEXT_MAX_LENGTH as I,SEARCH_DATA_EXPORT_FOLDER as F,SEARCH_DOCUMENT_METADATA_KEY as M,SEARCH_GROUP_LIMIT as w,SEARCH_MAX_FACET_VALUES as S,SEARCH_MAX_INMEMORY_DOCUMENTS_COUNT as k}from"../../../../constants/plugins/search.js";import{telemetryTraceStep as T}from"../../../../telemetry/helpers/trace-step.js";import{envConfig as u}from"../../../../config/env-config.js";import{logger as j}from"../../../../tools/notifiers/logger.js";import{ensureDir as d}from"../../../../utils/index.js";class Q{#e=null;#r="";#t=[{name:"title",type:"string",facet:!1,optional:!0},{name:"text",type:"string",facet:!1,optional:!0},{name:"path",type:"string[]",facet:!1,optional:!0},{name:"isAdditionalOperation",type:"bool",facet:!1,optional:!0},{name:"parameters",type:"object[]",facet:!1,optional:!0},{name:b,type:"string",facet:!0,optional:!0},{name:h,type:"object",facet:!0,optional:!0},{name:g,type:"string[]",facet:!0},{name:"metadata_curated",type:"auto",facet:!1,optional:!0},{name:"metadata_keywords_excludes",type:"auto",facet:!1,optional:!0},{name:"metadata_keywords_includes",type:"auto",facet:!1,optional:!0}];#s=new Map;#o={ORGANIZATION_ID:u.ORGANIZATION_ID||(u.isDevelopMode?O:""),PROJECT_ID:u.PROJECT_ID||(u.isDevelopMode?P:""),TYPESENSE_API_URL:u.TYPESENSE_API_URL||(u.isDevelopMode?L:""),TYPESENSE_API_KEY:u.TYPESENSE_API_KEY||(u.isDevelopMode?N:"")};constructor(){if(!u.isBuildMode){for(const[e,t]of Object.entries(this.#o))if(!t)throw new Error(`Cannot initialize search index. ${e} is not set`);this.#r=`${this.#o.ORGANIZATION_ID}_${this.#o.PROJECT_ID}_`,this.#e=new R({nodes:[{url:this.#o.TYPESENSE_API_URL}],apiKey:this.#o.TYPESENSE_API_KEY,connectionTimeoutSeconds:5})}}async initIndexSchema(e){this.#d(e),u.isDevelopMode&&await this.#m()}async addDocuments(e,t){e.push($);const{locale:i,outDir:r}=t,o=e.map(n=>{const s={...n},a=n[M];return a&&(a.curated&&(s.metadata_curated=a.curated),a.excludes&&(s.metadata_keywords_excludes=a.excludes),a.includes&&(s.metadata_keywords_includes=a.includes)),s});if(u.isDevelopMode){if(o.length){await this.#p(i);try{const n=o.map(s=>({url:s.url,title:s.title,text:s.text,path:s.path,httpMethod:s.httpMethod,isAdditionalOperation:s.isAdditionalOperation,httpPath:s.httpPath,parameters:Array.isArray(s.parameters)?s.parameters.map(a=>({...a,enum:void 0})):[],[b]:s.product?s.product.name:"",[g]:s.rbacTeams??[],[h]:s.version?{isDefault:s.isDefaultVersion,version:s.version,folderId:s.versionFolderId}:{isDefault:!0},...s.facets}));await this.#e?.collections(i).documents().import(n)}catch(n){if(n.importResults)for(const s of n.importResults)s.success===!1&&j.error(`Error adding document to collection: ${i}: ${s.error}`)}}}else{const n=this.#s.get(i)??[];this.#s.set(i,n.concat(o)),n.length+e.length>=k&&await this.exportDocuments(r)}}async search(e){return await T("search",async t=>{const{query:i,locale:r,filter:o,loadMore:n,auth:s}=e,a=u.isDevelopMode?r:this.#c(r),l={collection:a,q:i||"*",query_by:this.#l(),max_facet_values:S};if(t?.setAttribute("collectionName",a),t?.setAttribute("locale",r),this.#e)if(n){const{groupKey:c,offset:f}=n,p={offset:f,filter_by:this.#i(s,o),facet_by:"*"};return t?.setAttribute("isLoadMore",!0),t?.setAttribute("filter",p.filter_by),this.#u(await this.#e.collections(a).documents().search({...l,...p}),c)}else{const c={group_by:this.#_(),group_limit:w,filter_by:this.#i(s,o)};t?.setAttribute("groups",c.group_by),t?.setAttribute("filter",c.filter_by);const f=[c,...this.#E(s,o)];return this.#f(await this.#e?.multiSearch.perform({searches:f},l),o)}else return{facets:{},documents:{}}})}#u(e,t){const i={facets:{},documents:{[t]:[]}};if(e.hits&&e.hits.length)for(const r of e.hits)i.documents[t].push({document:this.#a(r),highlight:this.#n(r)});return i}#f(e,t){const i={facets:{},documents:{}};for(const r of this.#y(t))i.documents[r]=[];if("results"in e)for(const r of e.results){if(r.facet_counts&&r.facet_counts.length)for(const o of r.facet_counts)i.facets[o.field_name]=o.counts.map(n=>({value:n.value,count:n.count}));if(r.grouped_hits&&r.grouped_hits.length)for(const o of r.grouped_hits){const n=o.group_key[0],s=[];for(const a of o.hits)s.push({document:this.#a(a),highlight:this.#n(a)});i.documents[n]=s}}return i}#a(e){return this.#h(e)}#n(e){const t={},i=[];for(const[r,o]of Object.entries(e.highlight??{}))if(Array.isArray(o)){if(r==="path"){const n=o,s=[];for(const a of n)s.push(a.snippet);t.path=s}else if(r==="parameters"){const n=o;for(const s of n){let a=!1;for(const[l,c]of Object.entries(s))if(l!=="deepLink")if(Array.isArray(c))for(const f of c)f.matched_tokens?.length&&(a=!0);else c.matched_tokens?.length&&(a=!0);if(a){const l={name:s.name?.snippet||"",description:s.description?.snippet||"",place:s.place?.snippet||"",path:s.path?.map(c=>c?.snippet)||[]};t.parameters=[l];break}}}}else t[r]=o.snippet,i.push(r);for(const[r,o]of Object.entries(e.document))!i.includes(r)&&typeof o=="string"&&(t[r]=o.length>I?`${o.substring(0,I)}...`:o);return t.parameters||(t.parameters=[]),t}#h(e){let t;const i=Object.keys(e.highlight);for(const o of C)if(i.some(n=>n===o))return e.document;const r=e.highlight.parameters;if(r){for(const o of r)for(const[n,s]of Object.entries(o))if(n!=="deepLink"){if(Array.isArray(s)){for(const a of s)if(a.matched_tokens?.length){t=o.deepLink.snippet;break}}else if(s.matched_tokens?.length){t=o.deepLink.snippet;break}}}if(t){const o=t.split("#")[1];return{...e.document,url:`${e.document.url}#${o}`}}return e.document}async exportDocuments(e){const t='{"documents":[',i=d(m.join(e,F));for(const[r,o]of this.#s){if(o.length===0)continue;const n=d(m.join(i,`${r}.json`)),s=!v(n),a=JSON.stringify(o).substring(1).slice(0,-1),l=s?t+a:","+a;await A(n,l,{encoding:"utf8"}),this.#s.set(r,[])}}async exportIndexes(e){const t=d(m.join(e,F));for(const i of this.#s.keys()){const r=d(m.join(t,`${i}.json`)),o=`],"schemaFields":${JSON.stringify(this.#t)}}`;await A(r,o,{encoding:"utf8"})}}async import(e){}async countFacets(e,t){return await T("search.facets",async i=>{const{locale:r,query:o,facetQuery:n,filter:s,field:a,auth:l}=e,c=u.isDevelopMode?r:this.#c(r),f={q:o||"*",query_by:this.#l(),facet_by:"*",facet_query:this.#g(n,a),filter_by:this.#i(l,s,a),max_facet_values:S};if(i?.setAttribute("collectionName",c),i?.setAttribute("query",f.q),i?.setAttribute("facetQuery",f.facet_query),i?.setAttribute("filter",f.filter_by),this.#e){const p={},_=await this.#e.collections(c).documents().search(f);if(_.facet_counts&&_.facet_counts.length)for(const y of _.facet_counts)p[y.field_name]=y.counts.map(E=>({value:E.value,count:E.count,isCounterVisible:!!o||(s?.length||0)>0}));return p}else return{}})}#c(e){return`${this.#r}${e}`}async#p(e){const t=await this.#e?.collections().retrieve();t&&t.length&&t.find(i=>i.name===e)||await this.#e?.collections().create({name:e,fields:this.#t,enable_nested_fields:!0})}async#m(){const e=await this.#e?.collections().retrieve();for(const t of e??[])await this.#e?.collections(t.name).delete()}#d(e){for(const[t]of e)this.#t.find(i=>i.name===t)||this.#t.push({name:t,type:"string",facet:!0,optional:!0})}#l(){return this.#t.filter(e=>!e.facet&&!e.name.startsWith("metadata_")&&e.name!=="isAdditionalOperation").map(e=>e.name).join(",")}#_(){return this.#t.filter(e=>e.facet&&e.name===D).map(e=>e.name).join(",")}#i(e,t,i){const r=`${g}:[${e.teams.map(n=>`'${n}'`).join(", ")}]`;let o=`${h}.isDefault:true`;if(t&&t.length){const n=t.filter(a=>a.field!==i&&a.field!==h).map(a=>{const l=a.values.map(c=>`'${c}'`);return l.length?`${a.field}:[${l.join(", ")}]`:""}).join(" && "),s=t.find(a=>a.field===h);if(s&&s.values.length&&s.values.length===2){const a=s.values[0],l=s.values[1],c=`(${h}.folderId:! ${a} && ${h}.isDefault:true)`,f=`(${h}.folderId:${a} && ${h}.version:${l})`;o=`(${c} || ${f})`}return n?`${r} && ${n} && ${o}`:`${r} && ${o}`}else return`${r} && ${o}`}#g(e,t){return e&&t?`${t}:${e}`:""}#y(e){const t=[];if(e&&e.length)for(const i of e)i.field===D&&t.push(...i.values);return t}#E(e,t){const i=[],r=this.#t.filter(o=>o.facet);for(const o of r){const n={facet_by:o.name,filter_by:this.#i(e,t,o.name)};i.push(n)}return i}cleanupFacetValues(e){const t=e.getSearchFacets();t.forEach(i=>{i.values=[]}),e.setSearchFacets(t)}}export{Q as Typesense};
@@ -1 +1 @@
1
- import{REDOCLY_TEAMS_RBAC as d}from"@redocly/config";import{DEFAULT_SEARCH_ENGINE as s}from"../../constants/plugins/search.js";import{envConfig as t}from"../../../config/env-config.js";import{logger as m}from"../../tools/notifiers/logger.js";import{reporter as g}from"../../tools/notifiers/reporter.js";import{prepareSearchDocuments as E}from"./documents/search-documents.js";import{SearchEngine as u}from"./engines/search-engine.js";import{prepareAiSearchDocuments as S}from"./ai-indexer/prepare-ai-search-documents.js";import{isAiSearchEnabled as b}from"./utils.js";import{telemetryTraceStep as y}from"../../../cli/telemetry/helpers/trace-step.js";async function I(){let e=!0;return{async afterRoutesCreated(i,n){(t.SEARCH_DEV_REINIT||e)&&await D(i,n),e=!1},id:"search"}}async function D(e,i){await y("build.plugin.search",async n=>{const r=e.getConfig();if(n?.setAttribute("config",JSON.stringify(r.search||{})),r.search?.hide){m.info("Search is disabled in the config, skipping");return}const f=r.search?.engine||s,o=t.isDevelopMode?t.SEARCH_DEV_DEBUG?f:s:f,{l10n:l}=e.getGlobalData();if(o==="typesense"&&!t.isProductionEnv){m.info("Skip search indexer in preview mode");return}const h=b(r),c=r.rbac?.features?.aiSearch;let a;try{a=new u(o,l)}catch(p){await g.panic(p);return}await a.initIndexSchema(e.getSearchFacets()),e.setSearchEngine(a),e.setGlobalData({searchFeatures:{advanced:{enabled:o!==s&&!r.search?.filters?.hide},ai:{enabled:h,[d]:c&&Object.keys(c).length?c:void 0}}}),await E(i.fs,e,a),await S(e,i,{aiSearchEnabled:h,llmstxtEnabled:r.seo?.llmstxt?.hide!==!0})})}export{I as searchPlugin};
1
+ import{REDOCLY_TEAMS_RBAC as p}from"@redocly/config";import{DEFAULT_SEARCH_ENGINE as c}from"../../constants/plugins/search.js";import{envConfig as t}from"../../config/env-config.js";import{logger as f}from"../../tools/notifiers/logger.js";import{reporter as E}from"../../tools/notifiers/reporter.js";import{prepareSearchDocuments as u}from"./documents/search-documents.js";import{SearchEngine as S}from"./engines/search-engine.js";import{prepareSemanticDocuments as b}from"./ai-indexer/prepare-semantic-documents.js";import{isAiSearchEnabled as y,shouldGenerateEmbeddings as D}from"./utils.js";import{telemetryTraceStep as C}from"../../../cli/telemetry/helpers/trace-step.js";async function k(){let e=!0;return{async afterRoutesCreated(i,n){(t.SEARCH_DEV_REINIT||e)&&await w(i,n),e=!1},id:"search"}}async function w(e,i){await C("build.plugin.search",async n=>{const r=e.getConfig();if(n?.setAttribute("config",JSON.stringify(r.search||{})),r.search?.hide){f.info("Search is disabled in the config, skipping");return}const m=r.search?.engine||c,o=t.isDevelopMode?t.SEARCH_DEV_DEBUG?m:c:m,{l10n:d}=e.getGlobalData();if(o==="typesense"&&!t.isProductionEnv){f.info("Skip search indexer in preview mode");return}const h=y(r),s=r.rbac?.features?.aiSearch,l=D(r);let a;try{a=new S(o,d)}catch(g){await E.panic(g);return}await a.initIndexSchema(e.getSearchFacets()),e.setSearchEngine(a),e.setGlobalData({searchFeatures:{advanced:{enabled:o!==c&&!r.search?.filters?.hide},ai:{enabled:h,[p]:s&&Object.keys(s).length?s:void 0}}}),await u(i.fs,e,a),await b(e,i,{embeddingsEnabled:l,llmstxtEnabled:r.seo?.llmstxt?.hide!==!0})})}export{k as searchPlugin};
@@ -1,4 +1,4 @@
1
- import a from"picomatch";import{dirname as $,resolve as x}from"node:path";import{access as P,readFile as E,constants as F}from"fs/promises";import{removeTrailingSlash as w}from"../../../../utils/url/remove-trailing-slash.js";import{logger as g}from"../../../tools/notifiers/logger.js";import{withPathPrefix as I}from"@redocly/theme/core/utils";import{envConfig as y}from"../../../../config/env-config.js";const l="llms.txt",u="Table of contents";async function M(t,e,n={title:l,description:void 0},o){if(!e)return{title:n.title||l,description:n.description,details:void 0,sections:[{title:u,description:void 0,llmstxts:t}]};const s=e.title||n.title||l,r=e.description||n.description,i=await v(e,o),c=e.sections?.map(d=>{const{title:f,description:h,excludeFiles:m,includeFiles:L}=d,T=p(t,{excludeFiles:m,includeFiles:L});return{title:f,description:h,llmstxts:T}});return{title:s,description:r,details:i,sections:c||[{title:u,description:void 0,llmstxts:p(t,{includeFiles:["**/*"],excludeFiles:[]})}]}}async function v(t,e){const n=await e.getConfig();if(t?.details?.path&&n.configPath)try{const o=e.fs.getFileInfo(n.configPath);if(!o)throw new Error(`Config file ${n.configPath} not found`);const s=x(e.fs.cwd,$(o.relativePath),t.details.path);return await P(s,F.R_OK),E(s,"utf-8")}catch{throw new Error(`${t.details.path} is not accessible`)}if(t?.details?.content)return t.details.content}function p(t,e){const{excludeFiles:n,includeFiles:o}=e,s=n?.map(i=>a(i)),r=o?.map(i=>a(i));return t.filter(i=>s?.some(d=>d(i.fsPath))?!1:r?.some(d=>d(i.fsPath)))}async function j(t,e,n={title:l,description:void 0},o){const s=await M(t,e,n,o),r=[`# ${s.title}
1
+ import a from"picomatch";import{dirname as $,resolve as x}from"node:path";import{access as P,readFile as E,constants as F}from"fs/promises";import{removeTrailingSlash as w}from"../../../../utils/url/remove-trailing-slash.js";import{logger as g}from"../../../tools/notifiers/logger.js";import{withPathPrefix as I}from"@redocly/theme/core/utils";import{envConfig as y}from"../../../config/env-config.js";const l="llms.txt",u="Table of contents";async function M(t,e,n={title:l,description:void 0},o){if(!e)return{title:n.title||l,description:n.description,details:void 0,sections:[{title:u,description:void 0,llmstxts:t}]};const s=e.title||n.title||l,r=e.description||n.description,i=await v(e,o),c=e.sections?.map(d=>{const{title:f,description:h,excludeFiles:m,includeFiles:L}=d,T=p(t,{excludeFiles:m,includeFiles:L});return{title:f,description:h,llmstxts:T}});return{title:s,description:r,details:i,sections:c||[{title:u,description:void 0,llmstxts:p(t,{includeFiles:["**/*"],excludeFiles:[]})}]}}async function v(t,e){const n=await e.getConfig();if(t?.details?.path&&n.configPath)try{const o=e.fs.getFileInfo(n.configPath);if(!o)throw new Error(`Config file ${n.configPath} not found`);const s=x(e.fs.cwd,$(o.relativePath),t.details.path);return await P(s,F.R_OK),E(s,"utf-8")}catch{throw new Error(`${t.details.path} is not accessible`)}if(t?.details?.content)return t.details.content}function p(t,e){const{excludeFiles:n,includeFiles:o}=e,s=n?.map(i=>a(i)),r=o?.map(i=>a(i));return t.filter(i=>s?.some(d=>d(i.fsPath))?!1:r?.some(d=>d(i.fsPath)))}async function j(t,e,n={title:l,description:void 0},o){const s=await M(t,e,n,o),r=[`# ${s.title}
2
2
 
3
3
  `];return s.description&&r.push(`> ${s.description}
4
4
 
@@ -1,5 +1,7 @@
1
1
  import type { RedoclyConfig } from '@redocly/config';
2
2
  export declare function isAiSearchEnabled(config: RedoclyConfig): boolean;
3
+ export declare function isDocsMcpEnabled(config: RedoclyConfig): boolean;
4
+ export declare function shouldGenerateEmbeddings(config: RedoclyConfig): boolean;
3
5
  export declare function getSearchDocumentGroup(documentFacets?: Record<string, string>): string | undefined;
4
6
  export declare function formatDocumentMetadata(metadata?: Record<string, unknown>): string;
5
7
  //# sourceMappingURL=utils.d.ts.map
@@ -1,2 +1,2 @@
1
- import{SEARCH_GROUP_FACET_FIELD as n}from"../../../constants/common.js";import{DEFAULT_AI_SEARCH_ENABLED as o}from"../../constants/plugins/search.js";import{isPrimitive as s}from"../../../utils/guards/is-primitive.js";import{envConfig as r}from"../../../config/env-config.js";import{EntitlementsProvider as m}from"../../entitlements/entitlements-provider.js";function E(t){if(r.isDevelopMode)return r.SEARCH_DEV_DEBUG==="true";if(!m.instance().canAccessFeature("aiSearchLimit"))return!1;const e=t.aiAssistant;return typeof e?.hide=="boolean"?!e?.hide:o}function d(t){return t?.[n]}function S(t){return Object.entries(t||{}).map(([i,e])=>` - ${i}: ${s(e)?e:JSON.stringify(e)}`).join(`
2
- `)}export{S as formatDocumentMetadata,d as getSearchDocumentGroup,E as isAiSearchEnabled};
1
+ import{SEARCH_GROUP_FACET_FIELD as o}from"../../../constants/common.js";import{DEFAULT_AI_SEARCH_ENABLED as s}from"../../constants/plugins/search.js";import{isPrimitive as c}from"../../../utils/guards/is-primitive.js";import{envConfig as n}from"../../config/env-config.js";import{EntitlementsProvider as i}from"../../entitlements/entitlements-provider.js";function a(e){if(n.isDevelopMode)return n.SEARCH_DEV_DEBUG==="true";if(!i.instance().canAccessFeature("aiSearchLimit"))return!1;const t=e.aiAssistant;return typeof t?.hide=="boolean"?!t?.hide:s}function m(e){return i.instance().canAccessFeature("mcp")?!e.mcp?.hide&&!e.mcp?.docs?.hide:!1}function l(e){const r=a(e),t=m(e);return r||t}function h(e){return e?.[o]}function S(e){return Object.entries(e||{}).map(([r,t])=>` - ${r}: ${c(t)?t:JSON.stringify(t)}`).join(`
2
+ `)}export{S as formatDocumentMetadata,h as getSearchDocumentGroup,a as isAiSearchEnabled,m as isDocsMcpEnabled,l as shouldGenerateEmbeddings};
@@ -1,3 +1,3 @@
1
- import{writeFileSync as tt}from"node:fs";import*as u from"path";import{withoutHash as et}from"@redocly/theme/core/utils";import{DEFAULT_LOCALE_PLACEHOLDER as E,SIDEBAR_PREFIX as ot,CONFIG_FILE_NAME as V}from"../../../constants/common.js";import{CATALOG_OUTPUT_FILE_NAME as at}from"../../constants/common.js";import{findDeepFirst as x}from"../../../utils/tree/find-deep-first.js";import{isDefined as X}from"../../../utils/guards/is-defined.js";import{partition as rt}from"../../../utils/array/partition.js";import{collectPropValueDeep as B}from"../../../utils/tree/collect-prop-value-deep.js";import{envConfig as it}from"../../../config/env-config.js";import{isLocalLink as nt}from"../../../utils/path/is-local-link.js";import{normalizeRouteSlug as Y}from"../../../utils/path/normalize-route-slug.js";import{slash as st}from"../../../utils/path/slash.js";import{parsePathVersions as lt}from"../../../utils/path/parse-path-versions.js";import{reporter as R}from"../../tools/notifiers/reporter.js";import{logger as v}from"../../tools/notifiers/logger.js";import{sha1 as ct}from"../../utils/crypto/sha1.js";import{collectItemsLinkedToSidebars as ft,resolveItems as Z}from"../nav-utils.js";import{getExcludedFromLinkCheckerPatterns as dt,getSidebarReferences as ut,hasCircularDependency as gt}from"./utils.js";import{getLocaleFromRelativePath as mt}from"../../fs/utils/get-locale-from-relative-path.js";import{isSystemRouteSlug as pt}from"../../utils/system-routes.js";import{ENTITIES_MAP_GLOBAL_DATA_KEY as ht}from"../../constants/plugins/catalog-entities.js";import{telemetryTraceStep as St}from"../../../cli/telemetry/helpers/trace-step.js";const yt=180,bt=170,Ft=10;async function Kt({contentDir:c}){return{id:"sidebars",async afterRoutesCreated(e,f){v.info("Calculating sidebars..."),await St("build.plugin.sidebars",async()=>{const{cache:S,fs:n}=f,C=e.getConfig(),I=new Map,D=new Set,M=[E,...n.localeFolders],G=e.getGlobalData()[ht]||{},$={};let k=n.scan(/sidebars.yaml$/).map(({relativePath:t})=>t).filter(t=>!It(C.ignore??[],t)&&t);const j=await ut(f,c,k),q=rt(k.filter(t=>!j.has(t)),t=>lt(t)?.versionFolderPath||t),T=dt(C),Q=await ft(C?.navbar,e,f,{navFile:V,excludedFromLinkCheckerPatterns:T});let P;const O=gt(j);O&&Array.isArray(O)&&await R.panicOnBuildContentError(`Sidebar references have circular dependency. Please check your sidebar files.
1
+ import{writeFileSync as tt}from"node:fs";import*as u from"path";import{withoutHash as et}from"@redocly/theme/core/utils";import{DEFAULT_LOCALE_PLACEHOLDER as E,SIDEBAR_PREFIX as ot,CONFIG_FILE_NAME as V}from"../../../constants/common.js";import{CATALOG_OUTPUT_FILE_NAME as at}from"../../constants/common.js";import{findDeepFirst as x}from"../../../utils/tree/find-deep-first.js";import{isDefined as X}from"../../../utils/guards/is-defined.js";import{partition as rt}from"../../../utils/array/partition.js";import{collectPropValueDeep as B}from"../../../utils/tree/collect-prop-value-deep.js";import{envConfig as it}from"../../config/env-config.js";import{isLocalLink as nt}from"../../../utils/path/is-local-link.js";import{normalizeRouteSlug as Y}from"../../../utils/path/normalize-route-slug.js";import{slash as st}from"../../../utils/path/slash.js";import{parsePathVersions as lt}from"../../../utils/path/parse-path-versions.js";import{reporter as R}from"../../tools/notifiers/reporter.js";import{logger as v}from"../../tools/notifiers/logger.js";import{sha1 as ct}from"../../utils/crypto/sha1.js";import{collectItemsLinkedToSidebars as ft,resolveItems as Z}from"../nav-utils.js";import{getExcludedFromLinkCheckerPatterns as dt,getSidebarReferences as ut,hasCircularDependency as gt}from"./utils.js";import{getLocaleFromRelativePath as mt}from"../../fs/utils/get-locale-from-relative-path.js";import{isSystemRouteSlug as pt}from"../../utils/system-routes.js";import{ENTITIES_MAP_GLOBAL_DATA_KEY as ht}from"../../constants/plugins/catalog-entities.js";import{telemetryTraceStep as St}from"../../../cli/telemetry/helpers/trace-step.js";const yt=180,bt=170,Ft=10;async function Kt({contentDir:c}){return{id:"sidebars",async afterRoutesCreated(e,f){v.info("Calculating sidebars..."),await St("build.plugin.sidebars",async()=>{const{cache:S,fs:n}=f,C=e.getConfig(),I=new Map,D=new Set,M=[E,...n.localeFolders],G=e.getGlobalData()[ht]||{},$={};let _=n.scan(/sidebars.yaml$/).map(({relativePath:t})=>t).filter(t=>!It(C.ignore??[],t)&&t);const j=await ut(f,c,_),q=rt(_.filter(t=>!j.has(t)),t=>lt(t)?.versionFolderPath||t),T=dt(C),Q=await ft(C?.navbar,e,f,{navFile:V,excludedFromLinkCheckerPatterns:T});let P;const O=gt(j);O&&Array.isArray(O)&&await R.panicOnBuildContentError(`Sidebar references have circular dependency. Please check your sidebar files.
2
2
  Circular dependency chain: ${O.reverse().join(" -> ")}
3
- `);for(const t of q){const g=(await Promise.all(t.map(async i=>{const l=(await S.load(i,"yaml")).data;if(!Array.isArray(l)){await R.panicOnBuildContentErrorForRealFile('Invalid sidebar contents at %rp, items should be an array, got "%s"',i,n,i,typeof l);return}return{items:l,sidebarRelativePath:i,locale:mt(i)}}))).filter(X),r=(await L(g))?.firstLink;P||(P=r)}const z=Object.entries(C?.catalogClassic??{});for(const t of M){for(const[a,m]of z)await W(a,m,t);const g={},r=new Set,i=e.getAllRoutesForLocale(t);for(const a of i)if(U(a)&&a.fsPath&&!r.has(a.fsPath)){r.add(a.fsPath);let s=u.posix.dirname(a.fsPath);const d=u.parse(s).root;do g[s]=(g[s]||0)+1,s=u.dirname(s);while(s&&s!="."&&d!=s)}const l=v.startTiming("Creating automatic sidebars...");for(const a of i){if(I.has(a.slug))continue;const m=U(a),s=u.dirname(a.fsPath),d=g[s]===1,p=Dt(a.baseSlug||a.slug);m&&d?await L([{items:[{directory:s}],sidebarRelativePath:"sidebar.yaml_"+p,locale:t}]):a.getSidebar!==void 0&&await L([{items:[{page:a.fsPath}],sidebarRelativePath:"sidebar.yaml_"+p,locale:t}])}v.infoTime(l,"Creating automatic sidebars...");for(const[a,m]of z)await W(a,m,t,!0)}if(k.length===0)for(const t of M){v.verbose("Creating default sidebar");const g=t===E,r=`sidebars.yaml${g?"":"_"+t}`,i=g?"":`${n.localizationFolder}/${t}`,l=(await L([{items:[{directory:`./${i}`}],sidebarRelativePath:r,locale:t,ignoredRoutes:D}]))?.firstLink;P||(P=l)}if(!e.getRouteBySlug("/")&&!e.getConfig().redirects?.["/"]){const g=e.getAllRoutes().find(i=>!pt(i.slug)),r=P?P.link:g?.baseSlug??null;if(r){const i=et(r);e.addRedirect("/",{to:i,type:302}),v.info("Creating default redirect for index page => %s",i)}}const H=it.REDOCLY_METADATA_OUTPUT_FOLDER;H&&(v.info("Writing catalog data..."),tt(u.join(H,at),JSON.stringify($)));function U(t){return D.has(t.slug)||G[t.fsPath]}async function L(t){if(t.length===0)return;const r=(await Promise.all(t.map(async({items:d,locale:p,sidebarRelativePath:h,ignoredRoutes:_})=>{const o=await Z(d,u.dirname(u.join(c,h)),e,f,{locale:p,ignoredRoutes:_,navFile:h,excludedFromLinkCheckerPatterns:T});if(!o){await R.panicOnBuild("Failed to resolve sidebar configuration. Make sure %rp is valid",h);return}return o}))).flat().filter(X),i=B(r,"routeSlug"),l=t[0].sidebarRelativePath,a=J(l),m=new Set;for(const d of i){const p=e.getRouteBySlug(d)?.fsPath??"",h=G[p];h&&(Array.from(m).find(o=>o.key===h.key&&o.version===h.version)||m.add(h)),e.addRouteSharedData(d,"sidebar",a),I.set(Y(d),r)}const s=m.size===1?Array.from(m)[0]:void 0;return await e.createSharedData(a,{relatedNavbarItem:Q?.get(l),items:r,catalogEntity:s?{key:s.key,version:s.version}:void 0}),{firstLink:x(r,d=>!!d.link),resolved:r}}async function W(t,g,r,i=!1){const l=structuredClone(g);r&&r!==E&&l.items.forEach(o=>{o.directory=u.posix.join(n.localizationFolder||"",r,o.directory||"")});let a=await Z(l.items,c,e,f,{groupCustomSidebars:!0,locale:r,navFile:V,excludedFromLinkCheckerPatterns:T});if(!a){await R.panicOnBuild(`Failed to resolve catalog configuration. Make sure catalog ${t} has valid config`);return}const m=r===E?"":"/"+r.toLowerCase(),s=r===E?"":`-${r}`,d=Y(u.posix.join(m,l.slug));if(i)for(const o of a){const y=x(o.items||[],F=>!!F.routeSlug);if(!y?.routeSlug)continue;const b=I.get(y.routeSlug);if(!b)continue;const N=B(b,"routeSlug"),w="current-catalog-info-"+o.routeSlug+s,A={catalog:{label:l.title,titleTranslationKey:l.titleTranslationKey,link:d,icon:l?.icon},item:{label:o.metadata?.title,link:o.link,icon:o.icon}};await e.createSharedData(w,A);for(const F of N)e.addRouteSharedData(F,"current-catalog-info",w),D.add(F);const K=x(b,F=>!!F.link&&!F.external&&nt(F.link)&&(!o.version||F.version===o.version));K&&(o.sidebar=[{...K,items:void 0}])}const p={},h=new Set;for(const o of a){if(!(o.routeSlug||o.sidebar?.[0]?.routeSlug)||!o.fsPath||h.has(o.fsPath))continue;h.add(o.fsPath);const b=u.dirname(o.fsPath);p[b]=(p[b]||0)+1}if(i){const o=await e.createSharedData("catalog-"+t+s,a.flatMap(y=>{const b=u.dirname(y.fsPath??""),N=p[b]===1,w=A=>({...A,fsPath:N?b:A.fsPath??""});return y.type==="group"&&y.items?.every(A=>A.type==="group")?(y.items||[]).map(w):w(y)}));e.addRouteSharedData(d,"catalog",o),Ct(r,a,$,p)}const _=B(a,"routeSlug");for(const o of _)D.add(o)}})}}}function Ct(c,e,f,S){if(c===E)for(const n of e){const C=n.routeSlug||n.sidebar?.[0]?.routeSlug;if(!C||!n.fsPath)continue;const I=u.dirname(n.fsPath),D=S[I]===1;f[C]={rootFileFsPath:n.fsPath,fsPath:D?I:n.fsPath,metadata:n.metadata||{},title:n.metadata?.title||n.label||"Untitled",version:n.version||"latest"}}}function J(c){return ot+st(c)}async function Vt(c,e,f){const S=u.posix.join(u.dirname(c),e);return await f.exists(S)?J(S):(await R.panicOnBuildContentErrorForRealFile("File %rp: Failed to create relative path for sidebars.yaml using %s",c,f,c,e),null)}function It(c,e){const f=/\/?([a-zA-Z0-9-_]+\/)*sidebars?(-[a-zA-Z0-9-_]+)?\.yaml/;return c.filter(n=>f.test(n)).includes(e)}function Dt(c){const e=c.replaceAll("/","_");if(e.length>yt){const f=e.slice(0,bt),S=ct(c).slice(0,Ft).replaceAll("/","_");return f+S}else return e}export{It as isSidebarIgnored,Vt as resolveSidebarId,Kt as sidebarsPlugin};
3
+ `);for(const t of q){const g=(await Promise.all(t.map(async i=>{const l=(await S.load(i,"yaml")).data;if(!Array.isArray(l)){await R.panicOnBuildContentErrorForRealFile('Invalid sidebar contents at %rp, items should be an array, got "%s"',i,n,i,typeof l);return}return{items:l,sidebarRelativePath:i,locale:mt(i)}}))).filter(X),r=(await k(g))?.firstLink;P||(P=r)}const z=Object.entries(C?.catalogClassic??{});for(const t of M){for(const[a,m]of z)await W(a,m,t);const g={},r=new Set,i=e.getAllRoutesForLocale(t);for(const a of i)if(U(a)&&a.fsPath&&!r.has(a.fsPath)){r.add(a.fsPath);let s=u.posix.dirname(a.fsPath);const d=u.parse(s).root;do g[s]=(g[s]||0)+1,s=u.dirname(s);while(s&&s!="."&&d!=s)}const l=v.startTiming("Creating automatic sidebars...");for(const a of i){if(I.has(a.slug))continue;const m=U(a),s=u.dirname(a.fsPath),d=g[s]===1,p=Dt(a.baseSlug||a.slug);m&&d?await k([{items:[{directory:s}],sidebarRelativePath:"sidebar.yaml_"+p,locale:t}]):a.getSidebar!==void 0&&await k([{items:[{page:a.fsPath}],sidebarRelativePath:"sidebar.yaml_"+p,locale:t}])}v.infoTime(l,"Creating automatic sidebars...");for(const[a,m]of z)await W(a,m,t,!0)}if(_.length===0)for(const t of M){v.verbose("Creating default sidebar");const g=t===E,r=`sidebars.yaml${g?"":"_"+t}`,i=g?"":`${n.localizationFolder}/${t}`,l=(await k([{items:[{directory:`./${i}`}],sidebarRelativePath:r,locale:t,ignoredRoutes:D}]))?.firstLink;P||(P=l)}if(!e.getRouteBySlug("/")&&!e.getConfig().redirects?.["/"]){const g=e.getAllRoutes().find(i=>!pt(i.slug)),r=P?P.link:g?.baseSlug??null;if(r){const i=et(r);e.addRedirect("/",{to:i,type:302}),v.info("Creating default redirect for index page => %s",i)}}const H=it.REDOCLY_METADATA_OUTPUT_FOLDER;H&&(v.info("Writing catalog data..."),tt(u.join(H,at),JSON.stringify($)));function U(t){return D.has(t.slug)||G[t.fsPath]}async function k(t){if(t.length===0)return;const r=(await Promise.all(t.map(async({items:d,locale:p,sidebarRelativePath:h,ignoredRoutes:L})=>{const o=await Z(d,u.dirname(u.join(c,h)),e,f,{locale:p,ignoredRoutes:L,navFile:h,excludedFromLinkCheckerPatterns:T});if(!o){await R.panicOnBuild("Failed to resolve sidebar configuration. Make sure %rp is valid",h);return}return o}))).flat().filter(X),i=B(r,"routeSlug"),l=t[0].sidebarRelativePath,a=J(l),m=new Set;for(const d of i){const p=e.getRouteBySlug(d)?.fsPath??"",h=G[p];h&&(Array.from(m).find(o=>o.key===h.key&&o.version===h.version)||m.add(h)),e.addRouteSharedData(d,"sidebar",a),I.set(Y(d),r)}const s=m.size===1?Array.from(m)[0]:void 0;return await e.createSharedData(a,{relatedNavbarItem:Q?.get(l),items:r,catalogEntity:s?{key:s.key,version:s.version}:void 0}),{firstLink:x(r,d=>!!d.link),resolved:r}}async function W(t,g,r,i=!1){const l=structuredClone(g);r&&r!==E&&l.items.forEach(o=>{o.directory=u.posix.join(n.localizationFolder||"",r,o.directory||"")});let a=await Z(l.items,c,e,f,{groupCustomSidebars:!0,locale:r,navFile:V,excludedFromLinkCheckerPatterns:T});if(!a){await R.panicOnBuild(`Failed to resolve catalog configuration. Make sure catalog ${t} has valid config`);return}const m=r===E?"":"/"+r.toLowerCase(),s=r===E?"":`-${r}`,d=Y(u.posix.join(m,l.slug));if(i)for(const o of a){const y=x(o.items||[],F=>!!F.routeSlug);if(!y?.routeSlug)continue;const b=I.get(y.routeSlug);if(!b)continue;const N=B(b,"routeSlug"),w="current-catalog-info-"+o.routeSlug+s,A={catalog:{label:l.title,titleTranslationKey:l.titleTranslationKey,link:d,icon:l?.icon},item:{label:o.metadata?.title,link:o.link,icon:o.icon}};await e.createSharedData(w,A);for(const F of N)e.addRouteSharedData(F,"current-catalog-info",w),D.add(F);const K=x(b,F=>!!F.link&&!F.external&&nt(F.link)&&(!o.version||F.version===o.version));K&&(o.sidebar=[{...K,items:void 0}])}const p={},h=new Set;for(const o of a){if(!(o.routeSlug||o.sidebar?.[0]?.routeSlug)||!o.fsPath||h.has(o.fsPath))continue;h.add(o.fsPath);const b=u.dirname(o.fsPath);p[b]=(p[b]||0)+1}if(i){const o=await e.createSharedData("catalog-"+t+s,a.flatMap(y=>{const b=u.dirname(y.fsPath??""),N=p[b]===1,w=A=>({...A,fsPath:N?b:A.fsPath??""});return y.type==="group"&&y.items?.every(A=>A.type==="group")?(y.items||[]).map(w):w(y)}));e.addRouteSharedData(d,"catalog",o),Ct(r,a,$,p)}const L=B(a,"routeSlug");for(const o of L)D.add(o)}})}}}function Ct(c,e,f,S){if(c===E)for(const n of e){const C=n.routeSlug||n.sidebar?.[0]?.routeSlug;if(!C||!n.fsPath)continue;const I=u.dirname(n.fsPath),D=S[I]===1;f[C]={link:n.link,rootFileFsPath:n.fsPath,fsPath:D?I:n.fsPath,metadata:n.metadata||{},title:n.metadata?.title||n.label||"Untitled",version:n.version||"latest"}}}function J(c){return ot+st(c)}async function Vt(c,e,f){const S=u.posix.join(u.dirname(c),e);return await f.exists(S)?J(S):(await R.panicOnBuildContentErrorForRealFile("File %rp: Failed to create relative path for sidebars.yaml using %s",c,f,c,e),null)}function It(c,e){const f=/\/?([a-zA-Z0-9-_]+\/)*sidebars?(-[a-zA-Z0-9-_]+)?\.yaml/;return c.filter(n=>f.test(n)).includes(e)}function Dt(c){const e=c.replaceAll("/","_");if(e.length>yt){const f=e.slice(0,bt),S=ct(c).slice(0,Ft).replaceAll("/","_");return f+S}else return e}export{It as isSidebarIgnored,Vt as resolveSidebarId,Kt as sidebarsPlugin};
@@ -1 +1 @@
1
- import{DEFAULT_SSO_IDP_TITLE as f}from"../../../constants/common.js";import{envConfig as c}from"../../../config/env-config.js";import{telemetryTraceStep as u}from"../../../cli/telemetry/helpers/trace-step.js";const g="https://auth.cloud.redocly.com/oidc/.well-known/openid-configuration",y="https://auth.cloud.redocly.com/api/sso/oidc/introspect";async function m(C){return{id:"sso",async processContent(e){await u("build.plugin.sso",async a=>{const o=e.getConfig();if(a?.setAttribute("config",`{"ssoDirect": ${JSON.stringify(o.ssoDirect||{})}}, {"sso": ${JSON.stringify(o.sso||{})}}`),o.ssoDirect&&typeof o.ssoDirect=="object"&&Object.keys(o.ssoDirect).length!==0||o.sso&&Array.isArray(o.sso)&&!o.sso.length)return;const l=!!(o.rbac&&typeof o.rbac=="object"&&Object.keys(o.rbac).length!==0),p=o.requiresLogin;if(!l&&!p)return;let i=g,n=c.REDOCLY_OAUTH_USE_INTROSPECT?y:"";const s=o.residency;if(s){const r=s.endsWith("/")?s.slice(0,-1):s;i=`${r.replace("app.","auth.")}/oidc/.well-known/openid-configuration`,n=c.REDOCLY_OAUTH_USE_INTROSPECT?`${r}/api/sso/oidc/introspect`:""}let t="AUTO";o.sso&&(Array.isArray(o.sso)?t=o.sso.join(","):t=o.sso);const d={oidc:{title:f,type:"OIDC",configurationUrl:i,clientId:"{{ process.env.OAUTH_CLIENT_ID }}",clientSecret:"{{ process.env.OAUTH_CLIENT_SECRET }}",teamsClaimName:"https://redocly.com/sso/teams",scopes:["openid"],authorizationRequestCustomParams:{login_hint:"{{ process.env.ORGANIZATION_ID }}",login_type:t,prompt:"login"},audience:"{{ process.env.ORGANIZATION_ID }}",introspectEndpoint:n}};e.setGlobalConfig({ssoDirect:d})})},async afterRoutesCreated(e){}}}export{m as ssoPlugin};
1
+ import{DEFAULT_SSO_IDP_TITLE as f}from"../../../constants/common.js";import{envConfig as c}from"../../config/env-config.js";import{telemetryTraceStep as u}from"../../../cli/telemetry/helpers/trace-step.js";const g="https://auth.cloud.redocly.com/oidc/.well-known/openid-configuration",y="https://auth.cloud.redocly.com/api/sso/oidc/introspect";async function m(C){return{id:"sso",async processContent(e){await u("build.plugin.sso",async a=>{const o=e.getConfig();if(a?.setAttribute("config",`{"ssoDirect": ${JSON.stringify(o.ssoDirect||{})}}, {"sso": ${JSON.stringify(o.sso||{})}}`),o.ssoDirect&&typeof o.ssoDirect=="object"&&Object.keys(o.ssoDirect).length!==0||o.sso&&Array.isArray(o.sso)&&!o.sso.length)return;const l=!!(o.rbac&&typeof o.rbac=="object"&&Object.keys(o.rbac).length!==0),p=o.requiresLogin;if(!l&&!p)return;let i=g,n=c.REDOCLY_OAUTH_USE_INTROSPECT?y:"";const s=o.residency;if(s){const r=s.endsWith("/")?s.slice(0,-1):s;i=`${r.replace("app.","auth.")}/oidc/.well-known/openid-configuration`,n=c.REDOCLY_OAUTH_USE_INTROSPECT?`${r}/api/sso/oidc/introspect`:""}let t="AUTO";o.sso&&(Array.isArray(o.sso)?t=o.sso.join(","):t=o.sso);const d={oidc:{title:f,type:"OIDC",configurationUrl:i,clientId:"{{ process.env.OAUTH_CLIENT_ID }}",clientSecret:"{{ process.env.OAUTH_CLIENT_SECRET }}",teamsClaimName:"https://redocly.com/sso/teams",scopes:["openid"],authorizationRequestCustomParams:{login_hint:"{{ process.env.ORGANIZATION_ID }}",login_type:t,prompt:"login"},audience:"{{ process.env.ORGANIZATION_ID }}",introspectEndpoint:n}};e.setGlobalConfig({ssoDirect:d})})},async afterRoutesCreated(e){}}}export{m as ssoPlugin};
@@ -1 +1 @@
1
- import{envConfig as i}from"../../../config/env-config.js";import{SQLD_REMOTE_DATABASE_URL_NO_DEPLOYMENT_YET_VAR as r}from"../../constants/plugins/catalog-entities.js";class n{static#t="ORGANIZATION_ID";static#e="PROJECT_ID";organizationId;projectId;databaseClient;path;constructor(e){const t=this.isNonRemoteDatabaseMode();this.organizationId=this.#i(t),this.projectId=this.#n(t),this.databaseClient=e.client,this.path=e.path}async close(){await this.databaseClient.close()}async sync(){await this.databaseClient.sync()}#i=e=>{const t=i.ORGANIZATION_ID;if(t)return t;if(e)return n.#t;throw new Error("ORGANIZATION_ID environment variable is required. Ensure it is set in your environment configuration.")};#n=e=>{const t=i.PROJECT_ID;if(t)return t;if(e)return n.#e;throw new Error("PROJECT_ID environment variable is required. Ensure it is set in your environment configuration.")};isNonRemoteDatabaseMode=()=>i.SQLD_REMOTE_DATABASE_URL===r||!i.SQLD_REMOTE_DATABASE_AUTH_TOKEN}export{n as BaseRepository};
1
+ import{envConfig as i}from"../../config/env-config.js";import{SQLD_REMOTE_DATABASE_URL_NO_DEPLOYMENT_YET_VAR as r}from"../../constants/plugins/catalog-entities.js";class n{static#t="ORGANIZATION_ID";static#e="PROJECT_ID";organizationId;projectId;databaseClient;path;constructor(e){const t=this.isNonRemoteDatabaseMode();this.organizationId=this.#i(t),this.projectId=this.#n(t),this.databaseClient=e.client,this.path=e.path}async close(){await this.databaseClient.close()}async sync(){await this.databaseClient.sync()}#i=e=>{const t=i.ORGANIZATION_ID;if(t)return t;if(e)return n.#t;throw new Error("ORGANIZATION_ID environment variable is required. Ensure it is set in your environment configuration.")};#n=e=>{const t=i.PROJECT_ID;if(t)return t;if(e)return n.#e;throw new Error("PROJECT_ID environment variable is required. Ensure it is set in your environment configuration.")};isNonRemoteDatabaseMode=()=>i.SQLD_REMOTE_DATABASE_URL===r||!i.SQLD_REMOTE_DATABASE_AUTH_TOKEN}export{n as BaseRepository};
@@ -1 +1 @@
1
- import{logger as i}from"../../tools/notifiers/logger.js";import{envConfig as e}from"../../../config/env-config.js";import{CATALOG_LOCAL_DATABASE_FOLDER as A,CATALOG_LOCAL_DATABASE_MIGRATIONS_FOLDER as s,CATALOG_LOCAL_DATABASE_NAME as _,MAIN_LOCAL_DATABASE_FOLDER as l,MAIN_LOCAL_DATABASE_MIGRATIONS_FOLDER as c,MAIN_LOCAL_DATABASE_NAME as E,SQLD_REMOTE_DATABASE_FOLDER as D,SQLD_REMOTE_DATABASE_MIGRATIONS_FOLDER as T,SQLD_REMOTE_DATABASE_NAME as L}from"./constants.js";import{LocalDatabaseInitializationStrategy as o,RemoteDatabaseInitializationStrategy as d}from"./database-initialization-strategy.js";import{DatabaseConnectionsManager as m}from"./database-connections-manager.js";import{SQLD_REMOTE_DATABASE_URL_NO_DEPLOYMENT_YET_VAR as O}from"../../constants/plugins/catalog-entities.js";class N{static async create(a,t){switch(a){case"main-local":return await this.#a(t);case"catalog-local":return await this.#t(t);case"sqld-remote":return await this.#e(t);default:return null}}static async#a(a){return await new o().initialize({...a,databaseName:E,additionalFolder:l,migrationsFolder:c})}static async#t(a){return await new o().initialize({...a,databaseName:_,additionalFolder:A,migrationsFolder:s})}static async#e(a){try{const t=e.SQLD_REMOTE_DATABASE_URL||a.sqldRemoteDatabaseUrl,n=t===O?void 0:t,r=e.SQLD_REMOTE_DATABASE_AUTH_TOKEN||a.sqldRemoteDatabaseAuthToken;return(!n||!r)&&!e.isDevelopMode?(i.warn("Your remote database is not initialized yet, please wait for production deployment."),null):await m.getConnection({config:{...a,databaseName:L,additionalFolder:D,migrationsFolder:T,syncUrl:n,authToken:e.SQLD_REMOTE_DATABASE_AUTH_TOKEN||a.sqldRemoteDatabaseAuthToken},strategy:new d})}catch(t){return i.error("Remote database connection initialization failed",t),null}}}export{N as DatabaseConnectionFactory};
1
+ import{logger as i}from"../../tools/notifiers/logger.js";import{envConfig as e}from"../../config/env-config.js";import{CATALOG_LOCAL_DATABASE_FOLDER as A,CATALOG_LOCAL_DATABASE_MIGRATIONS_FOLDER as s,CATALOG_LOCAL_DATABASE_NAME as _,MAIN_LOCAL_DATABASE_FOLDER as l,MAIN_LOCAL_DATABASE_MIGRATIONS_FOLDER as c,MAIN_LOCAL_DATABASE_NAME as E,SQLD_REMOTE_DATABASE_FOLDER as D,SQLD_REMOTE_DATABASE_MIGRATIONS_FOLDER as T,SQLD_REMOTE_DATABASE_NAME as L}from"./constants.js";import{LocalDatabaseInitializationStrategy as o,RemoteDatabaseInitializationStrategy as d}from"./database-initialization-strategy.js";import{DatabaseConnectionsManager as m}from"./database-connections-manager.js";import{SQLD_REMOTE_DATABASE_URL_NO_DEPLOYMENT_YET_VAR as O}from"../../constants/plugins/catalog-entities.js";class N{static async create(a,t){switch(a){case"main-local":return await this.#a(t);case"catalog-local":return await this.#t(t);case"sqld-remote":return await this.#e(t);default:return null}}static async#a(a){return await new o().initialize({...a,databaseName:E,additionalFolder:l,migrationsFolder:c})}static async#t(a){return await new o().initialize({...a,databaseName:_,additionalFolder:A,migrationsFolder:s})}static async#e(a){try{const t=e.SQLD_REMOTE_DATABASE_URL||a.sqldRemoteDatabaseUrl,n=t===O?void 0:t,r=e.SQLD_REMOTE_DATABASE_AUTH_TOKEN||a.sqldRemoteDatabaseAuthToken;return(!n||!r)&&!e.isDevelopMode?(i.warn("Your remote database is not initialized yet, please wait for production deployment."),null):await m.getConnection({config:{...a,databaseName:L,additionalFolder:D,migrationsFolder:T,syncUrl:n,authToken:e.SQLD_REMOTE_DATABASE_AUTH_TOKEN||a.sqldRemoteDatabaseAuthToken},strategy:new d})}catch(t){return i.error("Remote database connection initialization failed",t),null}}}export{N as DatabaseConnectionFactory};
@@ -1 +1 @@
1
- import{logger as o}from"../../tools/notifiers/logger.js";import{envConfig as n}from"../../../config/env-config.js";import{DatabaseConnectionFactory as i}from"./database-connection-factory.js";class t{static#t=!1;static async init(e){if(!(n.REDOCLY_INTERNAL_DEV==="true"||n.CI==="true")&&!t.#t)try{await t.#e(e)==="PRECONNECTED"&&(t.#t=!0)}catch(r){o.error("Failed to preconnect to sqld remote database",r)}}static#e=async e=>await i.create("sqld-remote",{baseDbDir:e})?(o.info("Sqld remote database preconnected"),"PRECONNECTED"):(o.warn("Sqld remote database preconnect failed"),"NOT_PRECONNECTED")}export{t as DatabasePreconnectService};
1
+ import{logger as o}from"../../tools/notifiers/logger.js";import{envConfig as n}from"../../config/env-config.js";import{DatabaseConnectionFactory as i}from"./database-connection-factory.js";class t{static#t=!1;static async init(e){if(!(n.REDOCLY_INTERNAL_DEV==="true"||n.CI==="true")&&!t.#t)try{await t.#e(e)==="PRECONNECTED"&&(t.#t=!0)}catch(r){o.error("Failed to preconnect to sqld remote database",r)}}static#e=async e=>await i.create("sqld-remote",{baseDbDir:e})?(o.info("Sqld remote database preconnected"),"PRECONNECTED"):(o.warn("Sqld remote database preconnect failed"),"NOT_PRECONNECTED")}export{t as DatabasePreconnectService};
@@ -1 +1 @@
1
- import{DatabasePathGenerator as s}from"../../database-path-generator.js";import{SQLD_REMOTE_DATABASE_FOLDER as t,SQLD_REMOTE_DATABASE_NAME as A}from"../../constants.js";import{SCHEMAS_PATH as o}from"../catalog-sqlite/drizzle.config.js";import{envConfig as r}from"../../../../../config/env-config.js";const E="./dist/server/esbuild/cache/server",_="./src/server/providers/database/databases/sqld-sqlite/schemas/*",i="./src/server/providers/database/databases/sqld-sqlite/migrations",d=()=>{const e=r.SQLD_REMOTE_DATABASE_URL,a=r.SQLD_REMOTE_DATABASE_AUTH_TOKEN;return e&&a?{url:e,authToken:a}:{url:s.generateDatabasePath({baseDir:E,databaseName:A,additionalFolder:t})}};var c={schema:[_,o],out:i,dialect:"turso",dbCredentials:d()};export{c as default};
1
+ import{DatabasePathGenerator as s}from"../../database-path-generator.js";import{SQLD_REMOTE_DATABASE_FOLDER as t,SQLD_REMOTE_DATABASE_NAME as A}from"../../constants.js";import{SCHEMAS_PATH as o}from"../catalog-sqlite/drizzle.config.js";import{envConfig as r}from"../../../../config/env-config.js";const E="./dist/server/esbuild/cache/server",_="./src/server/providers/database/databases/sqld-sqlite/schemas/*",i="./src/server/providers/database/databases/sqld-sqlite/migrations",d=()=>{const e=r.SQLD_REMOTE_DATABASE_URL,a=r.SQLD_REMOTE_DATABASE_AUTH_TOKEN;return e&&a?{url:e,authToken:a}:{url:s.generateDatabasePath({baseDir:E,databaseName:A,additionalFolder:t})}};var c={schema:[_,o],out:i,dialect:"turso",dbCredentials:d()};export{c as default};
@@ -1 +1 @@
1
- import{pathToFileURL as I}from"url";import{HelmetProvider as z}from"@dr.pogodin/react-helmet";import{renderToString as m}from"react-dom/server";import{StaticRouterProvider as G,createStaticHandler as J,createStaticRouter as K}from"react-router-dom/server.js";import r from"react";import{readFile as Q}from"fs/promises";import{join as V}from"path";import{withPathPrefix as l,getLocaleFromPathname as W,withoutPathPrefix as X,removeTrailingSlash as Y}from"@redocly/theme/core/utils";import{RUNTIME_RESOURCES_DIR as T}from"../constants/common.js";import{slash as Z}from"../../utils/path/slash.js";import{reporter as tt}from"../tools/notifiers/reporter.js";import{envConfig as p}from"../../config/env-config.js";import{slug as et}from"../utils/slugger.js";import{htmlTemplate as rt}from"./template.js";import{detectColorSchemaScript as ot,generatePreloadPageData as st}from"./utils.js";import"./hijack-console.js";import{getSitemapLinkTag as nt}from"./get-sitemap-link-tag.js";let g="";async function at(t){return p.isRuntimeMode?await import("../../client/server-entry.js"):await import(I(`${Z(t)}/server-entry.js`)+"?"+new Date)}async function vt(t){if(!p.isRuntimeMode){const e=tt.getCompilationProblems();if(e.length>0){const{renderCompilationError:n}=await import("./render-compilation-error.js");return n(e)}}const{Loader:u,App:R,routes:E,ServerStyleSheet:w,StyleSheetManager:C,ErrorDetails:y,initL10n:P}=await at(t.serverOutDir),{page:h,store:{globalData:S,hasSitemap:D},sharedData:v,ssrHref:b}=t,f=S?.l10n,i=W(X(h.slug),f?.defaultLocale,f?.locales),d=t.page.request?.url||"http://localhost/";await u.prepare({...h,slug:Y(new URL(d).pathname)},v,S,i),await P(i);const c=new w,{query:M,dataRoutes:x}=J([{Component:R,path:l("*"),children:E}]),s=await M(new Request(d));if(s instanceof Response)throw s;const B=K(x,s);try{globalThis.SSR_HOSTNAME=b,globalThis.SSR_USER_AGENT=t.userAgent,globalThis.SSR_OMIT_SUSPENSE=t.omitSuspense;const e={},n=m(r.createElement(z,{context:e},r.createElement(C,{sheet:c.instance},r.createElement(G,{router:B,context:s})))),L=D?nt():"",a=e.helmet,k=a?.title.toString()||"",_=t.store.globalData?.logo?.favicon,o=t.store.config,j=`<link rel="preload" as="fetch" crossorigin="anonymous" href="${l("/app-data.json")}" />`,H=st(t.page.slug),U=ot(o),A=t.page.product?.name?`product-${et(t.page.product.name)}`:"",$=t.store.ssr.headTags.join(""),F=t.store.ssr.postBodyTags.join(""),N=t.store.ssr.preBodyTags.join(""),O=`<link rel="stylesheet" href="${l(T)}/browser-entry.css" />`;!p.isDevelopMode&&!g&&(g=`<style>${await Q(V(t.outdir,T,"browser-entry.css"),"utf-8")}</style>`);const q={bodyHtml:n,linkTags:o.linkTags+c.getStyleTags()+(a?.link.toString()||""),title:k,favicon:_,headScriptTags:L+U+o.headScriptTags+$+(a?.script.toString()||"")+(a?.meta.toString()||""),preload:[j,H],postBodyScriptTags:o.postBodyScriptTags+F,preBodyScriptTags:o.preBodyScriptTags||""+N,lang:i,productClass:A,runtimeCss:g||O};return{html:rt(q),statusCode:200}}catch(e){return t.telemetry.sendSsrErrorCaughtMessage({message:e.message}),{html:m(r.createElement(y,{error:e})),statusCode:500,error:e}}finally{c.seal(),u.clear()}}function bt(t){return m(r.createElement(r.Fragment,null,...t))}export{vt as render,bt as renderComponents};
1
+ import{pathToFileURL as I}from"url";import{HelmetProvider as z}from"@dr.pogodin/react-helmet";import{renderToString as m}from"react-dom/server";import{StaticRouterProvider as G,createStaticHandler as J,createStaticRouter as K}from"react-router-dom/server.js";import r from"react";import{readFile as Q}from"fs/promises";import{join as V}from"path";import{withPathPrefix as l,getLocaleFromPathname as W,withoutPathPrefix as X,removeTrailingSlash as Y}from"@redocly/theme/core/utils";import{RUNTIME_RESOURCES_DIR as T}from"../constants/common.js";import{slash as Z}from"../../utils/path/slash.js";import{reporter as tt}from"../tools/notifiers/reporter.js";import{envConfig as p}from"../config/env-config.js";import{slug as et}from"../../utils/slugger.js";import{htmlTemplate as rt}from"./template.js";import{detectColorSchemaScript as ot,generatePreloadPageData as st}from"./utils.js";import"./hijack-console.js";import{getSitemapLinkTag as nt}from"./get-sitemap-link-tag.js";let g="";async function at(t){return p.isRuntimeMode?await import("../../client/server-entry.js"):await import(I(`${Z(t)}/server-entry.js`)+"?"+new Date)}async function vt(t){if(!p.isRuntimeMode){const e=tt.getCompilationProblems();if(e.length>0){const{renderCompilationError:n}=await import("./render-compilation-error.js");return n(e)}}const{Loader:u,App:R,routes:E,ServerStyleSheet:w,StyleSheetManager:C,ErrorDetails:y,initL10n:P}=await at(t.serverOutDir),{page:h,store:{globalData:S,hasSitemap:D},sharedData:v,ssrHref:b}=t,f=S?.l10n,i=W(X(h.slug),f?.defaultLocale,f?.locales),d=t.page.request?.url||"http://localhost/";await u.prepare({...h,slug:Y(new URL(d).pathname)},v,S,i),await P(i);const c=new w,{query:M,dataRoutes:x}=J([{Component:R,path:l("*"),children:E}]),s=await M(new Request(d));if(s instanceof Response)throw s;const B=K(x,s);try{globalThis.SSR_HOSTNAME=b,globalThis.SSR_USER_AGENT=t.userAgent,globalThis.SSR_OMIT_SUSPENSE=t.omitSuspense;const e={},n=m(r.createElement(z,{context:e},r.createElement(C,{sheet:c.instance},r.createElement(G,{router:B,context:s})))),L=D?nt():"",a=e.helmet,k=a?.title.toString()||"",_=t.store.globalData?.logo?.favicon,o=t.store.config,j=`<link rel="preload" as="fetch" crossorigin="anonymous" href="${l("/app-data.json")}" />`,H=st(t.page.slug),U=ot(o),A=t.page.product?.name?`product-${et(t.page.product.name)}`:"",$=t.store.ssr.headTags.join(""),F=t.store.ssr.postBodyTags.join(""),N=t.store.ssr.preBodyTags.join(""),O=`<link rel="stylesheet" href="${l(T)}/browser-entry.css" />`;!p.isDevelopMode&&!g&&(g=`<style>${await Q(V(t.outdir,T,"browser-entry.css"),"utf-8")}</style>`);const q={bodyHtml:n,linkTags:o.linkTags+c.getStyleTags()+(a?.link.toString()||""),title:k,favicon:_,headScriptTags:L+U+o.headScriptTags+$+(a?.script.toString()||"")+(a?.meta.toString()||""),preload:[j,H],postBodyScriptTags:o.postBodyScriptTags+F,preBodyScriptTags:o.preBodyScriptTags||""+N,lang:i,productClass:A,runtimeCss:g||O};return{html:rt(q),statusCode:200}}catch(e){return t.telemetry.sendSsrErrorCaughtMessage({message:e.message}),{html:m(r.createElement(y,{error:e})),statusCode:500,error:e}}finally{c.seal(),u.clear()}}function bt(t){return m(r.createElement(r.Fragment,null,...t))}export{vt as render,bt as renderComponents};
@@ -1 +1 @@
1
- import{logger as m}from"../../tools/notifiers/logger.js";import{reporter as f}from"../../tools/notifiers/reporter.js";import{enhanceContext as l}from"../../api-routes/helpers/enhance-context.js";import{KvService as u}from"../../persistence/kv/services/kv-service.js";import{envConfig as n}from"../../../config/env-config.js";import{enhanceRequest as P}from"../../api-routes/helpers/enhance-request.js";async function _({route:r,ctx:t,staticData:p,serverPropsGetters:a,serverPropsUser:i,actions:s}){try{if(!a[r.fsPath]||!t)return;const e=a[r.fsPath];e||await f.panicOnBuild(`Invalid page props getter id: "${r.fsPath}" for route "${r.slug}"`);const o=async()=>u.getInstance({baseDbDir:s.serverOutDir,sqldRemoteDatabaseUrl:n.SQLD_REMOTE_DATABASE_URL,sqldRemoteDatabaseAuthToken:n.SQLD_REMOTE_DATABASE_AUTH_TOKEN}),g=l({honoCtx:t,ctx:{user:i,config:s.getConfig()},getKv:o}),c=await P(t);return await(await e()).default(p,c,g)}catch(e){const o=r.fsPath.replace(/\.(page\.tsx?|md)$/,".props.ts");return m.error(`Page prop getter error: ${e.message}`),{pagePropGetterError:{message:`${e.message||"An unknown error occurred"} in ${o}`,name:"ServerPropsGetterError",stack:e.stack}}}}export{_ as getServerPropsFromUserHandler};
1
+ import{logger as m}from"../../tools/notifiers/logger.js";import{reporter as f}from"../../tools/notifiers/reporter.js";import{enhanceContext as l}from"../../api-routes/helpers/enhance-context.js";import{KvService as u}from"../../persistence/kv/services/kv-service.js";import{envConfig as n}from"../../config/env-config.js";import{enhanceRequest as P}from"../../api-routes/helpers/enhance-request.js";async function _({route:r,ctx:t,staticData:p,serverPropsGetters:a,serverPropsUser:i,actions:s}){try{if(!a[r.fsPath]||!t)return;const e=a[r.fsPath];e||await f.panicOnBuild(`Invalid page props getter id: "${r.fsPath}" for route "${r.slug}"`);const o=async()=>u.getInstance({baseDbDir:s.serverOutDir,sqldRemoteDatabaseUrl:n.SQLD_REMOTE_DATABASE_URL,sqldRemoteDatabaseAuthToken:n.SQLD_REMOTE_DATABASE_AUTH_TOKEN}),g=l({honoCtx:t,ctx:{user:i,config:s.getConfig()},getKv:o}),c=await P(t);return await(await e()).default(p,c,g)}catch(e){const o=r.fsPath.replace(/\.(page\.tsx?|md)$/,".props.ts");return m.error(`Page prop getter error: ${e.message}`),{pagePropGetterError:{message:`${e.message||"An unknown error occurred"} in ${o}`,name:"ServerPropsGetterError",stack:e.stack}}}}export{_ as getServerPropsFromUserHandler};
@@ -1,4 +1,4 @@
1
- import{pathToFileURL as d}from"url";import{removeTrailingSlash as u}from"../../utils/url/remove-trailing-slash.js";import{slash as p}from"../../utils/path/slash.js";import{getClientPageDataUrl as f}from"../../utils/url/get-client-page-data-url.js";import{DEFAULT_COLOR_MODES as m}from"@redocly/theme/core/constants";import{envConfig as h}from"../../config/env-config.js";function C(t){const o=t?.colorMode,{modes:e=[m.LIGHT,m.DARK],hide:r,ignoreDetection:n}=o||{},a=e&&`'${e[0]}'`,s=e?.[0],l=e?.some(c=>c===s)?`'${s}'`:void 0;return r||!a?"":`
1
+ import{pathToFileURL as d}from"url";import{removeTrailingSlash as u}from"../../utils/url/remove-trailing-slash.js";import{slash as p}from"../../utils/path/slash.js";import{getClientPageDataUrl as f}from"../../utils/url/get-client-page-data-url.js";import{DEFAULT_COLOR_MODES as m}from"@redocly/theme/core/constants";import{envConfig as h}from"../config/env-config.js";function C(t){const o=t?.colorMode,{modes:e=[m.LIGHT,m.DARK],hide:r,ignoreDetection:n}=o||{},a=e&&`'${e[0]}'`,s=e?.[0],l=e?.some(c=>c===s)?`'${s}'`:void 0;return r||!a?"":`
2
2
  <script>
3
3
  if(window&&document.documentElement)
4
4
  {