@redocly/redoc 0.133.0-next.0 → 0.133.0-next.2
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 +71 -2
- package/dist/cli/develop.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/helpers/enhance-context.js +1 -1
- package/dist/server/constants/plugins/catalog-entities.d.ts +2 -0
- package/dist/server/constants/plugins/catalog-entities.js +1 -1
- package/dist/server/esbuild/esbuild.js +3 -3
- package/dist/server/esbuild/generate.d.ts +3 -0
- package/dist/server/esbuild/generate.js +8 -8
- package/dist/server/esbuild/plugins/api-request-handlers-resolver.js +1 -1
- package/dist/server/persistence/cache/mappers/create-cache-db-record.d.ts +1 -1
- package/dist/server/persistence/cache/mappers/create-cache-read-model.d.ts +1 -1
- package/dist/server/persistence/cache/repositories/{cache-local-repository.d.ts → cache-repository.d.ts} +3 -3
- package/dist/server/persistence/cache/repositories/cache-repository.js +1 -0
- package/dist/server/persistence/cache/services/cache-service.d.ts +2 -2
- package/dist/server/persistence/cache/services/cache-service.js +1 -1
- package/dist/server/persistence/file-hashes/mappers/create-file-hash-db-record.d.ts +1 -1
- package/dist/server/persistence/file-hashes/mappers/create-file-hash-read-model.d.ts +2 -2
- package/dist/server/persistence/file-hashes/mappers/create-file-hash-read-model.js +1 -1
- package/dist/server/persistence/file-hashes/repositories/{file-hashes-local-read-repository.d.ts → file-hashes-read-repository.d.ts} +3 -7
- package/dist/server/persistence/file-hashes/repositories/file-hashes-read-repository.js +1 -0
- package/dist/server/persistence/file-hashes/repositories/{file-hashes-local-repository.d.ts → file-hashes-repository.d.ts} +4 -3
- package/dist/server/persistence/file-hashes/repositories/file-hashes-repository.js +1 -0
- package/dist/server/persistence/file-hashes/repositories/{file-hashes-local-write-repository.d.ts → file-hashes-write-repository.d.ts} +2 -2
- package/dist/server/persistence/file-hashes/repositories/file-hashes-write-repository.js +1 -0
- package/dist/server/persistence/file-hashes/services/file-hashes-service.d.ts +3 -5
- package/dist/server/persistence/file-hashes/services/file-hashes-service.js +1 -1
- package/dist/server/persistence/kv/mappers/create-kv-db-record.d.ts +1 -1
- package/dist/server/persistence/kv/mappers/create-kv-list-entry.d.ts +1 -1
- package/dist/server/persistence/kv/mappers/create-kv-value.d.ts +1 -1
- package/dist/server/persistence/kv/repositories/{kv-remote-repository.d.ts → kv-repository.d.ts} +3 -3
- package/dist/server/persistence/kv/repositories/kv-repository.js +2 -0
- package/dist/server/persistence/kv/services/kv-service.d.ts +2 -2
- package/dist/server/persistence/kv/services/kv-service.js +1 -1
- package/dist/server/plugins/api-functions/index.js +1 -1
- package/dist/server/plugins/catalog-entities/database/catalog-entities-publisher.d.ts +6 -0
- package/dist/server/plugins/catalog-entities/database/catalog-entities-publisher.js +12 -0
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +29 -66
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
- package/dist/server/plugins/catalog-entities/database/consts.d.ts +45 -0
- package/dist/server/plugins/catalog-entities/database/consts.js +1 -0
- package/dist/server/plugins/catalog-entities/database/mappers/create-bff-entity.d.ts +1 -2
- package/dist/server/plugins/catalog-entities/database/mappers/create-bff-entity.js +1 -1
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-attributes-db-record.d.ts +1 -1
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.d.ts +1 -1
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-read-model.d.ts +1 -3
- 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-db-record-from-dto.d.ts +1 -1
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-db-record-from-file-schema.d.ts +1 -1
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-read-model.d.ts +3 -3
- package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-read-model.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/{local/catalog-entities-bff-repository.d.ts → bffEntities/bff-entities-read-repository.d.ts} +4 -4
- package/dist/server/plugins/catalog-entities/database/repositories/bffEntities/bff-entities-read-repository.js +131 -0
- package/dist/server/plugins/catalog-entities/database/repositories/catalog-entities-repository.d.ts +26 -0
- package/dist/server/plugins/catalog-entities/database/repositories/catalog-entities-repository.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/common/filters-repository.d.ts +8 -0
- package/dist/server/plugins/catalog-entities/database/repositories/common/filters-repository.js +82 -0
- package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.d.ts +7 -7
- package/dist/server/plugins/catalog-entities/database/repositories/common/revision-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/common/version-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/entities/entities-read-repository.d.ts +27 -0
- package/dist/server/plugins/catalog-entities/database/repositories/entities/entities-read-repository.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/entities/entities-write-repository.d.ts +27 -0
- package/dist/server/plugins/catalog-entities/database/repositories/entities/entities-write-repository.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/entityAttributes/entity-attributes-write-repository.d.ts +12 -0
- package/dist/server/plugins/catalog-entities/database/repositories/entityAttributes/entity-attributes-write-repository.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/{local/catalog-entities-relations-repository.d.ts → relations/relations-read-repository.d.ts} +7 -4
- package/dist/server/plugins/catalog-entities/database/repositories/relations/relations-read-repository.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/relations/relations-write-repository.d.ts +28 -0
- package/dist/server/plugins/catalog-entities/database/repositories/relations/relations-write-repository.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/types.d.ts +39 -0
- package/dist/server/plugins/catalog-entities/database/repositories/types.js +0 -0
- package/dist/server/plugins/catalog-entities/database/types.d.ts +26 -0
- package/dist/server/plugins/catalog-entities/database/types.js +0 -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.d.ts +2 -2
- 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 +2 -2
- 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.d.ts +2 -2
- 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 +2 -2
- 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 +38 -36
- package/dist/server/plugins/catalog-entities/schemas/database-schemas.js +1 -1
- package/dist/server/plugins/catalog-entities/schemas/dto-schemas.d.ts +1 -3
- package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.d.ts +3 -1
- package/dist/server/plugins/catalog-entities/utils/catalog-data-collector.d.ts +15 -0
- package/dist/server/plugins/catalog-entities/utils/catalog-data-collector.js +1 -1
- package/dist/server/plugins/catalog-entities/utils/hash-manager.d.ts +1 -0
- package/dist/server/plugins/catalog-entities/utils/hash-manager.js +1 -1
- package/dist/server/plugins/catalog-entities/utils/rbac-config-hash-cache.d.ts +18 -0
- package/dist/server/plugins/catalog-entities/utils/rbac-config-hash-cache.js +1 -0
- package/dist/server/plugins/dev-onboarding/api/adapters/apigee/adapter.js +3 -3
- package/dist/server/plugins/dev-onboarding/api/routes/index.js +1 -1
- package/dist/server/plugins/dev-onboarding/api/routes/meta.d.ts +4 -0
- package/dist/server/plugins/dev-onboarding/api/routes/meta.js +1 -0
- package/dist/server/plugins/dev-onboarding/api/types.d.ts +1 -0
- package/dist/server/plugins/dev-onboarding/template/App.js +5 -5
- package/dist/server/plugins/dev-onboarding/template/CreateAppDialog.js +3 -3
- package/dist/server/plugins/dev-onboarding/template/components/CallbackUrl.d.ts +5 -0
- package/dist/server/plugins/dev-onboarding/template/components/CallbackUrl.js +17 -0
- package/dist/server/plugins/dev-onboarding/template/components/DialogStyledComponents.d.ts +1 -0
- package/dist/server/plugins/dev-onboarding/template/components/DialogStyledComponents.js +6 -2
- package/dist/server/plugins/dev-onboarding/template/components/EditCallbackUrlDialog.d.ts +8 -0
- package/dist/server/plugins/dev-onboarding/template/components/EditCallbackUrlDialog.js +1 -0
- package/dist/server/plugins/entitlements/index.js +1 -1
- package/dist/server/plugins/entitlements/utils/get-billed-catalog-build-pages-count.d.ts +0 -1
- package/dist/server/plugins/entitlements/utils/get-billed-catalog-build-pages-count.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tool-schemas.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.d.ts +6 -1
- 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 +4 -1
- 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 +4 -1
- 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 +4 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/helpers/load-api-description.d.ts +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/helpers/load-api-description.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/index.d.ts +23 -5
- package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.d.ts +5 -1
- package/dist/server/plugins/mcp/docs-mcp/utils.d.ts +1 -1
- package/dist/server/plugins/mcp/docs-mcp/utils.js +1 -1
- package/dist/server/plugins/mcp/index.js +1 -1
- package/dist/server/plugins/mcp/servers/docs-server.js +1 -1
- package/dist/server/plugins/mcp/types.d.ts +5 -0
- package/dist/server/plugins/mcp/workers/execute-mcp-tool.d.ts +1 -0
- package/dist/server/plugins/mcp/workers/execute-mcp-tool.js +1 -1
- package/dist/server/plugins/openapi-docs/ast-utils.js +2 -2
- package/dist/server/plugins/scorecards/database/repositories/{local/scorecards-config-local-repository.d.ts → scorecards-config-repository.d.ts} +4 -4
- package/dist/server/plugins/scorecards/database/repositories/scorecards-config-repository.js +1 -0
- package/dist/server/plugins/scorecards/database/scorecards-config-service.js +1 -1
- package/dist/server/plugins/search/ai-indexer/prepare-semantic-documents.js +1 -1
- package/dist/server/providers/database/base-repository.js +2 -2
- package/dist/server/providers/database/client.d.ts +1 -1
- package/dist/server/providers/database/client.js +1 -1
- package/dist/server/providers/database/constants.d.ts +4 -9
- package/dist/server/providers/database/constants.js +1 -1
- package/dist/server/providers/database/copy-migrations.js +1 -1
- package/dist/server/providers/database/database-connection-factory.d.ts +2 -2
- package/dist/server/providers/database/database-connection-factory.js +1 -1
- package/dist/server/providers/database/database-connections-manager.d.ts +3 -8
- package/dist/server/providers/database/database-connections-manager.js +1 -1
- package/dist/server/providers/database/database-preconnect-service.js +1 -1
- package/dist/server/providers/database/databases/sqlite-db/drizzle.config.d.ts +12 -0
- package/dist/server/providers/database/databases/sqlite-db/drizzle.config.js +1 -0
- package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/schemas/entities-relations-table.d.ts +19 -0
- package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/schemas/entities-relations-table.js +1 -1
- package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/schemas/entities-table.d.ts +19 -0
- package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/schemas/entities-table.js +1 -1
- package/dist/server/providers/database/pagination/limit.d.ts +5 -0
- package/dist/server/providers/database/pagination/limit.js +1 -1
- package/dist/server/providers/database/transient-sqld-error.d.ts +14 -0
- package/dist/server/providers/database/transient-sqld-error.js +1 -0
- package/dist/server/providers/database/types.d.ts +6 -6
- package/dist/server/providers/database/utils/get-first-row.d.ts +19 -0
- package/dist/server/providers/database/utils/get-first-row.js +1 -0
- package/dist/server/store.d.ts +2 -0
- package/dist/server/store.js +1 -1
- package/dist/server/types/plugins/common.d.ts +2 -0
- 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/helpers/create-entity-schema.d.ts +0 -147
- package/dist/server/web-server/routes/catalog/helpers/create-entity-schema.js +1 -1
- package/dist/server/web-server/routes/catalog/helpers/upsert-pages-stats.js +1 -1
- package/dist/server/web-server/routes/catalog/parsers/entities/parse-entities.d.ts +1 -2
- package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity-update-data.d.ts +1 -2
- package/dist/server/web-server/routes/catalog/parsers/entities/parse-entity.d.ts +1 -2
- package/dist/server/web-server/routes/catalog/parsers/relations/parse-entities-relations.d.ts +1 -1
- package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation-update-data.d.ts +1 -1
- package/dist/server/web-server/routes/catalog/parsers/relations/parse-entity-relation.d.ts +1 -1
- package/dist/server/workers/mcp-tool-worker-pool.d.ts +1 -0
- package/dist/server/workers/mcp-tool-worker-pool.js +1 -1
- package/dist/server/workers/mcp-tool-worker.js +1 -1
- package/dist/server/workers/types.d.ts +5 -1
- package/package.json +16 -16
- package/dist/server/persistence/cache/repositories/cache-local-repository.js +0 -1
- package/dist/server/persistence/file-hashes/repositories/file-hashes-local-read-repository.js +0 -1
- package/dist/server/persistence/file-hashes/repositories/file-hashes-local-repository.js +0 -1
- package/dist/server/persistence/file-hashes/repositories/file-hashes-local-write-repository.js +0 -1
- package/dist/server/persistence/file-hashes/repositories/utils.d.ts +0 -10
- package/dist/server/persistence/file-hashes/repositories/utils.js +0 -1
- package/dist/server/persistence/kv/repositories/kv-remote-repository.js +0 -2
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.js +0 -123
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +0 -98
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +0 -145
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +0 -100
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +0 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.d.ts +0 -43
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.js +0 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.js +0 -1
- package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.d.ts +0 -20
- package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.js +0 -1
- package/dist/server/plugins/scorecards/database/repositories/local/scorecards-config-local-repository.js +0 -1
- package/dist/server/providers/database/database-initialization-strategy.d.ts +0 -17
- package/dist/server/providers/database/database-initialization-strategy.js +0 -1
- package/dist/server/providers/database/databases/catalog-sqlite/drizzle.config.d.ts +0 -11
- package/dist/server/providers/database/databases/catalog-sqlite/drizzle.config.js +0 -1
- package/dist/server/providers/database/databases/main-sqlite/drizzle.config.d.ts +0 -10
- package/dist/server/providers/database/databases/main-sqlite/drizzle.config.js +0 -1
- package/dist/server/providers/database/databases/sqld-sqlite/drizzle.config.d.ts +0 -14
- package/dist/server/providers/database/databases/sqld-sqlite/drizzle.config.js +0 -1
- /package/dist/server/providers/database/databases/{main-sqlite → sqlite-db}/schemas/cache-table.d.ts +0 -0
- /package/dist/server/providers/database/databases/{main-sqlite → sqlite-db}/schemas/cache-table.js +0 -0
- /package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/schemas/entities-attributes-table.d.ts +0 -0
- /package/dist/server/providers/database/databases/{catalog-sqlite → sqlite-db}/schemas/entities-attributes-table.js +0 -0
- /package/dist/server/providers/database/databases/{main-sqlite → sqlite-db}/schemas/file-hashes-table.d.ts +0 -0
- /package/dist/server/providers/database/databases/{main-sqlite → sqlite-db}/schemas/file-hashes-table.js +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/kv-table.d.ts +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/kv-table.js +0 -0
- /package/dist/server/providers/database/databases/{main-sqlite → sqlite-db}/schemas/scorecards-config-table.d.ts +0 -0
- /package/dist/server/providers/database/databases/{main-sqlite → sqlite-db}/schemas/scorecards-config-table.js +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-evaluation-runs-table.d.ts +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-evaluation-runs-table.js +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-level-results-table.d.ts +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-level-results-table.js +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-levels-rules-results-table.d.ts +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-levels-rules-results-table.js +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-results-table.d.ts +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-results-table.js +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-rule-results-table.d.ts +0 -0
- /package/dist/server/providers/database/databases/{sqld-sqlite → sqlite-db}/schemas/scorecards-rule-results-table.js +0 -0
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{buildSchema as O,isObjectType as g,isScalarType as
|
|
1
|
+
import{buildSchema as O,isObjectType as g,isScalarType as I,isEnumType as P,isInterfaceType as w,isUnionType as E,isInputObjectType as S,getNamedType as u,printType as F}from"graphql";import{removeLeadingSlash as k}from"@redocly/theme/core/utils";import{toKebabCase as $}from"../../../../../../utils/string/to-kebab-case.js";import{capitalize as A}from"../../../../../../utils/string/capitalize.js";import{promiseMapLimit as T}from"../../../../../utils/async/promise-map-limit.js";import{promiseMapLimitWithStatus as R}from"../../../../../utils/async/promise-map-limit-with-status.js";import{sha1 as j}from"../../../../../utils/crypto/sha1.js";import{removeMarkdocTags as D}from"../../../../../../markdoc/helpers/remove-markdoc-tags.js";import{BaseApiEntitiesExtractor as N}from"./base.js";const b=15,v=15,_=new Set(["String","ID","Int","Float","Boolean","DateTime","Date","Time","URL","URI","JSON","JSONObject","BigInt","BigDecimal"]);class Q extends N{#t;constructor(t){super("graphql",t),this.#t=t.context.logger}async loadApiDescriptions(){const t=[];for(const{relativePath:e}of this.context.fs.scan(/(\.gql|\.graphql)$/))try{if(e.includes("@l10n")||await this.context.isPathIgnored(e))continue;const a=await this.context.cache.load(e,"graphql-doc");if(!a.data)continue;const{content:i,metadata:n}=a.data,s=O(i),r=j(i);t.push({realRelativePath:e,relativePath:e,isVirtual:!1,hash:r,schema:s,content:i,metadata:n})}catch(a){this.#t.warn(`Failed to load GraphQL schema from ${e}: ${a instanceof Error?a.message:"Unknown error"}`)}return t}mapApiDescriptionToEntity(t,e){const a=k(t.realRelativePath),i=t.relativePath.replace(/\.(gql|graphql)$/,""),n=this.#s(i.split("/").pop()||"GraphQL Schema"),s=this.#c(t.metadata?.tags),r=t.metadata?.["x-redocly-catalog-key"],h=this.resolveEntityKey({realRelativePath:t.realRelativePath,customKey:typeof r=="string"?r:void 0,extensionPattern:/\.(gql|graphql)$/});return{type:this.type,key:h,title:n,summary:t.metadata?.description||null,tags:s.concat("graphql"),metadata:{specType:this.specType,descriptionFile:a},version:e}}async processApiDescription(t,e,a,i){const{schema:n}=t;if(!n)return;const s=this.getRbacTeamsForDefinition(t.relativePath),r=this.mapApiDescriptionToEntity(t,a);await this.catalogEntitiesService.createEntity({entity:r,sourceFile:t.realRelativePath,fileHash:t.hash,isRootEntity:!0,rbacTeams:s,source:"file",revision:e}),i.delete(`${r.key}:${a}`),await Promise.all([this.#a(t,r.key,r.version,a,e,i,s),this.#f(t,r.key,r.version,a,e,i,s)])}#a=async(t,e,a,i,n,s,r)=>{const{schema:h}=t,c=h.getTypeMap(),l=this.#n(h),o=Object.entries(c).filter(([f])=>!f.startsWith("__")&&!_.has(f)&&!l.has(f));if(o.length===0)return;const p=await R(o,v,async([f,m])=>{const y=await this.#l({typeName:f,type:m,description:t,parentKey:e,parentVersion:a,parentRevision:n,rbacTeams:r});s.delete(`${y?.key}:${i}`),y&&await this.catalogEntitiesService.createEntityRelation({sourceKey:e,type:"uses",targetKey:y.key,sourceFile:t.realRelativePath,fileHash:t.hash,sourceVersion:a,targetVersion:a,sourceRevision:n,targetRevision:n})},this.#t);p.count.failed>0&&this.#t.warn(`Schema processing completed with ${p.count.failed} failures out of ${o.length} types for ${t.realRelativePath}`),await this.#p({description:t,descriptionUniqueKey:e,userTypes:o,parentRevision:n})};#s=t=>{const e=t.replace(/[^A-Za-z0-9]+/g," ").trim();return e?e.split(" ").map(a=>a&&A(a)).join(" "):"GraphQL Schema"};#e=(t,e)=>`${e}-${$(t)}`;#r=t=>g(t)?"object":w(t)?"interface":E(t)?"union":P(t)?"enum":S(t)?"input":I(t)?"scalar":"unknown";#n=t=>{const e=new Set,a=t.getQueryType();a&&e.add(a.name);const i=t.getMutationType();i&&e.add(i.name);const n=t.getSubscriptionType();return n&&e.add(n.name),e};#i(t){const e=[],a=t.getQueryType();if(a){const s=a.getFields();for(const[r,h]of Object.entries(s))e.push({fieldName:r,field:h,operationType:"QUERY",rootTypeName:a.name})}const i=t.getMutationType();if(i){const s=i.getFields();for(const[r,h]of Object.entries(s))e.push({fieldName:r,field:h,operationType:"MUTATION",rootTypeName:i.name})}const n=t.getSubscriptionType();if(n){const s=n.getFields();for(const[r,h]of Object.entries(s))e.push({fieldName:r,field:h,operationType:"SUBSCRIBE",rootTypeName:n.name})}return e}#o=(t,e)=>{const a=[];if(t.args)for(const s of t.args){const r=u(s.type);r&&!r.name.startsWith("__")&&a.push(this.#e(r.name,e))}const i=[],n=u(t.type);return n&&!n.name.startsWith("__")&&i.push(this.#e(n.name,e)),{inputTypes:a,returnTypes:i}};#c=t=>{if(Array.isArray(t))return t.map(e=>String(e)).map(e=>e.trim()).filter(e=>e.length>0);if(typeof t=="string"){const e=t.trim();return e?[e]:[]}return[]};#l=async({typeName:t,type:e,description:a,parentKey:i,parentVersion:n,parentRevision:s,rbacTeams:r})=>{const h=this.#e(t,i),c=e.description??null,l=this.#r(e),o={type:"data-schema",key:h,title:t,summary:c,tags:["graphql"],metadata:{specType:this.specType,typeKind:l,sdl:this.#h(e,a.schema)},version:n};try{return await this.catalogEntitiesService.createEntity({entity:o,sourceFile:a.realRelativePath,fileHash:a.hash,rbacTeams:r,source:"file",revision:s})}catch(p){return this.#t.warn(`Failed to create data schema entity for ${t}: ${p instanceof Error?p.message:"Unknown error"}`),null}};#h=(t,e)=>{const a=new Set,i=[],n=new Set(["String","ID","Int","Float","Boolean"]),s=c=>{if(!c)return;const l=c.name;if(l.startsWith("__")||n.has(l)||a.has(l))return;const o=e.getType(l);o&&(a.add(l),i.push(o))};for(s(t);i.length>0;){const c=i.pop();if(g(c)){for(const o of c.getInterfaces?.()??[])s(o);const l=c.getFields();for(const o of Object.values(l)){s(u(o.type));for(const p of o.args??[])s(u(p.type))}}else if(w(c)){const l=c.getFields();for(const o of Object.values(l))s(u(o.type))}else if(E(c))for(const l of c.getTypes())s(l);else if(S(c)){const l=c.getFields();for(const o of Object.values(l))s(u(o.type))}}const r=[t.name,...[...a].filter(c=>c!==t.name)],h=[];for(const c of r){const l=e.getType(c);l&&h.push(F(l))}return h.join(`
|
|
2
2
|
|
|
3
|
-
`)};#p=async({description:t,descriptionUniqueKey:e,userTypes:a,parentRevision:i})=>{const
|
|
3
|
+
`)};#p=async({description:t,descriptionUniqueKey:e,userTypes:a,parentRevision:i})=>{const n=a.filter(([,s])=>g(s));n.length!==0&&await T(n,v,async([s,r])=>{const c=r.getInterfaces?.()??[];if(!c.length)return;const l=this.#e(s,e);await T([...c],5,async o=>{const p=this.#e(o.name,e);try{await this.catalogEntitiesService.createEntityRelation({sourceKey:l,type:"implements",targetKey:p,sourceFile:t.realRelativePath,fileHash:t.hash,sourceRevision:i,targetRevision:i})}catch(f){this.#t.warn(`Failed to create 'implements' relation ${l} -> ${p}: ${f instanceof Error?f.message:"Unknown error"}`)}})})};#f=async(t,e,a,i,n,s,r)=>{const{schema:h}=t,c=this.#i(h);if(c.length===0)return;const o=(await R(c,b,async({fieldName:p,field:f,operationType:m,rootTypeName:y})=>{const d=await this.#y(p,f,m,y,t,e,a,n,r);d&&s.delete(`${d}:${i}`)},this.#t)).count.failed;o>0&&this.#t.warn(`Operation extraction completed with ${o} failures out of ${c.length} operations for ${e}`)};#y=async(t,e,a,i,n,s,r,h,c)=>{const{inputTypes:l,returnTypes:o}=this.#o(e,s),p=await this.#u({fieldName:t,field:e,operationType:a,rootTypeName:i,inputTypes:l,returnTypes:o,description:n,descriptionUniqueKey:s,descriptionVersion:r,parentRevision:h,rbacTeams:c});return p&&await this.#m({apiOperationKey:p.key,inputTypes:l,returnTypes:o,descriptionUniqueKey:s,description:n,descriptionVersion:r,parentRevision:h}),p?.key??null};#u=async({fieldName:t,field:e,operationType:a,rootTypeName:i,inputTypes:n,returnTypes:s,description:r,descriptionUniqueKey:h,descriptionVersion:c,parentRevision:l,rbacTeams:o})=>{const p=t,m={type:"api-operation",key:`${h}-${$(`${a.toLowerCase()}-${t}`)}`,title:p,summary:e.description?D(e.description):null,tags:["graphql"],metadata:{method:a,path:`${i}.${t}`,payload:n,responses:s},version:c};try{return await this.catalogEntitiesService.createEntity({entity:m,sourceFile:r.realRelativePath,fileHash:r.hash,rbacTeams:o,source:"file",revision:l})}catch(y){return this.#t.warn(`Failed to create API operation entity for ${p}: ${y instanceof Error?y.message:"Unknown error"}`),null}};#m=async({apiOperationKey:t,inputTypes:e,returnTypes:a,descriptionUniqueKey:i,description:n,descriptionVersion:s,parentRevision:r})=>{await this.catalogEntitiesService.createEntityRelation({sourceKey:t,type:"partOf",targetKey:i,sourceFile:n.realRelativePath,fileHash:n.hash,sourceVersion:s,targetVersion:s,sourceRevision:r,targetRevision:r});const h=[...new Set(e)],c=[...new Set(a)],l=[...h.map(o=>({key:o,relationType:"uses"})),...c.map(o=>({key:o,relationType:"returns"}))];await T(l,b,async({key:o,relationType:p})=>{try{await this.catalogEntitiesService.createEntityRelation({sourceKey:t,type:p,targetKey:o,sourceFile:n.realRelativePath,fileHash:n.hash,sourceVersion:s,targetVersion:s,sourceRevision:r,targetRevision:r})}catch(f){this.#t.warn(`Failed to create relation between operation ${t} and type ${o} (${p}): ${f instanceof Error?f.message:"Unknown error"}`)}})}}export{Q as GraphqlEntitiesExtractor};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { type EntityFileSchema } from '@redocly/config';
|
|
2
1
|
import type { BundledDefinition } from '../../../../openapi-docs/load-definition';
|
|
3
2
|
import type { BaseApiEntitiesExtractorParams } from '../../../types/extractors.js';
|
|
3
|
+
import type { EntityDtoSchema } from '../../../schemas/dto-schemas';
|
|
4
4
|
import { BaseApiEntitiesExtractor } from './base.js';
|
|
5
5
|
export declare class OpenApiEntitiesExtractor extends BaseApiEntitiesExtractor<BundledDefinition> {
|
|
6
6
|
#private;
|
|
7
7
|
constructor(params: BaseApiEntitiesExtractorParams);
|
|
8
8
|
loadApiDescriptions(): Promise<BundledDefinition[]>;
|
|
9
|
-
mapApiDescriptionToEntity(description: BundledDefinition, version: string):
|
|
9
|
+
mapApiDescriptionToEntity(description: BundledDefinition, version: string): EntityDtoSchema;
|
|
10
10
|
processApiDescription(description: BundledDefinition, revision: string, version: string, entitiesToRemoveFromFile: Set<string>): Promise<void>;
|
|
11
11
|
}
|
|
12
12
|
//# sourceMappingURL=openapi-entities-extractor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{REDOCLY_TEAMS_RBAC as $}from"@redocly/config";import{removeLeadingSlash as
|
|
1
|
+
import{REDOCLY_TEAMS_RBAC as $}from"@redocly/config";import{removeLeadingSlash as x}from"@redocly/theme/core/utils";import{toKebabCase as y}from"../../../../../../utils/string/to-kebab-case.js";import{promiseMapLimit as E}from"../../../../../utils/async/promise-map-limit.js";import{promiseMapLimitWithStatus as N}from"../../../../../utils/async/promise-map-limit-with-status.js";import{extractTeamsFromScopeItems as R}from"../../../../../utils/rbac.js";import{removeMarkdocTags as w}from"../../../../../../markdoc/helpers/remove-markdoc-tags.js";import{BaseApiEntitiesExtractor as b}from"./base.js";import{OpenapiSchemaResolver as S}from"../../../utils/openapi-schema-resolver.js";import{extractPartsFromComponentsRef as k}from"../../../utils/extract-parts-from-components-ref.js";import{isValidTagName as v}from"../../../utils/is-valid-tag-name.js";const A=["get","post","put","delete","patch"],O=15,T=15;class _ extends b{#e;constructor(e){super("openapi",e),this.#e=e.context.logger}async loadApiDescriptions(){return await this.actions.loadOpenApiDefinitions(this.context)}mapApiDescriptionToEntity(e,n){const r=x(e.realRelativePath),s=e.definition.info.title,t=this.resolveEntityKey({realRelativePath:e.realRelativePath,customKey:e.definition["x-redocly-catalog-key"]});return{type:this.type,key:t,title:s,summary:w(e.definition.info.description),tags:e.definition.tags?.filter(a=>a.name&&v(a.name)).map(a=>a.name),metadata:{specType:this.specType,descriptionFile:r},version:n}}async processApiDescription(e,n,r,s){if(S.clearSchemaCache(),!e?.definition?.paths)return;const t=this.getRbacTeamsForDefinition(e.relativePath),a=this.mapApiDescriptionToEntity(e,r);await this.catalogEntitiesService.createEntity({entity:a,sourceFile:e.realRelativePath,fileHash:e.hash,source:"file",isRootEntity:!0,rbacTeams:t,revision:n}),s.delete(`${a.key}:${r}`),await this.#s(e,a.key,a.version,r,n,s,t);const o=this.#r(e.definition.paths);if(o.length!==0){const c=(await N(o,O,async({operation:m,path:h,method:l})=>{if(!m.operationId)return;const f=await this.#n(m,h,l,e,a.key,a.version,n,t);f&&s.delete(`${f}:${r}`)},this.#e)).count.failed;c>0&&this.#e.warn(`Extraction completed with ${c} failures out of ${o.length} operations for ${a.key}`)}}#r(e){return Object.entries(e).flatMap(([n,r])=>A.filter(s=>r[s]).map(s=>{const t=r[s];if(!t)throw new Error(`Operation not found for method ${s} on path ${n}`);return{operation:t,path:n,method:s.toUpperCase()}}))}async#s(e,n,r,s,t,a,o){const i=e.definition.components?.schemas;if(!i)return;const c=Object.entries(i);c.length!==0&&await E(c,T,async([m,h])=>{const l=await this.#o({schemaName:m,schema:h,description:e,parentKey:n,parentVersion:r,parentRevision:t,rbacTeams:o});a.delete(`${l?.key}:${s}`),l&&await this.catalogEntitiesService.createEntityRelation({sourceKey:n,sourceVersion:r,sourceRevision:t,type:"uses",targetKey:l.key,targetVersion:r,targetRevision:t,sourceFile:e.realRelativePath,fileHash:e.hash})})}async#o({schemaName:e,schema:n,description:r,parentKey:s,parentVersion:t,parentRevision:a,rbacTeams:o}){const i=S.resolveSchemaRefs(n,r),c=JSON.stringify(i),m=i[$]?R(i[$]):o,h=R(i["x-rbac"]),l={type:"data-schema",key:`${s}-${y(e)}`,title:e,summary:i.description??i.title??null,tags:[],metadata:{specType:this.specType,schema:c},version:t};try{return await this.catalogEntitiesService.createEntity({entity:l,sourceFile:r.realRelativePath,fileHash:r.hash,rbacTeams:h.length?h:m,source:"file",revision:a})}catch(f){return this.#e.error(`Failed to create data schema entity for ${e}: ${f instanceof Error?f.message:"Unknown error"}`),null}}async#n(e,n,r,s,t,a,o,i){const c=await Promise.all([this.#h(e.requestBody??null,s),this.#m(e.responses??{},s)]),m=c[0].schemaNames,h=c[1].schemaNames;c[0].errors.length>0&&this.#e.warn(`Schema extraction errors for operation ${e.operationId}: ${c[0].errors.join(", ")}`),c[1].errors.length>0&&this.#e.warn(`Response schema extraction errors for operation ${e.operationId}: ${c[1].errors.join(", ")}`);const l=m.map(u=>`${t}-${y(u)}`),f=h.map(u=>`${t}-${y(u)}`),p=await this.#f({path:n,method:r,operation:e,requestBodySchemasKeys:l,responseSchemasKeys:f,description:s,parentKey:t,parentVersion:a,parentRevision:o,rbacTeams:i});return p&&await Promise.all([this.#i(m,e.operationId??"",s.realRelativePath,s.hash,t,a,o),this.#c(h,e.operationId??"",s.realRelativePath,s.hash,t,a,o),this.#p({apiOperationKey:p.key,operationRelations:e["x-catalog-relations"],descriptionUniqueKey:t,description:s,parentVersion:a,parentRevision:o})]),p?.key??null}async#i(e,n,r,s,t,a,o){return e.length===0||!n?[]:await this.#a(e,n,r,s,t,a,o)}async#c(e,n,r,s,t,a,o){return e.length===0||!n?[]:await this.#a(e,n,r,s,t,a,o)}#h(e,n){const r=[],s=[];try{if(e&&"content"in e&&e.content)for(const t of Object.values(e.content)){if(!t.schema?.$ref)continue;const a=this.#t(t.schema.$ref);a?.componentType==="schemas"&&a.componentName&&r.push(a.componentName)}if(e&&e.$ref){const t=this.#t(e.$ref);if(t?.componentType==="requestBodies"&&t.componentName){const a=n.definition.components?.requestBodies?.[t.componentName];if(a&&"content"in a)for(const o of Object.values(a.content??{})){if(!o.schema?.$ref)continue;const i=this.#t(o.schema.$ref);i?.componentType==="schemas"&&i.componentName&&r.push(i.componentName)}}}}catch(t){s.push(`Failed to extract request body schemas: ${t instanceof Error?t.message:"Unknown error"}`)}return{schemaNames:[...new Set(r)],errors:s}}#m(e,n){const r=[],s=[];try{for(const t of Object.values(e)){if(t&&"content"in t&&t.content)for(const a of Object.values(t.content)){if(!a.schema?.$ref)continue;const o=this.#t(a.schema.$ref);o?.componentType==="schemas"&&o.componentName&&r.push(o.componentName)}if(t&&t.$ref){const a=this.#t(t.$ref);if(a?.componentType==="responses"&&a.componentName){const o=n.definition.components?.responses?.[a.componentName];if(o&&"content"in o)for(const i of Object.values(o.content??{})){if(!i.schema?.$ref)continue;const c=this.#t(i.schema.$ref);c?.componentType==="schemas"&&c.componentName&&r.push(c.componentName)}}}}}catch(t){s.push(`Failed to extract response schemas: ${t instanceof Error?t.message:"Unknown error"}`)}return{schemaNames:[...new Set(r)],errors:s}}#t(e){try{return k(e)}catch{return{componentType:"",componentName:null}}}async#a(e,n,r,s,t,a,o){return e.length===0?[]:await E(e,T,async i=>await this.#l({operationId:n,schemaName:i,descriptionSourceFile:r,descriptionHash:s,parentKey:t,parentVersion:a,parentRevision:o}))}async#l({operationId:e,schemaName:n,descriptionSourceFile:r,descriptionHash:s,parentKey:t,parentVersion:a,parentRevision:o}){const i=`${t}-${y(n)}`;try{return await this.catalogEntitiesService.createEntityRelation({sourceKey:`${t}-${y(e)}`,type:"uses",targetKey:i,sourceFile:r,fileHash:s,sourceVersion:a,targetVersion:a,sourceRevision:o,targetRevision:o}),i}catch(c){throw this.#e.error(`Failed to create relation between operation ${e} and schema ${n}: ${c instanceof Error?c.message:"Unknown error"}`),c}}async#f({path:e,method:n,operation:r,requestBodySchemasKeys:s,responseSchemasKeys:t,description:a,parentKey:o,parentVersion:i,parentRevision:c,rbacTeams:m}){const h=`${r.operationId}`,l=`${o}-${y(h)}`,f=r[$]?R(r[$]):m,p=R(r["x-rbac"]),u={type:"api-operation",key:l,title:h,summary:w(r.summary),tags:r.tags?.filter(g=>v(g)),metadata:{path:e,method:n,payload:s,responses:t},version:i};try{return await this.catalogEntitiesService.createEntity({entity:u,sourceFile:a.realRelativePath,fileHash:a.hash,rbacTeams:p.length>0?p:f,source:"file",revision:c})}catch(g){return this.#e.error(`Failed to create API operation entity for ${h}: ${g instanceof Error?g.message:"Unknown error"}`),null}}async#p({apiOperationKey:e,operationRelations:n,descriptionUniqueKey:r,description:s,parentVersion:t,parentRevision:a}){try{await this.catalogEntitiesService.createEntityRelation({sourceKey:e,type:"partOf",targetKey:r,sourceFile:s.realRelativePath,fileHash:s.hash,sourceVersion:t,targetVersion:t,sourceRevision:a,targetRevision:a}),await this.#y(e,s,n,t,a)}catch(o){this.#e.error(`Failed to create API operation relations for ${e}: ${o instanceof Error?o.message:"Unknown error"}`)}}async#y(e,n,r,s,t){r?.length&&await E(r,O,async a=>{try{this.validateEntityRelationFileSchema(a),await this.catalogEntitiesService.createEntityRelation({sourceKey:e,type:a.type,targetKey:a.key,sourceFile:n.realRelativePath,fileHash:n.hash,sourceVersion:s,targetVersion:"",sourceRevision:t,targetRevision:""})}catch(o){this.context.logger.warn(`Error creating entity relation for operation ${e} based on custom property: ${o instanceof Error?o.message:"Unknown error"}`)}})}}export{_ as OpenApiEntitiesExtractor};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{CATALOG_ENTITIES_FILES_REGEX as
|
|
1
|
+
import{CATALOG_ENTITIES_FILES_REGEX as u,ENTITY_SCHEMA_EXCLUDED_FOLDERS as m}from"../../../../constants/plugins/catalog-entities.js";import{FileHashStatus as f,FileType as a}from"../../../../persistence/file-hashes/types.js";import{OPERATORS as d}from"../../../../providers/database/pagination/constants.js";import{promiseMapLimit as h}from"../../../../utils/async/promise-map-limit.js";import{VERSION_NOT_SPECIFIED as p}from"@redocly/theme/core/constants";import{parseEntities as g}from"../../../../web-server/routes/catalog/parsers/entities/parse-entities.js";import{envConfig as T}from"../../../../config/env-config.js";import{extractFileContent as y}from"../../entities/extract-file-content.js";import{resolveEntityVersion as I}from"../../utils/resolve-entity-version.js";import{catalogDataCollector as l}from"../../utils/catalog-data-collector.js";const F=15;class ${#t;#e;#i;#r;#o;#s=new Map;constructor({fileHashManager:t,context:e,catalogEntitiesService:s,catalogConfig:o,shouldCalculateEntities:r}){this.#t=t,this.#e=e,this.#i=s,this.#r=o,this.#o=r}async extract(t){try{if(t&&this.#n(t)){this.#s=await this.#t.getStatusSnapshot(a.ENTITY_DEFINITION),await this.#a(t);return}this.#s=await this.#t.getStatusSnapshot(a.ENTITY_DEFINITION),await this.#t.markAllAsOutdated(a.ENTITY_DEFINITION);const s=this.#e.fs.scan(u).filter(({relativePath:r})=>this.#n(r));s.length&&l.addExtractor("fs");const o=new Set;await h(s,F,async({relativePath:r})=>{o.add(r),await this.#a(r)}),await this.#E(o)}catch(e){this.#e.logger.error("Error extracting entities.",e)}}#n=t=>!!(t.match(u)&&!m.some(e=>t.includes(e)));#a=async t=>{try{const e=await y(t,this.#e);if(!e){this.#e.logger.warn(`Error extracting content from ${t}.`);return}const s=await this.#t.computeFileHash(e),o=await this.#t.getByPath(t),r=this.#s.get(t),i=r!==void 0&&r!==f.UP_TO_DATE;if(!(o?.hash!==s||i||this.#o||T.FORCE_CATALOG_CACHE_REVALIDATE)){l.increaseSkippedFilesCount(),await this.#t.upsert(a.ENTITY_DEFINITION,t,s,f.UP_TO_DATE);return}const c=this.#c(e.entities,t);if(!c)return;const E=await this.#i.getEntityKeysAndVersionsBySourceFile(t);await this.#l(c,t,s,E),l.markSourceFileAsChanged(t),await this.#f(E,t),l.increaseProcessedFilesCount(),await this.#t.upsert(a.ENTITY_DEFINITION,t,s,f.OUTDATED),l.markFileHashPendingConfirmation({fileType:a.ENTITY_DEFINITION,filePath:t,hash:s})}catch(e){this.#e.logger.warn(`Error processing file "${t}". ${e instanceof Error?e.message:String(e)}.`)}};#c=(t,e)=>{try{return g(t,this.#r)}catch(s){return this.#e.logger.warn(`Error validating entities in "${e}". ${s instanceof Error?s.message:String(s)}.`),null}};#l=async(t,e,s,o)=>{for(const r of t)try{const i=I(r.version,e);if(!i.success){this.#e.logger.warn(`Entity "${r.key}" in file "${e}" has conflicting versions: file version "${i.fileVersion}" differs from folder version "${i.folderVersion}". Entity will not be created.`);continue}const n={...r,version:i.version};if(await this.#i.createEntity({entity:n,sourceFile:e,fileHash:s,source:"file"}),r.key){const c=i.version??p;o.delete(`${r.key}:${c}`)}}catch(i){const n=r.key??"unknown";this.#e.logger.warn(`Error processing entity "${n}" from "${e}". ${i instanceof Error?i.message:String(i)}.`)}};#f=async(t,e)=>{if(t.size===0)return;const s=Array.from(t).map(i=>{const[n,c]=i.split(":");return{key:n,version:c}}),o=Array.from(new Set(s.map(({key:i})=>i))),r=s.map(({key:i,version:n})=>({op:d.AND,conditions:[{field:"key",operator:"equal",value:i},{field:"version",operator:"equal",value:n}]}));await this.#i.deleteEntities({op:"AND",conditions:[{field:"key",operator:"in",value:o},{op:d.OR,conditions:r},{field:"source",operator:"equal",value:"file"},{field:"source_file",operator:"equal",value:e}]})};#E=async t=>{const e=await this.#t.getAllOutdated(a.ENTITY_DEFINITION);if(!e||e.length===0)return;const s=e.filter(({filePath:i})=>!t.has(i));if(s.length===0)return;s.forEach(({filePath:i})=>{l.markSourceFileAsRemoved(i)});const o=500,r=s.map(({filePath:i})=>i);for(;;){const i=await this.#i.getEntities({paginationParams:{limit:o,filter:{op:"AND",conditions:[{field:"source_file",operator:"in",value:r},{field:"is_current",operator:"equal",value:!0}]}}});if(!i||i.items.length===0)break;await this.#i.deleteEntities({field:"key",operator:"in",value:i.items.map(({key:n})=>n)})}}}export{$ as FsEntitiesExtractor};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{sha1 as D}from"../../utils/crypto/sha1.js";import{isValidSanitizedString as R}from"../../utils/validate-and-sanitize-string";import{CatalogEntitiesService as w}from"./database/catalog-entities-service.js";import{createPaginationParamsValidator as E}from"../../providers/database/pagination/schemas";import{parseSearch as _}from"../../providers/database/pagination/search";import{OPERATORS as A}from"../../providers/database/pagination/constants.js";import{CacheService as P}from"../../persistence/cache/services/cache-service.js";import{CATALOG_FILTERS_CACHE_NAMESPACE as T,CATALOG_FILTERS_CACHE_TTL_IN_SECONDS as N}from"../../constants/plugins/catalog-entities.js";import{isValidIsoDate as V}from"../../utils/is-valid-iso-date.js";import{expandTeamsForRead as L}from"../../utils";import{getNotAccessibleCatalogResources as O}from"./utils/get-not-accessible-catalog-resources.js";const
|
|
1
|
+
import{sha1 as D}from"../../utils/crypto/sha1.js";import{isValidSanitizedString as R}from"../../utils/validate-and-sanitize-string";import{CatalogEntitiesService as w}from"./database/catalog-entities-service.js";import{createPaginationParamsValidator as E}from"../../providers/database/pagination/schemas";import{parseSearch as _}from"../../providers/database/pagination/search";import{OPERATORS as A}from"../../providers/database/pagination/constants.js";import{CacheService as P}from"../../persistence/cache/services/cache-service.js";import{CATALOG_FILTERS_CACHE_NAMESPACE as T,CATALOG_FILTERS_CACHE_TTL_IN_SECONDS as N}from"../../constants/plugins/catalog-entities.js";import{isValidIsoDate as V}from"../../utils/is-valid-iso-date.js";import{expandTeamsForRead as L}from"../../utils";import{getNotAccessibleCatalogResources as O}from"./utils/get-not-accessible-catalog-resources.js";const it={all:"all",domains:"domain",services:"service",teams:"team",users:"user","api-descriptions":"api-description","data-schemas":"data-schema"},M={team:{field:"type",operator:"equal",value:"user"},"api-description":{field:"type",operator:"equal",value:"api-operation"}},k=async({entitiesTypes:e,serverOutDir:i,catalogConfig:a,queries:t={},rbacTeams:o,excludedTypes:g,excludedEntities:u,initialViewMode:p})=>{const m=await w.getInstance({baseDbDir:i}),d=I.concat("domains","owners"),s=E(d).parse(t),y=a.excludes?.map(c=>c.key)??[],C=e.filter(c=>c!=="all"),l=B(C,y);return s.filter?s.filter={op:A.AND,conditions:[s.filter,l]}:s.filter=l,await m.getEntitiesWithRelations({paginationParams:{sort:p==="table"?[{field:"updated_at",order:"ASC"},{field:"id",order:"ASC"}]:[{field:"type",order:"ASC"},{field:"title",order:"ASC"},{field:"id",order:"ASC"}],limit:10,...s},rbacTeams:o,excludedTypes:g,excludedEntities:u})},q=async({entityKey:e,serverOutDir:i,queries:a,rbacTeams:t,excludedTypes:o,excludedEntities:g})=>{const u=await w.getInstance({baseDbDir:i});let p=null;const m=a?.revision;m&&V(m)&&(p=m);const d=a?.version;if(!R(d,{pattern:/^[a-zA-Z0-9._-]+$/,maxLength:100,allowEmpty:!0}))return null;const s=await u.getEntityWithRelationsByKey({entityKey:e,filter:{revision:p,version:d},rbacTeams:t,excludedTypes:o,excludedEntities:g});if(!s)return null;const y=s.type==="data-schema"?await u.getRelatedEntities({entityKey:e,paginationParams:{limit:1,filter:{field:"type",operator:"equal",value:"api-description"}}}).then(f=>f.items?.[0]??null):null,C=M[s.type]??void 0,l=H(C,d,p),c=E(I).parse(a),b=await u.getRelatedEntities({entityKey:e,paginationParams:{limit:10,sort:c.sort?.length?c.sort:[{field:"updated_at",order:"ASC"},{field:"id",order:"ASC"}],filter:l,search:a?.search?_(a?.search,["key","type","title","summary"]):void 0},rbacTeams:t,excludedTypes:o,excludedEntities:g});return{status:"success",entity:s,relatedEntity:y,relations:b}},x=e=>{const i=JSON.stringify({entitiesTypes:e.entitiesTypes.sort(),filtersConfig:e.filtersConfig,rbacTeams:e.rbacTeams,excludedTypes:e.excludedTypes,excludedEntities:e.excludedEntities});return D(i)},K=async({serverOutDir:e,entitiesTypes:i,filtersConfig:a,rbacTeams:t,excludedTypes:o,excludedEntities:g})=>{if(!a||a.length===0)return{};const u=x({entitiesTypes:i,filtersConfig:a,rbacTeams:t,excludedTypes:o,excludedEntities:g}),p=await P.getInstance({baseDbDir:e,databaseType:"local"}),m=await p.get({key:u,namespace:T});if(m)return m;const d=await w.getInstance({baseDbDir:e}),s=[],y=new Map;for(const n of a)!n.options||n.options.length===0?s.push(n.property):y.set(n.property,n.options);const C=await d.getCatalogFilters({entitiesTypes:i,emptyFilters:s,rbacTeams:t,excludedTypes:o,excludedEntities:g}),l={};for(const n of a){const c=y.get(n.property);if(!c){const r=C[n.property];l[n.property]=r&&r.length>0?r:[];continue}const f=(await d.getCatalogFilters({entitiesTypes:i,emptyFilters:[n.property],rbacTeams:t,excludedTypes:o,excludedEntities:g}))[n.property];if(!f){l[n.property]=[];continue}const v=new Map;for(const r of f){const h=r.value.toLowerCase().trim();v.set(h,{originalValue:r.value,count:r.count})}l[n.property]=c.map(r=>{const h=r.toLowerCase().trim(),S=v.get(h);return{value:S?.originalValue??r,count:S?.count??0}}).filter(r=>r.count>0).sort((r,h)=>r.value.localeCompare(h.value))}return await p.set({key:u,value:l,namespace:T,ttlInSeconds:N}),l},z=async(e,{props:i},{variables:a},{serverOutDir:t,getRouteSharedDataByFsPath:o,getConfig:g})=>{const u=i?.catalogConfig||{};if(!e.params||!i?.catalogConfig)return{status:"notFound"};const[p,m,d]=e.params;if(!p)return{status:"notFound"};const s=W(u,p),y=s?.includes?.map(S=>S.type)??[];if(!s||s.hide)return{status:"notFound"};const C=g().access?.rbac||{},l=L(C,a?.rbac.teams||[]),{catalogs:n,types:c,entities:b}=O({rbacConfig:C,currentRbacTeams:a?.rbac.teams||[]});if(n.includes(p))return{status:"notFound"};if(!d&&m!=="entities"){const S=await K({entitiesTypes:y,serverOutDir:t,filtersConfig:s.filters,rbacTeams:l,excludedTypes:c,excludedEntities:b}),F=e.queries?.viewMode??"table";return{status:"success",catalogSwitcherItems:j(u,s,n),entitiesTypes:y,entities:await k({entitiesTypes:y,serverOutDir:t,catalogConfig:s,queries:e.queries,rbacTeams:l,excludedTypes:c,excludedEntities:b,initialViewMode:F}),catalogConfig:s,filters:S,initialViewMode:F}}const f=await q({entityKey:d,serverOutDir:t,queries:e.queries,rbacTeams:l,excludedTypes:c,excludedEntities:b});if(!f)return{status:"notFound"};const v=f?.entity.sourceFile,r=f?.entity.type==="api-description",h=v&&r&&o(v)||{};return{status:"success",entity:f.entity,relatedEntity:f.relatedEntity,relations:f.relations,entitiesCatalogConfig:u,catalogConfig:s,sharedDataIds:h}},W=(e,i)=>Object.values(e.catalogs??{}).find(a=>a&&typeof a=="object"&&"slug"in a&&a.slug===i),j=(e,i,a)=>Object.values(e.catalogs??{}).filter(t=>!t?.hide&&!a.includes(t?.slug??"")).map(t=>({labelTranslationKey:t?.catalogSwitcherLabelTranslationKey??t?.slug??"",slug:t?.slug??"",selected:t?.slug===i.slug})).sort((t,o)=>t.slug.localeCompare(o.slug)),B=(e,i)=>({op:"AND",conditions:[...e.length?[{field:"type",operator:"in",value:e}]:[],...i.length?[{field:"key",operator:"in",value:i,modifier:"not"}]:[]]}),H=(e,i,a)=>{let t=e;if(i!==void 0){const o={field:"version",operator:"equal",value:i};t=t?{op:A.AND,conditions:[t,o]}:o}if(a){const o={field:"revision",operator:"equal",value:a};t=t?{op:A.AND,conditions:[t,o]}:o}return t},I=["type","key","title","summary","tags","metadata","metadata.*","git","contact","links","id","source","source_file","created_at","updated_at"];var st=z;export{st as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{FileType as m}from"../../persistence/file-hashes/types.js";import{envConfig as
|
|
1
|
+
import{FileHashStatus as A,FileType as m}from"../../persistence/file-hashes/types.js";import{envConfig as N}from"../../config/env-config.js";import{CATALOG_BASE_SLUG as h}from"../../../constants/catalog-entities.js";import{telemetryTraceStep as H}from"../../../cli/telemetry/helpers/trace-step.js";import{catalogDataCollector as f}from"./utils/catalog-data-collector.js";import{CATALOG_FILTERS_CACHE_NAMESPACE as L,ENTITIES_MAP_GLOBAL_DATA_KEY as x}from"../../constants/plugins/catalog-entities.js";import{CacheService as G}from"../../persistence/cache/services/cache-service.js";import{getTemplatePath as b}from"./utils/get-template-path.js";import{getCompleteCatalogConfig as y}from"./get-complete-catalog-config.js";import{AsyncApiEntitiesExtractor as B}from"./extensions/extractors/api-description/asyncapi-entities-extractor.js";import{GraphqlEntitiesExtractor as M}from"./extensions/extractors/api-description/graphql-entities-extractor.js";import{FileHashesService as k}from"../../persistence/file-hashes/services/file-hashes-service.js";import{CatalogEntitiesService as Y}from"./database/catalog-entities-service.js";import{CatalogEntitiesPublisher as j}from"./database/catalog-entities-publisher.js";import{ArazzoEntitiesExtractor as q}from"./extensions/extractors/api-description/arazzo-entities-extractor.js";import{FsEntitiesExtractor as z}from"./extensions/extractors/fs-entities-extractor.js";import{HashManager as U}from"./utils/hash-manager.js";import{RbacConfigHashCache as W}from"./utils/rbac-config-hash-cache.js";import{OpenApiEntitiesExtractor as J}from"./extensions/extractors/api-description/openapi-entities-extractor.js";const Z="catalog-entity-template",$="catalog-entity";let D=!0;async function K(){return{id:"CatalogEntities",requiredEntitlements:["catalog"],async processContent(t,e){const i=await e.getConfig(),r=y(i.entitiesCatalog);if(!r.show)return;const{logger:o}=e,a=t.registerServerPropsGetter($,b("../get-server-props.js")),g=t.createTemplate(Z,b("../template/index.js"));t.addRoute({duplicateInAllLocales:!0,slug:h,fsPath:"",templateId:g,excludeFromSidebar:!0,hasClientRoutes:!0,serverPropsGetterIds:[a],getNavText:()=>Promise.resolve("Catalog"),getStaticData:async()=>({props:{catalogConfig:r}})});const[n]=Object.entries(r.catalogs??{}).find(([T,p])=>!p?.hide)||[];n&&t.addRedirect(h,{type:302,to:`${h}/${n}`},{trackOriginalSource:!1}),o.info("Catalog Entities plugin finished")},async afterRoutesCreated(t,e){await H("build.plugin.catalog_entities",async i=>{const r=await e.getConfig(),o=y(r.entitiesCatalog);if(i?.setAttribute("config",JSON.stringify(o)),!o.show)return;const{logger:a}=e;f.resetForRun();const g=D&&N.isDevelopMode,n=await G.getInstance({baseDbDir:t.serverOutDir,databaseType:"local"}),T=new W(n),{rbacConfigChanged:p}=await T.syncAndDetectChange(r.access?.rbac??null),l=g||p,s=await Y.getInstance({baseDbDir:t.serverOutDir,removeExisting:g,databaseType:"local",runWithPragmaWalWriteOptimization:!0}),E=await k.getInstance({baseDbDir:t.serverOutDir,databaseType:"local"}),c=new U(E),S=[new z({fileHashManager:c,context:e,catalogEntitiesService:s,catalogConfig:o,shouldCalculateEntities:l}),new J({actions:t,context:e,catalogEntitiesService:s,fileHashManager:c,fileType:m.OPENAPI_DESCRIPTION,shouldCalculateEntities:l}),new B({actions:t,context:e,catalogEntitiesService:s,fileHashManager:c,fileType:m.ASYNCAPI_DESCRIPTION,shouldCalculateEntities:l}),new M({actions:t,context:e,catalogEntitiesService:s,fileHashManager:c,fileType:m.GRAPHQL_DESCRIPTION,shouldCalculateEntities:l}),new q({actions:t,context:e,catalogEntitiesService:s,fileHashManager:c,fileType:m.ARAZZO_DESCRIPTION,shouldCalculateEntities:l})];a.info("Starting entities extractors...");const P=a.startTiming();await s.transaction(async()=>{await Promise.all(S.map(async C=>C.extract()))});const O=s.getEntitySources();t.setGlobalData({[x]:O}),await n.deleteByNamespace(L),a.infoTime(P,"Entities extractors finished");const{changedSourceFiles:w,removedSourceFiles:d}=f.getPublishDelta(),v=a.startTiming(),I=await j.publishFromLocalToRemote(p?{baseDbDir:t.serverOutDir}:{baseDbDir:t.serverOutDir,changedSourceFiles:w,removedSourceFiles:d});a.infoTime(v,"Entities published to the database"),d.length&&await E.deleteFileHashes({op:"AND",conditions:[{field:"status",operator:"equal",value:A.OUTDATED},{field:"file_path",operator:"in",value:d}]});const _=f.getFileHashConfirmations();for(const{fileType:C,filePath:R,hash:F}of _)await E.upsertFileHash({fileType:C,filePath:R,hash:F,status:A.UP_TO_DATE});I||a.warn("Local catalog extraction completed, but publish to remote was skipped because remote connection is unavailable.");const u=await f.getCatalogEntitiesData(s);i?.setAttribute("totalEntities",u.totalEntitiesCount),i?.setAttribute("entitiesCountByType",JSON.stringify(u.countOfEntitiesByType)),i?.setAttribute("totalFilesSkippedByHash",u.totalFilesSkippedByHash),i?.setAttribute("totalProcessedFiles",u.totalProcessedFiles),i?.setAttribute("extractors",u.extractors),D=!1})}}}var dt=K;export{K as catalogEntitiesPlugin,dt as default};
|
|
@@ -1,60 +1,61 @@
|
|
|
1
1
|
import type { FromSchema } from 'json-schema-to-ts';
|
|
2
|
+
/** Matches Drizzle `DatabaseEntityRelation` / `createEntityRelationFieldsForSelect` (camelCase). */
|
|
2
3
|
export declare const entityRelationDatabaseSchema: {
|
|
3
4
|
readonly type: "object";
|
|
4
5
|
readonly properties: {
|
|
5
6
|
readonly id: {
|
|
6
7
|
readonly type: "string";
|
|
7
8
|
};
|
|
8
|
-
readonly
|
|
9
|
+
readonly organizationId: {
|
|
9
10
|
readonly type: "string";
|
|
10
11
|
};
|
|
11
|
-
readonly
|
|
12
|
+
readonly projectId: {
|
|
12
13
|
readonly type: "string";
|
|
13
14
|
};
|
|
14
|
-
readonly
|
|
15
|
+
readonly sourceKey: {
|
|
15
16
|
readonly type: "string";
|
|
16
17
|
};
|
|
17
|
-
readonly
|
|
18
|
-
readonly type:
|
|
19
|
-
};
|
|
20
|
-
readonly source_version: {
|
|
21
|
-
readonly type: readonly ["string", "null"];
|
|
22
|
-
};
|
|
23
|
-
readonly source_revision: {
|
|
24
|
-
readonly type: readonly ["string", "null"];
|
|
18
|
+
readonly sourceVersion: {
|
|
19
|
+
readonly type: "string";
|
|
25
20
|
};
|
|
26
|
-
readonly
|
|
21
|
+
readonly sourceRevision: {
|
|
27
22
|
readonly type: "string";
|
|
28
23
|
};
|
|
29
|
-
readonly
|
|
24
|
+
readonly sourceToTargetRelation: {
|
|
30
25
|
readonly type: "string";
|
|
31
26
|
};
|
|
32
|
-
readonly
|
|
33
|
-
readonly type:
|
|
27
|
+
readonly targetKey: {
|
|
28
|
+
readonly type: "string";
|
|
34
29
|
};
|
|
35
|
-
readonly
|
|
36
|
-
readonly type:
|
|
30
|
+
readonly targetVersion: {
|
|
31
|
+
readonly type: "string";
|
|
37
32
|
};
|
|
38
|
-
readonly
|
|
39
|
-
readonly type:
|
|
33
|
+
readonly targetRevision: {
|
|
34
|
+
readonly type: "string";
|
|
40
35
|
};
|
|
41
|
-
readonly
|
|
36
|
+
readonly targetToSourceRelation: {
|
|
42
37
|
readonly type: "string";
|
|
43
38
|
};
|
|
44
|
-
readonly
|
|
39
|
+
readonly sourceFile: {
|
|
45
40
|
readonly type: readonly ["string", "null"];
|
|
46
41
|
};
|
|
47
|
-
readonly
|
|
42
|
+
readonly fileHash: {
|
|
48
43
|
readonly type: readonly ["string", "null"];
|
|
49
44
|
};
|
|
50
|
-
readonly
|
|
45
|
+
readonly isDeleted: {
|
|
46
|
+
readonly type: readonly ["boolean", "null"];
|
|
47
|
+
};
|
|
48
|
+
readonly createdAt: {
|
|
51
49
|
readonly type: "string";
|
|
52
50
|
};
|
|
53
|
-
readonly
|
|
51
|
+
readonly updatedAt: {
|
|
54
52
|
readonly type: "string";
|
|
55
53
|
};
|
|
54
|
+
readonly lastSeenRunId: {
|
|
55
|
+
readonly type: readonly ["string", "null"];
|
|
56
|
+
};
|
|
56
57
|
};
|
|
57
|
-
readonly required: readonly ["id", "
|
|
58
|
+
readonly required: readonly ["id", "organizationId", "projectId", "sourceKey", "sourceVersion", "sourceRevision", "sourceToTargetRelation", "targetKey", "targetVersion", "targetRevision", "targetToSourceRelation", "createdAt", "updatedAt"];
|
|
58
59
|
readonly additionalProperties: false;
|
|
59
60
|
};
|
|
60
61
|
export declare const entityDatabaseSchema: {
|
|
@@ -63,10 +64,10 @@ export declare const entityDatabaseSchema: {
|
|
|
63
64
|
readonly id: {
|
|
64
65
|
readonly type: "string";
|
|
65
66
|
};
|
|
66
|
-
readonly
|
|
67
|
+
readonly organizationId: {
|
|
67
68
|
readonly type: "string";
|
|
68
69
|
};
|
|
69
|
-
readonly
|
|
70
|
+
readonly projectId: {
|
|
70
71
|
readonly type: "string";
|
|
71
72
|
};
|
|
72
73
|
readonly key: {
|
|
@@ -96,19 +97,20 @@ export declare const entityDatabaseSchema: {
|
|
|
96
97
|
readonly links: {
|
|
97
98
|
readonly type: readonly ["string", "null"];
|
|
98
99
|
};
|
|
99
|
-
readonly
|
|
100
|
+
readonly createdAt: {
|
|
100
101
|
readonly type: "string";
|
|
101
102
|
};
|
|
102
|
-
readonly
|
|
103
|
+
readonly updatedAt: {
|
|
103
104
|
readonly type: "string";
|
|
104
105
|
};
|
|
105
106
|
readonly source: {
|
|
106
107
|
readonly type: "string";
|
|
108
|
+
readonly enum: readonly ["file", "remote"];
|
|
107
109
|
};
|
|
108
|
-
readonly
|
|
110
|
+
readonly sourceFile: {
|
|
109
111
|
readonly type: readonly ["string", "null"];
|
|
110
112
|
};
|
|
111
|
-
readonly
|
|
113
|
+
readonly fileHash: {
|
|
112
114
|
readonly type: readonly ["string", "null"];
|
|
113
115
|
};
|
|
114
116
|
readonly version: {
|
|
@@ -120,20 +122,20 @@ export declare const entityDatabaseSchema: {
|
|
|
120
122
|
readonly hash: {
|
|
121
123
|
readonly type: readonly ["string", "null"];
|
|
122
124
|
};
|
|
123
|
-
readonly
|
|
125
|
+
readonly isCurrent: {
|
|
124
126
|
readonly type: readonly ["boolean", "null"];
|
|
125
127
|
};
|
|
126
|
-
readonly
|
|
128
|
+
readonly isDefaultVersion: {
|
|
127
129
|
readonly type: readonly ["boolean", "null"];
|
|
128
130
|
};
|
|
129
|
-
readonly
|
|
131
|
+
readonly isDeleted: {
|
|
130
132
|
readonly type: readonly ["boolean", "null"];
|
|
131
133
|
};
|
|
132
|
-
readonly
|
|
134
|
+
readonly rbacTeams: {
|
|
133
135
|
readonly type: readonly ["string", "null"];
|
|
134
136
|
};
|
|
135
137
|
};
|
|
136
|
-
readonly required: readonly ["id", "
|
|
138
|
+
readonly required: readonly ["id", "organizationId", "projectId", "key", "type", "title", "createdAt", "updatedAt", "source"];
|
|
137
139
|
readonly additionalProperties: false;
|
|
138
140
|
};
|
|
139
141
|
export declare const relatedEntityDatabaseSchema: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ENTITY_RELATION_TYPES as t}from"@redocly/config";const i={type:"object",properties:{id:{type:"string"},
|
|
1
|
+
import{ENTITY_RELATION_TYPES as t}from"@redocly/config";const i={type:"object",properties:{id:{type:"string"},organizationId:{type:"string"},projectId:{type:"string"},sourceKey:{type:"string"},sourceVersion:{type:"string"},sourceRevision:{type:"string"},sourceToTargetRelation:{type:"string"},targetKey:{type:"string"},targetVersion:{type:"string"},targetRevision:{type:"string"},targetToSourceRelation:{type:"string"},sourceFile:{type:["string","null"]},fileHash:{type:["string","null"]},isDeleted:{type:["boolean","null"]},createdAt:{type:"string"},updatedAt:{type:"string"},lastSeenRunId:{type:["string","null"]}},required:["id","organizationId","projectId","sourceKey","sourceVersion","sourceRevision","sourceToTargetRelation","targetKey","targetVersion","targetRevision","targetToSourceRelation","createdAt","updatedAt"],additionalProperties:!1},r={type:"object",properties:{id:{type:"string"},organizationId:{type:"string"},projectId:{type:"string"},key:{type:"string"},type:{type:"string"},title:{type:"string"},summary:{type:["string","null"]},tags:{type:["string","null"]},metadata:{type:["string","null"]},git:{type:["string","null"]},contact:{type:["string","null"]},links:{type:["string","null"]},createdAt:{type:"string"},updatedAt:{type:"string"},source:{type:"string",enum:["file","remote"]},sourceFile:{type:["string","null"]},fileHash:{type:["string","null"]},version:{type:["string","null"]},revision:{type:["string","null"]},hash:{type:["string","null"]},isCurrent:{type:["boolean","null"]},isDefaultVersion:{type:["boolean","null"]},isDeleted:{type:["boolean","null"]},rbacTeams:{type:["string","null"]}},required:["id","organizationId","projectId","key","type","title","createdAt","updatedAt","source"],additionalProperties:!1},n={type:"object",properties:{id:{type:"string"},key:{type:"string"},title:{type:"string"},type:{type:"string"},summary:{type:["string","null"]},source:{type:"string"},relation_role:{type:["string","null"]},relation_type:{type:["string","null"],enum:t},source_file:{type:["string","null"]},created_at:{type:["string"]},updated_at:{type:["string"]},metadata:{type:["string","null"]},version:{type:["string","null"]}},required:["id","key","title","type","source","created_at","updated_at"],additionalProperties:!1},s={type:"object",properties:{id:{type:"string",minLength:1},key:{type:"string",minLength:1},title:{type:"string",minLength:1},type:{type:"string",minLength:1},summary:{type:["string","null"]},source:{type:"string",minLength:1},source_file:{type:["string","null"]},created_at:{type:["string"]},updated_at:{type:["string"]},metadata:{type:["string","object","null"]},version:{type:["string","null"]},revision:{type:["string","null"]},direction:{type:"string",enum:["outgoing","incoming"]},relation_field:{type:"string",minLength:1}},required:["id","key","title","type","source","direction","relation_field","created_at","updated_at"],additionalProperties:!1};export{r as entityDatabaseSchema,i as entityRelationDatabaseSchema,n as relatedEntityDatabaseSchema,s as relatedEntityQueryRowDatabaseSchema};
|
|
@@ -100,8 +100,6 @@ export declare const entitiesRelationsDtoSchema: {
|
|
|
100
100
|
};
|
|
101
101
|
export type EntityRelationDtoSchema = FromSchema<typeof entityRelationDtoSchema>;
|
|
102
102
|
export type EntitiesRelationsDtoSchema = FromSchema<typeof entitiesRelationsDtoSchema>;
|
|
103
|
-
export type EntityDtoSchema = EntityBaseFileSchema
|
|
104
|
-
revision?: string;
|
|
105
|
-
};
|
|
103
|
+
export type EntityDtoSchema = EntityBaseFileSchema;
|
|
106
104
|
export type EntityAttributesDtoSchema = FromSchema<typeof entityAttributesDtoSchema>;
|
|
107
105
|
//# sourceMappingURL=dto-schemas.d.ts.map
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { EntityLinkFileSchema, EntityContactFileSchema } from '@redocly/config';
|
|
2
|
+
export type EntitySource = 'file' | 'remote';
|
|
2
3
|
export type EntityRelationReadModelSchema = {
|
|
3
4
|
id: string;
|
|
4
5
|
organizationId: string;
|
|
@@ -10,6 +11,7 @@ export type EntityRelationReadModelSchema = {
|
|
|
10
11
|
targetVersion?: string | null;
|
|
11
12
|
targetRevision?: string | null;
|
|
12
13
|
type: string;
|
|
14
|
+
lastSeenRunId: string | null;
|
|
13
15
|
createdAt: string;
|
|
14
16
|
updatedAt: string;
|
|
15
17
|
object: 'catalogEntityRelation';
|
|
@@ -27,7 +29,7 @@ export type EntityReadModelSchema = {
|
|
|
27
29
|
git?: string[] | null;
|
|
28
30
|
contact?: EntityContactFileSchema | null;
|
|
29
31
|
links?: EntityLinkFileSchema[] | null;
|
|
30
|
-
source:
|
|
32
|
+
source: EntitySource;
|
|
31
33
|
sourceFile?: string | null;
|
|
32
34
|
version: string;
|
|
33
35
|
revision: string;
|
|
@@ -1,12 +1,27 @@
|
|
|
1
1
|
import type { SpecType } from '../types/extractors';
|
|
2
2
|
import type { CatalogEntitiesService } from '../database/catalog-entities-service';
|
|
3
|
+
import type { FileType } from '../../../persistence/file-hashes/types.js';
|
|
3
4
|
type Extractor = SpecType | 'fs';
|
|
4
5
|
type CountOfEntitiesByType = Record<string, number>;
|
|
6
|
+
export type PendingFileHashConfirmation = {
|
|
7
|
+
fileType: FileType;
|
|
8
|
+
filePath: string;
|
|
9
|
+
hash: string;
|
|
10
|
+
};
|
|
5
11
|
export declare class CatalogDataCollector {
|
|
6
12
|
#private;
|
|
13
|
+
resetForRun(): void;
|
|
7
14
|
addExtractor(extractor: Extractor): void;
|
|
8
15
|
increaseSkippedFilesCount(): void;
|
|
9
16
|
increaseProcessedFilesCount(): void;
|
|
17
|
+
markSourceFileAsChanged(sourceFile: string): void;
|
|
18
|
+
markSourceFileAsRemoved(sourceFile: string): void;
|
|
19
|
+
getPublishDelta(): {
|
|
20
|
+
changedSourceFiles: string[];
|
|
21
|
+
removedSourceFiles: string[];
|
|
22
|
+
};
|
|
23
|
+
markFileHashPendingConfirmation(entry: PendingFileHashConfirmation): void;
|
|
24
|
+
getFileHashConfirmations(): PendingFileHashConfirmation[];
|
|
10
25
|
getCatalogEntitiesData(catalogEntitiesService: CatalogEntitiesService): Promise<{
|
|
11
26
|
totalEntitiesCount: number | "error";
|
|
12
27
|
countOfEntitiesByType: "error" | CountOfEntitiesByType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const s="error";class o{#e=new Set;#t;#i;#s=0;#a=0;#n=new Set;#o=new Set;#r=new Map;resetForRun(){this.#e.clear(),this.#t=void 0,this.#i=void 0,this.#s=0,this.#a=0,this.#n.clear(),this.#o.clear(),this.#r.clear()}addExtractor(e){this.#e.add(e)}increaseSkippedFilesCount(){this.#s++}increaseProcessedFilesCount(){this.#a++}markSourceFileAsChanged(e){this.#n.add(e)}markSourceFileAsRemoved(e){this.#o.add(e)}getPublishDelta(){return{changedSourceFiles:Array.from(this.#n),removedSourceFiles:Array.from(this.#o)}}markFileHashPendingConfirmation(e){const t=`${e.fileType}::${e.filePath}`;this.#r.set(t,e)}getFileHashConfirmations(){return Array.from(this.#r.values())}async getCatalogEntitiesData(e){this.#t=this.#l(e),this.#i=this.#u(e);const[t,i]=await Promise.allSettled([this.#t,this.#i]);return{totalEntitiesCount:t.status==="fulfilled"?t.value:s,countOfEntitiesByType:i.status==="fulfilled"?i.value:s,extractors:Array.from(this.#e),totalFilesSkippedByHash:this.#s,totalProcessedFiles:this.#a}}async#l(e){return(await e.getEntities({paginationParams:{limit:1,filter:{field:"is_deleted",operator:"equal",value:!1}}})).page.total}async#u(e){return(await e.getEntitiesCountByTypes()).reduce((i,{type:a,count:n})=>(i[a]=n,i),{})}}const l=new o;export{o as CatalogDataCollector,l as catalogDataCollector};
|
|
@@ -18,6 +18,7 @@ export declare class HashManager {
|
|
|
18
18
|
getByPath(filePath: string): Promise<FileHashReadModelSchema | null>;
|
|
19
19
|
upsert(fileType: FileType, filePath: string, hash: string, status: FileHashStatus): Promise<string | null>;
|
|
20
20
|
getAllOutdated(fileType: FileType): Promise<FileHashReadModelSchema[]>;
|
|
21
|
+
getStatusSnapshot(fileType: FileType): Promise<Map<string, FileHashStatus>>;
|
|
21
22
|
computeFileHash(fileContent: unknown): Promise<string>;
|
|
22
23
|
deleteFileHashes(filter: Filter): Promise<boolean>;
|
|
23
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{FileHashStatus as
|
|
1
|
+
import{FileHashStatus as r}from"../../../persistence/file-hashes/types.js";import{sha1 as i}from"../../../utils/crypto/sha1.js";class o{#t;constructor(t){this.#t=t}async markAllAsOutdated(t){return await this.#t.updateFileHashes(r.OUTDATED,{field:"file_type",operator:"equal",value:t})}async getByPath(t){return await this.#t.getByPath(t)}async upsert(t,s,e,a){return await this.#t.upsertFileHash({fileType:t,filePath:s,hash:e,status:a})}async getAllOutdated(t){return await this.#t.getAllOutdated(t)}async getStatusSnapshot(t){const s=await this.#t.getAllByFileType(t),e=new Map;for(const a of s)e.set(a.filePath,a.status);return e}async computeFileHash(t){try{return i(JSON.stringify(t))}catch{throw new Error(`Error computing hash for file content: ${JSON.stringify(t)}`)}}async deleteFileHashes(t){return await this.#t.deleteFileHashes(t)}}export{o as HashManager};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { CacheService } from '../../../persistence/cache/services/cache-service.js';
|
|
2
|
+
/**
|
|
3
|
+
* Persists a hash of the catalog RBAC config between builds and detects when it changes
|
|
4
|
+
* (so entity extraction can re-run attribute work tied to team membership).
|
|
5
|
+
*/
|
|
6
|
+
export declare class RbacConfigHashCache {
|
|
7
|
+
private readonly cache;
|
|
8
|
+
constructor(cache: CacheService);
|
|
9
|
+
/**
|
|
10
|
+
* Compares the current RBAC config to the last build, updates the cache when the hash
|
|
11
|
+
* differs, and returns whether RBAC **changed** since a prior run. First run
|
|
12
|
+
* (`previousHash` missing) returns `rbacConfigChanged: false` but still stores the current hash.
|
|
13
|
+
*/
|
|
14
|
+
syncAndDetectChange(rbacConfig: unknown): Promise<{
|
|
15
|
+
rbacConfigChanged: boolean;
|
|
16
|
+
}>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=rbac-config-hash-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{sha1 as h}from"../../../utils/crypto/sha1.js";import{CATALOG_META_CACHE_NAMESPACE as s,RBAC_CONFIG_HASH_CACHE_KEY as t}from"../../../constants/plugins/catalog-entities.js";class C{cache;constructor(a){this.cache=a}async syncAndDetectChange(a){const c=h(JSON.stringify(a??null)),e=(await this.cache.get({key:t,namespace:s}))?.hash??null,n=e!==null&&e!==c;return e!==c&&await this.cache.set({key:t,namespace:s,value:{hash:c}}),{rbacConfigChanged:n}}}export{C as RbacConfigHashCache};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{logger as n}from"../../../../../tools/notifiers/logger.js";import{canAccessResource as
|
|
1
|
+
import{logger as n}from"../../../../../tools/notifiers/logger.js";import{canAccessResource as U}from"../../../../../utils/rbac.js";import{ApigeeDevOnboardingIntegrationAuthType as w,APIGEE_VERSION as m}from"./types.js";import{AlgorithmTypes as D}from"../../../../../web-server/jwt/types.js";import*as S from"../../../../../web-server/jwt/jwt.js";import{getFirstNameFromClaims as k,getLastNameFromClaims as T}from"../../../utils.js";import{HttpError as b}from"../../../../../utils/errors.js";const f="developer.service.DeveloperDoesNotExist",$=3600*24*365*1;function O(s){return s.replace(/\+/g,"%2B")}function y(s){return{id:s.consumerKey,clientId:s.consumerKey,clientSecret:s.consumerSecret,scopes:s.scopes,issuedAt:s.issuedAt,expiresAt:s.expiresAt,attributes:N(s.attributes),status:s.status,apiProductsStatus:s.apiProducts?.map(e=>({id:e.apiproduct,status:e.status,name:e.apiproduct}))||[],canBeRolled:!1,canBeRevoked:!0,valueToUseInHeader:"clientId"}}function A(s){const e=Object.fromEntries((s.attributes||[]).map(t=>[t.name,t.value]));return{id:s.name,name:e.DisplayName||s.name,description:e.Notes||"",...s.callbackUrl!==void 0?{callbackUrl:s.callbackUrl}:{},attributes:e,createdAt:s.createdAt,lastModifiedAt:s.lastModifiedAt,scopes:s.scopes,credentials:s.credentials?.map(y)||[],supportsLogs:!1,canCreateKey:!0}}function x(s){const e=Object.fromEntries((s.attributes||[]).map(t=>[t.name,t.value]));return{id:s.name,name:e.DisplayName||s.name,description:s.description,attributes:e,createdAt:s.createdAt,lastModifiedAt:s.lastModifiedAt,approvalType:s.approvalType,scopes:s.scopes}}function v(s){return Object.entries(s||{}).map(([e,t])=>({name:e,value:t}))}function N(s){return Object.fromEntries((s||[]).map(e=>[e.name,e.value]))}let h=null;async function I(s){h?(await h).expiresAt<Date.now()/1e3&&(n.info("Token expired, requesting new apigee access token"),h=C(s)):(n.info("Requesting apigee access token"),h=C(s));try{return(await h).token}catch(e){throw h=null,e}}async function C({auth:s}){switch(s.type){case w.OAUTH2:return j(s);case w.SERVICE_ACCOUNT:return _(s)}}async function j(s){const e={grant_type:"client_credentials",client_id:s.clientId,client_secret:s.clientSecret};let t=await fetch(s.tokenEndpoint,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(e).toString()});if(!t.ok)throw new Error(`Failed to get access token: ${t.statusText}
|
|
2
2
|
${await t.text()}`);const a=await t.json(),{access_token:i,expires_in:r}=a;return n.info("Apigee access token received"),{token:i,expiresAt:Math.floor(Date.now()/1e3)+r}}async function _(s){n.verbose(`Using service account to sign JWT token: Email: "%s" Private key:
|
|
3
3
|
%s
|
|
4
|
-
`,s.serviceAccountEmail,s.serviceAccountPrivateKey.slice(0,30)+"***"+s.serviceAccountPrivateKey.slice(-30));const t={grant_type:"urn:ietf:params:oauth:grant-type:jwt-bearer",assertion:await
|
|
5
|
-
${await a.text()}`);const i=await a.json(),{access_token:r,expires_in:o}=i;return n.info("Apigee access token received"),{token:r,expiresAt:Math.floor(Date.now()/1e3)+o}}class F{apiUrl;developerUrl;accessToken=null;organizationName;email;organizationUrl;version;userClaims;config;ignoreApiProducts;catalogApiProducts;allowApiProductsOutsideCatalog;adapterId;stage;rbacConfig;constructor(e,t,a,i){const r=e;this.apiUrl=r.apiUrl||"https://apigee.googleapis.com/v1",this.organizationName=r.organizationName,this.email=a.email,this.organizationUrl=`${this.apiUrl}/organizations/${this.organizationName}`,this.developerUrl=`${this.organizationUrl}/developers/${O(this.email)}`,this.version=e.type==="APIGEE_X"?m.x:m.edge,this.userClaims=a,this.adapterId=r.organizationName,this.ignoreApiProducts=new Set(r.ignoreApiProducts||[]),this.catalogApiProducts=new Map(Object.entries(i)),this.allowApiProductsOutsideCatalog=r.allowApiProductsOutsideCatalog??!1,this.config=r,this.stage=r.stage||"non-production",this.rbacConfig=t}async setAuthHeader(e){return e=e||{},e.headers={...e.headers,"Accept-Encoding":"identity",accept:"application/json",Authorization:"Bearer "+await I(this.config),"X-Api-Key":this.config.auth.type===w.OAUTH2?this.config.auth.clientId:void 0},e}getErrorMessage(e){if(!e)return"Fetch error";try{const t=JSON.parse(e);return t.code===f?t.code:t.error.details[0]?.["@type"]==="type.googleapis.com/google.rpc.PreconditionFailure"&&t.error.details[0]?.violations[0]?.type===f?f:t?.message||t.error.message}catch{return e}}async fetchData(e,t){const a=await this.setAuthHeader(t),i=typeof e=="string"?e:e.url,r=typeof e=="string"?"GET":e.method;n.verbose(`${r.toUpperCase()} request to "${i}"`);const o=await fetch(e,a);if(!o.ok){const
|
|
4
|
+
`,s.serviceAccountEmail,s.serviceAccountPrivateKey.slice(0,30)+"***"+s.serviceAccountPrivateKey.slice(-30));const t={grant_type:"urn:ietf:params:oauth:grant-type:jwt-bearer",assertion:await S.sign({sub:s.serviceAccountEmail,iss:s.serviceAccountEmail,aud:"https://www.googleapis.com/oauth2/v4/token",iat:Math.floor(Date.now()/1e3),exp:Math.floor(Date.now()/1e3)+3600,scope:"https://www.googleapis.com/auth/cloud-platform"},s.serviceAccountPrivateKey,D.RS256)};n.verbose("Exchanging JWT for access token",s.serviceAccountEmail,s.serviceAccountPrivateKey.slice(0,30)+"***"+s.serviceAccountPrivateKey.slice(-30));let a=await fetch("https://oauth2.googleapis.com/token",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()});if(!a.ok)throw new Error(`Failed to get access token: ${a.statusText}
|
|
5
|
+
${await a.text()}`);const i=await a.json(),{access_token:r,expires_in:o}=i;return n.info("Apigee access token received"),{token:r,expiresAt:Math.floor(Date.now()/1e3)+o}}class F{apiUrl;developerUrl;accessToken=null;organizationName;email;organizationUrl;version;userClaims;config;ignoreApiProducts;catalogApiProducts;allowApiProductsOutsideCatalog;adapterId;stage;rbacConfig;constructor(e,t,a,i){const r=e;this.apiUrl=r.apiUrl||"https://apigee.googleapis.com/v1",this.organizationName=r.organizationName,this.email=a.email,this.organizationUrl=`${this.apiUrl}/organizations/${this.organizationName}`,this.developerUrl=`${this.organizationUrl}/developers/${O(this.email)}`,this.version=e.type==="APIGEE_X"?m.x:m.edge,this.userClaims=a,this.adapterId=r.organizationName,this.ignoreApiProducts=new Set(r.ignoreApiProducts||[]),this.catalogApiProducts=new Map(Object.entries(i)),this.allowApiProductsOutsideCatalog=r.allowApiProductsOutsideCatalog??!1,this.config=r,this.stage=r.stage||"non-production",this.rbacConfig=t}async setAuthHeader(e){return e=e||{},e.headers={...e.headers,"Accept-Encoding":"identity",accept:"application/json",Authorization:"Bearer "+await I(this.config),"X-Api-Key":this.config.auth.type===w.OAUTH2?this.config.auth.clientId:void 0},e}getErrorMessage(e){if(!e)return"Fetch error";try{const t=JSON.parse(e);return t.code===f?t.code:t.error.details[0]?.["@type"]==="type.googleapis.com/google.rpc.PreconditionFailure"&&t.error.details[0]?.violations[0]?.type===f?f:t?.message||t.error.message}catch{return e}}async fetchData(e,t){const a=await this.setAuthHeader(t),i=typeof e=="string"?e:e.url,r=typeof e=="string"?"GET":e.method;n.verbose(`${r.toUpperCase()} request to "${i}"`);const o=await fetch(e,a);if(!o.ok){const d=await o.text(),c=this.getErrorMessage(d);if(c===f){const p=this.userClaims,g=k(p),u=T(p),l=this.email;return await this.createDeveloper(this.email,g,u,l),await this.fetchData(e,t)}throw o.status!==404&&n.warn(`${r.toUpperCase()} request to "${i}" failed with ${o.status} code`),new b(o.status,c)}return o.headers.get("x-redocly-apigee-version")===m.x&&(this.version=m.x),n.verbose(`${r.toUpperCase()} request to "${i}" OK`),o.json()}async getApps(){const e=`${this.developerUrl}/apps?expand=true`,{app:t}=await this.fetchData(e),a=(t||[]).map(A);return{data:a,total:a.length}}async getApiProducts(){const e=`${this.organizationUrl}/apiproducts?expand=true`,{apiProduct:t}=await this.fetchData(e),a=(t||[]).filter(i=>U(this.catalogApiProducts.get(i.name)||{},this.userClaims,this.rbacConfig)&&(this.allowApiProductsOutsideCatalog||this.catalogApiProducts.has(i.name))&&!this.ignoreApiProducts.has(i.name)).map(x);return{data:a,total:a.length}}async getApp(e){const t=`${this.developerUrl}/apps/${e}${this.version===m.edge?"?expand=true":""}`,a=await this.fetchData(t);return A(a)}createDeveloper(e,t,a,i){const r=`${this.organizationUrl}/developers`;return this.fetchData(r,{headers:{"Content-type":"application/json"},body:JSON.stringify({email:e,firstName:t,lastName:a,userName:i}),method:"POST"})}async createApp(e){const t=`${this.developerUrl}/apps`;n.verbose(`Creating app ${e.id} ${e.apiProductIds}`);const a=await this.fetchData(t,{headers:{"Content-type":"application/json"},body:JSON.stringify({name:e.id,apiProducts:e.apiProductIds||[],...e.callbackUrl!==void 0?{callbackUrl:e.callbackUrl}:{},keyExpiresIn:1*365*24*60*60*1e3,attributes:v({...e.attributes,DisplayName:e.name,Notes:e.description||""})}),method:"POST"});if(e.credentials){const i=e.credentials[0];await this.fetchData(`${this.developerUrl}/apps/${e.id}/keys/create`,{headers:{"Content-type":"application/json"},body:JSON.stringify({consumerKey:i.clientId,consumerSecret:i.clientSecret,expiresInSeconds:P(i.expiresAt,$)}),method:"POST"}),n.info("Imported previously provided key");const r=a.credentials[0].consumerKey;await this.fetchData(`${this.developerUrl}/apps/${e.id}/keys/${r}`,{method:"DELETE"}),n.info("Deleted autogenerated key");const o=await this.fetchData(`${this.developerUrl}/apps/${e.id}/keys/${i.clientId}`,{headers:{"Content-type":"application/json"},body:JSON.stringify({apiProducts:e.apiProductIds||[]}),method:"POST"});a.credentials=[o]}return A(a)}async updateApp(e,t){const a=`${this.developerUrl}/apps/${e}`;try{const i=await this.getApp(e),r={...t.attributes};t.name&&(r.DisplayName=t.name),t.description&&(r.Notes=t.description);const o={attributes:v({...i.attributes,...r})};t.callbackUrl!==void 0&&(o.callbackUrl=t.callbackUrl);const d=await this.fetchData(a,{headers:{"Content-type":"application/json"},body:JSON.stringify(o),method:"PUT"});return A(d)}catch(i){if(i.message.includes("does not exist"))return;throw i}}async deleteApp(e){const t=`${this.developerUrl}/apps/${e}`;try{return await this.fetchData(t,{headers:{"Content-type":"application/json"},method:"DELETE"})}catch(a){if(a.message.includes("does not exist"))return;throw a}}async createCredential(e,t){const a=`${this.developerUrl}/apps/${e}`;let i;if(t.clientId&&t.clientSecret)await this.fetchData(`${this.developerUrl}/apps/${e}/keys/create`,{headers:{"Content-type":"application/json"},body:JSON.stringify({consumerKey:t.clientId,consumerSecret:t.clientSecret,expiresInSeconds:P(t.expiresAt,$)}),method:"POST"}),i=await this.fetchData(`${this.developerUrl}/apps/${e}/keys/${t.clientId}`,{headers:{"Content-type":"application/json"},body:JSON.stringify({apiProducts:t.apiProductIds||[]}),method:"POST"}),n.info("Imported previously provided key");else{const r=await this.getApp(e);i=(await this.fetchData(a,{headers:{"Content-type":"application/json"},method:"PUT",body:JSON.stringify({apiProducts:t.apiProductIds,attributes:v({...r.attributes,...t.attributes})})})).credentials[0]}return y(i)}async updateCredential(e,t,a){let i;try{i=await this.fetchData(`${this.developerUrl}/apps/${e}/keys/${t}`)}catch{i=void 0}if(!i)throw new b(404,"Cannot update credential that does not exist");const r=`${this.developerUrl}/apps/${e}/keys/${t}`,o=await this.fetchData(r,{headers:{"Content-type":"application/json"},method:"PUT",body:JSON.stringify({apiProducts:a.apiProductIds})}),d=o.apiProducts.filter(c=>!a.apiProductIds.includes(c.apiproduct)).map(c=>c.apiproduct);return await Promise.all(d.map(c=>this.fetchData(`${this.developerUrl}/apps/${e}/keys/${t}/apiproducts/${c}`,{method:"DELETE"}))),y(o)}async deleteCredential(e,t){const a=`${this.developerUrl}/apps/${e}/keys/${t}`;return y(await this.fetchData(a,{headers:{"Content-type":"application/octet-stream"},method:"DELETE"}))}async getAppLogDetails(e,t){throw new Error("Not implemented")}async getAppLogs(e,t){return{total:0,data:[]}}async getApiAccessStatus(e,t){const{data:a}=await this.getApps(),i=(a||[]).filter(p=>(p.credentials||[]).find(u=>u.apiProductsStatus.find(l=>l.id===e))),r=p=>i.find(g=>g.credentials?.find(l=>l.status===p&&l.apiProductsStatus.find(E=>E.id===e))),o=t?i.map(p=>{if(p.credentials?.find(u=>u.status==="approved"&&u.apiProductsStatus.find(l=>l.id===e)))return{id:p.id,title:p.name}}).filter(Boolean):void 0,d=r("approved");if(d)return{status:"ACCEPTED",appId:d.id,apps:o};const c=r("pending");return c?{status:"PENDING",appId:c.id,apps:o}:{status:"NONE"}}}function P(s,e){if(!(!s&&!e))return s=s||(Date.now()+e*1e3).toString(),Math.floor((parseInt(s,10)-Date.now())/1e3).toString()}export{F as ApigeeAdapter};
|