diff --git a/.changeset/moody-carrots-shout.md b/.changeset/moody-carrots-shout.md index a1c357041f..1b1555a5dd 100644 --- a/.changeset/moody-carrots-shout.md +++ b/.changeset/moody-carrots-shout.md @@ -2,4 +2,4 @@ '@backstage/plugin-catalog-backend-module-github': minor --- -Added `GitHubLocationAnalyzer`. This can be used to add to the `CatalogBuilder`. When added this will be used by `RepoLocationAnalyzer` to figure out if the given url that you are trying to import from the /catalog-import page already contains catalog-info.yaml files. +Added `GitHubLocationAnalyzer`. This can be used to add to the `CatalogBuilder`. When added this will be used by `RepoLocationAnalyzer` to figure out if the given URL that you are trying to import from the /catalog-import page already contains catalog-info.yaml files. diff --git a/plugins/catalog-backend-module-github/api-report.md b/plugins/catalog-backend-module-github/api-report.md index 8e8055bafc..0d6c8c015f 100644 --- a/plugins/catalog-backend-module-github/api-report.md +++ b/plugins/catalog-backend-module-github/api-report.md @@ -3,6 +3,8 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts +import { AnalyzeLocationExistingEntity } from '@backstage/plugin-catalog-backend'; +import { AnalyzeOptions } from '@backstage/plugin-catalog-backend'; import { BackendFeature } from '@backstage/backend-plugin-api'; import { CatalogProcessor } from '@backstage/plugin-catalog-backend'; import { CatalogProcessorEmit } from '@backstage/plugin-catalog-backend'; @@ -13,7 +15,9 @@ import { GithubCredentialsProvider } from '@backstage/integration'; import { GitHubIntegrationConfig } from '@backstage/integration'; import { LocationSpec } from '@backstage/plugin-catalog-backend'; import { Logger } from 'winston'; +import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { ScmIntegrationRegistry } from '@backstage/integration'; +import { ScmLocationAnalyzer } from '@backstage/plugin-catalog-backend'; import { TaskRunner } from '@backstage/backend-tasks'; import { TaskScheduleDefinition } from '@backstage/backend-tasks'; @@ -70,6 +74,24 @@ export type GithubEntityProviderCatalogModuleOptions = { schedule?: TaskScheduleDefinition; }; +// @public (undocumented) +export class GitHubLocationAnalyzer implements ScmLocationAnalyzer { + constructor(options: GitHubLocationAnalyzerOptions); + // (undocumented) + analyze({ + url, + catalogFilename, + }: AnalyzeOptions): Promise; + // (undocumented) + getIntegrationType(): string; +} + +// @public (undocumented) +export type GitHubLocationAnalyzerOptions = { + config: Config; + discovery: PluginEndpointDiscovery; +}; + // @public export type GithubMultiOrgConfig = Array<{ name: string; diff --git a/plugins/catalog-backend-module-github/src/analyzers/GitHubLocationAnalyzer.ts b/plugins/catalog-backend-module-github/src/analyzers/GitHubLocationAnalyzer.ts index 7ab92565ce..a043b894cd 100644 --- a/plugins/catalog-backend-module-github/src/analyzers/GitHubLocationAnalyzer.ts +++ b/plugins/catalog-backend-module-github/src/analyzers/GitHubLocationAnalyzer.ts @@ -27,10 +27,12 @@ import { import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { Config } from '@backstage/config'; +/** @public */ export type GitHubLocationAnalyzerOptions = { config: Config; discovery: PluginEndpointDiscovery; }; +/** @public */ export class GitHubLocationAnalyzer implements ScmLocationAnalyzer { private readonly catalogClient: CatalogApi; private readonly config: Config; diff --git a/plugins/catalog-backend-module-github/src/index.ts b/plugins/catalog-backend-module-github/src/index.ts index e856277873..ca7c72f11b 100644 --- a/plugins/catalog-backend-module-github/src/index.ts +++ b/plugins/catalog-backend-module-github/src/index.ts @@ -30,3 +30,4 @@ export type { GithubMultiOrgConfig } from './lib'; export { githubEntityProviderCatalogModule } from './module'; export type { GithubEntityProviderCatalogModuleOptions } from './module'; export { GitHubLocationAnalyzer } from './analyzers/GitHubLocationAnalyzer'; +export type { GitHubLocationAnalyzerOptions } from './analyzers/GitHubLocationAnalyzer'; diff --git a/plugins/catalog-backend/api-report.md b/plugins/catalog-backend/api-report.md index bf53badd87..15cb23d1aa 100644 --- a/plugins/catalog-backend/api-report.md +++ b/plugins/catalog-backend/api-report.md @@ -87,6 +87,12 @@ export type AnalyzeLocationResponse = { generateEntities: AnalyzeLocationGenerateEntity[]; }; +// @public (undocumented) +export type AnalyzeOptions = { + url: string; + catalogFilename?: string; +}; + // @public (undocumented) export class AnnotateLocationEntityProcessor implements CatalogProcessor { constructor(options: { integrations: ScmIntegrationRegistry }); @@ -134,6 +140,9 @@ export class CatalogBuilder { addEntityProvider( ...providers: Array> ): CatalogBuilder; + addLocationAnalyzers( + ...analyzers: Array> + ): CatalogBuilder; // @alpha addPermissionRules( ...permissionRules: Array< @@ -219,7 +228,6 @@ export type CatalogEnvironment = { config: Config; reader: UrlReader; permissions: PermissionEvaluator | PermissionAuthorizer; - discovery: PluginEndpointDiscovery; }; // @alpha @@ -533,6 +541,12 @@ export type ProcessingIntervalFunction = () => number; export { processingResult }; +// @public (undocumented) +export type ScmLocationAnalyzer = { + getIntegrationType(): string; + analyze(options: AnalyzeOptions): Promise; +}; + // @public (undocumented) export class UrlReaderProcessor implements CatalogProcessor { constructor(options: { reader: UrlReader; logger: Logger }); diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index 8232f1d05a..f5ab216a7f 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -47,7 +47,6 @@ "@backstage/plugin-scaffolder-common": "workspace:^", "@backstage/plugin-search-common": "workspace:^", "@backstage/types": "workspace:^", - "@octokit/rest": "^19.0.4", "@types/express": "^4.17.6", "codeowners-utils": "^1.0.2", "core-js": "^3.6.5", diff --git a/plugins/catalog-backend/src/ingestion/LocationAnalyzer.ts b/plugins/catalog-backend/src/ingestion/LocationAnalyzer.ts index 7992903b65..11f9799759 100644 --- a/plugins/catalog-backend/src/ingestion/LocationAnalyzer.ts +++ b/plugins/catalog-backend/src/ingestion/LocationAnalyzer.ts @@ -17,10 +17,7 @@ import { Logger } from 'winston'; import parseGitUrl from 'git-url-parse'; import { Entity } from '@backstage/catalog-model'; -import { - GitHubIntegration, - ScmIntegrationRegistry, -} from '@backstage/integration'; +import { ScmIntegrationRegistry } from '@backstage/integration'; import { AnalyzeLocationRequest, AnalyzeLocationResponse, @@ -45,9 +42,7 @@ export class RepoLocationAnalyzer implements LocationAnalyzer { async analyzeLocation( request: AnalyzeLocationRequest, ): Promise { - const integration = this.scmIntegrations.byUrl( - request.location.target, - ) as GitHubIntegration; + const integration = this.scmIntegrations.byUrl(request.location.target); const { owner, name } = parseGitUrl(request.location.target); let annotationPrefix; @@ -69,7 +64,7 @@ export class RepoLocationAnalyzer implements LocationAnalyzer { } const analyzer = this.analyzers.find( - a => a.getIntegrationType() === integration.type, + a => a.getIntegrationType() === integration?.type, ); if (analyzer) { const existingEntityFiles = await analyzer.analyze({ diff --git a/plugins/catalog-backend/src/ingestion/types.ts b/plugins/catalog-backend/src/ingestion/types.ts index 961be78572..b68a4681b1 100644 --- a/plugins/catalog-backend/src/ingestion/types.ts +++ b/plugins/catalog-backend/src/ingestion/types.ts @@ -100,10 +100,12 @@ export type AnalyzeLocationEntityField = { description: string; }; +/** @public */ export type AnalyzeOptions = { url: string; catalogFilename?: string; }; + /** @public */ export type ScmLocationAnalyzer = { /** The integration type this location analyzer can work with */ diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts index 97379ac491..e65625d637 100644 --- a/plugins/catalog-backend/src/service/CatalogBuilder.ts +++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts @@ -14,11 +14,7 @@ * limitations under the License. */ -import { - PluginDatabaseManager, - PluginEndpointDiscovery, - UrlReader, -} from '@backstage/backend-common'; +import { PluginDatabaseManager, UrlReader } from '@backstage/backend-common'; import { DefaultNamespaceEntityPolicy, Entity, @@ -108,7 +104,6 @@ export type CatalogEnvironment = { config: Config; reader: UrlReader; permissions: PermissionEvaluator | PermissionAuthorizer; - discovery: PluginEndpointDiscovery; }; /** diff --git a/plugins/catalog-backend/src/service/CatalogPlugin.ts b/plugins/catalog-backend/src/service/CatalogPlugin.ts index 3619460c4d..64e1e52494 100644 --- a/plugins/catalog-backend/src/service/CatalogPlugin.ts +++ b/plugins/catalog-backend/src/service/CatalogPlugin.ts @@ -22,7 +22,6 @@ import { permissionsServiceRef, urlReaderServiceRef, httpRouterServiceRef, - discoveryServiceRef, } from '@backstage/backend-plugin-api'; import { CatalogBuilder } from './CatalogBuilder'; import { @@ -79,7 +78,6 @@ export const catalogPlugin = createBackendPlugin({ permissions: permissionsServiceRef, database: databaseServiceRef, httpRouter: httpRouterServiceRef, - discovery: discoveryServiceRef, }, async init({ logger, @@ -88,7 +86,6 @@ export const catalogPlugin = createBackendPlugin({ database, permissions, httpRouter, - discovery, }) { const winstonLogger = loggerToWinstonLogger(logger); const builder = await CatalogBuilder.create({ @@ -97,7 +94,6 @@ export const catalogPlugin = createBackendPlugin({ permissions, database, logger: winstonLogger, - discovery, }); builder.addProcessor(...processingExtensions.processors); builder.addEntityProvider(...processingExtensions.entityProviders); diff --git a/plugins/catalog-backend/src/service/standaloneServer.ts b/plugins/catalog-backend/src/service/standaloneServer.ts index 51195ccdd7..e48515fb8b 100644 --- a/plugins/catalog-backend/src/service/standaloneServer.ts +++ b/plugins/catalog-backend/src/service/standaloneServer.ts @@ -70,7 +70,6 @@ export async function startStandaloneServer( config, reader, permissions, - discovery, }); const catalog = await builder.build();