diff --git a/.changeset/chatty-flies-worry.md b/.changeset/chatty-flies-worry.md new file mode 100644 index 0000000000..53a618b346 --- /dev/null +++ b/.changeset/chatty-flies-worry.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-techdocs-backend': patch +'@backstage/plugin-techdocs-node': patch +--- + +Allow overriding default techdocs preparers with new `TechdocsPreparerExtensionPoint` diff --git a/plugins/techdocs-backend/src/plugin.ts b/plugins/techdocs-backend/src/plugin.ts index e78339cfa6..6f670abfa9 100644 --- a/plugins/techdocs-backend/src/plugin.ts +++ b/plugins/techdocs-backend/src/plugin.ts @@ -15,9 +15,9 @@ */ import { + cacheToPluginCacheManager, DockerContainerRunner, loggerToWinstonLogger, - cacheToPluginCacheManager, } from '@backstage/backend-common'; import { coreServices, @@ -26,12 +26,15 @@ import { import { DocsBuildStrategy, - Preparers, Generators, + PreparerBase, + Preparers, Publisher, + RemoteProtocol, techdocsBuildsExtensionPoint, - techdocsGeneratorExtensionPoint, TechdocsGenerator, + techdocsGeneratorExtensionPoint, + techdocsPreparerExtensionPoint, } from '@backstage/plugin-techdocs-node'; import Docker from 'dockerode'; import { createRouter } from '@backstage/plugin-techdocs-backend'; @@ -64,6 +67,18 @@ export const techdocsPlugin = createBackendPlugin({ }, }); + const customPreparers = new Map(); + env.registerExtensionPoint(techdocsPreparerExtensionPoint, { + registerPreparer(protocol: RemoteProtocol, preparer: PreparerBase) { + if (customPreparers.has(protocol)) { + throw new Error( + `Preparer for protocol ${protocol} is already registered`, + ); + } + customPreparers.set(protocol, preparer); + }, + }); + env.registerInit({ deps: { config: coreServices.rootConfig, @@ -91,6 +106,9 @@ export const techdocsPlugin = createBackendPlugin({ reader: urlReader, logger: winstonLogger, }); + for (const [protocol, preparer] of customPreparers.entries()) { + preparers.register(protocol, preparer); + } // Docker client (conditionally) used by the generators, based on techdocs.generators config. const dockerClient = new Docker(); diff --git a/plugins/techdocs-node/api-report.md b/plugins/techdocs-node/api-report.md index caa46fb87c..4e79ee712c 100644 --- a/plugins/techdocs-node/api-report.md +++ b/plugins/techdocs-node/api-report.md @@ -291,6 +291,15 @@ export type TechDocsMetadata = { files?: string[]; }; +// @public +export interface TechdocsPreparerExtensionPoint { + // (undocumented) + registerPreparer(protocol: RemoteProtocol, preparer: PreparerBase): void; +} + +// @public +export const techdocsPreparerExtensionPoint: ExtensionPoint; + // @public export const transformDirLocation: ( entity: Entity, diff --git a/plugins/techdocs-node/src/extensions.ts b/plugins/techdocs-node/src/extensions.ts index aec9153653..ed292a3b17 100644 --- a/plugins/techdocs-node/src/extensions.ts +++ b/plugins/techdocs-node/src/extensions.ts @@ -15,7 +15,7 @@ */ import { createExtensionPoint } from '@backstage/backend-plugin-api'; import { DocsBuildStrategy } from './techdocsTypes'; -import { TechdocsGenerator } from './stages'; +import { PreparerBase, RemoteProtocol, TechdocsGenerator } from './stages'; /** * Extension point type for configuring Techdocs builds. @@ -54,3 +54,22 @@ export const techdocsGeneratorExtensionPoint = createExtensionPoint({ id: 'techdocs.generator', }); + +/** + * Extension point type for configuring a custom Techdocs preparer + * + * @public + */ +export interface TechdocsPreparerExtensionPoint { + registerPreparer(protocol: RemoteProtocol, preparer: PreparerBase): void; +} + +/** + * Extension point for configuring a custom Techdocs preparer + * + * @public + */ +export const techdocsPreparerExtensionPoint = + createExtensionPoint({ + id: 'techdocs.preparer', + }); diff --git a/plugins/techdocs-node/src/index.ts b/plugins/techdocs-node/src/index.ts index 5dd81c3233..b2efadf423 100644 --- a/plugins/techdocs-node/src/index.ts +++ b/plugins/techdocs-node/src/index.ts @@ -26,6 +26,8 @@ export * from './techdocsTypes'; export { techdocsBuildsExtensionPoint, techdocsGeneratorExtensionPoint, + techdocsPreparerExtensionPoint, type TechdocsBuildsExtensionPoint, type TechdocsGeneratorExtensionPoint, + type TechdocsPreparerExtensionPoint, } from './extensions';