@redocly/realm 0.129.1 → 0.130.0-custom.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +398 -83
- package/dist/bin.d.ts +1 -0
- package/dist/bin.js +1 -1
- package/dist/cli/develop.js +1 -1
- package/dist/cli/eject/resolveEjectParams.js +1 -1
- package/dist/cli/prepare/copy-env-files.js +1 -1
- package/dist/cli/prepare/index.js +1 -1
- package/dist/cli/stats/collectors/openapi.d.ts +3 -0
- package/dist/cli/stats/collectors/openapi.js +1 -0
- package/dist/cli/stats/index.d.ts +7 -0
- package/dist/cli/stats/index.js +1 -0
- package/dist/cli/stats/options.d.ts +3 -0
- package/dist/cli/stats/options.js +1 -0
- package/dist/cli/telemetry/index.d.ts +2 -2
- package/dist/cli/telemetry/index.js +1 -1
- package/dist/client/App.js +1 -1
- package/dist/client/ErrorBoundary.js +1 -1
- package/dist/client/app/Sidebar/RequestAccessButton.js +2 -2
- package/dist/client/app/Sidebar/Sidebar.js +2 -2
- package/dist/client/app/Sidebar/helpers/filter-out-versioned-items.js +1 -1
- package/dist/client/app/hooks/catalog/useCatalogClassic.d.ts +1 -1
- package/dist/client/app/hooks/catalog/useCatalogClassic.js +1 -1
- package/dist/client/app/hooks/catalog/useCatalogFilter.js +1 -1
- package/dist/client/app/hooks/catalog/useCatalogViewMode.js +1 -1
- package/dist/client/app/hooks/catalog/useSearchTracker.js +1 -1
- package/dist/client/app/hooks/usePageTimeTracker.js +1 -1
- package/dist/client/app/hooks/useRouteChangeTracker.js +1 -1
- package/dist/client/app/hooks/useTelemetry.d.ts +2 -2
- package/dist/client/app/pages/DevLogin/DevLogin.js +1 -1
- package/dist/client/app/search/message-handlers.d.ts +29 -0
- package/dist/client/app/search/message-handlers.js +1 -0
- package/dist/client/app/search/sse-parser.d.ts +10 -0
- package/dist/client/app/search/sse-parser.js +2 -0
- package/dist/client/app/search/useAiSearch.d.ts +9 -11
- package/dist/client/app/search/useAiSearch.js +1 -1
- package/dist/client/app/search/useSearch.js +1 -1
- package/dist/client/app/telemetry/index.d.ts +11 -1
- package/dist/client/app/telemetry/index.js +1 -1
- package/dist/client/browser-entry.js +5 -5
- package/dist/client/constants/ai-search.d.ts +30 -0
- package/dist/client/constants/ai-search.js +1 -0
- package/dist/client/constants/index.d.ts +2 -0
- package/dist/client/constants/index.js +1 -0
- package/dist/client/providers/hooks.js +1 -1
- package/dist/client/runtime/loader.js +1 -1
- package/dist/client/types/ai-search.d.ts +73 -0
- package/dist/client/types/ai-search.js +0 -0
- package/dist/client/types/index.d.ts +1 -0
- package/dist/config/env-config.d.ts +17 -0
- package/dist/config/env-config.js +1 -0
- package/dist/config/env-schema.d.ts +242 -0
- package/dist/config/env-schema.js +3 -0
- package/dist/config/env-schemas/api-urls.d.ts +24 -0
- package/dist/config/env-schemas/api-urls.js +1 -0
- package/dist/config/env-schemas/auth.d.ts +42 -0
- package/dist/config/env-schemas/auth.js +1 -0
- package/dist/config/env-schemas/catalog.d.ts +12 -0
- package/dist/config/env-schemas/catalog.js +1 -0
- package/dist/config/env-schemas/database.d.ts +15 -0
- package/dist/config/env-schemas/database.js +1 -0
- package/dist/config/env-schemas/environment-detection.d.ts +24 -0
- package/dist/config/env-schemas/environment-detection.js +1 -0
- package/dist/config/env-schemas/feature-flags.d.ts +24 -0
- package/dist/config/env-schemas/feature-flags.js +1 -0
- package/dist/config/env-schemas/organization-project.d.ts +27 -0
- package/dist/config/env-schemas/organization-project.js +1 -0
- package/dist/config/env-schemas/scorecards.d.ts +12 -0
- package/dist/config/env-schemas/scorecards.js +1 -0
- package/dist/config/env-schemas/search.d.ts +21 -0
- package/dist/config/env-schemas/search.js +1 -0
- package/dist/config/env-schemas/server-config.d.ts +51 -0
- package/dist/config/env-schemas/server-config.js +1 -0
- package/dist/config/env-schemas/site.d.ts +12 -0
- package/dist/config/env-schemas/site.js +1 -0
- package/dist/config/env-schemas/ssr.d.ts +18 -0
- package/dist/config/env-schemas/ssr.js +1 -0
- package/dist/config/env-schemas/telemetry.d.ts +15 -0
- package/dist/config/env-schemas/telemetry.js +1 -0
- package/dist/config/env-schemas/test.d.ts +22 -0
- package/dist/config/env-schemas/test.js +1 -0
- package/dist/constants/common.d.ts +4 -2
- package/dist/constants/common.js +1 -1
- package/dist/constants/l10n/langs/ar.js +1 -1
- package/dist/constants/l10n/langs/de.js +1 -1
- package/dist/constants/l10n/langs/en.js +1 -1
- package/dist/constants/l10n/langs/es.js +1 -1
- package/dist/constants/l10n/langs/fr.js +1 -1
- package/dist/constants/l10n/langs/hi.js +1 -1
- package/dist/constants/l10n/langs/it.js +1 -1
- package/dist/constants/l10n/langs/ja.js +1 -1
- package/dist/constants/l10n/langs/ko.js +1 -1
- package/dist/constants/l10n/langs/pl.js +1 -1
- package/dist/constants/l10n/langs/pt-BR.js +1 -1
- package/dist/constants/l10n/langs/pt.js +1 -1
- package/dist/constants/l10n/langs/ru.js +1 -1
- package/dist/constants/l10n/langs/uk.js +1 -1
- package/dist/constants/l10n/langs/zh.js +1 -1
- package/dist/server/api-routes/execute-api-route.js +1 -1
- package/dist/server/api-routes/import-api-routes-handlers.js +1 -1
- package/dist/server/api-routes/run-api-routes-worker.js +1 -1
- package/dist/server/constants/common.js +1 -1
- package/dist/server/constants/plugins/catalog-entities.d.ts +1 -0
- package/dist/server/constants/plugins/catalog-entities.js +1 -1
- package/dist/server/entitlements/entitlements-provider.js +1 -1
- package/dist/server/esbuild/esbuild-logger.js +2 -2
- package/dist/server/esbuild/esbuild.js +3 -3
- package/dist/server/esbuild/plugins/assets-resolver.js +1 -1
- package/dist/server/esbuild/plugins/esbuild-compile-resolver.js +1 -1
- package/dist/server/esbuild/plugins/styled-components-ssr.js +1 -1
- package/dist/server/fs/cache.js +1 -1
- package/dist/server/fs/content-fs.d.ts +1 -0
- package/dist/server/fs/content-fs.js +1 -1
- package/dist/server/fs/last-modified-tracker.js +1 -1
- package/dist/server/fs/utils/is-loader-cache-enabled.js +1 -1
- package/dist/server/node-bundle-entry.js +1 -1
- package/dist/server/persistence/kv/repositories/kv-remote-repository.d.ts +1 -0
- package/dist/server/persistence/kv/repositories/kv-remote-repository.js +2 -1
- package/dist/server/persistence/kv/services/kv-service.js +1 -1
- package/dist/server/plugins/analytics/adobe/index.js +1 -1
- package/dist/server/plugins/analytics/amplitude/index.js +1 -1
- package/dist/server/plugins/analytics/fullstory/index.js +1 -1
- package/dist/server/plugins/analytics/ga/index.js +1 -1
- package/dist/server/plugins/analytics/gtm/browser-hooks.js +1 -1
- package/dist/server/plugins/analytics/gtm/index.js +1 -1
- package/dist/server/plugins/analytics/heap/index.js +1 -1
- package/dist/server/plugins/analytics/rudderstack/index.js +1 -1
- package/dist/server/plugins/analytics/segment/index.js +1 -1
- package/dist/server/plugins/asyncapi-docs/asyncapi-doc-loader.js +3 -3
- package/dist/server/plugins/asyncapi-docs/get-server-props.js +1 -1
- package/dist/server/plugins/asyncapi-docs/index.js +1 -1
- package/dist/server/plugins/asyncapi-docs/search/schema-processor.js +1 -1
- package/dist/server/plugins/asyncapi-docs/search/search-resolver.js +1 -1
- package/dist/server/plugins/asyncapi-docs/store-definition-bundles.js +1 -1
- package/dist/server/plugins/asyncapi-docs/template/AsyncApiDocs.d.ts +2 -1
- package/dist/server/plugins/asyncapi-docs/template/AsyncApiDocs.js +9 -3
- package/dist/server/plugins/catalog-classic/get-server-props.d.ts +8 -3
- package/dist/server/plugins/catalog-classic/get-server-props.js +1 -1
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +38 -64
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-attributes-db-record.d.ts +8 -0
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-attributes-db-record.js +1 -0
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.d.ts +2 -1
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-read-model.js +1 -1
- package/dist/server/plugins/catalog-entities/database/mappers/{create-entity-relation.d.ts → create-entity-relation-read-model.d.ts} +2 -2
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-read-model.js +1 -0
- package/dist/server/plugins/catalog-entities/database/mappers/map-entity-relation-row.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.d.ts +27 -0
- package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/common/version-repository.d.ts +36 -0
- package/dist/server/plugins/catalog-entities/database/repositories/common/version-repository.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.d.ts +15 -4
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.js +38 -27
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +36 -9
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +37 -21
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +41 -42
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.d.ts +3 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.d.ts +7 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.d.ts +5 -9
- package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/utils/build-entities-exclusion-filter.d.ts +13 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/build-entities-exclusion-filter.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/build-rbac-filter.d.ts +31 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/build-rbac-filter.js +9 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/create-merged-entity-fields-for-select.d.ts +34 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/create-merged-entity-fields-for-select.js +13 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/normalize-revision-flags.d.ts +23 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/normalize-revision-flags.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/semantic-version-sort.d.ts +78 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/semantic-version-sort.js +34 -0
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.js +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.js +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.d.ts +6 -4
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.js +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.js +2 -2
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.d.ts +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.js +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/fs-entities-extractor.js +1 -1
- package/dist/server/plugins/catalog-entities/get-server-props.js +1 -1
- package/dist/server/plugins/catalog-entities/plugin.js +1 -1
- package/dist/server/plugins/catalog-entities/schemas/database-schemas.d.ts +3 -0
- package/dist/server/plugins/catalog-entities/schemas/database-schemas.js +1 -1
- package/dist/server/plugins/catalog-entities/schemas/dto-schemas.d.ts +15 -1
- package/dist/server/plugins/catalog-entities/schemas/dto-schemas.js +1 -1
- package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.d.ts +26 -164
- package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.js +0 -1
- package/dist/server/plugins/catalog-entities/types/extractors.d.ts +4 -4
- package/dist/server/plugins/catalog-entities/types/openapi.d.ts +11 -0
- package/dist/server/plugins/catalog-entities/types/openapi.js +0 -0
- package/dist/server/plugins/catalog-entities/types/params.d.ts +6 -0
- package/dist/server/plugins/catalog-entities/types/params.js +0 -0
- package/dist/server/plugins/catalog-entities/utils/ajv-validator.js +1 -1
- package/dist/server/plugins/catalog-entities/utils/catalog-data-collector.js +1 -1
- package/dist/server/plugins/catalog-entities/utils/get-not-accessible-catalog-resources.d.ts +11 -0
- package/dist/server/plugins/catalog-entities/utils/get-not-accessible-catalog-resources.js +1 -0
- package/dist/server/plugins/config-parser/index.js +1 -1
- package/dist/server/plugins/config-parser/loaders/content-slugs-loader.js +1 -1
- package/dist/server/plugins/config-parser/loaders/nearest-redocly-config-loader.js +1 -1
- package/dist/server/plugins/config-parser/loaders/utils/read-and-validate-config.js +1 -1
- package/dist/server/plugins/default-theme/index.js +1 -1
- package/dist/server/plugins/entitlements/index.js +1 -1
- package/dist/server/plugins/graphql-docs/graphql-doc-loader.js +1 -1
- package/dist/server/plugins/graphql-docs/index.js +1 -1
- package/dist/server/plugins/graphql-docs/search/search-resolver.js +1 -1
- package/dist/server/plugins/graphql-docs/template/GraphQLDocs.js +6 -2
- package/dist/server/plugins/lifecycle.js +2 -2
- package/dist/server/plugins/markdown/attribute-resolvers/resolve-link.js +1 -1
- package/dist/server/plugins/markdown/compiler.d.ts +1 -0
- package/dist/server/plugins/markdown/compiler.js +1 -1
- package/dist/server/plugins/markdown/index.js +1 -1
- package/dist/server/plugins/markdown/is-partial.d.ts +1 -1
- package/dist/server/plugins/markdown/is-partial.js +1 -1
- package/dist/server/plugins/markdown/markdoc/import-user-tags.js +1 -1
- package/dist/server/plugins/markdown/markdoc/plugins/render-mermaid.js +1 -1
- package/dist/server/plugins/markdown/markdoc/resolve-raw-partials.d.ts +1 -1
- package/dist/server/plugins/markdown/markdoc/resolve-raw-partials.js +2 -2
- package/dist/server/plugins/markdown/markdown-static-data-loader.js +1 -1
- package/dist/server/plugins/mcp/auth/auth-handlers.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/docs-mcp-tool.d.ts +54 -0
- package/dist/server/plugins/mcp/docs-mcp/tools/docs-mcp-tool.js +1 -0
- package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.d.ts +9 -8
- package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.d.ts +9 -8
- package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.d.ts +9 -8
- package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.d.ts +9 -8
- package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/index.d.ts +7 -13
- package/dist/server/plugins/mcp/docs-mcp/tools/index.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.d.ts +9 -6
- package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/search.d.ts +9 -2
- package/dist/server/plugins/mcp/docs-mcp/tools/search.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/utils.d.ts +2 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/utils.js +6 -6
- package/dist/server/plugins/mcp/docs-mcp/tools/whoami.d.ts +9 -2
- package/dist/server/plugins/mcp/docs-mcp/tools/whoami.js +1 -1
- package/dist/server/plugins/mcp/handlers/docs-mcp-handler.js +1 -1
- package/dist/server/plugins/mcp/handlers/errors.js +1 -1
- package/dist/server/plugins/mcp/handlers/handle-mcp-request.d.ts +5 -0
- package/dist/server/plugins/mcp/handlers/handle-mcp-request.js +1 -0
- package/dist/server/plugins/mcp/handlers/mcp-request-handler.d.ts +0 -1
- package/dist/server/plugins/mcp/handlers/mcp-request-handler.js +1 -1
- package/dist/server/plugins/mcp/servers/base-server.js +1 -1
- package/dist/server/plugins/mcp/types.d.ts +40 -0
- package/dist/server/plugins/mcp/workers/execute-mcp-tool.d.ts +3 -0
- package/dist/server/plugins/mcp/workers/execute-mcp-tool.js +1 -0
- package/dist/server/plugins/nav-utils.d.ts +1 -1
- package/dist/server/plugins/nav-utils.js +1 -1
- package/dist/server/plugins/openapi-docs/decorators.d.ts +3 -0
- package/dist/server/plugins/openapi-docs/decorators.js +1 -1
- package/dist/server/plugins/openapi-docs/get-server-props-custom-fields.d.ts +2 -4
- package/dist/server/plugins/openapi-docs/get-server-props-custom-fields.js +1 -1
- package/dist/server/plugins/openapi-docs/get-server-props.js +1 -1
- package/dist/server/plugins/openapi-docs/index.js +1 -1
- package/dist/server/plugins/openapi-docs/load-definition.d.ts +1 -0
- package/dist/server/plugins/openapi-docs/load-definition.js +3 -3
- package/dist/server/plugins/openapi-docs/openrpc-converter.d.ts +2 -0
- package/dist/server/plugins/openapi-docs/openrpc-converter.js +1 -0
- package/dist/server/plugins/openapi-docs/search/search-resolver.js +1 -1
- package/dist/server/plugins/openapi-docs/search-indexer.js +1 -1
- package/dist/server/plugins/openapi-docs/store-definition-bundles.js +1 -1
- package/dist/server/plugins/openapi-docs/template/OpenAPIDocs.js +8 -4
- package/dist/server/plugins/openapi-docs/template/helpers.d.ts +2 -2
- package/dist/server/plugins/openapi-docs/template/helpers.js +3 -3
- package/dist/server/plugins/openapi-docs/utils.d.ts +1 -0
- package/dist/server/plugins/scorecard-classic/compute-scorecard.d.ts +2 -1
- package/dist/server/plugins/scorecard-classic/compute-scorecard.js +4 -4
- package/dist/server/plugins/scorecard-classic/get-scorecard-config.d.ts +2 -1
- package/dist/server/plugins/scorecard-classic/index.js +1 -1
- package/dist/server/plugins/scorecard-classic/lint.d.ts +1 -1
- package/dist/server/plugins/scorecard-classic/lint.js +1 -1
- package/dist/server/plugins/scorecard-classic/loaders/scorecard-config.js +1 -1
- package/dist/server/plugins/scorecard-classic/loaders/scorecard.d.ts +6 -4
- package/dist/server/plugins/scorecard-classic/loaders/scorecard.js +1 -1
- package/dist/server/plugins/scorecard-classic/shared-utils.d.ts +1 -1
- package/dist/server/plugins/scorecard-classic/shared-utils.js +1 -1
- package/dist/server/plugins/scorecard-classic/template/Grid/Grid.d.ts +2 -1
- package/dist/server/plugins/scorecard-classic/template/Grid/Grid.js +3 -3
- package/dist/server/plugins/scorecard-classic/template/LevelIndicator.d.ts +1 -0
- package/dist/server/plugins/scorecard-classic/template/LevelIndicator.js +3 -3
- package/dist/server/plugins/scorecard-classic/template/components.js +1 -1
- package/dist/server/plugins/scorecard-classic/template/index.styles.d.ts +1 -0
- package/dist/server/plugins/scorecard-classic/template/index.styles.js +93 -19
- package/dist/server/plugins/scorecard-classic/template/index.types.d.ts +5 -1
- package/dist/server/plugins/scorecard-classic/template/useData.js +1 -1
- package/dist/server/plugins/scorecard-classic/template/views.js +1 -1
- package/dist/server/plugins/scorecard-classic/types.d.ts +5 -3
- package/dist/server/plugins/scorecard-classic/types.js +1 -1
- package/dist/server/plugins/scorecards/database/repositories/local/scorecards-config-local-repository.d.ts +12 -0
- package/dist/server/plugins/scorecards/database/repositories/local/scorecards-config-local-repository.js +1 -0
- package/dist/server/plugins/scorecards/database/scorecards-config-service.d.ts +11 -0
- package/dist/server/plugins/scorecards/database/scorecards-config-service.js +1 -0
- package/dist/server/plugins/scorecards/plugin.js +1 -1
- package/dist/server/plugins/scorecards/workers/run-scorecards-worker.d.ts +2 -1
- package/dist/server/plugins/scorecards/workers/run-scorecards-worker.js +1 -1
- package/dist/server/plugins/scorecards/workers/scorecards.d.ts +1 -12
- package/dist/server/plugins/scorecards/workers/scorecards.js +1 -1
- package/dist/server/plugins/search/ai-indexer/prepare-ai-search-documents.js +1 -1
- package/dist/server/plugins/search/documents/search-documents.js +1 -1
- package/dist/server/plugins/search/engines/flexsearch/index.js +1 -1
- package/dist/server/plugins/search/engines/typesense/index.js +1 -1
- package/dist/server/plugins/search/index.js +1 -1
- package/dist/server/plugins/search/llmstxt/index.js +5 -5
- package/dist/server/plugins/search/utils.js +2 -2
- package/dist/server/plugins/sidebars/index.d.ts +0 -2
- package/dist/server/plugins/sidebars/index.js +3 -3
- package/dist/server/plugins/sso/index.js +1 -1
- package/dist/server/providers/database/base-repository.d.ts +1 -0
- package/dist/server/providers/database/base-repository.js +1 -1
- package/dist/server/providers/database/database-connection-factory.js +1 -1
- package/dist/server/providers/database/database-preconnect-service.js +1 -1
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/0005_catalog-relations-constraint-fix.sql +2 -0
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/0006_add-catalog-entitities-attributes-table.sql +11 -0
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0005_snapshot.json +393 -0
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0006_snapshot.json +458 -0
- package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/_journal.json +14 -0
- package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.d.ts +143 -0
- package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-attributes-table.js +1 -0
- package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js +1 -1
- package/dist/server/providers/database/databases/main-sqlite/migrations/0006_change-scorecards-config-timestamps-field-types.sql +19 -0
- package/dist/server/providers/database/databases/main-sqlite/migrations/meta/0006_snapshot.json +261 -0
- package/dist/server/providers/database/databases/main-sqlite/migrations/meta/_journal.json +7 -0
- package/dist/server/providers/database/databases/main-sqlite/schemas/scorecards-config-table.d.ts +24 -18
- package/dist/server/providers/database/databases/main-sqlite/schemas/scorecards-config-table.js +1 -1
- package/dist/server/providers/database/databases/sqld-sqlite/drizzle.config.js +1 -1
- package/dist/server/providers/database/databases/sqld-sqlite/migrations/0007_catalog-relations-constraint-fix.sql +2 -0
- package/dist/server/providers/database/databases/sqld-sqlite/migrations/0008_add-catalog-entitities-attributes-table.sql +11 -0
- package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/0007_snapshot.json +833 -0
- package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/0008_snapshot.json +898 -0
- package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/_journal.json +14 -0
- package/dist/server/providers/database/pagination/entities-to-filter.d.ts +15 -0
- package/dist/server/providers/database/pagination/entities-to-filter.js +1 -0
- package/dist/server/providers/database/pagination/utils/index.d.ts +4 -0
- package/dist/server/providers/database/pagination/utils/index.js +1 -1
- package/dist/server/providers/database/pagination/utils/is-nested-condition.d.ts +16 -0
- package/dist/server/providers/database/pagination/utils/is-nested-condition.js +1 -0
- package/dist/server/providers/database/pagination/utils/is-simple-condition.d.ts +18 -0
- package/dist/server/providers/database/pagination/utils/is-simple-condition.js +1 -0
- package/dist/server/providers/database/pagination/utils/map-operator.d.ts +10 -0
- package/dist/server/providers/database/pagination/utils/map-operator.js +1 -0
- package/dist/server/providers/database/pagination/utils/transform-condition.d.ts +12 -0
- package/dist/server/providers/database/pagination/utils/transform-condition.js +1 -0
- package/dist/server/ssr/render.js +1 -1
- package/dist/server/ssr/server-side-props/get-server-props-from-user-handler.js +1 -1
- package/dist/server/ssr/utils.js +8 -8
- package/dist/server/store.d.ts +14 -6
- package/dist/server/store.js +1 -1
- package/dist/server/telemetry/index.js +1 -1
- package/dist/server/tools/notifiers/formatter.js +3 -3
- package/dist/server/tools/notifiers/helpers/colors.js +1 -1
- package/dist/server/tools/notifiers/logger.js +2 -2
- package/dist/server/tools/notifiers/reporter.js +9 -9
- package/dist/server/tools/notifiers/terminal-manager.js +4 -4
- package/dist/server/types/plugins/common.d.ts +7 -1
- package/dist/server/types/plugins/markdown.d.ts +2 -0
- package/dist/server/types/plugins/scorecards.d.ts +30 -0
- package/dist/server/types/plugins/scorecards.js +0 -0
- package/dist/server/utils/envs/get-api-route-allowed-env-variables.js +1 -1
- package/dist/server/utils/envs/load-env-variables.d.ts +1 -1
- package/dist/server/utils/envs/load-env-variables.js +1 -1
- package/dist/server/utils/envs/sanitize-branch-name.d.ts +6 -0
- package/dist/server/utils/envs/sanitize-branch-name.js +1 -0
- package/dist/server/utils/globs.js +1 -1
- package/dist/server/utils/is-catalog-entities-enabled.js +1 -1
- package/dist/server/utils/is-scorecards-enabled.js +1 -1
- package/dist/server/utils/lifecycle-hooks.js +1 -1
- package/dist/server/utils/rbac.d.ts +76 -7
- package/dist/server/utils/rbac.js +1 -1
- package/dist/server/utils/report-all-errors.js +1 -1
- package/dist/server/utils/set-execution-mode.d.ts +5 -0
- package/dist/server/utils/set-execution-mode.js +1 -0
- package/dist/server/utils/time/with-timestamp.d.ts +42 -10
- package/dist/server/utils/time/with-timestamp.js +1 -1
- package/dist/server/version.js +1 -1
- package/dist/server/web-server/auth.js +3 -3
- package/dist/server/web-server/dev-server.js +1 -1
- package/dist/server/web-server/handle-api-route-request.js +1 -1
- package/dist/server/web-server/http.js +2 -2
- package/dist/server/web-server/middleware/apiKeyMiddleware.js +1 -1
- package/dist/server/web-server/middleware/catalogAuthMiddleware.d.ts +4 -6
- package/dist/server/web-server/middleware/catalogAuthMiddleware.js +1 -1
- package/dist/server/web-server/middleware/corsMiddleware.js +1 -1
- package/dist/server/web-server/middleware/dynamic-middleware/dynamic-middleware.js +1 -1
- package/dist/server/web-server/middleware/idleTimeoutMiddleware.js +1 -1
- package/dist/server/web-server/routes/ask-ai.js +1 -1
- package/dist/server/web-server/routes/auth.js +1 -1
- package/dist/server/web-server/routes/catalog/bff-catalog-related-entities.js +1 -1
- package/dist/server/web-server/routes/catalog/bff-catalog.js +1 -1
- package/dist/server/web-server/routes/catalog/catalog-relations.js +1 -1
- package/dist/server/web-server/routes/catalog/catalog.js +1 -1
- package/dist/server/web-server/routes/catalog/dto/read-entity-dto.d.ts +3 -0
- package/dist/server/web-server/routes/catalog/dto/read-entity-dto.js +0 -0
- package/dist/server/web-server/routes/catalog/helpers/create-entity-relation-update-schema.d.ts +43 -0
- package/dist/server/web-server/routes/catalog/helpers/create-entity-relation-update-schema.js +1 -0
- package/dist/server/web-server/routes/catalog/helpers/create-entity-schema.d.ts +6823 -0
- package/dist/server/web-server/routes/catalog/helpers/create-entity-schema.js +1 -0
- package/dist/server/web-server/routes/catalog/helpers/create-entity-update-schema.d.ts +1102 -0
- package/dist/server/web-server/routes/catalog/helpers/create-entity-update-schema.js +1 -0
- package/dist/server/web-server/routes/catalog/helpers/has-access-to-entity.d.ts +10 -0
- package/dist/server/web-server/routes/catalog/helpers/has-access-to-entity.js +1 -0
- package/dist/server/web-server/routes/catalog/mappers/map-entity-read-model-schema-to-entity-read-dto.d.ts +4 -0
- package/dist/server/web-server/routes/catalog/mappers/map-entity-read-model-schema-to-entity-read-dto.js +1 -0
- package/dist/server/web-server/routes/catalog/parsers/entities/parse-entities.d.ts +4 -0
- package/dist/server/web-server/routes/catalog/parsers/entities/parse-entities.js +1 -0
- package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity-update-data.d.ts +4 -0
- package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity-update-data.js +1 -0
- package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity.d.ts +4 -0
- package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity.js +1 -0
- package/dist/server/web-server/routes/catalog/parsers/relations/parse-entities-relations.d.ts +13 -0
- package/dist/server/web-server/routes/catalog/parsers/relations/parse-entities-relations.js +1 -0
- package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation-update-data.d.ts +13 -0
- package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation-update-data.js +1 -0
- package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation.d.ts +13 -0
- package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation.js +1 -0
- package/dist/server/web-server/routes/dynamic-route.js +1 -1
- package/dist/server/web-server/routes/error.js +1 -1
- package/dist/server/web-server/routes/helpers/get-current-rbac-teams.d.ts +3 -0
- package/dist/server/web-server/routes/helpers/get-current-rbac-teams.js +1 -0
- package/dist/server/web-server/routes/helpers/get-rbac-restrictions-data-for-catalog.d.ts +11 -0
- package/dist/server/web-server/routes/helpers/get-rbac-restrictions-data-for-catalog.js +1 -0
- package/dist/server/web-server/routes/index.js +1 -1
- package/dist/server/web-server/routes/info.js +1 -1
- package/dist/server/web-server/routes/mcp-oauth.js +1 -1
- package/dist/server/web-server/routes/otel/otel.js +1 -1
- package/dist/server/web-server/routes/page-data.js +1 -1
- package/dist/server/web-server/routes/path-prefix-redirect.js +1 -1
- package/dist/server/web-server/utils.d.ts +2 -2
- package/dist/server/workers/mcp-tool-worker-pool.d.ts +4 -0
- package/dist/server/workers/mcp-tool-worker-pool.js +1 -0
- package/dist/server/workers/mcp-tool-worker.d.ts +2 -0
- package/dist/server/workers/mcp-tool-worker.js +1 -0
- package/dist/server/workers/types.d.ts +7 -1
- package/dist/server/workers/worker-pool.js +1 -1
- package/package.json +19 -21
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation.js +0 -1
- package/dist/server/plugins/catalog-entities/entities/validate-entity.d.ts +0 -6
- package/dist/server/plugins/catalog-entities/entities/validate-entity.js +0 -1
- package/dist/server/plugins/mcp/workers/run-api-routes-worker.d.ts +0 -5
- package/dist/server/plugins/mcp/workers/run-api-routes-worker.js +0 -1
- package/dist/server/utils/envs/is-build-mode.d.ts +0 -2
- package/dist/server/utils/envs/is-build-mode.js +0 -1
- package/dist/server/utils/envs/is-develop-mode.d.ts +0 -7
- package/dist/server/utils/envs/is-develop-mode.js +0 -1
- package/dist/server/utils/envs/is-production-mode.d.ts +0 -10
- package/dist/server/utils/envs/is-production-mode.js +0 -1
- package/dist/server/workers/mcp-worker-pool.d.ts +0 -4
- package/dist/server/workers/mcp-worker-pool.js +0 -1
- package/dist/utils/env/is-local-development.d.ts +0 -13
- package/dist/utils/env/is-local-development.js +0 -1
- package/dist/utils/env/is-production.d.ts +0 -13
- package/dist/utils/env/is-production.js +0 -1
- package/dist/utils/env/is-web-view.d.ts +0 -14
- package/dist/utils/env/is-web-view.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{DocsMcpTool as s}from"./docs-mcp-tool.js";const r={type:"object",required:["name"],additionalProperties:!1,properties:{name:{type:"string",description:"API name",minLength:1}}};class a extends s{name="get-full-api-description";description="Get the complete OpenAPI description";requiredContext=["outdir","accessInfo"];constructor(){super(r)}async executeAction(i,n){const{name:o}=i,e=await this.getApiDefinition(o,n);if(!e.success)return e.response;const{definition:t}=e;return{content:[{type:"text",text:JSON.stringify({api:t.info?.title||"",version:t.info?.version||"",definition:t},null,2)}]}}}export{a as GetFullApiDescriptionTool};
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import
|
|
3
|
-
export declare
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import type { McpToolWorkerParams, McpToolWorkerResponse, ToolArgsMap } from '../../types.js';
|
|
2
|
+
import { DocsMcpTool, type ContextKey } from './docs-mcp-tool.js';
|
|
3
|
+
export declare class GetSecuritySchemesTool extends DocsMcpTool<'get-security-schemes'> {
|
|
4
|
+
readonly name = "get-security-schemes";
|
|
5
|
+
readonly description = "Get the security schemes for a specific API";
|
|
6
|
+
readonly requiredContext: readonly ContextKey[];
|
|
7
|
+
constructor();
|
|
8
|
+
protected executeAction(args: ToolArgsMap['get-security-schemes'], context: McpToolWorkerParams['context']): Promise<McpToolWorkerResponse>;
|
|
9
|
+
}
|
|
9
10
|
//# sourceMappingURL=get-security-schemes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{DocsMcpTool as c}from"./docs-mcp-tool.js";const o={type:"object",required:["name"],additionalProperties:!1,properties:{name:{type:"string",description:"API name",minLength:1}}};class p extends c{name="get-security-schemes";description="Get the security schemes for a specific API";requiredContext=["outdir","accessInfo"];constructor(){super(o)}async executeAction(s,i){const{name:n}=s,t=await this.getApiDefinition(n,i);if(!t.success)return t.response;const{definition:e}=t;return{content:[{type:"text",text:JSON.stringify({name:e.info?.title,version:e.info?.version,securitySchemes:e.components?.securitySchemes||[],security:e.security||[]},null,2)}]}}}export{p as GetSecuritySchemesTool};
|
|
@@ -1,14 +1,8 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export
|
|
7
|
-
|
|
8
|
-
baseUrl: string;
|
|
9
|
-
outdir: string;
|
|
10
|
-
apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
|
|
11
|
-
accessInfo: AccessInfo;
|
|
12
|
-
headers?: Record<string, string | string[] | undefined>;
|
|
13
|
-
}): void;
|
|
1
|
+
import type { ToolArgsMap } from '../../types.js';
|
|
2
|
+
import type { DocsMcpTool, DocsMcpToolRegistrationOptions } from './docs-mcp-tool.js';
|
|
3
|
+
export declare const docsTools: DocsMcpTool<keyof ToolArgsMap>[];
|
|
4
|
+
export declare function registerDocsTools(options: DocsMcpToolRegistrationOptions): void;
|
|
5
|
+
export declare function getDocsTool<T extends keyof ToolArgsMap>(name: T): DocsMcpTool<T> | undefined;
|
|
6
|
+
export { DocsMcpTool } from './docs-mcp-tool.js';
|
|
7
|
+
export type { DocsMcpToolRegistrationOptions } from './docs-mcp-tool.js';
|
|
14
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{GetEndpointInfoTool as t}from"./get-endpoint-info.js";import{GetEndpointsTool as n}from"./get-endpoints.js";import{GetFullApiDescriptionTool as i}from"./get-full-api-description.js";import{GetSecuritySchemesTool as m}from"./get-security-schemes.js";import{ListApisTool as s}from"./list-apis.js";import{SearchTool as c}from"./search.js";import{WhoAmITool as p}from"./whoami.js";import{shouldHandleMcpAuth as f}from"../../auth/auth-handlers.js";const e=[new s,new n,new t,new m,new i,new c,new p],l=e.reduce((o,r)=>(o[r.name]=r,o),{});function A(o){e.forEach(r=>{r.name==="whoami"&&!f(o.accessInfo.requiresLogin,o.accessInfo.rbac)||r.register(o)})}function D(o){return l[o]}import{DocsMcpTool as E}from"./docs-mcp-tool.js";export{E as DocsMcpTool,e as docsTools,D as getDocsTool,A as registerDocsTools};
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type
|
|
3
|
-
export declare
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import type { McpToolWorkerParams, McpToolWorkerResponse, ToolArgsMap } from '../../types.js';
|
|
2
|
+
import { DocsMcpTool, type ContextKey } from './docs-mcp-tool.js';
|
|
3
|
+
export declare class ListApisTool extends DocsMcpTool<'list-apis'> {
|
|
4
|
+
readonly name = "list-apis";
|
|
5
|
+
readonly description = "Lists available APIs with their context and purpose";
|
|
6
|
+
readonly requiredContext: readonly ContextKey[];
|
|
7
|
+
constructor();
|
|
8
|
+
protected executeAction(args: ToolArgsMap['list-apis'], context: McpToolWorkerParams['context']): Promise<McpToolWorkerResponse>;
|
|
9
|
+
}
|
|
7
10
|
//# sourceMappingURL=list-apis.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{filterApiDescriptionsByName as u}from"../utils.js";import{DocsMcpTool as m}from"./docs-mcp-tool.js";const d={type:"object",additionalProperties:!1,required:[],properties:{filter:{type:"string",description:"API name (or part of it)",minLength:1,nullable:!0},page:{type:"number",description:"Page number",minimum:1,default:1,nullable:!0},limit:{type:"number",description:"Number of APIs per page. Default is 300",minimum:1,default:300,nullable:!0}}};class y extends m{name="list-apis";description="Lists available APIs with their context and purpose";requiredContext=[];constructor(){super(d)}async executeAction(s,o){const{filter:i,page:n=1,limit:e=300}=s;let t=Object.values(o.apiDescriptionsMap);i&&(t=u(t,i));const r=(n-1)*e,a=r+e,l=Math.ceil(t.length/e),p=t.length;return t=t.slice(r,a),t.length===0?{content:[{type:"text",text:"No APIs available"}]}:{content:[{type:"text",text:JSON.stringify({items:t.map(({relativePath:b,...c})=>c),limit:e,total:p,page:n,totalPages:l})}]}}}export{y as ListApisTool};
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
1
|
+
import type { McpToolWorkerParams, McpToolWorkerResponse, ToolArgsMap } from '../../types.js';
|
|
2
|
+
import { DocsMcpTool, type ContextKey } from './docs-mcp-tool.js';
|
|
3
|
+
export declare class SearchTool extends DocsMcpTool<'search'> {
|
|
4
|
+
readonly name = "search";
|
|
5
|
+
readonly description = "Search across the documentation to fetch relevant content for a given query";
|
|
6
|
+
readonly requiredContext: readonly ContextKey[];
|
|
7
|
+
constructor();
|
|
8
|
+
protected executeAction(args: ToolArgsMap['search'], context: McpToolWorkerParams['context']): Promise<McpToolWorkerResponse>;
|
|
9
|
+
}
|
|
3
10
|
//# sourceMappingURL=search.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{withPathPrefix as
|
|
1
|
+
import{withPathPrefix as d}from"@redocly/theme/core/utils";import{ServerRoutes as p}from"../../../../../constants/common.js";import{DocsMcpTool as l}from"./docs-mcp-tool.js";import{processDocuments as m}from"./utils.js";const f={type:"object",required:["query"],additionalProperties:!1,properties:{query:{type:"string",description:"Search query. Should be a single word or that phrase that is presented in a documentation.",minLength:1}}};class g extends l{name="search";description="Search across the documentation to fetch relevant content for a given query";requiredContext=["baseUrl","outdir","headers"];constructor(){super(f)}async executeAction(a,e){const{query:i}=a;if(!e.baseUrl||!e.outdir)throw new Error("Missing required context: baseUrl and outdir");const c=JSON.stringify({query:i});let t=`${e.baseUrl}${d(p.SEARCH)}`;t.startsWith("http://")&&(t=t.replace(/^http:\/\//,"https://"));const o=e.headers?.authorization,s=o?`authorization=${String(o).replace(/^Bearer /,"")}`:"",r=await fetch(t,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",...s?{Cookie:s}:{}},body:c});if(!r.ok){const u=await r.text().catch(()=>"Unable to read error response");throw new Error(`Search request failed with status ${r.status}: ${u}`)}const h=await r.json(),n=m(h.documents||{},e.outdir);return{content:[{type:"text",text:n.trim().length?n:"No results found."}]}}}export{g as SearchTool};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { OpenAPIDefinition, OpenAPIOperation } from '@redocly/openapi-docs';
|
|
2
2
|
import type { SearchItemData } from '@redocly/theme/core/types';
|
|
3
|
-
import type { AccessInfo } from '../../types';
|
|
3
|
+
import type { AccessInfo, McpEndpoint } from '../../types';
|
|
4
|
+
export declare function isMcpEndpoint(value: unknown): value is McpEndpoint;
|
|
4
5
|
type EndpointInfo = Pick<OpenAPIOperation, 'summary' | 'description' | 'security'> & {
|
|
5
6
|
method: string;
|
|
6
7
|
path: string;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import y from"node:fs";import u from"node:path";import{existsSync as
|
|
1
|
+
import y from"node:fs";import u from"node:path";import{existsSync as j}from"node:fs";import{readFile as A}from"node:fs/promises";import{replaceFileExtension as O}from"../../../../plugins/openapi-docs/store-definition-bundles";import{PUBLIC_API_DEFINITIONS_FOLDER as b}from"../../../../constants/common";import{filterDataByAccessDeep as g}from"../../../../utils/rbac";import{checkEndpointAndDeleteXMcp as E}from"../../utils/xmcp-utils.js";import{MAX_DOCUMENTS_PER_CATEGORY as F}from"../../constants.js";function N(e){return typeof e=="object"&&e!==null&&"responses"in e&&typeof e.responses=="object"}function T(e){const{paths:i={}}=e,s=[];for(const[c,r]of Object.entries(i)){const p=!E(r,"docs");for(const[a,t]of Object.entries(r))p||!E(t,"docs")||s.push({path:c,method:a.toUpperCase(),summary:t.summary,description:t.description,security:t.security})}return s}function R(e,i){return Object.entries(e).map(([c,r])=>{if(!r||r.length===0)return"";const p=r.slice(0,F).map(a=>{const{document:t,highlight:m}=a,d=m?.title||(Array.isArray(t.title)?t.title[0]:t.title);let o=`Document: ${t.title}`;o+=`### [${d}](${t.url})
|
|
2
2
|
|
|
3
|
-
`;let
|
|
3
|
+
`;let f;if(t.url)try{let n=t.url.startsWith("/")?t.url.slice(1):t.url;const l=n.indexOf("#");l!==-1&&(n=n.substring(0,l));const h=u.extname(n);h&&(n=n.slice(0,-h.length));let D=n+".md";const x=u.join(i,D);y.existsSync(x)&&(f=y.readFileSync(x,"utf8"))}catch{}return f||(f=m?.text||(Array.isArray(t.text)?t.text[0]:t.text)),o+=f,t.facets&&(o+=`
|
|
4
4
|
|
|
5
5
|
**Categories:**
|
|
6
|
-
`,Object.entries(t.facets).forEach(([
|
|
7
|
-
`})),
|
|
6
|
+
`,Object.entries(t.facets).forEach(([n,l])=>{o+=`- ${n}: ${l}
|
|
7
|
+
`})),o});return`## ${c}
|
|
8
8
|
|
|
9
|
-
${
|
|
9
|
+
${p}`}).join(`
|
|
10
10
|
|
|
11
|
-
`).trim()}async function
|
|
11
|
+
`).trim()}async function U({relativePath:e,outdir:i,accessInfo:{isAuthenticated:s,email:c,teams:r,rbac:p={},requiresLogin:a=!1}}){const t=u.join(i||"",b,O(e,".json"));if(!j(t))return;const d=await A(t,"utf-8"),o=JSON.parse(d);return g(o,{isAuthenticated:s,email:c,teams:r},p,a)}export{U as getApiDescriptionFromFs,T as getEndpointsFromPaths,N as isMcpEndpoint,R as processDocuments};
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
1
|
+
import type { McpToolWorkerParams, McpToolWorkerResponse, ToolArgsMap } from '../../types.js';
|
|
2
|
+
import { DocsMcpTool, type ContextKey } from './docs-mcp-tool.js';
|
|
3
|
+
export declare class WhoAmITool extends DocsMcpTool<'whoami'> {
|
|
4
|
+
readonly name = "whoami";
|
|
5
|
+
readonly description = "Get information about the currently authenticated user";
|
|
6
|
+
readonly requiredContext: readonly ContextKey[];
|
|
7
|
+
constructor();
|
|
8
|
+
protected executeAction(_args: ToolArgsMap['whoami'], context: McpToolWorkerParams['context']): Promise<McpToolWorkerResponse>;
|
|
9
|
+
}
|
|
3
10
|
//# sourceMappingURL=whoami.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{getUserInfoFromHeaders as r}from"../../utils/jwt.js";import{DocsMcpTool as o}from"./docs-mcp-tool.js";const n={type:"object",required:[],additionalProperties:!1,properties:{}};class u extends o{name="whoami";description="Get information about the currently authenticated user";requiredContext=["headers"];constructor(){super(n)}async executeAction(s,t){const e=r(t.headers||{});return e?{content:[{type:"text",text:JSON.stringify({email:e.email,name:e.name,subject:e.sub,clientId:e.client_id,scope:e.scope,issuedAt:e.iat?new Date(e.iat*1e3).toISOString():void 0,expiresAt:e.exp?new Date(e.exp*1e3).toISOString():void 0})}],isError:!1}:{content:[{type:"text",text:JSON.stringify({error:"Not authenticated",message:"No valid authentication token found. Please authenticate first."})}],isError:!0}}}export{u as WhoAmITool};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createMcpRequestHandler as
|
|
1
|
+
import{createMcpRequestHandler as v}from"./mcp-request-handler.js";import{createDocsMcpServer as D}from"../servers/docs-server.js";import{filterApiDescriptionsByRbac as h}from"../utils.js";import{createInternalServerError as y}from"./errors.js";import{McpServerType as m}from"../constants.js";import{telemetry as f}from"../../../telemetry/index.js";import{constructInvalidTokenResponse as b,constructUnauthorizedResponse as A,handleMcpAuth as L,shouldHandleMcpAuth as S}from"../auth/auth-handlers.js";async function I(r,s,i,n){try{f.initialize();const e=s,t=e?.props?.config?.apiDescriptionsMap||{},a=e?.props?.outdir||"",o=e?.props?.config?.mcpDocsServerName||"Docs MCP server",u=new URL(n.url).origin,{user:c,config:{rbac:p={},mcp:l={}}}=r,d=h(t,c,p,r.config.requiresLogin||!1),g=l.docs?.name||o,M={rbac:p,email:c?.email,teams:c?.teams,isAuthenticated:!!c?.isAuthenticated,requiresLogin:r.config.requiresLogin||!1};return await D({name:g,baseUrl:u,headers:i,apiDescriptionsMap:d,outdir:a,accessInfo:M})}catch(e){throw f.sendMcpErrorMessage([{object:"mcp_server",server_type:m.Docs,message:e?.message||"",stack:e?.stack||""}]),y(e?.message||"Internal server error mcp docs")}}const R=v({createServerInstance:I,serverType:m.Docs}),w=async(r,s,i)=>{const n=!!s?.config?.requiresLogin,e=s?.config?.rbac;if(S(n,e)){const{isAuthenticated:t,isTokenValid:a,currentUser:o}=await L(r,s);if(!t)return A(new URL(r.url).origin);if(!a)return b();o&&(s.user=o)}return R(r,s,i)};var E=w;export{E as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{telemetry as c}from"../../../telemetry/index.js";import{McpErrorCodes as s,McpServerType as d}from"../constants.js";class n extends Error{code;data;requestId;constructor(e,t,o,a){super(t),this.name="McpError",this.code=e,this.data=o,this.requestId=a}createErrorResponse(){const e={jsonrpc:"2.0",error:{code:this.code,message:this.message,...this.data?{data:this.data}:{}},id:this.requestId??null},t=i(this.code);return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":"application/json"}})}}function i(r){switch(r){case s.InvalidRequest:case s.InvalidParams:return 400;case s.MethodNotFound:return 404;case s.ServerError:return 405;case s.InternalError:default:return 500}}function m(r){return new n(s.ServerError,"Method not allowed",void 0,r).createErrorResponse()}function
|
|
1
|
+
import{telemetry as c}from"../../../telemetry/index.js";import{McpErrorCodes as s,McpServerType as d}from"../constants.js";class n extends Error{code;data;requestId;constructor(e,t,o,a){super(t),this.name="McpError",this.code=e,this.data=o,this.requestId=a}createErrorResponse(){const e={jsonrpc:"2.0",error:{code:this.code,message:this.message,...this.data?{data:this.data}:{}},id:this.requestId??null},t=i(this.code);return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":"application/json"}})}}function i(r){switch(r){case s.InvalidRequest:case s.InvalidParams:return 400;case s.MethodNotFound:return 404;case s.ServerError:return 405;case s.InternalError:default:return 500}}function m(r){return new n(s.ServerError,"Method not allowed",void 0,r).createErrorResponse()}function p(r,e=d.Docs,t){const o=r instanceof Error?r.message:String(r),a=r instanceof Error?r.stack:void 0;return c.sendMcpErrorMessage([{object:"mcp_server",server_type:e,message:o,stack:a||""}]),new n(s.InternalError,"Internal server error mcp",o,t).createErrorResponse()}function f(r="Invalid request",e){return new n(s.InvalidRequest,r,void 0,e).createErrorResponse()}function h(r="Invalid parameters",e){return new n(s.InvalidParams,r,void 0,e).createErrorResponse()}async function v(r,e,t){try{return await r()}catch(o){return c.sendMcpErrorMessage([{object:"mcp_server",server_type:e,message:o?.message||"",stack:o?.stack||""}]),t&&t(),p(o,e)}}export{n as McpError,p as createInternalServerError,h as createInvalidParamsError,f as createInvalidRequestError,m as createMethodNotAllowedError,v as withErrorHandling};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Context } from 'hono';
|
|
2
|
+
import type { ApiRoute } from '../../../types';
|
|
3
|
+
import type { Store } from '../../../store.js';
|
|
4
|
+
export declare function handleMcpRequest(route: ApiRoute, ctx: Context, store: Store): Promise<Response>;
|
|
5
|
+
//# sourceMappingURL=handle-mcp-request.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{withPathPrefix as d}from"@redocly/theme/core/utils";import{importApiRoutesHandler as f}from"../../../api-routes/import-api-routes-handlers.js";import{enhanceContext as h}from"../../../api-routes/helpers/enhance-context.js";import{telemetry as A}from"../../../telemetry/index.js";import{KvService as D}from"../../../persistence/kv/services/kv-service.js";import{envConfig as o}from"../../../../config/env-config.js";async function y(a,s,t){const e=s.get("auth"),i=await t.resolveRouteStaticData(a)||{},r=d(a.slug),{requestHandlers:c}=await f(t.serverOutDir),p=c[a.requestHandlerId],m=(await p()).default,u=async()=>await D.getInstance({baseDbDir:t.serverOutDir,sqldRemoteDatabaseUrl:o.SQLD_REMOTE_DATABASE_URL,sqldRemoteDatabaseAuthToken:o.SQLD_REMOTE_DATABASE_AUTH_TOKEN}),l=h({honoCtx:s,ctx:{user:{teams:e.teams,email:e.claims.email,claims:e.claims,idpAccessToken:e.idpAccessToken,idpId:e.claims.idpId,isAuthenticated:e.isAuthenticated},config:t.config},telemetry:A,getKv:u}),n=await m(s.req.raw,l,{...i,props:{...i.props,routeSlug:r,outdir:t.outdir}});return n instanceof Response?n:typeof n=="string"?new Response(n,{headers:{"Content-Type":"text/plain"}}):new Response(JSON.stringify(n),{headers:{"Content-Type":"application/json"}})}export{y as handleMcpRequest};
|
|
@@ -3,7 +3,6 @@ import type { McpServerInstance, McpServerType } from '../types.js';
|
|
|
3
3
|
export type McpRequestHandlerDependencies = {
|
|
4
4
|
createServerInstance: (context: ApiFunctionsContext, staticData: PageStaticData, headers: Record<string, string | string[] | undefined>, request: Request) => Promise<McpServerInstance>;
|
|
5
5
|
serverType: McpServerType;
|
|
6
|
-
connectionTimeoutMs?: number;
|
|
7
6
|
};
|
|
8
7
|
/**
|
|
9
8
|
* Creates a standardized MCP request handler
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{toFetchResponse as
|
|
1
|
+
import{toFetchResponse as p,toReqRes as h}from"fetch-to-node";import{createMethodNotAllowedError as w,withErrorHandling as y}from"./errors.js";function m(s){const{createServerInstance:a,serverType:c}=s;return async(e,d,i)=>{let r;return y(async()=>{const n={};e.headers.forEach((t,l)=>{n[l]=t});const{req:u,res:o}=h(e);switch(e.method){case"GET":return new Response(JSON.stringify({error:"Method Not Allowed",message:`In order to use this MCP server, you need register it in your MCP Client (VS Code, Cursor, Claude Code, etc.) using that URL: ${e.url}`}),{status:405,headers:{"Content-Type":"application/json"}});case"POST":{r=await a(d,i,n,e);const t=await e.json();return await r.transport.handleRequest(u,o,t),p(o)}default:return w()}},c,async()=>{r&&(await r.cleanup(),r=void 0)})}}export{m as createMcpRequestHandler};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{McpServer as t}from"@redocly/mcp-typescript-sdk/server/mcp.js";import{StreamableHTTPServerTransport as s}from"@redocly/mcp-typescript-sdk/server/streamableHttp.js";import{telemetry as i}from"../../../telemetry/index.js";class p{server;transport;#r;#t=!1;constructor(e){this.server=new t(e,{capabilities:{logging:{}}}),this.transport=new s({sessionIdGenerator:void 0})}async initialize(){return this.registerTools(),await this.server.connect(this.transport),{server:this.server,transport:this.transport,cleanup:this.cleanup.bind(this)}}clearCleanupTimeout(){this.#r&&(clearTimeout(this.#r),this.#r=void 0)}#e;async cleanup(){return this.#e?this.#e:(this.#e=this.#s(),this.#e)}async#s(){if(!this.#t){this.#t=!0,this.clearCleanupTimeout();try{this.transport.close()}catch(e){throw i.sendMcpErrorMessage({server_type:this.getServerType(),message:e?.message||"Unknown cleanup error",stack:e?.stack||""}),e}}}}async function h(r,...e){return await new r(...e).initialize()}export{p as BaseMcpServer,h as createMcpServerInstance};
|
|
1
|
+
import{McpServer as t}from"@redocly/mcp-typescript-sdk/server/mcp.js";import{StreamableHTTPServerTransport as s}from"@redocly/mcp-typescript-sdk/server/streamableHttp.js";import{telemetry as i}from"../../../telemetry/index.js";class p{server;transport;#r;#t=!1;constructor(e){this.server=new t(e,{capabilities:{logging:{}}}),this.transport=new s({sessionIdGenerator:void 0})}async initialize(){return this.registerTools(),await this.server.connect(this.transport),{server:this.server,transport:this.transport,cleanup:this.cleanup.bind(this)}}clearCleanupTimeout(){this.#r&&(clearTimeout(this.#r),this.#r=void 0)}#e;async cleanup(){return this.#e?this.#e:(this.#e=this.#s(),this.#e)}async#s(){if(!this.#t){this.#t=!0,this.clearCleanupTimeout();try{this.transport.close()}catch(e){throw i.sendMcpErrorMessage([{object:"mcp_server",server_type:this.getServerType(),message:e?.message||"Unknown cleanup error",stack:e?.stack||""}]),e}}}}async function h(r,...e){return await new r(...e).initialize()}export{p as BaseMcpServer,h as createMcpServerInstance};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { OpenAPIPath } from '@redocly/openapi-docs/src/types';
|
|
2
2
|
import type { McpServer } from '@redocly/mcp-typescript-sdk/server/mcp.js';
|
|
3
3
|
import type { StreamableHTTPServerTransport } from '@redocly/mcp-typescript-sdk/server/streamableHttp.js';
|
|
4
|
+
import type { CallToolResult } from '@redocly/mcp-typescript-sdk/types.js';
|
|
4
5
|
import type { OpenAPIServer } from '@redocly/openapi-docs/lib/types/open-api.js';
|
|
5
6
|
import type { McpErrorCodes, McpServerType } from './constants';
|
|
6
7
|
import type { RbacConfig, PageStaticData } from '@redocly/config';
|
|
@@ -70,5 +71,44 @@ export type McpUserInfo = {
|
|
|
70
71
|
exp?: number;
|
|
71
72
|
[key: string]: any;
|
|
72
73
|
};
|
|
74
|
+
export type ToolArgsMap = {
|
|
75
|
+
'list-apis': {
|
|
76
|
+
filter?: string;
|
|
77
|
+
page?: number;
|
|
78
|
+
limit?: number;
|
|
79
|
+
};
|
|
80
|
+
'get-endpoints': {
|
|
81
|
+
name: string;
|
|
82
|
+
};
|
|
83
|
+
'get-endpoint-info': {
|
|
84
|
+
name: string;
|
|
85
|
+
path: string;
|
|
86
|
+
method: string;
|
|
87
|
+
};
|
|
88
|
+
'get-security-schemes': {
|
|
89
|
+
name: string;
|
|
90
|
+
};
|
|
91
|
+
'get-full-api-description': {
|
|
92
|
+
name: string;
|
|
93
|
+
};
|
|
94
|
+
search: {
|
|
95
|
+
query: string;
|
|
96
|
+
};
|
|
97
|
+
whoami: Record<string, never>;
|
|
98
|
+
};
|
|
99
|
+
export type McpToolWorkerParams = {
|
|
100
|
+
[K in keyof ToolArgsMap]: {
|
|
101
|
+
toolName: K;
|
|
102
|
+
args: ToolArgsMap[K];
|
|
103
|
+
context: {
|
|
104
|
+
apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
|
|
105
|
+
outdir?: string;
|
|
106
|
+
accessInfo?: AccessInfo;
|
|
107
|
+
baseUrl?: string;
|
|
108
|
+
headers?: Record<string, string | string[] | undefined>;
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
}[keyof ToolArgsMap];
|
|
112
|
+
export type McpToolWorkerResponse = CallToolResult;
|
|
73
113
|
export {};
|
|
74
114
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getDocsTool as c}from"../docs-mcp/tools/index.js";async function l(e){const{toolName:o,args:n,context:r}=e,t=c(o);if(!t)throw new Error(`Unknown tool: ${o}`);return await t.execute(n,r)}export{l as executeMcpTool};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { RedoclyConfig, ResolvedConfigLinks, ResolvedNavItem, RawNavConfig, NavItem } from '@redocly/config';
|
|
2
2
|
import type { AfterRoutesCreatedActions, LifecycleContext, ResolveItemsOptions } from '../types';
|
|
3
|
-
export type ResolveLinkContext = Pick<AfterRoutesCreatedActions, 'outdir' | 'getRouteByFsPath' | 'contentDir' | 'getAllRoutesForLocale' | 'getRouteBySlug'>;
|
|
3
|
+
export type ResolveLinkContext = Pick<AfterRoutesCreatedActions, 'outdir' | 'getRouteByFsPath' | 'contentDir' | 'getAllRoutesForLocale' | 'getAllRoutes' | 'getRouteBySlug' | 'getRoutesByDir'>;
|
|
4
4
|
export declare function resolveLinksFromConfig(rawConfig: RawNavConfig, contentDir: string, actions: ResolveLinkContext, context: LifecycleContext, options: ResolveItemsOptions): Promise<ResolvedConfigLinks>;
|
|
5
5
|
export declare function normalizeItems(items: NavItem[]): NavItem[];
|
|
6
6
|
export declare function resolveItems(items: NavItem[] | undefined, fromDir: string, actions: ResolveLinkContext, context: LifecycleContext, options: ResolveItemsOptions): Promise<ResolvedNavItem[] | undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as v from"path";import{REDOCLY_ROUTE_RBAC as P,REDOCLY_TEAMS_RBAC as p}from"@redocly/config";import{VERSION_SEPARATOR as M}from"../constants/common.js";import{DEFAULT_LOCALE_PLACEHOLDER as _}from"../../constants/common.js";import{removeTrailingSlash as j}from"../../utils/url/remove-trailing-slash.js";import{isPrimitive as W}from"../../utils/guards/is-primitive.js";import{slash as w}from"../../utils/path/slash.js";import{isAbsoluteUrl as z}from"../../utils/url/is-absolute-url.js";import{normalizeRouteSlug as U}from"../../utils/path/normalize-route-slug.js";import{parsePathVersions as R}from"../../utils/path/parse-path-versions.js";import{logger as A}from"../tools/notifiers/logger.js";import{reporter as S}from"../tools/notifiers/reporter.js";import{shaDirPathShort as C}from"../utils/crypto/sha-dir-path-short.js";import{copyStaticFile as H,FileNotFoundError as E}from"../utils/fs.js";import{isIconPath as J,resolveAssetPath as Y}from"../utils/index.js";import{resolveSrcSet as G}from"../utils/resolve-src-set.js";import{isL10nPath as B}from"../fs/utils/is-l10n-path.js";import{getLocaleFromRelativePath as q}from"../fs/utils/get-locale-from-relative-path.js";async function D(e,s,n,t,a){if(!e)return;const f={...a,ignoreCustomSidebar:!0};if(W(e)){if(typeof e=="string"){const r=F(n.contentDir,s,a,e,t.fs);if(t.fs.exists(r)){if(n.getRouteByFsPath(r))return K({page:e},s,n,t,f);{const g=t.fs.getFileInfo(r);return g?H(n.contentDir,g.realRelativePath,n.outdir):void 0}}}return e}return Array.isArray(e)?I(N(e),s,n,t,f):Object.fromEntries(await Promise.all(Object.entries(e).map(async([r,l])=>[r,await D(l,s,n,t,a)])))}function N(e){return e.map(s=>({...s,items:s.items?N(s.items):void 0}))}async function I(e,s,n,t,a){if(Array.isArray(e))return(await Promise.all(e.map(f=>K(f,s,n,t,a)))).flatMap(f=>f)}async function y(e,s,n,t){let a,f;if(typeof e.icon=="object"){if("srcSet"in e.icon)try{a=await G(e.icon.srcSet,n.fs,{fromFileRelativePath:t.navFile,contentDir:s.contentDir,outdir:s.outdir})}catch(d){d instanceof E?await S.panicOnBuildContentError(`Cannot resolve "item.icon.srcSet" from ${t.navFile}: ${d.message}`):await S.panicOnBuild(`Cannot resolve "item.icon.srcSet" from ${t.navFile}: ${d.message}`)}}else if(typeof e.icon=="string")if(z(e.icon)||J(e.icon))try{f=await Y(e.icon,n.fs,{fromFileRelativePath:t.navFile,contentDir:s.contentDir,outdir:s.outdir})}catch(d){d instanceof E?await S.panicOnBuildContentError(`Cannot resolve "item.icon" from ${t.navFile}: file ${f} does not exist`):await S.panicOnBuild(`Cannot resolve "item.icon" from ${t.navFile}: ${d.message}`)}else f=e.icon;return{icon:f,srcSet:a}}function Q(e){return s=>{if(s.type==="link"||s.type==="group"){const n=s.metadata;return n?Object.entries(e).every(([t,a])=>Array.isArray(a)?a.some(f=>n[t]===f):n[t]===a):!1}return!0}}async function K(e,s,n,t,a){if(e?.directory&&e.items?.length)return{type:"error",label:`Can't have both "directory" and "items" in the nav item: ${JSON.stringify(e)}`};e?.directory&&e?.group&&(e={...e,directory:void 0,items:[{directory:e.directory}]});const f=e?.directory?F(n.contentDir,s,a,e.directory,t.fs):void 0;if(f!==void 0){const i=f===""?"":f+"/",{locale:u,ignoredRoutes:o}=a;let h=n.getAllRoutesForLocale(u).filter(c=>!o?.has(c.baseSlug||"")&&c.fsPath.startsWith(i)&&!c.excludeFromSidebar).sort((c,b)=>c.fsPath===b.fsPath?0:c.baseSlug.localeCompare(b.baseSlug,void 0,{numeric:!0}));const k=e.includeByMetadata?Q(e.includeByMetadata):Boolean;if(!h.length)return[];const $=(await Promise.all(h.map(async c=>{const b=c.versions?.find(x=>x.active),L=b&&{version:b.version,isDefault:b.default,versionFolderId:b.folderId},V=ee(v.posix.relative(f,c.fsPath)),O=c.getSidebar?.(c);return!a.ignoreCustomSidebar&&O?.length?{type:"group",fsPath:c.fsPath,metadata:c.metadata,link:c.slug,routeSlug:c.slug,label:await c.getNavText?.()||c.slug,[p]:c[p],[P]:c[P],sidebarItems:m(O,L,c[p],c[P]),...L,relativePathFromDirectory:v.relative(f,c.fsPath).replace(/@[^\/]+\//,"")}:{type:"link",fsPath:c.fsPath,metadata:c.metadata,[p]:c[p],[P]:c[P],label:await c.getNavText?.()||c.slug,link:c.slug,routeSlug:c.slug,...L,relativePathFromDirectory:V}}))).filter(k);return e.flatten?T($,a):Z($,a)}let d=typeof e=="string"?e:e?.page,r,l;if(d){if(d.includes("#")){const[i,u]=d.split("#");u?l=u:A.warn(`Invalid heading anchor format in sidebar: "${u}". Heading anchors should contain only alphanumeric characters, hyphens, and underscores.`),d=i}if(d=j(d),a.locale&&a.locale!==_){const i=U(v.join(a.locale.toLowerCase(),d));r=n.getRouteBySlug(i)}r||(r=n.getRouteBySlug(d)),r||(r=n.getRouteByFsPath(F(n.contentDir,s,a,d,t.fs)))}const g=r?.metadata;if(e?.$ref){let i=F(n.contentDir,s,a,e.$ref,t.fs);if(a.ref!==void 0&&(i=v.posix.join(a.ref,e.$ref)),!t.fs.exists(i))return await S.panicOnBuildContentError(`Failed to load ${i} file. Make sure sidebar $ref path is correct.`),[];const u=await t.cache.load(i,"yaml"),o=v.dirname(i);return await I(u.data,s,n,t,{...a,navFile:i,ref:o})||[]}if(!r){const i=a.excludedFromLinkCheckerPatterns?.catalog.some(o=>o.test(d||"")),u=a.excludedFromLinkCheckerPatterns?.apiFunctions.some(o=>o.test(d||e.href||""));(u||i)&&(e={...e,href:d||e.href,page:void 0,target:e.target??(u?"_blank":void 0)}),await X(e,a,t,s)}if(r&&!e.disconnect&&!a.ignoreCustomSidebar&&(l||r?.getSidebar)){const i=r.versions?.find(o=>o.active),u=i&&{version:i.version,isDefault:i.default,versionFolderId:i.folderId};if(l){let o=[];if(r.getSidebar&&(o=r.getSidebar(r,{...e,...await y(e,n,t,a)}),o&&o.length>0)){const h=o[0];h&&h.link&&(h.link=`${h.link}#${l}`)}if(!o||o.length===0){let h=e.group||e.label||l;o=[{type:"link",fsPath:r.fsPath,metadata:r.metadata,link:`${r.slug}#${l}`,routeSlug:r.slug,label:h,labelTranslationKey:e.labelTranslationKey,...await y(e,n,t,a),[p]:r[p],[P]:{slug:r.slug,fsPath:r.fsPath},...u}]}return m(o,u,r[p],r[P])}if(r?.getSidebar){const o=r.getSidebar(r,{...e,...await y(e,n,t,a)}),h=e.group&&o?.[0]?.routeSlug===r.slug?o.slice(1):o;return m(a.groupCustomSidebars||e.group?[{type:"group",fsPath:r.fsPath,link:r.slug,routeSlug:r.slug,label:e.group||e.label||await r.getNavText?.()||r.slug,items:h,labelTranslationKey:e.labelTranslationKey,metadata:g,...await y(e,n,t,a)}]:o,u,r[p],r[P])}}if(r&&!e.group){const i=l?`${r.slug}#${l}`:r.slug;let u=e.label||l||"";u||(u=await r.getNavText?.()||r.slug);const o=r.versions?.find(k=>k.active),h=o&&{version:o.version,isDefault:o.default,versionFolderId:o.folderId};return{type:"link",fsPath:r.fsPath,linkedSidebars:e.linkedSidebars,metadata:g,[p]:e?.rbac||r[p],[P]:{slug:r.slug,fsPath:r.fsPath},label:u,labelTranslationKey:e.labelTranslationKey,link:i,items:await I(e.items,s,n,t,a),separatorLine:e.separatorLine,linePosition:e.linePosition,routeSlug:e.disconnect?void 0:i,external:e.external,target:e.target,...await y(e,n,t,a),...h,additionalProps:e.additionalProps}}else if(e?.group){const i=r?.versions?.find(o=>o.active),u=R(a?.navFile);return{type:"group",fsPath:r?.fsPath,linkedSidebars:e.linkedSidebars,metadata:g,version:i?.version||u?.versionName,versionFolderId:i?.folderId||(u?.versionFolderPath?C(u.versionFolderPath):void 0),label:e.group,link:r?.slug,routeSlug:r?.slug,labelTranslationKey:e.groupTranslationKey,items:await I(e.items,s,n,t,a),expanded:e.expanded?e.expanded.toString():void 0,selectFirstItemOnExpand:e.selectFirstItemOnExpand,menuStyle:e.menuStyle,separatorLine:e.separatorLine,linePosition:e.linePosition,...await y(e,n,t,a),[p]:e?.rbac,[P]:{slug:r?.slug||"",fsPath:r?.fsPath||""},additionalProps:e.additionalProps}}else{if(e?.href||e?.label)return{type:"link",metadata:g,link:e.href||"",label:e?.label||e?.href||"",labelTranslationKey:e.labelTranslationKey,external:e.external,target:e.target,separatorLine:e.separatorLine,linePosition:e.linePosition,...await y(e,n,t,a),[p]:e?.rbac,additionalProps:e.additionalProps};if(e?.separator!=null||e?.separatorLine!=null){const i=R(a?.navFile);return{type:"separator",metadata:g,version:i?.versionName,versionFolderId:i?.versionFolderPath?C(i.versionFolderPath):void 0,label:e.separator,labelTranslationKey:e.separatorTranslationKey,separatorLine:e.separatorLine,linePosition:e.linePosition,...await y(e,n,t,a),[p]:e?.rbac,additionalProps:e.additionalProps}}else{const i=R(a?.navFile);return{type:"error",label:`Can't resolve page: ${JSON.stringify(e)}`,version:i?.versionName,versionFolderId:i?.versionFolderPath?C(i.versionFolderPath):void 0}}}}async function X(e,s,n,t){const{href:a,page:f}=e;if(a||!f)return;const d=F(n.fs.cwd,t,s,f,n.fs),r=n.fs.exists(d),l=await n.isPathIgnored(d),g=(r?"The page is ignored: ":"Can't resolve page: ")+f;(!r||l)&&S.reportBrokenLink({type:"BROKEN_LINK",brokenLinkType:"LINK",title:e.label||e.group||"",link:d,rawLink:f,message:g,sourceFileRelativePath:s.navFile,sourceFileLocation:{line:0}})}function F(e,s,n,t="",a){if(n.ref!==void 0)return w(v.relative(e,v.resolve(e,v.join(n.ref,t))));if(t.startsWith("/")){const f=B(s)?q(s):void 0,d=f?`${a.localizationFolder}/${f}/`:"",r=t.slice(1);return B(r)?r:d+w(r)}return w(v.relative(e,v.resolve(e,s,t)))}function Z(e,s){const n={};for(const r of e){const l=v.dirname(r.relativePathFromDirectory),g=r.version?M+r.version:"",i=v.basename(r.relativePathFromDirectory)+g;d(l,r,i)}const t=f(a(n));return T(t,s);function a(r){const l=[];for(const g of Object.keys(r)){const i=r[g];l.push({...i,items:i.items?a(i.items):void 0})}return l}function f(r){return r.sort((l,g)=>{const i=typeof l=="string"?l.toLowerCase():l.relativePathFromDirectory||l.label||"",u=typeof g=="string"?g.toLowerCase():g.relativePathFromDirectory||g.label||"";return i.startsWith("index.")?-1:u.startsWith("index.")?1:i.localeCompare(u,void 0,{numeric:!0})})}function d(r,l,g){r==="."&&(r="");const i=r.split("/").filter(Boolean);let u=n;for(const o of i){const h=o+(l?.version||"");u[h]||(u[h]={type:"group",version:l?.version,label:o,isDefault:l?.isDefault,versionFolderId:l.versionFolderId,items:{}}),u=u[h].items}u[g]=l}}function T(e,s){return e.flatMap(n=>n?.sidebarItems?s.groupCustomSidebars?{...n,items:n.sidebarItems,sidebarItems:void 0,relativePathFromDirectory:void 0}:n.sidebarItems:{...n,items:n.items?T(n.items,s):void 0})}function m(e,s,n,t){return e.map(a=>({...a,...s,[p]:a[p]||n,[P]:a[P]||t,items:a.type==="group"&&a.items?m(a.items,s,n):a.items}))}function ee(e){return e.replace(/@[^\/]+\//,"")}async function ye(e,s,n,t){const a=(e?.items||[]).filter(r=>r.linkedSidebars?.length).map(r=>({...r,items:void 0})),f=await D(a,s.contentDir,s,n,t),d=new Map;for(const r of f)if(r.linkedSidebars?.length)for(const l of r.linkedSidebars){if(d.has(l)){A.warn(`Only one navbar item can belong to sidebar. "${l}" on 'linkedSidebars' property on "${r.label}" will be ignored.`);continue}d.set(l,{label:r.label,link:r.link})}return d}export{ye as collectItemsLinkedToSidebars,N as normalizeItems,K as resolveItem,I as resolveItems,D as resolveLinksFromConfig};
|
|
1
|
+
import*as v from"path";import{REDOCLY_ROUTE_RBAC as y,REDOCLY_TEAMS_RBAC as h}from"@redocly/config";import{VERSION_SEPARATOR as x}from"../constants/common.js";import{DEFAULT_LOCALE_PLACEHOLDER as M}from"../../constants/common.js";import{removeTrailingSlash as _}from"../../utils/url/remove-trailing-slash.js";import{isPrimitive as j}from"../../utils/guards/is-primitive.js";import{slash as w}from"../../utils/path/slash.js";import{isAbsoluteUrl as W}from"../../utils/url/is-absolute-url.js";import{normalizeRouteSlug as z}from"../../utils/path/normalize-route-slug.js";import{parsePathVersions as R}from"../../utils/path/parse-path-versions.js";import{logger as A}from"../tools/notifiers/logger.js";import{reporter as S}from"../tools/notifiers/reporter.js";import{shaDirPathShort as C}from"../utils/crypto/sha-dir-path-short.js";import{copyStaticFile as U,FileNotFoundError as O}from"../utils/fs.js";import{isIconPath as H,resolveAssetPath as J}from"../utils/index.js";import{resolveSrcSet as Y}from"../utils/resolve-src-set.js";import{isL10nPath as B}from"../fs/utils/is-l10n-path.js";import{getLocaleFromRelativePath as G}from"../fs/utils/get-locale-from-relative-path.js";async function E(e,s,a,t,n){if(!e)return;const f={...n,ignoreCustomSidebar:!0};if(j(e)){if(typeof e=="string"){const r=F(a.contentDir,s,n,e,t.fs);if(t.fs.exists(r)){if(a.getRouteByFsPath(r))return N({page:e},s,a,t,f);{const g=t.fs.getFileInfo(r);return g?U(a.contentDir,g.realRelativePath,a.outdir):void 0}}}return e}return Array.isArray(e)?k(D(e),s,a,t,f):Object.fromEntries(await Promise.all(Object.entries(e).map(async([r,o])=>[r,await E(o,s,a,t,n)])))}function D(e){return e.map(s=>({...s,items:s.items?D(s.items):void 0}))}async function k(e,s,a,t,n){if(Array.isArray(e))return(await Promise.all(e.map(f=>N(f,s,a,t,n)))).flatMap(f=>f)}async function b(e,s,a,t){let n,f;if(typeof e.icon=="object"){if("srcSet"in e.icon)try{n=await Y(e.icon.srcSet,a.fs,{fromFileRelativePath:t.navFile,contentDir:s.contentDir,outdir:s.outdir})}catch(l){l instanceof O?await S.panicOnBuildContentError(`Cannot resolve "item.icon.srcSet" from ${t.navFile}: ${l.message}`):await S.panicOnBuild(`Cannot resolve "item.icon.srcSet" from ${t.navFile}: ${l.message}`)}}else if(typeof e.icon=="string")if(W(e.icon)||H(e.icon))try{f=await J(e.icon,a.fs,{fromFileRelativePath:t.navFile,contentDir:s.contentDir,outdir:s.outdir})}catch(l){l instanceof O?await S.panicOnBuildContentError(`Cannot resolve "item.icon" from ${t.navFile}: file ${f} does not exist`):await S.panicOnBuild(`Cannot resolve "item.icon" from ${t.navFile}: ${l.message}`)}else f=e.icon;return{icon:f,srcSet:n}}function q(e){return s=>{if(s.type==="link"||s.type==="group"){const a=s.metadata;return a?(Array.isArray(e)?e:[e]).some(n=>Object.entries(n).every(([f,l])=>Array.isArray(l)?l.some(r=>a[f]===r):a[f]===l)):!1}return!0}}async function N(e,s,a,t,n){if(e?.directory&&e.items?.length)return{type:"error",label:`Can't have both "directory" and "items" in the nav item: ${JSON.stringify(e)}`};e?.directory&&e?.group&&(e={...e,directory:void 0,items:[{directory:e.directory}]});const f=e?.directory?F(a.contentDir,s,n,e.directory,t.fs):void 0;if(f!==void 0){const i=f===""?"":f,{ignoredRoutes:u}=n;let d=a.getRoutesByDir(i).filter(c=>!u?.has(c.baseSlug||"")&&!c.excludeFromSidebar).sort((c,P)=>c.fsPath===P.fsPath?0:c.baseSlug.localeCompare(P.baseSlug,void 0,{numeric:!0}));const p=e.includeByMetadata?q(e.includeByMetadata):Boolean;if(!d.length)return[];const I=(await Promise.all(d.map(async c=>{const P=c.versions?.find(V=>V.active),L=P&&{version:P.version,isDefault:P.default,versionFolderId:P.folderId},K=Z(v.posix.relative(f,c.fsPath)),$=c.getSidebar?.(c);return!n.ignoreCustomSidebar&&$?.length?{type:"group",fsPath:c.fsPath,metadata:c.metadata,link:c.slug,routeSlug:c.slug,label:await c.getNavText?.()||c.slug,[h]:c[h],[y]:c[y],sidebarItems:m($,L,c[h],c[y]),...L,relativePathFromDirectory:v.relative(f,c.fsPath).replace(/@[^\/]+\//,"")}:{type:"link",fsPath:c.fsPath,metadata:c.metadata,[h]:c[h],[y]:c[y],label:await c.getNavText?.()||c.slug,link:c.slug,routeSlug:c.slug,...L,relativePathFromDirectory:K}}))).filter(p);return e.flatten?T(I,n):X(I,n)}let l=typeof e=="string"?e:e?.page,r,o;if(l){if(l.includes("#")){const[i,u]=l.split("#");u?o=u:A.warn(`Invalid heading anchor format in sidebar: "${u}". Heading anchors should contain only alphanumeric characters, hyphens, and underscores.`),l=i}if(l=_(l),n.locale&&n.locale!==M){const i=z(v.join(n.locale.toLowerCase(),l));r=a.getRouteBySlug(i)}r||(r=a.getRouteBySlug(l)),r||(r=a.getRouteByFsPath(F(a.contentDir,s,n,l,t.fs)))}const g=r?.metadata;if(e?.$ref){let i=F(a.contentDir,s,n,e.$ref,t.fs);if(n.ref!==void 0&&(i=v.posix.join(n.ref,e.$ref)),!t.fs.exists(i))return await S.panicOnBuildContentError(`Failed to load ${i} file. Make sure sidebar $ref path is correct.`),[];const u=await t.cache.load(i,"yaml"),d=v.dirname(i);return await k(u.data,s,a,t,{...n,navFile:i,ref:d})||[]}if(!r){const i=n.excludedFromLinkCheckerPatterns?.catalog.some(d=>d.test(l||"")),u=n.excludedFromLinkCheckerPatterns?.apiFunctions.some(d=>d.test(l||e.href||""));(u||i)&&(e={...e,href:l||e.href,page:void 0,target:e.target??(u?"_blank":void 0)}),await Q(e,n,t,s)}if(r&&!e.disconnect&&!n.ignoreCustomSidebar&&(o||r?.getSidebar)){const i=r.versions?.find(d=>d.active),u=i&&{version:i.version,isDefault:i.default,versionFolderId:i.folderId};if(o){let d=[];if(r.getSidebar&&(d=r.getSidebar(r,{...e,...await b(e,a,t,n)}),d&&d.length>0)){const p=d[0];p&&p.link&&(p.link=`${p.link}#${o}`)}if(!d||d.length===0){let p=e.group||e.label||o;d=[{type:"link",fsPath:r.fsPath,metadata:r.metadata,link:`${r.slug}#${o}`,routeSlug:r.slug,label:p,labelTranslationKey:e.labelTranslationKey,...await b(e,a,t,n),[h]:r[h],[y]:{slug:r.slug,fsPath:r.fsPath},...u}]}return m(d,u,r[h],r[y])}if(r?.getSidebar){const d=r.getSidebar(r,{...e,...await b(e,a,t,n)}),p=e.group&&d?.[0]?.routeSlug===r.slug?d.slice(1):d;return m(n.groupCustomSidebars||e.group?[{type:"group",fsPath:r.fsPath,link:r.slug,routeSlug:r.slug,label:e.group||e.label||await r.getNavText?.()||r.slug,items:p,labelTranslationKey:e.labelTranslationKey,metadata:g,...await b(e,a,t,n)}]:d,u,r[h],r[y])}}if(r&&!e.group){const i=o?`${r.slug}#${o}`:r.slug;let u=e.label||o||"";u||(u=await r.getNavText?.()||r.slug);const d=r.versions?.find(I=>I.active),p=d&&{version:d.version,isDefault:d.default,versionFolderId:d.folderId};return{type:"link",fsPath:r.fsPath,linkedSidebars:e.linkedSidebars,metadata:g,[h]:e?.rbac||r[h],[y]:{slug:r.slug,fsPath:r.fsPath},label:u,labelTranslationKey:e.labelTranslationKey,link:i,items:await k(e.items,s,a,t,n),separatorLine:e.separatorLine,linePosition:e.linePosition,routeSlug:e.disconnect?void 0:i,external:e.external,target:e.target,badges:e.badges,...await b(e,a,t,n),...p,additionalProps:e.additionalProps}}else if(e?.group){const i=r?.versions?.find(d=>d.active),u=R(n?.navFile);return{type:"group",fsPath:r?.fsPath,linkedSidebars:e.linkedSidebars,metadata:g,version:i?.version||u?.versionName,versionFolderId:i?.folderId||(u?.versionFolderPath?C(u.versionFolderPath):void 0),label:e.group,link:r?.slug,routeSlug:r?.slug,badges:e.badges,labelTranslationKey:e.groupTranslationKey,items:await k(e.items,s,a,t,n),expanded:e.expanded?e.expanded.toString():void 0,selectFirstItemOnExpand:e.selectFirstItemOnExpand,menuStyle:e.menuStyle,separatorLine:e.separatorLine,linePosition:e.linePosition,...await b(e,a,t,n),[h]:e?.rbac,[y]:{slug:r?.slug||"",fsPath:r?.fsPath||""},additionalProps:e.additionalProps}}else{if(e?.href||e?.label)return{type:"link",metadata:g,link:e.href||"",label:e?.label||e?.href||"",labelTranslationKey:e.labelTranslationKey,external:e.external,target:e.target,separatorLine:e.separatorLine,linePosition:e.linePosition,badges:e.badges,...await b(e,a,t,n),[h]:e?.rbac,additionalProps:e.additionalProps};if(e?.separator!=null||e?.separatorLine!=null){const i=R(n?.navFile);return{type:"separator",metadata:g,version:i?.versionName,versionFolderId:i?.versionFolderPath?C(i.versionFolderPath):void 0,label:e.separator,labelTranslationKey:e.separatorTranslationKey,separatorLine:e.separatorLine,linePosition:e.linePosition,...await b(e,a,t,n),[h]:e?.rbac,additionalProps:e.additionalProps}}else{const i=R(n?.navFile);return{type:"error",label:`Can't resolve page: ${JSON.stringify(e)}`,version:i?.versionName,versionFolderId:i?.versionFolderPath?C(i.versionFolderPath):void 0}}}}async function Q(e,s,a,t){const{href:n,page:f}=e;if(n||!f)return;const l=F(a.fs.cwd,t,s,f,a.fs),r=a.fs.exists(l),o=await a.isPathIgnored(l),g=(r?"The page is ignored: ":"Can't resolve page: ")+f;(!r||o)&&S.reportBrokenLink({type:"BROKEN_LINK",brokenLinkType:"LINK",title:e.label||e.group||"",link:l,rawLink:f,message:g,sourceFileRelativePath:s.navFile,sourceFileLocation:{line:0}})}function F(e,s,a,t="",n){if(a.ref!==void 0)return w(v.relative(e,v.resolve(e,v.join(a.ref,t))));if(t.startsWith("/")){const f=B(s)?G(s):void 0,l=f?`${n.localizationFolder}/${f}/`:"",r=t.slice(1);return B(r)?r:l+w(r)}return w(v.relative(e,v.resolve(e,s,t)))}function X(e,s){const a={};for(const r of e){const o=v.dirname(r.relativePathFromDirectory),g=r.version?x+r.version:"",i=v.basename(r.relativePathFromDirectory)+g;l(o,r,i)}const t=f(n(a));return T(t,s);function n(r){const o=[];for(const g of Object.keys(r)){const i=r[g];o.push({...i,items:i.items?n(i.items):void 0})}return o}function f(r){return r.sort((o,g)=>{const i=typeof o=="string"?o.toLowerCase():o.relativePathFromDirectory||o.label||"",u=typeof g=="string"?g.toLowerCase():g.relativePathFromDirectory||g.label||"";return i.startsWith("index.")?-1:u.startsWith("index.")?1:i.localeCompare(u,void 0,{numeric:!0})})}function l(r,o,g){r==="."&&(r="");const i=r.split("/").filter(Boolean);let u=a;for(const d of i){const p=d+(o?.version||"");u[p]||(u[p]={type:"group",version:o?.version,label:d,isDefault:o?.isDefault,versionFolderId:o.versionFolderId,items:{}}),u=u[p].items}u[g]=o}}function T(e,s){return e.flatMap(a=>a?.sidebarItems?s.groupCustomSidebars?{...a,items:a.sidebarItems,sidebarItems:void 0,relativePathFromDirectory:void 0}:a.sidebarItems:{...a,items:a.items?T(a.items,s):void 0})}function m(e,s,a,t){return e.map(n=>({...n,...s,[h]:n[h]||a,[y]:n[y]||t,items:n.type==="group"&&n.items?m(n.items,s,a):n.items}))}function Z(e){return e.replace(/@[^\/]+\//,"")}async function ye(e,s,a,t){const n=(e?.items||[]).filter(r=>r.linkedSidebars?.length).map(r=>({...r,items:void 0})),f=await E(n,s.contentDir,s,a,t),l=new Map;for(const r of f)if(r.linkedSidebars?.length)for(const o of r.linkedSidebars){if(l.has(o)){A.warn(`Only one navbar item can belong to sidebar. "${o}" on 'linkedSidebars' property on "${r.label}" will be ignored.`);continue}l.set(o,{label:r.label,link:r.link})}return l}export{ye as collectItemsLinkedToSidebars,D as normalizeItems,N as resolveItem,k as resolveItems,E as resolveLinksFromConfig};
|
|
@@ -17,6 +17,9 @@ export declare const RbacDecorator: () => {
|
|
|
17
17
|
any: {
|
|
18
18
|
leave(node: Record<string, unknown>, ctx: any): void;
|
|
19
19
|
};
|
|
20
|
+
ref: {
|
|
21
|
+
leave(node: Record<string, unknown>): void;
|
|
22
|
+
};
|
|
20
23
|
};
|
|
21
24
|
export declare function injectDecoratorIntoConfig(config: RawUniversalConfig, outputRelativePath: string, cwd: string): RawUniversalConfig;
|
|
22
25
|
//# sourceMappingURL=decorators.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import b from"node:path";import{REDOCLY_TEAMS_RBAC as m}from"@redocly/config";import{slash as k}from"../../../utils/path/slash.js";function p(a,r,t){if(!r)throw new Error("Visitor required");if(a){a.description&&r(a,"description",t.location.absolutePointer+"/description",t);for(const o in a["x-enumDescriptions"])r(a["x-enumDescriptions"],o,t.location.absolutePointer+"/x-enumDescriptions/"+o,t)}}const g=/^[a-zA-Z0-9\s\-,.!\?:;'"()/]+$/,u=({outputRelativePath:a,cwd:r})=>{const t=function(e,s,l,c){const{node:n}=c.resolve(e[s]);if(!n||typeof n!="string"||n.match(g))return;const i=c.getVisitorData();i.markdocChunks=i.markdocChunks||[],i.markdocChunks.push({node:e,pointer:k(b.relative(r,l)),markdown:n,relativePath:a,key:s})};return{any:{leave(o,e){p(o,t,e)}},ref:{leave(o,e){p(o,t,e)}}}},f=()=>{const a={};return{Tag:{enter(r){r?.["x-rbac"]&&(a[String(r.name)]=r["x-rbac"])}},any:{leave(r,t){if((t.type.name==="Operation"||t.type.name==="Webhook")&&"tags"in r&&Array.isArray(r.tags))for(const o of r.tags)a[o]&&(r["x-rbac"]=r["x-rbac"]||a[o]);r?.["x-rbac"]&&(r[m]=r["x-rbac"],delete r["x-rbac"])}},ref:{leave(r){r?.["x-rbac"]&&(r[m]=r["x-rbac"],delete r["x-rbac"])}}}};function h(a,r,t){const o={id:"markdown",decorators:{oas3:{markdown:u,rbac:f},async3:{markdown:u,rbac:f}}};return{...a,decorators:{"markdown/rbac":"on","markdown/markdown":{outputRelativePath:r,cwd:t},...a.decorators||{}},plugins:[...a.plugins||[],o]}}export{u as MarkdownParserDecorator,f as RbacDecorator,h as injectDecoratorIntoConfig};
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import type { PageRouteDetails } from '../../types';
|
|
2
2
|
import type { MdOptions } from '@redocly/config';
|
|
3
3
|
/** Load API catalog entry custom fields from the API registry */
|
|
4
|
-
export default function getServerProps(props: PageRouteDetails,
|
|
4
|
+
export default function getServerProps(props: PageRouteDetails, data: any, { variables }: MdOptions & {
|
|
5
5
|
variables: {
|
|
6
6
|
idpAccessToken?: string;
|
|
7
7
|
};
|
|
8
|
-
}): Promise<
|
|
9
|
-
customFields: Record<string, unknown>;
|
|
10
|
-
}>;
|
|
8
|
+
}): Promise<any>;
|
|
11
9
|
//# sourceMappingURL=get-server-props-custom-fields.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import f from"path";import{REGISTRY_APIS_PATHS_API_URL as n}from"../../constants/common.js";import{logger as c}from"../../tools/notifiers/logger.js";async function l(i,p,{variables:d}){const m=f.posix.dirname(i.fsPath);let t={},o={};const a=process.env.REDOCLY_LOCAL_DEV_TOKEN||d.idpAccessToken;if(a&&n)try{const e=n+"/"+encodeURIComponent(m),s=await fetch(e,{headers:{Cookie:`accessToken=${a}`}});if(s.status!==200)c.warnProd(`Failed to fetch custom fields. API response status: ${s.status}. Request URL: ${e}`);else{const r=await s.json();t=r.customFields||{},o=r.metadata||{}}}catch(e){c.warnProd("Failed to fetch custom fields: "+e.message)}return{customFields:t,metadata:o,...p.props}}export{l as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getPublicEnvVariables as
|
|
1
|
+
import{getPublicEnvVariables as n}from"../../utils/envs/get-public-env-variables.js";const l=async({fsPath:r,slug:e},t,{variables:a,partials:i},o)=>{const s=o.getPartialsForRoute?.(e)||i;return{definitionId:r,...t.props,markdown:{partials:s,variables:{...a,env:n()}}}};var d=l;export{d as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{REDOCLY_TEAMS_RBAC as D}from"@redocly/config";import{OPENAPI_DOCS_TEMPLATE_ID as U,PUBLIC_RBAC_SCOPE_ITEM as V}from"../../../constants/common.js";import{DEPRECATED_PUBLIC_API_DEFINITIONS_FOLDER as te,PUBLIC_API_DEFINITIONS_FOLDER as oe}from"../../constants/common.js";import{OPENAPI_CUSTOM_FIELDS_SERVER_PROPS_GETTER_ID as ae,OPENAPI_SHARED_DATA_PREFIX as q}from"../../constants/plugins/openapi-docs.js";import{envConfig as J}from"../../../config/env-config.js";import{logger as A}from"../../tools/notifiers/logger.js";import{searchResolver as re}from"./search/search-resolver.js";import{convertOpenAPIDocs2Sidebar as se,shouldAddRoute as ne}from"./utils.js";import{getTemplatePath as k}from"./get-template-path.js";import{storeDefinitionBundles as ie}from"./store-definition-bundles.js";import{definitionLoader as pe,definitionsLoader as de}from"./load-definition.js";import{getAiDocumentsStore as ce}from"./search/get-ai-search-documents.js";import{fromCurrentDir as le}from"../../utils/paths.js";import{telemetryTraceStep as ue}from"../../../cli/telemetry/helpers/trace-step.js";const w="openapi-spec-download";async function Ce(){let M=[],R={},B=new Set;return{id:"openapi",requiredEntitlements:["openapi"],loaders:{"load-oas-docs":de,"load-oas":pe},processContent:async(e,p)=>{await ue("build.plugin.openapi_docs",async _=>{e.createRequestHandler(w,le(import.meta.url,"./spec-download.api.js")),e.addApiRoute({slug:oe+"/*",requestHandlerId:w,httpMethod:"all",[D]:V,getStaticData:async()=>({props:{}})}),e.addApiRoute({slug:te+"/*",requestHandlerId:w,httpMethod:"all",[D]:V,getStaticData:async()=>({props:{}})});const l=e.createTemplate(U,k("./template/OpenAPIDocs.js")),g=e.registerServerPropsGetter(U,k("./get-server-props.js")),n=e.registerServerPropsGetter(ae,k("./get-server-props-custom-fields.js")),o=await p.getConfig();_?.setAttribute("config",JSON.stringify(o.openapi||{}));const E=o.rules?.["custom-fields-schema"];R={};const T=A.startTiming("Loading openapi definitions..."),u=await e.loadOpenApiDefinitions(p);A.infoTime(T,"Loading openapi definitions..."),M=u.map(({markdocChunks:r,relativePath:m,customOutputRelativeFile:i,isVirtual:s,realRelativePath:d})=>({chunks:r,relativePath:m,realRelativePath:d,isVirtual:i!=null||s})),ie(u,e.outdir);const h={};for(const r of u||[]){const{definition:m,config:i,relativePath:s,customOutputRelativeFile:d,contentItems:v,flatItems:N,parser:C,options:x,rawOptions:Q,hash:W}=r,G=d||s,a=[],H={},{definition:X}=C||{},{info:c}=X||{},O=c?.["x-metadata"],y=!!i.openapi?.excludeFromSearch||!!i.theme?.openapi?.excludeFromSearch||!!o.openapi?.excludeFromSearch||!!o.theme?.openapi?.excludeFromSearch,$={title:c?.title,description:c?.description,summary:c?.summary,...i.metadata,...O},f={untagged:[],tagged:new Map};for(const t of N){const{id:F,href:S,operationDefinition:P}=t;if(P){const{tags:I}=P;if(I)for(const L of I)f.tagged.has(L)||f.tagged.set(L,[]),f.tagged.get(L)?.push(t);else f.untagged.push(t);J.isDevelopMode&&(H[`#${P.pointer}`]=t.href)}if(!ne({item:t}))continue;const b=t,K=b.type==="section"&&!!b.infoDefinition,Z=S.split("#")[0]+"/",ee=P?.[D];a.push({excludeFromSearch:y,slugSuffix:Z,fsPath:G,metadata:{subType:"openapi-operation"},httpVerb:t?.httpVerb||"",path:s,templateId:l,[D]:ee||i.rbac,getAiDocumentsStore:ce({parser:C,options:x,info:c,tagOperations:f,openapiContentItem:b,metadata:$,relativePath:s,getSearchFacets:e.getSearchFacets,includeInLLMsTxt:K,excludeFromSearch:y}),getStaticData:async I=>({props:{dynamicMarkdocComponents:["openapi"],baseSlug:I.baseSlug,seo:t["x-metadata"]?.seo||{title:t.name,description:t.description},itemId:F,disableAutoScroll:!0}})})}a[0]={...a[0],metadata:{type:"openapi",...$},hasClientRoutes:!0,getSidebar:(t,F)=>{const S=[];return se({contentItems:v,sidebarItems:S,routeSlug:t.slug,navItem:F}),S},getNavText:()=>c?.title,getSearchDocuments:re(C,x,N,e.getSearchFacets,e.setSearchFacets,y)},O?.apiId&&(h[O.apiId]={slug:a[0]?.slug||""});const Y=a[0];a[0]=a[a.length-1],a[a.length-1]=Y;const z=J.isDevelopMode?s:void 0,j=`${q}${s}`;R[j]={fsPath:G,definition:m,options:Q,sourcePath:z,routesMapping:H,hash:W};for(const t of a)e.addRoute({...t,sharedData:[{id:j,key:"openAPIDocsStore"}],serverPropsGetterIds:E?[g,n]:[g]})}e.setGlobalData({apiProducts:h})})},afterRoutesCreated:async(e,p)=>{const _=A.startTiming("Parsing openapi markdoc chunks..."),l=new Set;for(const{chunks:n,relativePath:o,isVirtual:E,realRelativePath:T}of M){const u=e.getAllRoutes().filter(r=>r.fsPath===o).map(r=>r.slug),h=(await p.cache.load(T,"load-oas")).compoundHash;await p.cache.load(o,{loader:async function(){for(const{node:m,markdown:i,key:s,relativePath:d}of n){const{ast:v}=await e.parseMarkdoc({content:i,relativePath:d,isVirtual:E},p,{sharedDataIds:[`${q}${d}`],routeSlugs:u});m[`x-parsed-md-${s}`]={result:v}}},name:"openapi-markdoc-inline-parser"},[h]);for(const{pointer:r}of n)l.add(r)}A.infoTime(_,"Parsing openapi markdoc chunks...");const g=B.difference(l);for(const n of g)p.cache.delete(n);B=l;for(const[n,o]of Object.entries(R))await e.createSharedData(n,{...o,baseSlug:e.getRouteByFsPath(o.fsPath)?.baseSlug},o.hash)}}}export{Ce as openAPIDocsPlugin};
|
|
@@ -4,6 +4,7 @@ import type { ContentItemModel, IMenuItem, OpenAPIDefinition, Options } from '@r
|
|
|
4
4
|
import type { LifecycleContext } from '../../types';
|
|
5
5
|
export type BundledDefinition = {
|
|
6
6
|
definition: OpenAPIDefinition;
|
|
7
|
+
originalDefinition?: Record<string, unknown>;
|
|
7
8
|
config: Partial<RedoclyConfig & NonNullable<RedoclyConfig['apis']>[string]>;
|
|
8
9
|
relativePath: string;
|
|
9
10
|
realRelativePath: string;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import*as l from"path";import{convertSwagger2OpenAPI as
|
|
2
|
-
`;const
|
|
3
|
-
`}if(
|
|
1
|
+
import*as l from"path";import{convertSwagger2OpenAPI as ao}from"@redocly/openapi-docs/lib/utils/convertSwagger2OpenAPI.js";import{Source as so,bundle as co,createConfig as fo,getTotals as lo,resolvePlugins as po}from"@redocly/openapi-core";import{normalizeOptions as uo,OpenAPIParser as go,buildContentItems as mo}from"@redocly/openapi-docs";import{combineUrls as P}from"@redocly/theme/core/utils";import{CONFIG_FILE_NAME as U}from"../../../constants/common.js";import{PUBLIC_API_DEFINITIONS_FOLDER as k}from"../../constants/common.js";import{MAX_BUNDLING_ERRORS_TO_PRINT as wo}from"../../constants/plugins/openapi-docs.js";import{deepMerge as z}from"../../../utils/object/deep-merge.js";import{pluralize as j}from"../../../utils/string/pluralize.js";import{replaceEnvVariablesDeep as ho}from"../../utils/envs/replace-env-variables-deep.js";import{logger as J}from"../../tools/notifiers/logger.js";import{reporter as $}from"../../tools/notifiers/reporter.js";import{convertOpenRPC2OpenAPI as bo}from"./openrpc-converter.js";import{injectDecoratorIntoConfig as Oo}from"./decorators.js";import{getAllApiConfigsByPath as Co}from"../get-api-config.js";import{normalizeFeedbackOptions as yo}from"./utils.js";import{replaceFileExtension as A}from"./store-definition-bundles.js";import{ExternalResolver as Io}from"../../fs/utils/external-ref-resolver.js";import{formatBundleError as Ro}from"./format-bundle-error.js";const N=new Map;async function Jo(o,p){const{fs:n,cache:w,getConfig:h,isPathIgnored:m}=p;if(l.posix.basename(o)===U)return[];let t,x;try{t=(await w.load(o,"yaml")).data,x=(await w.load(o,"yaml")).data}catch{return[]}if(!t?.openapi&&!t?.swagger&&!t?.openrpc)return J.verbose(`${o} file is not definition. Skipping`),[];const s=!!t?.openrpc;s&&(t=bo(t));const d=await h("."),b=n.getFileInfo(o),c=await h(l.posix.dirname(o)),G=Co(c?.apis,o,c.configPath),F=[],H=await m(o);for(const r of G){if(!r.output&&H)continue;const O=z({decorators:d.decorators},c,{rbac:void 0},r),{resolvedObj:i}=ho(O);if(i.decorators&&typeof i.decorators!="object"){await $.panicOnBuildContentError(`'decorators' must be an object at redocly.yaml, got '${typeof i.decorators}'`);continue}if(i.plugins&&!Array.isArray(i.plugins)){await $.panicOnBuildContentError(`'plugins' must be an array at redocly.yaml, got '${typeof i.plugins}'`);continue}const E=c.configPath?l.posix.dirname(c.configPath):".",e=r.output?l.posix.join(E,r.output):o;if(await m(e))continue;b&&r.output&&!n.exists(e)&&n.addVirtualFile(e,b);const u=l.resolve(n.cwd,c.realConfigPath||U),y=new Io(n),X=await K({config:i,outputRelativePath:e,configPath:u,externalRefResolver:y,plugins:d.plugins}),M=l.resolve(n.cwd,o),q=await n.read(o),Q={config:X,base:l.dirname(M),doc:{source:new so(M,q),parsed:JSON.parse(JSON.stringify(t))},externalRefResolver:y},{bundle:{parsed:v},problems:L,visitorsData:W}=await co(Q),Y=W["markdown/markdown"]?.markdocChunks??[],a=lo(L);let V=[a.errors&&`${a.errors} ${j(a.errors,"error","errors")}`,a.warnings&&`${a.warnings} ${j(a.warnings,"warning","warnings")}`,a.ignored&&`${a.ignored} ignored`].filter(Boolean).join(", ");if(a.errors){const g=L.filter(f=>f.severity==="error");let B=`${V} while bundling ${e} definition:
|
|
2
|
+
`;const _=Math.min(g.length,wo);for(let f=0;f<_;f++){const ro=g[f],io=await Ro(ro,n.cwd);B+=`${io}
|
|
3
|
+
`}if(g.length>_){const f=g.length-_;B+=`... and ${f} more ${j(f,"error","errors")}`}await $.panicOnBuild(B)}a.warnings&&J.warn(`${V} while bundling %rp definition`,e);const I=Po(v.swagger!==void 0?await ao(v):v,c.metadata),R=z(d.openapi||{},c.openapi||{},r.openapi||r?.theme?.openapi||{});R.showSchemaCatalogLinks&&(I["x-schema-catalog-link"]=P(k,e));const Z=I["x-feedback"]||R.feedback||c.feedback,oo=s?[{url:P(k,`${A(e,".json")}?download`),label:"Download OpenRPC"}]:[{url:P(k,`${A(e,".json")}?download`)},{url:P(k,`${A(e,".yaml")}?download`)}],T={...R,feedback:yo(Z),hideSidebar:!0,disableRouter:!0,mockServer:s?{off:!0}:i?.mockServer||d?.mockServer,downloadUrls:R.downloadUrls||oo},S=uo(T);let D;try{D=new go(I,void 0,S)}catch(g){await $.panicOnBuild(g);continue}const{contentItems:no,flatItems:eo}=mo(D,S),to={definition:I,originalDefinition:s?x:void 0,config:i,relativePath:e,realRelativePath:b?.realRelativePath||e,customOutputRelativeFile:r.output&&e,markdocChunks:Y,contentItems:no,flatItems:eo,options:S,rawOptions:T,parser:D,isVirtual:b?.isVirtual??!1};F.push(to)}return F;async function K(r){const{config:O,outputRelativePath:i,configPath:E,externalRefResolver:e}=r,C=JSON.stringify(O.decorators);if(N.has(C))return N.get(C);const u=await fo(Oo(O,i,n.cwd),{configPath:E,externalRefResolver:e}),y=u.plugins[0];return r.plugins&&(u.plugins=[y,...await po(r.plugins,n.cwd)]),N.set(C,u),u}}async function Go(o,p){const{fs:n,cache:w,getConfig:h}=p,m=[];for(const t of n.scan(/(\.ya?ml|\.json)$/)){if(!await h(l.posix.dirname(t.relativePath)))continue;const s=await w.load(t.relativePath,"load-oas");s.data&&s.data.length&&m.push(...s.data.map(d=>({...d,isVirtual:t.isVirtual||d.isVirtual,hash:s.compoundHash})))}return m}function Po(o,p){if(!p)return o;const n={...o,info:{...o.info,"x-metadata":{...o.info?.["x-metadata"],...p}}};return delete n.info["x-metadata"]._customMessages,n}export{Jo as definitionLoader,Go as definitionsLoader};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import*as f from"openapi-sampler";function v(e){const a={openapi:"3.1.0",info:e.info,servers:e.servers,paths:{},components:{schemas:e.components?.schemas||{},securitySchemes:e.components?.["x-securitySchemes"]||{}},"x-redocly-openrpc":!0};if(e.externalDocs&&(a.externalDocs=e.externalDocs),e.methods)for(const n of e.methods){let t=n.params;t&&t.$ref&&(t=p(t,e));const r=Array.isArray(t)?t.map(i=>p(i,e)):[],d=p(n.result,e),c=n.errors?n.errors.map(i=>p(i,e)):[],s={security:n["x-security"],operationId:n.name,summary:n.summary,description:n.description,tags:n.tags?.map(i=>{const m=p(i,e);return m?.name||m}),deprecated:n.deprecated,externalDocs:n.externalDocs,servers:n.servers,requestBody:x(r,n.paramStructure,n.name,e),responses:j(d,c,e)};if(n.examples){const i={},m={};for(const o of n.examples){if(o.params&&o.params.length>0){const h=n.paramStructure==="by-position"?o.params.map(u=>u.value):Object.fromEntries(o.params?.map((u,l)=>[(r.find(y=>y?.name===u.name)||r[l])?.name||u.name,u.value]));i[o.name]={summary:o.name,description:o.description,value:{jsonrpc:"2.0",method:n.name,params:h,id:1}}}o.result&&(m[o.name]={summary:o.name,description:o.description,value:{jsonrpc:"2.0",method:n.name,result:o.result?.value||o.result,id:1}})}Object.keys(i).length>0&&s.requestBody?.content?.["application/json"]&&(s.requestBody.content["application/json"].examples=i),Object.keys(m).length>0&&s.responses?.["200"]?.content?.["application/json"]&&(s.responses[200].content["application/json"].examples=m)}a.paths[`${n.name}`]={post:s}}return a}function x(e,a="either",n,t){if(!e||e.length===0)return{content:{"application/json":{example:{jsonrpc:"2.0",method:n,id:1}}}};const r={},d=[];for(const s of e)s&&(r[s.name]=s.schema||{},s.description&&(r[s.name].description=s.description),s.required&&d.push(s.name));let c;return a==="by-position"?c={type:"array",items:e.map(s=>s?.schema||{}),minItems:e.filter(s=>s?.required).length}:c={type:"object",properties:r,required:d.length>0?d:void 0},{content:{"application/json":{schema:c,example:{jsonrpc:"2.0",method:n,params:e&&e.length>0?f.sample(c,{quiet:!0,format:"json"},t):void 0,id:1}}}}}function j(e,a=[],n){const t={};if(e&&e.schema&&(t[200]={description:e.description||"",content:{"application/json":{schema:e.schema||{},example:{jsonrpc:"2.0",result:f.sample(e.schema,{quiet:!0,format:"json"},n),id:1}}}}),a&&a.length>0)for(const r of a)r&&(t[r.code]={description:r.message,content:{"application/json":{example:{jsonrpc:"2.0",error:{code:r.code,message:r.message,data:r.data?{...r.data}:void 0},id:1}}}});return t}function p(e,a){if(e&&e.$ref&&typeof e.$ref=="string"&&e.$ref.startsWith("#/")){const n=e.$ref.substring(2).split("/");let t=a;for(const r of n){if(t===void 0)break;t=t[r]}return p(t,a)}return e}export{v as convertOpenRPC2OpenAPI};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{REDOCLY_ROUTE_RBAC as f,REDOCLY_TEAMS_RBAC as
|
|
1
|
+
import{REDOCLY_ROUTE_RBAC as f,REDOCLY_TEAMS_RBAC as a}from"@redocly/config";import{logger as R}from"../../../tools/notifiers/logger.js";import{SearchIndexer as x}from"../search-indexer.js";import{extractDocumentSearchFacets as S,setDocumentSearchFacets as p}from"./search-facets.js";function _(r,m,d,o,l,h){return async t=>{if(h)return[];const c=t.metadata||{},n=new x(r,m,t.baseSlug||t.slug);n.addInfo(r.definition.info,c);for(const e of d)try{n.addItem(e)}catch(i){console.error(i),R.warn(`Failed to add item to search indexer: ${i}`)}const g={},s=S(c,r.definition.info,o),u=n.getResult().map(e=>({...e,[a]:e[a]||t[a],[f]:t[f]||{slug:t.slug,fsPath:t.fsPath},facets:s}));return p({...s,...g},o,l),u}}export{_ as searchResolver};
|